20030512 release
authorNick Downing <downing.nick@gmail.com>
Mon, 30 Nov 2015 15:35:45 +0000 (02:35 +1100)
committerNick Downing <downing.nick@gmail.com>
Mon, 30 Nov 2015 15:35:45 +0000 (02:35 +1100)
544 files changed:
bin/a.sh [deleted file]
bin/appinst.bat [new file with mode: 0644]
bin/appinst.sh [new file with mode: 0644]
bin/appinst.ucp [new file with mode: 0644]
bin/b.sh [deleted file]
bin/banked/cat
bin/banked/diff
bin/banked/ed
bin/banked/fsck [new file with mode: 0644]
bin/banked/grlogin [new file with mode: 0644]
bin/banked/init
bin/banked/ls
bin/banked/mkdir
bin/banked/mkfs [new file with mode: 0644]
bin/banked/msh
bin/banked/setclock
bin/banked/test
bin/banked/tr
bin/banked/wnd [new file with mode: 0644]
bin/boot.bin
bin/checksum
bin/checksum.dat [new file with mode: 0644]
bin/data/0000.scr [new file with mode: 0644]
bin/data/0001.scr [new file with mode: 0644]
bin/data/0002.scr [new file with mode: 0644]
bin/data/0003.scr [new file with mode: 0644]
bin/data/0004.scr [new file with mode: 0644]
bin/data/kass.scr [new file with mode: 0644]
bin/data/logn.scr [new file with mode: 0644]
bin/font/lcd0.cmd [new file with mode: 0644]
bin/font/lcd1.cmd [new file with mode: 0644]
bin/fstab.txt [new file with mode: 0644]
bin/group.txt
bin/inittab.txt
bin/kernel.bin
bin/large/cat
bin/large/diff
bin/large/ed
bin/large/init
bin/large/ls
bin/large/mkdir
bin/large/mkfs
bin/large/setclock
bin/large/tr
bin/large/wnd [new file with mode: 0644]
bin/man/cat1/basename.0
bin/man/cat1/cal.0
bin/man/cat1/cat.0
bin/man/cat1/chmod.0
bin/man/cat1/chown.0
bin/man/cat1/cmp.0
bin/man/cat1/cp.0
bin/man/cat1/date.0
bin/man/cat1/dd.0
bin/man/cat1/diff.0
bin/man/cat1/du.0
bin/man/cat1/echo.0
bin/man/cat1/ed.0
bin/man/cat1/expr.0
bin/man/cat1/file.0
bin/man/cat1/find.0
bin/man/cat1/grep.0
bin/man/cat1/kill.0
bin/man/cat1/ln.0
bin/man/cat1/login.0
bin/man/cat1/ls.0
bin/man/cat1/man.0
bin/man/cat1/mkdir.0
bin/man/cat1/mv.0
bin/man/cat1/od.0
bin/man/cat1/passwd.0
bin/man/cat1/pr.0
bin/man/cat1/ps.0
bin/man/cat1/pwd.0
bin/man/cat1/rm.0
bin/man/cat1/roff.0
bin/man/cat1/sh.0
bin/man/cat1/sort.0
bin/man/cat1/split.0
bin/man/cat1/su.0
bin/man/cat1/sum.0
bin/man/cat1/tail.0
bin/man/cat1/tar.0
bin/man/cat1/tee.0
bin/man/cat1/test.0
bin/man/cat1/time.0
bin/man/cat1/touch.0
bin/man/cat1/tr.0
bin/man/cat1/troff.0
bin/man/cat1/true.0
bin/man/cat1/uniq.0
bin/man/cat1/wc.0
bin/mkboot.bat [new file with mode: 0644]
bin/mkboot.ucp [new file with mode: 0644]
bin/mkramfs.sh
bin/mtab.txt
bin/n.bat
bin/n.ucp
bin/newkrnl.sh
bin/padding.dat [new file with mode: 0644]
bin/passwd.txt
bin/profile.sh [new file with mode: 0644]
bin/runonce.rc [new file with mode: 0644]
bin/runonce.sh [new file with mode: 0644]
bin/sysinit.rc [new file with mode: 0644]
bin/uzboot.bin [new file with mode: 0644]
bin/uzboot.gz [new file with mode: 0644]
bin/uzboot.ldr [new file with mode: 0644]
bin/uzidisk.dat
bin/x.sh [deleted file]
bin/xfstab.txt [new file with mode: 0644]
bin/xinittab.txt [new file with mode: 0644]
bin/xmtab.txt [new file with mode: 0644]
doc/EXECPATH.TXT [new file with mode: 0644]
doc/gui/Gui driver.doc [new file with mode: 0644]
doc/gui/Software design.doc [new file with mode: 0644]
doc/gui/scr file format.doc [new file with mode: 0644]
doc/rfc/rfc1700.txt [new file with mode: 0644]
doc/rfc/rfc854.txt [new file with mode: 0644]
doc/rfc/std5.txt [new file with mode: 0644]
doc/rfc/std7.txt [new file with mode: 0644]
doc/rfc/std9.txt [new file with mode: 0644]
include/syscalls.h
lib/libsysb.lib
lib/libsysl.lib
lib/relsysb/sysdebug.rel [new file with mode: 0644]
lib/relsysl/sysdebug.rel [new file with mode: 0644]
relnotes/20030512.txt [new file with mode: 0644]
silly.bat [deleted file]
src/as-z80/as-z80.exe [deleted file]
src/as-z80/as-z80.map [deleted file]
src/avr/2313def.inc [new file with mode: 0644]
src/avr/4433def.inc [new file with mode: 0644]
src/avr/4434def.inc [new file with mode: 0644]
src/avr/7segv0.asm [new file with mode: 0644]
src/avr/8535def.inc [new file with mode: 0644]
src/avr/8x10.asm [new file with mode: 0644]
src/avr/CFLASHV0.HEX [new file with mode: 0644]
src/avr/CFLASHV1.HEX [new file with mode: 0644]
src/avr/CFLASHV2.HEX [new file with mode: 0644]
src/avr/CHSET00.WIN [new file with mode: 0644]
src/avr/CS64V4.HEX [new file with mode: 0644]
src/avr/CS64V5.ASM [new file with mode: 0644]
src/avr/CS64V5.HEX [new file with mode: 0644]
src/avr/ISPD.EXE [new file with mode: 0644]
src/avr/ISPD.INI [new file with mode: 0644]
src/avr/MAKCHR.LOG [new file with mode: 0644]
src/avr/MT102V0.HEX [new file with mode: 0644]
src/avr/MT102V1.HEX [new file with mode: 0644]
src/avr/MT102V2.HEX [new file with mode: 0644]
src/avr/TAVRASM.EXE [new file with mode: 0644]
src/avr/TSV3.HEX [new file with mode: 0644]
src/avr/TSV4.ASM [new file with mode: 0644]
src/avr/TSV4.HEX [new file with mode: 0644]
src/avr/WPO15V1.HEX [new file with mode: 0644]
src/avr/WPOV0.HEX [new file with mode: 0644]
src/avr/WPOV1.HEX [new file with mode: 0644]
src/avr/WPOV2.HEX [new file with mode: 0644]
src/avr/WPOV3.ASM [new file with mode: 0644]
src/avr/WPOV3.HEX [new file with mode: 0644]
src/avr/a.bat [new file with mode: 0644]
src/avr/a_avra.bat [new file with mode: 0644]
src/avr/a_orig.bat [new file with mode: 0644]
src/avr/aa.bat [new file with mode: 0644]
src/avr/api.inc [new file with mode: 0644]
src/avr/apicf.inc [new file with mode: 0644]
src/avr/apics.inc [new file with mode: 0644]
src/avr/apilc.inc [new file with mode: 0644]
src/avr/apilc8.inc [new file with mode: 0644]
src/avr/apits.inc [new file with mode: 0644]
src/avr/avrasm.exe [new file with mode: 0644]
src/avr/cflashv0.asm [new file with mode: 0644]
src/avr/cflashv1.asm [new file with mode: 0644]
src/avr/cflashv2.asm [new file with mode: 0644]
src/avr/charav0.asm [new file with mode: 0644]
src/avr/charav1.asm [new file with mode: 0644]
src/avr/chklin.asm [new file with mode: 0644]
src/avr/chset00.inc [new file with mode: 0644]
src/avr/chtest.asm [new file with mode: 0644]
src/avr/crcsubx.asm [new file with mode: 0644]
src/avr/crcsubx.inc [new file with mode: 0644]
src/avr/cs128v0.asm [new file with mode: 0644]
src/avr/cs64v0.asm [new file with mode: 0644]
src/avr/cs64v1.asm [new file with mode: 0644]
src/avr/cs64v1a.asm [new file with mode: 0644]
src/avr/cs64v2.asm [new file with mode: 0644]
src/avr/cs64v4-cs64v5.diff [new file with mode: 0644]
src/avr/cs64v4.asm [new file with mode: 0644]
src/avr/dos.asm [new file with mode: 0644]
src/avr/dos.inc [new file with mode: 0644]
src/avr/file.asm [new file with mode: 0644]
src/avr/file.inc [new file with mode: 0644]
src/avr/iocall.asm [new file with mode: 0644]
src/avr/iocall.inc [new file with mode: 0644]
src/avr/lcter.asm [new file with mode: 0644]
src/avr/lcv0.asm [new file with mode: 0644]
src/avr/lcv1.asm [new file with mode: 0644]
src/avr/m192rhs.asm [new file with mode: 0644]
src/avr/m192ter.asm [new file with mode: 0644]
src/avr/m192v0.asm [new file with mode: 0644]
src/avr/m192v1.asm [new file with mode: 0644]
src/avr/mac.inc [new file with mode: 0644]
src/avr/maclc.inc [new file with mode: 0644]
src/avr/makchr.bas [new file with mode: 0644]
src/avr/makchr.exe [new file with mode: 0644]
src/avr/mega8def.inc [new file with mode: 0644]
src/avr/mt102ter.asm [new file with mode: 0644]
src/avr/mt102v0.asm [new file with mode: 0644]
src/avr/mt102v1.asm [new file with mode: 0644]
src/avr/mt102v1.asm.orig [new file with mode: 0644]
src/avr/mt102v2.asm [new file with mode: 0644]
src/avr/mt102v2.asm.orig [new file with mode: 0644]
src/avr/prm.inc [new file with mode: 0644]
src/avr/prm0.inc [new file with mode: 0644]
src/avr/product/CFLASHV0.HEX [new file with mode: 0644]
src/avr/product/CFLASHV1.HEX [new file with mode: 0644]
src/avr/product/CFLASHV2.HEX [new file with mode: 0644]
src/avr/product/CS64V4.HEX [new file with mode: 0644]
src/avr/product/MT102V0.HEX [new file with mode: 0644]
src/avr/product/MT102V1.HEX [new file with mode: 0644]
src/avr/product/MT102V2.HEX [new file with mode: 0644]
src/avr/product/TSV3.HEX [new file with mode: 0644]
src/avr/product/WPO15V1.HEX [new file with mode: 0644]
src/avr/product/WPOV0.HEX [new file with mode: 0644]
src/avr/product/WPOV1.HEX [new file with mode: 0644]
src/avr/product/WPOV2.HEX [new file with mode: 0644]
src/avr/putpcx.asm [new file with mode: 0644]
src/avr/set00.pcx [new file with mode: 0644]
src/avr/ter.inc [new file with mode: 0644]
src/avr/terlc.inc [new file with mode: 0644]
src/avr/terlc8.inc [new file with mode: 0644]
src/avr/terts.inc [new file with mode: 0644]
src/avr/tster.asm [new file with mode: 0644]
src/avr/tsv0.asm [new file with mode: 0644]
src/avr/tsv3-tsv4.diff [new file with mode: 0644]
src/avr/tsv3.asm [new file with mode: 0644]
src/avr/wpo15v1.asm [new file with mode: 0644]
src/avr/wpov0.asm [new file with mode: 0644]
src/avr/wpov1.asm [new file with mode: 0644]
src/avr/wpov2.asm [new file with mode: 0644]
src/bin/as-z80.exe
src/bin/bd.exe
src/bin/bin2avr.exe [new file with mode: 0644]
src/bin/bin2c.exe
src/bin/bmp2txt.exe [new file with mode: 0644]
src/bin/chs2cmd.exe [new file with mode: 0644]
src/bin/cr.exe
src/bin/diff.exe [deleted file]
src/bin/fsck.exe
src/bin/ihex2bin.exe
src/bin/link-z80.exe
src/bin/mkfs.exe
src/bin/nroff.exe
src/bin/p.exe [new file with mode: 0644]
src/bin/patch.exe [deleted file]
src/bin/pkzipc.exe [new file with mode: 0644]
src/bin/tavrasm.exe [new file with mode: 0644]
src/bin/touch.exe
src/bin/txt2chs.exe [new file with mode: 0644]
src/bin/ucp.exe
src/font/large.psd [new file with mode: 0644]
src/font/lcd0.cmd [new file with mode: 0644]
src/font/lcd1.cmd [new file with mode: 0644]
src/font/n.bat [new file with mode: 0644]
src/font/set01.bmp [new file with mode: 0644]
src/font/set01.chs [new file with mode: 0644]
src/font/set01.cmd [new file with mode: 0644]
src/font/set01.txt [new file with mode: 0644]
src/font/set02.bmp [new file with mode: 0644]
src/font/set02.chs [new file with mode: 0644]
src/font/set02.cmd [new file with mode: 0644]
src/font/set02.txt [new file with mode: 0644]
src/font/set03.bmp [new file with mode: 0644]
src/font/set03.chs [new file with mode: 0644]
src/font/set03.cmd [new file with mode: 0644]
src/font/set03.txt [new file with mode: 0644]
src/font/set04.bmp [new file with mode: 0644]
src/font/set04.chs [new file with mode: 0644]
src/font/set04.cmd [new file with mode: 0644]
src/font/set04.txt [new file with mode: 0644]
src/font/set05.bmp [new file with mode: 0644]
src/font/set05.chs [new file with mode: 0644]
src/font/set05.cmd [new file with mode: 0644]
src/font/set05.txt [new file with mode: 0644]
src/font/set06.bmp [new file with mode: 0644]
src/font/set06.chs [new file with mode: 0644]
src/font/set06.cmd [new file with mode: 0644]
src/font/set06.txt [new file with mode: 0644]
src/font/small.psd [new file with mode: 0644]
src/fsutil/bd.exe
src/fsutil/boot.c
src/fsutil/f.bat [deleted file]
src/fsutil/fsck.exe
src/fsutil/fsck.lnk
src/fsutil/fsck.map
src/fsutil/fsck.rel
src/fsutil/m.bat [deleted file]
src/fsutil/mkfs.c
src/fsutil/mkfs.exe
src/fsutil/mkfs.lnk
src/fsutil/mkfs.map
src/fsutil/mkfs.rel
src/fsutil/n.bat
src/fsutil/ucp.c
src/fsutil/ucp.exe
src/fsutil/ucp.map
src/fsutil/ucpsub.c
src/fsutil/utils.rel
src/gboot/build.ban [new file with mode: 0644]
src/gboot/gboot.asm$ [deleted file]
src/gboot/gboot.map [deleted file]
src/gboot/gboot.rel [deleted file]
src/gboot/n.bat
src/gboot/uzboot.asm [new file with mode: 0644]
src/gboot/uzboot.lnk [new file with mode: 0644]
src/gboot/uzdata.asm [new file with mode: 0644]
src/gboot/uzfile.asm [new file with mode: 0644]
src/gboot/uzmain.asm [new file with mode: 0644]
src/gui/0000.scr [new file with mode: 0644]
src/gui/0001.scr [new file with mode: 0644]
src/gui/0001.tmp [new file with mode: 0644]
src/gui/0002.scr [new file with mode: 0644]
src/gui/0003.scr [new file with mode: 0644]
src/gui/0004.scr [new file with mode: 0644]
src/gui/Copy (2) of wnd.c [new file with mode: 0644]
src/gui/Copy of wnd.c [new file with mode: 0644]
src/gui/Copy of wnd.h [new file with mode: 0644]
src/gui/cl64180.r01 [new file with mode: 0644]
src/gui/grlogin.map [new file with mode: 0644]
src/gui/hello.map [new file with mode: 0644]
src/gui/login.c [new file with mode: 0644]
src/gui/login.map [new file with mode: 0644]
src/gui/login.rel [new file with mode: 0644]
src/gui/m.bat [new file with mode: 0644]
src/gui/p.bat [new file with mode: 0644]
src/gui/t.bat [new file with mode: 0644]
src/gui/test.c [new file with mode: 0644]
src/gui/test.lnk [new file with mode: 0644]
src/gui/test.map [new file with mode: 0644]
src/gui/test.rel [new file with mode: 0644]
src/gui/trans.c [new file with mode: 0644]
src/gui/trans.h [new file with mode: 0644]
src/gui/trans.rel [new file with mode: 0644]
src/gui/wnd.c [new file with mode: 0644]
src/gui/wnd.cbackup [new file with mode: 0644]
src/gui/wnd.h [new file with mode: 0644]
src/gui/wnd.ihx [new file with mode: 0644]
src/gui/wnd.lnk [new file with mode: 0644]
src/gui/wnd.map [new file with mode: 0644]
src/gui/wnd.rel [new file with mode: 0644]
src/gui/wnd.xcl [new file with mode: 0644]
src/gui/wnd.xls [new file with mode: 0644]
src/gui/wnd.zip [new file with mode: 0644]
src/init/init.c
src/kernel/build.ban
src/kernel/cmx/apibus.asm
src/kernel/cmx/copyr.asm
src/kernel/cmx/diag.asm
src/kernel/kernel.lnk
src/kernel/libc/VENDOR.H [moved from src/kernel/libc/vendor.h with 79% similarity]
src/kernel/libc/dprintf.c [new file with mode: 0644]
src/kernel/libc/dprintf.h [new file with mode: 0644]
src/kernel/uzi/config.h
src/kernel/uzi/devhd.c
src/kernel/uzi/devio.c
src/kernel/uzi/devtty.c
src/kernel/uzi/extern.h
src/kernel/uzi/filesys.c
src/kernel/uzi/hdconf.h
src/kernel/uzi/machdep.c
src/kernel/uzi/main.c
src/kernel/uzi/process.c
src/kernel/uzi/scall1.c
src/kernel/uzi/scall2.c
src/kernel/uzi/systrace.c
src/kernel/uzi/unix.h
src/kernel/uzi/vendor.h
src/kernel/uzi/xip.c
src/libiar/n.bat
src/libsys/build-b.ban
src/libsys/build-l.ban
src/libsys/libsysb.lib
src/libsys/libsysl.lib
src/libsys/syscalls.h
src/libsys/sysdebug.c [new file with mode: 0644]
src/link-z80/link-z80.exe [deleted file]
src/link-z80/link-z80.map [deleted file]
src/mkfont/bmp2txt.cpp [new file with mode: 0644]
src/mkfont/bmp2txt.exe [new file with mode: 0644]
src/mkfont/chs2cmd.cpp [new file with mode: 0644]
src/mkfont/chs2cmd.exe [new file with mode: 0644]
src/mkfont/hyfile.cpp [new file with mode: 0644]
src/mkfont/hyfile.h [new file with mode: 0644]
src/mkfont/hyfs.cpp [new file with mode: 0644]
src/mkfont/hyfs.h [new file with mode: 0644]
src/mkfont/hyimage.cpp [new file with mode: 0644]
src/mkfont/hyimage.h [new file with mode: 0644]
src/mkfont/hymb.cpp [new file with mode: 0644]
src/mkfont/hymb.h [new file with mode: 0644]
src/mkfont/n.bat [new file with mode: 0644]
src/mkfont/txt2chs.cpp [new file with mode: 0644]
src/mkfont/txt2chs.exe [new file with mode: 0644]
src/mkutil/CR.EXE [moved from src/mkutil/cr.exe with 51% similarity]
src/mkutil/as-z80/as-z80.exe [new file with mode: 0644]
src/mkutil/as-z80/as-z80.lnk [moved from src/as-z80/as-z80.lnk with 100% similarity]
src/mkutil/as-z80/as-z80.map [new file with mode: 0644]
src/mkutil/as-z80/asdata.c [moved from src/as-z80/asdata.c with 100% similarity]
src/mkutil/as-z80/asexpr.c [moved from src/as-z80/asexpr.c with 100% similarity]
src/mkutil/as-z80/aslex.c [moved from src/as-z80/aslex.c with 100% similarity]
src/mkutil/as-z80/aslist.c [moved from src/as-z80/aslist.c with 100% similarity]
src/mkutil/as-z80/asmain.c [moved from src/as-z80/asmain.c with 100% similarity]
src/mkutil/as-z80/asout.c [moved from src/as-z80/asout.c with 100% similarity]
src/mkutil/as-z80/assubr.c [moved from src/as-z80/assubr.c with 100% similarity]
src/mkutil/as-z80/assym.c [moved from src/as-z80/assym.c with 100% similarity]
src/mkutil/as-z80/asxxxx.h [moved from src/as-z80/asxxxx.h with 100% similarity]
src/mkutil/as-z80/n.bat [moved from src/as-z80/n.bat with 93% similarity]
src/mkutil/as-z80/tz80.asm [moved from src/as-z80/tz80.asm with 100% similarity]
src/mkutil/as-z80/tz80l.asm [moved from src/as-z80/tz80l.asm with 100% similarity]
src/mkutil/as-z80/z80.h [moved from src/as-z80/z80.h with 100% similarity]
src/mkutil/as-z80/z80adr.c [moved from src/as-z80/z80adr.c with 100% similarity]
src/mkutil/as-z80/z80ext.c [moved from src/as-z80/z80ext.c with 100% similarity]
src/mkutil/as-z80/z80mch.c [moved from src/as-z80/z80mch.c with 100% similarity]
src/mkutil/as-z80/z80pst.c [moved from src/as-z80/z80pst.c with 100% similarity]
src/mkutil/as-z80/z80pst.c$ [moved from src/as-z80/z80pst.c$ with 100% similarity]
src/mkutil/avra-0.8/COPYING [new file with mode: 0644]
src/mkutil/avra-0.8/ChangeLog [new file with mode: 0644]
src/mkutil/avra-0.8/README [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/Makefile.amiga.gcc [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/Makefile.amiga.sas [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/Makefile.emx [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/Makefile.linux [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/Makefile.win [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/Makefile.win32.mvc [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/args.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/args.h [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/avra.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/avra.dev [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/avra.exe [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/avra.h [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/coff.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/coff.h [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/device.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/device.h [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/directiv.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/expr.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/file.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/macro.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/map.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/misc.h [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/mnemonic.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/n.bat [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/parser.c [new file with mode: 0644]
src/mkutil/avra-0.8/SOURCE/stdextra.c [new file with mode: 0644]
src/mkutil/avra-0.8/TODO [new file with mode: 0644]
src/mkutil/avra-0.8/avra.dev [new file with mode: 0644]
src/mkutil/bin2avr.c [new file with mode: 0644]
src/mkutil/bin2avr.exe [new file with mode: 0644]
src/mkutil/bin2c.exe
src/mkutil/crc.exe
src/mkutil/ihex2bin.exe
src/mkutil/link-z80/aslink.h [moved from src/link-z80/aslink.h with 100% similarity]
src/mkutil/link-z80/link-z80.exe [new file with mode: 0644]
src/mkutil/link-z80/link-z80.lnk [moved from src/link-z80/link-z80.lnk with 100% similarity]
src/mkutil/link-z80/link-z80.map [new file with mode: 0644]
src/mkutil/link-z80/lkarea.c [moved from src/link-z80/lkarea.c with 100% similarity]
src/mkutil/link-z80/lkdata.c [moved from src/link-z80/lkdata.c with 100% similarity]
src/mkutil/link-z80/lkeval.c [moved from src/link-z80/lkeval.c with 100% similarity]
src/mkutil/link-z80/lkhead.c [moved from src/link-z80/lkhead.c with 100% similarity]
src/mkutil/link-z80/lklex.c [moved from src/link-z80/lklex.c with 100% similarity]
src/mkutil/link-z80/lklibr.c [moved from src/link-z80/lklibr.c with 100% similarity]
src/mkutil/link-z80/lklist.c [moved from src/link-z80/lklist.c with 100% similarity]
src/mkutil/link-z80/lkmain.c [moved from src/link-z80/lkmain.c with 100% similarity]
src/mkutil/link-z80/lkout.c [moved from src/link-z80/lkout.c with 100% similarity]
src/mkutil/link-z80/lkrloc.c [moved from src/link-z80/lkrloc.c with 100% similarity]
src/mkutil/link-z80/lksym.c [moved from src/link-z80/lksym.c with 100% similarity]
src/mkutil/link-z80/n.bat [moved from src/link-z80/n.bat with 93% similarity]
src/mkutil/link-z80/x.bat [moved from src/link-z80/x.bat with 100% similarity]
src/mkutil/n.bat
src/mkutil/tavrasm.118/README [new file with mode: 0644]
src/mkutil/tavrasm.118/gpl.txt [new file with mode: 0644]
src/mkutil/tavrasm.118/src/8535def.inc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/TSV4.HEX [new file with mode: 0644]
src/mkutil/tavrasm.118/src/a_tavr.bat [new file with mode: 0644]
src/mkutil/tavrasm.118/src/apits.inc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrasm.cc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrasm.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrlex.cc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrlex.l [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrlex0.inc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrlex1.inc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrparse.cc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrparse.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/avrparse.y [new file with mode: 0644]
src/mkutil/tavrasm.118/src/devices.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/mac.inc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/makefile [new file with mode: 0644]
src/mkutil/tavrasm.118/src/messages.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/msg_de.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/msg_sp.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/msg_us.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/n.bat [new file with mode: 0644]
src/mkutil/tavrasm.118/src/opcodes.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/semantic.cc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/semantic.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/symbol.cc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/symbol.hh [new file with mode: 0644]
src/mkutil/tavrasm.118/src/t.bat [new file with mode: 0644]
src/mkutil/tavrasm.118/src/t.lnk [new file with mode: 0644]
src/mkutil/tavrasm.118/src/tavrasm.exe [new file with mode: 0644]
src/mkutil/tavrasm.118/src/tsv4.asm [new file with mode: 0644]
src/mkutil/tavrasm.118/src/utils.cc [new file with mode: 0644]
src/mkutil/tavrasm.118/src/utils.hh [new file with mode: 0644]
src/mkutil/touch.exe
src/sh/msh/closedir.c [new file with mode: 0644]
src/sh/msh/closedir.rel [new file with mode: 0644]
src/sh/msh/msh.lnk
src/sh/msh/msh.map
src/sh/msh/n.bat
src/sh/msh/opendir.c [new file with mode: 0644]
src/sh/msh/opendir.rel [new file with mode: 0644]
src/sh/msh/readdir.c [new file with mode: 0644]
src/sh/msh/readdir.rel [new file with mode: 0644]
src/sh/msh/sh.h
src/sh/msh/sh1.c
src/sh/msh/sh1.rel
src/sh/msh/sh2.c
src/sh/msh/sh2.rel
src/sh/msh/sh3.c
src/sh/msh/sh3.rel
src/sh/msh/sh4.c
src/sh/msh/sh4.rel
src/sh/msh/sh5.c
src/sh/msh/sh5.rel
src/simple/align.c
src/simple/build-b.ban
src/simple/build-l.ban
src/simple/cat.c
src/simple/dosread.c
src/simple/ls.c
src/simple/m.bat
src/simple/mkdir.c
src/simple/setclock.c
src/troff/nroff.exe
uzi.bat

diff --git a/bin/a.sh b/bin/a.sh
deleted file mode 100644 (file)
index fac355b..0000000
--- a/bin/a.sh
+++ /dev/null
@@ -1 +0,0 @@
-cp std-chs /dev/lcd0\r
diff --git a/bin/appinst.bat b/bin/appinst.bat
new file mode 100644 (file)
index 0000000..0978826
--- /dev/null
@@ -0,0 +1,2 @@
+ucp < appinst.ucp\r
+copy uzidisk.dat e:\\r
diff --git a/bin/appinst.sh b/bin/appinst.sh
new file mode 100644 (file)
index 0000000..4c6d489
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh\r
+\r
+echo ""\r
+echo "Installing application program"\r
+echo ""\r
+\r
+rm -f /wnd/*.scr\r
+cp -v /usr/boot/inst/wnd/*.scr /wnd\r
+\r
+rm -f /bin/grlogin /bin/test\r
+cp -v /usr/boot/inst/bin/grlogin /usr/boot/inst/bin/test /bin\r
+align -v /bin/grlogin /bin/test\r
+\r
+echo ""\r
+echo "Finished installing application"\r
+echo ""\r
+\r
diff --git a/bin/appinst.ucp b/bin/appinst.ucp
new file mode 100644 (file)
index 0000000..d875517
--- /dev/null
@@ -0,0 +1,29 @@
+root b:\r
+cd /boot\r
+mkdir inst\r
+get appinst.sh\r
+chmod 755 appinst.sh\r
+cd /boot/inst\r
+mkdir bin\r
+mkdir wnd\r
+cd /boot/inst/bin\r
+bget banked\grlogin grlogin\r
+chmod 755 grlogin\r
+bget banked\test test\r
+chmod 755 test\r
+cd /boot/inst/wnd\r
+bget data\logn.scr logn.scr\r
+chmod 644 logn.scr \r
+bget data\0000.scr 0000.scr\r
+chmod 644 0000.scr \r
+bget data\0001.scr 0001.scr\r
+chmod 644 0001.scr\r
+bget data\0002.scr 0002.scr\r
+chmod 644 0002.scr \r
+bget data\0003.scr 0003.scr\r
+chmod 644 0003.scr \r
+bget data\0004.scr 0004.scr\r
+chmod 644 0004.scr \r
+bget data\kass.scr kass.scr\r
+chmod 644 kass.scr\r
+exit\r
diff --git a/bin/b.sh b/bin/b.sh
deleted file mode 100644 (file)
index 33ea9a3..0000000
--- a/bin/b.sh
+++ /dev/null
@@ -1 +0,0 @@
-cp ned-chs /dev/lcd1\r
index 86a3fa2..b94c628 100644 (file)
Binary files a/bin/banked/cat and b/bin/banked/cat differ
index 11ee6f5..acf0b6e 100644 (file)
Binary files a/bin/banked/diff and b/bin/banked/diff differ
index 93cbad3..79387c4 100644 (file)
Binary files a/bin/banked/ed and b/bin/banked/ed differ
diff --git a/bin/banked/fsck b/bin/banked/fsck
new file mode 100644 (file)
index 0000000..ee20028
Binary files /dev/null and b/bin/banked/fsck differ
diff --git a/bin/banked/grlogin b/bin/banked/grlogin
new file mode 100644 (file)
index 0000000..b235271
Binary files /dev/null and b/bin/banked/grlogin differ
index 2bfcaf3..36be34c 100644 (file)
Binary files a/bin/banked/init and b/bin/banked/init differ
index b8c22b3..026709f 100644 (file)
Binary files a/bin/banked/ls and b/bin/banked/ls differ
index 0706123..6e7b9cc 100644 (file)
Binary files a/bin/banked/mkdir and b/bin/banked/mkdir differ
diff --git a/bin/banked/mkfs b/bin/banked/mkfs
new file mode 100644 (file)
index 0000000..2deb3d6
Binary files /dev/null and b/bin/banked/mkfs differ
index 794803d..116e902 100644 (file)
Binary files a/bin/banked/msh and b/bin/banked/msh differ
index eff169f..ffcef94 100644 (file)
Binary files a/bin/banked/setclock and b/bin/banked/setclock differ
index 1ef475c..d91eab5 100644 (file)
Binary files a/bin/banked/test and b/bin/banked/test differ
index 08a1584..b721524 100644 (file)
Binary files a/bin/banked/tr and b/bin/banked/tr differ
diff --git a/bin/banked/wnd b/bin/banked/wnd
new file mode 100644 (file)
index 0000000..3114f72
Binary files /dev/null and b/bin/banked/wnd differ
index 003e397..a387603 100644 (file)
Binary files a/bin/boot.bin and b/bin/boot.bin differ
index e8bc3d3..26858fb 100644 (file)
Binary files a/bin/checksum and b/bin/checksum differ
diff --git a/bin/checksum.dat b/bin/checksum.dat
new file mode 100644 (file)
index 0000000..172cee8
--- /dev/null
@@ -0,0 +1,2 @@
+C A:KERNEL.BIN\r
+C A:BOOT.BIN\r
diff --git a/bin/data/0000.scr b/bin/data/0000.scr
new file mode 100644 (file)
index 0000000..850c720
Binary files /dev/null and b/bin/data/0000.scr differ
diff --git a/bin/data/0001.scr b/bin/data/0001.scr
new file mode 100644 (file)
index 0000000..a534830
Binary files /dev/null and b/bin/data/0001.scr differ
diff --git a/bin/data/0002.scr b/bin/data/0002.scr
new file mode 100644 (file)
index 0000000..389139b
Binary files /dev/null and b/bin/data/0002.scr differ
diff --git a/bin/data/0003.scr b/bin/data/0003.scr
new file mode 100644 (file)
index 0000000..749c1d9
Binary files /dev/null and b/bin/data/0003.scr differ
diff --git a/bin/data/0004.scr b/bin/data/0004.scr
new file mode 100644 (file)
index 0000000..238ad7b
Binary files /dev/null and b/bin/data/0004.scr differ
diff --git a/bin/data/kass.scr b/bin/data/kass.scr
new file mode 100644 (file)
index 0000000..2977e7d
Binary files /dev/null and b/bin/data/kass.scr differ
diff --git a/bin/data/logn.scr b/bin/data/logn.scr
new file mode 100644 (file)
index 0000000..089f16f
Binary files /dev/null and b/bin/data/logn.scr differ
diff --git a/bin/font/lcd0.cmd b/bin/font/lcd0.cmd
new file mode 100644 (file)
index 0000000..b01407f
Binary files /dev/null and b/bin/font/lcd0.cmd differ
diff --git a/bin/font/lcd1.cmd b/bin/font/lcd1.cmd
new file mode 100644 (file)
index 0000000..5e9496d
Binary files /dev/null and b/bin/font/lcd1.cmd differ
diff --git a/bin/fstab.txt b/bin/fstab.txt
new file mode 100644 (file)
index 0000000..de99268
--- /dev/null
@@ -0,0 +1,2 @@
+/dev/hd0       /       rw\r
+/dev/hd1       /usr    rw\r
index a0038f7..4c18bd1 100644 (file)
@@ -1,4 +1,5 @@
 root::0:root\r
 bin::1:bin\r
 tty::6:tty\r
-users::100:users\r
+operator::100:Operators\r
+manager::101:Managers\r
index b299115..57df377 100644 (file)
@@ -1,4 +1,6 @@
-# Hytech initialisation table to format the RAM filesystem\r
+# Hytech initialisation table for running system\r
 \r
-/boot/mkramfs.sh\r
+@/etc/rc.d/rc.sysinit\r
+@/etc/rc.d/rc.runonce\r
+/bin/grlogin\r
 \r
index b670a1c..0b4c166 100644 (file)
Binary files a/bin/kernel.bin and b/bin/kernel.bin differ
index e1f6019..5eb63c1 100644 (file)
Binary files a/bin/large/cat and b/bin/large/cat differ
index fb4c31e..a0ea185 100644 (file)
Binary files a/bin/large/diff and b/bin/large/diff differ
index e35fe2c..ad8f9af 100644 (file)
Binary files a/bin/large/ed and b/bin/large/ed differ
index 1b47e84..650ab5c 100644 (file)
Binary files a/bin/large/init and b/bin/large/init differ
index e22d1b1..5a8b481 100644 (file)
Binary files a/bin/large/ls and b/bin/large/ls differ
index f78e869..98bb041 100644 (file)
Binary files a/bin/large/mkdir and b/bin/large/mkdir differ
index dbe86c9..9c4ebdf 100644 (file)
Binary files a/bin/large/mkfs and b/bin/large/mkfs differ
index 6523833..07abc15 100644 (file)
Binary files a/bin/large/setclock and b/bin/large/setclock differ
index 35d2fdb..b5e7110 100644 (file)
Binary files a/bin/large/tr and b/bin/large/tr differ
diff --git a/bin/large/wnd b/bin/large/wnd
new file mode 100644 (file)
index 0000000..74de59c
Binary files /dev/null and b/bin/large/wnd differ
index 5bb7943..9ea1109 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index f884eb9..3dd533a 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 5d1b6de..7cda2c4 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 4d728d5..f0656d6 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index 6a89b85..173ef79 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 3987ace..55aa388 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 0c3d61b..70c39ff 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 05af6e1..a765b0a 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 7783434..58f1ec1 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index fea1faf..9ae6762 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index 8d257ef..3c11fbd 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 1a85add..3a70b00 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 054482e..821e29f 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ ED(1)               UNIX Programmer's Manual                ED(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
@@ -192,7 +192,7 @@ ED(1)               UNIX Programmer's Manual                ED(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                3\r
+Printed 9/5/2003                                                3\r
 \r
 \r
 \r
@@ -258,7 +258,7 @@ ED(1)               UNIX Programmer's Manual                ED(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                4\r
+Printed 9/5/2003                                                4\r
 \r
 \r
 \r
@@ -324,7 +324,7 @@ ED(1)               UNIX Programmer's Manual                ED(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                5\r
+Printed 9/5/2003                                                5\r
 \r
 \r
 \r
@@ -390,7 +390,7 @@ ED(1)               UNIX Programmer's Manual                ED(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                6\r
+Printed 9/5/2003                                                6\r
 \r
 \r
 \r
@@ -456,7 +456,7 @@ ED(1)               UNIX Programmer's Manual                ED(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                7\r
+Printed 9/5/2003                                                7\r
 \r
 \r
 \r
@@ -522,7 +522,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                8\r
+Printed 9/5/2003                                                8\r
 \r
 \r
 \r
index 13e8a88..5234d8e 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index 002f8cd..4e89111 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 09e7b7c..865a51b 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index ea514ea..c90824d 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
@@ -192,7 +192,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                3\r
+Printed 9/5/2003                                                3\r
 \r
 \r
 \r
index 29f5c58..3ea6520 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index eedb68f..3551d8c 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index aa8f1c8..44f4d68 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 1d98ae3..d86ef47 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ FILES
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index 4204599..9b8caec 100644 (file)
@@ -60,7 +60,7 @@ FILES
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index ecb8da8..c39e033 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 4130d6a..ddfa6fc 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index f28a1e8..97fe449 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index b70f6cf..6aa7cd4 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index bd1d4c3..2bb99c6 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index e292a54..fdaa3a5 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003              PDP11                             1\r
+Printed 9/5/2003              PDP11                             1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003              PDP11                             2\r
+Printed 9/5/2003              PDP11                             2\r
 \r
 \r
 \r
index ef4ab11..ad43a12 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 7e33367..c6d3926 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 9b68a8b..597d35c 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
@@ -192,7 +192,7 @@ Request    Break Initial Meaning
 \r
 \r
 \r
-Printed 6/3/2003                                                3\r
+Printed 9/5/2003                                                3\r
 \r
 \r
 \r
@@ -258,7 +258,7 @@ ROFF(1)             UNIX Programmer's Manual              ROFF(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                4\r
+Printed 9/5/2003                                                4\r
 \r
 \r
 \r
index 12bbcdc..98b494e 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ SH(1)               UNIX Programmer's Manual                SH(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
@@ -192,7 +192,7 @@ SH(1)               UNIX Programmer's Manual                SH(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                3\r
+Printed 9/5/2003                                                3\r
 \r
 \r
 \r
@@ -258,7 +258,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                4\r
+Printed 9/5/2003                                                4\r
 \r
 \r
 \r
index 4470621..bd636aa 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
@@ -192,7 +192,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                3\r
+Printed 9/5/2003                                                3\r
 \r
 \r
 \r
index 2261744..dad3dd5 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 04ff02b..b4cd361 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 75ea18f..469ffd2 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index fbe0ab4..9d8d33c 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 9309448..c9b3a8e 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
@@ -192,7 +192,7 @@ TAR(1)              UNIX Programmer's Manual               TAR(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                3\r
+Printed 9/5/2003                                                3\r
 \r
 \r
 \r
index c00dab4..9dc5907 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 1f39f6c..0d25938 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
index 88c965b..7d67e7b 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 6348290..8ce8cf5 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 6a8db54..ea7c360 100644 (file)
@@ -60,7 +60,7 @@ BUGS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index caa82c9..d5c042a 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
@@ -126,7 +126,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                2\r
+Printed 9/5/2003                                                2\r
 \r
 \r
 \r
@@ -192,7 +192,7 @@ TROFF(1)            UNIX Programmer's Manual             TROFF(1)
 \r
 \r
 \r
-Printed 6/3/2003                                                3\r
+Printed 9/5/2003                                                3\r
 \r
 \r
 \r
index ce58e06..a2cd695 100644 (file)
@@ -60,7 +60,7 @@ DIAGNOSTICS
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 93c9b44..580a879 100644 (file)
@@ -60,7 +60,7 @@ SEE ALSO
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
index 26587f5..2c78c89 100644 (file)
@@ -60,7 +60,7 @@ DESCRIPTION
 \r
 \r
 \r
-Printed 6/3/2003                                                1\r
+Printed 9/5/2003                                                1\r
 \r
 \r
 \r
diff --git a/bin/mkboot.bat b/bin/mkboot.bat
new file mode 100644 (file)
index 0000000..a5ae3c2
--- /dev/null
@@ -0,0 +1,18 @@
+del uzidisk.dat\r
+touch uzidisk.dat\r
+@if errorlevel 1 goto failure\r
+mkfs -l -q -v -y uzidisk.dat 1536 30\r
+@if errorlevel 1 goto failure\r
+ucp < mkboot.ucp\r
+@if errorlevel 1 goto failure\r
+fsck -y uzidisk.dat\r
+@if errorlevel 1 goto failure\r
+\r
+gzip --best < uzidisk.dat > uzboot.gz\r
+\r
+@echo SUCCESS\r
+@goto done\r
+:failure\r
+@echo FAILURE\r
+:done\r
+\r
diff --git a/bin/mkboot.ucp b/bin/mkboot.ucp
new file mode 100644 (file)
index 0000000..f8c52ec
--- /dev/null
@@ -0,0 +1,130 @@
+root b:\r
+cd /\r
+mkdir bin\r
+mkdir boot\r
+mkdir dev\r
+mkdir etc\r
+mkdir home\r
+mkdir lib\r
+mkdir mnt\r
+mkdir root\r
+mkdir tmp\r
+mkdir usr\r
+mkdir var\r
+cd /bin\r
+bget banked\align align\r
+chmod 755 align\r
+align align\r
+bget banked\cat cat\r
+chmod 755 cat\r
+align cat\r
+bget banked\chgrp chgrp\r
+chmod 755 chgrp\r
+align chgrp\r
+bget banked\chmod chmod\r
+chmod 755 chmod\r
+align chmod\r
+bget banked\chown chown\r
+chmod 755 chown\r
+align chown\r
+bget banked\cp cp\r
+chmod 755 cp\r
+align cp\r
+bget banked\echo echo\r
+chmod 755 echo\r
+align echo\r
+bget banked\fsck fsck\r
+chmod 755 fsck\r
+align fsck\r
+bget banked\init init\r
+chmod 755 init\r
+align init\r
+sln cp ln\r
+bget banked\login login\r
+chmod 755 login\r
+align login\r
+bget banked\ls ls\r
+chmod 755 ls\r
+align ls\r
+bget banked\mkdir mkdir\r
+chmod 755 mkdir\r
+align mkdir\r
+bget banked\more more\r
+chmod 755 more\r
+align more\r
+bget banked\mount mount\r
+chmod 755 mount\r
+align mount\r
+bget banked\msh msh\r
+chmod 755 msh\r
+align msh\r
+sln cp mv\r
+bget banked\reboot reboot\r
+chmod 755 reboot\r
+align reboot\r
+sln cp rm\r
+bget banked\rmdir rmdir\r
+chmod 755 rmdir\r
+align rmdir\r
+sln msh sh\r
+bget banked\ualign ualign\r
+chmod 755 ualign\r
+align ualign\r
+bget banked\umount umount\r
+chmod 755 umount\r
+align umount\r
+cd /boot\r
+bget kernel.bin\r
+align kernel.bin\r
+cd /dev\r
+umask 000\r
+mknod hd0 60666 0 0\r
+mknod hd1 60666 0 1\r
+mknod null 20666 1 0\r
+mknod zero 20666 2 0\r
+mknod kmem 20666 3 0\r
+mknod tty 20666 4 0\r
+mknod tty0 20666 4 1\r
+mknod tty1 20666 4 2\r
+mknod tty2 20666 4 3\r
+mknod tty3 20666 4 4\r
+mknod scale 20666 4 5\r
+mknod lcd0 20666 4 6\r
+mknod lcd1 20666 4 7\r
+mknod lpr0 20666 4 9\r
+umask 022\r
+sln tty0 cognitive\r
+sln tty1 barcode\r
+sln tty1 console\r
+sln tty2 atmodem\r
+sln tty3 apilan\r
+sln lpr0 printer\r
+cd /etc\r
+get group.txt group\r
+get passwd.txt passwd\r
+get mtab.txt mtab\r
+get fstab.txt fstab\r
+get inittab.txt inittab\r
+get profile.sh profile\r
+mkdir rc.d\r
+cd /etc/rc.d\r
+get sysinit.rc rc.sysinit\r
+chmod 755 rc.sysinit\r
+get runonce.rc rc.runonce\r
+chmod 755 rc.runonce\r
+cd /home\r
+mkdir downingn\r
+chown 60 downingn\r
+chgrp 100 downingn\r
+mkdir morsinkj\r
+chown 70 morsinkj\r
+chgrp 100 morsinkj\r
+mkdir buijsr\r
+chown 80 buijsr\r
+chgrp 100 buijsr\r
+mkdir 90\r
+chown 11 90\r
+chgrp 101 90\r
+cd /lib\r
+get liberror.txt\r
+exit\r
index 6d03769..f8e4ce2 100644 (file)
@@ -5,9 +5,7 @@ cd /boot/skel
 mkfs -l -q -v -y /dev/hd0 1536 30\r
 mount /dev/hd0 /mnt\r
 cp -r -v * /mnt\r
-align -s -v /mnt/bin/*\r
-cp -v /boot/kernel.bin /mnt/boot\r
-align -v /mnt/boot/kernel.bin\r
+align -s -v /mnt/bin/* /mnt/boot/kernel.bin\r
 umount /dev/hd0\r
 reboot\r
 \r
index de99268..070565f 100644 (file)
@@ -1,2 +1 @@
 /dev/hd0       /       rw\r
-/dev/hd1       /usr    rw\r
index 3d1b137..e49fa4f 100644 (file)
--- a/bin/n.bat
+++ b/bin/n.bat
@@ -1,15 +1,33 @@
+@rem the following should not be done here - call it manually when necessary\r
+@rem call mkboot.bat\r
+\r
+@rem the following should be uncommented to use the new style bootstrap 'bomb'\r
+copy/b uzboot.ldr + uzboot.gz uzboot.bin\r
+\r
+@rem the following should be uncommented to use the old style bootstrap script\r
+@rem copy kernel.bin uzboot.bin\r
+\r
+md \nlddl\r
+copy checksum.dat \nlddl\r
+copy checksum.dat \nlddl\crc.dat\r
+copy boot.bin \nlddl\r
+copy uzboot.bin \nlddl\kernel.bin\r
+set country=NLD\r
+del \nlddl\checksum\r
+crc\r
+copy \nlddl\checksum .\r
+\r
 del uzidisk.dat\r
 touch uzidisk.dat\r
 @if errorlevel 1 goto failure\r
-rem mkfs -b -f -q -v -y uzidisk.dat 8192 163\r
-rem mkfs -l -f -q -v -y uzidisk.dat 8192 163\r
 mkfs -f -q -v -y uzidisk.dat 8192 163\r
 @if errorlevel 1 goto failure\r
 ucp < n.ucp\r
 @if errorlevel 1 goto failure\r
 fsck -y uzidisk.dat\r
 @if errorlevel 1 goto failure\r
-copy uzidisk.dat e:\\r
+call appinst.bat\r
+@rem copy uzidisk.dat e:\\r
 \r
 @echo SUCCESS\r
 @goto done\r
index 64650e7..213a1d2 100644 (file)
--- a/bin/n.ucp
+++ b/bin/n.ucp
@@ -215,7 +215,11 @@ chmod 755 yes
 cd /boot\r
 get mkramfs.sh\r
 chmod 755 mkramfs.sh\r
-bget kernel.bin\r
+get newkrnl.sh\r
+chmod 755 newkrnl.sh\r
+get runonce.sh\r
+chmod 755 runonce.sh\r
+bget uzboot.bin kernel.bin\r
 bget boot.bin\r
 bget checksum\r
 ln checksum crc\r
@@ -245,6 +249,10 @@ bget banked\chown chown
 chmod 755 chown\r
 bget banked\cp cp\r
 chmod 755 cp\r
+bget banked\echo echo\r
+chmod 755 echo\r
+bget banked\fsck fsck\r
+chmod 755 fsck\r
 bget banked\init init\r
 chmod 755 init\r
 sln cp ln\r
@@ -272,23 +280,24 @@ chmod 755 ualign
 bget banked\umount umount\r
 chmod 755 umount\r
 cd /boot/skel/boot\r
-get newkrnl.sh\r
-chmod 755 newkrnl.sh\r
+bget kernel.bin\r
 cd /boot/skel/dev\r
+umask 000\r
 mknod hd0 60666 0 0\r
 mknod hd1 60666 0 1\r
-mknod null 20644 1 0\r
-mknod zero 20644 2 0\r
-mknod kmem 20644 3 0\r
-mknod tty 20644 4 0\r
-mknod tty0 20644 4 1\r
-mknod tty1 20644 4 2\r
-mknod tty2 20644 4 3\r
-mknod tty3 20644 4 4\r
-mknod scale 20644 4 5\r
-mknod lcd0 20644 4 6\r
-mknod lcd1 20644 4 7\r
-mknod lpr0 20644 4 9\r
+mknod null 20666 1 0\r
+mknod zero 20666 2 0\r
+mknod kmem 20666 3 0\r
+mknod tty 20666 4 0\r
+mknod tty0 20666 4 1\r
+mknod tty1 20666 4 2\r
+mknod tty2 20666 4 3\r
+mknod tty3 20666 4 4\r
+mknod scale 20666 4 5\r
+mknod lcd0 20666 4 6\r
+mknod lcd1 20666 4 7\r
+mknod lpr0 20666 4 9\r
+umask 022\r
 sln tty0 cognitive\r
 sln tty1 barcode\r
 sln tty1 console\r
@@ -297,25 +306,49 @@ sln tty3 apilan
 sln lpr0 printer\r
 cd /boot/skel/etc\r
 get group.txt group\r
-get mtab.txt mtab\r
 get passwd.txt passwd\r
+get mtab.txt mtab\r
+get fstab.txt fstab\r
+get inittab.txt inittab\r
+get profile.sh profile\r
+mkdir rc.d\r
+cd /boot/skel/etc/rc.d\r
+get sysinit.rc rc.sysinit\r
+chmod 755 rc.sysinit\r
+get runonce.rc rc.runonce\r
+chmod 755 rc.runonce\r
+cd /boot/skel/home\r
+mkdir downingn\r
+chown 60 downingn\r
+chgrp 100 downingn\r
+mkdir morsinkj\r
+chown 70 morsinkj\r
+chgrp 100 morsinkj\r
+mkdir buijsr\r
+chown 80 buijsr\r
+chgrp 100 buijsr\r
+mkdir 90\r
+chown 11 90\r
+chgrp 101 90\r
 cd /boot/skel/lib\r
 get liberror.txt\r
 cd /dev\r
+umask 000\r
 mknod hd0 60666 0 0\r
 mknod hd1 60666 0 1\r
-mknod null 20644 1 0\r
-mknod zero 20644 2 0\r
-mknod kmem 20644 3 0\r
-mknod tty 20644 4 0\r
-mknod tty0 20644 4 1\r
-mknod tty1 20644 4 2\r
-mknod tty2 20644 4 3\r
-mknod tty3 20644 4 4\r
-mknod scale 20644 4 5\r
-mknod lcd0 20644 4 6\r
-mknod lcd1 20644 4 7\r
-mknod lpr0 20644 4 9\r
+mknod null 20666 1 0\r
+mknod zero 20666 2 0\r
+mknod kmem 20666 3 0\r
+mknod tty 20666 4 0\r
+mknod tty0 20666 4 1\r
+mknod tty1 20666 4 2\r
+mknod tty2 20666 4 3\r
+mknod tty3 20666 4 4\r
+mknod scale 20666 4 5\r
+mknod lcd0 20666 4 6\r
+mknod lcd1 20666 4 7\r
+mknod lpr0 20666 4 9\r
+umask 022\r
 sln tty0 cognitive\r
 sln tty1 barcode\r
 sln tty1 console\r
@@ -324,13 +357,19 @@ sln tty3 apilan
 sln lpr0 printer\r
 cd /etc\r
 get group.txt group\r
-get inittab.txt inittab\r
 get passwd.txt passwd\r
+get xmtab.txt mtab\r
+get xfstab.txt fstab\r
+get xinittab.txt inittab\r
 cd /lib\r
 get liberror.txt\r
 get fortune.dat\r
+mkdir font\r
 mkdir term\r
 mkdir tmac\r
+cd /lib/font\r
+bget font\lcd0.cmd lcd0.cmd\r
+bget font\lcd1.cmd lcd1.cmd\r
 cd /lib/term\r
 bget term\tab37 tab37\r
 cd /lib/tmac\r
index af07773..03dd4cb 100644 (file)
@@ -1,10 +1,8 @@
 #!/bin/sh\r
-# fixme: must be <= 256 bytes\r
 \r
 cd /boot\r
-cp -v /usr/boot/kernel.bin kernel.tmp\r
+cp -v /usr/boot/skel/boot/kernel.bin kernel.tmp\r
 align -v kernel.tmp\r
 mv -v kernel.tmp kernel.bin\r
-cp -v /usr/boot/boot.bin /dev/hd0\r
 reboot\r
 \r
diff --git a/bin/padding.dat b/bin/padding.dat
new file mode 100644 (file)
index 0000000..73f6f6e
--- /dev/null
@@ -0,0 +1 @@
+ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª
\ No newline at end of file
index 44938c4..fd1accf 100644 (file)
@@ -1,2 +1,6 @@
 root::0:0::/root:\r
 bin:!:1:1::/bin:\r
+downingn:LbnMHnQ.K1gpi:60:100:Downing, Nicholas:/home/downingn:/bin/test\r
+morsinkj:TbKUmao1jtbos:70:100:Morsink, Joost:/home/morsinkj:/bin/test\r
+buijsr:0bkPMVw/Z4/sh:80:100:Buijs, Rob:/home/buijsr:/bin/test\r
+90:IccdKbe10jjDC:11:101:Surname Firstname:/home/90:/bin/test\r
diff --git a/bin/profile.sh b/bin/profile.sh
new file mode 100644 (file)
index 0000000..f685868
--- /dev/null
@@ -0,0 +1,6 @@
+#! /bin/sh\r
+\r
+PS1='\u@\h:\w\# '\r
+\r
+umask 022\r
+\r
diff --git a/bin/runonce.rc b/bin/runonce.rc
new file mode 100644 (file)
index 0000000..baa3cc1
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh\r
+\r
+echo "/etc/rc.d/rc.runonce"\r
+rm -v /etc/rc.d/rc.runonce\r
+exec /usr/boot/runonce.sh\r
+\r
diff --git a/bin/runonce.sh b/bin/runonce.sh
new file mode 100644 (file)
index 0000000..73906a5
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh\r
+\r
+echo ""\r
+echo "Installing LCD character sets"\r
+echo ""\r
+\r
+cp -v /usr/lib/font/lcd0.cmd /dev/lcd0\r
+cp -v /usr/lib/font/lcd1.cmd /dev/lcd1\r
+\r
+umask 022\r
+mkdir /wnd\r
+exec /usr/boot/appinst.sh\r
+\r
diff --git a/bin/sysinit.rc b/bin/sysinit.rc
new file mode 100644 (file)
index 0000000..06beea1
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh\r
+\r
+echo "/etc/rc.d/rc.sysinit"\r
+fsck -y /dev/hd0\r
+\r
diff --git a/bin/uzboot.bin b/bin/uzboot.bin
new file mode 100644 (file)
index 0000000..4a3da4b
Binary files /dev/null and b/bin/uzboot.bin differ
diff --git a/bin/uzboot.gz b/bin/uzboot.gz
new file mode 100644 (file)
index 0000000..d98900b
Binary files /dev/null and b/bin/uzboot.gz differ
diff --git a/bin/uzboot.ldr b/bin/uzboot.ldr
new file mode 100644 (file)
index 0000000..0447abf
Binary files /dev/null and b/bin/uzboot.ldr differ
index 4f29172..096a219 100644 (file)
Binary files a/bin/uzidisk.dat and b/bin/uzidisk.dat differ
diff --git a/bin/x.sh b/bin/x.sh
deleted file mode 100644 (file)
index 0774808..0000000
--- a/bin/x.sh
+++ /dev/null
@@ -1 +0,0 @@
-#!/bin/sh\r
diff --git a/bin/xfstab.txt b/bin/xfstab.txt
new file mode 100644 (file)
index 0000000..21be366
--- /dev/null
@@ -0,0 +1 @@
+/dev/hd1       /       rw\r
diff --git a/bin/xinittab.txt b/bin/xinittab.txt
new file mode 100644 (file)
index 0000000..b299115
--- /dev/null
@@ -0,0 +1,4 @@
+# Hytech initialisation table to format the RAM filesystem\r
+\r
+/boot/mkramfs.sh\r
+\r
diff --git a/bin/xmtab.txt b/bin/xmtab.txt
new file mode 100644 (file)
index 0000000..21be366
--- /dev/null
@@ -0,0 +1 @@
+/dev/hd1       /       rw\r
diff --git a/doc/EXECPATH.TXT b/doc/EXECPATH.TXT
new file mode 100644 (file)
index 0000000..0815f68
--- /dev/null
@@ -0,0 +1,3 @@
+General block diagram\r
+Want a summary for the execution path from clear memory to running\r
+With module names, function names, source file names, variable names\r
diff --git a/doc/gui/Gui driver.doc b/doc/gui/Gui driver.doc
new file mode 100644 (file)
index 0000000..3e36ef1
Binary files /dev/null and b/doc/gui/Gui driver.doc differ
diff --git a/doc/gui/Software design.doc b/doc/gui/Software design.doc
new file mode 100644 (file)
index 0000000..1c86efa
Binary files /dev/null and b/doc/gui/Software design.doc differ
diff --git a/doc/gui/scr file format.doc b/doc/gui/scr file format.doc
new file mode 100644 (file)
index 0000000..d48abea
Binary files /dev/null and b/doc/gui/scr file format.doc differ
diff --git a/doc/rfc/rfc1700.txt b/doc/rfc/rfc1700.txt
new file mode 100644 (file)
index 0000000..1d1c0ab
--- /dev/null
@@ -0,0 +1,12884 @@
+\r
+\r
+\r
+\r
+\r
+Network Working Group                                        J. Reynolds\r
+Request for Comments: 1700                                     J. Postel\r
+STD: 2                                                               ISI\r
+Obsoletes RFCs: 1340, 1060, 1010, 990, 960,                 October 1994\r
+943, 923, 900, 870, 820, 790, 776, 770,\r
+762, 758,755, 750, 739, 604, 503, 433, 349\r
+Obsoletes IENs: 127, 117, 93\r
+Category: Standards Track\r
+\r
+\r
+                            ASSIGNED NUMBERS\r
+\r
+Status of this Memo\r
+\r
+   This memo is a status report on the parameters (i.e., numbers and\r
+   keywords) used in protocols in the Internet community.  Distribution\r
+   of this memo is unlimited.\r
+\r
+OVERVIEW\r
+\r
+This RFC is a snapshot of the ongoing process of the assignment of\r
+protocol parameters for the Internet protocol suite.  To make the\r
+current information readily available the assignments are kept up-to-\r
+date in a set of online text files.  This RFC has been assembled by\r
+catinating these files together with a minimum of formatting "glue".\r
+The authors appologize for the somewhat rougher formatting and style\r
+than is typical of most RFCs.\r
+\r
+We expect that various readers will notice specific items that should be\r
+corrected.  Please send any specific corrections via email to\r
+<iana@isi.edu>.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 1]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+INTRODUCTION\r
+\r
+The files in this directory document the currently assigned values for\r
+several series of numbers used in network protocol implementations.\r
+\r
+        ftp://ftp.isi.edu/in-notes/iana/assignments\r
+\r
+The Internet Assigned Numbers Authority (IANA) is the central\r
+coordinator for the assignment of unique parameter values for Internet\r
+protocols.  The IANA is chartered by the Internet Society (ISOC) and\r
+the Federal Network Council (FNC) to act as the clearinghouse to\r
+assign and coordinate the use of numerous Internet protocol\r
+parameters.\r
+\r
+The Internet protocol suite, as defined by the Internet Engineering\r
+Task Force (IETF) and its steering group (the IESG), contains numerous\r
+parameters, such as internet addresses, domain names, autonomous\r
+system numbers (used in some routing protocols), protocol numbers,\r
+port numbers, management information base object identifiers,\r
+including private enterprise numbers, and many others.\r
+\r
+The common use of the Internet protocols by the Internet community\r
+requires that the particular values used in these parameter fields be\r
+assigned uniquely.  It is the task of the IANA to make those unique\r
+assignments as requested and to maintain a registry of the currently\r
+assigned values.\r
+\r
+Requests for parameter assignments (protocols, ports, etc.) should be\r
+sent to <iana@isi.edu>.\r
+\r
+Requests for SNMP network management private enterprise number\r
+assignments should be sent to <iana-mib@isi.edu>.\r
+\r
+The IANA is located at and operated by the Information Sciences\r
+Institute (ISI) of the University of Southern California (USC).\r
+\r
+If you are developing a protocol or application that will require the\r
+use of a link, socket, port, protocol, etc., please contact the IANA\r
+to receive a number assignment.\r
+\r
+        Joyce K. Reynolds\r
+        Internet Assigned Numbers Authority\r
+        USC - Information Sciences Institute\r
+        4676 Admiralty Way\r
+        Marina del Rey, California  90292-6695\r
+\r
+        Electronic mail: IANA@ISI.EDU\r
+        Phone: +1 310-822-1511\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 2]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Most of the protocols are documented in the RFC series of notes.  Some\r
+of the items listed are undocumented.  Further information on\r
+protocols can be found in the memo, "Internet Official Protocol\r
+Standards" (STD 1).\r
+\r
+Data Notations\r
+\r
+The convention in the documentation of Internet Protocols is to\r
+express numbers in decimal and to picture data in "big-endian" order\r
+[COHEN].  That is, fields are described left to right, with the most\r
+significant octet on the left and the least significant octet on the\r
+right.\r
+\r
+The order of transmission of the header and data described in this\r
+document is resolved to the octet level.  Whenever a diagram shows a\r
+group of octets, the order of transmission of those octets is the\r
+normal order in which they are read in English.  For example, in the\r
+following diagram the octets are transmitted in the order they are\r
+numbered.\r
+\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |       1       |       2       |       3       |       4       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |       5       |       6       |       7       |       8       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |       9       |      10       |      11       |      12       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+                       Transmission Order of Bytes\r
+\r
+Whenever an octet represents a numeric quantity the left most bit in the\r
+diagram is the high order or most significant bit.  That is, the bit\r
+labeled 0 is the most significant bit.  For example, the following\r
+diagram represents the value 170 (decimal).\r
+\r
+\r
+                          0 1 2 3 4 5 6 7\r
+                         +-+-+-+-+-+-+-+-+\r
+                         |1 0 1 0 1 0 1 0|\r
+                         +-+-+-+-+-+-+-+-+\r
+\r
+                        Significance of Bits\r
+\r
+Similarly, whenever a multi-octet field represents a numeric quantity\r
+the left most bit of the whole field is the most significant bit.  When\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 3]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+a multi-octet quantity is transmitted the most significant octet is\r
+transmitted first.\r
+\r
+Special Addresses\r
+\r
+There are five classes of IP addresses: Class A through Class E.  Of\r
+these, Classes A, B, and C are used for unicast addresses, Class D is\r
+used for multicast addresses, and Class E addresses are reserved for\r
+future use.\r
+\r
+With the advent of classless addressing [CIDR1, CIDR2], the\r
+network-number part of an address may be of any length, and the whole\r
+notion of address classes becomes less important.\r
+\r
+There are certain special cases for IP addresses.  These special cases\r
+can be concisely summarized using the earlier notation for an IP\r
+address:\r
+\r
+      IP-address ::=  { <Network-number>, <Host-number> }\r
+\r
+         or\r
+\r
+      IP-address ::=  { <Network-number>, <Subnet-number>,\r
+                                                      <Host-number> }\r
+\r
+if we also use the notation "-1" to mean the field contains all 1\r
+bits.  Some common special cases are as follows:\r
+\r
+      (a)   {0, 0}\r
+\r
+         This host on this network.  Can only be used as a source\r
+         address (see note later).\r
+\r
+      (b)   {0, <Host-number>}\r
+\r
+         Specified host on this network.  Can only be used as a\r
+         source address.\r
+\r
+      (c)   { -1, -1}\r
+\r
+         Limited broadcast.  Can only be used as a destination\r
+         address, and a datagram with this address must never be\r
+         forwarded outside the (sub-)net of the source.\r
+\r
+      (d)   {<Network-number>, -1}\r
+\r
+         Directed broadcast to specified network.  Can only be used\r
+         as a destination address.\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 4]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+      (e)   {<Network-number>, <Subnet-number>, -1}\r
+\r
+         Directed broadcast to specified subnet.  Can only be used as\r
+         a destination address.\r
+\r
+      (f)   {<Network-number>, -1, -1}\r
+\r
+         Directed broadcast to all subnets of specified subnetted\r
+         network.  Can only be used as a destination address.\r
+\r
+      (g)   {127, <any>}\r
+\r
+         Internal host loopback address.  Should never appear outside\r
+         a host.\r
+\r
+\r
+REFERENCES\r
+\r
+[COHEN]   Cohen, D., "On Holy Wars and a Plea for Peace", IEEE Computer\r
+          Magazine, October 1981.\r
+\r
+[CIDR1]   Fuller, V., T. Li, J. Yu, and K. Varadhan, "Classless\r
+          Inter-Domain Routing (CIDR): an Address Assignment and\r
+          Aggregation Strategy", RFC 1519, September 1993.\r
+\r
+[CIDR2]   Rekhter, Y., and T. Li, "An Architecture for IP Address\r
+          Allocation with CIDR", RFC 1518, September 1993.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/introduction\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 5]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+VERSION NUMBERS\r
+\r
+In the Internet Protocol (IP) [RFC791] there is a field to identify\r
+the version of the internetwork general protocol.  This field is 4\r
+bits in size.\r
+\r
+Assigned Internet Version Numbers\r
+\r
+Decimal   Keyword    Version                            References\r
+-------   -------    -------                            ----------\r
+    0                Reserved                                [JBP]\r
+  1-3                Unassigned                              [JBP]\r
+    4       IP       Internet Protocol                [RFC791,JBP]\r
+    5       ST       ST Datagram Mode                [RFC1190,JWF]\r
+    6       SIP      Simple Internet Protocol                [RH6]\r
+    7       TP/IX    TP/IX: The Next Internet                [RXU]\r
+    8       PIP      The P Internet Protocol                 [PXF]\r
+    9       TUBA     TUBA                                    [RXC]\r
+10-14                Unassigned                              [JBP]\r
+   15                Reserved                                [JBP]\r
+\r
+REFERENCES\r
+\r
+[RFC791] Postel, J., ed., "Internet Protocol - DARPA Internet Program\r
+         Protocol Specification", STD 5, RFC 791, USC/Information\r
+         Sciences Institute, September 1981.\r
+\r
+[RFC1190] Topolcic, C., Editor, "Experimental Internet Stream\r
+          Protocol, Version 2 (ST-II)", RFC 1190, CIP Working Group,\r
+          October 1990.\r
+\r
+PEOPLE\r
+\r
+[JPB] Jon Postel <postel@isi.edu>\r
+\r
+[JWF] Jim Forgie <FORGIE@XN.LL.MIT.ED>\r
+\r
+[RH6] Robert Hinden <Hinden@ENG.SUN.COM>\r
+\r
+[RXU] Robert Ullmann <ariel@world.std.com>\r
+\r
+[PXF] Paul Francis <francis@cactus.ntt.jp>\r
+\r
+[RXC] Ross Callon <callon@wellfleet.com>\r
+\r
+[]\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 6]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/version-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 7]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PROTOCOL NUMBERS\r
+\r
+\r
+In the Internet Protocol (IP) [DDN], [RFC791] there is a field, called\r
+Protocol, to identify the next level protocol.  This is an 8 bit\r
+field.\r
+\r
+\r
+Assigned Internet Protocol Numbers\r
+\r
+Decimal    Keyword     Protocol                         References\r
+-------    -------     --------                         ----------\r
+     0                 Reserved                              [JBP]\r
+     1     ICMP        Internet Control Message       [RFC792,JBP]\r
+     2     IGMP        Internet Group Management     [RFC1112,JBP]\r
+     3     GGP         Gateway-to-Gateway              [RFC823,MB]\r
+     4     IP          IP in IP (encasulation)               [JBP]\r
+     5     ST          Stream                 [RFC1190,IEN119,JWF]\r
+     6     TCP         Transmission Control           [RFC793,JBP]\r
+     7     UCL         UCL                                    [PK]\r
+     8     EGP         Exterior Gateway Protocol     [RFC888,DLM1]\r
+     9     IGP         any private interior gateway          [JBP]\r
+    10     BBN-RCC-MON BBN RCC Monitoring                    [SGC]\r
+    11     NVP-II      Network Voice Protocol         [RFC741,SC3]\r
+    12     PUP         PUP                             [PUP,XEROX]\r
+    13     ARGUS       ARGUS                                [RWS4]\r
+    14     EMCON       EMCON                                 [BN7]\r
+    15     XNET        Cross Net Debugger            [IEN158,JFH2]\r
+    16     CHAOS       Chaos                                 [NC3]\r
+    17     UDP         User Datagram                  [RFC768,JBP]\r
+    18     MUX         Multiplexing                    [IEN90,JBP]\r
+    19     DCN-MEAS    DCN Measurement Subsystems           [DLM1]\r
+    20     HMP         Host Monitoring                [RFC869,RH6]\r
+    21     PRM         Packet Radio Measurement              [ZSU]\r
+    22     XNS-IDP     XEROX NS IDP               [ETHERNET,XEROX]\r
+    23     TRUNK-1     Trunk-1                              [BWB6]\r
+    24     TRUNK-2     Trunk-2                              [BWB6]\r
+    25     LEAF-1      Leaf-1                               [BWB6]\r
+    26     LEAF-2      Leaf-2                               [BWB6]\r
+    27     RDP         Reliable Data Protocol         [RFC908,RH6]\r
+    28     IRTP        Internet Reliable Transaction  [RFC938,TXM]\r
+    29     ISO-TP4     ISO Transport Protocol Class 4 [RFC905,RC77]\r
+    30     NETBLT      Bulk Data Transfer Protocol    [RFC969,DDC1]\r
+    31     MFE-NSP     MFE Network Services Protocol  [MFENET,BCH2]\r
+    32     MERIT-INP   MERIT Internodal Protocol             [HWB]\r
+    33     SEP         Sequential Exchange Protocol        [JC120]\r
+    34     3PC         Third Party Connect Protocol         [SAF3]\r
+    35     IDPR        Inter-Domain Policy Routing Protocol [MXS1]\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 8]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    36     XTP         XTP                                   [GXC]\r
+    37     DDP         Datagram Delivery Protocol            [WXC]\r
+    38     IDPR-CMTP   IDPR Control Message Transport Proto [MXS1]\r
+    39     TP++        TP++ Transport Protocol               [DXF]\r
+    40     IL          IL Transport Protocol                [DXP2]\r
+    41     SIP         Simple Internet Protocol              [SXD]\r
+    42     SDRP        Source Demand Routing Protocol       [DXE1]\r
+    43     SIP-SR      SIP Source Route                      [SXD]\r
+    44     SIP-FRAG    SIP Fragment                          [SXD]\r
+    45     IDRP        Inter-Domain Routing Protocol   [Sue Hares]\r
+    46     RSVP        Reservation Protocol           [Bob Braden]\r
+    47     GRE         General Routing Encapsulation     [Tony Li]\r
+    48     MHRP        Mobile Host Routing Protocol[David Johnson]\r
+    49     BNA         BNA                          [Gary Salamon]\r
+    50     SIPP-ESP    SIPP Encap Security Payload [Steve Deering]\r
+    51     SIPP-AH     SIPP Authentication Header  [Steve Deering]\r
+    52     I-NLSP      Integrated Net Layer Security  TUBA [GLENN]\r
+    53     SWIPE       IP with Encryption                    [JI6]\r
+    54     NHRP        NBMA Next Hop Resolution Protocol\r
+ 55-60                 Unassigned                            [JBP]\r
+    61                 any host internal protocol            [JBP]\r
+    62     CFTP        CFTP                            [CFTP,HCF2]\r
+    63                 any local network                     [JBP]\r
+    64     SAT-EXPAK   SATNET and Backroom EXPAK             [SHB]\r
+    65     KRYPTOLAN   Kryptolan                            [PXL1]\r
+    66     RVD         MIT Remote Virtual Disk Protocol      [MBG]\r
+    67     IPPC        Internet Pluribus Packet Core         [SHB]\r
+    68                 any distributed file system           [JBP]\r
+    69     SAT-MON     SATNET Monitoring                     [SHB]\r
+    70     VISA        VISA Protocol                        [GXT1]\r
+    71     IPCV        Internet Packet Core Utility          [SHB]\r
+    72     CPNX        Computer Protocol Network Executive  [DXM2]\r
+    73     CPHB        Computer Protocol Heart Beat         [DXM2]\r
+    74     WSN         Wang Span Network                     [VXD]\r
+    75     PVP         Packet Video Protocol                 [SC3]\r
+    76     BR-SAT-MON  Backroom SATNET Monitoring            [SHB]\r
+    77     SUN-ND      SUN ND PROTOCOL-Temporary             [WM3]\r
+    78     WB-MON      WIDEBAND Monitoring                   [SHB]\r
+    79     WB-EXPAK    WIDEBAND EXPAK                        [SHB]\r
+    80     ISO-IP      ISO Internet Protocol                 [MTR]\r
+    81     VMTP        VMTP                                 [DRC3]\r
+    82     SECURE-VMTP SECURE-VMTP                          [DRC3]\r
+    83     VINES       VINES                                 [BXH]\r
+    84     TTP         TTP                                   [JXS]\r
+    85     NSFNET-IGP  NSFNET-IGP                            [HWB]\r
+    86     DGP         Dissimilar Gateway Protocol     [DGP,ML109]\r
+    87     TCF         TCF                                  [GAL5]\r
+    88     IGRP        IGRP                            [CISCO,GXS]\r
+\r
+\r
+\r
+Reynolds & Postel                                               [Page 9]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    89     OSPFIGP     OSPFIGP                      [RFC1583,JTM4]\r
+    90     Sprite-RPC  Sprite RPC Protocol            [SPRITE,BXW]\r
+    91     LARP        Locus Address Resolution Protocol     [BXH]\r
+    92     MTP         Multicast Transport Protocol          [SXA]\r
+    93     AX.25       AX.25 Frames                         [BK29]\r
+    94     IPIP        IP-within-IP Encapsulation Protocol   [JI6]\r
+    95     MICP        Mobile Internetworking Control Pro.   [JI6]\r
+    96     SCC-SP      Semaphore Communications Sec. Pro.    [HXH]\r
+    97     ETHERIP     Ethernet-within-IP Encapsulation     [RXH1]\r
+    98     ENCAP       Encapsulation Header         [RFC1241,RXB3]\r
+    99                 any private encryption scheme         [JBP]\r
+   100     GMTP        GMTP                                 [RXB5]\r
+101-254                Unassigned                            [JBP]\r
+    255                Reserved                              [JBP]\r
+\r
+\r
+REFERENCES\r
+\r
+[CFTP] Forsdick, H., "CFTP", Network Message, Bolt Beranek and\r
+       Newman, January 1982.\r
+\r
+[CISCO] Cisco Systems, "Gateway Server Reference Manual", Manual\r
+        Revision B, January 10, 1988.\r
+\r
+[DDN] Feinler, E., Editor, "DDN Protocol Handbook", Network\r
+      Information Center, SRI International, December 1985.\r
+\r
+[DGP] M/A-COM Government Systems, "Dissimilar Gateway Protocol\r
+      Specification, Draft Version", Contract no. CS901145,\r
+      November 16, 1987.\r
+\r
+[ETHERNET]  "The Ethernet, A Local Area Network: Data Link Layer and\r
+            Physical Layer Specification", AA-K759B-TK, Digital\r
+            Equipment Corporation, Maynard, MA.  Also as: "The\r
+            Ethernet - A Local Area Network", Version 1.0, Digital\r
+            Equipment Corporation, Intel Corporation, Xerox\r
+            Corporation, September 1980.  And: "The Ethernet, A Local\r
+            Area Network: Data Link Layer and Physical Layer\r
+            Specifications", Digital, Intel and Xerox, November 1982.\r
+            And: XEROX, "The Ethernet, A Local Area Network: Data Link\r
+            Layer and Physical Layer Specification", X3T51/80-50,\r
+            Xerox Corporation, Stamford, CT., October 1980.\r
+\r
+[IEN90] Cohen, D. and J. Postel, "Multiplexing Protocol", IEN 90,\r
+        USC/Information Sciences Institute, May 1979.\r
+\r
+[IEN119] Forgie, J., "ST - A Proposed Internet Stream Protocol",\r
+         IEN 119, MIT Lincoln Laboratory, September 1979.\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 10]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[IEN158] Haverty, J., "XNET Formats for Internet Protocol Version 4",\r
+         IEN 158, October 1980.\r
+\r
+[MFENET] Shuttleworth, B., "A Documentary of MFENet, a National\r
+         Computer Network", UCRL-52317, Lawrence Livermore Labs,\r
+         Livermore, California, June 1977.\r
+\r
+[PUP] Boggs, D., J. Shoch, E. Taft, and R. Metcalfe, "PUP: An\r
+      Internetwork Architecture", XEROX Palo Alto Research Center,\r
+      CSL-79-10, July 1979; also in IEEE Transactions on\r
+      Communication, Volume COM-28, Number 4, April 1980.\r
+\r
+[SPRITE] Welch, B., "The Sprite Remote Procedure Call System",\r
+         Technical Report, UCB/Computer Science Dept., 86/302,\r
+         University of California at Berkeley, June 1986.\r
+\r
+[RFC741] Cohen, D., "Specifications for the Network Voice Protocol",\r
+         RFC 741, ISI/RR 7539, USC/Information Sciences Institute,\r
+         March 1976.\r
+\r
+[RFC768] Postel, J., "User Datagram Protocol", STD 6, RFC 768,\r
+         USC/Information Sciences Institute, August 1980.\r
+\r
+[RFC791] Postel, J., "Internet Protocol - DARPA Internet Program\r
+         Protocol Specification", STD 5, RFC 791, DARPA, September\r
+         1981.\r
+\r
+[RFC792] Postel, J., "Internet Control Message Protocol - DARPA\r
+         Internet Program Protocol Specification", STD 5, RFC 792,\r
+         USC/Information Sciences Institute, September 1981.\r
+\r
+[RFC793] Postel, J., "Transmission Control Protocol - DARPA\r
+         Internet Program Protocol Specification", STD 7, RFC 793,\r
+         USC/Information Sciences Institute, September 1981.\r
+\r
+[RFC823] Hinden, R., and A. Sheltzer, "The DARPA Internet Gateway",\r
+         RFC 823, BBN, September 1982.\r
+\r
+[RFC869] Hinden, R., "A Host Monitoring Protocol", RFC 869,\r
+         Bolt Beranek and Newman, December 1983.\r
+\r
+[RFC888] Seamonson, L., and E. Rosen, "STUB" Exterior Gateway\r
+         Protocol", RFC 888, BBN Communications Corporation,\r
+         January 1984.\r
+\r
+[RFC905] International Standards Organization, "ISO Transport Protocol\r
+         Specification - ISO DP 8073", RFC 905, April 1984.\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 11]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC908] Velten, D., R. Hinden, and J. Sax, "Reliable Data Protocol",\r
+         RFC 908, BBN Communications Corporation, July 1984.\r
+\r
+[RFC938] Miller, T., "Internet Reliable Transaction Protocol", RFC 938,\r
+         ACC, February 1985.\r
+\r
+[RFC969] Clark, D., M. Lambert, and L. Zhang, "NETBLT: A Bulk Data\r
+         Transfer Protocol", RFC 969, MIT Laboratory for Computer\r
+         Science, December 1985.\r
+\r
+[RFC1112] Deering, S., "Host Extensions for IP Multicasting",\r
+          STD 5, RFC 1112, Stanford University, August 1989.\r
+\r
+[RFC1190] Topolcic, C., Editor, "Experimental Internet Stream\r
+          Protocol, Version 2 (ST-II)", RFC 1190, CIP Working Group,\r
+          October 1990.\r
+\r
+[RFC1241] Woodburn, W., and D. Mills, " A Scheme for an Internet\r
+          Encapsulation Protocol: Version 1", RFC 1241, SAIC,\r
+          University of Delaware, July 1991.\r
+\r
+[RFC1583] Moy, J., "The OSPF Specification", RFC 1583, Proteon,\r
+          March 1994.\r
+\r
+\r
+PEOPLE\r
+\r
+[BCH2] Barry Howard  <Howard@NMFECC.LLNL.GOV>\r
+\r
+[BK29] Brian Kantor  <brian@UCSD.EDU>\r
+\r
+[BN7] <mystery contact>\r
+\r
+[BWB6] Barry Boehm  <boehm@ARPA.MIL>\r
+\r
+[BXH] Brian Horn  <---none--->\r
+\r
+[BXW] Bruce Willins <---none--->\r
+\r
+[DDC1] David Clark  <ddc@LCS.MIT.EDU>\r
+\r
+[DLM1] David Mills  <Mills@HUEY.UDEL.EDU>\r
+\r
+[DRC3] Dave Cheriton  <cheriton@PESCADERO.STANFORD.EDU>\r
+\r
+[DXE1] Deborah Estrin  <estrin@usc.edu>\r
+\r
+[DXF] Dirk Fromhein  <df@watershed.com>\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 12]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[DXM2] David Mittnacht  <---none--->\r
+\r
+[DXP2] Dave Presotto  <presotto@reseach.att.co\r
+\r
+[David Johnson] <mystery contact>\r
+\r
+[GAL5] Guillermo A. Loyola  <LOYOLA@IBM.COM>\r
+\r
+[GLENN]  K. Robert Glenn  <glenn@osi.ncsl.nist.gov>\r
+\r
+[GXC] Greg Chesson  <Greg@SGI.COM>\r
+\r
+[GXS] Guenther Schreiner  <snmp-admin@ira.uka.de>\r
+\r
+[GXT1] Gene Tsudik  <tsudik@USC.EDU>\r
+\r
+[HCF2] Harry Forsdick  <Forsdick@BBN.COM>\r
+\r
+[HWB] Hans-Werner Braun  <HWB@MCR.UMICH.EDU>\r
+\r
+[HXH] Howard Hart  <hch@hybrid.com>\r
+\r
+[JBP]   Jon Postel <postel@isi.edu>\r
+\r
+[JC120] <mystery contact>\r
+\r
+[JFH2] Jack Haverty <jhaverty@ORACLE.COM>\r
+\r
+[JI6] John Ioannidis  <ji@CS.COLUMBIA.EDU>\r
+\r
+[JTM4] John Moy  <jmoy@PROTEON.COM>\r
+\r
+[JWF] Jim Forgie  <FORGIE@XN.LL.MIT.EDU>\r
+\r
+[JXS] Jim Stevens  <Stevens@ISI.EDU>\r
+\r
+[KATZ]  Dave Katz <dkatz@cisco.com>\r
+\r
+[MB] Mike Brescia  <Brescia@CCV.BBN.COM>\r
+\r
+[MBG] Michael Greenwald  <Greenwald@SCRC-STONY-BROOK.SYMBOLICS.COM>\r
+\r
+[ML109] Mike Little  <little@MACOM4.ARPA>\r
+\r
+[MTR] Marshall T. Rose  <mrose@dbc.mtview.ca.us>\r
+\r
+[MXS1] Martha Steenstrup  <MSteenst@BBN.COM>\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 13]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[NC3] J. Noel Chiappa  <JNC@XX.LCS.MIT.EDU>\r
+\r
+[PK] Peter Kirstein <Kirstein@NSS.CS.UCL.AC.UK>\r
+\r
+[PXL1] Paul Liu  <---none--->\r
+\r
+[RH6] Robert Hinden  <Hinden@ENG.SUN.COM>\r
+\r
+[RTB3]  Bob Braden <braden@isi.edu>\r
+\r
+[RC77] <mystery contact>\r
+\r
+[RWS4] Robert W. Scheifler  <RWS@XX.LCS.MIT.EDU>\r
+\r
+[RXB3] Robert Woodburn <woody@cseic.saic.com>\r
+\r
+[RXH1] Russ Housley  <Russ_Housley.McLean_CSD@xerox.com>\r
+\r
+[SAF3] Stuart A. Friedberg  <stuart@CS.WISC.EDU>\r
+\r
+[SC3] Steve Casner  <casner@isi.edu\r
+\r
+[SGC] Steve Chipman  <Chipman@F.BBN.COM>\r
+\r
+[SHB] Steven Blumenthal  <BLUMENTHAL@VAX.BBN.COM>\r
+\r
+[Sue Hares]  Sue Hares <skh@merit.edu>\r
+\r
+[SXA] Susie Armstrong  <Armstrong.wbst128@XEROX.COM>\r
+\r
+[SXD] Steve Deering  <deering@PARC.XEROX.COM>\r
+\r
+[Tony Li] Tony Li  <tli@cisco.com>\r
+\r
+[TXM] Trudy Miller  <Trudy@ACC.COM>\r
+\r
+[VXD] Victor Dafoulas  <---none--->\r
+\r
+[WM3] William Melohn  <Melohn@SUN.COM>\r
+\r
+[WXC] Wesley Craig   <Wesley.Craig@terminator.cc.umich.edu>\r
+\r
+[ZSU] Zaw-Sing Su  <ZSu@TSCA.ISTC.SRI.>\r
+\r
+\r
+[]\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 14]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/protocol-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 15]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+\r
+WELL KNOWN PORT NUMBERS\r
+\r
+The Well Known Ports are controlled and assigned by the IANA and on\r
+most systems can only be used by system (or root) processes or by\r
+programs executed by privileged users.\r
+\r
+Ports are used in the TCP [RFC793] to name the ends of logical\r
+connections which carry long term conversations.  For the purpose of\r
+providing services to unknown callers, a service contact port is\r
+defined.  This list specifies the port used by the server process as\r
+its contact port.  The contact port is sometimes called the\r
+"well-known port".\r
+\r
+To the extent possible, these same port assignments are used with the\r
+UDP [RFC768].\r
+\r
+The assigned ports use a small portion of the possible port numbers.\r
+For many years the assigned ports were in the range 0-255.  Recently,\r
+the range for assigned ports managed by the IANA has been expanded to\r
+the range 0-1023.\r
+\r
+Port Assignments:\r
+\r
+Keyword         Decimal    Description                     References\r
+-------         -------    -----------                     ----------\r
+                  0/tcp    Reserved\r
+                  0/udp    Reserved\r
+#                          Jon Postel <postel@isi.edu>\r
+tcpmux            1/tcp    TCP Port Service Multiplexer\r
+tcpmux            1/udp    TCP Port Service Multiplexer\r
+#                          Mark Lottor <MKL@nisc.sri.com>\r
+compressnet       2/tcp    Management Utility\r
+compressnet       2/udp    Management Utility\r
+compressnet       3/tcp    Compression Process\r
+compressnet       3/udp    Compression Process\r
+#                          Bernie Volz <VOLZ@PROCESS.COM>\r
+#                 4/tcp    Unassigned\r
+#                 4/udp    Unassigned\r
+rje               5/tcp    Remote Job Entry\r
+rje               5/udp    Remote Job Entry\r
+#                          Jon Postel <postel@isi.edu>\r
+#                 6/tcp    Unassigned\r
+#                 6/udp    Unassigned\r
+echo              7/tcp    Echo\r
+echo              7/udp    Echo\r
+#                          Jon Postel <postel@isi.edu>\r
+#                 8/tcp    Unassigned\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 16]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                 8/udp    Unassigned\r
+discard           9/tcp    Discard\r
+discard           9/udp    Discard\r
+#                          Jon Postel <postel@isi.edu>\r
+#                10/tcp    Unassigned\r
+#                10/udp    Unassigned\r
+systat           11/tcp    Active Users\r
+systat           11/udp    Active Users\r
+#                          Jon Postel <postel@isi.edu>\r
+#                12/tcp    Unassigned\r
+#                12/udp    Unassigned\r
+daytime          13/tcp    Daytime\r
+daytime          13/udp    Daytime\r
+#                          Jon Postel <postel@isi.edu>\r
+#                14/tcp    Unassigned\r
+#                14/udp    Unassigned\r
+#                15/tcp    Unassigned [was netstat]\r
+#                15/udp    Unassigned\r
+#                16/tcp    Unassigned\r
+#                16/udp    Unassigned\r
+qotd             17/tcp    Quote of the Day\r
+qotd             17/udp    Quote of the Day\r
+#                          Jon Postel <postel@isi.edu>\r
+msp              18/tcp    Message Send Protocol\r
+msp              18/udp    Message Send Protocol\r
+#                          Rina Nethaniel <---none--->\r
+chargen          19/tcp    Character Generator\r
+chargen          19/udp    Character Generator\r
+ftp-data         20/tcp    File Transfer [Default Data]\r
+ftp-data         20/udp    File Transfer [Default Data]\r
+ftp              21/tcp    File Transfer [Control]\r
+ftp              21/udp    File Transfer [Control]\r
+#                          Jon Postel <postel@isi.edu>\r
+#                22/tcp    Unassigned\r
+#                22/udp    Unassigned\r
+telnet           23/tcp    Telnet\r
+telnet           23/udp    Telnet\r
+#                          Jon Postel <postel@isi.edu>\r
+                 24/tcp    any private mail system\r
+                 24/udp    any private mail system\r
+#                          Rick Adam <rick@UUNET.UU.NET>\r
+smtp             25/tcp    Simple Mail Transfer\r
+smtp             25/udp    Simple Mail Transfer\r
+#                          Jon Postel <postel@isi.edu>\r
+#                26/tcp    Unassigned\r
+#                26/udp    Unassigned\r
+nsw-fe           27/tcp    NSW User System FE\r
+nsw-fe           27/udp    NSW User System FE\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 17]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                          Robert Thomas <BThomas@F.BBN.COM>\r
+#                28/tcp    Unassigned\r
+#                28/udp    Unassigned\r
+msg-icp          29/tcp    MSG ICP\r
+msg-icp          29/udp    MSG ICP\r
+#                          Robert Thomas <BThomas@F.BBN.COM>\r
+#                30/tcp    Unassigned\r
+#                30/udp    Unassigned\r
+msg-auth         31/tcp    MSG Authentication\r
+msg-auth         31/udp    MSG Authentication\r
+#                          Robert Thomas <BThomas@F.BBN.COM>\r
+#                32/tcp    Unassigned\r
+#                32/udp    Unassigned\r
+dsp              33/tcp    Display Support Protocol\r
+dsp              33/udp    Display Support Protocol\r
+#                          Ed Cain <cain@edn-unix.dca.mil>\r
+#                34/tcp    Unassigned\r
+#                34/udp    Unassigned\r
+                 35/tcp    any private printer server\r
+                 35/udp    any private printer server\r
+#                          Jon Postel <postel@isi.edu>\r
+#                36/tcp    Unassigned\r
+#                36/udp    Unassigned\r
+time             37/tcp    Time\r
+time             37/udp    Time\r
+#                          Jon Postel <postel@isi.edu>\r
+rap              38/tcp    Route Access Protocol\r
+rap              38/udp    Route Access Protocol\r
+#                          Robert Ullmann <ariel@world.std.com>\r
+rlp              39/tcp    Resource Location Protocol\r
+rlp              39/udp    Resource Location Protocol\r
+#                          Mike Accetta <MIKE.ACCETTA@CMU-CS-A.EDU>\r
+#                40/tcp    Unassigned\r
+#                40/udp    Unassigned\r
+graphics         41/tcp    Graphics\r
+graphics         41/udp    Graphics\r
+nameserver       42/tcp    Host Name Server\r
+nameserver       42/udp    Host Name Server\r
+nicname          43/tcp    Who Is\r
+nicname          43/udp    Who Is\r
+mpm-flags        44/tcp    MPM FLAGS Protocol\r
+mpm-flags        44/udp    MPM FLAGS Protocol\r
+mpm              45/tcp    Message Processing Module [recv]\r
+mpm              45/udp    Message Processing Module [recv]\r
+mpm-snd          46/tcp    MPM [default send]\r
+mpm-snd          46/udp    MPM [default send]\r
+#                          Jon Postel <postel@isi.edu>\r
+ni-ftp           47/tcp    NI FTP\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 18]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ni-ftp           47/udp    NI FTP\r
+#                          Steve Kille <S.Kille@isode.com>\r
+auditd           48/tcp    Digital Audit Daemon\r
+auditd           48/udp    Digital Audit Daemon\r
+#                          Larry Scott <scott@zk3.dec.com>\r
+login            49/tcp    Login Host Protocol\r
+login            49/udp    Login Host Protocol\r
+#                          Pieter Ditmars <pditmars@BBN.COM>\r
+re-mail-ck       50/tcp    Remote Mail Checking Protocol\r
+re-mail-ck       50/udp    Remote Mail Checking Protocol\r
+#                          Steve Dorner <s-dorner@UIUC.EDU>\r
+la-maint         51/tcp    IMP Logical Address Maintenance\r
+la-maint         51/udp    IMP Logical Address Maintenance\r
+#                          Andy Malis <malis_a@timeplex.com>\r
+xns-time         52/tcp    XNS Time Protocol\r
+xns-time         52/udp    XNS Time Protocol\r
+#                          Susie Armstrong <Armstrong.wbst128@XEROX>\r
+domain           53/tcp    Domain Name Server\r
+domain           53/udp    Domain Name Server\r
+#                          Paul Mockapetris <PVM@ISI.EDU>\r
+xns-ch           54/tcp    XNS Clearinghouse\r
+xns-ch           54/udp    XNS Clearinghouse\r
+#                          Susie Armstrong <Armstrong.wbst128@XEROX>\r
+isi-gl           55/tcp    ISI Graphics Language\r
+isi-gl           55/udp    ISI Graphics Language\r
+xns-auth         56/tcp    XNS Authentication\r
+xns-auth         56/udp    XNS Authentication\r
+#                          Susie Armstrong <Armstrong.wbst128@XEROX>\r
+                 57/tcp    any private terminal access\r
+                 57/udp    any private terminal access\r
+#                          Jon Postel <postel@isi.edu>\r
+xns-mail         58/tcp    XNS Mail\r
+xns-mail         58/udp    XNS Mail\r
+#                          Susie Armstrong <Armstrong.wbst128@XEROX>\r
+                 59/tcp    any private file service\r
+                 59/udp    any private file service\r
+#                          Jon Postel <postel@isi.edu>\r
+                 60/tcp    Unassigned\r
+                 60/udp    Unassigned\r
+ni-mail          61/tcp    NI MAIL\r
+ni-mail          61/udp    NI MAIL\r
+#                          Steve Kille <S.Kille@isode.com>\r
+acas             62/tcp    ACA Services\r
+acas             62/udp    ACA Services\r
+#                          E. Wald <ewald@via.enet.dec.com>\r
+#                63/tcp    Unassigned\r
+#                63/udp    Unassigned\r
+covia            64/tcp    Communications Integrator (CI)\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 19]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+covia            64/udp    Communications Integrator (CI)\r
+#                          "Tundra" Tim Daneliuk\r
+#                          <tundraix!tundra@clout.chi.il.us>\r
+tacacs-ds        65/tcp    TACACS-Database Service\r
+tacacs-ds        65/udp    TACACS-Database Service\r
+#                          Kathy Huber <khuber@bbn.com>\r
+sql*net          66/tcp    Oracle SQL*NET\r
+sql*net          66/udp    Oracle SQL*NET\r
+#                          Jack Haverty <jhaverty@ORACLE.COM>\r
+bootps           67/tcp    Bootstrap Protocol Server\r
+bootps           67/udp    Bootstrap Protocol Server\r
+bootpc           68/tcp    Bootstrap Protocol Client\r
+bootpc           68/udp    Bootstrap Protocol Client\r
+#                          Bill Croft <Croft@SUMEX-AIM.STANFORD.EDU>\r
+tftp             69/tcp    Trivial File Transfer\r
+tftp             69/udp    Trivial File Transfer\r
+#                          David Clark <ddc@LCS.MIT.EDU>\r
+gopher           70/tcp    Gopher\r
+gopher           70/udp    Gopher\r
+#                          Mark McCahill <mpm@boombox.micro.umn.edu>\r
+netrjs-1         71/tcp    Remote Job Service\r
+netrjs-1         71/udp    Remote Job Service\r
+netrjs-2         72/tcp    Remote Job Service\r
+netrjs-2         72/udp    Remote Job Service\r
+netrjs-3         73/tcp    Remote Job Service\r
+netrjs-3         73/udp    Remote Job Service\r
+netrjs-4         74/tcp    Remote Job Service\r
+netrjs-4         74/udp    Remote Job Service\r
+#                          Bob Braden <Braden@ISI.EDU>\r
+                 75/tcp    any private dial out service\r
+                 75/udp    any private dial out service\r
+#                          Jon Postel <postel@isi.edu>\r
+deos             76/tcp    Distributed External Object Store\r
+deos             76/udp    Distributed External Object Store\r
+#                          Robert Ullmann <ariel@world.std.com>\r
+                 77/tcp    any private RJE service\r
+                 77/udp    any private RJE service\r
+#                          Jon Postel <postel@isi.edu>\r
+vettcp           78/tcp    vettcp\r
+vettcp           78/udp    vettcp\r
+#                          Christopher Leong <leong@kolmod.mlo.dec.com>\r
+finger           79/tcp    Finger\r
+finger           79/udp    Finger\r
+#                          David Zimmerman <dpz@RUTGERS.EDU>\r
+www-http         80/tcp    World Wide Web HTTP\r
+www-http         80/udp    World Wide Web HTTP\r
+#                          Tim Berners-Lee <timbl@nxoc01.cern.ch>\r
+hosts2-ns        81/tcp    HOSTS2 Name Server\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 20]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+hosts2-ns        81/udp    HOSTS2 Name Server\r
+#                          Earl Killian <EAK@MORDOR.S1.GOV>\r
+xfer             82/tcp    XFER Utility\r
+xfer             82/udp    XFER Utility\r
+#                          Thomas M. Smith <tmsmith@esc.syr.ge.com>\r
+mit-ml-dev       83/tcp    MIT ML Device\r
+mit-ml-dev       83/udp    MIT ML Device\r
+#                          David Reed <--none--->\r
+ctf              84/tcp    Common Trace Facility\r
+ctf              84/udp    Common Trace Facility\r
+#                          Hugh Thomas <thomas@oils.enet.dec.com>\r
+mit-ml-dev       85/tcp    MIT ML Device\r
+mit-ml-dev       85/udp    MIT ML Device\r
+#                          David Reed <--none--->\r
+mfcobol          86/tcp    Micro Focus Cobol\r
+mfcobol          86/udp    Micro Focus Cobol\r
+#                          Simon Edwards <--none--->\r
+                 87/tcp    any private terminal link\r
+                 87/udp    any private terminal link\r
+#                          Jon Postel <postel@isi.edu>\r
+kerberos         88/tcp    Kerberos\r
+kerberos         88/udp    Kerberos\r
+#                          B. Clifford Neuman <bcn@isi.edu>\r
+su-mit-tg        89/tcp    SU/MIT Telnet Gateway\r
+su-mit-tg        89/udp    SU/MIT Telnet Gateway\r
+#                          Mark Crispin <MRC@PANDA.COM>\r
+dnsix            90/tcp    DNSIX Securit Attribute Token Map\r
+dnsix            90/udp    DNSIX Securit Attribute Token Map\r
+#                          Charles Watt <watt@sware.com>\r
+mit-dov          91/tcp    MIT Dover Spooler\r
+mit-dov          91/udp    MIT Dover Spooler\r
+#                          Eliot Moss <EBM@XX.LCS.MIT.EDU>\r
+npp              92/tcp    Network Printing Protocol\r
+npp              92/udp    Network Printing Protocol\r
+#                          Louis Mamakos <louie@sayshell.umd.edu>\r
+dcp              93/tcp    Device Control Protocol\r
+dcp              93/udp    Device Control Protocol\r
+#                          Daniel Tappan <Tappan@BBN.COM>\r
+objcall          94/tcp    Tivoli Object Dispatcher\r
+objcall          94/udp    Tivoli Object Dispatcher\r
+#                          Tom Bereiter <--none--->\r
+supdup           95/tcp    SUPDUP\r
+supdup           95/udp    SUPDUP\r
+#                          Mark Crispin <MRC@PANDA.COM>\r
+dixie            96/tcp    DIXIE Protocol Specification\r
+dixie            96/udp    DIXIE Protocol Specification\r
+#                Tim Howes <Tim.Howes@terminator.cc.umich.edu>\r
+swift-rvf        97/tcp    Swift Remote Vitural File Protocol\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 21]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+swift-rvf        97/udp    Swift Remote Vitural File Protocol\r
+#                          Maurice R. Turcotte\r
+#                <mailrus!uflorida!rm1!dnmrt%rmatl@uunet.UU.NET>\r
+tacnews          98/tcp    TAC News\r
+tacnews          98/udp    TAC News\r
+#                          Jon Postel <postel@isi.edu>\r
+metagram         99/tcp    Metagram Relay\r
+metagram         99/udp    Metagram Relay\r
+#                          Geoff Goodfellow <Geoff@FERNWOOD.MPK.CA.U>\r
+newacct         100/tcp    [unauthorized use]\r
+hostname        101/tcp    NIC Host Name Server\r
+hostname        101/udp    NIC Host Name Server\r
+#                          Jon Postel <postel@isi.edu>\r
+iso-tsap        102/tcp    ISO-TSAP\r
+iso-tsap        102/udp    ISO-TSAP\r
+#                          Marshall Rose <mrose@dbc.mtview.ca.us>\r
+gppitnp         103/tcp    Genesis Point-to-Point Trans Net\r
+gppitnp         103/udp    Genesis Point-to-Point Trans Net\r
+acr-nema        104/tcp    ACR-NEMA Digital Imag. & Comm. 300\r
+acr-nema        104/udp    ACR-NEMA Digital Imag. & Comm. 300\r
+#                          Patrick McNamee <--none--->\r
+csnet-ns        105/tcp    Mailbox Name Nameserver\r
+csnet-ns        105/udp    Mailbox Name Nameserver\r
+#                          Marvin Solomon <solomon@CS.WISC.EDU>\r
+3com-tsmux      106/tcp    3COM-TSMUX\r
+3com-tsmux      106/udp    3COM-TSMUX\r
+#                          Jeremy Siegel <jzs@NSD.3Com.COM>\r
+rtelnet         107/tcp    Remote Telnet Service\r
+rtelnet         107/udp    Remote Telnet Service\r
+#                          Jon Postel <postel@isi.edu>\r
+snagas          108/tcp    SNA Gateway Access Server\r
+snagas          108/udp    SNA Gateway Access Server\r
+#                          Kevin Murphy <murphy@sevens.lkg.dec.com>\r
+pop2            109/tcp    Post Office Protocol - Version 2\r
+pop2            109/udp    Post Office Protocol - Version 2\r
+#                          Joyce K. Reynolds <jkrey@isi.edu>\r
+pop3            110/tcp    Post Office Protocol - Version 3\r
+pop3            110/udp    Post Office Protocol - Version 3\r
+#                          Marshall Rose <mrose@dbc.mtview.ca.us>\r
+sunrpc          111/tcp    SUN Remote Procedure Call\r
+sunrpc          111/udp    SUN Remote Procedure Call\r
+#                          Chuck McManis <cmcmanis@sun.com>\r
+mcidas          112/tcp    McIDAS Data Transmission Protocol\r
+mcidas          112/udp    McIDAS Data Transmission Protocol\r
+#                          Glenn Davis <davis@unidata.ucar.edu>\r
+auth            113/tcp    Authentication Service\r
+auth            113/udp    Authentication Service\r
+#                          Mike St. Johns <stjohns@arpa.mil>\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 22]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+audionews       114/tcp    Audio News Multicast\r
+audionews       114/udp    Audio News Multicast\r
+#                          Martin Forssen <maf@dtek.chalmers.se>\r
+sftp            115/tcp    Simple File Transfer Protocol\r
+sftp            115/udp    Simple File Transfer Protocol\r
+#                          Mark Lottor <MKL@nisc.sri.com>\r
+ansanotify      116/tcp    ANSA REX Notify\r
+ansanotify      116/udp    ANSA REX Notify\r
+#                          Nicola J. Howarth <njh@ansa.co.uk>\r
+uucp-path       117/tcp    UUCP Path Service\r
+uucp-path       117/udp    UUCP Path Service\r
+sqlserv         118/tcp    SQL Services\r
+sqlserv         118/udp    SQL Services\r
+#                          Larry Barnes <barnes@broke.enet.dec.com>\r
+nntp            119/tcp    Network News Transfer Protocol\r
+nntp            119/udp    Network News Transfer Protocol\r
+#                          Phil Lapsley <phil@UCBARPA.BERKELEY.EDU>\r
+cfdptkt         120/tcp    CFDPTKT\r
+cfdptkt         120/udp    CFDPTKT\r
+#                          John Ioannidis <ji@close.cs.columbia.ed>\r
+erpc            121/tcp    Encore Expedited Remote Pro.Call\r
+erpc            121/udp    Encore Expedited Remote Pro.Call\r
+#                          Jack O'Neil <---none--->\r
+smakynet        122/tcp    SMAKYNET\r
+smakynet        122/udp    SMAKYNET\r
+#                          Mike O'Dowd <odowd@ltisun8.epfl.ch>\r
+ntp             123/tcp    Network Time Protocol\r
+ntp             123/udp    Network Time Protocol\r
+#                          Dave Mills <Mills@HUEY.UDEL.EDU>\r
+ansatrader      124/tcp    ANSA REX Trader\r
+ansatrader      124/udp    ANSA REX Trader\r
+#                          Nicola J. Howarth <njh@ansa.co.uk>\r
+locus-map       125/tcp    Locus PC-Interface Net Map Ser\r
+locus-map       125/udp    Locus PC-Interface Net Map Ser\r
+#                          Eric Peterson <lcc.eric@SEAS.UCLA.EDU>\r
+unitary         126/tcp    Unisys Unitary Login\r
+unitary         126/udp    Unisys Unitary Login\r
+#                          <feil@kronos.nisd.cam.unisys.com>\r
+locus-con       127/tcp    Locus PC-Interface Conn Server\r
+locus-con       127/udp    Locus PC-Interface Conn Server\r
+#                          Eric Peterson <lcc.eric@SEAS.UCLA.EDU>\r
+gss-xlicen      128/tcp    GSS X License Verification\r
+gss-xlicen      128/udp    GSS X License Verification\r
+#                          John Light <johnl@gssc.gss.com>\r
+pwdgen          129/tcp    Password Generator Protocol\r
+pwdgen          129/udp    Password Generator Protocol\r
+#               Frank J. Wacho <WANCHO@WSMR-SIMTEL20.ARMY.MIL>\r
+cisco-fna       130/tcp    cisco FNATIVE\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 23]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+cisco-fna       130/udp    cisco FNATIVE\r
+cisco-tna       131/tcp    cisco TNATIVE\r
+cisco-tna       131/udp    cisco TNATIVE\r
+cisco-sys       132/tcp    cisco SYSMAINT\r
+cisco-sys       132/udp    cisco SYSMAINT\r
+statsrv         133/tcp    Statistics Service\r
+statsrv         133/udp    Statistics Service\r
+#                          Dave Mills <Mills@HUEY.UDEL.EDU>\r
+ingres-net      134/tcp    INGRES-NET Service\r
+ingres-net      134/udp    INGRES-NET Service\r
+#                          Mike Berrow <---none--->\r
+loc-srv         135/tcp    Location Service\r
+loc-srv         135/udp    Location Service\r
+#                          Joe Pato <apollo!pato@EDDIE.MIT.EDU>\r
+profile         136/tcp    PROFILE Naming System\r
+profile         136/udp    PROFILE Naming System\r
+#                          Larry Peterson <llp@ARIZONA.EDU>\r
+netbios-ns      137/tcp    NETBIOS Name Service\r
+netbios-ns      137/udp    NETBIOS Name Service\r
+netbios-dgm     138/tcp    NETBIOS Datagram Service\r
+netbios-dgm     138/udp    NETBIOS Datagram Service\r
+netbios-ssn     139/tcp    NETBIOS Session Service\r
+netbios-ssn     139/udp    NETBIOS Session Service\r
+#                          Jon Postel <postel@isi.edu>\r
+emfis-data      140/tcp    EMFIS Data Service\r
+emfis-data      140/udp    EMFIS Data Service\r
+emfis-cntl      141/tcp    EMFIS Control Service\r
+emfis-cntl      141/udp    EMFIS Control Service\r
+#                          Gerd Beling <GBELING@ISI.EDU>\r
+bl-idm          142/tcp    Britton-Lee IDM\r
+bl-idm          142/udp    Britton-Lee IDM\r
+#                          Susie Snitzer <---none--->\r
+imap2           143/tcp    Interim Mail Access Protocol v2\r
+imap2           143/udp    Interim Mail Access Protocol v2\r
+#                          Mark Crispin <MRC@PANDA.COM>\r
+news            144/tcp    NewS\r
+news            144/udp    NewS\r
+#                          James Gosling <JAG@SUN.COM>\r
+uaac            145/tcp    UAAC Protocol\r
+uaac            145/udp    UAAC Protocol\r
+#               David A. Gomberg <gomberg@GATEWAY.MITRE.ORG>\r
+iso-tp0         146/tcp    ISO-IP0\r
+iso-tp0         146/udp    ISO-IP0\r
+iso-ip          147/tcp    ISO-IP\r
+iso-ip          147/udp    ISO-IP\r
+#                          Marshall Rose <mrose@dbc.mtview.ca.us>\r
+cronus          148/tcp    CRONUS-SUPPORT\r
+cronus          148/udp    CRONUS-SUPPORT\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 24]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                          Jeffrey Buffun <jbuffum@APOLLO.COM>\r
+aed-512         149/tcp    AED 512 Emulation Service\r
+aed-512         149/udp    AED 512 Emulation Service\r
+#               Albert G. Broscius <broscius@DSL.CIS.UPENN.EDU>\r
+sql-net         150/tcp    SQL-NET\r
+sql-net         150/udp    SQL-NET\r
+#                          Martin Picard <<---none--->\r
+hems            151/tcp    HEMS\r
+hems            151/udp    HEMS\r
+#                          Christopher Tengi <tengi@Princeton.EDU>\r
+bftp            152/tcp    Background File Transfer Program\r
+bftp            152/udp    Background File Transfer Program\r
+#                          Annette DeSchon <DESCHON@ISI.EDU>\r
+sgmp            153/tcp    SGMP\r
+sgmp            153/udp    SGMP\r
+#                          Marty Schoffstahl <schoff@NISC.NYSER.NET>\r
+netsc-prod      154/tcp    NETSC\r
+netsc-prod      154/udp    NETSC\r
+netsc-dev       155/tcp    NETSC\r
+netsc-dev       155/udp    NETSC\r
+#                          Sergio Heker <heker@JVNCC.CSC.ORG>\r
+sqlsrv          156/tcp    SQL Service\r
+sqlsrv          156/udp    SQL Service\r
+#                          Craig Rogers <Rogers@ISI.EDU>\r
+knet-cmp        157/tcp    KNET/VM Command/Message Protocol\r
+knet-cmp        157/udp    KNET/VM Command/Message Protocol\r
+#                          Gary S. Malkin <GMALKIN@XYLOGICS.COM>\r
+pcmail-srv      158/tcp    PCMail Server\r
+pcmail-srv      158/udp    PCMail Server\r
+#                          Mark L. Lambert <markl@PTT.LCS.MIT.EDU>\r
+nss-routing     159/tcp    NSS-Routing\r
+nss-routing     159/udp    NSS-Routing\r
+#                          Yakov Rekhter <Yakov@IBM.COM>\r
+sgmp-traps      160/tcp    SGMP-TRAPS\r
+sgmp-traps      160/udp    SGMP-TRAPS\r
+#                          Marty Schoffstahl <schoff@NISC.NYSER.NET>\r
+snmp            161/tcp    SNMP\r
+snmp            161/udp    SNMP\r
+snmptrap        162/tcp    SNMPTRAP\r
+snmptrap        162/udp    SNMPTRAP\r
+#                          Marshall Rose <mrose@dbc.mtview.ca.us>\r
+cmip-man        163/tcp    CMIP/TCP Manager\r
+cmip-man        163/udp    CMIP/TCP Manager\r
+cmip-agent      164/tcp    CMIP/TCP Agent\r
+smip-agent      164/udp    CMIP/TCP Agent\r
+#                          Amatzia Ben-Artzi <---none--->\r
+xns-courier     165/tcp    Xerox\r
+xns-courier     165/udp    Xerox\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 25]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                          Susie Armstrong <Armstrong.wbst128@XEROX.COM>\r
+s-net           166/tcp    Sirius Systems\r
+s-net           166/udp    Sirius Systems\r
+#                          Brian Lloyd <---none--->\r
+namp            167/tcp    NAMP\r
+namp            167/udp    NAMP\r
+#                          Marty Schoffstahl <schoff@NISC.NYSER.NET>\r
+rsvd            168/tcp    RSVD\r
+rsvd            168/udp    RSVD\r
+#                          Neil Todd <mcvax!ist.co.uk!neil@UUNET.UU.NET>\r
+send            169/tcp    SEND\r
+send            169/udp    SEND\r
+#               William D. Wisner <wisner@HAYES.FAI.ALASKA.EDU>\r
+print-srv       170/tcp    Network PostScript\r
+print-srv       170/udp    Network PostScript\r
+#                          Brian Reid <reid@DECWRL.DEC.COM>\r
+multiplex       171/tcp    Network Innovations Multiplex\r
+multiplex       171/udp    Network Innovations Multiplex\r
+cl/1            172/tcp    Network Innovations CL/1\r
+cl/1            172/udp    Network Innovations CL/1\r
+#                          Kevin DeVault <<---none--->\r
+xyplex-mux      173/tcp    Xyplex\r
+xyplex-mux      173/udp    Xyplex\r
+#                          Bob Stewart <STEWART@XYPLEX.COM>\r
+mailq           174/tcp    MAILQ\r
+mailq           174/udp    MAILQ\r
+#                          Rayan Zachariassen <rayan@AI.TORONTO.EDU>\r
+vmnet           175/tcp    VMNET\r
+vmnet           175/udp    VMNET\r
+#                          Christopher Tengi <tengi@Princeton.EDU>\r
+genrad-mux      176/tcp    GENRAD-MUX\r
+genrad-mux      176/udp    GENRAD-MUX\r
+#                          Ron Thornton <thornton@qm7501.genrad.com>\r
+xdmcp           177/tcp    X Display Manager Control Protocol\r
+xdmcp           177/udp    X Display Manager Control Protocol\r
+#                          Robert W. Scheifler <RWS@XX.LCS.MIT.EDU>\r
+nextstep        178/tcp    NextStep Window Server\r
+NextStep        178/udp    NextStep Window Server\r
+#                          Leo Hourvitz <leo@NEXT.COM>\r
+bgp             179/tcp    Border Gateway Protocol\r
+bgp             179/udp    Border Gateway Protocol\r
+#                          Kirk Lougheed <LOUGHEED@MATHOM.CISCO.COM>\r
+ris             180/tcp    Intergraph\r
+ris             180/udp    Intergraph\r
+#                          Dave Buehmann <ingr!daveb@UUNET.UU.NET>\r
+unify           181/tcp    Unify\r
+unify           181/udp    Unify\r
+#                          Vinod Singh <--none--->\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 26]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+audit           182/tcp    Unisys Audit SITP\r
+audit           182/udp    Unisys Audit SITP\r
+#                          Gil Greenbaum <gcole@nisd.cam.unisys.com>\r
+ocbinder        183/tcp    OCBinder\r
+ocbinder        183/udp    OCBinder\r
+ocserver        184/tcp    OCServer\r
+ocserver        184/udp    OCServer\r
+#                          Jerrilynn Okamura <--none--->\r
+remote-kis      185/tcp    Remote-KIS\r
+remote-kis      185/udp    Remote-KIS\r
+kis             186/tcp    KIS Protocol\r
+kis             186/udp    KIS Protocol\r
+#                          Ralph Droms <rdroms@NRI.RESTON.VA.US>\r
+aci             187/tcp    Application Communication Interface\r
+aci             187/udp    Application Communication Interface\r
+#                          Rick Carlos <rick.ticipa.csc.ti.com>\r
+mumps           188/tcp    Plus Five's MUMPS\r
+mumps           188/udp    Plus Five's MUMPS\r
+#                          Hokey Stenn <hokey@PLUS5.COM>\r
+qft             189/tcp    Queued File Transport\r
+qft             189/udp    Queued File Transport\r
+#                          Wayne Schroeder <schroeder@SDS.SDSC.EDU>\r
+gacp            190/tcp    Gateway Access Control Protocol\r
+cacp            190/udp    Gateway Access Control Protocol\r
+#                          C. Philip Wood <cpw@LANL.GOV>\r
+prospero        191/tcp    Prospero Directory Service\r
+prospero        191/udp    Prospero Directory Service\r
+#                          B. Clifford Neuman <bcn@isi.edu>\r
+osu-nms         192/tcp    OSU Network Monitoring System\r
+osu-nms         192/udp    OSU Network Monitoring System\r
+#               Doug Karl <KARL-D@OSU-20.IRCC.OHIO-STATE.EDU>\r
+srmp            193/tcp    Spider Remote Monitoring Protocol\r
+srmp            193/udp    Spider Remote Monitoring Protocol\r
+#                          Ted J. Socolofsky <Teds@SPIDER.CO.UK>\r
+irc             194/tcp    Internet Relay Chat Protocol\r
+irc             194/udp    Internet Relay Chat Protocol\r
+#                          Jarkko Oikarinen <jto@TOLSUN.OULU.FI>\r
+dn6-nlm-aud     195/tcp    DNSIX Network Level Module Audit\r
+dn6-nlm-aud     195/udp    DNSIX Network Level Module Audit\r
+dn6-smm-red     196/tcp    DNSIX Session Mgt Module Audit Redir\r
+dn6-smm-red     196/udp    DNSIX Session Mgt Module Audit Redir\r
+#                          Lawrence Lebahn <DIA3@PAXRV-NES.NAVY.MIL>\r
+dls             197/tcp    Directory Location Service\r
+dls             197/udp    Directory Location Service\r
+dls-mon         198/tcp    Directory Location Service Monitor\r
+dls-mon         198/udp    Directory Location Service Monitor\r
+#                          Scott Bellew <smb@cs.purdue.edu>\r
+smux            199/tcp    SMUX\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 27]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+smux            199/udp    SMUX\r
+#                          Marshall Rose <mrose@dbc.mtview.ca.us>\r
+src             200/tcp    IBM System Resource Controller\r
+src             200/udp    IBM System Resource Controller\r
+#                          Gerald McBrearty <---none--->\r
+at-rtmp         201/tcp    AppleTalk Routing Maintenance\r
+at-rtmp         201/udp    AppleTalk Routing Maintenance\r
+at-nbp          202/tcp    AppleTalk Name Binding\r
+at-nbp          202/udp    AppleTalk Name Binding\r
+at-3            203/tcp    AppleTalk Unused\r
+at-3            203/udp    AppleTalk Unused\r
+at-echo         204/tcp    AppleTalk Echo\r
+at-echo         204/udp    AppleTalk Echo\r
+at-5            205/tcp    AppleTalk Unused\r
+at-5            205/udp    AppleTalk Unused\r
+at-zis          206/tcp    AppleTalk Zone Information\r
+at-zis          206/udp    AppleTalk Zone Information\r
+at-7            207/tcp    AppleTalk Unused\r
+at-7            207/udp    AppleTalk Unused\r
+at-8            208/tcp    AppleTalk Unused\r
+at-8            208/udp    AppleTalk Unused\r
+#                          Rob Chandhok <chandhok@gnome.cs.cmu.edu>\r
+tam             209/tcp    Trivial Authenticated Mail Protocol\r
+tam             209/udp    Trivial Authenticated Mail Protocol\r
+#                          Dan Bernstein <brnstnd@stealth.acf.nyu.edu>\r
+z39.50          210/tcp    ANSI Z39.50\r
+z39.50          210/udp    ANSI Z39.50\r
+#                          Mark Needleman\r
+#                         <mhnur%uccmvsa.bitnet@cornell.cit.cornell.edu>\r
+914c/g          211/tcp    Texas Instruments 914C/G Terminal\r
+914c/g          211/udp    Texas Instruments 914C/G Terminal\r
+#                          Bill Harrell <---none--->\r
+anet            212/tcp    ATEXSSTR\r
+anet            212/udp    ATEXSSTR\r
+#                          Jim Taylor <taylor@heart.epps.kodak.com>\r
+ipx             213/tcp    IPX\r
+ipx             213/udp    IPX\r
+#                          Don Provan <donp@xlnvax.novell.com>\r
+vmpwscs         214/tcp    VM PWSCS\r
+vmpwscs         214/udp    VM PWSCS\r
+#                          Dan Shia <dset!shia@uunet.UU.NET>\r
+softpc          215/tcp    Insignia Solutions\r
+softpc          215/udp    Insignia Solutions\r
+#                          Martyn Thomas <---none--->\r
+atls            216/tcp    Access Technology License Server\r
+atls            216/udp    Access Technology License Server\r
+#                          Larry DeLuca <henrik@EDDIE.MIT.EDU>\r
+dbase           217/tcp    dBASE Unix\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 28]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+dbase           217/udp    dBASE Unix\r
+#                          Don Gibson\r
+#            <sequent!aero!twinsun!ashtate.A-T.COM!dong@uunet.UU.NET>\r
+mpp             218/tcp    Netix Message Posting Protocol\r
+mpp             218/udp    Netix Message Posting Protocol\r
+#                          Shannon Yeh <yeh@netix.com>\r
+uarps           219/tcp    Unisys ARPs\r
+uarps           219/udp    Unisys ARPs\r
+#                          Ashok Marwaha <---none--->\r
+imap3           220/tcp    Interactive Mail Access Protocol v3\r
+imap3           220/udp    Interactive Mail Access Protocol v3\r
+#                          James Rice <RICE@SUMEX-AIM.STANFORD.EDU>\r
+fln-spx         221/tcp    Berkeley rlogind with SPX auth\r
+fln-spx         221/udp    Berkeley rlogind with SPX auth\r
+rsh-spx         222/tcp    Berkeley rshd with SPX auth\r
+rsh-spx         222/udp    Berkeley rshd with SPX auth\r
+cdc             223/tcp    Certificate Distribution Center\r
+cdc             223/udp    Certificate Distribution Center\r
+#               Kannan Alagappan <kannan@sejour.enet.dec.com>\r
+#               224-241    Reserved\r
+#                          Jon Postel <postel@isi.edu>\r
+#               242/tcp    Unassigned\r
+#               242/udp    Unassigned\r
+sur-meas        243/tcp    Survey Measurement\r
+sur-meas        243/udp    Survey Measurement\r
+#                          Dave Clark <ddc@LCS.MIT.EDU>\r
+#               244/tcp    Unassigned\r
+#               244/udp    Unassigned\r
+link            245/tcp    LINK\r
+link            245/udp    LINK\r
+dsp3270         246/tcp    Display Systems Protocol\r
+dsp3270         246/udp    Display Systems Protocol\r
+#                          Weldon J. Showalter <Gamma@MINTAKA.DCA.MIL>\r
+#               247-255    Reserved\r
+#                          Jon Postel <postel@isi.edu>\r
+#               256-343    Unassigned\r
+pdap            344/tcp    Prospero Data Access Protocol\r
+pdap            344/udp    Prospero Data Access Protocol\r
+#                          B. Clifford Neuman <bcn@isi.edu>\r
+pawserv         345/tcp    Perf Analysis Workbench\r
+pawserv         345/udp    Perf Analysis Workbench\r
+zserv           346/tcp    Zebra server\r
+zserv           346/udp    Zebra server\r
+fatserv         347/tcp    Fatmen Server\r
+fatserv         347/udp    Fatmen Server\r
+csi-sgwp        348/tcp    Cabletron Management Protocol\r
+csi-sgwp        348/udp    Cabletron Management Protocol\r
+#               349-370    Unassigned\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 29]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+clearcase       371/tcp    Clearcase\r
+clearcase       371/udp    Clearcase\r
+#                          Dave LeBlang <leglang@atria.com>\r
+ulistserv       372/tcp    Unix Listserv\r
+ulistserv       372/udp    Unix Listserv\r
+#                          Anastasios Kotsikonas <tasos@cs.bu.edu>\r
+legent-1        373/tcp    Legent Corporation\r
+legent-1        373/udp    Legent Corporation\r
+legent-2        374/tcp    Legent Corporation\r
+legent-2        374/udp    Legent Corporation\r
+#                          Keith Boyce <---none--->\r
+hassle          375/tcp    Hassle\r
+hassle          375/udp    Hassle\r
+#                          Reinhard Doelz <doelz@comp.bioz.unibas.ch>\r
+nip             376/tcp    Amiga Envoy Network Inquiry Proto\r
+nip             376/udp    Amiga Envoy Network Inquiry Proto\r
+#                          Kenneth Dyke <kcd@cbmvax.cbm.commodore.com>\r
+tnETOS          377/tcp    NEC Corporation\r
+tnETOS          377/udp    NEC Corporation\r
+dsETOS          378/tcp    NEC Corporation\r
+dsETOS          378/udp    NEC Corporation\r
+#                          Tomoo Fujita <tf@arc.bs1.fc.nec.co.jp>\r
+is99c           379/tcp    TIA/EIA/IS-99 modem client\r
+is99c           379/udp    TIA/EIA/IS-99 modem client\r
+is99s           380/tcp    TIA/EIA/IS-99 modem server\r
+is99s           380/udp    TIA/EIA/IS-99 modem server\r
+#                          Frank Quick <fquick@qualcomm.com>\r
+hp-collector    381/tcp    hp performance data collector\r
+hp-collector    381/udp    hp performance data collector\r
+hp-managed-node 382/tcp    hp performance data managed node\r
+hp-managed-node 382/udp    hp performance data managed node\r
+hp-alarm-mgr    383/tcp    hp performance data alarm manager\r
+hp-alarm-mgr    383/udp    hp performance data alarm manager\r
+#                          Frank Blakely <frankb@hpptc16.rose.hp.com>\r
+arns            384/tcp    A Remote Network Server System\r
+arns            384/udp    A Remote Network Server System\r
+#                          David Hornsby <djh@munnari.OZ.AU>\r
+ibm-app         385/tcp    IBM Application\r
+ibm-app         385/tcp    IBM Application\r
+#                          Lisa Tomita <---none--->\r
+asa             386/tcp    ASA Message Router Object Def.\r
+asa             386/udp    ASA Message Router Object Def.\r
+#                          Steve Laitinen <laitinen@brutus.aa.ab.com>\r
+aurp            387/tcp    Appletalk Update-Based Routing Pro.\r
+aurp            387/udp    Appletalk Update-Based Routing Pro.\r
+#                          Chris Ranch <cranch@novell.com>\r
+unidata-ldm     388/tcp    Unidata LDM Version 4\r
+unidata-ldm     388/udp    Unidata LDM Version 4\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 30]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                          Glenn Davis <davis@unidata.ucar.edu>\r
+ldap            389/tcp    Lightweight Directory Access Protocol\r
+ldap            389/udp    Lightweight Directory Access Protocol\r
+#                          Tim Howes <Tim.Howes@terminator.cc.umich.edu>\r
+uis             390/tcp    UIS\r
+uis             390/udp    UIS\r
+#                          Ed Barron <---none--->\r
+synotics-relay  391/tcp    SynOptics SNMP Relay Port\r
+synotics-relay  391/udp    SynOptics SNMP Relay Port\r
+synotics-broker 392/tcp    SynOptics Port Broker Port\r
+synotics-broker 392/udp    SynOptics Port Broker Port\r
+#                          Illan Raab <iraab@synoptics.com>\r
+dis             393/tcp    Data Interpretation System\r
+dis             393/udp    Data Interpretation System\r
+#                          Paul Stevens <pstevens@chinacat.Metaphor.COM>\r
+embl-ndt        394/tcp    EMBL Nucleic Data Transfer\r
+embl-ndt        394/udp    EMBL Nucleic Data Transfer\r
+#                          Peter Gad <peter@bmc.uu.se>\r
+netcp           395/tcp    NETscout Control Protocol\r
+netcp           395/udp    NETscout Control Protocol\r
+#                          Anil Singhal <---none--->\r
+netware-ip      396/tcp    Novell Netware over IP\r
+netware-ip      396/udp    Novell Netware over IP\r
+mptn            397/tcp    Multi Protocol Trans. Net.\r
+mptn            397/udp    Multi Protocol Trans. Net.\r
+#                          Soumitra Sarkar <sarkar@vnet.ibm.com>\r
+kryptolan       398/tcp    Kryptolan\r
+kryptolan       398/udp    Kryptolan\r
+#                          Peter de Laval <pdl@sectra.se>\r
+#               399/tcp    Unassigned\r
+#               399/udp    Unassigned\r
+work-sol        400/tcp    Workstation Solutions\r
+work-sol        400/udp    Workstation Solutions\r
+#                          Jim Ward <jimw@worksta.com>\r
+ups             401/tcp    Uninterruptible Power Supply\r
+ups             401/udp    Uninterruptible Power Supply\r
+#                          Guenther Seybold <gs@hrz.th-darmstadt.de>\r
+genie           402/tcp    Genie Protocol\r
+genie           402/udp    Genie Protocol\r
+#                          Mark Hankin <---none--->\r
+decap           403/tcp    decap\r
+decap           403/udp    decap\r
+nced            404/tcp    nced\r
+nced            404/udp    nced\r
+ncld            405/tcp    ncld\r
+ncld            405/udp    ncld\r
+#                          Richard Jones <---none--->\r
+imsp            406/tcp    Interactive Mail Support Protocol\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 31]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+imsp            406/udp    Interactive Mail Support Protocol\r
+#                          John Myers <jgm+@cmu.edu>\r
+timbuktu        407/tcp    Timbuktu\r
+timbuktu        407/udp    Timbuktu\r
+#                          Marc Epard <marc@waygate.farallon.com>\r
+prm-sm          408/tcp    Prospero Resource Manager Sys. Man.\r
+prm-sm          408/udp    Prospero Resource Manager Sys. Man.\r
+prm-nm          409/tcp    Prospero Resource Manager Node Man.\r
+prm-nm          409/udp    Prospero Resource Manager Node Man.\r
+#                          B. Clifford Neuman <bcn@isi.edu>\r
+decladebug      410/tcp    DECLadebug Remote Debug Protocol\r
+decladebug      410/udp    DECLadebug Remote Debug Protocol\r
+#                          Anthony Berent <berent@rdgeng.enet.dec.com>\r
+rmt             411/tcp    Remote MT Protocol\r
+rmt             411/udp    Remote MT Protocol\r
+#                          Peter Eriksson <pen@lysator.liu.se>\r
+synoptics-trap  412/tcp    Trap Convention Port\r
+synoptics-trap  412/udp    Trap Convention Port\r
+#                          Illan Raab <iraab@synoptics.com>\r
+smsp            413/tcp    SMSP\r
+smsp            413/udp    SMSP\r
+infoseek        414/tcp    InfoSeek\r
+infoseek        414/udp    InfoSeek\r
+#                          Steve Kirsch <stk@frame.com>\r
+bnet            415/tcp    BNet\r
+bnet            415/udp    BNet\r
+#                          Jim Mertz <JMertz+RV09@rvdc.unisys.com>\r
+silverplatter   416/tcp    Silverplatter\r
+silverplatter   416/udp    Silverplatter\r
+#                          Peter Ciuffetti <petec@silverplatter.com>\r
+onmux           417/tcp    Onmux\r
+onmux           417/udp    Onmux\r
+#                          Stephen Hanna <hanna@world.std.com>\r
+hyper-g         418/tcp    Hyper-G\r
+hyper-g         418/udp    Hyper-G\r
+#                          Frank Kappe <fkappe@iicm.tu-graz.ac.at>\r
+ariel1          419/tcp    Ariel\r
+ariel1          419/udp    Ariel\r
+#                          Jonathan Lavigne <BL.JPL@RLG.Stanford.EDU>\r
+smpte           420/tcp    SMPTE\r
+smpte           420/udp    SMPTE\r
+#                          Si Becker <71362.22@CompuServe.COM>\r
+ariel2          421/tcp    Ariel\r
+ariel2          421/udp    Ariel\r
+ariel3          422/tcp    Ariel\r
+ariel3          422/udp    Ariel\r
+#                          Jonathan Lavigne  <BL.JPL@RLG.Stanford.EDU>\r
+opc-job-start   423/tcp    IBM Operations Planning and Control Start\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 32]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+opc-job-start   423/udp    IBM Operations Planning and Control Start\r
+opc-job-track   424/tcp    IBM Operations Planning and Control Track\r
+opc-job-track   424/udp    IBM Operations Planning and Control Track\r
+#                          Conny Larsson  <cocke@VNET.IBM.COM>\r
+icad-el         425/tcp    ICAD\r
+icad-el         425/udp    ICAD\r
+#                          Larry Stone  <lcs@icad.com>\r
+smartsdp        426/tcp    smartsdp\r
+smartsdp        426/udp    smartsdp\r
+#                          Alexander Dupuy <dupuy@smarts.com>\r
+svrloc          427/tcp    Server Location\r
+svrloc          427/udp    Server Location\r
+#                          <veizades@ftp.com>\r
+ocs_cmu         428/tcp    OCS_CMU\r
+ocs_cmu         428/udp    OCS_CMU\r
+ocs_amu         429/tcp    OCS_AMU\r
+ocs_amu         429/udp    OCS_AMU\r
+#                          Florence Wyman <wyman@peabody.plk.af.mil>\r
+utmpsd          430/tcp    UTMPSD\r
+utmpsd          430/udp    UTMPSD\r
+utmpcd          431/tcp    UTMPCD\r
+utmpcd          431/udp    UTMPCD\r
+iasd            432/tcp    IASD\r
+iasd            432/udp    IASD\r
+#                          Nir Baroz <nbaroz@encore.com>\r
+nnsp            433/tcp    NNSP\r
+nnsp            433/udp    NNSP\r
+#                          Rob Robertson <rob@gangrene.berkeley.edu>\r
+mobileip-agent  434/tcp    MobileIP-Agent\r
+mobileip-agent  434/udp    MobileIP-Agent\r
+mobilip-mn      435/tcp    MobilIP-MN\r
+mobilip-mn      435/udp    MobilIP-MN\r
+#                          Kannan Alagappan <kannan@sejour.lkg.dec.com>\r
+dna-cml         436/tcp    DNA-CML\r
+dna-cml         436/udp    DNA-CML\r
+#                          Dan Flowers <flowers@smaug.lkg.dec.com>\r
+comscm          437/tcp    comscm\r
+comscm          437/udp    comscm\r
+#                          Jim Teague <teague@zso.dec.com>\r
+dsfgw           438/tcp    dsfgw\r
+dsfgw           438/udp    dsfgw\r
+#                          Andy McKeen <mckeen@osf.org>\r
+dasp            439/tcp    dasp      Thomas Obermair\r
+dasp            439/udp    dasp      tommy@inlab.m.eunet.de\r
+#                          Thomas Obermair <tommy@inlab.m.eunet.de>\r
+sgcp            440/tcp    sgcp\r
+sgcp            440/udp    sgcp\r
+#                          Marshall Rose <mrose@dbc.mtview.ca.us>\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 33]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+decvms-sysmgt   441/tcp    decvms-sysmgt\r
+decvms-sysmgt   441/udp    decvms-sysmgt\r
+#                          Lee Barton <barton@star.enet.dec.com>\r
+cvc_hostd       442/tcp    cvc_hostd\r
+cvc_hostd       442/udp    cvc_hostd\r
+#                          Bill Davidson <billd@equalizer.cray.com>\r
+https           443/tcp    https  MCom\r
+https           443/udp    https  MCom\r
+#                          Kipp E.B. Hickman <kipp@mcom.com>\r
+snpp            444/tcp    Simple Network Paging Protocol\r
+snpp            444/udp    Simple Network Paging Protocol\r
+#                          [RFC1568]\r
+microsoft-ds    445/tcp    Microsoft-DS\r
+microsoft-ds    445/udp    Microsoft-DS\r
+#                          Arnold Miller <arnoldm@microsoft.com>\r
+ddm-rdb         446/tcp    DDM-RDB\r
+ddm-rdb         446/udp    DDM-RDB\r
+ddm-dfm         447/tcp    DDM-RFM\r
+ddm-dfm         447/udp    DDM-RFM\r
+ddm-byte        448/tcp    DDM-BYTE\r
+ddm-byte        448/udp    DDM-BYTE\r
+#                          Jan David Fisher <jdfisher@VNET.IBM.COM>\r
+as-servermap    449/tcp    AS Server Mapper\r
+as-servermap    449/udp    AS Server Mapper\r
+#                          Barbara Foss <BGFOSS@rchvmv.vnet.ibm.com>\r
+tserver         450/tcp    TServer\r
+tserver         450/udp    TServer\r
+#                          Harvey S. Schultz <hss@mtgzfs3.mt.att.com>\r
+#               451-511    Unassigned\r
+exec            512/tcp    remote process execution;\r
+#                          authentication performed using\r
+#                          passwords and UNIX loppgin names\r
+biff            512/udp    used by mail system to notify users\r
+#                          of new mail received; currently\r
+#                          receives messages only from\r
+#                          processes on the same machine\r
+login           513/tcp    remote login a la telnet;\r
+#                          automatic authentication performed\r
+#                          based on priviledged port numbers\r
+#                          and distributed data bases which\r
+#                          identify "authentication domains"\r
+who             513/udp    maintains data bases showing who's\r
+#                          logged in to machines on a local\r
+#                          net and the load average of the\r
+#                          machine\r
+cmd             514/tcp    like exec, but automatic\r
+#                          authentication is performed as for\r
+#                          login server\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 34]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+syslog          514/udp\r
+printer         515/tcp    spooler\r
+printer         515/udp    spooler\r
+#               516/tcp    Unassigned\r
+#               516/udp    Unassigned\r
+talk            517/tcp    like tenex link, but across\r
+#                          machine - unfortunately, doesn't\r
+#                          use link protocol (this is actually\r
+#                          just a rendezvous port from which a\r
+#                          tcp connection is established)\r
+talk            517/udp    like tenex link, but across\r
+#                          machine - unfortunately, doesn't\r
+#                          use link protocol (this is actually\r
+#                          just a rendezvous port from which a\r
+                           tcp connection is established)\r
+ntalk           518/tcp\r
+ntalk           518/udp\r
+utime           519/tcp    unixtime\r
+utime           519/udp    unixtime\r
+efs             520/tcp    extended file name server\r
+router          520/udp    local routing process (on site);\r
+#                          uses variant of Xerox NS routing\r
+#                          information protocol\r
+#               521-524    Unassigned\r
+timed           525/tcp    timeserver\r
+timed           525/udp    timeserver\r
+tempo           526/tcp    newdate\r
+tempo           526/udp    newdate\r
+#               527-529    Unassigned\r
+courier         530/tcp    rpc\r
+courier         530/udp    rpc\r
+conference      531/tcp    chat\r
+conference      531/udp    chat\r
+netnews         532/tcp    readnews\r
+netnews         532/udp    readnews\r
+netwall         533/tcp    for emergency broadcasts\r
+netwall         533/udp    for emergency broadcasts\r
+#               534-538    Unassigned\r
+apertus-ldp     539/tcp    Apertus Technologies Load Determination\r
+apertus-ldp     539/udp    Apertus Technologies Load Determination\r
+uucp            540/tcp    uucpd\r
+uucp            540/udp    uucpd\r
+uucp-rlogin     541/tcp    uucp-rlogin  Stuart Lynne\r
+uucp-rlogin     541/udp    uucp-rlogin  sl@wimsey.com\r
+#               542/tcp    Unassigned\r
+#               542/udp    Unassigned\r
+klogin          543/tcp\r
+klogin          543/udp\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 35]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+kshell          544/tcp    krcmd\r
+kshell          544/udp    krcmd\r
+#               545-549    Unassigned\r
+new-rwho        550/tcp    new-who\r
+new-rwho        550/udp    new-who\r
+#               551-555    Unassigned\r
+dsf             555/tcp\r
+dsf             555/udp\r
+remotefs        556/tcp    rfs server\r
+remotefs        556/udp    rfs server\r
+#               557-559    Unassigned\r
+rmonitor        560/tcp    rmonitord\r
+rmonitor        560/udp    rmonitord\r
+monitor         561/tcp\r
+monitor         561/udp\r
+chshell         562/tcp    chcmd\r
+chshell         562/udp    chcmd\r
+#               563/tcp    Unassigned\r
+#               563/udp    Unassigned\r
+9pfs            564/tcp    plan 9 file service\r
+9pfs            564/udp    plan 9 file service\r
+whoami          565/tcp    whoami\r
+whoami          565/udp    whoami\r
+#               566-569    Unassigned\r
+meter           570/tcp    demon\r
+meter           570/udp    demon\r
+meter           571/tcp    udemon\r
+meter           571/udp    udemon\r
+#               572-599    Unassigned\r
+ipcserver       600/tcp    Sun IPC server\r
+ipcserver       600/udp    Sun IPC server\r
+nqs             607/tcp    nqs\r
+nqs             607/udp    nqs\r
+urm             606/tcp    Cray Unified Resource Manager\r
+urm             606/udp    Cray Unified Resource Manager\r
+#                          Bill Schiefelbein <schief@aspen.cray.com>\r
+sift-uft        608/tcp    Sender-Initiated/Unsolicited File Transfer\r
+sift-uft        608/udp    Sender-Initiated/Unsolicited File Transfer\r
+#                          Rick Troth <troth@rice.edu>\r
+npmp-trap       609/tcp    npmp-trap\r
+npmp-trap       609/udp    npmp-trap\r
+npmp-local      610/tcp    npmp-local\r
+npmp-local      610/udp    npmp-local\r
+npmp-gui        611/tcp    npmp-gui\r
+npmp-gui        611/udp    npmp-gui\r
+#                          John Barnes <jbarnes@crl.com>\r
+ginad           634/tcp    ginad\r
+ginad           634/udp    ginad\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 36]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                          Mark Crother <mark@eis.calstate.edu>\r
+mdqs            666/tcp\r
+mdqs            666/udp\r
+doom            666/tcp    doom Id Software\r
+doom            666/tcp    doom Id Software\r
+#                          <ddt@idcube.idsoftware.com>\r
+elcsd           704/tcp    errlog copy/server daemon\r
+elcsd           704/udp    errlog copy/server daemon\r
+\r
+entrustmanager  709/tcp    EntrustManager\r
+entrustmanager  709/udp    EntrustManager\r
+#                          Peter Whittaker <pww@bnr.ca>\r
+netviewdm1      729/tcp    IBM NetView DM/6000 Server/Client\r
+netviewdm1      729/udp    IBM NetView DM/6000 Server/Client\r
+netviewdm2      730/tcp    IBM NetView DM/6000 send/tcp\r
+netviewdm2      730/udp    IBM NetView DM/6000 send/tcp\r
+netviewdm3      731/tcp    IBM NetView DM/6000 receive/tcp\r
+netviewdm3      731/udp    IBM NetView DM/6000 receive/tcp\r
+#                          Philippe Binet  (phbinet@vnet.IBM.COM)\r
+netgw           741/tcp    netGW\r
+netgw           741/udp    netGW\r
+netrcs          742/tcp    Network based Rev. Cont. Sys.\r
+netrcs          742/udp    Network based Rev. Cont. Sys.\r
+#                          Gordon C. Galligher <gorpong@ping.chi.il.us>\r
+flexlm          744/tcp    Flexible License Manager\r
+flexlm          744/udp    Flexible License Manager\r
+#                          Matt Christiano\r
+#                          <globes@matt@oliveb.atc.olivetti.com>\r
+fujitsu-dev     747/tcp    Fujitsu Device Control\r
+fujitsu-dev     747/udp    Fujitsu Device Control\r
+ris-cm          748/tcp    Russell Info Sci Calendar Manager\r
+ris-cm          748/udp    Russell Info Sci Calendar Manager\r
+kerberos-adm    749/tcp    kerberos administration\r
+kerberos-adm    749/udp    kerberos administration\r
+rfile           750/tcp\r
+loadav          750/udp\r
+pump            751/tcp\r
+pump            751/udp\r
+qrh             752/tcp\r
+qrh             752/udp\r
+rrh             753/tcp\r
+rrh             753/udp\r
+tell            754/tcp     send\r
+tell            754/udp     send\r
+nlogin          758/tcp\r
+nlogin          758/udp\r
+con             759/tcp\r
+con             759/udp\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 37]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ns              760/tcp\r
+ns              760/udp\r
+rxe             761/tcp\r
+rxe             761/udp\r
+quotad          762/tcp\r
+quotad          762/udp\r
+cycleserv       763/tcp\r
+cycleserv       763/udp\r
+omserv          764/tcp\r
+omserv          764/udp\r
+webster         765/tcp\r
+webster         765/udp\r
+phonebook       767/tcp    phone\r
+phonebook       767/udp    phone\r
+vid             769/tcp\r
+vid             769/udp\r
+cadlock         770/tcp\r
+cadlock         770/udp\r
+rtip            771/tcp\r
+rtip            771/udp\r
+cycleserv2      772/tcp\r
+cycleserv2      772/udp\r
+submit          773/tcp\r
+notify          773/udp\r
+rpasswd         774/tcp\r
+acmaint_dbd     774/udp\r
+entomb          775/tcp\r
+acmaint_transd  775/udp\r
+wpages          776/tcp\r
+wpages          776/udp\r
+wpgs            780/tcp\r
+wpgs            780/udp\r
+concert         786/tcp       Concert\r
+concert         786/udp       Concert\r
+#                             Josyula R. Rao <jrrao@watson.ibm.com>\r
+mdbs_daemon     800/tcp\r
+mdbs_daemon     800/udp\r
+device          801/tcp\r
+device          801/udp\r
+xtreelic        996/tcp        Central Point Software\r
+xtreelic        996/udp        Central Point Software\r
+#                              Dale Cabell <dacabell@smtp.xtree.com>\r
+maitrd          997/tcp\r
+maitrd          997/udp\r
+busboy          998/tcp\r
+puparp          998/udp\r
+garcon          999/tcp\r
+applix          999/udp        Applix ac\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 38]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+puprouter       999/tcp\r
+puprouter       999/udp\r
+cadlock         1000/tcp\r
+ock             1000/udp\r
+                1023/tcp       Reserved\r
+                1024/udp       Reserved\r
+#                              IANA <iana@isi.edu>\r
+\r
+\r
+\r
+REGISTERED PORT NUMBERS\r
+\r
+The Registered Ports are not controlled by the IANA and on most\r
+systems can be used by ordinary user processes or programs executed by\r
+ordinary users.\r
+\r
+Ports are used in the TCP [RFC793] to name the ends of logical\r
+connections which carry long term conversations.  For the purpose of\r
+providing services to unknown callers, a service contact port is\r
+defined.  This list specifies the port used by the server process as\r
+its contact port.  While the IANA can not control uses of these ports\r
+it does register or list uses of these ports as a convienence to the\r
+community.\r
+\r
+To the extent possible, these same port assignments are used with the\r
+UDP [RFC768].\r
+\r
+The Registered Ports are in the range 1024-65535.\r
+\r
+Port Assignments:\r
+\r
+Keyword         Decimal    Description                     References\r
+-------         -------    -----------                     ----------\r
+                1024/tcp   Reserved\r
+                1024/udp   Reserved\r
+#                          IANA <iana@isi.edu>\r
+blackjack       1025/tcp   network blackjack\r
+blackjack       1025/udp   network blackjack\r
+iad1            1030/tcp   BBN IAD\r
+iad1            1030/udp   BBN IAD\r
+iad2            1031/tcp   BBN IAD\r
+iad2            1031/udp   BBN IAD\r
+iad3            1032/tcp   BBN IAD\r
+iad3            1032/udp   BBN IAD\r
+#                          Andy Malis <malis_a@timeplex.com>\r
+instl_boots     1067/tcp   Installation Bootstrap Proto. Serv.\r
+instl_boots     1067/udp   Installation Bootstrap Proto. Serv.\r
+instl_bootc     1068/tcp   Installation Bootstrap Proto. Cli.\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 39]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+instl_bootc     1068/udp   Installation Bootstrap Proto. Cli.\r
+#                          David Arko <<darko@hpfcrn.fc.hp.com>\r
+socks           1080/tcp   Socks\r
+socks           1080/udp   Socks\r
+#                          Ying-Da Lee <ylee@syl.dl.nec.com\r
+ansoft-lm-1     1083/tcp   Anasoft License Manager\r
+ansoft-lm-1     1083/udp   Anasoft License Manager\r
+ansoft-lm-2     1084/tcp   Anasoft License Manager\r
+ansoft-lm-2     1084/udp   Anasoft License Manager\r
+nfa             1155/tcp   Network File Access\r
+nfa             1155/udp   Network File Access\r
+#                          James Powell <james@mailhost.unidata.com>\r
+nerv            1222/tcp   SNI R&D network\r
+nerv            1222/udp   SNI R&D network\r
+#                          Martin Freiss <freiss.pad@sni.de>\r
+hermes          1248/tcp\r
+hermes          1248/udp\r
+alta-ana-lm     1346/tcp   Alta Analytics License Manager\r
+alta-ana-lm     1346/udp   Alta Analytics License Manager\r
+bbn-mmc         1347/tcp   multi media conferencing\r
+bbn-mmc         1347/udp   multi media conferencing\r
+bbn-mmx         1348/tcp   multi media conferencing\r
+bbn-mmx         1348/udp   multi media conferencing\r
+sbook           1349/tcp   Registration Network Protocol\r
+sbook           1349/udp   Registration Network Protocol\r
+editbench       1350/tcp   Registration Network Protocol\r
+editbench       1350/udp   Registration Network Protocol\r
+#               Simson L. Garfinkel <simsong@next.cambridge.ma.us>\r
+equationbuilder 1351/tcp   Digital Tool Works (MIT)\r
+equationbuilder 1351/udp   Digital Tool Works (MIT)\r
+#                          Terrence J. Talbot <lexcube!tjt@bu.edu>\r
+lotusnote       1352/tcp   Lotus Note\r
+lotusnote       1352/udp   Lotus Note\r
+#               Greg Pflaum <iris.com!Greg_Pflaum@uunet.uu.net>\r
+relief          1353/tcp   Relief Consulting\r
+relief          1353/udp   Relief Consulting\r
+#                          John Feiler <relief!jjfeiler@uu2.psi.com>\r
+rightbrain      1354/tcp   RightBrain Software\r
+rightbrain      1354/udp   RightBrain Software\r
+#                          Glenn Reid <glann@rightbrain.com>\r
+intuitive edge  1355/tcp   Intuitive Edge\r
+intuitive edge  1355/udp   Intuitive Edge\r
+#                          Montgomery Zukowski\r
+#                          <monty@nextnorth.acs.ohio-state.edu>\r
+cuillamartin    1356/tcp   CuillaMartin Company\r
+cuillamartin    1356/udp   CuillaMartin Company\r
+pegboard        1357/tcp   Electronic PegBoard\r
+pegboard        1357/udp   Electronic PegBoard\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 40]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                          Chris Cuilla\r
+#                          <balr!vpnet!cuilla!chris@clout.chi.il.us>\r
+connlcli        1358/tcp   CONNLCLI\r
+connlcli        1358/udp   CONNLCLI\r
+ftsrv           1359/tcp   FTSRV\r
+ftsrv           1359/udp   FTSRV\r
+#                          Ines Homem de Melo <sidinf@brfapesp.bitnet>\r
+mimer           1360/tcp   MIMER\r
+mimer           1360/udp   MIMER\r
+#                          Per Schroeder  <Per.Schroder@mimer.se>\r
+linx            1361/tcp   LinX\r
+linx            1361/udp   LinX\r
+#                          Steffen Schilke <---none--->\r
+timeflies       1362/tcp   TimeFlies\r
+timeflies       1362/udp   TimeFlies\r
+#                          Doug Kent <mouthers@slugg@nwnexus.wa.com>\r
+ndm-requester   1363/tcp   Network DataMover Requester\r
+ndm-requester   1363/udp   Network DataMover Requester\r
+ndm-server      1364/tcp   Network DataMover Server\r
+ndm-server      1364/udp   Network DataMover Server\r
+#                          Toshio Watanabe\r
+#                          <watanabe@godzilla.rsc.spdd.ricoh.co.j>\r
+adapt-sna       1365/tcp   Network Software Associates\r
+adapt-sna       1365/udp   Network Software Associates\r
+#                          Jeffery Chiao <714-768-401>\r
+netware-csp     1366/tcp   Novell NetWare Comm Service Platform\r
+netware-csp     1366/udp   Novell NetWare Comm Service Platform\r
+#                          Laurie Lindsey <llindsey@novell.com>\r
+dcs             1367/tcp   DCS\r
+dcs             1367/udp   DCS\r
+#                          Stefan Siebert <ssiebert@dcs.de>\r
+screencast      1368/tcp   ScreenCast\r
+screencast      1368/udp   ScreenCast\r
+#                          Bill Tschumy <other!bill@uunet.UU.NET>\r
+gv-us           1369/tcp   GlobalView to Unix Shell\r
+gv-us           1369/udp   GlobalView to Unix Shell\r
+us-gv           1370/tcp   Unix Shell to GlobalView\r
+us-gv           1370/udp   Unix Shell to GlobalView\r
+#               Makoto Mita <mita@ssdev.ksp.fujixerox.co.jp>\r
+fc-cli          1371/tcp   Fujitsu Config Protocol\r
+fc-cli          1371/udp   Fujitsu Config Protocol\r
+fc-ser          1372/tcp   Fujitsu Config Protocol\r
+fc-ser          1372/udp   Fujitsu Config Protocol\r
+#               Ryuichi Horie <horie@spad.sysrap.cs.fujitsu.co.jp>\r
+chromagrafx     1373/tcp   Chromagrafx\r
+chromagrafx     1373/udp   Chromagrafx\r
+#                          Mike Barthelemy <msb@chromagrafx.com>\r
+molly           1374/tcp   EPI Software Systems\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 41]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+molly           1374/udp   EPI Software Systems\r
+#                          Jim Vlcek <vlcek@epimbe.com>\r
+bytex           1375/tcp   Bytex\r
+bytex           1375/udp   Bytex\r
+#               Mary Ann Burt <bytex!ws054!maryann@uunet.UU.NET>\r
+ibm-pps         1376/tcp   IBM Person to Person Software\r
+ibm-pps         1376/udp   IBM Person to Person Software\r
+#                          Simon Phipps <sphipps@vnet.ibm.com>\r
+cichlid         1377/tcp   Cichlid License Manager\r
+cichlid         1377/udp   Cichlid License Manager\r
+#                          Andy Burgess <aab@cichlid.com>\r
+elan            1378/tcp   Elan License Manager\r
+elan            1378/udp   Elan License Manager\r
+#                          Ken Greer <kg@elan.com>\r
+dbreporter      1379/tcp   Integrity Solutions\r
+dbreporter      1379/udp   Integrity Solutions\r
+#                          Tim Dawson <tdawson%mspboss@uunet.UU.NET>\r
+telesis-licman  1380/tcp   Telesis Network License Manager\r
+telesis-licman  1380/udp   Telesis Network License Manager\r
+#                          Karl Schendel, Jr. <wiz@telesis.com>\r
+apple-licman    1381/tcp   Apple Network License Manager\r
+apple-licman    1381/udp   Apple Network License Manager\r
+#                          Earl Wallace <earlw@apple.com>\r
+udt_os          1382/tcp\r
+udt_os          1382/udp\r
+gwha            1383/tcp   GW Hannaway Network License Manager\r
+gwha            1383/udp   GW Hannaway Network License Manager\r
+#                          J. Gabriel Foster <fop@gwha.com>\r
+os-licman       1384/tcp   Objective Solutions License Manager\r
+os-licman       1384/udp   Objective Solutions License Manager\r
+#               Donald Cornwell <don.cornwell@objective.com>\r
+atex_elmd       1385/tcp   Atex Publishing License Manager\r
+atex_elmd       1385/udp   Atex Publishing License Manager\r
+#                          Brett Sorenson <bcs@atex.com>\r
+checksum        1386/tcp   CheckSum License Manager\r
+checksum        1386/udp   CheckSum License Manager\r
+#                          Andreas Glocker <glocker@sirius.com>\r
+cadsi-lm        1387/tcp   Computer Aided Design Software Inc LM\r
+cadsi-lm        1387/udp   Computer Aided Design Software Inc LM\r
+#                          Sulistio Muljadi\r
+objective-dbc   1388/tcp   Objective Solutions DataBase Cache\r
+objective-dbc   1388/udp   Objective Solutions DataBase Cache\r
+#                          Donald Cornwell\r
+iclpv-dm        1389/tcp   Document Manager\r
+iclpv-dm        1389/udp   Document Manager\r
+iclpv-sc        1390/tcp   Storage Controller\r
+iclpv-sc        1390/udp   Storage Controller\r
+iclpv-sas       1391/tcp   Storage Access Server\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 42]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+iclpv-sas       1391/udp   Storage Access Server\r
+iclpv-pm        1392/tcp   Print Manager\r
+iclpv-pm        1392/udp   Print Manager\r
+iclpv-nls       1393/tcp   Network Log Server\r
+iclpv-nls       1393/udp   Network Log Server\r
+iclpv-nlc       1394/tcp   Network Log Client\r
+iclpv-nlc       1394/udp   Network Log Client\r
+iclpv-wsm       1395/tcp   PC Workstation Manager software\r
+iclpv-wsm       1395/udp   PC Workstation Manager software\r
+#               A.P. Hobson <A.P.Hobson@bra0112.wins.icl.co.uk>\r
+dvl-activemail  1396/tcp   DVL Active Mail\r
+dvl-activemail  1396/udp   DVL Active Mail\r
+audio-activmail 1397/tcp   Audio Active Mail\r
+audio-activmail 1397/udp   Audio Active Mail\r
+video-activmail 1398/tcp   Video Active Mail\r
+video-activmail 1398/udp   Video Active Mail\r
+#                          Ehud Shapiro <udi@wisdon.weizmann.ac.il>\r
+cadkey-licman   1399/tcp   Cadkey License Manager\r
+cadkey-licman   1399/udp   Cadkey License Manager\r
+cadkey-tablet   1400/tcp   Cadkey Tablet Daemon\r
+cadkey-tablet   1400/udp   Cadkey Tablet Daemon\r
+#                          Joe McCollough <joe@cadkey.com>\r
+goldleaf-licman 1401/tcp   Goldleaf License Manager\r
+goldleaf-licman 1401/udp   Goldleaf License Manager\r
+#                          John Fox <---none--->\r
+prm-sm-np       1402/tcp   Prospero Resource Manager\r
+prm-sm-np       1402/udp   Prospero Resource Manager\r
+prm-nm-np       1403/tcp   Prospero Resource Manager\r
+prm-nm-np       1403/udp   Prospero Resource Manager\r
+#                          B. Clifford Neuman <bcn@isi.edu>\r
+igi-lm          1404/tcp   Infinite Graphics License Manager\r
+igi-lm          1404/udp   Infinite Graphics License Manager\r
+ibm-res         1405/tcp   IBM Remote Execution Starter\r
+ibm-res         1405/udp   IBM Remote Execution Starter\r
+netlabs-lm      1406/tcp   NetLabs License Manager\r
+netlabs-lm      1406/udp   NetLabs License Manager\r
+dbsa-lm         1407/tcp   DBSA License Manager\r
+dbsa-lm         1407/udp   DBSA License Manager\r
+#                          Scott Shattuck <ss@dbsa.com>\r
+sophia-lm       1408/tcp   Sophia License Manager\r
+sophia-lm       1408/udp   Sophia License Manager\r
+#                          Eric Brown <sst!emerald!eric@uunet.UU.net>\r
+here-lm         1409/tcp   Here License Manager\r
+here-lm         1409/udp   Here License Manager\r
+#                          David Ison  <here@dialup.oar.net>\r
+hiq             1410/tcp   HiQ License Manager\r
+hiq             1410/udp   HiQ License Manager\r
+#                          Rick Pugh <rick@bilmillennium.com>\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 43]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+af              1411/tcp   AudioFile\r
+af              1411/udp   AudioFile\r
+#                          Jim Gettys <jg@crl.dec.com>\r
+innosys         1412/tcp   InnoSys\r
+innosys         1412/udp   InnoSys\r
+innosys-acl     1413/tcp   Innosys-ACL\r
+innosys-acl     1413/udp   Innosys-ACL\r
+#                          Eric Welch <--none--->\r
+ibm-mqseries    1414/tcp   IBM MQSeries\r
+ibm-mqseries    1414/udp   IBM MQSeries\r
+#                          Roger Meli <rmmeli%winvmd@vnet.ibm.com>\r
+dbstar          1415/tcp   DBStar\r
+dbstar          1415/udp   DBStar\r
+#                          Jeffrey Millman <jcm@dbstar.com>\r
+novell-lu6.2    1416/tcp   Novell LU6.2\r
+novell-lu6.2    1416/udp   Novell LU6.2\r
+#                          Peter Liu <--none--->\r
+timbuktu-srv1   1417/tcp   Timbuktu Service 1 Port\r
+timbuktu-srv1   1417/tcp   Timbuktu Service 1 Port\r
+timbuktu-srv2   1418/tcp   Timbuktu Service 2 Port\r
+timbuktu-srv2   1418/udp   Timbuktu Service 2 Port\r
+timbuktu-srv3   1419/tcp   Timbuktu Service 3 Port\r
+timbuktu-srv3   1419/udp   Timbuktu Service 3 Port\r
+timbuktu-srv4   1420/tcp   Timbuktu Service 4 Port\r
+timbuktu-srv4   1420/udp   Timbuktu Service 4 Port\r
+#                          Marc Epard <marc@waygate.farallon.com>\r
+gandalf-lm      1421/tcp   Gandalf License Manager\r
+gandalf-lm      1421/udp   Gandalf License Manager\r
+#                          gilmer@gandalf.ca\r
+autodesk-lm     1422/tcp   Autodesk License Manager\r
+autodesk-lm     1422/udp   Autodesk License Manager\r
+#                          David Ko <dko@autodesk.com>\r
+essbase         1423/tcp   Essbase Arbor Software\r
+essbase         1423/udp   Essbase Arbor Software\r
+hybrid          1424/tcp   Hybrid Encryption Protocol\r
+hybrid          1424/udp   Hybrid Encryption Protocol\r
+#                          Howard Hart <hch@hybrid.com>\r
+zion-lm         1425/tcp   Zion Software License Manager\r
+zion-lm         1425/udp   Zion Software License Manager\r
+#                          David Ferrero <david@zion.com>\r
+sas-1           1426/tcp   Satellite-data Acquisition System 1\r
+sas-1           1426/udp   Satellite-data Acquisition System 1\r
+#                          Bill Taylor <sais@ssec.wisc.edu>\r
+mloadd          1427/tcp   mloadd monitoring tool\r
+mloadd          1427/udp   mloadd monitoring tool\r
+#                          Bob Braden <braden@isi.edu>\r
+informatik-lm   1428/tcp   Informatik License Manager\r
+informatik-lm   1428/udp   Informatik License Manager\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 44]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                          Harald Schlangmann\r
+#                          <schlangm@informatik.uni-muenchen.de>\r
+nms             1429/tcp   Hypercom NMS\r
+nms             1429/udp   Hypercom NMS\r
+tpdu            1430/tcp   Hypercom TPDU\r
+tpdu            1430/udp   Hypercom TPDU\r
+#                          Noor Chowdhury <noor@hypercom.com>\r
+rgtp            1431/tcp   Reverse Gosip Transport\r
+rgtp            1431/udp   Reverse Gosip Transport\r
+#                          <iwj10@cl.cam-orl.co.uk>\r
+blueberry-lm    1432/tcp   Blueberry Software License Manager\r
+blueberry-lm    1432/udp   Blueberry Software License Manager\r
+#                          Steve Beigel <ublueb!steve@uunet.uu.net>\r
+ms-sql-s        1433/tcp   Microsoft-SQL-Server\r
+ms-sql-s        1433/udp   Microsoft-SQL-Server\r
+ms-sql-m        1434/tcp   Microsoft-SQL-Monitor\r
+ms-sql-m        1434/udp   Microsoft-SQL-Monitor\r
+#                          Peter Hussey <peterhus@microsoft.com>\r
+ibm-cics        1435/tcp   IBM CISC\r
+ibm-cics        1435/udp   IBM CISC\r
+#                          Geoff Meacock <gbibmswl@ibmmail.COM>\r
+sas-2           1436/tcp   Satellite-data Acquisition System 2\r
+sas-2           1436/udp   Satellite-data Acquisition System 2\r
+#                          Bill Taylor <sais@ssec.wisc.edu>\r
+tabula          1437/tcp   Tabula\r
+tabula          1437/udp   Tabula\r
+#                          Marcelo Einhorn\r
+#                          <KGUNE%HUJIVM1.bitnet@taunivm.tau.ac.il>\r
+eicon-server    1438/tcp   Eicon Security Agent/Server\r
+eicon-server    1438/udp   Eicon Security Agent/Server\r
+eicon-x25       1439/tcp   Eicon X25/SNA Gateway\r
+eicon-x25       1439/udp   Eicon X25/SNA Gateway\r
+eicon-slp       1440/tcp   Eicon Service Location Protocol\r
+eicon-slp       1440/udp   Eicon Service Location Protocol\r
+#                          Pat Calhoun <CALHOUN@admin.eicon.qc.ca>\r
+cadis-1         1441/tcp   Cadis License Management\r
+cadis-1         1441/udp   Cadis License Management\r
+cadis-2         1442/tcp   Cadis License Management\r
+cadis-2         1442/udp   Cadis License Management\r
+#                          Todd Wichers <twichers@csn.org>\r
+ies-lm          1443/tcp   Integrated Engineering Software\r
+ies-lm          1443/udp   Integrated Engineering Software\r
+#                          David Tong <David_Tong@integrated.mb.ca>\r
+marcam-lm       1444/tcp   Marcam  License Management\r
+marcam-lm       1444/udp   Marcam  License Management\r
+#                          Therese Hunt <hunt@marcam.com>\r
+proxima-lm      1445/tcp   Proxima License Manager\r
+proxima-lm      1445/udp   Proxima License Manager\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 45]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ora-lm          1446/tcp   Optical Research Associates License Manager\r
+ora-lm          1446/udp   Optical Research Associates License Manager\r
+apri-lm         1447/tcp   Applied Parallel Research LM\r
+apri-lm         1447/udp   Applied Parallel Research LM\r
+#                          Jim Dillon <jed@apri.com>\r
+oc-lm           1448/tcp   OpenConnect License Manager\r
+oc-lm           1448/udp   OpenConnect License Manager\r
+#                          Sue Barnhill <snb@oc.com>\r
+peport          1449/tcp   PEport\r
+peport          1449/udp   PEport\r
+#                          Qentin Neill <quentin@ColumbiaSC.NCR.COM>\r
+dwf             1450/tcp   Tandem Distributed Workbench Facility\r
+dwf             1450/udp   Tandem Distributed Workbench Facility\r
+#                          Mike Bert <BERG_MIKE@tandem.com>\r
+infoman         1451/tcp   IBM Information Management\r
+infoman         1451/udp   IBM Information Management\r
+#                          Karen Burns <---none--->\r
+gtegsc-lm       1452/tcp   GTE Government Systems License Man\r
+gtegsc-lm       1452/udp   GTE Government Systems License Man\r
+#               Mike Gregory <Gregory_Mike@msmail.iipo.gtegsc.com>\r
+genie-lm        1453/tcp   Genie License Manager\r
+genie-lm        1453/udp   Genie License Manager\r
+#                          Paul Applegate <p.applegate2@genie.geis.com>\r
+interhdl_elmd   1454/tcp   interHDL License Manager\r
+interhdl_elmd   1454/tcp   interHDL License Manager\r
+#                          Eli Sternheim eli@interhdl.com\r
+esl-lm          1455/tcp   ESL License Manager\r
+esl-lm          1455/udp   ESL License Manager\r
+#                          Abel Chou <abel@willy.esl.com>\r
+dca             1456/tcp   DCA\r
+dca             1456/udp   DCA\r
+#                          Jeff Garbers <jgarbers@netcom.com>\r
+valisys-lm      1457/tcp    Valisys License Manager\r
+valisys-lm      1457/udp    Valisys License Manager\r
+#               Leslie Lincoln <leslie_lincoln@valisys.com>\r
+nrcabq-lm       1458/tcp    Nichols Research Corp.\r
+nrcabq-lm       1458/udp    Nichols Research Corp.\r
+#                           Howard Cole <hcole@tumbleweed.nrcabq.com>\r
+proshare1       1459/tcp    Proshare Notebook Application\r
+proshare1       1459/udp    Proshare Notebook Application\r
+proshare2       1460/tcp    Proshare Notebook Application\r
+proshare2       1460/udp    Proshare Notebook Application\r
+#                           Robin Kar <Robin_Kar@ccm.hf.intel.com>\r
+ibm_wrless_lan  1461/tcp    IBM Wireless LAN\r
+ibm_wrless_lan  1461/udp    IBM Wireless LAN\r
+#                           <flanne@vnet.IBM.COM>\r
+world-lm        1462/tcp    World License Manager\r
+world-lm        1462/udp    World License Manager\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 46]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                           Michael S Amirault <ambi@world.std.com>\r
+nucleus         1463/tcp    Nucleus\r
+nucleus         1463/udp    Nucleus\r
+#                           Venky Nagar <venky@fafner.Stanford.EDU>\r
+msl_lmd         1464/tcp    MSL License Manager\r
+msl_lmd         1464/udp    MSL License Manager\r
+#                           Matt Timmermans\r
+pipes           1465/tcp    Pipes Platform\r
+pipes           1465/udp    Pipes Platform  mfarlin@peerlogic.com\r
+#                           Mark Farlin <mfarlin@peerlogic.com>\r
+oceansoft-lm    1466/tcp    Ocean Software License Manager\r
+oceansoft-lm    1466/udp    Ocean Software License Manager\r
+#                           Randy Leonard <randy@oceansoft.com>\r
+csdmbase        1467/tcp    CSDMBASE\r
+csdmbase        1467/udp    CSDMBASE\r
+csdm            1468/tcp    CSDM\r
+csdm            1468/udp    CSDM\r
+#               Robert Stabl <stabl@informatik.uni-muenchen.de>\r
+aal-lm          1469/tcp    Active Analysis Limited License Manager\r
+aal-lm          1469/udp    Active Analysis Limited License Manager\r
+#                           David Snocken  +44 (71)437-7009\r
+uaiact          1470/tcp    Universal Analytics\r
+uaiact          1470/udp    Universal Analytics\r
+#                           Mark R. Ludwig <Mark-Ludwig@uai.com>\r
+csdmbase        1471/tcp    csdmbase\r
+csdmbase        1471/udp    csdmbase\r
+csdm            1472/tcp    csdm\r
+csdm            1472/udp    csdm\r
+#               Robert Stabl <stabl@informatik.uni-muenchen.de>\r
+openmath        1473/tcp    OpenMath\r
+openmath        1473/udp    OpenMath\r
+#                           Garth Mayville <mayville@maplesoft.on.ca>\r
+telefinder      1474/tcp    Telefinder\r
+telefinder      1474/udp    Telefinder\r
+#                           Jim White <Jim_White@spiderisland.com>\r
+taligent-lm     1475/tcp    Taligent License Manager\r
+taligent-lm     1475/udp    Taligent License Manager\r
+#               Mark Sapsford <Mark_Sapsford@@taligent.com>\r
+clvm-cfg        1476/tcp    clvm-cfg\r
+clvm-cfg        1476/udp    clvm-cfg\r
+#                           Eric Soderberg <seric@cup.hp.com>\r
+ms-sna-server   1477/tcp    ms-sna-server\r
+ms-sna-server   1477/udp    ms-sna-server\r
+ms-sna-base     1478/tcp    ms-sna-base\r
+ms-sna-base     1478/udp    ms-sna-base\r
+#                           Gordon Mangione <gordm@microsoft.com>\r
+dberegister     1479/tcp    dberegister\r
+dberegister     1479/udp    dberegister\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 47]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                           Brian Griswold <brian@dancingbear.com>\r
+pacerforum      1480/tcp    PacerForum\r
+pacerforum      1480/udp    PacerForum\r
+#                           Peter Caswell <pfc@pacvax.pacersoft.com>\r
+airs            1481/tcp    AIRS\r
+airs            1481/udp    AIRS\r
+#                           Bruce Wilson, 905-771-6161\r
+miteksys-lm     1482/tcp    Miteksys License Manager\r
+miteksys-lm     1482/udp    Miteksys License Manager\r
+#                           Shane McRoberts <mcroberts@miteksys.com>\r
+afs             1483/tcp    AFS License Manager\r
+afs             1483/udp    AFS License Manager\r
+#                           Michael R. Pizolato <michael@afs.com>\r
+confluent       1484/tcp    Confluent License Manager\r
+confluent       1484/udp    Confluent License Manager\r
+#                           James Greenfiel <jim@pa.confluent.com>\r
+lansource       1485/tcp    LANSource\r
+lansource       1485/udp    LANSource\r
+#                           Doug Scott <lansourc@hookup.net>\r
+nms_topo_serv   1486/tcp    nms_topo_serv\r
+nms_topo_serv   1486/udp    nms_topo_serv\r
+#                           Sylvia Siu <Sylvia_Siu@Novell.CO>\r
+localinfosrvr   1487/tcp    LocalInfoSrvr\r
+localinfosrvr   1487/udp    LocalInfoSrvr\r
+#               Brian Matthews <brian_matthews@ibist.ibis.com>\r
+docstor         1488/tcp    DocStor\r
+docstor         1488/udp    DocStor\r
+#                           Brian Spears <bspears@salix.com>\r
+dmdocbroker     1489/tcp    dmdocbroker\r
+dmdocbroker     1489/udp    dmdocbroker\r
+#                           Razmik Abnous <abnous@documentum.com>\r
+insitu-conf     1490/tcp    insitu-conf\r
+insitu-conf     1490/udp    insitu-conf\r
+#                           Paul Blacknell <paul@insitu.com>\r
+anynetgateway   1491/tcp    anynetgateway\r
+anynetgateway   1491/udp    anynetgateway\r
+#                           Dan Poirier <poirier@VNET.IBM.COM>\r
+stone-design-1  1492/tcp    stone-design-1\r
+stone-design-1  1492/udp    stone-design-1\r
+#                           Andrew Stone <andrew@stone.com>\r
+netmap_lm       1493/tcp    netmap_lm\r
+netmap_lm       1493/udp    netmap_lm\r
+#                           Phillip Magson <philm@extro.ucc.su.OZ.AU>\r
+ica             1494/tcp    ica\r
+ica             1494/udp    ica\r
+#                           John Richardson, Citrix Systems\r
+cvc             1495/tcp    cvc\r
+cvc             1495/udp    cvc\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 48]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#                           Bill Davidson <billd@equalizer.cray.com>\r
+liberty-lm      1496/tcp    liberty-lm\r
+liberty-lm      1496/udp    liberty-lm\r
+#                           Jim Rogers <trane!jimbo@pacbell.com>\r
+rfx-lm          1497/tcp    rfx-lm\r
+rfx-lm          1497/udp    rfx-lm\r
+#                           Bill Bishop <bil@rfx.rfx.com>\r
+watcom-sql      1498/tcp    Watcom-SQL\r
+watcom-sql      1498/udp    Watcom-SQL\r
+#                           Rog Skubowius <rwskubow@ccnga.uwaterloo.ca>\r
+fhc             1499/tcp    Federico Heinz Consultora\r
+fhc             1499/udp    Federico Heinz Consultora\r
+#                           Federico Heinz <federico@heinz.com>\r
+vlsi-lm         1500/tcp    VLSI License Manager\r
+vlsi-lm         1500/udp    VLSI License Manager\r
+#                           Shue-Lin Kuo <shuelin@mdk.sanjose.vlsi.com>\r
+sas-3           1501/tcp    Satellite-data Acquisition System 3\r
+sas-3           1501/udp    Satellite-data Acquisition System 3\r
+#                           Bill Taylor <sais@ssec.wisc.edu>\r
+shivadiscovery  1502/tcp    Shiva\r
+shivadiscovery  1502/udp    Shiva\r
+#                           Jonathan Wenocur <jhw@Shiva.COM>\r
+imtc-mcs        1503/tcp    Databeam\r
+imtc-mcs        1503/udp    Databeam\r
+#                           Jim Johnstone <jjohnstone@databeam.com>\r
+evb-elm         1504/tcp    EVB Software Engineering License Manager\r
+evb-elm         1504/udp    EVB Software Engineering License Manager\r
+#                           B.G. Mahesh < mahesh@sett.com>\r
+funkproxy       1505/tcp    Funk Software, Inc.\r
+funkproxy       1505/udp    Funk Software, Inc.\r
+#                           Robert D. Vincent <bert@willowpond.com>\r
+#               1506-1523   Unassigned\r
+ingreslock      1524/tcp    ingres\r
+ingreslock      1524/udp    ingres\r
+orasrv          1525/tcp    oracle\r
+orasrv          1525/udp    oracle\r
+prospero-np     1525/tcp    Prospero Directory Service non-priv\r
+prospero-np     1525/udp    Prospero Directory Service non-priv\r
+pdap-np         1526/tcp    Prospero Data Access Prot non-priv\r
+pdap-np         1526/udp    Prospero Data Access Prot non-priv\r
+#                           B. Clifford Neuman <bcn@isi.edu>\r
+tlisrv          1527/tcp    oracle\r
+tlisrv          1527/udp    oracle\r
+coauthor        1529/tcp    oracle\r
+coauthor        1529/udp    oracle\r
+issd            1600/tcp\r
+issd            1600/udp\r
+nkd             1650/tcp\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 49]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+nkd             1650/udp\r
+proshareaudio   1651/tcp   proshare conf audio\r
+proshareaudio   1651/udp   proshare conf audio\r
+prosharevideo   1652/tcp   proshare conf video\r
+prosharevideo   1652/udp   proshare conf video\r
+prosharedata    1653/tcp   proshare conf data\r
+prosharedata    1653/udp   proshare conf data\r
+prosharerequest 1654/tcp   proshare conf request\r
+prosharerequest 1654/udp   proshare conf request\r
+prosharenotify  1655/tcp   proshare conf notify\r
+prosharenotify  1655/udp   proshare conf notify\r
+#                          <gunner@ibeam.intel.com>\r
+netview-aix-1   1661/tcp   netview-aix-1\r
+netview-aix-1   1661/udp   netview-aix-1\r
+netview-aix-2   1662/tcp   netview-aix-2\r
+netview-aix-2   1662/udp   netview-aix-2\r
+netview-aix-3   1663/tcp   netview-aix-3\r
+netview-aix-3   1663/udp   netview-aix-3\r
+netview-aix-4   1664/tcp   netview-aix-4\r
+netview-aix-4   1664/udp   netview-aix-4\r
+netview-aix-5   1665/tcp   netview-aix-5\r
+netview-aix-5   1665/udp   netview-aix-5\r
+netview-aix-6   1666/tcp   netview-aix-6\r
+netview-aix-6   1666/udp   netview-aix-6\r
+#               Martha Crisson <CRISSON@ralvm12.vnet.ibm.com>\r
+licensedaemon   1986/tcp   cisco license management\r
+licensedaemon   1986/udp   cisco license management\r
+tr-rsrb-p1      1987/tcp   cisco RSRB Priority 1 port\r
+tr-rsrb-p1      1987/udp   cisco RSRB Priority 1 port\r
+tr-rsrb-p2      1988/tcp   cisco RSRB Priority 2 port\r
+tr-rsrb-p2      1988/udp   cisco RSRB Priority 2 port\r
+tr-rsrb-p3      1989/tcp   cisco RSRB Priority 3 port\r
+tr-rsrb-p3      1989/udp   cisco RSRB Priority 3 port\r
+#PROBLEMS!===================================================\r
+mshnet          1989/tcp   MHSnet system\r
+mshnet          1989/udp   MHSnet system\r
+#               Bob Kummerfeld <bob@sarad.cs.su.oz.au>\r
+#PROBLEMS!===================================================\r
+stun-p1         1990/tcp   cisco STUN Priority 1 port\r
+stun-p1         1990/udp   cisco STUN Priority 1 port\r
+stun-p2         1991/tcp   cisco STUN Priority 2 port\r
+stun-p2         1991/udp   cisco STUN Priority 2 port\r
+stun-p3         1992/tcp   cisco STUN Priority 3 port\r
+stun-p3         1992/udp   cisco STUN Priority 3 port\r
+#PROBLEMS!===================================================\r
+ipsendmsg       1992/tcp   IPsendmsg\r
+ipsendmsg       1992/udp   IPsendmsg\r
+#               Bob Kummerfeld <bob@sarad.cs.su.oz.au>\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 50]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+#PROBLEMS!===================================================\r
+snmp-tcp-port   1993/tcp   cisco SNMP TCP port\r
+snmp-tcp-port   1993/udp   cisco SNMP TCP port\r
+stun-port       1994/tcp   cisco serial tunnel port\r
+stun-port       1994/udp   cisco serial tunnel port\r
+perf-port       1995/tcp   cisco perf port\r
+perf-port       1995/udp   cisco perf port\r
+tr-rsrb-port    1996/tcp   cisco Remote SRB port\r
+tr-rsrb-port    1996/udp   cisco Remote SRB port\r
+gdp-port        1997/tcp   cisco Gateway Discovery Protocol\r
+gdp-port        1997/udp   cisco Gateway Discovery Protocol\r
+x25-svc-port    1998/tcp   cisco X.25 service (XOT)\r
+x25-svc-port    1998/udp   cisco X.25 service (XOT)\r
+tcp-id-port     1999/tcp   cisco identification port\r
+tcp-id-port     1999/udp   cisco identification port\r
+callbook        2000/tcp\r
+callbook        2000/udp\r
+dc              2001/tcp\r
+wizard          2001/udp    curry\r
+globe           2002/tcp\r
+globe           2002/udp\r
+mailbox         2004/tcp\r
+emce            2004/udp    CCWS mm conf\r
+berknet         2005/tcp\r
+oracle          2005/udp\r
+invokator       2006/tcp\r
+raid-cc         2006/udp    raid\r
+dectalk         2007/tcp\r
+raid-am         2007/udp\r
+conf            2008/tcp\r
+terminaldb      2008/udp\r
+news            2009/tcp\r
+whosockami      2009/udp\r
+search          2010/tcp\r
+pipe_server     2010/udp\r
+raid-cc         2011/tcp    raid\r
+servserv        2011/udp\r
+ttyinfo         2012/tcp\r
+raid-ac         2012/udp\r
+raid-am         2013/tcp\r
+raid-cd         2013/udp\r
+troff           2014/tcp\r
+raid-sf         2014/udp\r
+cypress         2015/tcp\r
+raid-cs         2015/udp\r
+bootserver      2016/tcp\r
+bootserver      2016/udp\r
+cypress-stat    2017/tcp\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 51]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+bootclient      2017/udp\r
+terminaldb      2018/tcp\r
+rellpack        2018/udp\r
+whosockami      2019/tcp\r
+about           2019/udp\r
+xinupageserver  2020/tcp\r
+xinupageserver  2020/udp\r
+servexec        2021/tcp\r
+xinuexpansion1  2021/udp\r
+down            2022/tcp\r
+xinuexpansion2  2022/udp\r
+xinuexpansion3  2023/tcp\r
+xinuexpansion3  2023/udp\r
+xinuexpansion4  2024/tcp\r
+xinuexpansion4  2024/udp\r
+ellpack         2025/tcp\r
+xribs           2025/udp\r
+scrabble        2026/tcp\r
+scrabble        2026/udp\r
+shadowserver    2027/tcp\r
+shadowserver    2027/udp\r
+submitserver    2028/tcp\r
+submitserver    2028/udp\r
+device2         2030/tcp\r
+device2         2030/udp\r
+blackboard      2032/tcp\r
+blackboard      2032/udp\r
+glogger         2033/tcp\r
+glogger         2033/udp\r
+scoremgr        2034/tcp\r
+scoremgr        2034/udp\r
+imsldoc         2035/tcp\r
+imsldoc         2035/udp\r
+objectmanager   2038/tcp\r
+objectmanager   2038/udp\r
+lam             2040/tcp\r
+lam             2040/udp\r
+interbase       2041/tcp\r
+interbase       2041/udp\r
+isis            2042/tcp\r
+isis            2042/udp\r
+isis-bcast      2043/tcp\r
+isis-bcast      2043/udp\r
+rimsl           2044/tcp\r
+rimsl           2044/udp\r
+cdfunc          2045/tcp\r
+cdfunc          2045/udp\r
+sdfunc          2046/tcp\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 52]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+sdfunc          2046/udp\r
+dls             2047/tcp\r
+dls             2047/udp\r
+dls-monitor     2048/tcp\r
+dls-monitor     2048/udp\r
+shilp           2049/tcp\r
+shilp           2049/udp\r
+dlsrpn          2065/tcp   Data Link Switch Read Port Number\r
+dlsrpn          2065/udp   Data Link Switch Read Port Number\r
+dlswpn          2067/tcp   Data Link Switch Write Port Number\r
+dlswpn          2067/udp   Data Link Switch Write Port Number\r
+ats             2201/tcp   Advanced Training System Program\r
+ats             2201/udp   Advanced Training System Program\r
+rtsserv         2500/tcp   Resource Tracking system server\r
+rtsserv         2500/udp   Resource Tracking system server\r
+rtsclient       2501/tcp   Resource Tracking system client\r
+rtsclient       2501/udp   Resource Tracking system client\r
+#                          Aubrey Turner\r
+#               <S95525ta%etsuacad.bitnet@ETSUADMN.ETSU.EDU>\r
+hp-3000-telnet  2564/tcp   HP 3000 NS/VT block mode telnet\r
+www-dev         2784/tcp   world wide web - development\r
+www-dev         2784/udp   world wide web - development\r
+NSWS            3049/tcp\r
+NSWS            3049/udp\r
+ccmail          3264/tcp   cc:mail/lotus\r
+ccmail          3264/udp   cc:mail/lotus\r
+dec-notes       3333/tcp   DEC Notes\r
+dec-notes       3333/udp   DEC Notes\r
+#                          Kim Moraros <moraros@via.enet.dec.com>\r
+mapper-nodemgr    3984/tcp     MAPPER network node manager\r
+mapper-nodemgr    3984/udp     MAPPER network node manager\r
+mapper-mapethd    3985/tcp     MAPPER TCP/IP server\r
+mapper-mapethd    3985/udp     MAPPER TCP/IP server\r
+mapper-ws_ethd    3986/tcp     MAPPER workstation server\r
+mapper-ws_ethd    3986/udp     MAPPER workstation server\r
+#                 John C. Horton <jch@unirsvl.rsvl.unisys.com>\r
+bmap            3421/tcp   Bull Apprise portmapper\r
+bmap            3421/udp   Bull Apprise portmapper\r
+#                          Jeremy Gilbert <J.Gilbert@ma30.bull.com>\r
+udt_os          3900/tcp   Unidata UDT OS\r
+udt_os          3900/udp   Unidata UDT OS\r
+#                          James Powell <james@mailhost.unidata.com>\r
+nuts_dem        4132/tcp   NUTS Daemon\r
+nuts_dem        4132/udp   NUTS Daemon\r
+nuts_bootp      4133/tcp   NUTS Bootp Server\r
+nuts_bootp      4133/udp   NUTS Bootp Server\r
+#                          Martin Freiss <freiss.pad@sni.>\r
+unicall         4343/tcp   UNICALL\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 53]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+unicall         4343/udp   UNICALL\r
+#                          James Powell <james@enghp.unidata.comp>\r
+krb524          4444/tcp   KRB524\r
+krb524          4444/udp   KRB524\r
+#                          B. Clifford Neuman <bcn@isi.edu>\r
+rfa             4672/tcp   remote file access server\r
+rfa             4672/udp   remote file access server\r
+commplex-main   5000/tcp\r
+commplex-main   5000/udp\r
+commplex-link   5001/tcp\r
+commplex-link   5001/udp\r
+rfe             5002/tcp   radio free ethernet\r
+rfe             5002/udp   radio free ethernet\r
+telelpathstart  5010/tcp   TelepathStart\r
+telelpathstart  5010/udp   TelepathStart\r
+telelpathattack 5011/tcp   TelepathAttack\r
+telelpathattack 5011/udp   TelepathAttack\r
+#               Helmuth Breitenfellner <hbreitenf@vnet.imb.com>\r
+mmcc            5050/tcp   multimedia conference control tool\r
+mmcc            5050/udp   multimedia conference control tool\r
+rmonitor_secure 5145/tcp\r
+rmonitor_secure 5145/udp\r
+aol             5190/tcp   America-Online\r
+aol             5190/udp   America-Online\r
+#                          Marty Lyons <marty@aol.com>\r
+padl2sim        5236/tcp\r
+padl2sim        5236/udp\r
+hacl-hb         5300/tcp        # HA cluster heartbeat\r
+hacl-hb         5300/udp        # HA cluster heartbeat\r
+hacl-gs         5301/tcp        # HA cluster general services\r
+hacl-gs         5301/udp        # HA cluster general services\r
+hacl-cfg        5302/tcp        # HA cluster configuration\r
+hacl-cfg        5302/udp        # HA cluster configuration\r
+hacl-probe      5303/tcp        # HA cluster probing\r
+hacl-probe      5303/udp        # HA cluster probing\r
+hacl-local      5304/tcp\r
+hacl-local      5304/udp\r
+hacl-test       5305/tcp\r
+hacl-test       5305/udp\r
+#                               Eric Soderberg <seric@hposl102.cup.hp>\r
+x11             6000-6063/tcp   X Window System\r
+x11             6000-6063/udp   X Window System\r
+#               Stephen Gildea <gildea@expo.lcs.mit.edu>\r
+sub-process     6111/tcp   HP SoftBench Sub-Process Control\r
+sub-process     6111/udp   HP SoftBench Sub-Process Control\r
+meta-corp       6141/tcp   Meta Corporation License Manager\r
+meta-corp       6141/udp   Meta Corporation License Manager\r
+#                          Osamu Masuda <--none--->\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 54]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+aspentec-lm     6142/tcp   Aspen Technology License Manager\r
+aspentec-lm     6142/udp   Aspen Technology License Manager\r
+#                          Kevin Massey <massey@aspentec.com>\r
+watershed-lm    6143/tcp   Watershed License Manager\r
+watershed-lm    6143/udp   Watershed License Manager\r
+#                          David Ferrero <david@zion.com>\r
+statsci1-lm     6144/tcp   StatSci License Manager - 1\r
+statsci1-lm     6144/udp   StatSci License Manager - 1\r
+statsci2-lm     6145/tcp   StatSci License Manager - 2\r
+statsci2-lm     6145/udp   StatSci License Manager - 2\r
+#                          Scott Blachowicz <scott@statsci.com>\r
+lonewolf-lm     6146/tcp   Lone Wolf Systems License Manager\r
+lonewolf-lm     6146/udp   Lone Wolf Systems License Manager\r
+#                          Dan Klein <dvk@lonewolf.com>\r
+montage-lm      6147/tcp   Montage License Manager\r
+montage-lm      6147/udp   Montage License Manager\r
+#                          Michael Ubell <michael@montage.com>\r
+xdsxdm          6558/udp\r
+xdsxdm          6558/tcp\r
+afs3-fileserver 7000/tcp   file server itself\r
+afs3-fileserver 7000/udp   file server itself\r
+afs3-callback   7001/tcp   callbacks to cache managers\r
+afs3-callback   7001/udp   callbacks to cache managers\r
+afs3-prserver   7002/tcp   users & groups database\r
+afs3-prserver   7002/udp   users & groups database\r
+afs3-vlserver   7003/tcp   volume location database\r
+afs3-vlserver   7003/udp   volume location database\r
+afs3-kaserver   7004/tcp   AFS/Kerberos authentication service\r
+afs3-kaserver   7004/udp   AFS/Kerberos authentication service\r
+afs3-volser     7005/tcp   volume managment server\r
+afs3-volser     7005/udp   volume managment server\r
+afs3-errors     7006/tcp   error interpretation service\r
+afs3-errors     7006/udp   error interpretation service\r
+afs3-bos        7007/tcp   basic overseer process\r
+afs3-bos        7007/udp   basic overseer process\r
+afs3-update     7008/tcp   server-to-server updater\r
+afs3-update     7008/udp   server-to-server updater\r
+afs3-rmtsys     7009/tcp   remote cache manager service\r
+afs3-rmtsys     7009/udp   remote cache manager service\r
+ups-onlinet     7010/tcp   onlinet uninterruptable power supplies\r
+ups-onlinet     7010/udp   onlinet uninterruptable power supplies\r
+#                          Brian Hammill <hamill@dolphin.exide.com>\r
+font-service    7100/tcp   X Font Service\r
+font-service    7100/udp   X Font Service\r
+#                          Stephen Gildea <gildea@expo.lcs.mit.edu>\r
+fodms           7200/tcp   FODMS FLIP\r
+fodms           7200/udp   FODMS FLIP\r
+#           David Anthony <anthony@power.amasd.anatcp.rockwell.com>\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 55]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+man             9535/tcp\r
+man             9535/udp\r
+isode-dua       17007/tcp\r
+isode-dua       17007/udp\r
+\r
+REFERENCES\r
+\r
+[RFC768] Postel, J., "User Datagram Protocol", STD 6, RFC 768,\r
+         USC/Information Sciences Institute, August 1980.\r
+\r
+[RFC793] Postel, J., ed., "Transmission Control Protocol - DARPA\r
+         Internet Program Protocol Specification", STD 7, RFC 793,\r
+         USC/Information Sciences Institute, September 1981.\r
+\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 56]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+INTERNET MULTICAST ADDRESSES\r
+\r
+Host Extensions for IP Multicasting [RFC1112] specifies the\r
+extensions required of a host implementation of the Internet Protocol\r
+(IP) to support multicasting.  Current addresses are listed below.\r
+\r
+224.0.0.0  Base Address (Reserved)                   [RFC1112,JBP]\r
+224.0.0.1  All Systems on this Subnet                [RFC1112,JBP]\r
+224.0.0.2  All Routers on this Subnet                        [JBP]\r
+224.0.0.3  Unassigned                                        [JBP]\r
+224.0.0.4  DVMRP    Routers                          [RFC1075,JBP]\r
+224.0.0.5  OSPFIGP  OSPFIGP All Routers             [RFC1583,JXM1]\r
+224.0.0.6  OSPFIGP  OSPFIGP Designated Routers      [RFC1583,JXM1]\r
+224.0.0.7  ST Routers                               [RFC1190,KS14]\r
+224.0.0.8  ST Hosts                                 [RFC1190,KS14]\r
+224.0.0.9  RIP2 Routers                                    [GSM11]\r
+224.0.0.10 IGRP Routers                           [Dino Farinacci]\r
+224.0.0.11 Mobile-Agents                            [Bill Simpson]\r
+224.0.0.12-224.0.0.255 Unassigned                            [JBP]\r
+\r
+224.0.1.0  VMTP Managers Group                      [RFC1045,DRC3]\r
+224.0.1.1  NTP      Network Time Protocol           [RFC1119,DLM1]\r
+224.0.1.2  SGI-Dogfight                                      [AXC]\r
+224.0.1.3  Rwhod                                             [SXD]\r
+224.0.1.4  VNP                                              [DRC3]\r
+224.0.1.5  Artificial Horizons - Aviator                     [BXF]\r
+224.0.1.6  NSS - Name Service Server                        [BXS2]\r
+224.0.1.7  AUDIONEWS - Audio News Multicast                 [MXF2]\r
+224.0.1.8  SUN NIS+ Information Service                     [CXM3]\r
+224.0.1.9  MTP Multicast Transport Protocol                  [SXA]\r
+224.0.1.10 IETF-1-LOW-AUDIO                                  [SC3]\r
+224.0.1.11 IETF-1-AUDIO                                      [SC3]\r
+224.0.1.12 IETF-1-VIDEO                                      [SC3]\r
+224.0.1.13 IETF-2-LOW-AUDIO                                  [SC3]\r
+224.0.1.14 IETF-2-AUDIO                                      [SC3]\r
+224.0.1.15 IETF-2-VIDEO                                      [SC3]\r
+224.0.1.16 MUSIC-SERVICE                        [Guido van Rossum]\r
+224.0.1.17 SEANET-TELEMETRY                        [Andrew Maffei]\r
+224.0.1.18 SEANET-IMAGE                            [Andrew Maffei]\r
+224.0.1.19 MLOADD                                         [Braden]\r
+224.0.1.20 any private experiment                            [JBP]\r
+224.0.1.21 DVMRP on MOSPF                               [John Moy]\r
+224.0.1.22 SVRLOC                               <veizades@ftp.com>\r
+224.0.1.23 XINGTV                                 <hgxing@aol.com>\r
+224.0.1.24 microsoft-ds                    <arnoldm@microsoft.com>\r
+224.0.1.25 nbc-pro                      <bloomer@birch.crd.ge.com>\r
+224.0.1.26 nbc-pfn                      <bloomer@birch.crd.ge.com>\r
+224.0.1.27-224.0.1.255  Unassigned                           [JBP]\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 57]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+224.0.2.1  "rwho" Group (BSD) (unofficial)                   [JBP]\r
+224.0.2.2  SUN RPC PMAPPROC_CALLIT                          [BXE1]\r
+\r
+224.0.3.000-224.0.3.255 RFE Generic Service                 [DXS3]\r
+224.0.4.000-224.0.4.255 RFE Individual Conferences          [DXS3]\r
+224.0.5.000-224.0.5.127 CDPD Groups                  [Bob Brenner]\r
+224.0.5.128-224.0.5.255 Unassigned                          [IANA]\r
+224.0.6.000-224.0.6.127 Cornell ISIS Project           [Tim Clark]\r
+224.0.6.128-224.0.6.255 Unassigned                          [IANA]\r
+\r
+224.1.0.0-224.1.255.255  ST Multicast Groups        [RFC1190,KS14]\r
+224.2.0.0-224.2.255.255  Multimedia Conference Calls         [SC3]\r
+\r
+224.252.0.0-224.255.255.255 DIS transient groups     [Joel Snyder]\r
+\r
+232.0.0.0-232.255.255.255  VMTP transient groups    [RFC1045,DRC3]\r
+\r
+These addresses are listed in the Domain Name Service under MCAST.NET\r
+and 224.IN-ADDR.ARPA.\r
+\r
+Note that when used on an Ethernet or IEEE 802 network, the 23\r
+low-order bits of the IP Multicast address are placed in the low-order\r
+23 bits of the Ethernet or IEEE 802 net multicast address\r
+1.0.94.0.0.0.  See the next section on "IANA ETHERNET ADDRESS BLOCK".\r
+\r
+REFERENCES\r
+\r
+[RFC1045] Cheriton, D., "VMTP: Versatile Message Transaction\r
+          Protocol Specification", RFC 1045, Stanford University,\r
+          February 1988.\r
+\r
+[RFC1075] Waitzman, D., C. Partridge, and S. Deering "Distance Vector\r
+          Multicast Routing Protocol", RFC-1075, BBN STC, Stanford\r
+          University, November 1988.\r
+\r
+[RFC1112] Deering, S., "Host Extensions for IP Multicasting",\r
+          STD 5, RFC 1112, Stanford University, August 1989.\r
+\r
+[RFC1119] Mills, D., "Network Time Protocol (Version 1), Specification\r
+          and Implementation", STD 12, RFC 1119, University of\r
+          Delaware, July 1988.\r
+\r
+[RFC1190] Topolcic, C., Editor, "Experimental Internet Stream\r
+          Protocol, Version 2 (ST-II)", RFC 1190, CIP Working Group,\r
+          October 1990.\r
+\r
+[RFC1583] Moy, J., "The OSPF Specification", RFC 1583, Proteon,\r
+          March 1994.\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 58]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PEOPLE\r
+\r
+<arnoldm@microsoft.com>\r
+\r
+[AXC] Andrew Cherenson <arc@SGI.COM>\r
+\r
+[Bob Brenner]\r
+\r
+<bloomer@birch.crd.ge.com>\r
+\r
+[Braden] Bob Braden <braden@isi.edu\r
+\r
+[BXE1] Brendan Eic <brendan@illyria.wpd.sgi.com>\r
+\r
+[BXF] Bruce Factor <ahi!bigapple!bruce@uunet.UU.NET>\r
+\r
+[BXS2] Bill Schilit <schilit@parc.xerox.com>\r
+\r
+[CXM3] Chuck McManis <cmcmanis@sun.com>\r
+\r
+[Tim Clark]\r
+\r
+[DLM1] David Mills <Mills@HUEY.UDEL.EDU>\r
+\r
+[DRC3] Dave Cheriton <cheriton@PESCADERO.STANFORD.EDU>\r
+\r
+[DXS3] Daniel Steinber <Daniel.Steinberg@Eng.Sun.COM>\r
+\r
+[Dino Farinacci]\r
+\r
+[GSM11] Gary S. Malkin <GMALKIN@XYLOGICS.COM>\r
+\r
+<hgxing@aol.com>\r
+\r
+[IANA] IANA <iana@isi.edu>\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[JXM1] Jim Miner <miner@star.com>\r
+\r
+[KS14] <mystery contact>\r
+\r
+[Andrew Maffei]\r
+\r
+[John Moy] John Moy <jmoy@PROTEON.COM>\r
+\r
+[MXF2] Martin Forssen <maf@dtek.chalmers.se>\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 59]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[Guido van Rossum]\r
+\r
+[SC3] Steve Casner <casner@isi.edu>\r
+\r
+[Joel Snyder]\r
+\r
+[SXA] Susie Armstrong <Armstrong.wbst128@XEROX.COM>\r
+\r
+[SXD] Steve Deering <deering@PARC.XEROX.COM>\r
+\r
+<veizades@ftp.com>\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/multicast-addresses\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 60]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+SUN RPC NUMBERS\r
+\r
+\r
+To obtain SUN Remote Procedure Call (RPC) numbers send an e-mail\r
+request to "rpc@sun.com".\r
+\r
+The RPC port management service ('portmap' in SunOS versions less than\r
+5.0 and 'rpcbind' in SunOS versions greater than 5.0) "registers" the\r
+IP port number that is allocated to a particular service when that\r
+service is created. It does not allocate ports on behalf of those\r
+services.\r
+\r
+For an exact specification of the semantics refer to the source code\r
+of svcudp_create() and svctcp_create() in the archives.  In short\r
+however is that these interfaces, and svc_tli_create their Transport\r
+Independent RPC equivalent, take either a user specified port number\r
+or RPC_ANY (-1) which effectively means "I don't care."  In the "I\r
+don't care" case the create code simply calls socket(2) or t_open(3n)\r
+which allocates an IP port based on the rules:\r
+\r
+        if euid of the requesting process is 0 (i.e., root)\r
+                allocate the next available port number in the\r
+                reserved port range.\r
+        else\r
+                allocate the next available port in the non-reserved\r
+                range.\r
+\r
+Port numbers count up sequentially.\r
+\r
+Can a port that is "assigned" can be used when the assignee's service\r
+is not present?  Say port 501 is assigned to the "jeans" service.  On\r
+a machine that does not have the "jeans" service, nor has any clients\r
+that might be expecting to use it, is port 501 available for other\r
+uses?  Any dynamic allocation process, like the portmapper, that\r
+chooses the next unused port might allocate port 501 dynamically to a\r
+process that asked for a "I don't care" port.  So any dynamic\r
+allocation scheme may pick an unused port that happened to correspond\r
+to a port number that had been "assigned" but was currently unused.\r
+\r
+While it might be desirable, it is impossible to guarantee that any\r
+unused port, even though officially assigned to a service, is not\r
+picked by a dynamic allocator since such an assignment might occur\r
+long after the delivery of the system into a site that doesn't watch\r
+for the latest list.\r
+\r
+There is the restriction that only "superuser" on BSD derived systems\r
+such as SunOS can bind to a port number that is less than 1024.  So\r
+programs have used this information in the past to identify whether or\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 61]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+not the service they were talking to was started by the superuser on\r
+the remote system.  Making this assumption is dangerous because not\r
+all system enforce this restriction.\r
+\r
+Sun RPC services use ports that are currently unused.  If someone\r
+noted that an RPC service was using port 781, it would be just as\r
+happy using port 891, or 951.  The service doesn't care what port it\r
+gets, remote clients will query the portmapper to ask it what port\r
+number was assigned to the service when it was started.  The key is\r
+that the port was not currently in use.  The only port that ONC/RPC\r
+must have is 111 its assigned port for the portmap service.\r
+\r
+The most common complaint comes when people put a new service on their\r
+system.  When they configure their systems they put the new service\r
+configuration commands at the end of their system startup scripts.\r
+During startup, several network services may be started. Those\r
+services that are ONC/RPC based just pick the next available port,\r
+those that have pre-assigned ports bind to their pre-assigned port.\r
+Clearly the correct sequence is to have all services that need a\r
+particular port to be started first (or if they are "latent" services\r
+that are started by inetd, to have inetd started).  Finally, the RPC\r
+services should be started as they will be assigned unused ports. (In\r
+the BSD networking code (which we use) the algorithm for picking\r
+ports is in the file in_pcb.c, function in_pcbbind().)\r
+\r
+Services should be started in this order:\r
+\r
+   a) Services that will "run" continuously and have an assigned\r
+      port. Note that this includes rpcbind (nee portmap) that has\r
+      port 111 assigned to it.\r
+\r
+   b) inetd - which will automatically create sockets for those\r
+      services that have reserved ports but only run on demand\r
+      (like finger)\r
+\r
+   c) RPC services - which will automatically pick unused ports and\r
+      maximize efficiency of the "IP Port" namespace.\r
+\r
+The include file /usr/include/netinet/in.h defines a constant\r
+IPPORT_RESERVED to be 1024.  The relevant text is:\r
+\r
+   /*\r
+    * Ports < IPPORT_RESERVED are reserved for\r
+    * privileged processes (e.g. root).\r
+    * Ports > IPPORT_USERRESERVED are reserved\r
+    * for servers, not necessarily privileged.\r
+    */\r
+   #define IPPORT_RESERVED         1024\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 62]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+   #define IPPORT_USERRESERVED     5000\r
+\r
+Portmap does not allocate ports, the kernel allocates ports.  The code\r
+that does this is part of nearly every UNIX system in the world (and\r
+since the BSD code is 'free' it is often the same code).  RPC services\r
+ask the kernel to allocate them a port by calling the "bind()" system\r
+call.  The parameter they pass is "INADDR_ANY" which means "allocate\r
+me any IP port you want".  The kernel does that by looking at all of\r
+the ports that are currently in use and picking one that is not\r
+currently used.  The number picked is either less that 1024 if the\r
+process is privledged, or greater than 1024 if the process is not\r
+privledged.  After the kernel has allocated a port, the service\r
+registers this allocation with portmap.  The portmapper is merely a\r
+registry of previously allocated ports.  Note "allocated" here is\r
+being used in the sense that they are used by an open socket, not\r
+assigned a well known name.\r
+\r
+The role of /etc/services is to provide an idea to people who are\r
+looking at network traffic as to where a packet may have originated\r
+from or is headed to.  For services like finger that have assigned\r
+ports, they can just hard code the port they want into their\r
+executable. (it isn't like it will change, and if they read it from\r
+/etc/services and someone had mistyped the port number it won't\r
+interoperate with clients anyway!)\r
+\r
+It is not practical to read the /etc/services file into the kernel to\r
+prevent it from giving out port numbers that are "pre-assigned", nor\r
+is it generally desirable since with the correct ordering of startup\r
+it is completely unneccesary.\r
+\r
+Editors Note: This information was supplied by Chuck McManis of Sun.\r
+\r
+[]\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/sun-rpc-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 63]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+IP OPTION NUMBERS\r
+\r
+The Internet Protocol (IP) has provision for optional header fields\r
+identified by an option type field.  Options 0 and 1 are exactly one\r
+octet which is their type field.  All other options have their one\r
+octet type field, followed by a one octet length field, followed by\r
+length-2 octets of option data.  The option type field is sub-divided\r
+into a one bit copied flag, a two bit class field, and a five bit\r
+option number.  These taken together form an eight bit value for the\r
+option type field.  IP options are commonly refered to by this value.\r
+\r
+\r
+Copy Class Number Value Name                            Reference\r
+---- ----- ------ ----- ------------------------------- ---------\r
+   0     0      0     0 EOOL   - End of Options List    [RFC791,JBP]\r
+   0     0      1     1 NOP    - No Operation           [RFC791,JBP]\r
+   1     0      2   130 SEC    - Security                  [RFC1108]\r
+   1     0      3   131 LSR    - Loose Source Route     [RFC791,JBP]\r
+   0     2      4    68 TS     - Time Stamp             [RFC791,JBP]\r
+   1     0      5   133 E-SEC  - Extended Security         [RFC1108]\r
+   1     0      6   134 CIPSO  - Commercial Security           [???]\r
+   0     0      7     7 RR     - Record Route           [RFC791,JBP]\r
+   1     0      8   136 SID    - Stream ID              [RFC791,JBP]\r
+   1     0      9   137 SSR    - Strict Source Route    [RFC791,JBP]\r
+   0     0     10    10 ZSU    - Experimental Measurement      [ZSu]\r
+   0     0     11    11 MTUP   - MTU Probe                 [RFC1191]\r
+   0     0     12    12 MTUR   - MTU Reply                 [RFC1191]\r
+   1     2     13   205 FINN   - Experimental Flow Control    [Finn]\r
+   1     0     14   142 VISA   - Expermental Access Control [Estrin]\r
+   0     0     15    15 ENCODE - ???                      [VerSteeg]\r
+   1     0     16   144 IMITD  - IMI Traffic Descriptor        [Lee]\r
+   1     0     17   145 EIP    - ???                       [RFC1358]\r
+   0     2     18    82 TR     - Traceroute                [RFC1393]\r
+   1     0     19   147 ADDEXT - Address Extension    [Ullmann IPv7]\r
+\r
+\r
+\r
+IP TIME TO LIVE PARAMETER\r
+\r
+The current recommended default time to live (TTL) for the\r
+Internet Protocol (IP) [45,105] is 64.\r
+\r
+\r
+IP TOS PARAMETERS\r
+\r
+This documents the default Type-of-Service values that are currently\r
+recommended for the most important Internet protocols.\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 64]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+TOS Value       Description                             Reference\r
+---------       --------------------------              ---------\r
+  0000          Default                                 [RFC1349]\r
+  0001          Minimize Monetary Cost                  [RFC1349]\r
+  0010          Maximize Reliability                    [RFC1349]\r
+  0100          Maximize Throughput                     [RFC1349]\r
+  1000          Minimize Delay                          [RFC1349]\r
+  1111          Maximize Security                       [RFC1455]\r
+\r
+The TOS value is used to indicate "better".  Only one TOS value or\r
+property can be requested in any one IP datagram.\r
+\r
+Generally, protocols which are involved in direct interaction with a\r
+human should select low delay, while data transfers which may involve\r
+large blocks of data are need high throughput.  Finally, high reliability\r
+is most important for datagram-based Internet management functions.\r
+\r
+Application protocols not included in these tables should be able to\r
+make appropriate choice of low delay (8 decimal, 1000 binary) or high\r
+throughput (4 decimal, 0100 binary).\r
+\r
+The following are recommended values for TOS:\r
+\r
+\r
+            ----- Type-of-Service Value -----\r
+\r
+Protocol           TOS Value\r
+\r
+TELNET (1)         1000                 (minimize delay)\r
+\r
+FTP\r
+  Control          1000                 (minimize delay)\r
+  Data (2)         0100                 (maximize throughput)\r
+\r
+TFTP               1000                 (minimize delay)\r
+\r
+SMTP (3)\r
+  Command phase    1000                 (minimize delay)\r
+  DATA phase       0100                 (maximize throughput)\r
+\r
+Domain Name Service\r
+  UDP Query        1000                 (minimize delay)\r
+  TCP Query        0000\r
+  Zone Transfer    0100                 (maximize throughput)\r
+\r
+NNTP               0001                 (minimize monetary cost)\r
+\r
+ICMP\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 65]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+  Errors           0000\r
+  Requests         0000 (4)\r
+  Responses        <same as request> (4)\r
+\r
+Any IGP            0010                 (maximize reliability)\r
+\r
+EGP                0000\r
+\r
+SNMP               0010                 (maximize reliability)\r
+\r
+BOOTP              0000\r
+\r
+Notes:\r
+\r
+(1) Includes all interactive user protocols (e.g., rlogin).\r
+\r
+(2) Includes all bulk data transfer protocols (e.g., rcp).\r
+\r
+(3) If the implementation does not support changing the TOS\r
+during the lifetime of the connection, then the\r
+recommended TOS on opening the connection is the default\r
+TOS (0000).\r
+\r
+(4) Although ICMP request messages are normally sent with\r
+the default TOS, there are sometimes good reasons why they\r
+would be sent with some other TOS value.  An ICMP\r
+response always uses the same TOS value as was used in the\r
+corresponding ICMP request message.\r
+\r
+An application may (at the request of the user) substitute\r
+0001 (minimize monetary cost) for any of the above values.\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC791] Postel, J., "Internet Protocol - DARPA Internet Program\r
+         Protocol Specification", STD 5, RFC 791, DARPA, September\r
+         1981.\r
+\r
+[RFC1108] Kent, S., "U.S. Department of Defense Security Options for\r
+          the Internet Protocol", RFC 1108, BBN Communications,\r
+          November 1991.\r
+\r
+[RFC1191] Mogul, J., and S. Deering, "Path MTU Discovery", RFC 1191,\r
+          DECWRL, Stanford University, November 1990.\r
+\r
+[RFC1349] Almquist, P., "Type of Service in the Internet Protocol\r
+          Suite", RFC 1349, Consultant, July 1992.\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 66]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC1358] Chapin, L., Chair, "Charter of the Internet Architecture\r
+          Board (IAB)", RFC 1358, Internet Architecture Board, August\r
+          1992.\r
+\r
+[RFC1393] Malkin, G., "Traceroute Using an IP Option", RFC 1393,\r
+          Xylogics, Inc., January 1993.\r
+\r
+[RFC1455] Eastlake, D., "Physical Link Security Type of Service",\r
+          RFC 1455, Digital Equipment Corporation, May 1993.\r
+\r
+[Ullmann IPv7]\r
+\r
+\r
+PEOPLE\r
+\r
+[Estrin] Deborah Estrin <Estrin@usc.edu>\r
+\r
+[Finn] Greg Finn <Finn@isi.edu>\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[Ullmann] Robert Ullmann <ariel@world.std.com>\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/ip-parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 67]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ICMP TYPE NUMBERS\r
+\r
+The Internet Control Message Protocol (ICMP) has many messages that\r
+are identified by a "type" field.\r
+\r
+Type    Name                                    Reference\r
+----    -------------------------               ---------\r
+  0     Echo Reply                               [RFC792]\r
+  1     Unassigned                                  [JBP]\r
+  2     Unassigned                                  [JBP]\r
+  3     Destination Unreachable                  [RFC792]\r
+  4     Source Quench                            [RFC792]\r
+  5     Redirect                                 [RFC792]\r
+  6     Alternate Host Address                      [JBP]\r
+  7     Unassigned                                  [JBP]\r
+  8     Echo                                     [RFC792]\r
+  9     Router Advertisement                    [RFC1256]\r
+ 10     Router Selection                        [RFC1256]\r
+ 11     Time Exceeded                            [RFC792]\r
+ 12     Parameter Problem                        [RFC792]\r
+ 13     Timestamp                                [RFC792]\r
+ 14     Timestamp Reply                          [RFC792]\r
+ 15     Information Request                      [RFC792]\r
+ 16     Information Reply                        [RFC792]\r
+ 17     Address Mask Request                     [RFC950]\r
+ 18     Address Mask Reply                       [RFC950]\r
+ 19     Reserved (for Security)                    [Solo]\r
+ 20-29  Reserved (for Robustness Experiment)        [ZSu]\r
+ 30     Traceroute                              [RFC1393]\r
+ 31     Datagram Conversion Error               [RFC1475]\r
+ 32     Mobile Host Redirect              [David Johnson]\r
+ 33     IPv6 Where-Are-You                 [Bill Simpson]\r
+ 34     IPv6 I-Am-Here                     [Bill Simpson]\r
+ 35     Mobile Registration Request        [Bill Simpson]\r
+ 36     Mobile Registration Reply          [Bill Simpson]\r
+ 37-255 Reserved                                    [JBP]\r
+\r
+Many of these ICMP types have a "code" field.  Here we list the types\r
+again with their assigned code fields.\r
+\r
+Type    Name                                    Reference\r
+----    -------------------------               ---------\r
+  0     Echo Reply                               [RFC792]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+  1     Unassigned                                  [JBP]\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 68]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+  2     Unassigned                                  [JBP]\r
+\r
+  3     Destination Unreachable                  [RFC792]\r
+\r
+        Codes\r
+            0  Net Unreachable\r
+            1  Host Unreachable\r
+            2  Protocol Unreachable\r
+            3  Port Unreachable\r
+            4  Fragmentation Needed and Don't Fragment was Set\r
+            5  Source Route Failed\r
+            6  Destination Network Unknown\r
+            7  Destination Host Unknown\r
+            8  Source Host Isolated\r
+            9  Communication with Destination Network is\r
+               Administratively Prohibited\r
+           10  Communication with Destination Host is\r
+               Administratively Prohibited\r
+           11  Destination Network Unreachable for Type of Service\r
+           12  Destination Host Unreachable for Type of Service\r
+\r
+  4     Source Quench                            [RFC792]\r
+        Codes\r
+            0  No Code\r
+\r
+  5     Redirect                                 [RFC792]\r
+\r
+        Codes\r
+            0  Redirect Datagram for the Network (or subnet)\r
+            1  Redirect Datagram for the Host\r
+            2  Redirect Datagram for the Type of Service and Network\r
+            3  Redirect Datagram for the Type of Service and Host\r
+\r
+  6     Alternate Host Address                      [JBP]\r
+\r
+        Codes\r
+            0  Alternate Address for Host\r
+\r
+  7     Unassigned                                  [JBP]\r
+\r
+  8     Echo                                     [RFC792]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+  9     Router Advertisement                    [RFC1256]\r
+\r
+        Codes\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 69]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+            0  No Code\r
+\r
+ 10     Router Selection                        [RFC1256]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+ 11     Time Exceeded                            [RFC792]\r
+\r
+        Codes\r
+            0  Time to Live exceeded in Transit\r
+            1  Fragment Reassembly Time Exceeded\r
+\r
+ 12     Parameter Problem                        [RFC792]\r
+\r
+        Codes\r
+            0  Pointer indicates the error\r
+            1  Missing a Required Option        [RFC1108]\r
+            2  Bad Length\r
+\r
+\r
+ 13     Timestamp                                [RFC792]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+ 14     Timestamp Reply                          [RFC792]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+ 15     Information Request                      [RFC792]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+ 16     Information Reply                        [RFC792]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+ 17     Address Mask Request                     [RFC950]\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+ 18     Address Mask Reply                       [RFC950]\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 70]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+        Codes\r
+            0  No Code\r
+\r
+ 19     Reserved (for Security)                    [Solo]\r
+\r
+ 20-29  Reserved (for Robustness Experiment)        [ZSu]\r
+\r
+ 30     Traceroute                              [RFC1393]\r
+\r
+ 31     Datagram Conversion Error               [RFC1475]\r
+\r
+ 32     Mobile Host Redirect              [David Johnson]\r
+\r
+ 33     IPv6 Where-Are-You                 [Bill Simpson]\r
+\r
+ 34     IPv6 I-Am-Here                     [Bill Simpson]\r
+\r
+ 35     Mobile Registration Request        [Bill Simpson]\r
+\r
+ 36     Mobile Registration Reply          [Bill Simpson]\r
+\r
+REFERENCES\r
+\r
+[RFC792] Postel, J., "Internet Control Message Protocol", STD 5,\r
+         RFC 792, USC/Information Sciences Institute, September 1981.\r
+\r
+[RFC950] Mogul, J., and J. Postel, "Internet Standard Subnetting\r
+         Procedure", STD 5, RFC 950, Stanford, USC/Information\r
+         Sciences Institute, August 1985.\r
+\r
+[RFC1108] Kent, S., "U.S. Department of Defense Security Options for\r
+          the Internet Protocol", RFC 1108, November 1991.\r
+\r
+[RFC1256] Deering, S., Editor, "ICMP Router Discovery Messages", RFC\r
+          1256, Xerox PARC, September 1991.\r
+\r
+[RFC1393] Malkin, G., "Traceroute Using an IP Option", RFC 1393,\r
+          Xylogics, Inc., January 1993.\r
+\r
+[RFC1475] Ullmann, R., "TP/IX: The Next Internet", RFC 1475, Process\r
+          Software Corporation, June 1993.\r
+\r
+\r
+PEOPLE\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[David Johnson]\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 71]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[Bill Simpson]  <Bill.Simpson@um.cc.umich.edu> September, 1994.\r
+\r
+[Solo]\r
+\r
+[ZSu] Zaw-Sing Su <ZSu@TSCA.ISTC.SRI.COM>\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/icmp-parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 72]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+TCP OPTION NUMBERS\r
+\r
+The Transmission Control Protocol (TCP) has provision for optional\r
+header fields identified by an option kind field.  Options 0 and 1 are\r
+exactly one octet which is their kind field.  All other options have\r
+their one octet kind field, followed by a one octet length field,\r
+followed by length-2 octets of option data.\r
+\r
+Kind   Length   Meaning                           Reference\r
+----   ------   -------------------------------   ---------\r
+  0        -    End of Option List                 [RFC793]\r
+  1        -    No-Operation                       [RFC793]\r
+  2        4    Maximum Segment Lifetime           [RFC793]\r
+  3        3    WSOPT - Window Scale              [RFC1323]\r
+  4        2    SACK Permitted                    [RFC1072]\r
+  5        N    SACK                              [RFC1072]\r
+  6        6    Echo (obsoleted by option 8)      [RFC1072]\r
+  7        6    Echo Reply (obsoleted by option 8)[RFC1072]\r
+  8       10    TSOPT - Time Stamp Option         [RFC1323]\r
+  9        2    Partial Order Connection Permitted[RFC1693]\r
+ 10        5    Partial Order Service Profile     [RFC1693]\r
+ 11             CC                                 [Braden]\r
+ 12             CC.NEW                             [Braden]\r
+ 13             CC.ECHO                            [Braden]\r
+ 14         3   TCP Alternate Checksum Request    [RFC1146]\r
+ 15         N   TCP Alternate Checksum Data       [RFC1146]\r
+ 16             Skeeter                           [Knowles]\r
+ 17             Bubba                             [Knowles]\r
+ 18         3   Trailer Checksum Option    [Subbu & Monroe]\r
+\r
+\r
+TCP ALTERNATE CHECKSUM NUMBERS\r
+\r
+\r
+Number  Description                     Reference\r
+------- ------------------------------- ----------\r
+   0    TCP Checksum                    [RFC-1146]\r
+   1    8-bit Fletchers's algorithm     [RFC-1146]\r
+   2    16-bit Fletchers's algorithm    [RFC-1146]\r
+   3    Redundant Checksum Avoidance    [Kay]\r
+\r
+\r
+REFERENCES\r
+\r
+[KAY] Kay, J. and Pasquale, J., "Measurement, Analysis, and\r
+      Improvement of UDP/IP Throughput for the DECstation 5000,"\r
+      Proceedings of the Winter 1993 Usenix Conference, January 1993\r
+      (available for anonymous FTP in\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 73]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+      ucsd.edu:/pub/csl/fastnet/fastnet.tar.Z). <jkay@ucsd.edu>\r
+\r
+[RFC793] Postel, J., "Transmission Control Protocol - DARPA Internet\r
+         Program Protocol Specification", STD 7, RFC 793, DARPA,\r
+         September 1981.\r
+\r
+[RFC1323] Jacobson, V., Braden, R., and D. Borman, "TCP Extensions for\r
+          High Performance", RFC 1323, LBL, ISI, Cray Research, May\r
+          1992.\r
+\r
+[RFC1072] Jacobson, V., and R. Braden, "TCP Extensions for Long-Delay\r
+          Paths", RFC 1072, LBL, ISI, October 1988.\r
+\r
+[RFC1693]  ?????\r
+\r
+[RFC1146] Zweig, J., and C. Partridge, "TCP Alternate Checksum\r
+          Options", RFC 1146, UIUC, BBN, March 1990.\r
+\r
+PEOPLE\r
+\r
+[Braden]  Bob Braden <braden@isi.edu>\r
+\r
+[Knowles] Stev Knowles <stev@ftp.com>\r
+\r
+[Kay] J. Kay <jkay@ucsd.edu>\r
+\r
+[Subbu & Monroe] <mystery contact>\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/tcp-parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 74]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+TELNET OPTIONS\r
+\r
+The Telnet Protocol has a number of options that may be negotiated.\r
+These options are listed here.  "Internet Official Protocol Standards"\r
+(STD 1) provides more detailed information.\r
+\r
+Options  Name                                              References\r
+-------  -----------------------                           ----------\r
+   0     Binary Transmission                             [RFC856,JBP]\r
+   1     Echo                                            [RFC857,JBP]\r
+   2     Reconnection                                  [NIC50005,JBP]\r
+   3     Suppress Go Ahead                               [RFC858,JBP]\r
+   4     Approx Message Size Negotiation               [ETHERNET,JBP]\r
+   5     Status                                          [RFC859,JBP]\r
+   6     Timing Mark                                     [RFC860,JBP]\r
+   7     Remote Controlled Trans and Echo                [RFC726,JBP]\r
+   8     Output Line Width                             [NIC50005,JBP]\r
+   9     Output Page Size                              [NIC50005,JBP]\r
+  10     Output Carriage-Return Disposition              [RFC652,JBP]\r
+  11     Output Horizontal Tab Stops                     [RFC653,JBP]\r
+  12     Output Horizontal Tab Disposition               [RFC654,JBP]\r
+  13     Output Formfeed Disposition                     [RFC655,JBP]\r
+  14     Output Vertical Tabstops                        [RFC656,JBP]\r
+  15     Output Vertical Tab Disposition                 [RFC657,JBP]\r
+  16     Output Linefeed Disposition                     [RFC657,JBP]\r
+  17     Extended ASCII                                  [RFC698,JBP]\r
+  18     Logout                                          [RFC727,MRC]\r
+  19     Byte Macro                                      [RFC735,JBP]\r
+  20     Data Entry Terminal                     [RFC1043,RFC732,JBP]\r
+  22     SUPDUP                                   [RFC736,RFC734,MRC]\r
+  22     SUPDUP Output                                   [RFC749,MRC]\r
+  23     Send Location                                  [RFC779,EAK1]\r
+  24     Terminal Type                                 [RFC1091,MS56]\r
+  25     End of Record                                   [RFC885,JBP]\r
+  26     TACACS User Identification                      [RFC927,BA4]\r
+  27     Output Marking                                  [RFC933,SXS]\r
+  28     Terminal Location Number                        [RFC946,RN6]\r
+  29     Telnet 3270 Regime                             [RFC1041,JXR]\r
+  30     X.3 PAD                                       [RFC1053,SL70]\r
+  31     Negotiate About Window Size                  [RFC1073,DW183]\r
+  32     Terminal Speed                                [RFC1079,CLH3]\r
+  33     Remote Flow Control                           [RFC1372,CLH3]\r
+  34     Linemode                                      [RFC1184,DB14]\r
+  35     X Display Location                            [RFC1096,GM23]\r
+  36     Environment Option                            [RFC1408,DB14]\r
+  37     Authentication Option                         [RFC1409,DB14]\r
+  38     Encryption Option                                     [DB14]\r
+  39     New Environment Option                        [RFC1572,DB14]\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 75]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+  40     TN3270E                                            [RFC1647]\r
+ 255     Extended-Options-List                           [RFC861,JBP]\r
+\r
+Telnet Authentication Types\r
+\r
+In [RFC1409], a list of authentication types is introduced.  Additions\r
+to the list are registerd by the IANA and documented here.\r
+\r
+Type       Description                  Reference\r
+  0        NULL                         [RFC1409]\r
+  1        KERBEROS_V4                  [RFC1409]\r
+  2        KERBEROS_V5                  [RFC1409]\r
+  3        SPX                          [RFC1409]\r
+  4-5      Unassigned\r
+  6        RSA                          [RFC1409]\r
+  7-9      Unassigned\r
+ 10        LOKI                         [RFC1409]\r
+ 11        SSA                          [Schoch]\r
+\r
+REFERENCES\r
+\r
+[ETHERNET] "The Ethernet, A Local Area Network: Data Link Layer and\r
+           Physical Layer Specification", AA-K759B-TK, Digital\r
+           Equipment Corporation, Maynard, MA.  Also as: "The\r
+           Ethernet - A Local Area Network", Version 1.0, Digital\r
+           Equipment Corporation, Intel Corporation, Xerox\r
+           Corporation, September 1980.  And: "The Ethernet, A Local\r
+           Area Network: Data Link Layer and Physical Layer\r
+           Specifications", Digital, Intel and Xerox, November 1982.\r
+           And: XEROX, "The Ethernet, A Local Area Network: Data Link\r
+           Layer and Physical Layer Specification", X3T51/80-50, Xerox\r
+           Corporation, Stamford, CT., October 1980.\r
+\r
+[NIC50005] DDN Protocol Handbook, "Telnet Reconnection Option",\r
+           "Telnet Output Line Width Option", "Telnet Output Page Size\r
+           Option", NIC 50005, December 1985.\r
+\r
+[RFC652] Crocker, D., "Telnet Output Carriage-Return Disposition\r
+         Option", RFC 652, UCLA-NMC, October 1974.\r
+\r
+[RFC653] Crocker, D., "Telnet Output Horizontal Tabstops Option",\r
+         RFC 653, UCLA-NMC, October 1974.\r
+\r
+[RFC654] Crocker, D., "Telnet Output Horizontal Tab Disposition\r
+         Option", RFC 654, UCLA-NMC, October 1974.\r
+\r
+[RFC655] Crocker, D., "Telnet Output Formfeed Disposition Option",\r
+         RFC 655, UCLA-NMC, October 1974.\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 76]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC656] Crocker, D., "Telnet Output Vertical Tabstops Option",\r
+         RFC 656, UCLA-NMC, October 1974.\r
+\r
+[RFC657] Crocker, D., "Telnet Output Vertical Tab Disposition Option",\r
+         RFC 657, UCLA-NMC, October 1974.\r
+\r
+[RFC658] Crocker, D., "Telnet Output Linefeed Disposition", RFC 658,\r
+         UCLA-NMC, October 1974.\r
+\r
+[RFC698] Tovar, "Telnet Extended ASCII Option", RFC 698, Stanford\r
+         University-AI, July 1975.\r
+\r
+[RFC726] Postel, J. and D. Crocker, "Remote Controlled Transmission\r
+         and Echoing Telnet Option", RFC 726, SRI-ARC, UC Irvine,\r
+         March 1977.\r
+\r
+[RFC727] Crispin, M., "Telnet Logout Option", RFC 727, Stanford\r
+         University-AI, April 1977.\r
+\r
+[RFC734] Crispin, M., "SUPDUP Protocol", RFC 734, Stanford,\r
+         October 1977.\r
+\r
+[RFC735] Crocker, D. and R. Gumpertz, "Revised Telnet Byte Marco\r
+         Option", RFC 735, Rand, CMU, November 1977.\r
+\r
+[RFC736] Crispin, M., "Telnet SUPDUP Option", Stanford University-AI,\r
+         RFC 736, Stanford, October 1977.\r
+\r
+[RFC749] Greenberg, B., "Telnet SUPDUP-OUTPUT Option", RFC 749,\r
+         MIT-Multics, September 1978.\r
+\r
+[RFC779] Killian, E., "Telnet Send-Location Option", RFC 779,\r
+         LLL, April 1981.\r
+\r
+[RFC856] Postel, J. and J. Reynolds, "Telnet Binary Transmission",\r
+         STD 27, RFC 856, USC/Information Sciences Institute, May\r
+         1983.\r
+\r
+[RFC857] Postel, J. and J. Reynolds, "Telnet Echo Option", STD 28, RFC\r
+         857, USC/Information Sciences Institute, May 1983.\r
+\r
+[RFC858] Postel, J. and J. Reynolds, "Telnet Suppress Go Ahead\r
+         Option", STD 29, RFC 858, USC/Information Sciences Institute,\r
+         May 1983.\r
+\r
+[RFC859] Postel, J. and J. Reynolds, "Telnet Status Option", STD 30,\r
+         RFC 859, USC/Information Sciences Institute, May 1983.\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 77]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC860] Postel, J. and J. Reynolds, "Telnet Timing Mark Option",\r
+         STD 31, RFC 860, USC/Information Sciences Institute, May\r
+         1983.\r
+\r
+[RFC861] Postel, J. and J. Reynolds, "Telnet Extended Options - List\r
+         Option", STD 32, RFC 861, USC/Information Sciences Institute,\r
+         May 1983.\r
+\r
+[RFC885] Postel, J., "Telnet End of Record Option", RFC 885,\r
+         USC/Information Sciences Institute, December 1983.\r
+\r
+[RFC927] Anderson, B., "TACACS User Identification Telnet Option",\r
+         RFC 927, BBN, December 1984.\r
+\r
+[RFC933] Silverman, S., "Output Marking Telnet Option", RFC 933,\r
+         MITRE, January 1985.\r
+\r
+[RFC946] Nedved, R., "Telnet Terminal Location Number Option",\r
+         RFC 946, Carnegie-Mellon University, May 1985.\r
+\r
+[RDC1041] Rekhter, J., "Telnet 3270 Regime Option", RFC 1041,\r
+          IBM, January 1988.\r
+\r
+[RFC1043] Yasuda, A., and T. Thompson, "TELNET Data Entry Terminal\r
+          Option DODIIS Implementation", RFC 1043, DIA, February 1988.\r
+\r
+[RFC1053] Levy, S., and T. Jacobson, "Telnet X.3 PAD Option",\r
+          RFC 1053, Minnesota Supercomputer Center, April 1988.\r
+\r
+[RFC1073] Waitzman, D., "Telnet Window Size Option", RFC 1073,\r
+          BBN STC, October, 1988.\r
+\r
+[RFC1079] Hedrick, C., "Telnet Terminal Speed Option", RFC 1079,\r
+          Rutgers University, December 1988.\r
+\r
+[RFC1091] VanBokkelen, J., "Telnet Terminal Type Option",\r
+          RFC 1091, FTP Software, Inc., February 1989.\r
+\r
+[RFC1096] Marcy, G., "Telnet X Display Location Option", RFC 1096,\r
+          Carnegie Mellon University, March 1989.\r
+\r
+[RFC1184] Borman, D., Editor, "Telnet Linemode Option",\r
+          RFC 1184, Cray Research, Inc., October 1990.\r
+\r
+[RFC1372] Hedrick, C., and D. Borman, "Telnet Remote Flow Control\r
+         Option", RFC 1372, Rutgers University, Cray Research, Inc.,\r
+         October 1992.\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 78]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC1408] Borman, D., Editor, "Telnet Environment Option", RFC 1408,\r
+          Cray Research, Inc., January 1993.\r
+\r
+[RFC1409] Borman, D., Editor, "Telnet Authentication Option", RFC\r
+          1409, Cray Research, Inc., January 1993.\r
+\r
+[RFC1572] Alexander, S., Editor, "Telnet Environment Option", RFC1572,\r
+          Lachman Technology, Inc., January 1994.\r
+\r
+[RFC1647] Kelly, B., "TN3270 Enhancements", RFC1647, Auburn\r
+          University, July 1994.\r
+\r
+\r
+PEOPLE\r
+\r
+[BA4] Brian Anderson <baanders@CCQ.BBN.CO>\r
+\r
+[CLH3] Charles Hedrick  <HEDRICK@ARAMIS.RUTGERS.EDU>\r
+\r
+[DB14] Dave Borman <dab@CRAY.COM>\r
+\r
+[DW183] David Waitzman <dwaitzman@BBN.COM>\r
+\r
+[EAK4] Earl Kill <EAK@MORDOR.S1.GOV>\r
+\r
+[GM23] Glenn Marcy  <Glenn.Marcy@A.CS.CMU.EDU>\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[MRC] Mark Crispin <MRC@WSMR-SIMTEL20.ARMY.MIL>\r
+\r
+[MS56] Marvin Solomon <solomon@CS.WISC.EDU>\r
+\r
+[RN6] Rudy Nedved <Rudy.Nedved@CMU-CS-A.>\r
+\r
+[Schoch]  Steven Schoch <schoch@sheba.arc.nasa.gov>\r
+\r
+[SL70] Stuart Levy <slevy@UC.MSC.UMN.EDU>\r
+\r
+[SXS] Steve Silverman <Blankert@MITRE-GATEWAY.ORG>\r
+\r
+[YXR] Yakov Rekhter  <Yakov@IBM.COM>\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/telnet-options\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 79]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+DOMAIN NAME SYSTEM PARAMETERS\r
+\r
+The Internet Domain Naming System (DOMAIN) includes several\r
+parameters.  These are documented in [RFC1034] and [RFC1035].  The\r
+CLASS parameter is listed here.  The per CLASS parameters are defined\r
+in separate RFCs as indicated.\r
+\r
+Domain System Parameters:\r
+\r
+Decimal   Name                                          References\r
+--------  ----                                          ----------\r
+       0  Reserved                                           [PM1]\r
+       1  Internet (IN)                              [RFC1034,PM1]\r
+       2  Unassigned                                         [PM1]\r
+       3  Chaos (CH)                                         [PM1]\r
+       4  Hessoid (HS)                                       [PM1]\r
+ 5-65534  Unassigned                                         [PM1]\r
+   65535  Reserved                                           [PM1]\r
+\r
+In the Internet (IN) class the following TYPEs and QTYPEs are defined:\r
+\r
+TYPE            value and meaning\r
+\r
+A               1 a host address                         [RFC1035]\r
+NS              2 an authoritative name server           [RFC1035]\r
+MD              3 a mail destination (Obsolete - use MX) [RFC1035]\r
+MF              4 a mail forwarder (Obsolete - use MX)   [RFC1035]\r
+CNAME           5 the canonical name for an alias        [RFC1035]\r
+SOA             6 marks the start of a zone of authority [RFC1035]\r
+MB              7 a mailbox domain name (EXPERIMENTAL)   [RFC1035]\r
+MG              8 a mail group member (EXPERIMENTAL)     [RFC1035]\r
+MR              9 a mail rename domain name (EXPERIMENTAL)[RFC1035]\r
+NULL            10 a null RR (EXPERIMENTAL)              [RFC1035]\r
+WKS             11 a well known service description      [RFC1035]\r
+PTR             12 a domain name pointer                 [RFC1035]\r
+HINFO           13 host information                      [RFC1035]\r
+MINFO           14 mailbox or mail list information      [RFC1035]\r
+MX              15 mail exchange                         [RFC1035]\r
+TXT             16 text strings                          [RFC1035]\r
+\r
+RP              17 for Responsible Person                [RFC1183]\r
+AFSDB           18 for AFS Data Base location            [RFC1183]\r
+X25             19 for X.25 PSDN address                 [RFC1183]\r
+ISDN            20 for ISDN address                      [RFC1183]\r
+RT              21 for Route Through                     [RFC1183]\r
+\r
+NSAP            22 for NSAP address, NSAP style A record [RFC1348]\r
+NSAP-PTR        23 for domain name pointer, NSAP style   [RFC1348]\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 80]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+SIG             24 for security signature        [Donald Eastlake]\r
+KEY             25 for security key              [Donald Eastlake]\r
+\r
+PX              26 X.400 mail mapping information        [RFC1664]\r
+\r
+GPOS            27 Geographical Position           [Craig Farrell]\r
+\r
+AAAA            28 IP6 Address                     [Susan Thomson]\r
+\r
+AXFR            252 transfer of an entire zone           [RFC1035]\r
+MAILB           253 mailbox-related RRs (MB, MG or MR)   [RFC1035]\r
+MAILA           254 mail agent RRs (Obsolete - see MX)   [RFC1035]\r
+*               255 A request for all records            [RFC1035]\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC1034] Mockapetris, P., "Domain Names - Concepts and\r
+          Facilities", STD 13, RFC 1034, USC/Information Sciences\r
+          Institute, November 1987.\r
+\r
+[RFC1035] Mockapetris, P., "Domain Names - Implementation and\r
+          Specification", STD 13, RFC 1035, USC/Information Sciences\r
+          Institute, November 1987.\r
+\r
+[RFC1183] Everhart, C., Mamakos, L., Ullmann, R., and P. Mockapetris,\r
+          Editors, "New DNS RR Definitions", RFC 1183, Transarc,\r
+          University of Maryland, Prime Computer, USC/Information\r
+          Sciences Institute, October 1990.\r
+\r
+[RFC1348] Manning, B., "DNS NSAP RRs", RFC 1348, Rice University,\r
+          July 1992.\r
+\r
+[RFC1664] Allocchio, C., Bonito, A., Cole, B., Giordano, S., and R.\r
+          Hagens, "Using the Internet DNS to Distribute RFC1327 Mail\r
+          Address Mapping Tables", GARR-Italy, Cisco Systems Inc.,\r
+          Centro Svizzero Calcolo Scientifico, Advanced Network &\r
+          Services, August 1994.\r
+\r
+\r
+PEOPLE\r
+\r
+[Susan Thomson] Susan Thomson <set@swift.bellcore.com>\r
+\r
+[PM1] Paul Mockapetris <pvm@isi.edu>\r
+\r
+[Donald Eastlake] Donald E. Eastlake, III <dee@ranger.enet.dec.com>\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 81]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[Craig Farrell]\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/dns-parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 82]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+MAIL ENCODING HEADER FIELD KEYWORDS\r
+\r
+\r
+[RFC1505] specifies an initial list of keywords for the experimental\r
+encoding header field (EHF-MAIL), and provides that additional\r
+keywords may be registered with the IANA.\r
+\r
+\r
+Keyword         Description                             Reference\r
+_______         ___________                          ____________\r
+\r
+EDIFACT         EDIFACT format                          [RFC1505]\r
+EDI-X12         EDI X12 format                         [ANSI-X12]\r
+EVFU            FORTRAN format                          [RFC1505]\r
+FS              File System format                      [RFC1505]\r
+Hex             Hex binary format                       [RFC1505]\r
+LZJU90          LZJU90 format                           [RFC1505]\r
+LZW             LZW format                              [RFC1505]\r
+Message         Encapsulated Message                     [RFC822]\r
+PEM, PEM-Clear  Privacy Enhanced Mail                   [RFC1421]\r
+PGP             Pretty Good Privacy                     [RFC1505]\r
+Postscript      Postscript format                    [POSTSCRIPT]\r
+Shar            Shell Archive format                    [RFC1505]\r
+Signature       Signature                               [RFC1505]\r
+Tar             Tar format                              [RFC1505]\r
+Text            Text                                   [IS-10646]\r
+uuencode        uuencode format                         [RFC1505]\r
+URL             external URL-reference                  [RFC1505]\r
+\r
+\r
+\r
+MAIL ENCRYPTION TYPES\r
+\r
+\r
+[RFC822] specifies that Encryption Types for mail may be assigned.\r
+There are currently no RFC 822 encryption types assigned.  Please use\r
+instead the Mail Privacy procedures defined in [RFC1421, RFC1422,\r
+RFC1423].\r
+\r
+\r
+ESMTP MAIL KEYWORDS\r
+\r
+\r
+[RFC1651] specifies that extension to SMTP can be identified with\r
+keywords.\r
+\r
+\r
+Keywords        Description                              Reference\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 83]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+------------    --------------------------------         ---------\r
+SEND            Send as mail                              [RFC821]\r
+SOML            Send as mail or terminal                  [RFC821]\r
+SAML            Send as mail and terminal                 [RFC821]\r
+EXPN            Expand the mailing list                   [RFC821]\r
+HELP            Supply helpful information                [RFC821]\r
+TURN            Turn the operation around                 [RFC821]\r
+8BITMIME        Use 8-bit data                           [RFC1652]\r
+SIZE            Message size declaration                 [RFC1653]\r
+VERB            Verbose                              [Eric Allman]\r
+ONEX            One message transaction only         [Eric Allman]\r
+\r
+\r
+\r
+MAIL EXTENSION TYPES\r
+\r
+\r
+The Simple Mail Transfer Protocol [RFC821] specifies a set of\r
+commands or services for mail transfer.  A general procedure for\r
+extending the set of services is defined in [RFC1651].  The set of\r
+service extensions is listed here.\r
+\r
+\r
+Service Ext   EHLO Keyword Parameters Verb       Reference\r
+-----------   ------------ ---------- ---------- ---------\r
+Send             SEND         none       SEND     [RFC821]\r
+Send or Mail     SOML         none       SOML     [RFC821]\r
+Send and Mail    SAML         none       SAML     [RFC821]\r
+Expand           EXPN         none       EXPN     [RFC821]\r
+Help             HELP         none       HELP     [RFC821]\r
+Turn             TURN         none       TURN     [RFC821]\r
+8 Bit MIME       8BITMIME     none       none    [RFC1652]\r
+Size             SIZE         number     none    [RFC1653]\r
+\r
+\r
+\r
+MAIL SYSTEM NAMES\r
+\r
+\r
+In some places, an identification of other mail systems is used.\r
+\r
+One of these is in "The COSINE and Internet X.500 Schema" (section\r
+9.3.18) [RFC1274].  The mail system names listed here are used as the\r
+legal values in that schema under the "otherMailbox" attribute\r
+"mailboxType" type (which must be a PrintableString).\r
+\r
+Another place is in "Mapping between X.400(1988) / ISO 10021 and RFC\r
+822" (section 4.2.2) [RFC1327].  The names listed here are used as\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 84]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+the legal values in that schema under the "std-or-address" attribute\r
+"registered-dd-type" type (which must be a "key-string").\r
+\r
+Note that key-string = <a-z, A-Z, 0-9, and "-" >.\r
+\r
+\r
+Mail System Name        Description                     Reference\r
+----------------        ------------------------------- ---------\r
+mcimail                 MCI Mail\r
+\r
+\r
+\r
+MAIL TRANSMISSION TYPES\r
+\r
+\r
+The Simple Mail Transfer Protocol [RFC821] and the Standard for the\r
+Format of ARPA Internet Text Messages [RFC822] specify that a set of\r
+"Received" lines will be prepended to the headers of electronic mail\r
+messages as they are transported through the Internet.  These received\r
+line may optionally include either or both a "via" phrase and/or a\r
+"with" phrase.  The legal values for the phrases are listed here.  The\r
+via phrase is intended to indicate the link or physical medium over\r
+which the message was transferred.  The with phrase is intended to\r
+indicate the protocol or logical process that was used to transfer the\r
+message.\r
+\r
+\r
+VIA link types  Description                             Reference\r
+--------------  ----------------------------            ---------\r
+UUCP            Unix-to-Unix Copy Program                   [???]\r
+\r
+\r
+WITH protocol types  Description                        Reference\r
+-------------------  ----------------------------       ---------\r
+SMTP                 Simple Mail Transfer Protocol       [RFC821]\r
+ESMTP                SMTP with Service Extensions       [RFC1651]\r
+\r
+\r
+REFERENCES\r
+\r
+\r
+[ANSI-X12]\r
+\r
+[POSTSCRIPT] Adobe Systems Inc., "PostScript Langpuage Reference\r
+Manual", 2nd Edition, 2nd Printing, January 1991.\r
+\r
+[IS-10646]\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 85]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC821] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821,\r
+         USC/Information Sciences Institute, August 1982.\r
+\r
+[RFC822] Crocker, D., "Standard for the Format of ARPA-Internet Text\r
+         Messages", STD 11, RFC 822, UDEL, August 1982.\r
+\r
+[RFC1274] Barker, P., and S. Kille, "The COSINE and Internet X.500\r
+          Schema", RFC 1274, University College London, November 1991.\r
+\r
+[RFC1327] Hardcastle-Kille, S., "Mapping between X.400(1988) / ISO\r
+          10021 and RFC 822", RFC 1327, University College London,\r
+          May 1992.\r
+\r
+[RFC1421] Linn, J., "Privacy Enhancement for Internet Electronic\r
+          Mail: Part I: Message Encipherment and Authentication\r
+          Procedures", RFC 1421, IAB IRTF PSRG, IETF PEM WG,\r
+          February 1993.\r
+\r
+[RFC1422] Kent, S., "Privacy Enhancement for Internet\r
+          Electronic Mail: Part II -- Certificate-Based Key\r
+          Management", BBN, IAB IRTF PSRG, IETF PEM, February 1993.\r
+\r
+[RFC1423] Balenson, D., "Privacy Enhancement for Internet Electronic\r
+          Mail: Part III -- Algorithms, Modes, and Identifiers",\r
+          RFC 1423, TIS, IAB IRTF PSRG, IETF PEM WG, February 1993.\r
+\r
+[RFC1505] Costanzo, A., Robinson, D., and R. Ullmann, "Encoding Header\r
+          Field for Internet Messages", RFC 1505, AKC Consulting,\r
+          Computervision Corporation, August 1993.\r
+\r
+[RFC1651] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D.\r
+          Crocker, "SMTP Service Extensions", RFC 1651, MCI, Innosoft,\r
+          Dover Beach Consulting, Inc., Network Management Associates,\r
+          Inc., Silicon Graphics, Inc., July 1994.\r
+\r
+[RFC1652] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D.\r
+          Crocker, "SMTP Service Extension for 8bit-MIMEtransport",\r
+          RFC 1652, MCI, Innosoft, Dover Beach Consulting, Inc.,\r
+          Network Management Associates, Inc., Silicon Graphics, Inc.,\r
+          July 1994.\r
+\r
+[RFC1653] Klensin, J., Freed, N., and K. Moore, "SMTP Service\r
+          Extension for Message Size Declaration", RFC 1653,\r
+          MCI, Innosoft, University of Tennessee, July 1994.\r
+\r
+\r
+PEOPLE\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 86]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[Eric Allman]\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/mail-parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 87]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+BOOTP AND DHCP PARAMETERS\r
+\r
+The Bootstrap Protocol (BOOTP) [RFC951] describes an IP/UDP\r
+bootstrap protocol (BOOTP) which allows a diskless client machine to\r
+discover its own IP address, the address of a server host, and the\r
+name of a file to be loaded into memory and executed.  The Dynamic\r
+Host Configuration Protocol (DHCP) [RFC1531] provides a framework for\r
+automatic configuration of IP hosts.  The "DHCP Options and BOOTP\r
+Vendor Information Extensions" [RFC1533] describes the additions to the\r
+Bootstrap Protocol (BOOTP) which can also be used as options with the\r
+Dynamic Host Configuration Protocol (DHCP).\r
+\r
+BOOTP Vendor Extensions and DHCP Options are listed below:\r
+\r
+\r
+   Tag     Name          Data Length    Meaning\r
+   ---     ----          -----------    -------\r
+    0      Pad               0          None\r
+    1      Subnet Mask       4          Subnet Mask Value\r
+    2      Time Offset       4          Time Offset in\r
+                                        Seconds from UTC\r
+    3      Gateways          N          N/4 Gateway addresses\r
+    4      Time Server       N          N/4 Timeserver addresses\r
+    5      Name Server       N          N/4 IEN-116 Server addresses\r
+    6      Domain Server     N          N/4 DNS Server addresses\r
+    7      Log Server        N          N/4 Logging Server addresses\r
+    8      Quotes Server     N          N/4 Quotes Server addresses\r
+    9      LPR Server        N          N/4 Printer Server addresses\r
+   10      Impress Server    N          N/4 Impress Server addresses\r
+   11      RLP Server        N          N/4 RLP Server addresses\r
+   12      Hostname          N          Hostname string\r
+   13      Boot File Size    2          Size of boot file in 512 byte\r
+                                        chunks\r
+   14      Merit Dump File              Client to dump and name\r
+                                        the file to dump it to\r
+   15      Domain Name       N          The DNS domain name of the\r
+                                        client\r
+   16      Swap Server       N          Swap Server addeess\r
+   17      Root Path         N          Path name for root disk\r
+   18      Extension File    N          Path name for more BOOTP info\r
+\r
+   19      Forward On/Off    1          Enable/Disable IP Forwarding\r
+   20      SrcRte On/Off     1          Enable/Disable Source Routing\r
+   21      Policy Filter     N          Routing Policy Filters\r
+   22      Max DG Assembly   2          Max Datagram Reassembly Size\r
+   23      Default IP TTL    1          Default IP Time to Live\r
+   24      MTU Timeout       4          Path MTU Aging Timeout\r
+   25      MTU Plateau       N          Path MTU  Plateau Table\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 88]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+   26      MTU Interface     2          Interface MTU Size\r
+   27      MTU Subnet        1          All Subnets are Local\r
+   28      Broadcast Address 4          Broadcast Address\r
+   29      Mask Discovery    1          Perform Mask Discovery\r
+   30      Mask Supplier     1          Provide Mask to Others\r
+   31      Router Discovery  1          Perform Router Discovery\r
+   32      Router Request    4          Router Solicitation Address\r
+   33      Static Route      N          Static Routing Table\r
+   34      Trailers          1          Trailer Encapsulation\r
+   35      ARP Timeout       4          ARP Cache Timeout\r
+   36      Ethernet          1          Ethernet Encapsulation\r
+   37      Default TCP TTL   1          Default TCP Time to Live\r
+   38      Keepalive Time    4          TCP Keepalive Interval\r
+   39      Keepalive Data    1          TCP Keepalive Garbage\r
+   40      NIS Domain        N          NIS Domain Name\r
+   41      NIS Servers       N          NIS Server Addresses\r
+   42      NTP Servers       N          NTP Server Addresses\r
+   43      Vendor Specific   N          Vendor Specific Information\r
+   44      NETBIOS Name Srv  N          NETBIOS Name Servers\r
+   45      NETBIOS Dist Srv  N          NETBIOS Datagram Distribution\r
+   46      NETBIOS Note Type 1          NETBIOS Note Type\r
+   47      NETBIOS Scope     N          NETBIOS Scope\r
+   48      X Window Font     N          X Window Font Server\r
+   49      X Window Manmager N          X Window Display Manager\r
+   50      Address Request   4          Requested IP Address\r
+   51      Address Time      4          IP Address Lease Time\r
+   52      Overload          1          Overloaf "sname" or "file"\r
+   53      DHCP Msg Type     1          DHCP Message Type\r
+   54      DHCP Server Id    4          DHCP Server Identification\r
+   55      Parameter List    N          Parameter Request List\r
+   56      DHCP Message      N          DHCP Error Message\r
+   57      DHCP Max Msg Size 2          DHCP Maximum Message Size\r
+   58      Renewal Time      4          DHCP Renewal (T1) Time\r
+   59      Rebinding Time    4          DHCP Rebinding (T2) Time\r
+   60      Class Id          N          Class Identifier\r
+   61      Client Id         N          Client Identifier\r
+   62      Netware/IP Domain N          Netware/IP Domain Name\r
+   63      Netware/IP Option N          Netware/IP sub Options\r
+\r
+\r
+   64-127  Unassigned\r
+   128-154 Reserved\r
+\r
+   255     End               0          None\r
+\r
+\r
+REFERENCES\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 89]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC951]  Croft, B., and J. Gilmore, "BOOTSTRAP Protocol (BOOTP)",\r
+          RFC-951, Stanford and SUN Microsytems, September 1985.\r
+\r
+[RFC1531]  Droms, R., "Dynamic Host Configuration Protocol", Bucknell\r
+           University, October 1993.\r
+\r
+[RFC1533]  Alexander, S., and R. Droms, "DHCP Options and BOOTP Vendor\r
+           Extensions", Lachman Technology, Inc., Bucknell University,\r
+           October 1993.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/bootp-and-dhcp-\r
+parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 90]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ADDRESS FAMILY NUMBERS\r
+\r
+Several protocols deal with multiple address families.  The 16-bit\r
+assignments are listed here.\r
+\r
+\r
+Number    Description                                          Reference\r
+------    ---------------------------------------------------- ---------\r
+     0    Reserved\r
+     1    IP (IP version 4)\r
+     2    IP6 (IP version 6)\r
+     3    NSAP\r
+     4    HDLC (8-bit multidrop)\r
+     5    BBN 1822\r
+     6    802 (includes all 802 media plus Ethernet "canonical format")\r
+     7    E.163\r
+     8    E.164 (SMDS, Frame Relay, ATM)\r
+     9    F.69 (Telex)\r
+    10    X.121 (X.25, Frame Relay)\r
+    11    IPX\r
+    12    Appletalk\r
+    13    Decnet IV\r
+    14    Banyan Vines\r
+ 65535    Reserved\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/address-family-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 91]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+FOOBAR AF NUMBERS\r
+\r
+\r
+In the FTP Operation Over Big Address Records (FOOBAR) Protocol\r
+[RFC1639] there is a field, called "address family" or "af", to\r
+identify the lower level protocol addresses in use.  This is an 8 bit\r
+field.  The first 16 assignments (0-15) of the af value are exactly\r
+the same as the IP Version number.  The assignment for values 16-255\r
+are listed here.\r
+\r
+Assigned FOOBAR Address Families\r
+\r
+Decimal   Keyword    Address Family                     References\r
+-------   -------    --------------                     ----------\r
+    16    IPX        Novell IPX\r
+17-254               Unassigned\r
+   255               Reserved\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC1639] Piscitello, D., "FTP Operation Over Big Address Records\r
+          (FOOBAR)", Core Competence, Inc., June 1994.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/foobar-af-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 92]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+DIRECTORY SYSTEM NAMES\r
+\r
+\r
+In the representation of distinquished names (and possibly other\r
+contexts) of the X.500 Directory system, several unique keywords may\r
+be necessary.  For example, in the string representation of\r
+distinguished names [RFC1485].\r
+\r
+Keyword  Attribute (X.520 keys)\r
+-------  ---------------------------------\r
+ CN       CommonName\r
+ L        LocalityName\r
+ ST       StateOrProvinceName\r
+ O        OrganizationName\r
+ OU       OrganizationalUnitName\r
+ C        CountryName\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC1485]  Hardcastle-Kille, S., "A String Representation of\r
+           Distinguished Names (OSI-DS 23 (v5))", RFC1485, ISODE\r
+           Consortium, July 1993.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/directory-system-names\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 93]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PUBLISHER IDENTIFICATION CODE\r
+\r
+The RFC "A Format for E-Mailing Bibliographic Records" [RFC1357]\r
+establishs a "publisher-ID" code.  The IANA registry of these codes is\r
+listed here.\r
+\r
+\r
+Code   Publisher                                               Reference\r
+------ ------------------------------------------------------- ---------\r
+DUMMY  for testing only                                         [RFC1357]\r
+TEST   for testing only                                         [RFC1357]\r
+ISI    Information Sciences Institute                               [JBP]\r
+          of the University of Southern California\r
+UMCS   University of Manchester Computer Science Department         [TXC]\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC1357] Cohen, D., Editor, "A Format for E-mailing Bibliographic\r
+          Records", RFC 1357, USC/Information Sciences Institute,\r
+          July 1992.\r
+\r
+PEOPLE\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[TXC] Tim Clement <timc@cs.man.ac.uk>\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/publisher-id\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 94]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+OSPF AUTHENTICATION CODES\r
+\r
+\r
+The Open Shotrest Path First (OSPF) protocols has a provision for\r
+authentication, and the type of authentication can me indicated by a\r
+code number.  The following are the registered authentication codes.\r
+\r
+\r
+Code    Authentication Method                             Reference\r
+----    ---------------------                             ---------\r
+   0    No Authentication                                 [RFC1583]\r
+   1    Simple Password Authentication                    [RFC1583]\r
+2-65535 Reserved\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC1583] Moy, J., "OSPF Version 2", RFC 1583, Proteon, Inc., March\r
+          1994.\r
+\r
+[RFC1584] Moy, J., "Multicast Extensions to OSPF", RFC 1584, Proteon,\r
+          Inc., March 1994.\r
+\r
+[RFC1585] Moy, J., "MOSPF: Analysis and Experience", RFC 1585,\r
+          Proteon, Inc., March 1994.\r
+\r
+[RFC1586] deSouza, O., and M. Rodrigues, "Guidelines for Running OSPF\r
+          Over Frame Relay Networks", RFC 1586, AT&T Bell\r
+          Laboratories, March 1994.\r
+\r
+[RFC1587] Coltun, R., and V. Fuller, "The OSPF NSSA Option", RFC 1587,\r
+          RainbowBridge Communications, BARRNet, March 1994.\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/ospf-authentication-\r
+codes\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 95]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+MEDIA TYPES\r
+\r
+\r
+[RFC1521] specifies that Content Types, Content Subtypes, Character\r
+Sets, Access Types, and Conversion values for MIME mail will be\r
+assigned and listed by the IANA.\r
+\r
+\r
+Content Types and Subtypes\r
+--------------------------\r
+\r
+Type            Subtype         Description                 Reference\r
+----            -------         -----------                 ---------\r
+text            plain                                   [RFC1521,NSB]\r
+                richtext                                [RFC1521,NSB]\r
+                tab-separated-values                   [Paul Lindner]\r
+\r
+multipart       mixed                                   [RFC1521,NSB]\r
+                alternative                             [RFC1521,NSB]\r
+                digest                                  [RFC1521,NSB]\r
+                parallel                                [RFC1521,NSB]\r
+                appledouble                [MacMime,Patrik Faltstrom]\r
+                header-set                             [Dave Crocker]\r
+\r
+message         rfc822                                  [RFC1521,NSB]\r
+                partial                                 [RFC1521,NSB]\r
+                external-body                           [RFC1521,NSB]\r
+                news                        [RFC 1036, Henry Spencer]\r
+\r
+application     octet-stream                            [RFC1521,NSB]\r
+                postscript                              [RFC1521,NSB]\r
+                oda                                     [RFC1521,NSB]\r
+                atomicmail                           [atomicmail,NSB]\r
+                andrew-inset                       [andrew-inset,NSB]\r
+                slate                           [slate,terry crowley]\r
+                wita              [Wang Info Transfer,Larry Campbell]\r
+                dec-dx            [Digital Doc Trans, Larry Campbell]\r
+                dca-rft        [IBM Doc Content Arch, Larry Campbell]\r
+                activemessage                          [Ehud Shapiro]\r
+                rtf                                    [Paul Lindner]\r
+                applefile                  [MacMime,Patrik Faltstrom]\r
+                mac-binhex40               [MacMime,Patrik Faltstrom]\r
+                news-message-id              [RFC1036, Henry Spencer]\r
+                news-transmission            [RFC1036, Henry Spencer]\r
+                wordperfect5.1                         [Paul Lindner]\r
+                pdf                                    [Paul Lindner]\r
+                zip                                    [Paul Lindner]\r
+                macwriteii                             [Paul Lindner]\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 96]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+                msword                                 [Paul Lindner]\r
+                remote-printing                         [RFC1486,MTR]\r
+\r
+image           jpeg                                    [RFC1521,NSB]\r
+                gif                                     [RFC1521,NSB]\r
+                ief             Image Exchange Format       [RFC1314]\r
+                tiff            Tag Image File Format           [MTR]\r
+\r
+audio           basic                                   [RFC1521,NSB]\r
+\r
+video           mpeg                                    [RFC1521,NSB]\r
+                quicktime                              [Paul Lindner]\r
+\r
+The "media-types" directory contains a subdirectory for each content\r
+type and each of those directories contains a file for each content\r
+subtype.\r
+\r
+                               |-application-\r
+                               |-audio-------\r
+                               |-image-------\r
+                 |-media-types-|-message-----\r
+                               |-multipart---\r
+                               |-text--------\r
+                               |-video-------\r
+\r
+   URL = ftp://ftp.isi.edu/in-notes/iana/assignments/media-types\r
+\r
+\r
+Character Sets\r
+--------------\r
+\r
+All of the character sets listed the section on Character Sets are\r
+registered for use with MIME as MIME Character Sets.  The\r
+correspondance between the few character sets listed in the MIME\r
+specification [RFC1521] and the list in that section are:\r
+\r
+Type           Description                                  Reference\r
+----           -----------                                  ---------\r
+US-ASCII       see ANSI_X3.4-1968 below                 [RFC1521,NSB]\r
+ISO-8859-1     see ISO_8859-1:1987 below                [RFC1521,NSB]\r
+ISO-8859-2     see ISO_8859-2:1987 below                [RFC1521,NSB]\r
+ISO-8859-3     see ISO_8859-3:1988 below                [RFC1521,NSB]\r
+ISO-8859-4     see ISO_8859-4:1988 below                [RFC1521,NSB]\r
+ISO-8859-5     see ISO_8859-5:1988 below                [RFC1521,NSB]\r
+ISO-8859-6     see ISO_8859-6:1987 below                [RFC1521,NSB]\r
+ISO-8859-7     see ISO_8859-7:1987 below                [RFC1521,NSB]\r
+ISO-8859-8     see ISO_8859-8:1988 below                [RFC1521,NSB]\r
+ISO-8859-9     see ISO_8859-9:1989 below                [RFC1521,NSB]\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 97]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Access Types\r
+------------\r
+\r
+Type           Description                                  Reference\r
+----           -----------                                  ---------\r
+FTP                                                     [RFC1521,NSB]\r
+ANON-FTP                                                [RFC1521,NSB]\r
+TFTP                                                    [RFC1521,NSB]\r
+AFS                                                     [RFC1521,NSB]\r
+LOCAL-FILE                                              [RFC1521,NSB]\r
+MAIL-SERVER                                             [RFC1521,NSB]\r
+\r
+\r
+\r
+Conversion Values\r
+-----------------\r
+\r
+Conversion values or Content Transfer Encodings.\r
+\r
+Type           Description                                  Reference\r
+----           -----------                                  ---------\r
+7BIT                                                    [RFC1521,NSB]\r
+8BIT                                                    [RFC1521,NSB]\r
+BASE64                                                  [RFC1521,NSB]\r
+BINARY                                                  [RFC1521,NSB]\r
+QUOTED-PRINTABLE                                        [RFC1521,NSB]\r
+\r
+\r
+MIME / X.400 MAPPING TABLES\r
+\r
+MIME to X.400 Table\r
+\r
+    MIME content-type          X.400 Body Part             Reference\r
+    -----------------          ------------------          ---------\r
+    text/plain\r
+      charset=us-ascii         ia5-text                     [RFC1494]\r
+      charset=iso-8859-x       EBP - GeneralText            [RFC1494]\r
+    text/richtext              no mapping defined           [RFC1494]\r
+    application/oda            EBP - ODA                    [RFC1494]\r
+    application/octet-stream   bilaterally-defined          [RFC1494]\r
+    application/postscript     EBP - mime-postscript-body   [RFC1494]\r
+    image/g3fax                g3-facsimile                 [RFC1494]\r
+    image/jpeg                 EBP - mime-jpeg-body         [RFC1494]\r
+    image/gif                  EBP - mime-gif-body          [RFC1494]\r
+    audio/basic                no mapping defined           [RFC1494]\r
+    video/mpeg                 no mapping defined           [RFC1494]\r
+\r
+    Abbreviation: EBP - Extended Body Part\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 98]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+X.400 to MIME Table\r
+\r
+\r
+                             Basic Body Parts\r
+\r
+    X.400 Basic Body Part      MIME content-type           Reference\r
+    ---------------------      --------------------        ---------\r
+    ia5-text                   text/plain;charset=us-ascii [RFC1494]\r
+    voice                      No Mapping Defined          [RFC1494]\r
+    g3-facsimile               image/g3fax                 [RFC1494]\r
+    g4-class1                  no mapping defined          [RFC1494]\r
+    teletex                    no mapping defined          [RFC1494]\r
+    videotex                   no mapping defined          [RFC1494]\r
+    encrypted                  no mapping defined          [RFC1494]\r
+    bilaterally-defined        application/octet-stream    [RFC1494]\r
+    nationally-defined         no mapping defined          [RFC1494]\r
+    externally-defined         See Extended Body Parts     [RFC1494]\r
+\r
+    X.400 Extended Body Part  MIME content-type            Reference\r
+    ------------------------- --------------------         ---------\r
+    GeneralText               text/plain;charset=iso-8859-x[RFC1494]\r
+    ODA                       application/oda              [RFC1494]\r
+    mime-postscript-body      application/postscript       [RFC1494]\r
+    mime-jpeg-body            image/jpeg                   [RFC1494]\r
+    mime-gif-body             image/gif                    [RFC1494]\r
+\r
+REFERENCES\r
+\r
+[MacMime] Work in Progress.\r
+\r
+[RFC1036] Horton, M., and R. Adams, "Standard for Interchange of\r
+          USENET Messages", RFC 1036, AT&T Bell Laboratories,\r
+          Center for Seismic Studies, December 1987.\r
+\r
+[RFC1494] Alvestrand, H., and S. Thompson, "Equivalences between 1988\r
+          X.400 and RFC-822 Message Bodies", RFC 1494, SINTEF DELAB,\r
+          Soft*Switch, Inc., August 1993.\r
+\r
+[RFC1521] Borenstien, N., and N. Freed, "MIME (Multipurpose Internet\r
+          Mail Extensions) Part One: Mechanisms for Specifying and\r
+          Describing the Format of Internet Message Bodies", RFC 1521,\r
+          Bellcore, Innosoft, September 1993.\r
+\r
+PEOPLE\r
+\r
+[Larry Campbell]\r
+\r
+[Dave Crocker]  Dave Crocker <dcrocker@mordor.stanford.edu>\r
+\r
+\r
+\r
+Reynolds & Postel                                              [Page 99]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[Terry Crowley]\r
+\r
+[NSB] Nathaniel Borenstein <nsb@bellcore.com>\r
+\r
+[MTR] Marshall Rose <mrose@dbc.mtview.ca.us>\r
+\r
+[Paul Lindner]\r
+\r
+[PXF] Patrik Faltstrom <paf@nada.kth.se>\r
+\r
+[Ehud Shapiro]\r
+\r
+[Henry Spencer]\r
+\r
+[]\r
+\r
+\r
+\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-\r
+types\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 100]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+CHARACTER SETS\r
+\r
+These are the official names for character sets that may be used in\r
+the Internet and may be referred to in Internet documentation.  These\r
+names are expressed in ANSI_X3.4-1968 which is commonly called\r
+US-ASCII or simply ASCII.  The character set most commonly use in the\r
+Internet and used especially in protocol standards is US-ASCII, this\r
+is strongly encouraged.  The use of the name US-ASCII is also\r
+encouraged.\r
+\r
+The character set names may be up to 40 characters taken from the\r
+printable characters of US-ASCII.  However, no distinction is made\r
+between use of upper and lower case letters.\r
+\r
+\r
+Character Set                                               Reference\r
+-------------                                               ---------\r
+\r
+Name: ANSI_X3.4-1968                                   [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-6\r
+Alias: ANSI_X3.4-1986\r
+Alias: ISO_646.irv:1991\r
+Alias: ASCII\r
+Alias: ISO646-US\r
+Alias: US-ASCII\r
+Alias: us\r
+Alias: IBM367\r
+Alias: cp367\r
+\r
+Name: ISO-10646-UCS-2\r
+Source: the 2-octet Basic Multilingual Plane, aka Unicode\r
+        this needs to specify network byte order: the standard\r
+        does not specify (it is a 16-bit integer space)\r
+\r
+Name: ISO-10646-UCS-4\r
+Source: the full code space. (same comment about byte order,\r
+        these are 31-bit numbers.\r
+\r
+Name: ISO-10646-UTF-1\r
+Source: Universal Transfer Format (1), this is the multibyte\r
+        encoding, that subsets ASCII-7. It does not have byte\r
+        ordering issues.\r
+\r
+Name: ISO_646.basic:1983                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: ref\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 101]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Name: INVARIANT                                         [RFC1345,KXS2]\r
+\r
+Name: ISO_646.irv:1983                                  [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-2\r
+Alias: irv\r
+\r
+Name: BS_4730                                           [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-4\r
+Alias: ISO646-GB\r
+Alias: gb\r
+Alias: uk\r
+\r
+Name: NATS-SEFI                                         [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-8-1\r
+\r
+Name: NATS-SEFI-ADD                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-8-2\r
+\r
+Name: NATS-DANO                                         [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-9-1\r
+\r
+Name: NATS-DANO-ADD                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-9-2\r
+\r
+Name: SEN_850200_B                                      [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-10\r
+Alias: FI\r
+Alias: ISO646-FI\r
+Alias: ISO646-SE\r
+Alias: se\r
+\r
+Name: SEN_850200_C                                      [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-11\r
+Alias: ISO646-SE2\r
+Alias: se2\r
+\r
+Name: KS_C_5601-1987                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-149\r
+Alias: KS_C_5601-1989\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 102]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: KSC_5601\r
+Alias: korean\r
+\r
+Name: ISO-2022-KR                                       [RFC1557,Choi]\r
+Source: RFC-1557 (see also KS_C_5601-1987)\r
+\r
+Name: EUC-KR                                            [RFC1557,Choi]\r
+Source: RFC-1557 (see also KS_C_5861-1992)\r
+\r
+Name: ISO-2022-JP                                      [RFC1468,Murai]\r
+Source: RFC-1468\r
+\r
+Name: ISO-2022-JP-2                                     [RFC1554,Ohta]\r
+Source: RFC-1554\r
+\r
+Name: JIS_C6220-1969-jp                                 [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: JIS_C6220-1969\r
+Alias: iso-ir-13\r
+Alias: katakana\r
+Alias: x0201-7\r
+\r
+Name: JIS_C6220-1969-ro                                 [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-14\r
+Alias: jp\r
+Alias: ISO646-JP\r
+\r
+Name: IT                                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-15\r
+Alias: ISO646-IT\r
+\r
+Name: PT                                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-16\r
+Alias: ISO646-PT\r
+\r
+Name: ES                                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-17\r
+Alias: ISO646-ES\r
+\r
+Name: greek7-old                                        [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-18\r
+\r
+Name: latin-greek                                       [RFC1345,KXS2]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 103]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Source: ECMA registry\r
+Alias: iso-ir-19\r
+\r
+Name: DIN_66003                                         [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-21\r
+Alias: de\r
+Alias: ISO646-DE\r
+\r
+Name: NF_Z_62-010_(1973)                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-25\r
+Alias: ISO646-FR1\r
+\r
+Name: Latin-greek-1                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-27\r
+\r
+Name: ISO_5427                                          [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-37\r
+\r
+Name: JIS_C6226-1978                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-42\r
+\r
+Name: BS_viewdata                                       [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-47\r
+\r
+Name: INIS                                              [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-49\r
+\r
+Name: INIS-8                                            [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-50\r
+\r
+Name: INIS-cyrillic                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-51\r
+\r
+Name: ISO_5427:1981                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-54\r
+\r
+Name: ISO_5428:1980                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 104]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: iso-ir-55\r
+\r
+Name: GB_1988-80                                        [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-57\r
+Alias: cn\r
+Alias: ISO646-CN\r
+\r
+Name: GB_2312-80                                        [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-58\r
+Alias: chinese\r
+\r
+Name: NS_4551-1                                         [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-60\r
+Alias: ISO646-NO\r
+Alias: no\r
+\r
+Name: NS_4551-2                                          [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: ISO646-NO2\r
+Alias: iso-ir-61\r
+Alias: no2\r
+\r
+Name: NF_Z_62-010                                        [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-69\r
+Alias: ISO646-FR\r
+Alias: fr\r
+\r
+Name: videotex-suppl                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-70\r
+\r
+Name: PT2                                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-84\r
+Alias: ISO646-PT2\r
+\r
+Name: ES2                                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-85\r
+Alias: ISO646-ES2\r
+\r
+Name: MSZ_7795.3                                         [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-86\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 105]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: ISO646-HU\r
+Alias: hu\r
+\r
+Name: JIS_C6226-1983                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-87\r
+Alias: x0208\r
+Alias: JIS_X0208-1983\r
+\r
+Name: greek7                                             [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-88\r
+\r
+Name: ASMO_449                                           [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: ISO_9036\r
+Alias: arabic7\r
+Alias: iso-ir-89\r
+\r
+Name: iso-ir-90                                          [RFC1345,KXS2]\r
+Source: ECMA registry\r
+\r
+Name: JIS_C6229-1984-a                                   [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-91\r
+Alias: jp-ocr-a\r
+\r
+Name: JIS_C6229-1984-b                                   [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-92\r
+Alias: ISO646-JP-OCR-B\r
+Alias: jp-ocr-b\r
+\r
+Name: JIS_C6229-1984-b-add                               [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-93\r
+Alias: jp-ocr-b-add\r
+\r
+Name: JIS_C6229-1984-hand                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-94\r
+Alias: jp-ocr-hand\r
+\r
+Name: JIS_C6229-1984-hand-add                            [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-95\r
+Alias: jp-ocr-hand-add\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 106]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Name: JIS_C6229-1984-kana                                [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-96\r
+\r
+Name: ISO_2033-1983                                      [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-98\r
+Alias: e13b\r
+\r
+Name: ANSI_X3.110-1983                                   [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-99\r
+Alias: CSA_T500-1983\r
+Alias: NAPLPS\r
+\r
+Name: ISO_8859-1:1987                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-100\r
+Alias: ISO_8859-1\r
+Alias: ISO-8859-1\r
+Alias: latin1\r
+Alias: l1\r
+Alias: IBM819\r
+Alias: CP819\r
+\r
+Name: ISO_8859-2:1987                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-101\r
+Alias: ISO_8859-2\r
+Alias: ISO-8859-2\r
+Alias: latin2\r
+Alias: l2\r
+\r
+Name: T.61-7bit                                          [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-102\r
+\r
+Name: T.61-8bit                                          [RFC1345,KXS2]\r
+Alias: T.61\r
+Source: ECMA registry\r
+Alias: iso-ir-103\r
+\r
+Name: ISO_8859-3:1988                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-109\r
+Alias: ISO_8859-3\r
+Alias: ISO-8859-3\r
+Alias: latin3\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 107]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: l3\r
+\r
+Name: ISO_8859-4:1988                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-110\r
+Alias: ISO_8859-4\r
+Alias: ISO-8859-4\r
+Alias: latin4\r
+Alias: l4\r
+\r
+Name: ECMA-cyrillic                                      [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-111\r
+\r
+Name: CSA_Z243.4-1985-1                                  [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-121\r
+Alias: ISO646-CA\r
+Alias: csa7-1\r
+Alias: ca\r
+\r
+Name: CSA_Z243.4-1985-2                                  [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-122\r
+Alias: ISO646-CA2\r
+Alias: csa7-2\r
+\r
+Name: CSA_Z243.4-1985-gr                                 [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-123\r
+\r
+Name: ISO_8859-6:1987                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-127\r
+Alias: ISO_8859-6\r
+Alias: ISO-8859-6\r
+Alias: ECMA-114\r
+Alias: ASMO-708\r
+Alias: arabic\r
+\r
+Name: ISO_8859-6-E                                       [RFC1556,IANA]\r
+Source: RFC-1556\r
+\r
+Name: ISO_8859-6-I                                       [RFC1556,IANA]\r
+Source: RFC-1556\r
+\r
+Name: ISO_8859-7:1987                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 108]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: iso-ir-126\r
+Alias: ISO_8859-7\r
+Alias: ISO-8859-7\r
+Alias: ELOT_928\r
+Alias: ECMA-118\r
+Alias: greek\r
+Alias: greek8\r
+\r
+Name: T.101-G2                                            [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-128\r
+\r
+Name: ISO_8859-8:1988                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-138\r
+Alias: ISO_8859-8\r
+Alias: ISO-8859-8\r
+Alias: hebrew\r
+\r
+Name: ISO_8859-8-E                                  [RFC1556,Nussbacher]\r
+Source: RFC-1556\r
+\r
+Name: ISO_8859-8-I                                  [RFC1556,Nussbacher]\r
+Source: RFC-1556\r
+\r
+Name: CSN_369103                                          [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-139\r
+\r
+Name: JUS_I.B1.002                                        [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-141\r
+Alias: ISO646-YU\r
+Alias: js\r
+Alias: yu\r
+\r
+Name: ISO_6937-2-add                                      [RFC1345,KXS2]\r
+Source: ECMA registry and ISO 6937-2:1983\r
+Alias: iso-ir-142\r
+\r
+Name: IEC_P27-1                                           [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-143\r
+\r
+Name: ISO_8859-5:1988                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-144\r
+Alias: ISO_8859-5\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 109]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: ISO-8859-5\r
+Alias: cyrillic\r
+\r
+Name: JUS_I.B1.003-serb                                   [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-146\r
+Alias: serbian\r
+\r
+Name: JUS_I.B1.003-mac                                    [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: macedonian\r
+Alias: iso-ir-147\r
+\r
+Name: ISO_8859-9:1989                                     [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-148\r
+Alias: ISO_8859-9\r
+Alias: ISO-8859-9\r
+Alias: latin5\r
+Alias: l5\r
+\r
+Name: greek-ccitt                                         [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-150\r
+\r
+Name: NC_NC00-10:81                                       [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: cuba\r
+Alias: iso-ir-151\r
+Alias: ISO646-CU\r
+\r
+Name: ISO_6937-2-25                                       [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-152\r
+\r
+Name: GOST_19768-74                                       [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: ST_SEV_358-88\r
+Alias: iso-ir-153\r
+\r
+Name: ISO_8859-supp                                       [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-154\r
+Alias: latin1-2-5\r
+\r
+Name: ISO_10367-box                                       [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-155\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 110]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Name: latin6                                              [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: iso-ir-157\r
+Alias: l6\r
+\r
+Name: latin-lap                                           [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: lap\r
+Alias: iso-ir-158\r
+\r
+Name: JIS_X0212-1990                                      [RFC1345,KXS2]\r
+Source: ECMA registry\r
+Alias: x0212\r
+Alias: iso-ir-159\r
+\r
+Name: DS_2089                                             [RFC1345,KXS2]\r
+Source: Danish Standard, DS 2089, February 1974\r
+Alias: DS2089\r
+Alias: ISO646-DK\r
+Alias: dk\r
+\r
+Name: us-dk                                               [RFC1345,KXS2]\r
+\r
+Name: dk-us                                               [RFC1345,KXS2]\r
+\r
+Name: JIS_X0201                                           [RFC1345,KXS2]\r
+Alias: X0201\r
+\r
+Name: KSC5636                                             [RFC1345,KXS2]\r
+Alias: ISO646-KR\r
+\r
+Name: DEC-MCS                                             [RFC1345,KXS2]\r
+Source: VAX/VMS User's Manual,\r
+        Order Number: AI-Y517A-TE, April 1986.\r
+Alias: dec\r
+\r
+Name: hp-roman8                                           [RFC1345,KXS2]\r
+Source: LaserJet IIP Printer User's Manual,\r
+        HP part no 33471-90901, Hewlet-Packard, June 1989.\r
+Alias: roman8\r
+Alias: r8\r
+\r
+Name: macintosh                                           [RFC1345,KXS2]\r
+Source: The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991\r
+Alias: mac\r
+\r
+Name: IBM037                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 111]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: cp037\r
+Alias: ebcdic-cp-us\r
+Alias: ebcdic-cp-ca\r
+Alias: ebcdic-cp-wt\r
+Alias: ebcdic-cp-nl\r
+\r
+Name: IBM038                                              [RFC1345,KXS2]\r
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990\r
+Alias: EBCDIC-INT\r
+Alias: cp038\r
+\r
+Name: IBM273                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP273\r
+\r
+Name: IBM274                                              [RFC1345,KXS2]\r
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990\r
+Alias: EBCDIC-BE\r
+Alias: CP274\r
+\r
+Name: IBM275                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: EBCDIC-BR\r
+Alias: cp275\r
+\r
+Name: IBM277                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: EBCDIC-CP-DK\r
+Alias: EBCDIC-CP-NO\r
+\r
+Name: IBM278                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP278\r
+Alias: ebcdic-cp-fi\r
+Alias: ebcdic-cp-se\r
+\r
+Name: IBM280                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP280\r
+Alias: ebcdic-cp-it\r
+\r
+Name: IBM281                                              [RFC1345,KXS2]\r
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990\r
+Alias: EBCDIC-JP-E\r
+Alias: cp281\r
+\r
+Name: IBM284                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 112]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: CP284\r
+Alias: ebcdic-cp-es\r
+\r
+Name: IBM285                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP285\r
+Alias: ebcdic-cp-gb\r
+\r
+Name: IBM290                                              [RFC1345,KXS2]\r
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990\r
+Alias: cp290\r
+Alias: EBCDIC-JP-kana\r
+\r
+Name: IBM297                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp297\r
+Alias: ebcdic-cp-fr\r
+\r
+Name: IBM420                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990,\r
+        IBM NLS RM p 11-11\r
+Alias: cp420\r
+Alias: ebcdic-cp-ar1\r
+\r
+Name: IBM423                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp423\r
+Alias: ebcdic-cp-gr\r
+\r
+Name: IBM424                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp424\r
+Alias: ebcdic-cp-he\r
+\r
+Name: IBM437                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp437\r
+Alias: 437\r
+\r
+Name: IBM500                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP500\r
+Alias: ebcdic-cp-be\r
+Alias: ebcdic-cp-ch\r
+\r
+Name: IBM850                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp850\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 113]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Alias: 850\r
+\r
+Name: IBM851                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp851\r
+Alias: 851\r
+\r
+Name: IBM852                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp852\r
+Alias: 852\r
+\r
+Name: IBM855                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp855\r
+Alias: 855\r
+\r
+Name: IBM857                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp857\r
+Alias: 857\r
+\r
+Name: IBM860                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp860\r
+Alias: 860\r
+\r
+Name: IBM861                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp861\r
+Alias: 861\r
+Alias: cp-is\r
+\r
+Name: IBM862                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp862\r
+Alias: 862\r
+\r
+Name: IBM863                                              [RFC1345,KXS2]\r
+Source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991\r
+Alias: cp863\r
+Alias: 863\r
+\r
+Name: IBM864                                              [RFC1345,KXS2]\r
+Source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991\r
+Alias: cp864\r
+\r
+Name: IBM865                                              [RFC1345,KXS2]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 114]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Source: IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)\r
+Alias: cp865\r
+Alias: 865\r
+\r
+Name: IBM868                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP868\r
+Alias: cp-ar\r
+\r
+Name: IBM869                                              [RFC1345,KXS2]\r
+Source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991\r
+Alias: cp869\r
+Alias: 869\r
+Alias: cp-gr\r
+\r
+Name: IBM870                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP870\r
+Alias: ebcdic-cp-roece\r
+Alias: ebcdic-cp-yu\r
+\r
+Name: IBM871                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP871\r
+Alias: ebcdic-cp-is\r
+\r
+Name: IBM880                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp880\r
+Alias: EBCDIC-Cyrillic\r
+\r
+Name: IBM891                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp891\r
+\r
+Name: IBM903                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp903\r
+\r
+Name: IBM904                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: cp904\r
+Alias: 904\r
+\r
+Name: IBM905                                              [RFC1345,KXS2]\r
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990\r
+Alias: CP905\r
+Alias: ebcdic-cp-tr\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 115]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Name: IBM918                                              [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP918\r
+Alias: ebcdic-cp-ar2\r
+\r
+Name: IBM1026                                             [RFC1345,KXS2]\r
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990\r
+Alias: CP1026\r
+\r
+Name: EBCDIC-AT-DE                                        [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-AT-DE-A                                      [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-CA-FR                                        [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-DK-NO                                        [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-DK-NO-A                                      [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-FI-SE                                        [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-FI-SE-A                                      [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-FR                                           [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-IT                                           [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-PT                                           [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-ES                                           [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-ES-A                                         [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-ES-S                                         [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 116]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Name: EBCDIC-UK                                           [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: EBCDIC-US                                           [RFC1345,KXS2]\r
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\r
+\r
+Name: UNKNOWN-8BIT                                             [RFC1428]\r
+\r
+Name: MNEMONIC                                            [RFC1345,KXS2]\r
+Source: RFC 1345, also known as "mnemonic+ascii+38"\r
+\r
+Name: MNEM                                                [RFC1345,KXS2]\r
+Source: RFC 1345, also known as "mnemonic+ascii+8200"\r
+\r
+Name: VISCII                                                   [RFC1456]\r
+Source: RFC 1456\r
+\r
+Name: VIQR                                                     [RFC1456]\r
+Source: RFC 1456\r
+\r
+Name: KOI8-R                                                   [RFC1489]\r
+Source: RFC 1489, based on GOST-19768-74, ISO-6937/8,\r
+        INIS-Cyrillic, ISO-5427.\r
+\r
+Name: UNICODE-1-1                                              [RFC1641]\r
+Source: RFC 1641\r
+\r
+Name: UNICODE-1-1-UTF-7                                        [RFC1642]\r
+Source: RFC 1642\r
+\r
+REFERENCES\r
+\r
+[RFC1345]  Simonsen, K., "Character Mnemonics & Character Sets",\r
+           RFC 1345, Rationel Almen Planlaegning, Rationel Almen\r
+           Planlaegning, June 1992.\r
+\r
+[RFC1428]  Vaudreuil, G., "Transition of Internet Mail from\r
+           Just-Send-8 to 8bit-SMTP/MIME", RFC1428, CNRI, February\r
+           1993.\r
+\r
+[RFC1456]  Vietnamese Standardization Working Group, "Conventions for\r
+           Encoding the Vietnamese Language VISCII: VIetnamese\r
+           Standard Code for Information Interchange VIQR: VIetnamese\r
+           Quoted-Readable Specification Revision 1.1", RFC 1456, May\r
+           1993.\r
+\r
+[RFC1468]  Murai, J., Crispin, M., and E. van der Poel, "Japanese\r
+           Character Encoding for Internet Messages", RFC 1468,\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 117]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+           Keio University, Panda Programming, June 1993.\r
+\r
+[RFC1489]  Chernov, A., "Registration of a Cyrillic Character Set",\r
+           RFC1489, RELCOM Development Team, July 1993.\r
+\r
+[RFC1554]  Ohta, M., and K. Handa, "ISO-2022-JP-2: Multilingual\r
+           Extension of ISO-2022-JP", RFC1554, Tokyo Institute of\r
+           Technology, ETL, December 1993.\r
+\r
+[RFC1556]  Nussbacher, H., "Handling of Bi-directional Texts in MIME",\r
+           RFC1556, Israeli Inter-University, December 1993.\r
+\r
+[RFC1557]  Choi, U., Chon, K., and H. Park, "Korean Character Encoding\r
+           for Internet Messages", KAIST, Solvit Chosun Media,\r
+           December 1993.\r
+\r
+[RFC1641]  Goldsmith, D., and M. Davis, "Using Unicode with MIME",\r
+           RFC1641, Taligent, Inc., July 1994.\r
+\r
+[RFC1642]  Goldsmith, D., and M. Davis, "UTF-7", RFC1642, Taligent,\r
+           Inc., July 1994.\r
+\r
+PEOPLE\r
+\r
+[KXS2] Keld Simonsen <Keld.Simonsen@dkuug.dk>\r
+\r
+[Choi] Uhhyung Choi <uhhyung@kaist.ac.kr>\r
+\r
+[Murai] Jun Murai <jun@wide.ad.jp>\r
+\r
+[Ohta] Masataka Ohta <mohta@cc.titech.ac.jp>\r
+\r
+[Nussbacher] Hank Nussbacher <hank@vm.tau.ac.il>\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 118]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+NETWORK MANAGEMENT PARAMETERS\r
+\r
+For the management of hosts and gateways on the Internet a data\r
+structure for the information has been defined.  This data structure\r
+should be used with any of several possible management protocols, such\r
+as the "Simple Network Management Protocol" (SNMP) [RFC1157], or the\r
+"Common Management Information Protocol over TCP" (CMOT) [RFC1095].\r
+\r
+The data structure is the "Structure and Indentification of Management\r
+Information for TCP/IP-based Internets" (SMI) [RFC1155], and the\r
+"Management Information Base for Network Management of TCP/IP-based\r
+Internets" (MIB-II) [RFC1213].\r
+\r
+The SMI includes the provision for panrameters or codes to indicate\r
+experimental or private data structures.  These parameter assignments\r
+are listed here.\r
+\r
+The older "Simple Gateway Monitoring Protocol" (SGMP) [RFC1028] also\r
+defined a data structure.  The parameter assignments used with SGMP\r
+are included here for historical completeness.\r
+\r
+The network management object identifiers are under the iso (1), org\r
+(3), dod (6), internet (1), or 1.3.6.1, branch of the name space.\r
+\r
+The major branches are:\r
+\r
+1                   iso\r
+1.3                 org\r
+1.3.6               dod\r
+1.3.6.1             internet\r
+1.3.6.1.1           directory\r
+1.3.6.1.2           mgmt\r
+1.3.6.1.2.1         mib-2\r
+1.3.6.1.2.1.2.2.1.3 ifType\r
+1.3.6.1.2.1.10      transmission\r
+1.3.6.1.2.1.10.23   transmission.ppp\r
+1.3.6.1.2.1.27      application\r
+1.3.6.1.2.1.28      mta\r
+1.3.6.1.3           experimental\r
+1.3.6.1.4           private\r
+1.3.6.1.4.1         enterprise\r
+1.3.6.1.5           security\r
+1.3.6.1.6           SNMPv2\r
+1.3.6.1.7           mail\r
+\r
+SMI Network Management Directory Codes:\r
+\r
+Prefix: iso.org.dod.internet.directory (1.3.6.1.1.)\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 119]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Decimal   Name          Description                     References\r
+-------   ----          -----------                     ----------\r
+    all   Reserved      Reserved for future use             [IANA]\r
+\r
+SMI Network Management MGMT Codes:\r
+\r
+Prefix: iso.org.dod.internet.mgmt (1.3.6.1.2.)\r
+\r
+Decimal   Name          Description                     References\r
+-------   ----          -----------                     ----------\r
+      0   Reserved                                          [IANA]\r
+      1   MIB                                                [KZM]\r
+\r
+Prefix: iso.org.dod.internet.mgmt.mib-2 (1.3.6.1.2.1)\r
+\r
+Decimal   Name          Description                     References\r
+-------   ----          -----------                     ----------\r
+      0   Reserved      Reserved                            [IANA]\r
+      1   system        System                       [RFC1213,KZM]\r
+      2   interfaces    Interfaces                   [RFC1213,KZM]\r
+      3   at            Address Translation          [RFC1213,KZM]\r
+      4   ip            Internet Protocol            [RFC1213,KZM]\r
+      5   icmp          Internet Control Message     [RFC1213,KZM]\r
+      6   tcp           Transmission Control Protocol[RFC1213,KZM]\r
+      7   udp           User Datagram Protocol       [RFC1213,KZM]\r
+      8   egp           Exterior Gateway Protocol    [RFC1213,KZM]\r
+      9   cmot          CMIP over TCP                [RFC1213,KZM]\r
+     10   transmission  Transmission                 [RFC1213,KZM]\r
+     11   snmp          Simple Network Management    [RFC1213,KZM]\r
+     12   GenericIF     Generic Interface Extensions\r
+--                                           [RFC1229,RFC1239,KZM]\r
+     13   Appletalk     Appletalk Networking         [RFC1243,SXW]\r
+     14   ospf          Open Shortest Path First    [RFC1253,FB77]\r
+     15   bgp           Border Gateway Protocol          [RFC1657]\r
+     16   rmon          Remote Network Monitoring    [RFC1271,SXW]\r
+     17   bridge        Bridge Objects               [RFC1286,EXD]\r
+     18   DecnetP4      Decnet Phase 4          [RFC1559, Saperia]\r
+     19   Character     Character Streams                [RFC1658]\r
+     20   snmpParties   SNMP Parties                 [RFC1353,KZM]\r
+     21   snmpSecrets   SNMP Secrets                 [RFC1353,KZM]\r
+     22   snmpDot3RptrMgt                                [RFC1516]\r
+     23   rip-2         Routing Information Protocol     [RFC1389]\r
+     24   ident         Identification Protocol          [RFC1414]\r
+     25   host          Host Resources                   [RFC1514]\r
+     26   snmpDot3MauMgt 802.3 Medium Attachment Units   [RFC1515]\r
+     27   application   Network Services Monitoring      [RFC1565]\r
+     28   mta           Mail Monitoring                  [RFC1566]\r
+     29   dsa           X.500 Directory Monitoring       [RFC1567]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 120]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+     30   IANAifType    Interface Types                  [RFC1573]\r
+     31   ifMIB         Interface Types                  [RFC1573]\r
+     32   dns           Domain Name System               [RFC1611]\r
+     33   upsMIB        Uninterruptible Power Supplies   [RFC1628]\r
+     34   sannauMIB     SNA NAU MIB                      [RFC1665]\r
+     35   etherMIB      Ethernet-like generic objects    [RFC1650]\r
+     36   sipMIB        SMDS inteface objects            [RFC1694]\r
+     37   atmMIB        ATM objects                      [RFC1695]\r
+     38   mdmMIB        Dial-up modem objects            [RFC1696]\r
+     39   rdbmsMIB      relational database objects      [RFC1697]\r
+\r
+Prefix: iso.org.dod.internet.mgmt.mib-2.interface (1.3.6.1.2.1.2)\r
+\r
+(1.3.6.1.2.1.2.2.1.3)\r
+\r
+ifType definitions\r
+\r
+Decimal   Name          Description\r
+-------   ----          -----------\r
+      1   other         none of the following            [RFC1213]\r
+      2   regular1822   BBN Report 1822                  [RFC1213]\r
+      3   hdh1822       BBN Report 1822                  [RFC1213]\r
+      4   ddn-x25       BBN Report 1822                  [RFC1213]\r
+      5   x25           X.25                             [RFC1382]\r
+      6   ethernet-csmacd                                [RFC1213]\r
+      7   IEEE802.3     CSMACD--like Objects          [RF1284,JXC]\r
+      8   IEEE802.4     Token Bus-like Objects\r
+--                                           [RFC1230,RFC1239,KZM]\r
+      9   IEEE802.5     Token Ring-like Objects\r
+--                                           [RFC1231,RFC1239,KZM]\r
+     10   iso88026-man                                   [RFC1213]\r
+     11   starLan                                        [RFC1213]\r
+     12   proteon-10Mbit                                 [RFC1213]\r
+     13   proteon-80Mbit                                 [RFC1213]\r
+     14   hyperchannel                                   [RFC1213]\r
+     15   FDDI          FDDI Objects               [RFC1285,JDC20]\r
+     16   lapb          LAP B                            [RFC1381]\r
+     17   sdlc                                           [RFC1213]\r
+     18   ds1           T1/E1 Carrier Objects            [RFC1406]\r
+     19   e1            obsolete\r
+     20   basicISDN                                      [RFC1213]\r
+     21   primaryISDN                                    [RFC1213]\r
+     22   propPointToPointSerial                         [RFC1213]\r
+     23   ppp           Point-to-Point Protocol          [RFC1471]\r
+     24   softwareLoopback                               [RFC1213]\r
+     25   eon                                            [RFC1213]\r
+     26   ethernet-3Mbit                                 [RFC1213]\r
+     27   nsip                                           [RFC1213]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 121]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+     28   slip                                           [RFC1213]\r
+     29   ultra                                          [RFC1213]\r
+     30   ds3           DS3/E3 Interface Objects         [RFC1407]\r
+     31   sip           SMDS Interface Objects       [RFC1304,TXC]\r
+     32   frame-relay   Frame Relay Objects          [RFC1315,CXB]\r
+     33   RS-232        RS-232 Objects                   [RFC1659]\r
+     34   Parallel      Parallel Printer Objects         [RFC1660]\r
+     35   arcnet        ARC network\r
+     36   arcnet-plus   ARC network plus\r
+     37   atm           ATM\r
+     38   MIOX25        MIOX25                           [RFC1461]\r
+     39   SONET         SONET or SDH\r
+     40   x25ple        X.25 packet level                [RFC1382]\r
+     41   iso88022llc   802.2 LLC\r
+     42   localTalk\r
+     43   smds-dxi      SMDS DXI\r
+     44   frameRelayService Frame Relay DCE\r
+     45   v35           V.35\r
+     46   hssi          HSSI\r
+     47   hippi         HIPPI\r
+     48   modem         generic modem\r
+     49   aal5          AAL5 over ATM\r
+     50   sonetPath\r
+     51   sonetVT\r
+     52   smds-icip     SMDS Inter-Carrier Interface Protocol\r
+     53   propVirtual   proprietary vitural/internal interface\r
+     54   propMultiLink proprietary multi-link multiplexing\r
+     55   IEEE802.12    100BaseVG\r
+     56   fibre-channel Fibre Channel\r
+\r
+Prefix: iso.org.dod.internet.mgmt.mib-2.transmission (1.3.6.1.2.1.10)\r
+\r
+Decimal   Name          Description\r
+-------   ----          -----------\r
+      5   x25           X.25                             [RFC1382]\r
+      7   IEEE802.3     CSMACD--like Objects             [RFC1650]\r
+      8   IEEE802.4     Token Bus-like Objects\r
+--                                           [RFC1230,RFC1239,KZM]\r
+      9   IEEE802.5     Token Ring-like Objects\r
+--                                           [RFC1231,RFC1239,KZM]\r
+     15   FDDI          FDDI Objects               [RFC1285,JDC20]\r
+     16   lapb          LAP B                            [RFC1381]\r
+     18   ds1           T1 Carrier Objects               [RFC1406]\r
+     19   e1            E1 Carrier Objects               [RFC1406]\r
+     23   ppp           Point-to-Point Protocol          [RFC1471]\r
+     30   ds3           DS3/E3 Interface Objects         [RFC1407]\r
+     31   sip           SMDS Interface Objects           [RFC1694]\r
+     32   frame-relay   Frame Relay Objects          [RFC1315,CXB]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 122]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+     33   RS-232        RS-232 Objects                   [RFC1659]\r
+     34   Parallel      Parallel Printer Objects         [RFC1660]\r
+     35   arcnet        ARC network\r
+     36   arcnet-plus   ARC network plus\r
+     37   atm           ATM\r
+     38   MIOX25        MIOX25                           [RFC1461]\r
+     39   sonetMIB      SONET MIB                        [RFC1595]\r
+     44   frnetservMIB  Frame Relay Service MIB for DCE  [RFC1596]\r
+\r
+Prefix: iso.org.dod.internet.mgmt.mib-2.transmission (1.3.6.1.2.1.10)\r
+\r
+(1.3.6.1.2.1.10.23)\r
+\r
+Decimal   Name          Description                     References\r
+-------   ----          -----------                     ----------\r
+      1   pppLcp        ppp link control                [RFC1471]\r
+      2   pppSecurity   ppp security                    [RFC1472]\r
+      3   pppIp         ppp IP network control          [RFC1473]\r
+      4   pppBridge     ppp bridge networl control      [RFC1474]\r
+\r
+Prefix: iso.org.dod.internet.mgmt.mib-2.application (1.3.6.1.2.1.27)\r
+\r
+(1.3.6.1.2.1.27.2.1.3)\r
+\r
+   assocApplicationProtocol OBJECT-TYPE\r
+       SYNTAX OBJECT IDENTIFIER\r
+       MAX-ACCESS read-only\r
+       STATUS current\r
+       DESCRIPTION\r
+         "An identification of the protocol being used for the\r
+          application.  For an OSI Application, this will be the\r
+          Application Context.  For Internet applications, the IANA\r
+          maintains a registry of the OIDs which correspond to\r
+          well-known applications.  If the application protocol is\r
+          not listed in the registry, an OID value of the form\r
+          {applTCPProtoID port} or {applUDProtoID port} are used for\r
+          TCP-based and UDP-based protocols, respectively. In either\r
+          case 'port' corresponds to the primary port number being\r
+          used by the protocol."\r
+       ::= {assocEntry 3}\r
+\r
+Decimal   Name          Description\r
+-------   ----          -----------\r
+     0    Reserved\r
+\r
+(1.3.6.1.2.1.27.3)\r
+\r
+(1.3.6.1.2.1.27.4)\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 123]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+   -- OIDs of the form {applTCPProtoID port} are intended to be used\r
+   -- for TCP-based protocols that don't have OIDs assigned by other\r
+   -- means. {applUDPProtoID port} serves the same purpose for\r
+   -- UDP-based protocols. In either case 'port' corresponds to\r
+   -- the primary port number being used by the protocol. For example,\r
+   -- assuming no other OID is assigned for SMTP, an OID of\r
+   -- {applTCPProtoID 25} could be used, since SMTP is a TCP-based\r
+   -- protocol that uses port 25 as its primary port.\r
+\r
+Prefix: iso.org.dod.internet.mgmt.mib-2.mta (1.3.6.1.2.1.28)\r
+\r
+(1.3.6.1.2.1.28.2.1.24)\r
+\r
+   mtaGroupMailProtocol OBJECT-TYPE\r
+       SYNTAX OBJECT IDENTIFIER\r
+       MAX-ACCESS read-only\r
+       STATUS current\r
+       DESCRIPTION\r
+         "An identification of the protocol being used by this group.\r
+         For an group employing OSI protocols, this will be the\r
+         Application Context.  For Internet applications, the IANA\r
+         maintains a registry of the OIDs which correspond to\r
+         well-known message transfer protocols.  If the application\r
+         protocol is not listed in the registry, an OID value of the\r
+         form {applTCPProtoID port} or {applUDProtoID port} are used\r
+         for TCP-based and UDP-based protocols, respectively.  In\r
+         either case 'port' corresponds to the primary port number\r
+         being used by the group.  applTCPProtoID and applUDPProtoID\r
+         are defined in [5]."\r
+       ::= {mtaGroupEntry 24}\r
+\r
+Decimal   Name          Description\r
+-------   ----          -----------\r
+     0    Reserved\r
+\r
+SMI Network Management Experimental Codes:\r
+\r
+Prefix: iso.org.dod.internet.experimental (1.3.6.1.3.)\r
+\r
+Decimal   Name          Description                     References\r
+-------   ----          -----------                     ----------\r
+      0   Reserved                                          [JKR1]\r
+      1   CLNS          ISO CLNS Objects                     [GS2]\r
+  *   2   T1-Carrier    T1 Carrier Objects                  [FB77]\r
+  *   3   IEEE802.3     Ethernet-like Objects                [JXC]\r
+  *   4   IEEE802.5     Token Ring-like Objects              [EXD]\r
+  *   5   DECNet-PHIV   DECNet Phase IV                     [JXS2]\r
+  *   6   Interface     Generic Interface Objects            [KZM]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 124]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+  *   7   IEEE802.4     Token Bus-like Objects               [KZM]\r
+  *   8   FDDI          FDDI Objects                       [JDC20]\r
+      9   LANMGR-1      LAN Manager V1 Objects              [JXG1]\r
+     10   LANMGR-TRAPS  LAN Manager Trap Objects            [JXG1]\r
+     11   Views         SNMP View Objects                    [CXD]\r
+     12   SNMP-AUTH     SNMP Authentication Objects          [KZM]\r
+  *  13   BGP           Border Gateway Protocol            [SW159]\r
+  *  14   Bridge        Bridge MIB                          [FB77]\r
+  *  15   DS3           DS3 Interface Type                   [TXB]\r
+  *  16   SIP           SMDS Interface Protocol              [TXB]\r
+  *  17   Appletalk     Appletalk Networking                 [SXW]\r
+  *  18   PPP           PPP Objects                         [FJK2]\r
+  *  19   Character MIB Character MIB                      [BS221]\r
+  *  20   RS-232 MIB    RS-232 MIB                         [BS221]\r
+  *  21   Parallel MIB  Parallel MIB                       [BS221]\r
+     22   atsign-proxy  Proxy via Community                  [RXF]\r
+  *  23   OSPF          OSPF MIB                            [FB77]\r
+     24   Alert-Man     Alert-Man                            [LS8]\r
+     25   FDDI-Synoptics FDDI-Synoptics                     [DXP1]\r
+  *  26   Frame Relay   Frame Relay MIB                      [CXB]\r
+  *  27   rmon          Remote Network Management MIB        [SXW]\r
+     28   IDPR          IDPR MIB                           [RAW44]\r
+     29   HUBMIB        IEEE 802.3 Hub MIB                  [DXM5]\r
+     30   IPFWDTBLMIB   IP Forwarding Table MIB             [FB77]\r
+     31   LATM MIB                                           [TXB]\r
+     32   SONET MIB                                          [TXB]\r
+     33   IDENT                                              [MTR]\r
+     34   MIME-MHS                                           [MTR]\r
+     35   MAUMIB        IEEE 802.3 Mau MIB                  [DXM5]\r
+     36   Host Resources Host Resources MIB                  [SXW]\r
+     37   ISIS-MIB      Integrated ISIS protocol MIB         [CXG]\r
+     38   Chassis       Chassis MIB                        [JDC20]\r
+     39   ups           ups                                [JDC20]\r
+     40   App-Mon       Application Monitoring MIB           [TXK]\r
+     41   ATM UNI       ATM                                 [MXA1]\r
+     42   FC            Fibre Channel                       [JXC4]\r
+*    43   DNS           Domain Name Service          [Rob Austein]\r
+     44   X.25          X.25 MIB                     [Dean Throop]\r
+     45   Frame Relay Serv.  Frame Relay Service MIB   [Tracy Cox]\r
+     46   Madman-Applications                          [Ned Freed]\r
+     47   Madman-MTA                                   [Ned Freed]\r
+     48   Madman-DSA                                   [Ned Freed]\r
+     49   Modem                                 [Steve Waldbusser]\r
+     50   SNA NAU                                [Deirdre Kostick]\r
+     51   SDLC          SDLC                       [Jeff Hilgeman]\r
+     52   DNS           Domain Name Service          [Jon Saperia]\r
+     53   network-objects IP info ix X.500             [Johannsen]\r
+     54   printmib                               [Joel Gyllenskog]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 125]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+     55   rdbmsmib                                 [Robert Purvey]\r
+     56   sipMIB                                     [Tracy Brown]\r
+     57   stIImib       ST-II protocol MIB        [Hartmut Wittig]\r
+     58   802.5 SSR MIB 802.5 Station Source Routing MIB     [KZM]\r
+\r
+  * = obsoleted\r
+\r
+SMI Private Codes:\r
+\r
+Prefix: iso.org.dod.internet.private (1.3.6.1.4)\r
+\r
+Decimal   Name          Description                     References\r
+-------   ----          -----------                     ----------\r
+      0   Reserved                                          [JKR1]\r
+      1   enterprise    private enterprises                 [JKR1]\r
+\r
+SMI Private Enterprise Codes:\r
+\r
+Prefix: iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)\r
+\r
+See the file "enterprise-numbers".\r
+\r
+SMI Security Codes:\r
+\r
+Prefix: iso.org.dod.internet.security (1.3.6.1.5)\r
+\r
+Decimal   Name          Description                     References\r
+-------   ----          -----------                     ----------\r
+      0   Reserved                                          [JKR1]\r
+      1   kerberosV4    Kerberos version 4 objects         [1,BCN]\r
+      2   kerberosV5    Kerberos version 5 objects         [2,BCN]\r
+\r
+SMI SNMPv2 Codes:\r
+\r
+Prefix: iso.org.dod.internet.snmpv2 (1.3.6.1.6)\r
+\r
+SMI mail Codes:\r
+\r
+Prefix: iso.org.dod.internet.mail (1.3.6.1.7)\r
+\r
+   1     mime-mhs\r
+\r
+\r
+REFERENCES\r
+\r
+[1]       Miller, S.P., B.C. Neuman, J.I. Schiller, and J.H. Saltzer,\r
+          "Project Athena Technical Plan Section E.2.1: Kerberos\r
+          Authentication and Authorization System", Project Athena,\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 126]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+          MIT, December 1987.\r
+\r
+[2]       Kohl, J., and B.C. Neuman, "The Kerberos Network\r
+          Authentication Service (V5)" work in progress, September\r
+          1992.\r
+\r
+[RFC1028] Davin, J., J. Case, M. Fedor, and M. Schoffstall, "A Simple\r
+          Gateway Monitoring Protocol", RFC 1028, Proteon, Inc.,\r
+          University of Tennessee at Knoxville, Cornell University,\r
+          Rensselaer Polytechnic Institute, November 1987.\r
+\r
+[RFC1095] Warrier, U., and L. Besaw, "The Common Management\r
+          Information Services and Protocol over TCP/IP (CMOT)",\r
+          RFC 1095, Unisys Corp., Hewlett-Packard, April 1989.\r
+\r
+[RFC1155] Rose, M., and K. McCloghrie, "Structure and Identification\r
+          of Management Information for TCP/IP-based internets",\r
+          STD 16, RFC 1155, Performance Systems International, Hughes\r
+          LAN Systems, May 1990.\r
+\r
+[RFC1157] Case, J., M. Fedor, M. Schoffstall, and J. Davin,\r
+          "A Simple Network Management Protocol", STD 15, RFC 1157,\r
+          SNMP Research, Performance Systems International,\r
+          Performance Systems International, MIT Laboratory for\r
+          Computer Science, May 1990.\r
+\r
+[RFC1213] McCloghrie, K., and M. Rose, "Management Information Base\r
+          for Network Management of TCP/IP-based internets: MIB-II",\r
+          STD 17, RFC 1213, Hughes LAN Systems, Performance Systems\r
+          International, March 1991.\r
+\r
+[RFC1229] McCloghrie, K., Editor, "Extensions to the Generic-Interface\r
+          MIB", RFC 1229, Hughes LAN Systems, Inc., May 1991.\r
+\r
+[RFC1230] McCloghrie, K., and R. Fox, "IEEE 802.4 Token Bus MIB",\r
+          RFC 1230, Hughes LAN Systems, Inc., Synoptics, Inc.,\r
+          May 1991.\r
+\r
+[RFC1231] McCloghrie, K., Fox, R., and E. Decker, "IEEE 802.5 Token\r
+          Ring MIB", RFC 1231, Hughes LAN Systems, Inc., Synoptics,\r
+          Inc., cisco Systems, Inc., May 1991.\r
+\r
+[RFC1239] Reynolds, J., "Reassignment of Experimental MIBs to\r
+          Standard MIBs", RFC 1239, USC/Information Sciences\r
+          Institute, ISI, June 1991.\r
+\r
+[RFC1243] Waldbusser, S., Editor, "AppleTalk Management Information\r
+          Base", RFC 1243, Carnegie Mellon University, July 1991.\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 127]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC1253] Baker, F., and R. Coltun, "OSPF Version 2 Management\r
+          Information Base", RFC 1253, ACC, Computer Science Center,\r
+          August 1991.\r
+\r
+[RFC1271] Waldbusser, S., "Remote Network Monitoring Management\r
+          Information Base", RFC 1271, Carnegie Mellon University,\r
+          November 1991.\r
+\r
+[RFC1284] Cook, J., Editor, "Definitions of Managed Objects\r
+          for the Ethernet-like Interface Types", RFC 1284, Chipcom\r
+          Corporation, December 1991.\r
+\r
+[RFC1285] Case, J., "FDDI Management Information Base", RFC 1285,\r
+          SNMP Research, Incorporated, January 1992.\r
+\r
+[RFC1286] Decker, E., Langille, P., Rijsinghani, A., and K.\r
+          McCloghrie, "Definitions of Managed Objects for Bridges",\r
+          RFC 1286, cisco Systems, Inc., DEC, Hughes LAN Systems,\r
+          Inc., December 1991.\r
+\r
+[RFC1304] Cox, T., and K. Tesnik, Editors, "Definitions of Managed\r
+          Objects for the SIP Interface Type", RFC 1304, Bell\r
+          Communications Research, February 1992.\r
+\r
+[RFC1315] Brown, C., Baker, F., and C. Carvalho, "Management\r
+          Information Base for Frame Relay DTEs", RFC 1315, Wellfleet\r
+          Communications, Inc., Advanced Computer Communications,\r
+          April 1992.\r
+\r
+[RFC1353] McCloghrie, K., Davin, J., and J. Galvin, "Definitions of\r
+          Managed Objects for Administration of SNMP Parties",\r
+          RFC 1353, Hughes LAN Systems, Inc., MIT Laboratory for\r
+          Computer Science, Trusted Information Systems, Inc.,\r
+          July 1992.\r
+\r
+[RFC1381] Throop, D., and F. Baker, "SNMP MIB Extension for X.25\r
+          LAPB", RFC 1381, Data General Corporation, Advanced Computer\r
+          Communications, November 1992.\r
+\r
+[RFC1382] Throop, D., Editor, "SNMP MIB Extension for the X.25 Packet\r
+          Layer", RFC 1382, Data General Corporation, November 1992.\r
+\r
+[RFC1389] Malkin, G., and F. Baker, "RIP Version 2 MIB Extension", RFC\r
+          1389, Xylogics, Inc., Advanced Computer Communications,\r
+          January 1993.\r
+\r
+[RFC1406] Baker, F., and J. Watt, Editors, "Definitions of Managed\r
+          Objects for the DS1 and E1 Interface Types", RFC 1406,\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 128]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+          Advanced Computer Communications, Newbridge Networks\r
+          Corporation, January 1993.\r
+\r
+[RFC1407] Cox, T., and K. Tesink, "Definitions of Managed Objects\r
+          for the DS3/E3 Interface Type", RFC 1407, Bell\r
+          Communications Research, January 1993.\r
+\r
+[RFC1414] St. Johns, M., and M. Rose, "Identification MIB", RFC 1414,\r
+          US Department of Defense, Dover Beach Consulting, Inc.,\r
+          February 1993.\r
+\r
+[RFC1461] Throop, D., "SNMP MIB extension for Multiprotocol\r
+          Interconnect over X.25", RFC 1461, Data General Corporation,\r
+          May 1993.\r
+\r
+[RFC1471] Kastenholz, F., "The Definitions of Managed Objects for\r
+          the Link Control Protocol of the Point-to-Point Protocol",\r
+          RFC 1471, FTP Software, Inc., June 1993.\r
+\r
+[RFC1472] Kastenholz, F., "The Definitions of Managed Objects for\r
+          the Security Protocols of the Point-to-Point Protocol", RFC\r
+          1472, FTP Software, Inc., June 1993.\r
+\r
+[RFC1473] Kastenholz, F., "The Definitions of Managed Objects for\r
+          the IP Network Control Protocol of the Point-to-Point\r
+          Protocol", RFC 1473, FTP Software, Inc., June 1993.\r
+\r
+[RFC1474] Kastenholz, F., "The Definitions of Managed Objects for\r
+          the Bridge Network Control Protocol of the Point-to-Point\r
+          Protocol" RFC 1474, FTP Software, Inc., June 1993.\r
+\r
+[RFC1514] Grillo, P., and S. Waldbusser, "Host Resources MIB", RFC\r
+          1514, Network Innovations, Intel Corporation, Carnegie\r
+          Mellon University, September 1993.\r
+\r
+[RFC1515] McMaster, D., McCloghrie, K., and S. Roberts, "Definitions\r
+          of Managed Objects for IEEE 802.3 Medium Attachment Units\r
+          (MAUs)", RFC 1515, SynOptics Communications, Inc., Hughes\r
+          LAN Systems, Inc., Farallon Computing, Inc., September 1993.\r
+\r
+[RFC1516] McMaster, D., and K. McCloghrie, "Definitions of Managed\r
+          Objects for IEEE 802.3 Repeater Devices", RFC 1516,\r
+          SynOptics Communications, Inc., Hughes LAN Systems, Inc.,\r
+          September 1993.\r
+\r
+[RFC1559] Saperia, J., "DECnet Phase IV MIB Extensions", RFC 1559,\r
+          Digital Equipment Corporation, December 1993.\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 129]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RFC1565] Kille, S., WG Chair, and N. Freed, Editor, "Network Services\r
+          Monitoring MIB", RFC 1565, ISODE Consortium and Innosoft,\r
+          January 1994.\r
+\r
+[RFC1566] Kille, S., WG Chair, and N. Freed, Editor, "Mail Monitoring\r
+          MIB", RFC 1566, ISODE Consortium, Innosoft, January 1994.\r
+\r
+[RFC1567] Mansfield, G., and S. Kille, "X.500 Directory Monitoring\r
+          MIB", RFC 1567, AIC Systems Laboratory, ISODE Consortium,\r
+          January 1994.\r
+\r
+[RFC1573] McCloghrie, K., and F. Kastenholz, "Evolution of the\r
+          Interfaces Group of MIB-II", RFC 1573, Hughes LAN Systems,\r
+          FTP Software, January 1994.\r
+\r
+[RFC1595] Brown, T., and K. Tesink, Editors, "Definitions of Managed\r
+          Objects for the SONET/SDH Interface Type", RFC 1595,\r
+          Bell Communications Research, March 1994.\r
+\r
+[RFC1596] Brown, T., Editor, Definitions of Managed Objects for Frame\r
+          Relay Service", RFC 1596, Bell Communications Research,\r
+          March 1994.\r
+\r
+[RFC1611] Austein, R., and J. Saperia, "DNS Server MIB Extensions",\r
+          RFC 1611, Epilogue Technology Corporation, Digital Equipment\r
+          Corporation, May 1994.\r
+\r
+[RFC1628] Case, J., Editor, "UPS Management Information Base", RFC\r
+          1628, SNMP Research, Incorporated, May 1994.\r
+\r
+[RFC1650] Kastenholz, F., "Definitions of Managed Objects for\r
+          the Ethernet-like Interface Types using SMIv2", RFC 1650,\r
+          FTP Software, Inc., August 1994.\r
+\r
+[RFC1657] Willis, S., Burruss, J., and J. Chu, Editor, "Definitions of\r
+          Managed Objects for the Fourth Version of the Border Gateway\r
+          Protocol (BGP-4) using SMIv2", RFC 1657, Wellfleet\r
+          Communications Inc., IBM Corp., July 1994.\r
+\r
+[RFC1658] Stewart, B., "Definitions of Managed Objects for Character\r
+          Stream Devices using SMIv2", RFC 1658, Xyplex, Inc., July\r
+          1994.\r
+\r
+[RFC1659] Stewart, B., "Definitions of Managed Objects for RS-232-like\r
+          Hardware Devices using SMIv2", RFC 1659, Xyplex, Inc., July\r
+          1994.\r
+\r
+[RFC1660] Stewart, B., "Definitions of Managed Objects for\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 130]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+          Parallel-printer-like Hardware Devices using SMIv2", RFC\r
+          1660, Xyplex, Inc., July\r
+          1994.\r
+\r
+[RFC1665] Kielczewski, Z., Kostick, D., and K. Shih, Editors,\r
+          "Definitions of Managed Objects for SNA NAUs using SMIv2",\r
+          RFC 1665, Eicon Technology Corporation, Bell Communications\r
+          Research, Novell, July 1994.\r
+\r
+[RFC1694] Brown, T., and K. Tesink, Editors, "Definitions of Managed\r
+          Objects for SMDS Interfaces using SMIv2", RFC 1694, Bell\r
+          Communications Research, August 1994.\r
+\r
+[RFC1695] Ahmed, M., and K. Tesink, Editors, "Definitions of Managed\r
+          Objects for ATM Management Version 8.0 using SMIv2", RFC\r
+          1695, Bell Communications Research, August 1994.\r
+\r
+[RFC1696] Barnes, J., Brown, L., Royston, R., and S. Waldbusser,\r
+          "Modem Management Information Base (MIB) using SMIv2", RFC\r
+          1696, Xylogics, Inc., Motorola, US Robotics, Inc., Carnegie\r
+          Mellon University, August 1994.\r
+\r
+[RFC1697] Brower, D., Editor, Purvy, B., RDBMSMIB Working Group Chair,\r
+          Daniel, A., Sinykin, M., and J. Smith, "Relational Database\r
+          Management System (RDBMS) Management Information Base (MIB)\r
+          using SMIv2", RFC 1697, The ASK Group, INGRES DBMS\r
+          Development, Oracle Corporation, Informix Software, Inc.,\r
+          Oracle Corporation, August 1994.\r
+\r
+PEOPLE\r
+\r
+[Rob Austein]\r
+\r
+[BCN] B. Clifford Neuman <bcn@isi.edu>\r
+\r
+[BS221] Bob Stewart <STEWART@XYPLEX.COM>\r
+\r
+[CXB]  Caralyn Brown <cbrown%wellfleet.com@talcott.harvard.edu>\r
+\r
+[CXD] Chuck Davin <jrd@ptt.lcs.mit.edu>\r
+\r
+[CXG] Chris Gunner <gunner@dsmail.lkg.dec.com>\r
+\r
+[Dean Throop]\r
+\r
+[DXM5] Donna McMaster <mcmaster@synoptics.com>\r
+\r
+[DXP1] David Perkins <dperkins@synoptics.com>\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 131]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[EXD] Eric Decker <cire@cisco.com>\r
+\r
+[FB77] Fred Baker <fbaker@acc.com>\r
+\r
+[FJK2]\r
+\r
+[GS2] Greg Satz  <satz@CISCO.COM>\r
+\r
+[IANA] IANA <iana@isi.edu>\r
+\r
+[JDC20] Jeffrey Case <case@UTKUX1.UTK.EDU>\r
+\r
+[JKR1] Joyce K. Reynolds <jkrey@isi.edu>\r
+\r
+[JXC] John Cook <cook@chipcom.com>\r
+\r
+[JXG1] Jim Greuel <jimg%hpcndpc@hplabs.hp.com>\r
+\r
+[JXS2] Jon Saperia <saperia@tcpjon.enet.dec.com>\r
+\r
+[Jeff Hilgeman]\r
+\r
+[Johannsen]\r
+\r
+[KZM] Keith McCloghrie <KZM@HLS.COM>\r
+\r
+[LS8] Louis Steinberg <lou@ARAMIS.RUTGERS.EDU>\r
+\r
+[MXA1] Masuma Ahmed <mxa@mail.bellcore.com>\r
+\r
+[MTR] Marshall Rose <mrose@dbc.mtview.ca.us>\r
+\r
+[RAW44] Robert A. Woodburn <WOODY@SPARTA.COM>\r
+\r
+[JXC4] John Chu <jychu@watson.ibm.com>\r
+\r
+[Ned Freed]\r
+\r
+[Deirdre Kostick]\r
+\r
+[Joel Gyllenskog] Joel Gyllenskog <jgyllens@hpdmd48.boi.hp.com>\r
+\r
+[Robert Purvey] Robert Purvey <bpurvy@us.oracle.com>\r
+\r
+[RXF] Richard Fox <rfox@synoptics.com>\r
+\r
+[Jon Saperia] Jon Saperia <saperia@tcpjon.enet.dec.com>\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 132]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[SW159] Steven Willis <swillis@WELLFLEET.COM>\r
+\r
+[SXW] Steve Waldbusser <sw01+@andrew.cmu.edu>\r
+\r
+[TXB] Tracy Brown <tacox@mail.bellcore.com>\r
+\r
+[TXK] Teemu Kurki <grus@funet.fi>\r
+\r
+[Hartmut Wittig]\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/smi-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 133]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PRIVATE ENTERPRISE NUMBERS\r
+\r
+SMI Network Management Private Enterprise Codes:\r
+\r
+Prefix: iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)\r
+\r
+This file is\r
+\r
+          ftp://ftp.isi.edu/in-notes/iana/assignments/enterprise-numbers\r
+\r
+Decimal   Name                                                References\r
+-------   ----                                                ----------\r
+      0   Reserved                     Joyce K. Reynolds <jkrey@isi.edu>\r
+      1   Proteon                     John A. Shriver  <jas@PROTEON.COM>\r
+      2   IBM                      Vik Chandra  <vc@ralvm6.vnet.ibm.com>\r
+      3   CMU                    Steve Waldbusser <sw01+@andrew.cmu.edu>\r
+      4   Unix             Keith Sklower  <sklower@okeeffe.berkeley.edu>\r
+      5   ACC                          Art Berggreen  <art@SALT.ACC.COM>\r
+      6   TWG           John Lunny  <jlunny@eco.twg.com>  (703) 847-4500\r
+      7   CAYMAN                          Beth Miaoulis  beth@cayman.com\r
+      8   PSI                   Marty Schoffstahl  schoff@NISC.NYSER.NET\r
+      9   cisco                                Greg Satz  satz@CISCO.COM\r
+     10   NSC                               Geof Stone  geof@NETWORK.COM\r
+     11   HP               R. Dwight Schettler  rds%hpcndm@HPLABS.HP.COM\r
+     12   Epilogue                      Karl Auerbac  karl@empirical.com\r
+     13   U of Tennessee              Jeffrey Case   case@UTKUX1.UTK.EDU\r
+     14   BBN                         Robert Hinden <hinden@ENG.SUN.COM>\r
+     15   Xylogics, Inc.      John R. LoVerso  loverso@westford.ccur.com\r
+     16   Timeplex                      Laura Bridge  laura@uunet.UU.NET\r
+     17   Canstar                   Sanand Patel  sanand@HUB.TORONTO.EDU\r
+     18   Wellfleet                   Caralyn Brown cbrown@wellfleet.com\r
+     19   TRW                 Jay Frederking  jayf@blackhole.ind.TRW.COM\r
+     20   MIT                            Jon Rochlis  jon@ATHENA.MIT.EDU\r
+     21   EON                                 Michael Waters  ---none---\r
+     22   Spartacus                Yoav Kluger  ykluger@HAWK.ULOWELL.EDU\r
+     23   Novell                        Steve Bostock  steveb@novell.com\r
+     24   Spider Systems                  Peter Reid  peter@spider.co.uk\r
+     25   NSFNET                    Hans-Werner Braun  HWB@MCR.UMICH.EDU\r
+     26   Hughes LAN Systems               Keith McCloghrie  KZM@HLS.COM\r
+     27   Intergraph                  Guy Streeter  guy@guy.bll.ingr.com\r
+     28   Interlan                Bruce Taber  taber@europa.InterLan.COM\r
+     29   Vitalink Communications\r
+     30   Ulana                     Bill Anderson  wda@MITRE-BEDFORD.ORG\r
+     31   NSWC            Stephen Northcutt  SNORTHC@RELAY-NSWC.NAVY.MIL\r
+     32   Santa Cruz Operation            Keith Reynolds  keithr@SCO.COM\r
+     33   Xyplex                          Bob Stewart STEWART@XYPLEX.COM\r
+     34   Cray                     Hunaid Engineer  hunaid@OPUS.CRAY.COM\r
+     35   Bell Northern Research            Glenn Waters  gwaters@BNR.CA\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 134]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+     36   DEC                    Ron Bhanukitsiri  rbhank@DECVAX.DEC.COM\r
+     37   Touch                                  Brad Benson  ---none---\r
+     38   Network Research Corp.              Bill Versteeg  bvs@NCR.COM\r
+     39   Baylor College of Medicine        Stan Barber  SOB@BCM.TMC.EDU\r
+     40   NMFECC-LLNL           Steven Hunter  hunter@CCC.MFECC.LLNL.GOV\r
+     41   SRI                      David Wolfe  ctabka@TSCA.ISTC.SRI.COM\r
+     42   Sun Microsystems                     Dennis Yaro  yaro@SUN.COM\r
+     43   3Com                           Jeremy Siegel  jzs@NSD.3Com.COM\r
+     44   CMC                                   Dave Preston  ---none---\r
+     45   SynOptics                David Perkins  dperkins@synoptics.com\r
+     46   Cheyenne Software             Reijane Huai  sibal@CSD2.NYU.EDU\r
+     47   Prime Computer   Mike Spina  WIZARD%enr.prime.com@RELAY.CS.NET\r
+     48   MCNC/North Carolina   Data Network Ken Whitfield  ken@MCNC.ORG\r
+     49   Chipcom                            John Cook  cook@chipcom.com\r
+     50   Optical Data Systems                    Josh Fielk  ---none---\r
+     51   gated                  Jeffrey C. Honig  jch@gated.cornell.edu\r
+     52   Cabletron Systems                        Roger Dev  ---none---\r
+     53   Apollo Computers            Jeffrey Buffun  jbuffum@APOLLO.COM\r
+     54   DeskTalk Systems, Inc.               David Kaufman  ---none---\r
+     55   SSDS                                   Ron Strich   ---none---\r
+     56   Castle Rock Computing                  John Sancho  ---none---\r
+     57   MIPS Computer Systems       Charles Marker II  marker@MIPS.COM\r
+     58   TGV, Inc.                         Ken Adelman  Adelman@TGV.COM\r
+     59   Silicon Graphics, Inc.               Ronald Jacoby  rj@SGI.COM\r
+     60   University of British Columbia Don McWilliam mcwillm@CC.UBC.CA\r
+     61   Merit                               Bill Norton  wbn@MERIT.EDU\r
+     62   FiberCom                          Eric Rubin  err@FIBERCOM.COM\r
+     63   Apple Computer Inc                  Jim Hayes  Hayes@APPLE.COM\r
+     64   Gandalf                               Henry Kaijak  ---none---\r
+     65   Dartmouth              Philip Koch   Philip.Koch@DARTMOUTH.EDU\r
+     66   David Systems           Kathryn de Graaf  degraaf@davidsys.com\r
+     67   Reuter                                 Bob Zaniolo  ---none---\r
+     68   Cornell                  Laurie Collinsworth  ljc1@cornell.edu\r
+     69   LMS                  L. Michael Sabo  Sabo@DOCKMASTER.NCSC.MIL\r
+     70   Locus Computing Corp.  Arthur Salazar lcc.arthur@SEAS.UCLA.EDU\r
+     71   NASA                   Steve Schoch   SCHOCH@AMES.ARC.NASA.GOV\r
+     72   Retix                                  Alex Martin  ---none---\r
+     73   Boeing                               Jerry Geisler  ---none---\r
+     74   AT&T                            Rich Bantel  rgb@mtung.att.com\r
+     75   Ungermann-Bass                      Didier Moretti  ---none---\r
+     76   Digital Analysis Corporation\r
+                               Skip Koppenhaver stubby!skip@uunet.UU.NET\r
+     77   LAN Manager        Doug Karl KARL-D@OSU-20.IRCC.OHIO-STATE.EDU\r
+     78   Netlabs                       Jonathan Biggar  jon@netlabs.com\r
+     79   ICL                                    Jon Infante  ---none---\r
+     80   Auspex Systems            Brian A. Ehrmantraut  bae@auspex.com\r
+     81   Lannet Company                        Efrat Ramati  ---none---\r
+     82   Network Computing Devices  Dave Mackie lupine!djm@UUNET.UU.NET\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 135]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+     83   Raycom Systems                        Bruce Willins ---none---\r
+     84   Pirelli Focom Ltd.                         Sam Lau  ---none---\r
+     85   Datability Software Systems     Larry Fischer lfischer@dss.com\r
+     86   Network Application Technology           Y.C. Wang  ---none---\r
+     87   LINK (Lokales Informatik-Netz Karlsruhe)\r
+                                Guenther Schreiner snmp-admin@ira.uka.de\r
+     88   NYU                        Bill Russell  russell@cmcl2.NYU.EDU\r
+     89   RND                                Rina Nethaniel   ---none---\r
+     90   InterCon Systems Corporation Amanda Walker AMANDA@INTERCON.COM\r
+     91   Coral Network Corporation      Jason Perreault jason@coral.com\r
+     92   Webster Computer Corporation  Robert R. Elz  kre@munnari.oz.au\r
+     93   Frontier Technologies Corporation\r
+                                          Prakash Ambegaonkar ---none---\r
+     94   Nokia Data Communications              Douglas Egan ---none---\r
+     95   Allen-Bradely Company\r
+                      Bill King abvax!calvin.icd.ab.com!wrk@uunet.UU.NET\r
+     96   CERN\r
+                 Jens T. Rasmussen jenst%cernvax.cern.ch@CUNYVM.CUNY.EDU\r
+     97   Sigma Network Systems, Inc.\r
+                                     Ken Virgile signet!ken@xylogics.COM\r
+     98   Emerging Technologies, Inc.\r
+                                Dennis E. Baasch etinc!dennis@uu.psi.com\r
+     99   SNMP Research                Jeffrey Case  case@UTKUX1.UTK.EDU\r
+    100 Ohio State University\r
+                            Shamim Ahmed ahmed@nisca.ircc.ohio-state.edu\r
+    101 Ultra Network Technologies Julie Dmytryk\r
+                                        Julie_Dmytryk.MKT@usun.ultra.com\r
+    102   Microcom                           Annmarie Freitas ---none---\r
+    103   Martin Marietta Astronautic Group    David Rageth DAVE@MMC.COM\r
+    104   Micro Technology                Mike Erlinger  mike@lexcel.com\r
+    105   Process Software Corporation      Bernie Volz VOLZ@PROCESS.COM\r
+    106   Data General Corporation\r
+                                Joanna Karwowska karwowska@dg-rtp.dg.com\r
+    107   Bull Company         Anthony Berent berent@rdgeng.enet.dec.com\r
+    108   Emulex Corporation                     Jeff Freeman ---none---\r
+    109   Warwick University Computing Services\r
+                             Israel Drori raanan@techunix.technion.ac.il\r
+    110   Network General Corporation\r
+                                   James Davidson ngc!james@uunet.UU.NET\r
+    111   Oracle                          John Hanley jhanley@oracle.com\r
+    112   Control Data Corporation Nelluri L. Reddy reddy@uc.msc.umn.edu\r
+    113   Hughes Aircraft Company           Keith McCloghrie KZM@HLS.COM\r
+    114   Synernetics, Inc.                    Jas Parmar jas@synnet.com\r
+    115   Mitre                               Bede McCall bede@mitre.org\r
+    116   Hitachi, Ltd.                        Hirotaka Usuda ---none---\r
+    117   Telebit                       Mark S. Lewis mlewis@telebit.com\r
+    118   Salomon Technology Services          Paul Maurer II ---none---\r
+    119   NEC Corporation                              Yoshiyuki Akiyama\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 136]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+                           kddlab!ccs.mt.nec.co.jp!y-akiyam@uunet.uu.net\r
+    120   Fibermux               Michael Sung msung@ccrelay.fibermux.com\r
+    121   FTP Software Inc.                Stev Knowles stev@vax.ftp.com\r
+    122   Sony                   Takashi Hagiwara Hagiwara@Sm.Sony.Co.Jp\r
+    123   Newbridge Networks Corporation           James Watt ---none---\r
+    124   Racal-Milgo Information Systems            Maurice R. Turcotte\r
+                           mailrus!uflorida!rm1!dnmrt%rmatl@uunet.UU.NET\r
+    125   CR SYSTEMS                        Soren H. Sorensen ---none---\r
+    126   DSET Corporation               Dan Shia dset!shia@uunet.UU.NET\r
+    127   Computone                            Bill Versteeg bvs@NCR.COM\r
+    128   Tektronix, Inc.        Dennis Thomas dennist@tektronix.TEK.COM\r
+    129   Interactive Systems Corporation\r
+                                      Steve Alexander stevea@i88.isc.com\r
+    130 Banyan Systems Inc.\r
+                  Deepak Taneja eepak=Taneja%Eng%Banyan@Thing.banyan.com\r
+    131   Sintrom Datanet Limited\r
+    132   Bell Canada              Mark Fabbi markf@gpu.utcs.utoronto.ca\r
+    133   Crosscomm Corporation  Reuben Sivan crossc!rsivan@uunet.UU.NET\r
+    134   Rice University             Catherine Foulston cathyf@rice.edu\r
+    135   T3Plus Networking, Inc.     Harley Frazee harley@io.t3plus.com\r
+    136   Concurrent Computer Corporation\r
+                               John R. LoVerso loverso@westford.ccur.com\r
+    137   Basser                       Paul O'Donnell paulod@cs.su.oz.au\r
+    138   Luxcom\r
+    139   Artel                            Jon Ziegler Ziegler@Artel.com\r
+    140   Independence Technologies, Inc. (ITI)\r
+                                      Gerard Berthet gerard@indetech.com\r
+    141   Frontier Software Development        Narendra Popat ---none---\r
+    142   Digital Computer Limited               Osamu Fujiki ---none---\r
+    143   Eyring, Inc.                           Ron Holt ron@Eyring.COM\r
+    144   Case Communications                     Peter Kumik ---none---\r
+    145   Penril DataComm, Inc.    Keith Hogan keith%penril@uunet.uu.net\r
+    146   American Airlines                     Bill Keatley  ---none---\r
+    147   Sequent Computer Systems           Scott Hahn  sdh@sequent.com\r
+    148   Bellcore                 Kaj Tesink  kaj@nvuxr.cc.bellcore.com\r
+    149   Konkord Communications      Ken Jones konkord!ksj@uunet.uu.net\r
+    150   University of Washington\r
+                         Christopher Wheeler cwheeler@cac.washignton.edu\r
+    151   Develcon            Sheri Mayhew zaphod!sherim@herald.usask.ca\r
+    152   Solarix Systems             Paul Afshar paul@solar1.portal.com\r
+    153   Unifi Communications Corp.      Yigal Hochberg yigal@unifi.com\r
+    154   Roadnet                                Dale Shelton ---none---\r
+    155   Network Systems Corp.\r
+                              Nadya K. El-Afandi nadya@khara.network.com\r
+    156   ENE (European Network Engineering)        Peter Cox ---none---\r
+    157   Dansk Data Elektronik A/S           Per Bech Hansen pbh@dde.dk\r
+    158   Morning Star Technologies        Karl Fox karl@MorningStar.Com\r
+    159   Dupont EOP                          Oscar Rodriguez ---none---\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 137]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    160   Legato Systems, Inc.             Jon Kepecs  kepecs@Legato.COM\r
+    161   Motorola SPS               Vince Enriquez enriquez@sps.mot.com\r
+    162   European Space Agency (ESA)\r
+                              Eduardo EDUATO%ESOC.BITNET@CUNYVM.CUNY.EDU\r
+    163   BIM                             Bernard Lemercier bl@sunbim.be\r
+    164   Rad Data Communications Ltd.             Oft Israel ---none---\r
+    165   Intellicom                               Paul Singh ---none---\r
+    166   Shiva Corporation                    Phil Budne phil@Shiva.COM\r
+    167   Fujikura America                        Debbie Reed ---none---\r
+    168   Xlnt Designs INC (XDI)               Mike Anello mike@xlnt.com\r
+    169   Tandem Computers                          Rex Davis ---none---\r
+    170   BICC                          David A. Brown fzbicdb@uk.ac.ucl\r
+    171   D-Link Systems, Inc.                Henry P. Nagai  ---none---\r
+    172   AMP, Inc.                                Rick Downs ---none---\r
+    173   Netlink                              Mauro Zallocco ---none---\r
+    174   C. Itoh Electronics                     Larry Davis ---none---\r
+    175   Sumitomo Electric Industries (SEI)\r
+                                           Kent Tsuno tsuno@sumitomo.com\r
+    176   DHL Systems, Inc.\r
+                      David B. Gurevich dgurevic@rhubarb.ssf-sys.dhl.com\r
+    177   Network Equipment Technologies    Mark Tom marktom@tom.net.com\r
+    178   APTEC Computer Systems   Larry Burton ssds!larryb@uunet.UU.NET\r
+    179   Schneider & Koch & Co, Datensysteme GmbH Thomas Ruf tom@rsp.de\r
+    180   Hill Air Force Base   Russell G. Wilson rwilson@oodis01.af.mil\r
+    181   ADC Kentrox               Bruce Kropp ktxc8!bruce@uunet.UU.NET\r
+    182   Japan Radio Co.   Nagayuki Kojima nkojima@lab.nihonmusen.co.jp\r
+    183   Versitron                               Matt Harris ---none---\r
+    184   Telecommunication Systems             Hugh Lockhart ---none---\r
+    185   Interphase                            Gil Widdowson ---none---\r
+    186   Toshiba Corporation    Mike Asagami toshiba@mothra.nts.uci.edu\r
+    187   Clearpoint Research Corp.\r
+    188   Ascom                      Andrew Smith andrew@hasler.ascom.ch\r
+    189   Fujitsu America                           Chung Lam ---none---\r
+    190   NetCom Solutions, Inc.                   Dale Cabell---none---\r
+    191   NCR             Cheryl Krupczak clefor@secola.columbia.ncr.com\r
+    192   Dr. Materna GmbH                   Torsten Beyer tb@Materna.de\r
+    193   Ericsson Business Communications     Gunnar Nilsson ---none---\r
+    194   Metaphor Computer Systems              Paul Rodwick ---none---\r
+    195   Patriot Partners                       Paul Rodwick ---none---\r
+    196   The Software Group Limited (TSG)\r
+                              Ragnar Paulson tsgfred!ragnar@uunet.UU.NET\r
+    197   Kalpana, Inc.                         Anil Bhavnani ---none---\r
+    198   University of Waterloo\r
+                              R. J. White snmp-tech@watmath.waterloo.edu\r
+    199   CCL/ITRI\r
+                Ming-Perng Chen N100CMP0%TWNITRI1.BITNET@CUNYVM.CUNY.EDU\r
+    200   Coeur Postel            Professor Kynikos   Special Consultant\r
+    201   Mitsubish Cable Industries, Ltd.      Masahiko Hori ---none---\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 138]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    202   SMC                                   Lance Sprung  ---none---\r
+    203   Crescendo Communication, Inc.         Prem Jain  prem@cres.com\r
+    204   Goodall Software Engineering    Doug Goodall   goodall@crl.com\r
+    205   Intecom                                 Brad Parke  ---none---\r
+    206   Victoria University of Wellington\r
+                                  Jonathan Stone jonathan@isor.vuw.ac.nz\r
+    207   Allied Telesis, Inc.\r
+                        Scott Holley SCOTT_CLINTON_HOLLEY@cup.portal.com\r
+    208   Dowty Network Systems A/S         Hartvig Ekner  hj@dowtyns.dk\r
+    209   Protools                                   Glen Arp ---none---\r
+    210   Nippon Telegraph and Telephone Corp.\r
+                    Toshiharu Sugawara sugawara%wink.ntt.jp@RELAY.CS.NET\r
+    211   Fujitsu Limited  Ippei Hayashi hayashi@sysrap.cs.fujitsu.co.jp\r
+    212   Network Peripherals Inc.    Creighton Chong cchong@fastnet.com\r
+    213   Netronix, Inc.                         Jacques Roth ---none---\r
+    214   University of Wisconsin - Madison\r
+                      Dave Windorski DAVID.WINDORSKI@MAIL.ADMIN.WISC.EDU\r
+    215   NetWorth, Inc.                         Craig Scott  ---none---\r
+    216   Tandberg Data A/S          Harald Hoeg haho%huldra.uucp@nac.no\r
+    217   Technically Elite Concepts, Inc.\r
+                              Russell S. Dietz Russell_Dietz@Mcimail.com\r
+    218   Labtam Australia Pty. Ltd.\r
+                               Michael Podhorodecki michael@labtam.oz.au\r
+    219   Republic Telcom Systems, Inc.\r
+                           Steve Harris rtsc!harris@boulder.Colorado.edu\r
+    220   ADI Systems, Inc.                          Paul Liu ---none---\r
+    221   Microwave Bypass Systems, Inc.           Tad Artis  ---none---\r
+    222   Pyramid Technology Corp.         Richard Rein rein@pyramid.com\r
+    223   Unisys_Corp                           Lawrence Brow ---none---\r
+    224   LANOPTICS LTD., Israel\r
+                             Israel Drori raanan@techunix.technion.ac.il\r
+    225   NKK Corporation                         J. Yoshida  ---none---\r
+    226   MTrade UK Ltd.                     Peter Delchiappo ---none---\r
+    227   Acals                    Patrick Cheng pcheng@dill.ind.trw.com\r
+    228   ASTEC, Inc.                    Hiroshi Fujii fujii@astec.co.jp\r
+    229   Delmarva Power       John K. Scoggin, Jr. scoggin@delmarva.com\r
+    230   Telematics International, Inc.          Kevin Smith ---none---\r
+    231   Siemens Nixdorf Informations Syteme AG\r
+                                             Gunther Kroenert ---none---\r
+    232   Compaq\r
+    233   NetManage, Inc.          William Dunn netmanage@cup.portal.com\r
+    234   NCSU Computing Center        David Joyner david@unity.ncsu.edu\r
+    235   Empirical Tools and Technologies\r
+                                        Karl Auerbach karl@empirical.com\r
+    236   Samsung Group                    Hong K. Paik paik@samsung.com\r
+    237   Takaoka Electric Mfg. Co., Ltd.\r
+               Hidekazu Hagiwara hagiwara@takaoka.takaoka-electric.co.jp\r
+    238   Netrix Systems Corporation        Eldon S. Mast esm@netrix.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 139]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    239   WINDATA                               Bob Rosenbaum ---none---\r
+    240   RC International A/S                 Carl H. Dreyer chd@rci.dk\r
+    241   Netexp Research                       Henk Boetzkes ---none---\r
+    242   Internode Systems Pty Ltd\r
+                                 Simon Hackett simon@ucs.adelaide.edu.au\r
+    243   netCS Informationstechnik GmbH\r
+                                  Oliver Korfmacher okorf@bunt.netcs.com\r
+    244   Lantronix                  Rich Lyman  rich@alecto.gordian.com\r
+    245   Avatar Consultants\r
+                    Kory Hamzeh ames!avatar.com!kory@harvard.harvard.edu\r
+    246   Furukawa Electoric Co. Ltd.\r
+             Shoji Fukutomi kddlab!polo.furukawa.co.jp!fuku@uunet.UU.NET\r
+    247   AEG Electrcom                           R. Nurnberg ---none---\r
+    248   Richard Hirschmann GmbH & Co.\r
+                              Heinz Nisi mia@intsun.rus.uni-stuttgart.de\r
+    249   G2R Inc.                             Khalid Hireche ---none---\r
+    250   University of Michigan\r
+                             Tim Howes Tim.Howes@terminator.cc.umich.edu\r
+    251   Netcomm, Ltd.                    W.R. Maynard-Smith ---none---\r
+    252   Sable Technology Corporation         Rodney Thayer  ---none---\r
+    253   Xerox              Edwards E. Reed ipcontact.cin_ops@xerox.com\r
+    254   Conware Computer Consulting GmbH\r
+                                        Michael Sapich sapich@conware.de\r
+    255   Compatible Systems Corp.        John Gawf  gawf@compatible.com\r
+    256   Scitec Communications Systems Ltd.    Stephen Lewis ---none---\r
+    257   Transarc Corporation        Pat Barron Pat_Barron@TRANSARC.COM\r
+    258   Matsushita Electric Industrial Co., Ltd.\r
+                                         Nob Mizuno mizuno@isl.mei.co.jp\r
+    259   ACCTON Technology                        Don Rooney ---none---\r
+    260   Star-Tek, Inc.                   Carl Madison carl@startek.com\r
+    261   Codenoll Tech. Corp.                     Dan Willie ---none---\r
+    262   Formation, Inc.                       Carl Marcinik ---none---\r
+    263   Seiko Instruments, Inc. (SII)    Yasuyoshi Watanabe ---none---\r
+    264   RCE (Reseaux de Communication d'Entreprise S.A.)\r
+                                   Etienne Baudras-Chardigny  ---none---\r
+    265   Xenocom, Inc.               Sean Welch welch@raven.ulowell.edu\r
+    266   KABELRHEYDT                         Hubert Theissen ---none---\r
+    267   Systech Computer Corporation\r
+                                 Brian Petry systech!bpetry@uunet.UU.NET\r
+    268   Visual                             Brian O'Shea bos@visual.com\r
+    269   SDD (Scandinavian Airlines Data Denmark A/S)\r
+                                                  Per Futtrup ---none---\r
+    270   Zenith Electronics Corporation            David Lin ---none---\r
+    271   TELECOM FINLAND                        Petri Jokela ---none---\r
+    272   BinTec Computersystems               Marc Sheldon ms@BinTec.DE\r
+    273   EUnet Germany                   Marc Sheldon ms@Germany.EU.net\r
+    274   PictureTel Corporation              Oliver Jones oj@pictel.com\r
+    275   Michigan State University             Lih-Er Wey WEYLE@msu.edu\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 140]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    276   GTE Telecom Incorporated              Grant Gifford ---none---\r
+    277   Cascade Communications Corp.\r
+                                      Chikong Shue alpo!chi@uunet.uu.net\r
+    278   Hitachi Cable, Ltd.                   Takahiro Asai ---none---\r
+    279   Olivetti                 Marco Framba  framba@orc.olivetti.com\r
+    280   Vitacom Corporation         Parag Rastogi parag@cup.portal.com\r
+    281   INMOS                         Graham Hudspith  gwh@inmos.co.uk\r
+    282   AIC Systems Laboratories Ltd.  Glenn Mansfield glenn@aic.co.jp\r
+    283   Cameo Communications, Inc.               Alan Brind ---none---\r
+    284   Diab Data AB                        Mats Lindstrom mli@diab.se\r
+    285   Olicom A/S                         Lars Povlsen krus@olicom.dk\r
+    286   Digital-Kienzle Computersystems    Hans Jurgen Dorr ---none---\r
+    287   CSELT(Centro Studi E Laboratori Telecomunicazioni)\r
+                                  Paolo Coppo coppo@cz8700.cselt.stet.it\r
+    288   Electronic Data Systems     Mark Holobach holobach@tis.eds.com\r
+    289   McData Corporation      Glenn Levitt gpl0363@mcmail.mcdata.com\r
+    290   Harris Corporation       David Rhein davidr@ssd.csd.harris.com\r
+    291   Technology Dynamics, Inc. Chip Standifer TDYNAMICS@MCIMAIL.COM\r
+    292   DATAHOUSE Information Systems Ltd.           Kim Le ---none---\r
+    293   DSIR Network Group  Tony van der Peet srghtvp@grv.dsir.govt.nz\r
+    294   Texas Instruments      Blair Sanders Blair_Sanders@mcimail.com\r
+    295   PlainTree Systems Inc.     Paul Chefurka chefurka@plntree.UUCP\r
+    296   Hedemann Software Development\r
+                              Stefan Hedemann 100015.2504@compuserve.com\r
+    297   Fuji Xerox Co., Ltd.                              Hiroshi Kume\r
+                     Kume%KSPB%Fuji_Xerox@tcpgw.netg.ksp.fujixerox.co.jp\r
+    298   Asante Technology                    Hsiang Ming Ma ---none---\r
+    299   Stanford University\r
+                             RL "Bob" Morgan morgan@jessica.stanford.edu\r
+    300   Digital Link                            Jimmy Tu  jimmy@dl.com\r
+    301   Raylan Corporation            Mark S. Lewis mlewis@telebit.com\r
+    302   Datacraft                         Alan Lloyd alan@datacraft.oz\r
+    303   Hughes                            Keith McCloghrie KZM@HLS.COM\r
+    304   Farallon Computing, Inc.             Steven Sweeney ---none---\r
+    305   GE Information Services              Steve Bush sfb@ncoast.org\r
+    306   Gambit Computer Communications         Zohar Seigal ---none---\r
+    307   Livingston Enterprises, Inc.\r
+                                      Steve Willens steve@livingston.com\r
+    308   Star Technologies                     Jim Miner miner@star.com\r
+    309   Micronics Computers Inc.         Darren Croke dc@micronics.com\r
+    310   Basis, Inc.                    Heidi Stettner heidi@mtxinu.COM\r
+    311   Microsoft               John M. Ballard jballard@microsoft.com\r
+    312   US West Advance Technologies\r
+                                  Donna Hopkins dmhopki@uswat.uswest.com\r
+    313   University College London Shaw C. Chuang S.Chuang@cs.ucl.ac.uk\r
+    314   Eastman Kodak Company   W. James Colosky wjc@tornado.kodak.com\r
+    315   Network Resources Corporation       Kathy Weninger  ---none---\r
+    316   Atlas Telecom             Bruce Kropp ktxc8!bruce@uunet.UU.NET\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 141]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    317   Bridgeway                          Umberto Vizcaino ---none---\r
+    318   American Power Conversion Corp.\r
+                                   Peter C. Yoest apc!yoest@uunet.uu.net\r
+    319   DOE Atmospheric Radiation Measurement Project\r
+                                     Paul Krystosek krystosk@eid.anl.gov\r
+    320   VerSteeg CodeWorks                   Bill Versteeg bvs@NCR.COM\r
+    321   Verilink Corp                        Bill Versteeg bvs@NCR.COM\r
+    322   Sybus Corportation        Mark T. Dauscher mdauscher@sybus.com\r
+    323   Tekelec                                  Bob Grady  ---none---\r
+    324   NASA Ames Research Cente       Nick Cuccia cuccia@nas.nasa.gov\r
+    325   Simon Fraser University           Robert Urquhart quipu@sfu.ca\r
+    326   Fore Systems, Inc.                    Eric Cooper ecc@fore.com\r
+    327   Centrum Communications, Inc.             Vince Liu  ---none---\r
+    328   NeXT Computer, Inc.\r
+                            Lennart Lovstrand Lennart_Lovstrand@NeXT.COM\r
+    329   Netcore, Inc.                           Skip Morton ---none---\r
+    330   Northwest Digital Systems             Brian Dockter ---none---\r
+    331   Andrew Corporation                         Ted Tran ---none---\r
+    332   DigiBoard                        Dror Kessler  dror@digibd.com\r
+    333   Computer Network Technology Corp.   Bob Meierhofer  ---none---\r
+    334   Lotus Development Corp.      Bill Flanagan bflanagan@lotus.com\r
+    335   MICOM Communication Corporation\r
+                                      Donna Beatty SYSAD@prime.micom.com\r
+    336   ASCII Corporation            Toshiharu Ohno tony-o@ascii.co.jp\r
+    337   PUREDATA Research                Tony Baxter tony@puredata.com\r
+    338   NTT DATA               Yasuhiro Kohata    kohata@rd.nttdata.jp\r
+    339   Empros Systems International   David Taylor dtaylor@ems.cdc.ca\r
+    340   Kendall Square Research (KSR)     Dave Hudson tdh@uunet.UU.NET\r
+    341   Martin Marietta Energy Systems     Gary Haney  haneyg@ornl.gov\r
+    342   Network Innovations            Pete Grillo pl0143@mail.psi.net\r
+    343   Intel Corporation          Brady Orand borand@pcocd2.intel.com\r
+    344   Proxar                           Ching-Fa Hwang cfh@proxar.com\r
+    345   Epson Research Center    Richard Schneider  rschneid@epson.com\r
+    346   Fibernet                            George Sandoval ---none---\r
+    347   Box Hill Systems Corporation        Tim Jones  tim@boxhill.com\r
+    348   American Express Travel Related Services\r
+                                        Jeff Carton jcarton@amex-trs.com\r
+    349   Compu-Shack  Tomas Vocetka OPLER%CSEARN.bitnet@CUNYVM.CUNY.EDU\r
+    350   Parallan Computer, Inc.               Charles Dulin ---none---\r
+    351   Stratacom                         Clyde Iwamoto cki@strata.com\r
+    352   Open Networks Engineering, Inc.      Russ Blaesing rrb@one.com\r
+    353   ATM Forum                         Keith McCloghrie KZM@HLS.COM\r
+    354   SSD Management, Inc.                      Bill Rose ---none---\r
+    355   Automated Network Management, Inc.   Carl Vanderbeek ---none--\r
+    356   Magnalink Communications Corporation\r
+                                            David E. Kaufman  ---none---\r
+    357   TIL Systems, Ltd.                   Garry McCracken ---none---\r
+    358   Skyline Technology, Inc.                   Don Weir ---none---\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 142]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    359   Nu-Mega Technologies, Inc.              Dirk Smith  ---none---\r
+    360   Morgan Stanley & Co. Inc.\r
+                                 Victor Kazdoba vsk@katana.is.morgan.com\r
+    361   Integrated Business Network            Michael Bell ---none---\r
+    362   L & N Technologies, Ltd.               Steve Loring ---none---\r
+    363   Cincinnati Bell Information Systems, Inc.\r
+                                         Deron Meranda dmeranda@cbis.COM\r
+    364   OSCOM International\r
+                             Farhad Fozdar f_fozdar@fennel.cc.uwa.edu.au\r
+    365   MICROGNOSIS                Paul Andon pandon@micrognosis.co.uk\r
+    366   Datapoint Corporation     Lee Ziegenhals lcz@sat.datapoint.com\r
+    367   RICOH Co. Ltd.\r
+                  Toshio Watanabe watanabe@godzilla.rsc.spdd.ricoh.co.jp\r
+    368   Axis Communications AB              Martin Gren martin@axis.se\r
+    369   Pacer Software               Wayne Tackabury wft@pacersoft.com\r
+    370   Axon Networks Inc.            Robin Iddon axon@cix.clink.co.uk\r
+    371   Brixton Systems, Inc.       Peter S. Easton easton@brixton.com\r
+    372   GSI                   Etienne Demailly etienne.demailly@gsi.fr\r
+    373   Tatung Co., Ltd.\r
+                  Chih-Yi Chen TCCISM1%TWNTTIT.BITNET@pucc.Princeton.EDU\r
+    374   DIS Research LTD.                 Ray Compton rayc@command.com\r
+    375   Quotron Systems, Inc.\r
+                               Richard P. Stubbs richard@atd.quotron.com\r
+    376   Dassault Electronique\r
+                               Olivier J. Caleff caleff@dassault-elec.fr\r
+    377   Corollary, Inc.               James L. Gula gula@corollary.com\r
+    378   SEEL, Ltd.                              Ken Ritchie ---none---\r
+    379   Lexcel                           Mike Erlinger mike@lexcel.com\r
+    380   Sophisticated Technologies, Inc.\r
+                                 Bill Parducci 70262.1267@compuserve.com\r
+    381   OST                                         A. Pele ---none---\r
+    382   Megadata Pty Ltd.      Andrew McRae andrew@megadata.mega.oz.au\r
+    383   LLNL Livermore Computer Center\r
+                                Dan Nessett nessett@ocfmail.ocf.llnl.gov\r
+    384   Dynatech Communications  Graham Welling s8000!gcw@uunet.uu.net\r
+    385   Symplex Communications Corp.             Cyrus Azar ---none---\r
+    386   Tribe Computer Works               Ken Fujimoto fuji@tribe.com\r
+    387   Taligent, Inc.            Lorenzo Aguilar lorenzo@taligent.com\r
+    388   Symbol Technologies, Inc.\r
+                      John Kramer +1-408-369-2679 jkramer@psd.symbol.com\r
+    389   Lancert                                 Mark Hankin ---none---\r
+    390   Alantec                          Paul V. Fries pvf@alantec.com\r
+    391   Ridgeback Solutions\r
+                           Errol Ginsberg bacchus!zulu!errol@uu2.psi.com\r
+    392   Metrix, Inc.                 D. Venkatrangan venkat@metrix.com\r
+    393   Excutive Systems/XTree Company\r
+                                       Dale Cabell cabell@smtp.xtree.com\r
+    394   NRL Communication Systems Branch\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 143]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+                                        R. K. Nair nair@itd.nrl.navy.mil\r
+    395   I.D.E. Corporation                        Rob Spade ---none---\r
+    396   Matsushita Electric Works, Ltd.\r
+                                    Claude Huss claude@trc.mew.mei.co.jp\r
+    397   MegaPAC                                  Ian George ---none---\r
+    398   Pilkington Communication Systems      Dave Atkinson ---none---\r
+    399   Hitachi Computer Products (America), Inc.\r
+                                    Masha Golosovker masha@hicomb.hi.com\r
+    400   METEO FRANCE                 Remy Giraud  Remy.Giraud@meteo.fr\r
+    401   PRC Inc.                          Jim Noble  noble_jim@prc.com\r
+    402   Wal*Mart Stores, Inc.     Mike Fitzgerel  mlfitzg@wal-mart.com\r
+    403   Nissin Electric Company, Ltd.   Aki Komatsuzaki (408) 737-0274\r
+    404   Distributed Support Information Standard\r
+                                            Mike Migliano <mike@uwm.edu>\r
+    405   SMDS Interest Group (SIG)\r
+                                Elysia C. Tan <ecmt1@sword.bellcore.com>\r
+    406   SolCom Systems Ltd.                    Hugh Evans  0506 873855\r
+    407   Bell Atlantic  Colin deSa socrates!bm5ld15@bagout.BELL-ATL.COM\r
+    408   Advanced Multiuser Technologies Corporation\r
+    409   Mitsubishi Electric Corporation\r
+                            Yoshitaka Ogawa <ogawa@nkai.cow.melco.co.jp>\r
+    410   C.O.L. Systems, Inc.         Frank Castellucci  (914) 277-4312\r
+    411   University of Auckland\r
+                               Nevil Brownlee < n.brownlee@aukuni.ac.nz>\r
+    412   Desktop Management Task Force (DMTF)\r
+                                   Dave Perkins <dperkins@synoptics.com>\r
+    413   Klever Computers, Inc.  Tom Su  408-735-7723    kci@netcom.com\r
+    414   Amdahl Corporation              Steve Young  sy@uts.admahl.com\r
+    415   JTEC Pty, Ltd.                       Jan Bartel  (02) 809 6933\r
+    416   Matra Communcation         Hong-Loc Nguyen  (33.1) 34.60.85.25\r
+    417   HAL Computer Systems       Michael A. Petonic  petonic@hal.com\r
+    418   Lawrence Berkeley Laboratory       Russ Wright  wright@lbl.gov\r
+    419   Dale Computer Corporation          Dean Craven  1-800-336-7483\r
+    420 IPTC, Universitaet of Tuebingen\r
+                   Andreas J. Haug <ahaug@mailserv.zdv.uni-tuebingen.de>\r
+    421   Bytex Corporation\r
+                        Mary Ann Burt <bytex!ws054!maryann@uunet.UU.NET>\r
+    422   Cogwheel, Inc.                   Brian Ellis  bri@Cogwheel.COM\r
+    423   Lanwan Technologies                 Thomas Liu  (408) 986-8899\r
+    424   Thomas-Conrad Corporation             Karen Boyd  512-836-1935\r
+    425   TxPort                              Bill VerSteeg  bvs@ver.com\r
+    426   Compex, Inc.             Andrew Corlett  BDA@ORION.OAC.UCI.EDU\r
+    427   Evergreen Systems, Inc.             Bill Grace  (415) 897-8888\r
+    428   HNV, Inc.                 James R. Simons  jrs@denver.ssds.COM\r
+    429   U.S. Robotics, Inc.               Chris Rozman  chrisr@usr.com\r
+    430   Canada Post Corporation          Walter Brown  +1 613 722-8843\r
+    431   Open Systems Solutions, Inc.         David Ko  davidk@ossi.com\r
+    432   Toronto Stock Exchange               Paul Kwan  (416) 947-4284\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 144]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    433   MamakosTransSys Consulting\r
+                                   Louis A. Mamakos   louie@transsys.com\r
+    434   EICON                      Vartan Narikian  vartan@eicon.qc.ca\r
+    435   Jupiter Systems                Russell Leefer  rml@jupiter.com\r
+    436   SSTI                             Philip Calas (33) 61 44 19 51\r
+    437   Grand Junction Networks  Randy Ryals  randyr@grandjunction.com\r
+    438   Anasazi, Inc.                   Chad Larson (chad@anasazi.com)\r
+    439   Edward D. Jones and Company        John Caruso  (314) 851-3422\r
+    440   Amnet, Inc.                          Richard Mak mak@amnet.COM\r
+    441   Chase Research                           Kevin Gage ---none---\r
+    442   PEER Networks                    Randy Presuhn  randy@peer.com\r
+    443   Gateway Communications, Inc.            Ed Fudurich ---none---\r
+    444   Peregrine Systems              Eric Olinger eric@peregrine.com\r
+    445   Daewoo Telecom               SeeYoung Oh oco@scorpio.dwt.co.kr\r
+    446   Norwegian Telecom Research        Paul Hoff paalh@brage.nta.no\r
+    447   WilTel  Anil Prasad                     anil_prasad@wiltel.com\r
+    448   Ericsson-Camtec                        Satish Popat ---none---\r
+    449   Codex                                Thomas McGinty ---none---\r
+    450   Basis                          Heidi Stettner heidi@mtxinu.COM\r
+    451   AGE Logic                                Syd Logan syd@age.com\r
+    452   INDE Electronics                   Gordon Day gday@inde.ubc.ca\r
+    453   ISODE Consortium                 Steve Kille S.Kille@isode.com\r
+    454   J.I. Case                     Mike Oswald mike@helios.uwsp.edu\r
+    455   Trillium                 Jeff Lawrence j_lawrence@trillium.com\r
+    456   Bacchus Inc.     Errol Ginsberg bacchus!zulu!errol@uu2.psi.com\r
+    457   MCC                           Doug Rosenthal rosenthal@mcc.com\r
+    458   Stratus Computer                 Dave Snay  dks@sw.stratus.com\r
+    459   Quotron              Richard P. Stubbs richard@atd.quotron.com\r
+    460   Beame & Whiteside                  Carl Beame beame@ns.bws.com\r
+    461   Cellular Technical Services             Greg Hummel ---none---\r
+    462   Shore Microsystems, Inc.           Gordon Elam  (309) 229-3009\r
+    463   Telecommunications Techniques Corp.  Tom Nisbet  nisbet@tt.com\r
+    464   DNPAP (Technical University Delft)\r
+                   Jan van Oorschot <bJan.vOorschot@dnpap.et.tudelft.nl>\r
+    465   Plexcom, Inc.                     Bruce Miller  (805) 522-3333\r
+    466   Tylink                         Stavros Mohlulis (508) 285-0033\r
+    467   Brookhaven National Laboratory\r
+                                        Dave Stampf drs@bach.ccd.bnl.gov\r
+    468   Computer Communication Systems\r
+                            Gerard Laborde <Gerard.Laborde@sp1.y-net.fr>\r
+    469   Norand Corp.                         Rose Gorrell 319-269-3100\r
+    470   MUX-LAP                        Philippe Labrosse  514-735-2741\r
+    471   Premisys Communications, Inc\r
+                        Mike MacFaden <premisys!mike@fernwood.mpk.ca.us>\r
+    472   Bell South Telecommunications       Johnny Walker 205-988-7105\r
+    473   J. Stainsbury PLC                 Steve Parker  44-71-921-7550\r
+    474   Ki Research Inc                Toni Barckley  410-290-0355x220\r
+    475 Wandel and Goltermann Technologies\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 145]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+                         David Walters 919-941-5730x4203 <walter@wg.com>\r
+    476   Emerson Computer Power\r
+                            Roger Draper  714-457-3638  rdraper@cerf.net\r
+    477   Network Software Associates        Jeffery Chiao  714-768-4013\r
+    478   Procter and Gamble           Peter Marshall  513-983-1100x5988\r
+    479 Meridian Technology Corporation\r
+                        Kenneth B. Denson <kdenson@magic.meridiantc.com>\r
+    480   QMS, Inc.                           Bill Lott  lott@imagen.com\r
+    481   Network Express        Tom Jarema  313-761-5051  ITOH@MSEN.COM\r
+    482   LANcity Corporation               Pam Yassini  pam@lancity.com\r
+    483   Dayna Communications, Inc.\r
+                                  Sanchaita Datta  datta@signus.utah.edu\r
+    484   kn-X Ltd.                               Sam Lau  44 943 467007\r
+    485   Sync Research, Inc.                Alan Bartky  (714) 588-2070\r
+    486   PremNet                  Ken Huang  HuangK@rimail.interlan.com\r
+    487   SIAC                               Peter Ripp   (212) 383-9061\r
+    488   New York Stock Exchange            Peter Ripp   (212) 383-9061\r
+    489   American Stock Exchange            Peter Ripp   (212) 383-9061\r
+    490   FCR Software, Inc.                   Brad Parker  brad@fcr.com\r
+    491   National Medical Care, Inc.      Robert Phelan  (617) 466-9850\r
+    492   Dialogue Communication Systemes, S.A.\r
+                                       Klaus Handke   +(49) 30 802 24 97\r
+    493   NorTele                            Bjorn Kvile  +47 2 48 89 90\r
+    494   Madge Networks, Inc.\r
+                      Duncan Greatwood dgreatwo@madge.mhs.compuserve.com\r
+    495   Memotec Communications   Graham Higgins ghiggins@teleglobe.com\r
+    496   CTON  Nick Hennenfent                        nicholas@cton.com\r
+    497   Leap Technology, Inc.         George Economou  george@leap.com\r
+    498   General DataComm, Inc.       William Meltzer   meltzer@gdc.com\r
+    499   ACE Communications, Ltd.              Danny On  972-3-570-1423\r
+    500   Automatic Data Processing (ADP)      Alex Rosin (201) 714-3982\r
+    501   Programa SPRITEL                              Alberto Martinez\r
+                              Martinez_Alberto_SPRITEL@euskom.spritel.es\r
+    502   Adacom                              Aial Haorch  972-4-899-899\r
+    503   Metrodata Ltd            Nick Brown  100022.767@compuserve.com\r
+    504   Ellemtel Telecommunication Systems Laboratories\r
+                        Richard G Bruvik  Richard.Bruvik@eua.ericsson.se\r
+    505   Arizona Public Service          Duane Booher  DBOOHER@APSC.COM\r
+    506   NETWIZ, Ltd.,    Emanuel Wind  eumzvir@techunix.technion.ac.il\r
+    507   Science and Engineering Research Council (SERC)    Paul Kummer\r
+                                                P.Kummer@daresbury.ac.uk\r
+    508   The First Boston Corporation                        Kevin Chou\r
+                                       csfb1!dbadmin4!kchou@uunet.UU.NET\r
+    509   Hadax Electronics Inc.                       Marian Kramarczyk\r
+                                               73477.2731@compuserve.com\r
+    510   VTKK            Markku Lamminluoto  lamminluoto@vtkes1.vtkk.fi\r
+    511   North Hills Israel Ltd.   Carmi Cohen  carmi@north.hellnet.org\r
+    512   TECSIEL                       R. Burlon   sr@teculx.tecsiel.it\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 146]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    513   Bayerische Motoren Werke (BMW) AG             Michael Connolly\r
+                                                    mconnolly@net.bmw.de\r
+    514   CNET Technologies                       Nelson Su 408-954-8000\r
+    515   MCI   Kurt Robohm                          krobohm@mcimail.com\r
+    516   Human Engineering AG (HEAG)                        Urs Brunner\r
+                                              ubrunner@clients.switch.ch\r
+    517   FileNet Corporation                 Joe Raby  raby@filenet.com\r
+    518   NFT-Ericsson                    Kjetil Donasen  +47 2 84 24 00\r
+    519   Dun & Bradstreet                    Vic Smagovic  908-464-2079\r
+    520   Intercomputer Communications      Brian Kean  513-745-0500x244\r
+    521   Defense Intelligence Agency\r
+                              Barry Atkinson   DIA-DMS@DDN-CONUS.DDN.MIL\r
+    522   Telesystems SLW Inc.                   Joe Magony 416-441-9966\r
+    523   APT Communications                  David Kloper  301-831-1182\r
+    524   Delta Airlines                           Jim Guy  404-715-2948\r
+    525   California Microwave                 Kevin Braun  408-720-6520\r
+    526   Avid Technology Inc                 Steve Olynyk  508-640-3328\r
+    527   Integro Advanced Computer Systems\r
+                                         Pascal Turbiez  +33-20-08-00-40\r
+    528   RPTI                                Chris Shin  886-2-918-3006\r
+    529   Ascend Communications Inc.            Marc Hyman  510-769-6001\r
+    530   Eden Computer Systems Inc.          Louis Brando  305-591-7752\r
+    531   Kawasaki-Steel Corp\r
+                           Tomoo Watanabe  nrd@info.kawasaki-steel.co.jp\r
+    532   Barclays                     Malcolm Houghton  +44 202 671 212\r
+    533   B.U.G., Inc.                 Isao Tateishi  tateishi@bug.co.jp\r
+    534   Exide Electronics      Brian Hammill  hamill@dolphin.exide.com\r
+    535   Superconducting Supercollider Lab.\r
+                           Carl W. Kalbfleisch    cwk@irrational.ssc.gov\r
+    536   Triticom                             Jim Bales  (612) 937-0772\r
+    537   Universal Instruments Corp.\r
+                    Tom Dinnel   BA06791%BINGVAXA.bitnet@CUNYVM.CUNY.EDU\r
+    538   Information Resources, Inc.         Jeff Gear  jjg@infores.com\r
+    539   Applied Innovation, Inc.   Dean Dayton  dean@aicorp.cmhnet.org\r
+    540   Crypto AG                      Roland Luthi  luthi@iis.ethz.ch\r
+    541   Infinite Networks, Ltd.          Sean Harding  +44 923 710 277\r
+    542   Rabbit Software                     Bill Kwan  kwan@rabbit.com\r
+    543   Apertus Technologies       Stuart Stanley  stuarts@apertus.com\r
+    544   Equinox Systems, Inc.       Monty Norwood  1-800-275-3500 x293\r
+    545   Hayes Microcomputer Products\r
+                     Chris Roussel hayes!hayes.com!croussel@uunet.UU.NET\r
+    546   Empire Technologies Inc. Cheryl Krupczak  cheryl@cc.gatech.edu\r
+    547   Glaxochem, Ltd.                     Andy Wilson  0229 52261547\r
+    548   KPY Network Partners, Corp.\r
+                                  Gordon Vickers   sccs@pizza.netcom.com\r
+    549   Agent Technology, Inc.  Ibi Dhilla  idhilla@genesis.nred.ma.us\r
+    550   Dornier GMBH                Arens Heinrech  49-7545-8 ext 9337\r
+    551   Telxon Corporation      Frank Ciotti  frankc@teleng.telxon.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 147]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    552   Entergy Corporation                 Louis Cureau  504-364-7630\r
+    553   Garrett Communications Inc.        Igor Khasin  (408) 980-9752\r
+    554   Agile Networks, Inc.          Dave Donegan  ddonegan@agile.com\r
+    555   Larscom                           Sameer Jayakar  415-969-7572\r
+    556   Stock Equipment                    Karl Klebenow  216-543-6000\r
+    557   ITT Corporation      Kevin M. McCauley  kmm@vaxf.acdnj.itt.com\r
+    558   Universal Data Systems, Inc.\r
+                           Howard Cunningham   70400.3671@compuserve.com\r
+    559   Sonix Communications, Ltd.      David Webster  +44 285 641 651\r
+    560   Paul Freeman Associates, Inc.\r
+                                      Pete Wilson  pwilson@world.std.com\r
+    561   John S. Barnes, Corp.              Michael Lynch  704-878-4107\r
+    562   Northern Telecom, Ltd.\r
+                             Glenn Waters  613-763-3933 <gwaters@bnr.ca>\r
+    563   CAP Debris       Patrick Preuss  ppr@lfs.hamburg.cap-debris.de\r
+    564   Telco Systems NAC            Harry Hirani  Harry@telco-nac.com\r
+    565   Tosco Refining Co                 Fred Sanderson  510-602-4358\r
+    566   Russell Info Sys                      Atul Desai  714-362-4040\r
+    567   University of Salford   Richard Letts  R.J.Letts@salford.ac.uk\r
+    568   NetQuest Corp.         Jerry Jacobus  netquest@tigger.jvnc.net\r
+    569   Armon Networking Ltd.    Yigal Jacoby  yigal@armon.hellnet.org\r
+    570   IA Corporation                Didier Fort  Didier.Fort@lia.com\r
+    571   AU-System Communicaton AB           Torbjorn Ryding  8-7267572\r
+    572   GoldStar Information & Communications, Ltd.\r
+                                      Soo N. Kim  ksn@giconet.gsic.co.kr\r
+    573   SECTRA AB                        Tommy Pedersen  tcp@sectra.se\r
+    574   ONEAC Corporation                Bill Elliot  ONEACWRE@AOL.COM\r
+    575   Tree Technologies           Michael Demjanenko  (716) 688-4640\r
+    576   GTE Government Systems         Henry Hernandez  (617) 455-2942\r
+    577   Denmac Systems, Inc.            Andy Denenberg  (708) 291-7760\r
+    578   Interlink Computer Sciences, Inc.\r
+                                         Mike Mazurek  mfm@interlink.com\r
+    579   Bridge Information Systems, Inc. Stephen Harvey (314) 567-8482\r
+    580   Leeds and Northrup Australia (LNA) Nigel Cook nigelc@lna.oz.au\r
+    581   BHA Computer                       David Hislop  rob@bha.oz.au\r
+    582   Newport Systems Solutions, Inc.\r
+                                       Pauline Chen  paulinec@netcom.com\r
+    583   Atrium Technologies     Narender Reddy Vangati  vnr@atrium.com\r
+    584   ROBOTIKER                 Maribel Narganes  maribel@teletek.es\r
+    585   PeerLogic Inc.          Ratinder Ahuja  ratinder@peerlogic.com\r
+    586   Digital Transmittion Systems        Bill VerSteeg  bvs@ver.com\r
+    587   Far Point Communications            Bill VerSteeg  bvs@ver.com\r
+    588   Xircom                              Bill VerSteeg  bvs@ver.com\r
+    589   Mead Data Central         Stephanie Bowman  steph@meaddata.com\r
+    590   Royal Bank of Canada                    N. Lim  (416) 348-5197\r
+    591   Advantis, Inc.                       Janet Brehm  813 878-4298\r
+    592   Chemical Banking Corp.  Paul McDonnell  pmcdonnl@world.std.com\r
+    593   Eagle Technology                    Ted Haynes  (408) 441-4043\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 148]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    594   British Telecom               Ray Smyth  rsmyth@bfsec.bt.co.uk\r
+    595   Radix BV                     P. Groenendaal  project2@radix.nl\r
+    596   TAINET Communication System Corp.\r
+                                    Joseph Chen  +886-2-6583000 (R.O.C.)\r
+    597   Comtek Services Inc.              Steve Harris  (703) 506-9556\r
+    598   Fair Issac   Steve Pasadis  apple.com!fico!sxp  (415) 472-2211\r
+    599   AST Research Inc.                      Bob Beard  bobb@ast.com\r
+    600   Soft*Star s.r.l. Ing. Enrico Badella softstar@pol88a.polito.it\r
+    601   Bancomm                            Joe Fontes  jwf@bancomm.com\r
+    602   Trusted Information Systems, Inc.\r
+                                         James M. Galvin  galvin@tis.com\r
+    603   Harris & Jeffries, Inc.         Deepak Shahane  hjinc@CERF.NET\r
+    604   Axel Technology Corp.               Henry Ngai  (714) 455-1688\r
+    605   GN Navtel, Inc.                       Joe Magony  416-479-8090\r
+    606   CAP debis                    Patrick Preuss  +49 40 527 28 366\r
+    607   Lachman Technology, Inc.  Steve Alexander   stevea@lachman.com\r
+    608   Galcom Networking Ltd.\r
+                             Zeev Greenblatt  galnet@vax.trendline.co.il\r
+    609   BAZIS                            M. van Luijt  martin@bazis.nl\r
+    610   SYNAPTEL                       Eric Remond  remond@synaptel.fr\r
+    611   Investment Management Services, Inc.\r
+                                J. Laurens Troost  rens@stimpys.imsi.com\r
+    612   Taiwan Telecommunication Lab\r
+                 Dennis Tseng   LOUIS%TWNMOCTL.BITNET@pucc.Princeton.EDU\r
+    613   Anagram Corporation        Michael Demjanenko   (716) 688-4640\r
+    614   Univel                      John Nunneley  jnunnele@univel.com\r
+    615   University of California, San Diego\r
+                                        Arthur Bierer   abierer@ucsd.edu\r
+    616   CompuServe   Ed Isaacs, Brian Biggs  SYSADM@csi.compuserve.com\r
+    617   Telstra - OTC Australia\r
+                  Peter Hanselmann    peterhan@turin.research.otc.com.au\r
+    618   Westinghouse Electric Corp.\r
+                                Ananth Kupanna   ananth@access.digex.com\r
+    619   DGA Ltd.              Tom L. Willis  twillis@pintu.demon.co.uk\r
+    620   Elegant Communications Inc.\r
+                                  Robert Story  Robert.Story@Elegant.COM\r
+    621   Experdata                  Claude Lubin  clubin@expdat.gna.org\r
+    622   Unisource Business Networks Sweden AB\r
+                                               Goran Sterner gsr@tip.net\r
+    623   Molex, Inc.                    Steven Joffe  molex@mcimail.com\r
+    624   Quay Financial Software            Mick Fleming  mickf@quay.ie\r
+    625   VMX Inc.                     Joga Ryali  joga@vmxi.cerfnet.com\r
+    626   Hypercom, Inc.                  Noor Chowdhury  (602) 548-2113\r
+    627   University of Guelph   Kent Percival  Percival@CCS.UoGuelph.CA\r
+    628   DIaLOGIKa                  Juergen Jungfleisch  0 68 97 9 35-0\r
+    629   NBASE Switch Communication\r
+                            Sergiu Rotenstein  75250.1477@compuserve.com\r
+    630   Anchor Datacomm B.V.      Erik Snoek  sdrierik@diamond.sara.nl\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 149]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    631   PACDATA                     John Reed  johnr@hagar.pacdata.com\r
+    632   University of Colorado         Evi Nemeth  evi@cs.colorado.edu\r
+    633   Tricom Communications Limited\r
+                                  Robert Barrett  0005114429@mcimail.com\r
+    634   Santix Software GmbH\r
+                       Michael Santifaller   santi%mozart@santix.guug.de\r
+    635   FastComm Communications Corp.\r
+                               Bill Flanagan   70632.1446@compuserve.com\r
+    636   The Georgia Institute of Technology\r
+                      Michael Mealling   michael.mealling@oit.gatech.edu\r
+    637   Alcatel Data Networks\r
+                        Douglas E. Johnson doug.e.johnson@adn.sprint.com\r
+    638   GTECH                             Brian Ruptash  bar@gtech.com\r
+    639   UNOCAL Corporation                     Peter Ho  ho@unocal.com\r
+    640   First Pacific Network             Randy Hamilton  408-703-2763\r
+    641   Lexmark International              Don Wright  don@lexmark.com\r
+    642   Qnix Computer             Sang Weon, Yoo  swyoo@qns.qnix.co.kr\r
+    643   Jigsaw Software Concepts (Pty) Ltd.\r
+                                   Willem van Biljon  wvb@itu2.sun.ac.za\r
+    644   VIR, Inc.                          Mark Cotton  (215) 364-7955\r
+    645   SFA Datacomm Inc.           Don Lechthaler  lech@world.std.com\r
+    646   SEIKO Telecommunication Systems, Inc.\r
+                                        Lyn T. Robertson  (503) 526-5638\r
+    647   Unified Management              Andy Barnhouse  (612) 561-4944\r
+    648   RADLINX Ltd.                Ady Lifshes  ady%rndi@uunet.uu.net\r
+    649   Microplex Systems Ltd.            Henry Lee  hyl@microplex.com\r
+    650   Objecta Elektronik & Data AB      Johan Finnved  jf@objecta.se\r
+    651   Phoenix Microsystems                Bill VerSteeg  bvs@ver.com\r
+    652   Distributed Systems International, Inc.\r
+                                              Ron Mackey  rem@dsiinc.com\r
+    653   Evolving Systems, Inc.   Judith C. Bettinger judy@evolving.com\r
+    654   SAT GmbH           Walter Eichelburg  100063.74@compuserve.com\r
+    655   CeLAN Technology, Inc.                Mark Liu  886--35-772780\r
+    656   Landmark Systems Corp.\r
+                               Steve Sonnenberg  steves@socrates.umd.edu\r
+    657   Netone Systems Co., Ltd.\r
+                                 YongKui Shao  syk@new-news.netone.co.jp\r
+    658   Loral Data Systems     Jeff Price  jprice@cps070.lds.loral.com\r
+    659   Cellware Broadband Technology   Michael Roth  mike@cellware.de\r
+    660   Mu-Systems                Gaylord Miyata  miyata@world.std.com\r
+    661   IMC Networks Corp.                  Jerry Roby  (714) 724-1070\r
+    662   Octel Communications Corp.         Alan Newman  (408) 321-5182\r
+    663   RIT Technologies LTD.      Ghiora Drori  drori@dcl.hellnet.org\r
+    664   Adtran                                Jeff Wells  205-971-8000\r
+    665   PowerPlay Technologies, Inc.        Ray Caruso  rayman@csn.org\r
+    666   Oki Electric Industry Co., Ltd.\r
+                                Shigeru Urushibara  uru@cs1.cs.oki.co.jp\r
+    667   Specialix International  Jeremy Rolls  jeremyr@specialix.co.uk\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 150]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    668   INESC (Instituto de Engenharia de Sistemas e Computadores)\r
+                                      Pedro Ramalho Carlos  prc@inesc.pt\r
+    669   Globalnet Communications         Real Barriere  (514) 651-6164\r
+    670   Product Line Engineer SVEC Computer Corp.\r
+                                  Rich Huang   msumgr@enya.cc.fcu.edu.tw\r
+    671   Printer Systems Corp.              Bill Babson  bill@prsys.com\r
+    672   Contec Micro Electronics USA       David Sheih  (408) 434-6767\r
+    673   Unix Integration Services         Chris Howard   chris@uis.com\r
+    674   Dell Computer Corporation        Steven Blair  sblair@dell.com\r
+    675   Whittaker Electronic Systems   Michael McCune  mccune@cerf.net\r
+    676   QPSX Communications          David Pascoe    davidp@qpsx.oz.au\r
+    677   Loral WDl      Mike Aronson  Mike_Aronson@msgate.wdl.loral.com\r
+    678   Federal Express Corp.             Randy Hale    (901) 369-2152\r
+    679   E-COMMS Inc.                    Harvey Teale    (206) 857-3399\r
+    680   Software Clearing House                 Tom Caris   ca@sch.com\r
+    681   Antlow Computers LTD.               C. R. Bates  44-635-871829\r
+    682   Emcom Corp.                       Mike Swartz   emcom@cerf.net\r
+    683   Extended Systems, Inc.\r
+                               Al Youngwerth alberty@tommy.extendsys.com\r
+    684   Sola Electric                     Mike Paulsen  (708) 439-2800\r
+    685   Esix Systems, Inc.           Anthony Chung  esix@esix.tony.com\r
+    686   3M/MMM                           Chris Amley   ccamley@mmm.com\r
+    687   Cylink Corp.                          Ed Chou    ed@cylink.com\r
+    688   Znyx Advanced Systems Division, Inc.\r
+                                          Alan Deikman  aland@netcom.com\r
+    689   Texaco, Inc.                      Jeff Lin     linj@Texaco.com\r
+    690   McCaw Cellular Communication Corp. Tri Phan tri.phan@mccaw.com\r
+    691   ASP Computer Product Inc. Elise Moss 71053.1066@compuserve.com\r
+    692   HiPerformance Systems              Mike Brien  +27-11-806-1000\r
+    693   Regionales Rechenzentrum\r
+                   Sibylle Schweizer  unrz54@daphne.rrze.uni-erlangen.de\r
+    694   SAP AG                          Dr. Uwe Hommel  +49 62 27 34 0\r
+    695   ElectroSpace System Inc.\r
+                               Dr. Joseph Cleveland e03353@esitx.esi.org\r
+    696   ( Unassigned )\r
+    697   MultiPort Software     Reuben Sivan  72302.3262@compuserve.com\r
+    698   Combinet, Inc.               Samir Sawhney  samir@combinet.com\r
+    699   TSCC                               Carl Wist    carlw@tscc.com\r
+    700   Teleos Communications Inc.    Bill Nayavich  wln@teleoscom.com\r
+    701   Alta Research                   Amy Saperstein  (305) 428-8535\r
+    702   Independence Blue Cross              Bill Eshbach  esh@ibx.com\r
+    703   ADACOM Station Interconnectivity LTD.\r
+                                            Itay Kariv  +9 72 48 99 89 9\r
+    704   MIROR Systems                     Frank Kloes  +27 12 911 0003\r
+    705   Merlin Gerin               Adam Stolinski  (714) 557-1637 x249\r
+    706   Owen-Corning Fiberglas     Tom Mann mann.td@ocf.compuserve.com\r
+    707   Talking Networks Inc.          Terry Braun  tab@lwt.mtxinu.com\r
+    708   Cubix Corporation             Rebekah Marshall  (702) 883-7611\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 151]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    709   Formation Inc.          Bob Millis  bobm@formail.formation.com\r
+    710   Lannair Ltd.                    Pablo Brenner pablo@lannet.com\r
+    711   LightStream Corp.       Chris Chiotasso  chris@lightstream.com\r
+    712   LANart Corp.                Doron I. Gartner  doron@lanart.com\r
+    713   University of Stellenbosch   Graham Phillips phil@cs.sun.ac.za\r
+    714   Wyse Technology                     Bill Rainey  bill@wyse.com\r
+    715   DSC Communications Corp.        Colm Bergin  cbergin@cpdsc.com\r
+    716   NetEc                      Thomas Krichel  netec@uts.mcc.ac.uk\r
+    717   Breltenbach Software Engineering Hilmar Tuneke +02 92 49 70 00\r
+    718   Victor Company of Japan,Limited\r
+                           Atsushi Sakamoto   101176.2703@compuserve.com\r
+    719   Japan Direx Corporation        Teruo Tomiyama  +81 3 3498 5050\r
+    720   NECSY Network Control Systems S.p.A. Piero Fiozzo fip@necsy.it\r
+    721   ISDN Systems Corp.             Jeff Milloy  p00633@psilink.com\r
+    722   Zero-One Technologies, LTD.     Curt Chen  + 88 62 56 52 32 33\r
+    723   Radix Technologies, Inc.        Steve Giles  giless@delphi.com\r
+    724   National Institute of Standards and Technology\r
+                                     Jim West   west@mgmt3.ncsl.nist.gov\r
+    725   Digital Technology Inc.     Chris Gianattasio  gto@lanhawk.com\r
+    726   Castelle Corp.                   Waiming Mok  wmm@castelle.com\r
+    727   Presticom Inc.          Martin Dube  76270.2672@compuserve.com\r
+    728   Showa Electric Wire & Cable Co., Ltd.\r
+                                  Robert O'Grady  kfn@tanuki.twics.co.jp\r
+    729   SpectraGraphics                Jack Hinkle  hinkle@spectra.com\r
+    730   Connectware Inc.                 Rick Downs  rxd4@acsysinc.com\r
+    731   Wind River Systems                     Emily Hipp hipp@wrs.com\r
+    732   RADWAY International Ltd. Doron Kolton  0005367977@mcimail.com\r
+    733   System Management ARTS, Inc. Alexander Dupuy  dupuy@smarts.com\r
+    734   Persoft, Inc.      Steven M. Entine  entine@pervax.persoft.com\r
+    735   Xnet Technology Inc.      Esther Chung  estchung@xnet-tech.com\r
+    736   Unison-Tymlabs                    Dean Andrews  ada@unison.com\r
+    737   Micro-Matic Research   Patrick Lemli 73677.2373@compuserve.com\r
+    738   B.A.T.M. Advance Technologies\r
+                                      Nahum Killim bcrystal@actcom.co.il\r
+    739   University of Copenhagen         Kim H|glund  shotokan@diku.dk\r
+    740   Network Security Systems, Inc.\r
+                                      Carleton Smith  rpitt@nic.cerf.net\r
+    741   JNA Telecommunications             Sean Cody  seanc@jna.com.au\r
+    742   Encore Computer Corporation    Tony Shafer  tshafer@encore.com\r
+    743   Central Intelligent Agency         Carol Jobusch  703 242-2485\r
+    744   ISC (GB) Limited      Mike Townsend  miket@cix.compulink.co.uk\r
+    745   Digital Communication Associates Ravi Shankar shankarr@dca.com\r
+    746   CyberMedia Inc.                Unni Warrier   unni@cs.ucla.edu\r
+    747   Distributed Systems International, Inc.\r
+                                               Ron Mackey rem@dsiinc.com\r
+    748   Peter Radig EDP-Consulting       Peter Radig  +49 69 9757 6100\r
+    749   Vicorp Interactive Systems           Phil Romine  phil@vis.com\r
+    750   Inet Inc.                        Bennie Lopez  brl@inetinc.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 152]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    751   Argonne National Laboratory  Michael Shaffer mashaffer@anl.gov\r
+    752   Tek Logix                          Peter Palsall  905 625-4121\r
+    753   North Western University            Phil Draughon  jpd@nwu.edu\r
+    754   Astarte Fiber Networks     James Garnett  garnett@catbelly.com\r
+    755   Diederich & Associates, Inc.\r
+                                  Douglas Capitano dlcapitano@delphi.com\r
+    756   Florida Power Corporation        Bob England  rengland@fpc.com\r
+    757   ASK/INGRES                  Howard Dernehl   howard@ingres.com\r
+    758   Open Network Enterprise         Spada Stefano  +39 39 245-8101\r
+    759   The Home Depot               Keith Porter  ktp01@homedepot.com\r
+    760   Pan Dacom Telekommunikations   Jens Andresen  +49 40 644 09 71\r
+    761   NetTek                          Steve Kennedy  steve@gbnet.com\r
+    762   Karlnet Corp.                       Doug Kall  kbridge@osu.edu\r
+    763   Efficient Networks, Inc.          Thirl Johnson (214) 991-3884\r
+    764   Fiberdata                          Jan Fernquist  +46 828 8383\r
+    765   Lanser                           Emil Smilovici (514) 485-7104\r
+    766   Telebit Communications A/S     Peder Chr. Norgaard pcn@tbit.dk\r
+    767   HILAN GmbH           Markus Pestinger  markus@lahar.ka.sub.org\r
+    768   Network Computing Inc.\r
+                           Fredrik Noon fnoon@ncimail.mhs.compuserve.com\r
+    769   Walgreens Company                 Denis Renaud  (708) 818-4662\r
+    770   Internet Initiative Japan Inc. Toshiharu Ohno tony-o@iij.ad.jp\r
+    771   GP van Niekerk Ondernemings\r
+                        Gerrit van Niekerk  gvanniek@dos-lan.cs.up.ac.za\r
+    772   DSP & Telecoms Research Group\r
+                  Patrick McGleenon  p.mcgleenon@ee.queens-belfast.ac.uk\r
+    773   Securities Industry Automation Corporation\r
+                                       Chiu Szeto  cszeto@prism.poly.edu\r
+    774   SYNaPTICS                       David Gray  david@synaptics.ie\r
+    775   Data Switch Corporation         Joe Welfeld  jwelfeld@dasw.com\r
+    776   Telindus Distribution  Karel Van den Bogaert  kava@telindus.be\r
+    777   MAXM Systems Corporation  Gary Greathouse ggreathouse@maxm.com\r
+    778   Fraunhofer Gesellschaft\r
+                               Jan Gottschick jan.gottschick@isst.fhg.de\r
+    779   EQS Business Services           Ken Roberts   kroberts@esq.com\r
+    780   CNet Technology Inc.     Repus Hsiung  idps17@shts.seed.net.tw\r
+    781   Datentechnik GmbH           Thomas Pischinger  +43 1 50100 266\r
+    782   Network Solutions Inc.          Dave Putman   davep@netsol.com\r
+    783   Viaman Software                Vikram Duvvoori  info@viman.com\r
+    784   Schweizerische Bankgesellschaft Zuerich\r
+                           Roland Bernet  Roland.Bernet@zh014.ubs.ubs.ch\r
+    785   University of Twente - TIOS      Aiko Pras  pras@cs.utwente.nl\r
+    786   Simplesoft Inc.               Sudhir Pendse  sudhir@netcom.com\r
+    787   Stony Brook, Inc.               Ken Packert p01006@psilink.com\r
+    788   Unified Systems Solutions, Inc.\r
+                              Steven Morgenthal  smorgenthal@attmail.com\r
+    789   Network Appliance Corporation\r
+                                     Varun Mehta  varun@butch.netapp.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 153]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    790   Ornet Data Communication Technologies Ltd.\r
+                                              Haim Kurz haim@ornet.co.il\r
+    791   Computer Associates International\r
+                                  Glenn Gianino giagl01@usildaca.cai.com\r
+    792   Multipoint Network Inc.    Michael Nguyen  mike@multipoint.com\r
+    793   NYNEX Science & Technology          Lily Lau  llau@nynexst.com\r
+    794   Commercial Link Systems    Wiljo Heinen  wiljo@freeside.cls.de\r
+    795   Adaptec Inc.                    Tom Battle  tab@lwt.mtxinu.com\r
+    796   Softswitch                       Charles Springer  cjs@ssw.com\r
+    797   Link Technologies, Inc.                 Roy Chu  royc@wyse.com\r
+    798   IIS                      Olry Rappaport   iishaifa@attmail.com\r
+    799   Mobile Solutions Inc.    Dale Shelton  dshelton@srg.srg.af.mil\r
+    800   Xylan Corp.                        Burt Cyr     burt@xylan.com\r
+    801   Airtech Software Forge Limited\r
+                                 Callum Paterson tsf@cix.compulink.co.uk\r
+    802   National Semiconductor Maurice Turcotte  mturc@atlanta.nsc.com\r
+    803   Video Lottery Technologies     Angelo Lovisa  ange@awd.cdc.com\r
+    804   National Semiconductor Corp   Waychi Doo   wcd@berlioz.nsc.com\r
+    805   Applications Management Corp\r
+                         Terril (Terry) Steichen tjs@washington.ssds.com\r
+    806   Travelers Insurance Company   Eric Miner  ustrv67v@ibmmail.com\r
+    807   Taiwan International Standard Electronics Ltd.\r
+                                        B. J. Chen  bjchen@taisel.com.tw\r
+    808   US Patent and Trademark Office Rick Randall  randall@uspto.gov\r
+    809   Hynet, LTD.                    Amir Fuhrmann  amf@teleop.co.il\r
+    810   Aydin, Corp.                   Rick Veher       (215) 657-8600\r
+    811   ADDTRON Technology Co., LTD.       Tommy Tasi  +8 86-2-4514507\r
+    812   Fannie Mae                        David King   s4ujdk@fnma.com\r
+    813   MultiNET Services         Hubert Martens   martens@multinet.de\r
+    814   GECKO mbH                          Holger Dopp    hdo@gecko.de\r
+    815   Memorex Telex                Mike Hill     hill@raleng.mtc.com\r
+    816   Advanced Communications Networks (ACN) SA\r
+                                              Antoine Boss +41 38 247434\r
+    817   Telekurs AG         Jeremy Brookfield  bkj@iris.F2.telekurs.ch\r
+    818   Victron bv                    Jack Stiekema    jack@victron.nl\r
+    819   CF6 Company                   Francois Caron    +331 4696 0060\r
+    820   Walker Richer and Quinn Inc.\r
+                                  Rebecca Higgins  rebecca@elmer.wrq.com\r
+    821   Saturn Systems  Paul Parker  paul_parker@parker.fac.cs.cmu.edu\r
+    822   Mitsui Marine and Fire Insurance Co. LTD.\r
+                                             Kijuro Ikeda +813 5389 8111\r
+    823   Loop Telecommunication International, Inc.\r
+                                          Charng-Show Li +886 35 787 696\r
+    824   Telenex Corporation                 James Krug  (609) 866-1100\r
+    825   Bus-Tech, Inc.      Charlie Zhang   chun@eecs.cory.berkley.edu\r
+    826   ATRIE             Fred B.R. Tuang    cmp@fddi3.ccl.itri.org.tw\r
+    827   Gallagher & Robertson A/S         Arild Braathen  arild@gar.no\r
+    828   Networks Northwest, Inc. John J. Hansen jhansen@networksnw.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 154]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    829   Conner Peripherials  Richard Boyd  rboyd@mailserver.conner.com\r
+    830   Elf Antar France                 P. Noblanc  +33 1 47 44 45 46\r
+    831   Lloyd Internetworking          Glenn McGregor  glenn@lloyd.com\r
+    832   Datatec Industries, Inc.     Chris Wiener  cwiener@datatec.com\r
+    833   TAICOM   Scott Tseng                 cmp@fddi3.ccl.itri.org.tw\r
+    834   Brown's Operating System Services Ltd.\r
+                             Alistair Bell  alistair@ichthya.demon.co.uk\r
+    835   MiLAN Technology Corp.            Gopal Hegde  gopal@milan.com\r
+    836   NetEdge Systems, Inc.  Dave Minnich   Dave_Minnich@netedge.com\r
+    837   NetFrame Systems   George Mathew    george_mathew@netframe.com\r
+    838   Xedia Corporation     Colin Kincaid  colin%madway.uucp@dmc.com\r
+    839   Pepsi                          Niraj Katwala  niraj@netcom.com\r
+    840   Tricord Systems, Inc.      Mark Dillon  mdillon@tricord.mn.org\r
+    841   Proxim Inc.                   Russ Reynolds  proxim@netcom.com\r
+    842   Applications Plus, Inc.     Joel Estes  joele@hp827.applus.com\r
+    843   Pacific Bell                Aijaz Asif  saasif@srv.PacBell.COM\r
+    844   Supernet                    Sharon Barkai  sharon@supernet.com\r
+    845   TPS-Teleprocessing Systems    Manfred Gorr  gorr@tpscad.tps.de\r
+    846   Technology Solutions Company   Niraj Katwala  niraj@netcom.com\r
+    847   Computer Site Technologies           Tim Hayes  (805) 967-3494\r
+    848   NetPort Software             John Bartas  jbartas@sunlight.com\r
+    849   Alon Systems          Menachem Szus  70571.1350@compuserve.com\r
+    850   Tripp Lite             Lawren Markle  72170.460@compuserve.com\r
+    851   NetComm Limited\r
+                         Paul Ripamonti paulri@msmail.netcomm.pronet.com\r
+    852   Precision Systems, Inc. (PSI)\r
+                                     Fred Griffin  cheryl@empiretech.com\r
+    853   Objective Systems Integrators     Ed Reeder  Ed.Reeder@osi.com\r
+    854   Simpact Associates Inc.\r
+                            Robert Patterson  bpatterson@dcs.simpact.com\r
+    855   Systems Enhancement Corporation\r
+                                    Steve Held 71165.2156@compuserve.com\r
+    856   Information Integration, Inc.        Gina Sun  iiii@netcom.com\r
+    857   CETREL S.C.                    Louis Reinard  ssc-re@cetrel.lu\r
+    858   ViaTech Development\r
+                        Theodore J. Collins III ted.collins@vtdev.mn.org\r
+    859   Olivetti North America  Tom Purcell tomp@mail.spk.olivetti.com\r
+    860   WILMA      Nikolaus Schaller  hns@ldv.e-technik.tu-muenchen.de\r
+    861   ILX Systems Inc.                   Peter Mezey  peterm@ilx.com\r
+    862   Total Peripherals Inc.              Mark Ustik  (508) 393-1777\r
+    863   SunNetworks Consultant John Brady  jbrady@fedeast.east.sun.com\r
+    864   Arkhon Technologies, Inc.         Joe Wang  rkhon@nic.cerf.net\r
+    865   Computer Sciences Corporation\r
+                                      George M. Dands  dands@sed.csc.com\r
+    866   Philips.TRT                   Thibault Muchery  +33 14128 7000\r
+    867   Katron Technologies Inc.           Robert Kao  +88 627 991 064\r
+    868   Transition Engineering Inc.\r
+                                   Hemant Trivedi  hemant@transition.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 155]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    869   Altos Engineering Applications, Inc.\r
+                           Wes Weber or Dave Erhart  altoseng@netcom.com\r
+    870   Nicecom Ltd.                 Arik Ramon  arik@nicecom.nice.com\r
+    871   Fiskars/Deltec                     Carl Smith   (619) 291-2973\r
+    872   AVM GmbH              Andreas Stockmeier  stocki@avm-berlin.de\r
+    873   Comm Vision               Richard Havens    (408) 923 0301 x22\r
+    874   Institute for Information Industry\r
+                                       Peter Pan peterpan@pdd.iii.org.tw\r
+    875   Legent Corporation             Gary Strohm  gstrohm@legent.com\r
+    876   Network Automation                Doug Jackson  +64 6 285 1711\r
+    877   NetTech                 Marshall Sprague  marshall@nettech.com\r
+    878   Coman Data Communications Ltd.\r
+                                      Zvi Sasson coman@nms.cc.huji.ac.il\r
+    879   Skattedirektoratet           Karl Olav Wroldsen  +47 2207 7162\r
+    880   Client-Server Technologies       Timo Metsaportti  timo@itf.fi\r
+    881   Societe Internationale de Telecommunications Aeronautiques\r
+                                Chuck Noren  chuck.noren@es.atl.sita.int\r
+    882   Maximum Strategy Inc.        Paul Stolle  pstolle@maxstrat.com\r
+    883   Integrated Systems, Inc.             Michael Zheng  mz@isi.com\r
+    884   E-Systems, Melpar         Rick Silton  rsilton@melpar.esys.com\r
+    885   Reliance Comm/Tec        Mark Scott  73422.1740@compuserve.com\r
+    886   Summa Four Inc.                    Paul Nelson  (603) 625-4050\r
+    887   J & L Information Systems          Rex Jackson  (818) 709-1778\r
+    888   Forest Computer Inc.               Dave Black  dave@forest.com\r
+    889   Palindrome Corp.   Jim Gast  jgast@palindro.mhs.compuserve.com\r
+    890   ZyXEL Communications Corp.  Harry Chou  howie@csie.nctu.edu.tw\r
+    891   Network Managers (UK) Ltd,   Mark D Dooley  mark@netmgrs.co.uk\r
+    892   Sensible Office Systems Inc.      Pat Townsend  (712) 276-0034\r
+    893   Informix Software         Anthony Daniel  anthony@informix.com\r
+    894   Dynatek Communications           Howard Linton  (703) 490-7205\r
+    895   Versalynx Corp.                    Dave Fisler  (619) 536-8023\r
+    896   Potomac Scheduling Communications Company\r
+                                    David Labovitz  del@access.digex.net\r
+    897   Sybase Inc.                   Dave Meldrum  meldrum@sybase.com\r
+    898   DiviCom Inc.                         Eyal Opher  eyal@divi.com\r
+    899   Datus elektronische Informationssysteme GmbH\r
+                                        Hubert Mertens marcus@datus.uucp\r
+    900   Matrox Electronic Systems Limited\r
+                           Marc-Andre Joyal  marc-andre.joyal@matrox.com\r
+    901   Digital Products, Inc.        Ross Dreyer  rdreyer@digprod.com\r
+    902   Scitex Corp. Ltd.          Yoav Chalfon  yoav_h@ird.scitex.com\r
+    903   RAD Vision          Oleg Pogorelik  radvis@vax.trendline.co.il\r
+    904   Tran Network Systems            Paul Winkeler  paulw@revco.com\r
+    905   Scorpion Logic                     Sean Harding  +09 2324 5672\r
+    906   Inotech Inc.                       Eric Jacobs  (703) 641-0469\r
+    907   Controlled Power Co.        Yu Chin  76500,3160@compuserve.com\r
+    908   Elsag Bailey Incorporate Derek McKearney  mckearney@bailey.com\r
+    909   J.P. Morgan              Chung Szeto  szeto_chung@jpmorgan.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 156]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    910   Clear Communications Corp.          Kurt Hall  khall@clear.com\r
+    911   General Technology Inc.         Perry Rockwell  (407) 242-2733\r
+    912   Adax Inc.                          Jory Gessow   jory@adax.com\r
+    913   Mtel Technologies, Inc.     Jon Robinson  552-3355@mcimail.com\r
+    914   Underscore, Inc.            Jeff Schnitzer  jds@underscore.com\r
+    915   SerComm Corp.                        Ben Lin   +8 862-577-5400\r
+    916   Baxter Healthcare Corporation\r
+                      Joseph Sturonas  sturonaj@mpg.mcgawpark.baxter.com\r
+    917   Tellus Technology               Ron Cimorelli   (510) 498-8500\r
+    918   Continuous Electron Beam Accelerator Facility\r
+                                             Paul Banta  banta@cebaf.gov\r
+    919   Canoga Perkins                   Margret Siska  (818) 718-6300\r
+    920   R.I.S Technologies              Fabrice Lacroix  +33 7884 6400\r
+    921   INFONEX Corp.            Kazuhiro Watanabe  kazu@infonex.co.jp\r
+    922   WordPerfect Corp.           Douglas Eddy  eddy@wordperfect.com\r
+    923   NRaD                          Russ Carleton  roccor@netcom.com\r
+    924   Hong Kong Telecommunications Ltd.     K. S. Luk +8 52 883 3183\r
+    925   Signature Systems               Doug Goodall   goodall@crl.com\r
+    926   Alpha Technologies LTD.          Guy Pothiboon  (604) 430-8908\r
+    927   PairGain Technologies, Inc.       Ken Huang  kenh@pairgain.com\r
+    928   Sonic Systems             Sudhakar Ravi  sudhakar@sonicsys.com\r
+    929   Steinbrecher Corp.       Kary Robertson  krobertson@delphi.com\r
+    930   Centillion Networks, Inc.     Derek Pitcher   derek@lanspd.com\r
+    931   Network Communication Corp.\r
+                     Tracy Clark  ncc!central!tracyc@netcomm.attmail.com\r
+    932   Sysnet A.S.                   Carstein Seeberg  case@sysnet.no\r
+    933   Telecommunication Systems Lab Gerald Maguire maguire@it.kth.se\r
+    934   QMI                             Scott Brickner  (410) 573-0013\r
+    935   Phoenixtec Power Co., LTD.       An-Hsiang Tu  +8 862 646 3311\r
+    936   Hirakawa Hewtech Corp.     H. Ukaji  lde02513@niftyserve.or.jp\r
+    937   No Wires Needed B.V.       Arnoud Zwemmer  roana@cs.utwente.nl\r
+    938   Primary Access               Kerstin Lodman  lodman@priacc.com\r
+    939   Enterprises.FDSW            Dag Framstad  dag.framstad@fdsw.no\r
+    940   Grabner & Kapfer GnbR          Vinzenz Grabner  zen@wsr.ac.att\r
+    941   Nemesys Research Ltd.         Michael Dixon  mjd@nemesys.co.uk\r
+    942   Pacific Communication Sciences, Inc. (PSCI)\r
+                                      Yvonne Kammer mib-contact@pcsi.com\r
+    943   Level One Communications, Inc.\r
+                                      Moshe Kochinski  moshek@level1.com\r
+    944   Fast Track, Inc.     Andrew H. Dimmick  adimmick@world.std.com\r
+    945   Andersen Consulting, OM/NI Practice\r
+                                         Greg Tilford p00919@psilink.com\r
+    946   Bay Technologies Pty Ltd.   Paul Simpson  pauls@baytech.com.au\r
+    947   Integrated Network Corp.      Daniel Joffe wandan@integnet.com\r
+    948   Epoch, Inc.                       David Haskell  deh@epoch.com\r
+    949   Wang Laboratories Inc.         Pete Reilley  pvr@wiis.wang.com\r
+    950   Polaroid Corp.       Sari Germanos  sari@temerity.polaroid.com\r
+    951   Sunrise Sierra                    Gerald Olson  (510) 443-1133\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 157]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    952   Silcon Group                   Bjarne Bonvang  +45 75 54 22 55\r
+    953   Coastcom                  Donald Pickerel  dpickere@netcom.com\r
+    954   4th DIMENSION SOFTWARE LTD.\r
+                       Thomas Segev/Ely Hofner autumn@zeus.datasrv.co.il\r
+    955   SEIKO SYSTEMS Inc.              Kiyoshi Ishida  ishi@ssi.co.jp\r
+    956   PERFORM                    Jean-Hugues Robert  +33 42 27 29 32\r
+    957   TV/COM International              Jean Tellier  (619) 675-1376\r
+    958   Network Integration, Inc.\r
+                           Scott C. Lemon  slemon@nii.mhs.compuserve.com\r
+    959   Sola Electric, A Unit of General Signal\r
+                                  Bruce Rhodes 72360,2436@compuserve.com\r
+    960   Gradient Technologies, Inc.  Geoff Charron  geoff@gradient.com\r
+    961   Tokyo Electric Co., Ltd.           A. Akiyama  +81 558 76 9606\r
+    962   Codonics, Inc.                     Joe Kulig  jjk@codonics.com\r
+    963   Delft Technical University Mark Schenk m.schenk@ced.tudelft.nl\r
+    964   Carrier Access Corp.        Roger Koenig  tomquick@carrier.com\r
+    965   eoncorp                           Barb Wilson  wilsonb@eon.com\r
+    966   Naval Undersea Warfare Center\r
+                           Mark Lovelace  lovelace@mp34.nl.nuwc.navy.mil\r
+    967   AWA Limited                   Mike Williams    +61 28 87 71 11\r
+    968   Distinct Corp.           Tarcisio Pedrotti  tarci@distinct.com\r
+    969   National Technical University of Athens\r
+                             Theodoros Karounos karounos@phgasos.ntua.gr\r
+    970   BGS Systems, Inc.                       Amr Hafez  amr@bgs.com\r
+    971   McCaw Wireless Data Inc.     Brian Bailey  bbailey@airdata.com\r
+    972   Bekaert                  Koen De Vleeschauwer  kdv@bekaert.com\r
+    973   Epic Data Inc.        Vincent Lim  vincent_lim@epic.wimsey.com\r
+    974   Prodigy Services Co.              Ed Ravin  elr@wp.prodigy.com\r
+    975   First Pacific Networks (FPN)     Randy Hamilton  randy@fpn.com\r
+    976   Xylink Ltd.         Bahman Rafatjoo  100117.665@compuserve.com\r
+    977   Relia Technologies Corp.  Fred Chen  fredc@relia1.relia.com.tw\r
+    978   Legacy Storage Systems Inc.\r
+                            James Hayes james@lss-chq.mhs.compuserve.com\r
+    979   Digicom, SPA                   Claudio Biotti  +39 3312 0 0122\r
+    980   Ark Telecom                       Alan DeMars  alan@arktel.com\r
+    981   National Security Agency (NSA)\r
+                                Cynthia Stewart maedeen@romulus.ncsc.mil\r
+    982  Southwestern Bell Corporation\r
+                                      Brian Bearden bb8840@swuts.sbc.com\r
+    983  Virtual Design Group, Inc.\r
+                                Chip Standifer 70650.3316@compuserve.com\r
+    984  Rhone Poulenc                Olivier Pignault   +33 1348 2 4053\r
+    985  Swiss Bank Corporation        Neil Todd  toddn@gb.swissbank.com\r
+    986  ATEA N.V.             Walter van Brussel  p81710@banyan.atea.be\r
+    987  Computer Communications Specialists, Inc.\r
+                                        Carolyn Zimmer  cczimmer@crl.com\r
+    988  Object Quest, Inc.             Michael L. Kornegay  mlk@bir.com\r
+    989  DCL System International, Ltd.   Gady Amit gady-a@dcl-see.co.il\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 158]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    990  SOLITON SYSTEMS K.K.             Masayuki Yamai  +81 33356 6091\r
+    991  U S Software                       Don Dunstan  ussw@netcom.com\r
+    992  Systems Research and Applications Corporation\r
+                                        Todd Herr herrt@smtplink.sra.com\r
+    993  University of Florida           Todd Hester  todd@circa.ufl.edu\r
+    994  Dantel, Inc.                       John Litster  (209) 292-1111\r
+    995  Multi-Tech Systems, Inc.    Dale Martenson  (612) 785-3500 x519\r
+    996  Softlink Ltd.     Moshe Leibovitch  softlink@zeus.datasrv.co.il\r
+    997  ProSum                        Christian Bucari  +33.1.4590.6231\r
+    998  March Systems Consultancy, Ltd.\r
+                                     Ross Wakelin  r.wakelin@march.co.uk\r
+    999  Hong Technology, Inc.            Walt Milnor  brent@oceania.com\r
+   1000  Internet Assigned Numbers Authority                iana@isi.edu\r
+   1001  PECO Energy Co.                  Rick Rioboli  u002rdr@peco.com\r
+   1002  United Parcel Service        Steve Pollini  nrd1sjp@nrd.ups.com\r
+   1003  Storage Dimensions, Inc.     Michael Torhan  miketorh@xstor.com\r
+   1004  ITV Technologies, Inc.               Jacob Chen  itv@netcom.com\r
+   1005  TCPSI             Victor San Jose   Victor.Sanjose@sp1.y-net.es\r
+   1006  Promptus Communications, Inc.     Paul Fredette  (401) 683-6100\r
+   1007  Norman Data Defense Systems\r
+                                   Kristian A. Bognaes  norman@norman.no\r
+   1008  Pilot Network Services, Inc.     Rob Carrade  carrade@pilot.net\r
+   1009  Integrated Systems Solutions Corporation\r
+                                           Chris Cowan cc@austin.ibm.com\r
+   1010  SISRO                 Kamp Alexandre  100074.344@compuserve.com\r
+   1011  NetVantage                       Kevin Bailey  speed@kaiwan.com\r
+   1012  Marconi S.p.A.             Giuseppe Grasso  gg@relay.marconi.it\r
+   1013  SURECOM                         Mike S. T. Hsieh  +886.25.92232\r
+   1014  Royal Hong Kong Jockey Club\r
+                                   Edmond Lee 100267.3660@compuserve.com\r
+   1015  Gupta                            Howard Cohen  hcohen@gupta.com\r
+   1016  Tone Software Corporation       Neil P. Harkins  (714) 991-9460\r
+   1017  Opus Telecom                     Pace Willisson  pace@blitz.com\r
+   1018  Cogsys Ltd.          Niall Teasdale  niall@hedgehog.demon.co.uk\r
+   1019  Komatsu, Ltd.              Akifumi Katsushima  +81 463.22.84.30\r
+   1020  ROI Systems, Inc                   Michael Wong  (801) 942-1752\r
+   1021  Lightning Instrumentation SA    Mike O'Dowd  odowd@lightning.ch\r
+   1022  TimeStep Corp.          Stephane Lacelle slacelle@newbridge.com\r
+   1023  INTELSAT                       Ivan Giron  i.giron@intelsat.int\r
+   1024  Network Research Corporation Japan, Ltd.\r
+                                Tsukasa Ueda  100156.2712@compuserve.com\r
+   1025  Relational Development, Inc.  Steven Smith  rdi@ins.infonet.net\r
+   1026  Emerald Systems, Corp. Robert A. Evans Jr. (619) 673-2161 x5120\r
+   1027  Mitel, Corp.                    Tom Quan  tq@software.mitel.com\r
+   1028  Software AG                        Peter Cohen  sagpc@sagus.com\r
+   1029  MillenNet, Inc.                       Manh Do    (510) 770-9390\r
+   1030  NK-EXA Corp.           Ken'ichi Hayami  hayami@dst.nk-exa.co.jp\r
+   1031  BMC Software                     Chris Sharp  csharp@patrol.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 159]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+   1032  StarFire Enterprises, Inc.          Lew Gaiter  lg@starfire.com\r
+   1033  Hybrid Networks, Inc.           Doug Muirhead  dougm@hybrid.com\r
+   1034  Quantum Software GmbH          Thomas Omerzu  omerzu@quantum.de\r
+   1035  Openvision Technologies Limited\r
+                             Andrew Lockhart  alockhart@openvision.co.uk\r
+   1036  Healthcare Communications, Inc. (HCI)\r
+                                    Larry Streepy streepy@healthcare.com\r
+   1037  SAIT Systems                          Hai Dotu    +3223.7053.11\r
+   1038  SAT                              Mleczko Alain  +33.1.4077.1156\r
+   1039  CompuSci Inc.,                   Bob Berry  bberry@compusci.com\r
+   1040  Aim Technology                 Ganesh Rajappan  ganeshr@aim.com\r
+   1041  CIESIN                      Kalpesh Unadkat  kalpesh@ciesin.org\r
+   1042  Systems & Technologies International\r
+                                            Howard Smith  ghamex@aol.com\r
+   1043  Israeli Electric Company (IEC) Yoram Harlev yoram@yor.iec.co.il\r
+   1044  Phoenix Wireless Group, Inc.\r
+                                  Gregory M. Buchanan  buchanan@pwgi.com\r
+   1045  SWL                  Bill Kight  wkightgrci.com  (410) 290.7245\r
+   1046  nCUBE                            Greg Thompson  gregt@ncube.com\r
+   1047  Cerner, Corp.             Dennis Avondet  (816) 221.1024  X2432\r
+   1048  Andersen Consulting        Mark Lindberg  mlindber@andersen.com\r
+   1049  Lincoln Telephone Company     Bob Morrill  root@si6000.ltec.com\r
+   1050  Acer                                    Jay Tao  jtao@Altos.COM\r
+   1051  Cedros                        Juergen Haakert  +49.2241.9701.80\r
+   1052  AirAccess                  Ido Ophir  100274.365@compuserve.com\r
+   1053  Expersoft Corporation        David Curtis  curtis@expersoft.com\r
+   1054  Eskom                    Sanjay Lakhani h00161@duvi.eskom.co.za\r
+   1055  SBE, Inc.                         Vimal Vaidya   vimal@sbei.com\r
+   1056  EBS, Inc.                        Emre Gundogan  baroque@ebs.com\r
+   1057  American Computer and Electronics, Corp.\r
+                                               Tom Abraham  tha@acec.com\r
+   1058  Syndesis Limited                 Wil Macaulay  wil@syndesis.com\r
+   1059  Isis Distributed Systems, Inc.   Ken Chapman  kchapman@isis.com\r
+   1060  Priority Call Management   Greg Schumacher  gregs@world.std.com\r
+   1061  Koelsch & Altmann GmbH\r
+                           Christian Schreyer  100142.154@compuserve.com\r
+   1062  WIPRO INFOTECH LTD. Chandrashekar Kapse  kapse@wipinfo.soft.net\r
+   1063  Controlware                          Uli Blatz  ublatz@cware.de\r
+   1064  Mosaic Software                W.van Biljon willem@mosaic.co.za\r
+   1065  Canon Information Systems\r
+                            Victor Villalpando  vvillalp@cisoc.canon.com\r
+   1066  AmericaOnline               Andrew R. Scholnick  andrew@aol.net\r
+   1067  Whitetree Network Technologies, Inc.\r
+                                           Carl Yang cyang@whitetree.com\r
+   1068  Xetron Corp.                    Dave Alverson  davea@xetron.com\r
+   1069  Target Concepts, Inc.               Bill Price  bprice@tamu.edu\r
+   1070  DMH Software          Yigal Hochberg  72144.3704@compuserve.com\r
+   1071  Innosoft International, Inc.    Jeff Allison  jeff@innosoft.com\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 160]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+   1072  Controlware GmbH                     Uli Blatz  ublatz@cware.de\r
+   1073  Telecommunications Industry Association (TIA)\r
+                                      Mike Youngberg   mikey@synacom.com\r
+   1074  Boole & Babbage                      Rami Rubin  rami@boole.com\r
+   1075  System Engineering Support, Ltd.  Vince Taylor  +44 454.614.638\r
+   1076  SURFnet               Ton Verschuren  Ton.Verschuren@surfnet.nl\r
+   1077  OpenConnect Systems, Inc.        Mark Rensmeyer  mrensme@oc.com\r
+   1078  PDTS (Process Data Technology and Systems)\r
+                        Martin Gutenbrunner  GUT@pdts.mhs.compuserve.com\r
+   1079  Cornet, Inc.                          Nat Kumar  (703) 658-3400\r
+   1080  NetStar, Inc.                  John K. Renwick  jkr@netstar.com\r
+   1081  Semaphore Communications, Corp.  Jimmy Soetarman (408) 980-7766\r
+   1082  Casio Computer Co., Ltd.      Shouzo Ohdate  ohdate@casio.co.jp\r
+   1083  CSIR            Frikkie Strecker fstreck@marge.mikom.csir.co.za\r
+   1084  APOGEE Communications      Olivier Caleff  caleff@apogee-com.fr\r
+   1085  Information Management Company   Michael D. Liss  mliss@imc.com\r
+   1086  Wordlink, Inc.                    Mike Aleckson  (314) 878-1422\r
+   1087  PEER                            Avinash S. Rao  arao@cranel.com\r
+   1088  Telstra Corp.  Michael Scollay        michaels@ind.tansu.com.au\r
+   1089  Net X, Inc.  Sridhar Kodela  techsupp@netx.unicomp.net\r
+   1090  PNC PLC     Gordon Tees        +44 716.061.200\r
+\r
+To request an assignment of an Enterprise Number send the complete\r
+company name, address, and phone number; and the contact's person\r
+complete name, address, phone number, and email mailbox in an email\r
+message to <iana-mib@isi.edu>.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/enterprise-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 161]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+SGMP Vendor Specific Codes: [obsolete]\r
+\r
+\r
+Prefix: 1,255,\r
+\r
+Decimal   Name                                          References\r
+-------   ----                                          ----------\r
+      0   Reserved                                          [JKR1]\r
+      1   Proteon                                           [JS18]\r
+      2   IBM                                                [JXR]\r
+      3   CMU                                                [SXW]\r
+      4   Unix                                               [MS9]\r
+      5   ACC                                               [AB20]\r
+      6   TWG                                                [MTR]\r
+      7   CAYMAN                                            [BXM2]\r
+      8   NYSERNET                                           [MS9]\r
+      9   cisco                                              [GS2]\r
+     10   BBN                                                [RH6]\r
+     11   Unassigned                                        [JKR1]\r
+     12   MIT                                               [JR35]\r
+ 13-254   Unassigned                                        [JKR1]\r
+    255   Reserved                                          [JKR1]\r
+\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/sgmp-vendor-specific-\r
+codes\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 162]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ADDRESS RESOLUTION PROTOCOL PARAMETERS\r
+\r
+The Address Resolution Protocol (ARP) specified in [RFC826] has\r
+several parameters.  The assigned values for these parameters are\r
+listed here.\r
+\r
+REVERSE ADDRESS RESOLUTION PROTOCOL OPERATION CODES\r
+\r
+The Reverse Address Resolution Protocol (RARP) specified in [RFC903]\r
+uses the "Reverse" codes below.\r
+\r
+DYNAMIC REVERSE ARP\r
+\r
+The Dynamic Reverse Address Resolution Protocol (DRARP) uses the\r
+"DRARP" codes below.  For further information, contact: David Brownell\r
+(suneast!helium!db@Sun.COM).\r
+\r
+INVERSE ADDRESS RESOULUTION PROTOCOL\r
+\r
+The Inverse Address Resolution Protocol (IARP) specified in [RFC1293]\r
+uses the "InARP" codes below.\r
+\r
+Assignments:\r
+\r
+Number Operation Code (op)                       Reference\r
+------ --------------------------                ---------\r
+     1  REQUEST                                  [RFC826]\r
+     2  REPLY                                    [RFC826]\r
+     3  request Reverse                          [RFC903]\r
+     4  reply Reverse                            [RFC903]\r
+     5  DRARP-Request                    [David Brownell]\r
+     6  DRARP-Reply                      [David Brownell]\r
+     7  DRARP-Error                      [David Brownell]\r
+     8  InARP-Request                           [RFC1293]\r
+     9  InARP-Reply                             [RFC1293]\r
+    10  ARP-NAK                            [Mark Laubach]\r
+\r
+Number Hardware Type (hrd)                           References\r
+------ -----------------------------------           ----------\r
+     1 Ethernet (10Mb)                                    [JBP]\r
+     2 Experimental Ethernet (3Mb)                        [JBP]\r
+     3 Amateur Radio AX.25                                [PXK]\r
+     4 Proteon ProNET Token Ring                          [JBP]\r
+     5 Chaos                                              [GXP]\r
+     6 IEEE 802 Networks                                  [JBP]\r
+     7 ARCNET                                             [JBP]\r
+     8 Hyperchannel                                       [JBP]\r
+     9 Lanstar                                             [TU]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 163]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+    10 Autonet Short Address                             [MXB1]\r
+    11 LocalTalk                                         [JKR1]\r
+    12 LocalNet (IBM PCNet or SYTEK LocalNET)             [JXM]\r
+    13 Ultra link                                        [RXD2]\r
+    14 SMDS                                              [GXC1]\r
+    15 Frame Relay                                        [AGM]\r
+    16 Asynchronous Transmission Mode (ATM)              [JXB2]\r
+    17 HDLC                                               [JBP]\r
+    18 Fibre Channel                            [Yakov Rekhter]\r
+    19 Asynchronous Transmission Mode (ATM)      [Mark Laubach]\r
+    20 Serial Line                                        [JBP]\r
+    21 Asynchronous Transmission Mode (ATM)              [MXB1]\r
+\r
+Protocol Type (pro)\r
+\r
+Use the same codes as listed in the section called "Ethernet Numbers\r
+of Interest" (all hardware types use this code set for the protocol\r
+type).\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC826] Plummer, D., "An Ethernet Address Resolution Protocol or\r
+         Converting Network Protocol Addresses to 48-bit Ethernet\r
+         Addresses for Transmission on Ethernet Hardware", STD 37, RFC\r
+         826, MIT-LCS, November 1982.\r
+\r
+[RFC903] Finlayson, R., Mann, T., Mogul, J., and M. Theimer, "A\r
+         Reverse Address Resolution Protocol", STD 38, RFC 903,\r
+         Stanford University, June 1984.\r
+\r
+[RFC1293] Bradley, T., and C. Brown, "Inverse Address Resolution\r
+          Protocol", RFC 1293, Wellfleet Communications, Inc.,\r
+          January 1992.\r
+\r
+\r
+PEOPLE\r
+\r
+[AGM] Andy Malis <malis_a@timeplex.com>\r
+\r
+[GXC1] George Clapp <meritec!clapp@bellcore.bellcore.com>\r
+\r
+[GXP] Gill Pratt <gill%mit-ccc@MC.LCS.MIT.EDU>\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[JKR1] Joyce K. Reynolds <jkrey@isi.edu>\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 164]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[JXM] Joseph Murdock <---none--->\r
+\r
+[MXB1] Mike Burrows <burrows@SRC.DEC.COM>\r
+\r
+[PXK] Philip Koch <Philip.Koch@DARTMOUTH.EDU>\r
+\r
+[RXD2] Rajiv Dhingra <rajiv@ULTRA.COM>\r
+\r
+[TU] Tom Unger <tom@CITI.UMICH>\r
+\r
+[David Brownell]\r
+\r
+[Mark Laubach]\r
+\r
+[Yakov Rekhter] <Yakov@IBM.COM>\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/arp-parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 165]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+IEEE 802 NUMBERS OF INTEREST\r
+\r
+Some of the networks of all classes are IEEE 802 Networks.  These\r
+systems may use a Link Service Access Point (LSAP) field in much the\r
+same way the MILNET uses the "link" field.  Further, there is an\r
+extension of the LSAP header called the Sub-Network Access Protocol\r
+(SNAP).\r
+\r
+The IEEE likes to describe numbers in binary in bit transmission\r
+order, which is the opposite of the big-endian order used throughout\r
+the Internet protocol documentation.\r
+\r
+\r
+Assignments:\r
+\r
+   Link Service Access Point   Description                References\r
+   -------------------------   -----------                ----------\r
+   IEEE     Internet\r
+   binary   binary    decimal\r
+   00000000 00000000        0   Null LSAP                      [IEEE]\r
+   01000000 00000010        2   Indiv LLC Sublayer Mgt         [IEEE]\r
+   11000000 00000011        3   Group LLC Sublayer Mgt         [IEEE]\r
+   00100000 00000100        4   SNA Path Control               [IEEE]\r
+   01100000 00000110        6   Reserved (DOD IP)        [RFC768,JBP]\r
+   01110000 00001110       14   PROWAY-LAN                     [IEEE]\r
+   01110010 01001110       78   EIA-RS 511                     [IEEE]\r
+   01111010 01011110       94   ISI IP                          [JBP]\r
+   01110001 10001110      142   PROWAY-LAN                     [IEEE]\r
+   01010101 10101010      170   SNAP                           [IEEE]\r
+   01111111 11111110      254   ISO CLNS IS 8473         [RFC926,JXJ]\r
+   11111111 11111111      255   Global DSAP                    [IEEE]\r
+\r
+These numbers (and others) are assigned by the IEEE Standards Office.\r
+The address is:\r
+\r
+IEEE Registration Authority\r
+c/o Iris Ringel\r
+IEEE Standards Dept\r
+445 Hoes Lane, P.O. Box 1331\r
+Piscataway, NJ 08855-1331\r
+Phone +1 908 562 3813\r
+Fax: +1 908 562 1571\r
+\r
+The fee is $1000 and it takes 10 working days after receipt of the\r
+request form and fee.  They will not do anything via fax or phone.\r
+\r
+At an ad hoc special session on "IEEE 802 Networks and ARP", held\r
+during the TCP Vendors Workshop (August 1986), an approach to a\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 166]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+consistent way to send DoD-IP datagrams and other IP related protocols\r
+(such as the Address Resolution Protocol (ARP)) on 802 networks was\r
+developed, using the SNAP extension (see [RFC1042]).\r
+\r
+REFERENCES\r
+\r
+[RFC768] Postel, J., "User Datagram Protocol", STD 6, RFC 768,\r
+         USC/Information Sciences Institute, August 1980.\r
+\r
+[RFC926] International Standards Organization, "Protocol for Providing\r
+         the Connectionless-Mode Network Services", RFC 926, ISO,\r
+         December 1984.\r
+\r
+[RFC1042] Postel, J., and J. Reynolds, "A Standard for the\r
+          Transmission of IP Datagrams over IEEE 802 Networks", STD\r
+          43, RFC 1042, USC/Information Sciences Institute, February\r
+          1988.\r
+\r
+PEOPLE\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[JXJ] <mystery contact>\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/ieee-802-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 167]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ETHER TYPES\r
+\r
+Many of the networks of all classes are Ethernets (10Mb) or\r
+Experimental Ethernets (3Mb).  These systems use a message "type"\r
+field in much the same way the ARPANET uses the "link" field.\r
+\r
+If you need an Ether Type, contact:\r
+\r
+Xerox Systems Institute\r
+3400 Hillview Ave.\r
+PO BOX 10034\r
+Palo Alto, CA 94303\r
+\r
+Phone: 415-813-7164\r
+Contact: Fonda Lix Pallone\r
+\r
+The following list of EtherTypes is contributed unverified information\r
+from various sources.\r
+\r
+Assignments:\r
+\r
+Ethernet          Exp. Ethernet    Description          References\r
+-------------     -------------   -----------           ----------\r
+decimal  Hex      decimal  octal\r
+   000   0000-05DC   -       -    IEEE802.3 Length Field   [XEROX]\r
+   257   0101-01FF   -       -    Experimental             [XEROX]\r
+   512   0200        512   1000   XEROX PUP (see 0A00)   [8,XEROX]\r
+   513   0201        -      -     PUP Addr Trans (see 0A01)[XEROX]\r
+         0400                     Nixdorf                  [XEROX]\r
+  1536   0600       1536   3000   XEROX NS IDP         [133,XEROX]\r
+         0660                     DLOG                     [XEROX]\r
+         0661                     DLOG                     [XEROX]\r
+  2048   0800        513   1001   Internet IP (IPv4)     [105,JBP]\r
+  2049   0801        -      -     X.75 Internet            [XEROX]\r
+  2050   0802        -      -     NBS Internet             [XEROX]\r
+  2051   0803        -      -     ECMA Internet            [XEROX]\r
+  2052   0804        -      -     Chaosnet                 [XEROX]\r
+  2053   0805        -      -     X.25 Level 3             [XEROX]\r
+  2054   0806        -      -     ARP                     [88,JBP]\r
+  2055   0807        -      -     XNS Compatability        [XEROX]\r
+  2076   081C        -      -     Symbolics Private         [DCP1]\r
+  2184   0888-088A   -      -     Xyplex                   [XEROX]\r
+  2304   0900        -      -     Ungermann-Bass net debugr[XEROX]\r
+  2560   0A00        -      -     Xerox IEEE802.3 PUP      [XEROX]\r
+  2561   0A01        -      -     PUP Addr Trans           [XEROX]\r
+  2989   0BAD        -      -     Banyan Systems           [XEROX]\r
+  4096   1000        -      -     Berkeley Trailer nego    [XEROX]\r
+  4097   1001-100F   -      -     Berkeley Trailer encap/IP[XEROX]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 168]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+  5632   1600        -      -     Valid Systems            [XEROX]\r
+ 16962   4242        -      -     PCS Basic Block Protocol [XEROX]\r
+ 21000   5208        -      -     BBN Simnet               [XEROX]\r
+ 24576   6000        -      -     DEC Unassigned (Exp.)    [XEROX]\r
+ 24577   6001        -      -     DEC MOP Dump/Load        [XEROX]\r
+ 24578   6002        -      -     DEC MOP Remote Console   [XEROX]\r
+ 24579   6003        -      -     DEC DECNET Phase IV Route[XEROX]\r
+ 24580   6004        -      -     DEC LAT                  [XEROX]\r
+ 24581   6005        -      -     DEC Diagnostic Protocol  [XEROX]\r
+ 24582   6006        -      -     DEC Customer Protocol    [XEROX]\r
+ 24583   6007        -      -     DEC LAVC, SCA            [XEROX]\r
+ 24584   6008-6009   -      -     DEC Unassigned           [XEROX]\r
+ 24586   6010-6014   -      -     3Com Corporation         [XEROX]\r
+ 28672   7000        -      -     Ungermann-Bass download  [XEROX]\r
+ 28674   7002        -      -     Ungermann-Bass dia/loop  [XEROX]\r
+ 28704   7020-7029   -      -     LRT                      [XEROX]\r
+ 28720   7030        -      -     Proteon                  [XEROX]\r
+ 28724   7034        -      -     Cabletron                [XEROX]\r
+ 32771   8003        -      -     Cronus VLN            [131,DT15]\r
+ 32772   8004        -      -     Cronus Direct         [131,DT15]\r
+ 32773   8005        -      -     HP Probe                 [XEROX]\r
+ 32774   8006        -      -     Nestar                   [XEROX]\r
+ 32776   8008        -      -     AT&T                     [XEROX]\r
+ 32784   8010        -      -     Excelan                  [XEROX]\r
+ 32787   8013        -      -     SGI diagnostics            [AXC]\r
+ 32788   8014        -      -     SGI network games          [AXC]\r
+ 32789   8015        -      -     SGI reserved               [AXC]\r
+ 32790   8016        -      -     SGI bounce server          [AXC]\r
+ 32793   8019        -      -     Apollo Computers         [XEROX]\r
+ 32815   802E        -      -     Tymshare                 [XEROX]\r
+ 32816   802F        -      -     Tigan, Inc.              [XEROX]\r
+ 32821   8035        -      -     Reverse ARP             [48,JXM]\r
+ 32822   8036        -      -     Aeonic Systems           [XEROX]\r
+ 32824   8038        -      -     DEC LANBridge            [XEROX]\r
+ 32825   8039-803C   -      -     DEC Unassigned           [XEROX]\r
+ 32829   803D        -      -     DEC Ethernet Encryption  [XEROX]\r
+ 32830   803E        -      -     DEC Unassigned           [XEROX]\r
+ 32831   803F        -      -     DEC LAN Traffic Monitor  [XEROX]\r
+ 32832   8040-8042   -      -     DEC Unassigned           [XEROX]\r
+ 32836   8044        -      -     Planning Research Corp.  [XEROX]\r
+ 32838   8046        -      -     AT&T                     [XEROX]\r
+ 32839   8047        -      -     AT&T                     [XEROX]\r
+ 32841   8049        -      -     ExperData                [XEROX]\r
+ 32859   805B        -      -     Stanford V Kernel exp.   [XEROX]\r
+ 32860   805C        -      -     Stanford V Kernel prod.  [XEROX]\r
+ 32861   805D        -      -     Evans & Sutherland       [XEROX]\r
+ 32864   8060        -      -     Little Machines          [XEROX]\r
+ 32866   8062        -      -     Counterpoint Computers   [XEROX]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 169]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ 32869   8065        -      -     Univ. of Mass. @ Amherst [XEROX]\r
+ 32870   8066        -      -     Univ. of Mass. @ Amherst [XEROX]\r
+ 32871   8067        -      -     Veeco Integrated Auto.   [XEROX]\r
+ 32872   8068        -      -     General Dynamics         [XEROX]\r
+ 32873   8069        -      -     AT&T                     [XEROX]\r
+ 32874   806A        -      -     Autophon                 [XEROX]\r
+ 32876   806C        -      -     ComDesign                [XEROX]\r
+ 32877   806D        -      -     Computgraphic Corp.      [XEROX]\r
+ 32878   806E-8077   -      -     Landmark Graphics Corp.  [XEROX]\r
+ 32890   807A        -      -     Matra                    [XEROX]\r
+ 32891   807B        -      -     Dansk Data Elektronik    [XEROX]\r
+ 32892   807C        -      -     Merit Internodal           [HWB]\r
+ 32893   807D-807F   -      -     Vitalink Communications  [XEROX]\r
+ 32896   8080        -      -     Vitalink TransLAN III    [XEROX]\r
+ 32897   8081-8083   -      -     Counterpoint Computers   [XEROX]\r
+ 32923   809B        -      -     Appletalk                [XEROX]\r
+ 32924   809C-809E   -      -     Datability               [XEROX]\r
+ 32927   809F        -      -     Spider Systems Ltd.      [XEROX]\r
+ 32931   80A3        -      -     Nixdorf Computers        [XEROX]\r
+ 32932   80A4-80B3   -      -     Siemens Gammasonics Inc. [XEROX]\r
+ 32960   80C0-80C3   -      -     DCA Data Exchange Cluster[XEROX]\r
+         80C4                     Banyan Systems           [XEROX]\r
+         80C5                     Banyan Systems           [XEROX]\r
+ 32966   80C6        -      -     Pacer Software           [XEROX]\r
+ 32967   80C7        -      -     Applitek Corporation     [XEROX]\r
+ 32968   80C8-80CC   -      -     Intergraph Corporation   [XEROX]\r
+ 32973   80CD-80CE   -      -     Harris Corporation       [XEROX]\r
+ 32975   80CF-80D2   -      -     Taylor Instrument        [XEROX]\r
+ 32979   80D3-80D4   -      -     Rosemount Corporation    [XEROX]\r
+ 32981   80D5        -      -     IBM SNA Service on Ether [XEROX]\r
+ 32989   80DD        -      -     Varian Associates        [XEROX]\r
+ 32990   80DE-80DF   -      -     Integrated Solutions TRFS[XEROX]\r
+ 32992   80E0-80E3   -      -     Allen-Bradley            [XEROX]\r
+ 32996   80E4-80F0   -      -     Datability               [XEROX]\r
+ 33010   80F2        -      -     Retix                    [XEROX]\r
+ 33011   80F3        -      -     AppleTalk AARP (Kinetics)[XEROX]\r
+ 33012   80F4-80F5   -      -     Kinetics                 [XEROX]\r
+ 33015   80F7        -      -     Apollo Computer          [XEROX]\r
+ 33023   80FF-8103   -      -     Wellfleet Communications [XEROX]\r
+ 33031   8107-8109   -      -     Symbolics Private        [XEROX]\r
+ 33072   8130        -      -     Hayes Microcomputers     [XEROX]\r
+ 33073   8131        -      -     VG Laboratory Systems    [XEROX]\r
+         8132-8136                Bridge Communications    [XEROX]\r
+ 33079   8137-8138   -      -     Novell, Inc.             [XEROX]\r
+ 33081   8139-813D   -      -     KTI                      [XEROX]\r
+         8148                     Logicraft                [XEROX]\r
+         8149                     Network Computing Devices[XEROX]\r
+         814A                     Alpha Micro              [XEROX]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 170]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ 33100   814C        -      -     SNMP                      [JKR1]\r
+         814D                     BIIN                     [XEROX]\r
+         814E                     BIIN                     [XEROX]\r
+         814F                     Technically Elite Concept[XEROX]\r
+         8150                     Rational Corp            [XEROX]\r
+         8151-8153                Qualcomm                 [XEROX]\r
+         815C-815E                Computer Protocol Pty Ltd[XEROX]\r
+         8164-8166                Charles River Data System[XEROX]\r
+         817D-818C                Protocol Engines         [XEROX]\r
+         818D                     Motorola Computer        [XEROX]\r
+         819A-81A3                Qualcomm                 [XEROX]\r
+         81A4                     ARAI Bunkichi            [XEROX]\r
+         81A5-81AE                RAD Network Devices      [XEROX]\r
+         81B7-81B9                Xyplex                   [XEROX]\r
+         81CC-81D5                Apricot Computers        [XEROX]\r
+         81D6-81DD                Artisoft                 [XEROX]\r
+         81E6-81EF                Polygon                  [XEROX]\r
+         81F0-81F2                Comsat Labs              [XEROX]\r
+         81F3-81F5                SAIC                     [XEROX]\r
+         81F6-81F8                VG Analytical            [XEROX]\r
+         8203-8205                Quantum Software         [XEROX]\r
+         8221-8222                Ascom Banking Systems    [XEROX]\r
+         823E-8240                Advanced Encryption Syste[XEROX]\r
+         827F-8282                Athena Programming       [XEROX]\r
+         8263-826A                Charles River Data System[XEROX]\r
+         829A-829B                Inst Ind Info Tech       [XEROX]\r
+         829C-82AB                Taurus Controls          [XEROX]\r
+         82AC-8693                Walker Richer & Quinn    [XEROX]\r
+         8694-869D                Idea Courier             [XEROX]\r
+         869E-86A1                Computer Network Tech    [XEROX]\r
+         86A3-86AC                Gateway Communications   [XEROX]\r
+         86DB                     SECTRA                   [XEROX]\r
+         86DE                     Delta Controls           [XEROX]\r
+ 34543   86DF        -      -     ATOMIC                     [JBP]\r
+         86E0-86EF                Landis & Gyr Powers      [XEROX]\r
+         8700-8710                Motorola                 [XEROX]\r
+         8A96-8A97                Invisible Software       [XEROX]\r
+ 36864   9000        -      -     Loopback                 [XEROX]\r
+ 36865   9001        -      -     3Com(Bridge) XNS Sys Mgmt[XEROX]\r
+ 36866   9002        -      -     3Com(Bridge) TCP-IP Sys  [XEROX]\r
+ 36867   9003        -      -     3Com(Bridge) loop detect [XEROX]\r
+ 65280   FF00        -      -     BBN VITAL-LanBridge cache[XEROX]\r
+         FF00-FF0F                ISC Bunker Ramo          [XEROX]\r
+\r
+The standard for transmission of IP datagrams over Ethernets and\r
+Experimental Ethernets is specified in [RFC894] and [RFC895]\r
+respectively.\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 171]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+NOTE:  Ethernet 48-bit address blocks are assigned by the IEEE.\r
+\r
+IEEE Registration Authority\r
+c/o Iris Ringel\r
+IEEE Standards Department\r
+445 Hoes Lane, P.O. Box 1331\r
+Piscataway, NJ 08855-1331\r
+Phone +1 908 562 3813\r
+Fax: +1 908 562 1571\r
+\r
+\r
+IANA ETHERNET ADDRESS BLOCK\r
+\r
+\r
+The IANA owns an Ethernet address block which may be used for\r
+multicast address asignments or other special purposes.\r
+\r
+The address block in IEEE binary is:  0000 0000 0000 0000 0111 1010\r
+\r
+In the normal Internet dotted decimal notation this is 0.0.94 since\r
+the bytes are transmitted higher order first and bits within bytes are\r
+transmitted lower order first (see "Data Notation" in the\r
+Introduction).\r
+\r
+IEEE CSMA/CD and Token Bus bit transmission order: 00 00 5E\r
+\r
+IEEE Token Ring bit transmission order: 00 00 7A\r
+\r
+Appearance on the wire (bits transmitted from left to right):\r
+\r
+\r
+    0                           23                            47\r
+    |                           |                             |\r
+    1000 0000 0000 0000 0111 1010 xxxx xxx0 xxxx xxxx xxxx xxxx\r
+    |                                     |\r
+    Multicast Bit                         0 = Internet Multicast\r
+                                          1 = Assigned by IANA for\r
+                                              other uses\r
+\r
+Appearance in memory (bits transmitted right-to-left within octets,\r
+octets transmitted left-to-right):\r
+\r
+\r
+    0                           23                            47\r
+    |                           |                             |\r
+    0000 0001 0000 0000 0101 1110 0xxx xxxx xxxx xxxx xxxx xxxx\r
+            |                     |\r
+            Multicast Bit         0 = Internet Multicast\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 172]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+                                  1 = Assigned by IANA for other uses\r
+\r
+The latter representation corresponds to the Internet standard\r
+bit-order, and is the format that most programmers have to deal with.\r
+Using this representation, the range of Internet Multicast addresses\r
+is:\r
+\r
+\r
+       01-00-5E-00-00-00  to  01-00-5E-7F-FF-FF  in hex, or\r
+\r
+       1.0.94.0.0.0  to  1.0.94.127.255.255  in dotted decimal\r
+\r
+\r
+\r
+ETHERNET VENDOR ADDRESS COMPONENTS\r
+\r
+Ethernet hardware addresses are 48 bits, expressed as 12 hexadecimal\r
+digits (0-9, plus A-F, capitalized).  These 12 hex digits consist of\r
+the first/left 6 digits (which should match the vendor of the Ethernet\r
+interface within the station) and the last/right 6 digits which\r
+specify the interface serial number for that interface vendor.\r
+\r
+Ethernet addresses might be written unhyphenated (e.g., 123456789ABC),\r
+or with one hyphen (e.g., 123456-789ABC), but should be written\r
+hyphenated by octets (e.g., 12-34-56-78-9A-BC).\r
+\r
+These addresses are physical station addresses, not multicast nor\r
+broadcast, so the second hex digit (reading from the left) will be\r
+even, not odd.\r
+\r
+At present, it is not clear how the IEEE assigns Ethernet block\r
+addresses.  Whether in blocks of 2**24 or 2**25, and whether\r
+multicasts are assigned with that block or separately.  A portion of\r
+the vendor block address is reportedly assigned serially, with the\r
+other portion intentionally assigned randomly.  If there is a global\r
+algorithm for which addresses are designated to be physical (in a\r
+chipset) versus logical (assigned in software), or globally-assigned\r
+versus locally-assigned addresses, some of the known addresses do not\r
+follow the scheme (e.g., AA0003; 02xxxx).\r
+\r
+00000C  Cisco\r
+00000E  Fujitsu\r
+00000F  NeXT\r
+000010  Sytek\r
+00001D  Cabletron\r
+000020  DIAB (Data Intdustrier AB)\r
+000022  Visual Technology\r
+00002A  TRW\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 173]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+000032  GPT Limited (reassigned from GEC Computers Ltd)\r
+00005A  S & Koch\r
+00005E  IANA\r
+000065  Network General\r
+00006B  MIPS\r
+000077  MIPS\r
+00007A  Ardent\r
+000089  Cayman Systems  Gatorbox\r
+000093  Proteon\r
+00009F  Ameristar Technology\r
+0000A2  Wellfleet\r
+0000A3  Network Application Technology\r
+0000A6  Network General (internal assignment, not for products)\r
+0000A7  NCD             X-terminals\r
+0000A9  Network Systems\r
+0000AA  Xerox           Xerox machines\r
+0000B3  CIMLinc\r
+0000B7  Dove            Fastnet\r
+0000BC  Allen-Bradley\r
+0000C0  Western Digital\r
+0000C5  Farallon phone net card\r
+0000C6  HP Intelligent Networks Operation (formerly Eon Systems)\r
+0000C8  Altos\r
+0000C9  Emulex          Terminal Servers\r
+0000D7  Dartmouth College (NED Router)\r
+0000D8  3Com? Novell?   PS/2\r
+0000DD  Gould\r
+0000DE  Unigraph\r
+0000E2  Acer Counterpoint\r
+0000EF  Alantec\r
+0000FD  High Level Hardvare (Orion, UK)\r
+000102  BBN             BBN internal usage (not registered)\r
+0020AF  3COM ???\r
+001700  Kabel\r
+008064  Wyse Technology / Link Technologies\r
+00802B  IMAC ???\r
+00802D  Xylogics, Inc.  Annex terminal servers\r
+00808C  Frontier Software Development\r
+0080C2  IEEE 802.1 Committee\r
+0080D3  Shiva\r
+00AA00  Intel\r
+00DD00  Ungermann-Bass\r
+00DD01  Ungermann-Bass\r
+020701  Racal InterLan\r
+020406  BBN             BBN internal usage (not registered)\r
+026086  Satelcom MegaPac (UK)\r
+02608C  3Com            IBM PC; Imagen; Valid; Cisco\r
+02CF1F  CMC             Masscomp; Silicon Graphics; Prime EXL\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 174]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+080002  3Com (Formerly Bridge)\r
+080003  ACC (Advanced Computer Communications)\r
+080005  Symbolics       Symbolics LISP machines\r
+080008  BBN\r
+080009  Hewlett-Packard\r
+08000A  Nestar Systems\r
+08000B  Unisys\r
+080011  Tektronix, Inc.\r
+080014  Excelan         BBN Butterfly, Masscomp, Silicon Graphics\r
+080017  NSC\r
+08001A  Data General\r
+08001B  Data General\r
+08001E  Apollo\r
+080020  Sun             Sun machines\r
+080022  NBI\r
+080025  CDC\r
+080026  Norsk Data (Nord)\r
+080027  PCS Computer Systems GmbH\r
+080028  TI              Explorer\r
+08002B  DEC\r
+08002E  Metaphor\r
+08002F  Prime Computer  Prime 50-Series LHC300\r
+080036  Intergraph      CAE stations\r
+080037  Fujitsu-Xerox\r
+080038  Bull\r
+080039  Spider Systems\r
+080041  DCA Digital Comm. Assoc.\r
+080045  ???? (maybe Xylogics, but they claim not to know this number)\r
+080046  Sony\r
+080047  Sequent\r
+080049  Univation\r
+08004C  Encore\r
+08004E  BICC\r
+080056  Stanford University\r
+080058  ???             DECsystem-20\r
+08005A  IBM\r
+080067  Comdesign\r
+080068  Ridge\r
+080069  Silicon Graphics\r
+08006E  Concurrent      Masscomp\r
+080075  DDE (Danish Data Elektronik A/S)\r
+08007C  Vitalink        TransLAN III\r
+080080  XIOS\r
+080086  Imagen/QMS\r
+080087  Xyplex          terminal servers\r
+080089  Kinetics        AppleTalk-Ethernet interface\r
+08008B  Pyramid\r
+08008D  XyVision        XyVision machines\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 175]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+080090  Retix Inc       Bridges\r
+484453  HDS ???\r
+800010  AT&T\r
+AA0000  DEC             obsolete\r
+AA0001  DEC             obsolete\r
+AA0002  DEC             obsolete\r
+AA0003  DEC             Global physical address for some DEC machines\r
+AA0004  DEC             Local logical address for systems running\r
+                        DECNET\r
+\r
+\r
+ETHERNET MULTICAST ADDRESSES\r
+\r
+An Ethernet multicast address consists of the multicast bit, the\r
+23-bit vendor component, and the 24-bit group identifier assigned by\r
+the vendor.  For example, DEC is assigned the vendor component\r
+08-00-2B, so multicast addresses assigned by DEC have the first\r
+24-bits 09-00-2B (since the multicast bit is the low-order bit of the\r
+first byte, which is "the first bit on the wire").\r
+\r
+\r
+Ethernet                Type\r
+Address                 Field   Usage\r
+\r
+Multicast Addresses:\r
+\r
+01-00-5E-00-00-00-      0800    Internet Multicast        [RFC1112]\r
+01-00-5E-7F-FF-FF\r
+01-00-5E-80-00-00-      ????    Internet reserved by IANA\r
+01-00-5E-FF-FF-FF\r
+01-80-C2-00-00-00       -802-   Spanning tree (for bridges)\r
+09-00-02-04-00-01?      8080?   Vitalink printer\r
+09-00-02-04-00-02?      8080?   Vitalink management\r
+09-00-09-00-00-01       8005    HP Probe\r
+09-00-09-00-00-01       -802-   HP Probe\r
+09-00-09-00-00-04       8005?   HP DTC\r
+09-00-1E-00-00-00       8019?   Apollo DOMAIN\r
+09-00-2B-00-00-00       6009?   DEC MUMPS?\r
+09-00-2B-00-00-01       8039?   DEC DSM/DTP?\r
+09-00-2B-00-00-02       803B?   DEC VAXELN?\r
+09-00-2B-00-00-03       8038    DEC Lanbridge Traffic Monitor (LTM)\r
+09-00-2B-00-00-04       ????    DEC MAP End System Hello\r
+09-00-2B-00-00-05       ????    DEC MAP Intermediate System Hello\r
+09-00-2B-00-00-06       803D?   DEC CSMA/CD Encryption?\r
+09-00-2B-00-00-07       8040?   DEC NetBios Emulator?\r
+09-00-2B-00-00-0F       6004    DEC Local Area Transport (LAT)\r
+09-00-2B-00-00-1x       ????    DEC Experimental\r
+09-00-2B-01-00-00       8038    DEC LanBridge Copy packets\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 176]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+                                (All bridges)\r
+09-00-2B-01-00-01       8038    DEC LanBridge Hello packets\r
+                                (All local bridges)\r
+                                1 packet per second, sent by the\r
+                                designated LanBridge\r
+09-00-2B-02-00-00       ????    DEC DNA Lev. 2 Routing Layer routers?\r
+09-00-2B-02-01-00       803C?   DEC DNA Naming Service Advertisement?\r
+09-00-2B-02-01-01       803C?   DEC DNA Naming Service Solicitation?\r
+09-00-2B-02-01-02       803E?   DEC DNA Time Service?\r
+09-00-2B-03-xx-xx       ????    DEC default filtering by bridges?\r
+09-00-2B-04-00-00       8041?   DEC Local Area Sys. Transport (LAST)?\r
+09-00-2B-23-00-00       803A?   DEC Argonaut Console?\r
+09-00-4E-00-00-02?      8137?   Novell IPX\r
+09-00-56-00-00-00-      ????    Stanford reserved\r
+09-00-56-FE-FF-FF\r
+09-00-56-FF-00-00-      805C    Stanford V Kernel, version 6.0\r
+09-00-56-FF-FF-FF\r
+09-00-77-00-00-01       ????    Retix spanning tree bridges\r
+09-00-7C-02-00-05       8080?   Vitalink diagnostics\r
+09-00-7C-05-00-01       8080?   Vitalink gateway?\r
+0D-1E-15-BA-DD-06       ????    HP\r
+AB-00-00-01-00-00       6001    DEC Maintenance Operation Protocol\r
+                                (MOP) Dump/Load Assistance\r
+AB-00-00-02-00-00       6002    DEC Maintenance Operation Protocol\r
+                                (MOP) Remote Console\r
+                                1 System ID packet every 8-10 minutes,\r
+                                by every:\r
+                                DEC LanBridge\r
+                                DEC DEUNA interface\r
+                                DEC DELUA interface\r
+                                DEC DEQNA interface\r
+                                (in a certain mode)\r
+AB-00-00-03-00-00       6003    DECNET Phase IV end node Hello\r
+                                packets 1 packet every 15 seconds,\r
+                                sent by each DECNET host\r
+AB-00-00-04-00-00       6003    DECNET Phase IV Router Hello packets\r
+                                1 packet every 15 seconds, sent by\r
+                                the DECNET router\r
+AB-00-00-05-00-00       ????    Reserved DEC through\r
+AB-00-03-FF-FF-FF\r
+AB-00-03-00-00-00       6004    DEC Local Area Transport (LAT) - old\r
+AB-00-04-00-xx-xx       ????    Reserved DEC customer private use\r
+AB-00-04-01-xx-yy       6007    DEC Local Area VAX Cluster groups\r
+                                Sys. Communication Architecture (SCA)\r
+CF-00-00-00-00-00       9000    Ethernet Configuration Test protocol\r
+                                (Loopback)\r
+\r
+Broadcast Address:\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 177]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+FF-FF-FF-FF-FF-FF       0600    XNS packets, Hello or gateway search?\r
+                                6 packets every 15 seconds, per XNS\r
+                                station\r
+FF-FF-FF-FF-FF-FF       0800    IP (e.g. RWHOD via UDP) as needed\r
+FF-FF-FF-FF-FF-FF       0804    CHAOS\r
+FF-FF-FF-FF-FF-FF       0806    ARP (for IP and CHAOS) as needed\r
+FF-FF-FF-FF-FF-FF       0BAD    Banyan\r
+FF-FF-FF-FF-FF-FF       1600    VALID packets, Hello or gateway\r
+                                search?\r
+                                1 packets every 30 seconds, per VALID\r
+                                station\r
+FF-FF-FF-FF-FF-FF       8035    Reverse ARP\r
+FF-FF-FF-FF-FF-FF       807C    Merit Internodal (INP)\r
+FF-FF-FF-FF-FF-FF       809B    EtherTalk\r
+\r
+\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC894]  Hornig, C., "A Standard for the Transmission of IP Datagrams\r
+          over Ethernet Networks, STD 41, RFC 894, Symbolics,\r
+          April 1984.\r
+\r
+[RFC895]  Postel, J., "A Standard for the Transmission of IP Datagrams\r
+          over Experimental Ethernet Networks, STD 42, RFC 895,\r
+          USC/Information Sciences Institute, April 1984.\r
+\r
+[RFC1112]  Deeering, S., "Host Extensions for IP Multicasting",\r
+           STD 5, RFC 1112, Stanford University, August 1989.\r
+\r
+PEOPLE\r
+\r
+[AXC] Andrew Cherenson <arc@SGI.COM>\r
+\r
+[DCP1] David Plummer <DCP@SCRC-QUABBIN.ARPA>\r
+\r
+[DT15] Daniel Tappan <Tappan@BBN.COM>\r
+\r
+[HWB] Hans-Werner Braun <HWB@MCR.UMICH.EDU>\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[JKR1] Joyce K. Reynolds <jkrey@isi.edu>\r
+\r
+[JXM] Joseph Murdock <---none--->\r
+\r
+[XEROX] Fonda Pallone (415-813-7164)\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 178]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/ethernet-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 179]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+X.25 TYPE NUMBERS\r
+\r
+\r
+CCITT defines the high order two bits of the first octet of call user\r
+data as follows:\r
+\r
+\r
+00 - Used for other CCITT recomendations (such as X.29)\r
+01 - Reserved for use by "national" administrative\r
+     authorities\r
+10 - Reserved for use by international administrative authoorities\r
+11 - Reserved for arbitrary use between consenting DTEs\r
+\r
+Call User Data (hex)     Protocol                      Reference\r
+-------------------      --------                      ---------\r
+\r
+01                       PAD                               [GS2]\r
+C5                       Blacker front-end descr dev       [AGM]\r
+CC                       IP                         [RFC877,AGM]*\r
+CD                       ISO-IP                            [AGM]\r
+CF                       PPP                           [RFC1598]\r
+DD                       Network Monitoring                [AGM]\r
+\r
+*NOTE: ISO SC6/WG2 approved assignment in ISO 9577 (January 1990).\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC877] Korb, J., "A Standard for the Transmission of IP Datagrams\r
+         Over Public Data Networks", RFC 877, Purdue University,\r
+         September 1983.\r
+\r
+[RFC1598] Simpson, W., "PPPin X.25", RFC 1598, Daydreamer, March 1994.\r
+\r
+\r
+PEOPLE\r
+\r
+[AGM]     Andy Malis <malis_a@timeplex.com>\r
+\r
+[GS2]     Greg Satz  <satz@CISCO.COM>\r
+\r
+[]\r
+\r
+\r
+\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/x25-type-numbers\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 180]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PUBLIC DATA NETWORK NUMBERS\r
+\r
+\r
+One of the Internet Class A Networks is the international system of\r
+Public Data Networks.  This section lists the mapping between the\r
+Internet Addresses and the Public Data Network Addresses (X.121).\r
+\r
+\r
+Assignments:\r
+\r
+\r
+  Internet           Public Data Net    Description     References\r
+  --------------   -----------------   -----------      ----------\r
+ 014.000.000.000                       Reserved              [JBP]\r
+ 014.000.000.001   3110-317-00035 00   PURDUE-TN              [TN]\r
+ 014.000.000.002   3110-608-00027 00   UWISC-TN               [TN]\r
+ 014.000.000.003   3110-302-00024 00   UDEL-TN                [TN]\r
+ 014.000.000.004   2342-192-00149 23   UCL-VTEST              [PK]\r
+ 014.000.000.005   2342-192-00300 23   UCL-TG                 [PK]\r
+ 014.000.000.006   2342-192-00300 25   UK-SATNET              [PK]\r
+ 014.000.000.007   3110-608-00024 00   UWISC-IBM            [MS56]\r
+ 014.000.000.008   3110-213-00045 00   RAND-TN               [MO2]\r
+ 014.000.000.009   2342-192-00300 23   UCL-CS                 [PK]\r
+ 014.000.000.010   3110-617-00025 00   BBN-VAN-GW           [JD21]\r
+ 014.000.000.011   2405-015-50300 00   CHALMERS              [UXB]\r
+ 014.000.000.012   3110-713-00165 00   RICE                 [PAM6]\r
+ 014.000.000.013   3110-415-00261 00   DECWRL               [PAM6]\r
+ 014.000.000.014   3110-408-00051 00   IBM-SJ               [SXA3]\r
+ 014.000.000.015   2041-117-01000 00   SHAPE                 [JFW]\r
+ 014.000.000.016   2628-153-90075 00   DFVLR4-X25            [GB7]\r
+ 014.000.000.017   3110-213-00032 00   ISI-VAN-GW           [JD21]\r
+ 014.000.000.018   2624-522-80900 52   FGAN-SIEMENS-X25      [GB7]\r
+ 014.000.000.019   2041-170-10000 00   SHAPE-X25             [JFW]\r
+ 014.000.000.020   5052-737-20000 50   UQNET                 [AXH]\r
+ 014.000.000.021   3020-801-00057 50   DMC-CRC1              [VXT]\r
+ 014.000.000.022   2624-522-80329 02   FGAN-FGANFFMVAX-X25   [GB7]\r
+ 014.000.000.023   2624-589-00908 01   ECRC-X25              [PXD]\r
+ 014.000.000.024   2342-905-24242 83   UK-MOD-RSRE          [JXE2]\r
+ 014.000.000.025   2342-905-24242 82   UK-VAN-RSRE           [AXM]\r
+ 014.000.000.026   2624-522-80329 05   DFVLRSUN-X25          [GB7]\r
+ 014.000.000.027   2624-457-11015 90   SELETFMSUN-X25        [BXD]\r
+ 014.000.000.028   3110-408-00146 00   CDC-SVL             [RAM57]\r
+ 014.000.000.029   2222-551-04400 00   SUN-CNUCE            [ABB2]\r
+ 014.000.000.030   2222-551-04500 00   ICNUCEVM-CNUCE       [ABB2]\r
+ 014.000.000.031   2222-551-04600 00   SPARE-CNUCE          [ABB2]\r
+ 014.000.000.032   2222-551-04700 00   ICNUCEVX-CNUCE       [ABB2]\r
+ 014.000.000.033   2222-551-04524 00   CISCO-CNUCE          [ABB2]\r
+ 014.000.000.034   2342-313-00260 90   SPIDER-GW            [AD67]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 181]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ 014.000.000.035   2342-313-00260 91   SPIDER-EXP           [AD67]\r
+ 014.000.000.036   2342-225-00101 22   PRAXIS-X25A           [TXR]\r
+ 014.000.000.037   2342-225-00101 23   PRAXIS-X25B           [TXR]\r
+ 014.000.000.038   2403-712-30250 00   DIAB-TABY-GW          [FXB]\r
+ 014.000.000.039   2403-715-30100 00   DIAB-LKP-GW           [FXB]\r
+ 014.000.000.040   2401-881-24038 00   DIAB-TABY1-GW         [FXB]\r
+ 014.000.000.041   2041-170-10060 00   STC                  [TC27]\r
+ 014.000.000.042   2222-551-00652 60   CNUCE                [TC27]\r
+ 014.000.000.043   2422-510-05900 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.044   2422-670-08900 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.045   2422-516-01000 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.046   2422-450-00800 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.047   2422-610-00200 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.048   2422-310-00300 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.049   2422-470-08800 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.050   2422-210-04600 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.051   2422-130-28900 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.052   2422-310-27200 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.053   2422-250-05800 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.054   2422-634-05900 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.055   2422-670-08800 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.056   2422-430-07400 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.057   2422-674-07800 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.058   2422-230-16900 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.059   2422-518-02900 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.060   2422-370-03100 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.061   2422-516-03400 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.062   2422-616-04400 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.063   2422-650-23500 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.064   2422-330-02500 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.065   2422-350-01900 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.066   2422-410-00700 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.067   2422-539-06200 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.068   2422-630-07200 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.069   2422-470-12300 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.070   2422-470-13000 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.071   2422-170-04600 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.072   2422-516-04300 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.073   2422-530-00700 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.074   2422-650-18800 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.075   2422-450-24500 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.076   2062-243-15631 00   DPT-BXL-DDC          [LZ15]\r
+ 014.000.000.077   2062-243-15651 00   DPT-BXL-DDC2         [LZ15]\r
+ 014.000.000.078   3110-312-00431 00   DPT-CHI              [LZ15]\r
+ 014.000.000.079   3110-512-00135 00   DPT-SAT-ENG          [LZ15]\r
+ 014.000.000.080   2080-941-90550 00   DPT-PAR              [LZ15]\r
+ 014.000.000.081   4545-511-30600 00   DPT-PBSC             [LZ15]\r
+ 014.000.000.082   4545-513-30900 00   DPT-HONGKONG         [LZ15]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 182]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ 014.000.000.083   4872-203-55000 00   UECI-TAIPEI          [LZ15]\r
+ 014.000.000.084   2624-551-10400 20   DPT-HANOVR           [LZ15]\r
+ 014.000.000.085   2624-569-00401 99   DPT-FNKFRT           [LZ15]\r
+ 014.000.000.086   3110-512-00134 00   DPT-SAT-SUPT         [LZ15]\r
+ 014.000.000.087   4602-3010-0103 20   DU-X25A              [JK64]\r
+ 014.000.000.088   4602-3010-0103 21   FDU-X25B             [JK64]\r
+ 014.000.000.089   2422-150-33700 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.090   2422-271-07100 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.091   2422-516-00100 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.092   2422-650-18800 00   Norsk Informas.       [OXG]\r
+ 014.000.000.093   2422-250-30400 00   Tollpost-Globe AS     [OXG]\r
+ 014.000.000.094                       Leissner Data AB     [PXF1]\r
+ 014.000.000.095                       Leissner Data AB     [PXF1]\r
+ 014.000.000.096                       Leissner Data AB     [PXF1]\r
+ 014.000.000.097                       Leissner Data AB     [PXF1]\r
+ 014.000.000.098                       Leissner Data AB     [PXF1]\r
+ 014.000.000.099                       Leissner Data AB     [PXF1]\r
+ 014.000.000.100                       Leissner Data AB     [PXF1]\r
+ 014.000.000.101                       Leissner Data AB     [PXF1]\r
+ 014.000.000.102                       Leissner Data AB     [PXF1]\r
+ 014.000.000.103                       Leissner Data AB     [PXF1]\r
+ 014.000.000.104                       Leissner Data AB     [PXF1]\r
+ 014.000.000.105                       Leissner Data AB     [PXF1]\r
+ 014.000.000.106                       Leissner Data AB     [PXF1]\r
+ 014.000.000.107                       Leissner Data AB     [PXF1]\r
+ 014.000.000.108                       Leissner Data AB     [PXF1]\r
+ 014.000.000.109                       Leissner Data AB     [PXF1]\r
+ 014.000.000.110                       Leissner Data AB     [PXF1]\r
+ 014.000.000.111                       Leissner Data AB     [PXF1]\r
+ 014.000.000.112                       Leissner Data AB     [PXF1]\r
+ 014.000.000.113                       Leissner Data AB     [PXF1]\r
+ 014.000.000.114                       Leissner Data AB     [PXF1]\r
+ 014.000.000.115                       Leissner Data AB     [PXF1]\r
+ 014.000.000.116                       Leissner Data AB     [PXF1]\r
+ 014.000.000.117                       Leissner Data AB     [PXF1]\r
+ 014.000.000.118                       Leissner Data AB     [PXF1]\r
+ 014.000.000.119                       Leissner Data AB     [PXF1]\r
+ 014.000.000.120                       Leissner Data AB     [PXF1]\r
+ 014.000.000.121                       Leissner Data AB     [PXF1]\r
+ 014.000.000.122                       Leissner Data AB     [PXF1]\r
+ 014.000.000.123                       Leissner Data AB     [PXF1]\r
+ 014.000.000.124                       Leissner Data AB     [PXF1]\r
+ 014.000.000.125                       Leissner Data AB     [PXF1]\r
+ 014.000.000.126                       Leissner Data AB     [PXF1]\r
+ 014.000.000.127                       Leissner Data AB     [PXF1]\r
+ 014.000.000.128                       Leissner Data AB     [PXF1]\r
+ 014.000.000.129  2422-150-17900 00    Tollpost-Globe AS     [OXG]\r
+ 014.000.000.130  2422-150-42700 00    Tollpost-Globe AS     [OXG]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 183]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ 014.000.000.131  2422-190-41900 00    T-G Airfreight AS     [OXG]\r
+ 014.000.000.132  2422-616-16100 00    Tollpost-Globe AS     [OXG]\r
+ 014.000.000.133  2422-150-50700-00    Tollpost-Globe Int.   [OXG]\r
+ 014.000.000.134  2422-190-28100-00    Intersped AS          [OXG]\r
+\r
+ 014.000.000.135-014.255.255.254       Unassigned            [JBP]\r
+ 014.255.255.255                       Reserved              [JBP]\r
+\r
+The standard for transmission of IP datagrams over the Public Data\r
+Network is specified in RFC-1356 [69].\r
+\r
+REFERENCES\r
+\r
+[RFC877] Korb, J., "A Standard for the Transmission of IP Datagrams\r
+         Over Public Data Networks", RFC 877, Purdue University,\r
+         September 1983.\r
+\r
+\r
+PEOPLE\r
+\r
+[ABB2] A. Blasco Bonito <blasco@ICNUCEVM.CNUCE.CNR.IT>\r
+\r
+[AD67] Andy Davis <andy@SPIDER.CO.UK>\r
+\r
+[AXH] Arthur Harvey <harvey@gah.enet.dec.com>\r
+\r
+[AXM] Alex Martin <---none--->\r
+\r
+[BXD] Brian Dockter <---none--->\r
+\r
+[FXB] <mystery contact>\r
+\r
+[GB7] Gerd Beling <GBELING@ISI.EDU>\r
+\r
+[JBP] Jon Postel <postel@isi.edu.\r
+\r
+[JD21] Jonathan Dreyer <Dreyer@CCV.BBN.COM>\r
+\r
+[JFW] Jon F. Wilkes <Wilkes@CCINT1.RSRE.MOD.UK>\r
+\r
+[JK64] mystery contact!\r
+\r
+[JXE2] Jeanne Evans <JME%RSRE.MOD.UK@CS.UCL.AC.UK>\r
+\r
+[LZ15] Lee Ziegenhals <lcz@sat.datapoint.com>\r
+\r
+[MS56] Marvin Solomon <solomon@CS.WISC.EDU>\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 184]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[MO2] Michael O'Brien <obrien@AEROSPACE.AERO.ORG>\r
+\r
+[OXG] Oyvind Gjerstad <ogj%tglobe2.UUCP@nac.no>\r
+\r
+[PAM6] Paul McNabb <pam@PURDUE.EDU>\r
+\r
+[PK] Peter Kirstein <Kirstein@NSS.CS.UCL.AC.UK>\r
+\r
+[PXD] Peter Delchiappo <---none--->\r
+\r
+[PXF1] Per Futtrup <---none--->\r
+\r
+[RAM57] Rex Mann <---none--->\r
+\r
+[SXA3] Sten Andler <---none--->\r
+\r
+[TN] Thomas Narten <narten@PURDUE.EDU>\r
+\r
+[TC27] Thomas Calderwood <TCALDERW@BBN.COM>\r
+\r
+[TXR] Tim Rylance <praxis!tkr@UUNET.UU.NET>\r
+\r
+[UXB] <mystery contact>\r
+\r
+[VXT] V. Taylor <vktaylor@NCS.DND.CA>\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/public-data-network-\r
+numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 185]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+MILNET LINK NUMBERS\r
+\r
+\r
+The word "link" here refers to a field in the original MILNET Host/IMP\r
+interface leader.  The link was originally defined as an 8-bit field.\r
+Later specifications defined this field as the "message-id" with a\r
+length of 12 bits.  The name link now refers to the high order 8 bits of\r
+this 12-bit message-id field.  The Host/IMP interface is defined in BBN\r
+Report 1822 [BBN1822].\r
+\r
+The low-order 4 bits of the message-id field are called the sub-link.\r
+Unless explicitly specified otherwise for a particular protocol, there\r
+is no sender to receiver significance to the sub-link.  The sender may\r
+use the sub-link in any way he chooses (it is returned in the RFNM by\r
+the destination IMP), the receiver should ignore the sub-link.\r
+\r
+\r
+Link Assignments:\r
+\r
+Decimal   Description                                   References\r
+-------   -----------                                   ----------\r
+0-63      BBNCC Monitoring                                    [MB]\r
+64-149    Unassigned                                         [JBP]\r
+150       Xerox NS IDP                            [ETHERNET,XEROX]\r
+151       Unassigned                                         [JBP]\r
+152       PARC Universal Protocol                      [PUP,XEROX]\r
+153       TIP Status Reporting                               [JGH]\r
+154       TIP Accounting                                     [JGH]\r
+155       Internet Protocol [regular]                 [RFC791,JBP]\r
+156-158   Internet Protocol [experimental]            [RFC791,JBP]\r
+159       Figleaf Link                                      [JBW1]\r
+160       Blacker Local Network Protocol                    [DM28]\r
+161-194   Unassigned                                         [JBP]\r
+195       ISO-IP                                      [RFC926,RXM]\r
+196-247   Experimental Protocols                             [JBP]\r
+248-255   Network Maintenance                                [JGH]\r
+\r
+\r
+\r
+MILNET LOGICAL ADDRESSES\r
+\r
+The MILNET facility for "logical addressing" is described in [RFC878]\r
+and [RFC1005].  A portion of the possible logical addresses are\r
+reserved for standard uses.\r
+\r
+There are 49,152 possible logical host addresses.  Of these, 256 are\r
+reserved for assignment to well-known functions.  Assignments for\r
+well-known functions are made by the IANA.  Assignments for other\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 186]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+logical host addresses are made by the NIC.\r
+\r
+\r
+Logical Address Assignments:\r
+\r
+Decimal    Description                                  References\r
+-------    -----------                                  ----------\r
+0          Reserved                                          [JBP]\r
+1          The BBN Core Gateways                              [MB]\r
+2-254      Unassigned                                        [JBP]\r
+255        Reserved                                          [JBP]\r
+\r
+\r
+\r
+MILNET X.25 ADDRESS MAPPINGS\r
+\r
+\r
+All MILNET hosts are assigned addresses by the Defense Data Network\r
+(DDN).  The address of a MILNET host may be obtained from the Network\r
+Information Center (NIC), represented as an ASCII text string in what\r
+is called "host table format".  This section describes the process by\r
+which MILNET X.25 addresses may be derived from addresses in the NIC\r
+host table format.\r
+\r
+A NIC host table address consists of the ASCII text string\r
+representations of four decimal numbers separated by periods,\r
+corresponding to the four octeted of a thirty-two bit Internet\r
+address.  The four decimal numbers are referred to in this section as\r
+"n", "h' "l", and "i".  Thus, a host table address may be represented\r
+as: "n.h.l.i".  Each of these four numbers will have either one, two,\r
+or three decimal digits and will never have a value greater than 255.\r
+For example, in the host table, address: "10.2.0.124", n=10, h=2, l=0,\r
+and i=124.  To convert a host table address to a MILNET X.25 address:\r
+\r
+1.  If h < 64, the host table address corresponds to the X.25\r
+physical address:\r
+\r
+\r
+ZZZZ F IIIHHZZ (SS)\r
+\r
+where:\r
+\r
+     ZZZZ = 0000    as required\r
+\r
+     F = 0          because the address is a physical address;\r
+\r
+     III            is a three decimal digit respresentation of\r
+                    "i", right-adjusted and padded with leading\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 187]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+                    zeros if required;\r
+\r
+     HH             is a two decimal digit representation of "h",\r
+                    right-adjusted and padded with leading zeros\r
+                    if required;\r
+\r
+     ZZ = 00        and\r
+\r
+     (SS)           is optional\r
+\r
+\r
+In the example given above, the host table address 10.2.0.124\r
+corresponds to the X.25 physical address 000001240200.\r
+\r
+2.  If h > 64 or h = 64, the host table address corresponds to the\r
+X.25 logical address\r
+\r
+\r
+ZZZZ F RRRRRZZ (SS)\r
+\r
+where:\r
+\r
+     ZZZZ = 0000    as required\r
+\r
+     F = 1          because the address is a logical address;\r
+\r
+     RRRRR          is a five decimal digit representation of\r
+                    the result "r" of the calculation\r
+\r
+                             r = h * 256 + i\r
+\r
+                    (Note that the decimal representation of\r
+                    "r" will always require five digits);\r
+\r
+     ZZ = 00        and\r
+\r
+     (SS)           is optional\r
+\r
+Thus, the host table address 10.83.0.207 corresponds to the X.25\r
+logical address 000012145500.\r
+\r
+In both cases, the "n" and "l" fields of the host table address are\r
+not used.\r
+\r
+\r
+REFERENCES\r
+\r
+[BBN1822] BBN, "Specifications for the Interconnection of a Host and\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 188]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+          an IMP", Report 1822, Bolt Beranek and Newman, Cambridge,\r
+          Massachusetts, revised, December 1981.\r
+\r
+[ETHERNET] "The Ethernet, A Local Area Network: Data Link Layer and\r
+           Physical Layer Specification", AA-K759B-TK, Digital\r
+           Equipment Corporation, Maynard, MA.  Also as: "The Ethernet\r
+           - A Local Area Network", Version 1.0, Digital Equipment\r
+           Corporation, Intel Corporation, Xerox Corporation,\r
+           September 1980.  And: "The Ethernet, A Local Area Network:\r
+           Data Link Layer and Physical Layer Specifications",\r
+           Digital, Intel and Xerox, November 1982.  And: XEROX, "The\r
+           Ethernet, A Local Area Network: Data Link Layer and\r
+           Physical Layer Specification", X3T51/80-50, Xerox\r
+           Corporation, Stamford, CT., October 1980.\r
+\r
+[PUP] Boggs, D., J. Shoch, E. Taft, and R. Metcalfe, "PUP: An\r
+      Internetwork Architecture", XEROX Palo Alto Research Center,\r
+      CSL-79-10, July 1979; also in IEEE Transactions on\r
+      Communication, Volume COM-28, Number 4, April 1980.\r
+\r
+[RFC791] Postel, J., ed., "Internet Protocol - DARPA Internet Program\r
+         Protocol Specification", STD 5, RFC 791, USC/Information\r
+         Sciences Institute, September 1981.\r
+\r
+[RFC878] Malis, Andrew, "The ARPANET 1822L Host Access Protocol",\r
+         RFC 878, BBN Communications Corp., December 1983.\r
+\r
+[RFC926] International Standards Organization, "Protocol for Providing\r
+         the Connectionless-Mode Network Services", RFC 926, ISO,\r
+         December 1984.\r
+\r
+[RFC1005] Khanna, A., and A. Malis, "The ARPANET AHIP-E Host Access\r
+          Protocol (Enhanced AHIP)", RFC 1005, BBN Communications\r
+          Corp., May 1987.\r
+\r
+\r
+PEOPLE\r
+\r
+[DM28] Dennis Morris  <Morrisd@IMO-UVAX.DCA.MIL>\r
+\r
+[JBP] Jon Postel <postel@isi.edu>\r
+\r
+[JBW1] Joseph Walters, Jr. <JWalters@BBN.COM>\r
+\r
+[JGH] Jim Herman <Herman@CCJ.BBN.COM>\r
+\r
+[MB] Michael Brescia <Brescia@CCV.BBN.COM>\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 189]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[RXM] Robert Myhill <Myhill@CCS.BBN.COM>\r
+\r
+[XEROX] Fonda Pallone <---none--->\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/milnet-parameters\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 190]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+XNS PROTOCOL TYPES\r
+\r
+\r
+Assigned well-known socket numbers\r
+\r
+        Routing Information             1\r
+        Echo                            2\r
+        Router Error                    3\r
+        Experimental                40-77\r
+\r
+Assigned internet packet types\r
+\r
+        Routing Information             1\r
+        Echo                            2\r
+        Error                           3\r
+        Packet Exchange                 4\r
+        Sequenced Packet                5\r
+        PUP                            12\r
+        DoD IP                         13\r
+        Experimental                20-37\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/xns-protocol-types\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 191]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+INTERNET / XNS PROTOCOL MAPPINGS\r
+\r
+\r
+Below are two tables describing the arrangement of protocol fields or\r
+type field assignments so that one could send XNS Datagrams on the\r
+MILNET or Internet Datagrams on 10Mb Ethernet, and also protocol and\r
+type fields so one could encapsulate each kind of Datagram in the\r
+other.\r
+\r
+\r
+        upper| DoD IP |  PUP   | NS IP  |\r
+lower        |        |        |        |\r
+--------------|--------|--------|--------|\r
+              |  Type  |  Type  |  Type  |\r
+3Mb Ethernet  |  1001  |  1000  |  3000  |\r
+              |  octal |  octal |  octal |\r
+--------------|--------|--------|--------|\r
+              |  Type  |  Type  |  Type  |\r
+10 Mb Ethernet|  0800  |  0200  |  0600  |\r
+              |   hex  |   hex  |   hex  |\r
+--------------|--------|--------|--------|\r
+              |  Link  |  Link  |  Link  |\r
+MILNET        |  155   |  152   |  150   |\r
+              | decimal| decimal| decimal|\r
+--------------|--------|--------|--------|\r
+\r
+\r
+\r
+        upper| DoD IP |  PUP   | NS IP  |\r
+lower        |        |        |        |\r
+--------------|--------|--------|--------|\r
+              |        |Protocol|Protocol|\r
+DoD IP        |   X    |   12   |   22   |\r
+              |        | decimal| decimal|\r
+--------------|--------|--------|--------|\r
+              |        |        |        |\r
+PUP           |   ?    |   X    |   ?    |\r
+              |        |        |        |\r
+--------------|--------|--------|--------|\r
+              |  Type  |  Type  |        |\r
+NS IP         |   13   |   12   |   X    |\r
+              | decimal| decimal|        |\r
+--------------|--------|--------|--------|\r
+\r
+\r
+\r
+[]\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 192]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/ip-xns-mapping\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 193]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PRONET 80 TYPE NUMBERS\r
+\r
+\r
+Below is the current list of PRONET 80 Type Numbers.  Note: a protocol\r
+that is on this list does not necessarily mean that there is any\r
+implementation of it on ProNET.\r
+\r
+Of these, protocols 1, 14, and 20 are the only ones that have ever\r
+been seen in ARP packets.\r
+\r
+For reference, the header is (one byte/line):\r
+\r
+        destination hardware address\r
+        source hardware address\r
+        data link header version (2)\r
+        data link header protocol number\r
+        data link header reserved (0)\r
+        data link header reserved (0)\r
+\r
+Some protocols have been known to tuck stuff in the reserved fields.\r
+\r
+Those who need a protocol number on ProNET-10/80 should contact John\r
+Shriver (jas@proteon.com).\r
+\r
+\r
+1       IP\r
+2       IP with trailing headers\r
+3       Address Resolution Protocol\r
+4       Proteon HDLC\r
+5       VAX Debugging Protocol (MIT)\r
+10      Novell NetWare (IPX and pre-IPX) (old format,\r
+        3 byte trailer)\r
+11      Vianetix\r
+12      PUP\r
+13      Watstar protocol (University of Waterloo)\r
+14      XNS\r
+15      Diganostics\r
+16      Echo protocol (link level)\r
+17      Banyan Vines\r
+20      DECnet (DEUNA Emulation)\r
+21      Chaosnet\r
+23      IEEE 802.2 or ISO 8802/2 Data Link\r
+24      Reverse Address Resolution Protocol\r
+29      TokenVIEW-10\r
+31      AppleTalk LAP Data Packet\r
+33      Cornell Boot Server Location Protocol\r
+34      Novell NetWare IPX (new format, no trailer,\r
+        new XOR checksum)\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 194]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/pronet80-type-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 195]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+NOVELL SAP NUMBERS OF INTEREST\r
+\r
+For the convenience of the Internet community the IANA maitains a list\r
+of Novell Service Access Point (SAP) numbers.  This list is kept\r
+up-to-date- by contributions from the community.  Please send\r
+corrections and additions to IANA@ISI.EDU.\r
+\r
+Novell SAPs\r
+====== ====\r
+\r
+Decimal Hex     SAP Description\r
+======= ====    ===============\r
+\r
+0       0000    Unknown\r
+1       0001    User\r
+2       0002    User Group\r
+3       0003    Print Queue or Print Group\r
+4       0004    File Server (SLIST source)\r
+5       0005    Job Server\r
+6       0006    Gateway\r
+7       0007    Print Server or Silent Print Server\r
+8       0008    Archive Queue\r
+9       0009    Archive Server\r
+10      000a    Job Queue\r
+11      000b    Administration\r
+15      000F    Novell TI-RPC\r
+23      0017    Diagnostics\r
+32      0020    NetBIOS\r
+33      0021    NAS SNA Gateway\r
+35      0023    NACS Async Gateway or Asynchronous Gateway\r
+36      0024    Remote Bridge or Routing Service\r
+38      0026    Bridge Server or Asynchronous Bridge Server\r
+39      0027    TCP/IP Gateway Server\r
+40      0028    Point to Point (Eicon) X.25 Bridge Server\r
+41      0029    Eicon 3270 Gateway\r
+42      002a    CHI Corp ???\r
+44      002c    PC Chalkboard\r
+45      002d    Time Synchronization Server or Asynchronous Timer\r
+46      002e    SAP Archive Server or SMS Target Service Agent\r
+69      0045    DI3270 Gateway\r
+71      0047    Advertising Print Server\r
+75      004b    Btrieve VAP/NLM 5.0\r
+76      004c    Netware SQL VAP/NLM Server\r
+77      004d    Xtree Network Version Netware XTree\r
+80      0050    Btrieve VAP 4.11\r
+82      0052    QuickLink (Cubix)\r
+83      0053    Print Queue User\r
+88      0058    Multipoint X.25 Eicon Router\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 196]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+96      0060    STLB/NLM ???\r
+100     0064    ARCserve\r
+102     0066    ARCserve 3.0\r
+114     0072    WAN Copy Utility\r
+122     007a    TES-Netware for VMS\r
+146     0092    WATCOM Debugger or Emerald Tape Backup Server\r
+149     0095    DDA OBGYN ???\r
+152     0098    Netware Access Server (Asynchronous gateway)\r
+154     009a    Netware for VMS II or Named Pipe Server\r
+155     009b    Netware Access Server\r
+158     009e    Portable Netware Server or SunLink NVT\r
+161     00a1    Powerchute APC UPS NLM\r
+170     00aa    LAWserve ???\r
+172     00ac    Compaq IDA Status Monitor\r
+256     0100    PIPE STAIL ???\r
+258     0102    LAN Protect Bindery\r
+259     0103    Oracle DataBase Server\r
+263     0107    Netware 386 or RSPX Remote Console\r
+271     010f    Novell SNA Gateway\r
+274     0112    Print Server (HP)\r
+276     0114    CSA MUX (f/Communications Executive)\r
+277     0115    CSA LCA (f/Communications Executive)\r
+278     0116    CSA CM  (f/Communications Executive)\r
+279     0117    CSA SMA (f/Communications Executive)\r
+280     0118    CSA DBA (f/Communications Executive)\r
+281     0119    CSA NMA (f/Communications Executive)\r
+282     011a    CSA SSA (f/Communications Executive)\r
+283     011b    CSA STATUS (f/Communications Executive)\r
+286     011e    CSA APPC   (f/Communications Executive)\r
+294     0126    SNA TEST SSA Profile\r
+298     012a    CSA TRACE  (f/Communications Executive)\r
+304     0130    Communications Executive\r
+307     0133    NNS Domain Server or Netware Naming Services Domain\r
+309     0135    Netware Naming Services Profile\r
+311     0137    Netware 386 Print Queue or NNS Print Queue\r
+321     0141    LAN Spool Server (Vap, Intel)\r
+338     0152    IRMALAN Gateway\r
+340     0154    Named Pipe Server\r
+360     0168    Intel PICKIT Comm Server or Intel CAS Talk Server\r
+369     171     UNKNOWN???\r
+371     0173    Compaq\r
+372     0174    Compaq SNMP Agent\r
+373     0175    Compaq\r
+384     0180    XTree Server or XTree Tools\r
+394     18A     UNKNOWN???      Running on a Novell Server\r
+432     01b0    GARP Gateway (net research)\r
+433     01b1    Binfview (Lan Support Group)\r
+447     01bf    Intel LanDesk Manager\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 197]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+458     01ca    AXTEC ???\r
+459     01cb    Netmode ???\r
+460     1CC     UNKNOWN???      Sheva netmodem???\r
+472     01d8    Castelle FAXPress Server\r
+474     01da    Castelle LANPress Print Server\r
+476     1DC     Castille FAX/Xerox 7033 Fax Server/Excel Lan Fax\r
+496     01f0    LEGATO ???\r
+501     01f5    LEGATO ???\r
+563     0233    NMS Agent or Netware Management Agent\r
+567     0237    NMS IPX Discovery or LANtern Read/Write Channel\r
+568     0238    NMS IP Discovery or LANtern Trap/Alarm Channel\r
+570     023a    LABtern\r
+572     023c    MAVERICK ???\r
+574     23E     UNKNOWN???      Running on a Novell Server\r
+575     023f    Used by eleven various Novell Servers\r
+590     024e    Remote Something ???\r
+618     026a    Network Management (NMS) Service Console\r
+619     026b    Time Synchronization Server (Netware 4.x)\r
+632     0278    Directory Server (Netware 4.x)\r
+772     0304    Novell SAA Gateway\r
+776     0308    COM or VERMED 1 ???\r
+778     030a    Gallacticom BBS\r
+780     030c    Intel Netport 2 or HP JetDirect or HP Quicksilver\r
+800     0320    Attachmate Gateway\r
+807     0327    Microsoft Diagnostiocs ???\r
+821     0335    MultiTech Systems Multisynch Comm Server\r
+853     0355    Arcada Backup Exec\r
+858     0358    MSLCD1 ???\r
+865     0361    NETINELO ???\r
+894     037e    Twelve Novell file servers in the PC3M family\r
+895     037f    ViruSafe Notify\r
+902     0386    HP Bridge\r
+903     0387    HP Hub\r
+916     0394    NetWare SAA Gateway\r
+923     039b    Lotus Notes\r
+951     03b7    Certus Anti Virus NLM\r
+964     03c4    ARCserve 4.0 (Cheyenne)\r
+967     03c7    LANspool 3.5 (Intel)\r
+990     03de    Gupta Sequel Base Server or NetWare SQL\r
+993     03e1    Univel Unixware\r
+996     03e4    Univel Unixware\r
+1020    03fc    Intel Netport\r
+1021    03fd    Print SErver Queue ???\r
+1034    40A     ipnServer???      Running on a Novell Server\r
+1035    40B     UNKNOWN???\r
+1037    40D     LVERRMAN???     Running on a Novell Server\r
+1038    40E     LVLIC???        Running on a Novell Server\r
+1040    410     UNKNOWN???      Running on a Novell Server\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 198]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+1044    0414    Kyocera\r
+1065    0429    Site Lock Virus (Brightworks)\r
+1074    0432    UFHELP R ???\r
+1075    433     Sunoptics SNMP Agent???\r
+1100    044c    Backup ???\r
+1111    457     Canon GP55???   Running on a Canon GP55 network printer\r
+1115    045b    Dell SCSI Array (DSA) Monitor\r
+1200    04b0    CD-Net (Meridian)\r
+1217    4C1     UNKNOWN???\r
+1299    513     Emulux NQA???   Something from Emulex\r
+1312    0520    Site Lock Checks\r
+1321    0529    Site Lock Checks (Brightworks)\r
+1325    052d    Citrix OS/2 App Server\r
+1344    536     Milan ???\r
+1408    0580    McAfee's NetShield anti-virus\r
+1569    621     ??              Something from Emulex\r
+1571    623     UNKNOWN???      Running on a Novell Server\r
+1900    076C    Xerox\r
+2857    0b29    Site Lock\r
+3113    0c29    Site Lock Applications\r
+3116    0c2c    Licensing Server\r
+9088    2380    LAI Site Lock\r
+9100    238c    Meeting Maker\r
+18440   4808    Site Lock Server or Site Lock Metering VAP/NLM\r
+21845   5555    Site Lock User\r
+25362   6312    Tapeware\r
+28416   6f00    Rabbit Gateway (3270)\r
+30467   7703    MODEM??\r
+32770   8002    NetPort Printers (Intel) or LANport\r
+32776   8008    WordPerfect Network Version\r
+34238   85BE    Cisco Enhanced Interior Routing Protocol (EIGRP)\r
+34952   8888    WordPerfect Network Version or Quick Network Management\r
+36864   9000    McAfee's NetShield anti-virus\r
+38404   9604    ??              CSA-NT_MON\r
+61727   f11f    Site Lock Metering VAP/NLM\r
+61951   f1ff    Site Lock\r
+62723   F503    ??              SCA-NT\r
+65535   ffff    Any Service or Wildcard\r
+\r
+This file is\r
+\r
+        ftp://ftp.isi.edu/in-notes/iana/assignments/novell-sap-numbers\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/novell-sap-numbers\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 199]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+POINT-TO-POINT PROTOCOL FIELD ASSIGNMENTS\r
+\r
+PPP DLL PROTOCOL NUMBERS\r
+\r
+The Point-to-Point Protocol (PPP) Data Link Layer [146,147,175]\r
+contains a 16 bit Protocol field to identify the the encapsulated\r
+protocol.  The Protocol field is consistent with the ISO 3309 (HDLC)\r
+extension mechanism for Address fields.  All Protocols MUST be\r
+assigned such that the least significant bit of the most significant\r
+octet equals "0", and the least significant bit of the least\r
+significant octet equals "1".\r
+\r
+Assigned PPP DLL Protocol Numbers\r
+\r
+Value (in hex)  Protocol Name\r
+\r
+0001            Padding Protocol\r
+0003 to 001f    reserved (transparency inefficient)\r
+0021            Internet Protocol\r
+0023            OSI Network Layer\r
+0025            Xerox NS IDP\r
+0027            DECnet Phase IV\r
+0029            Appletalk\r
+002b            Novell IPX\r
+002d            Van Jacobson Compressed TCP/IP\r
+002f            Van Jacobson Uncompressed TCP/IP\r
+0031            Bridging PDU\r
+0033            Stream Protocol (ST-II)\r
+0035            Banyan Vines\r
+0037            reserved (until 1993)\r
+0039            AppleTalk EDDP\r
+003b            AppleTalk SmartBuffered\r
+003d            Multi-Link\r
+003f            NETBIOS Framing\r
+0041            Cisco Systems\r
+0043            Ascom Timeplex\r
+0045            Fujitsu Link Backup and Load Balancing (LBLB)\r
+0047            DCA Remote Lan\r
+0049            Serial Data Transport Protocol (PPP-SDTP)\r
+004b            SNA over 802.2\r
+004d            SNA\r
+004f            IP6 Header Compression\r
+006f            Stampede Bridging\r
+007d            reserved (Control Escape)             [RFC1661]\r
+007f            reserved (compression inefficient)    [RFC1662]\r
+00cf            reserved (PPP NLPID)\r
+00fb            compression on single link in multilink group\r
+00fd            1st choice compression\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 200]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+00ff            reserved (compression inefficient)\r
+\r
+0201            802.1d Hello Packets\r
+0203            IBM Source Routing BPDU\r
+0205            DEC LANBridge100 Spanning Tree\r
+0231            Luxcom\r
+0233            Sigma Network Systems\r
+\r
+8001-801f       Not Used - reserved                   [RFC1661]\r
+8021            Internet Protocol Control Protocol\r
+8023            OSI Network Layer Control Protocol\r
+8025            Xerox NS IDP Control Protocol\r
+8027            DECnet Phase IV Control Protocol\r
+8029            Appletalk Control Protocol\r
+802b            Novell IPX Control Protocol\r
+802d            reserved\r
+802f            reserved\r
+8031            Bridging NCP\r
+8033            Stream Protocol Control Protocol\r
+8035            Banyan Vines Control Protocol\r
+8037            reserved till 1993\r
+8039            reserved\r
+803b            reserved\r
+803d            Multi-Link Control Protocol\r
+803f            NETBIOS Framing Control Protocol\r
+807d            Not Used - reserved                   [RFC1661]\r
+8041            Cisco Systems Control Protocol\r
+8043            Ascom Timeplex\r
+8045            Fujitsu LBLB Control Protocol\r
+8047            DCA Remote Lan Network Control Protocol (RLNCP)\r
+8049            Serial Data Control Protocol (PPP-SDCP)\r
+804b            SNA over 802.2 Control Protocol\r
+804d            SNA Control Protocol\r
+804f            IP6 Header Compression Control Protocol\r
+006f            Stampede Bridging Control Protocol\r
+80cf            Not Used - reserved                   [RFC1661]\r
+80fb            compression on single link in multilink group control\r
+80fd            Compression Control Protocol\r
+80ff            Not Used - reserved                   [RFC1661]\r
+\r
+c021            Link Control Protocol\r
+c023            Password Authentication Protocol\r
+c025            Link Quality Report\r
+c027            Shiva Password Authentication Protocol\r
+c029            CallBack Control Protocol (CBCP)\r
+c081            Container Control Protocol                  [KEN]\r
+c223            Challenge Handshake Authentication Protocol\r
+c281            Proprietary Authentication Protocol         [KEN]\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 201]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+c26f            Stampede Bridging Authorization Protocol\r
+c481            Proprietary Node ID Authentication Protocol [KEN]\r
+\r
+Protocol field values in the "0xxx" to "3xxx" range identify the\r
+network-layer protocol of specific datagrams, and values in the "8xxx"\r
+to "bxxx" range identify datagrams belonging to the associated Network\r
+Control Protocol (NCP), if any.\r
+\r
+It is recommended that values in the "02xx" to "1exx" and "xx01" to\r
+"xx1f" ranges not be assigned, as they are compression inefficient.\r
+\r
+Protocol field values in the "4xxx" to "7xxx" range are used for\r
+protocols with low volume traffic which have no associated NCP.\r
+\r
+Protocol field values in the "cxxx" to "exxx" range identify datagrams\r
+as Control Protocols (such as LCP).\r
+\r
+PPP LCP AND IPCP CODES\r
+\r
+The Point-to-Point Protocol (PPP) Link Control Protocol (LCP), [146]\r
+the Compression Control Protocol (CCP), Internet Protocol Control\r
+Protocol (IPCP), [147] and other control protocols, contain an 8 bit\r
+Code field which identifies the type of packet.  These Codes are\r
+assigned as follows:\r
+\r
+Code       Packet Type\r
+----       -----------\r
+   1       Configure-Request\r
+   2       Configure-Ack\r
+   3       Configure-Nak\r
+   4       Configure-Reject\r
+   5       Terminate-Request\r
+   6       Terminate-Ack\r
+   7       Code-Reject\r
+   8     * Protocol-Reject\r
+   9     * Echo-Request\r
+  10     * Echo-Reply\r
+  11     * Discard-Request\r
+  12     * Identification\r
+  13     * Time-Remaining\r
+  14     + Reset-Request\r
+  15     + Reset-Reply\r
+\r
+* LCP Only\r
++ CCP Only\r
+\r
+PPP LCP CONFIGURATION OPTION TYPES\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 202]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+The Point-to-Point Protocol (PPP) Link Control Protocol (LCP)\r
+specifies a number of Configuration Options [146] which are\r
+distinguished by an 8 bit Type field.  These Types are assigned as\r
+follows:\r
+\r
+Type       Configuration Option\r
+----       --------------------\r
+   1       Maximum-Receive-Unit\r
+   2       Async-Control-Character-Map\r
+   3       Authentication-Protocol\r
+   4       Quality-Protocol\r
+   5       Magic-Number\r
+   6       RESERVED\r
+   7       Protocol-Field-Compression\r
+   8       Address-and-Control-Field-Compression\r
+   9       FCS-Alternatives\r
+  10       Self-Describing-Pad\r
+  11       Numbered-Mode\r
+  12       Multi-Link-Procedure\r
+  13       Callback\r
+  14       Connect-Time\r
+  15       Compound-Frames\r
+  16       Nominal-Data-Encapsulation\r
+  17       Multilink-MRRU\r
+  18       Multilink-Short-Sequence-Number-Header-Format\r
+  19       Multilink-Endpoint-Discriminator\r
+  20       Proprietary                                     [KEN]\r
+  21       DCE-Identifier                            [SCHNEIDER]\r
+\r
+PPP LCP FCS-ALTERNATIVES\r
+\r
+The Point-to-Point Protocol (PPP) Link Control Protocol (LCP)\r
+FCS-Alternatives Configuration Option contains an 8-bit Options field\r
+which identifies the FCS used.  These are assigned as follows:\r
+\r
+Bit     FCS\r
+----    ----------\r
+  1     Null FCS\r
+  2     CCITT 16-Bit FCS\r
+  4     CCITT 32-bit FCS\r
+\r
+\r
+PPP LCP CALLBACK OPERATION FIELDS\r
+\r
+The Point-to-Point Protocol (PPP) Link Control Protocol (LCP) Callback\r
+Configuration Option contains an 8-bit Operations field which\r
+identifies the format of the Message.  These are assigned as follows:\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 203]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Operation   Description\r
+---------   ---------------------------\r
+        0   Location determined by user authentication.\r
+        1   Dialing string.\r
+        2   Location identifier.\r
+        3   E.164 number.\r
+        4   X.500 distinguished name.\r
+        5   unassigned\r
+        6   Location is determined during CBCP negotiation.\r
+\r
+PPP IPCP CONFIGURATION OPTION TYPES\r
+\r
+The Point-to-Point Protocol (PPP) Internet Protocol Control Protocol\r
+(IPCP) specifies a number of Configuration Options [147] which are\r
+distinguished by an 8 bit Type field.  These Types are assigned as\r
+follows:\r
+\r
+Type       Configuration Option\r
+----       --------------------\r
+   1       IP-Addresses (deprecated)\r
+   2       IP-Compression-Protocol\r
+   3       IP-Address\r
+\r
+PPP ATCP CONFIGURATION OPTION TYPES\r
+\r
+The Point-to-Point Protocol (PPP) Apple Talk Control Protocol (ATCP)\r
+specifies a number of Configuration Options [RFC-1378] which are\r
+distinguished by an 8 bit Type field.  These Types are assigned as\r
+follows:\r
+\r
+Type       Configuration Option\r
+----       --------------------\r
+   1       AppleTalk-Address\r
+   2       Routing-Protocol\r
+   3       Suppress-Broadcasts\r
+   4       AT-Compression-Protocol\r
+   5       Reserved\r
+   6       Server-information\r
+   7       Zone-information\r
+   8       Default-Router-Address\r
+\r
+PPP OSINLCP CONFIGURATION OPTION TYPES\r
+\r
+The Point-to-Point Protocol (PPP) OSI Network Layer Control Protocol\r
+(OSINLCP) specifies a number of Configuration Options [RFC-1377] which\r
+are distinguished by an 8 bit Type field.  These Types are assigned as\r
+follows:\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 204]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Type       Configuration Option\r
+----       --------------------\r
+   1       Align-NPDU\r
+\r
+PPP BRIDGING CONFIGURATION OPTION TYPES\r
+\r
+The Point-to-Point Protocol (PPP) Bridging Control Protocol (BCP)\r
+specifies a number of Configuration Options which are distinguished by\r
+an 8 bit Type field.  These Types are assigned as follows:\r
+\r
+Type       Configuration Option\r
+----       --------------------\r
+   1       Bridge-Identification\r
+   2       Line-Identification\r
+   3       MAC-Support\r
+   4       Tinygram-Compression\r
+   5       LAN-Identification\r
+   6       MAC-Address\r
+   7       Spanning-Tree-Protocol\r
+\r
+PPP BRIDGING MAC TYPES\r
+\r
+The Point-to-Point Protocol (PPP) Bridging Control Protocol (BCP)\r
+contains an 8 bit MAC Type field which identifies the MAC\r
+encapsulated.  These Types are assigned as follows:\r
+\r
+Type       MAC\r
+----       -----------\r
+   0       Reserved\r
+   1       IEEE 802.3/Ethernet   with cannonical addresses\r
+   2       IEEE 802.4            with cannonical addresses\r
+   3       IEEE 802.5            with non-cannonical addresses\r
+   4       FDDI                  with non-cannonical addresses\r
+ 5-10      reserved\r
+  11       IEEE 802.5            with cannonical addresses\r
+  12       FDDI                  with cannonical addresses\r
+\r
+PPP BRIDGING SPANNING TREE\r
+\r
+The Point-to-Point Protocol (PPP) Bridging Control Protocol (BCP)\r
+Spanning Tree Configuration Option contains an 8-bit Protocol field\r
+which identifies the spanning tree used.  These are assigned as\r
+follows:\r
+\r
+Protocol  Spanning Tree\r
+--------  ---------------\r
+   0      Null - no spanning tree protocol supported\r
+   1      IEEE 802.1D spanning tree protocol\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 205]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+   2      IEEE 802.1G extended spanning tree protocol\r
+   3      IBM source route spanning tree protocol\r
+   4      DEC LANbridge 100 spanning tree protocol\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC1661] Simpson, W., Editor, "The Point-to-Point Protocol (PPP)",\r
+          STD 51, RFC 1661, Daydreamer, July 1994.\r
+\r
+[RFC1662] Simpson, W., Editor, "PPP in HDLC-like Framing", STD 51, RFC\r
+          1662, Daydreamer, July 1994.\r
+\r
+\r
+PEOPLE\r
+\r
+[KEN]  <ken@funk.com>\r
+\r
+[SCHNEIDER] Kevin Schneider <kevin@adtran.com>\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/ppp-numbers\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 206]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+MACHINE NAMES\r
+\r
+\r
+These are the Official Machine Names as they appear in the Domain Name\r
+System HINFO records and the NIC Host Table.  Their use is described\r
+in [RFC952].\r
+\r
+A machine name or CPU type may be up to 40 characters taken from the\r
+set of uppercase letters, digits, and the two punctuation characters\r
+hyphen and slash.  It must start with a letter, and end with a letter\r
+or digit.\r
+\r
+AMIGA-500\r
+AMIGA-500/010\r
+AMIGA-500/020\r
+AMIGA-500/EC030\r
+AMIGA-500/030\r
+AMIGA-600\r
+AMIGA-1000\r
+AMIGA-1000/010\r
+AMIGA-1000/020\r
+AMIGA-1000/EC030\r
+AMIGA-1000/030\r
+AMIGA-1200\r
+AMIGA-1200/EC030\r
+AMIGA-1200/030\r
+AMIGA-1200/EC040\r
+AMIGA-1200/LC040\r
+AMIGA-1200/040\r
+AMIGA-2000\r
+AMIGA-2000/010\r
+AMIGA-2000/020\r
+AMIGA-2000/EC030\r
+AMIGA-2000/030\r
+AMIGA-2000/LC040\r
+AMIGA-2000/EC040\r
+AMIGA-2000/040\r
+AMIGA-3000\r
+AMIGA-3000/EC040\r
+AMIGA-3000/LC040\r
+AMIGA-3000/040\r
+AMIGA-3000/060\r
+AMIGA-4000/EC030\r
+AMIGA-4000/030\r
+AMIGA-4000/LC040\r
+AMIGA-4000/040\r
+AMIGA-4000/060\r
+ALTO\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 207]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+ALTOS-6800\r
+AMDAHL-V7\r
+APOLLO\r
+APPLE-MACINTOSH\r
+APPLE-POWERBOOK\r
+ATARI-104ST\r
+ATT-3B1\r
+ATT-3B2\r
+ATT-3B20\r
+ATT-7300\r
+AXP\r
+BBN-C/60\r
+BURROUGHS-B/29\r
+BURROUGHS-B/4800\r
+BUTTERFLY\r
+C/30\r
+C/70\r
+CADLINC\r
+CADR\r
+CDC-170\r
+CDC-170/750\r
+CDC-173\r
+CDTV\r
+CDTV/060\r
+CD32\r
+CELERITY-1200\r
+CLUB-386\r
+COMPAQ-386/20\r
+COMTEN-3690\r
+CP8040\r
+CRAY-1\r
+CRAY-X/MP\r
+CRAY-2\r
+CTIWS-117\r
+DANDELION\r
+DEC-10\r
+DEC-1050\r
+DEC-1077\r
+DEC-1080\r
+DEC-1090\r
+DEC-1090B\r
+DEC-1090T\r
+DEC-2020T\r
+DEC-2040\r
+DEC-2040T\r
+DEC-2050T\r
+DEC-2060\r
+DEC-2060T\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 208]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+DEC-2065\r
+DEC-AXP\r
+DEC-FALCON\r
+DEC-KS10\r
+DECSTATION\r
+DEC-VAX\r
+DEC-VAXCLUSTER\r
+DEC-VAXSTATION\r
+DEC-VAX-11730\r
+DORADO\r
+DPS8/70M\r
+ELXSI-6400\r
+EVEREX-386\r
+FOONLY-F2\r
+FOONLY-F3\r
+FOONLY-F4\r
+GOULD\r
+GOULD-6050\r
+GOULD-6080\r
+GOULD-9050\r
+GOULD-9080\r
+H-316\r
+H-60/68\r
+H-68\r
+H-68/80\r
+H-89\r
+HONEYWELL-DPS-6\r
+HONEYWELL-DPS-8/70\r
+HP3000\r
+HP3000/64\r
+IBM-158\r
+IBM-360/67\r
+IBM-370/3033\r
+IBM-3081\r
+IBM-3084QX\r
+IBM-3101\r
+IBM-4331\r
+IBM-4341\r
+IBM-4361\r
+IBM-4381\r
+IBM-4956\r
+IBM-6152\r
+IBM-PC\r
+IBM-PC/AT\r
+IBM-PC/RT\r
+IBM-PC/XT\r
+IBM-RS/6000\r
+IBM-SERIES/1\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 209]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+IMAGEN\r
+IMAGEN-8/300\r
+IMSAI\r
+INTEGRATED-SOLUTIONS\r
+INTEGRATED-SOLUTIONS-68K\r
+INTEGRATED-SOLUTIONS-CREATOR\r
+INTEGRATED-SOLUTIONS-CREATOR-8\r
+INTEL-386\r
+INTEL-IPSC\r
+IS-1\r
+IS-68010\r
+LMI\r
+LSI-11\r
+LSI-11/2\r
+LSI-11/23\r
+LSI-11/73\r
+M68000\r
+MAC-II\r
+MAC-POWERBOOK\r
+MACINTOSH\r
+MASSCOMP\r
+MC500\r
+MC68000\r
+MICROPORT\r
+MICROVAX\r
+MICROVAX-I\r
+MV/8000\r
+NAS3-5\r
+NCR-COMTEN-3690\r
+NEXT/N1000-316\r
+NOW\r
+ONYX-Z8000\r
+PDP-11\r
+PDP-11/3\r
+PDP-11/23\r
+PDP-11/24\r
+PDP-11/34\r
+PDP-11/40\r
+PDP-11/44\r
+PDP-11/45\r
+PDP-11/50\r
+PDP-11/70\r
+PDP-11/73\r
+PE-7/32\r
+PE-3205\r
+PERQ\r
+PLEXUS-P/60\r
+PLI\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 210]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PLURIBUS\r
+PRIME-2350\r
+PRIME-2450\r
+PRIME-2755\r
+PRIME-9655\r
+PRIME-9755\r
+PRIME-9955II\r
+PRIME-2250\r
+PRIME-2655\r
+PRIME-9955\r
+PRIME-9950\r
+PRIME-9650\r
+PRIME-9750\r
+PRIME-2250\r
+PRIME-750\r
+PRIME-850\r
+PRIME-550II\r
+PYRAMID-90\r
+PYRAMID-90MX\r
+PYRAMID-90X\r
+RIDGE\r
+RIDGE-32\r
+RIDGE-32C\r
+ROLM-1666\r
+RS/6000\r
+S1-MKIIA\r
+SMI\r
+SEQUENT-BALANCE-8000\r
+SIEMENS\r
+SILICON-GRAPHICS\r
+SILICON-GRAPHICS-IRIS\r
+SGI-IRIS-2400\r
+SGI-IRIS-2500\r
+SGI-IRIS-3010\r
+SGI-IRIS-3020\r
+SGI-IRIS-3030\r
+SGI-IRIS-3110\r
+SGI-IRIS-3115\r
+SGI-IRIS-3120\r
+SGI-IRIS-3130\r
+SGI-IRIS-4D/20\r
+SGI-IRIS-4D/20G\r
+SGI-IRIS-4D/25\r
+SGI-IRIS-4D/25G\r
+SGI-IRIS-4D/25S\r
+SGI-IRIS-4D/50\r
+SGI-IRIS-4D/50G\r
+SGI-IRIS-4D/50GT\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 211]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+SGI-IRIS-4D/60\r
+SGI-IRIS-4D/60G\r
+SGI-IRIS-4D/60T\r
+SGI-IRIS-4D/60GT\r
+SGI-IRIS-4D/70\r
+SGI-IRIS-4D/70G\r
+SGI-IRIS-4D/70GT\r
+SGI-IRIS-4D/80GT\r
+SGI-IRIS-4D/80S\r
+SGI-IRIS-4D/120GTX\r
+SGI-IRIS-4D/120S\r
+SGI-IRIS-4D/210GTX\r
+SGI-IRIS-4D/210S\r
+SGI-IRIS-4D/220GTX\r
+SGI-IRIS-4D/220S\r
+SGI-IRIS-4D/240GTX\r
+SGI-IRIS-4D/240S\r
+SGI-IRIS-4D/280GTX\r
+SGI-IRIS-4D/280S\r
+SGI-IRIS-CS/12\r
+SGI-IRIS-4SERVER-8\r
+SPERRY-DCP/10\r
+SUN\r
+SUN-2\r
+SUN-2/50\r
+SUN-2/100\r
+SUN-2/120\r
+SUN-2/130\r
+SUN-2/140\r
+SUN-2/150\r
+SUN-2/160\r
+SUN-2/170\r
+SUN-3/50\r
+SUN-3/60\r
+SUN-3/75\r
+SUN-3/80\r
+SUN-3/110\r
+SUN-3/140\r
+SUN-3/150\r
+SUN-3/160\r
+SUN-3/180\r
+SUN-3/200\r
+SUN-3/260\r
+SUN-3/280\r
+SUN-3/470\r
+SUN-3/480\r
+SUN-4/60\r
+SUN-4/110\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 212]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+SUN-4/150\r
+SUN-4/200\r
+SUN-4/260\r
+SUN-4/280\r
+SUN-4/330\r
+SUN-4/370\r
+SUN-4/390\r
+SUN-50\r
+SUN-100\r
+SUN-120\r
+SUN-130\r
+SUN-150\r
+SUN-170\r
+SUN-386i/250\r
+SUN-68000\r
+SYMBOLICS-3600\r
+SYMBOLICS-3670\r
+SYMMETRIC-375\r
+SYMULT\r
+TANDEM-TXP\r
+TANDY-6000\r
+TEK-6130\r
+TI-EXPLORER\r
+TP-4000\r
+TRS-80\r
+UNIVAC-1100\r
+UNIVAC-1100/60\r
+UNIVAC-1100/62\r
+UNIVAC-1100/63\r
+UNIVAC-1100/64\r
+UNIVAC-1100/70\r
+UNIVAC-1160\r
+UNKNOWN\r
+VAX\r
+VAX-11/725\r
+VAX-11/730\r
+VAX-11/750\r
+VAX-11/780\r
+VAX-11/785\r
+VAX-11/790\r
+VAX-11/8600\r
+VAX-8600\r
+VAXCLUSTER\r
+VAXSTATION\r
+WANG-PC002\r
+WANG-VS100\r
+WANG-VS400\r
+WYSE-386\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 213]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+WYSE-WN5004\r
+WYSE-WN5008\r
+WYSE-WN5104\r
+WYSE-WN5108\r
+WYSE-WX15C\r
+WYSE-WX17C\r
+WYSE-WX17M\r
+WYSE-WX19C\r
+WYSE-WX19M\r
+WYSE-WYX14M\r
+WYSE-WYX5\r
+XEROX-1108\r
+XEROX-8010\r
+ZENITH-148\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC952] Harrenstien, K., Stahl, M., and E. Feinler, "DoD Internet\r
+         Host Table Specification", RFC 952, SRI, October 1985.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/machine-names\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 214]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+OPERATING SYSTEM NAMES\r
+\r
+\r
+These are the Official System Names as they appear in the Domain Name\r
+System HINFO records and the NIC Host Table.  Their use is described in\r
+[RFC952].\r
+\r
+A system name may be up to 40 characters taken from the set of\r
+uppercase letters, digits, and the three punctuation characters\r
+hyphen, period, and slash.  It must start with a letter, and end with\r
+a letter or digit.\r
+\r
+\r
+AEGIS\r
+AMIGA-OS-1.2\r
+AMIGA-OS-1.3\r
+AMIGA-OS-2.0\r
+AMIGA-OS-2.1\r
+AMIGA-OS-3.0\r
+AMIGA-OS-3.1\r
+APOLLO\r
+AIX/370\r
+AIX-PS/2\r
+BS-2000\r
+CEDAR\r
+CGW\r
+CHORUS\r
+CHRYSALIS\r
+CMOS\r
+CMS\r
+COS\r
+CPIX\r
+CTOS\r
+CTSS\r
+DCN\r
+DDNOS\r
+DOMAIN\r
+DOS\r
+EDX\r
+ELF\r
+EMBOS\r
+EMMOS\r
+EPOS\r
+FOONEX\r
+FORTH\r
+FUZZ\r
+GCOS\r
+GPOS\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 215]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+HDOS\r
+IMAGEN\r
+INTERCOM\r
+IMPRESS\r
+INTERLISP\r
+IOS\r
+IRIX\r
+ISI-68020\r
+ITS\r
+LISP\r
+LISPM\r
+LOCUS\r
+MACOS\r
+MINOS\r
+MOS\r
+MPE5\r
+MPE/V\r
+MPE/IX\r
+MSDOS\r
+MULTICS\r
+MUSIC\r
+MUSIC/SP\r
+MVS\r
+MVS/SP\r
+NEXUS\r
+NMS\r
+NONSTOP\r
+NOS-2\r
+NTOS\r
+OPENVMS\r
+OS/DDP\r
+OS/2\r
+OS4\r
+OS86\r
+OSX\r
+PCDOS\r
+PERQ/OS\r
+PLI\r
+PSDOS/MIT\r
+PRIMOS\r
+RMX/RDOS\r
+ROS\r
+RSX11M\r
+RTE-A\r
+SATOPS\r
+SCO-OPEN-DESKTOP-1.0\r
+SCO-OPEN-DESKTOP-1.1\r
+SCO-OPEN-DESKTOP-2.0\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 216]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+SCO-OPEN-DESKTOP-3.0\r
+SCO-OPEN-DESKTOP-LITE-3.0\r
+SCO-OPEN-SERVER-3.0\r
+SCO-UNIX-3.2.0\r
+SCO-UNIX-3.2V2.0\r
+SCO-UNIX-3.2V2.1\r
+SCO-UNIX-3.2V4.0\r
+SCO-UNIX-3.2V4.1\r
+SCO-UNIX-3.2V4.2\r
+SCO-XENIX-386-2.3.2\r
+SCO-XENIX-386-2.3.3\r
+SCO-XENIX-386-2.3.4\r
+SCS\r
+SIMP\r
+SUN\r
+SUN-OS-3.5\r
+SUN-OS-4.0\r
+SWIFT\r
+TAC\r
+TANDEM\r
+TENEX\r
+THE-MAJOR-BBS\r
+TOPS10\r
+TOPS20\r
+TOS\r
+TP3010\r
+TRSDOS\r
+ULTRIX\r
+UNIX\r
+UNIX-BSD\r
+UNIX-V1AT\r
+UNIX-V\r
+UNIX-V.1\r
+UNIX-V.2\r
+UNIX-V.3\r
+UNIX-PC\r
+UNKNOWN\r
+UT2D\r
+V\r
+VM\r
+VM/370\r
+VM/CMS\r
+VM/SP\r
+VMS\r
+VMS/EUNICE\r
+VRTX\r
+WAITS\r
+WANG\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 217]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+WIN32\r
+WYSE-WYXWARE\r
+X11R3\r
+XDE\r
+XENIX\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC952] Harrenstien, K., Stahl, M., and E. Feinler, "DoD Internet\r
+         Host Table Specification", RFC 952, SRI, October 1985.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/operating-system-names\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 218]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+TERMINAL TYPE NAMES\r
+\r
+\r
+These are the Official Terminal Type Names.  Their use is described in\r
+[RFC930].  The maximum length of a name is 40 characters.\r
+\r
+A terminal names may be up to 40 characters taken from the set of\r
+uppercase letters, digits, and the two punctuation characters hyphen\r
+and slash.  It must start with a letter, and end with a letter or\r
+digit.\r
+\r
+\r
+ADDS-CONSUL-980\r
+ADDS-REGENT-100\r
+ADDS-REGENT-20\r
+ADDS-REGENT-200\r
+ADDS-REGENT-25\r
+ADDS-REGENT-40\r
+ADDS-REGENT-60\r
+ADDS-VIEWPOINT\r
+ADDS-VIEWPOINT-60\r
+AED-512\r
+AMPEX-DIALOGUE-210\r
+AMPEX-DIALOGUE-80\r
+AMPEX-210\r
+AMPEX-230\r
+ANDERSON-JACOBSON-510\r
+ANDERSON-JACOBSON-630\r
+ANDERSON-JACOBSON-832\r
+ANDERSON-JACOBSON-841\r
+ANN-ARBOR-AMBASSADOR\r
+ANSI\r
+ARDS\r
+BITGRAPH\r
+BUSSIPLEXER\r
+CALCOMP-565\r
+CDC-456\r
+CDI-1030\r
+CDI-1203\r
+C-ITOH-101\r
+C-ITOH-50\r
+C-ITOH-80\r
+CLNZ\r
+COMPUCOLOR-II\r
+CONCEPT-100\r
+CONCEPT-104\r
+CONCEPT-108\r
+DATA-100\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 219]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+DATA-GENERAL-6053\r
+DATAGRAPHIX-132A\r
+DATAMEDIA-1520\r
+DATAMEDIA-1521\r
+DATAMEDIA-2500\r
+DATAMEDIA-3025\r
+DATAMEDIA-3025A\r
+DATAMEDIA-3045\r
+DATAMEDIA-3045A\r
+DATAMEDIA-DT80/1\r
+DATAPOINT-2200\r
+DATAPOINT-3000\r
+DATAPOINT-3300\r
+DATAPOINT-3360\r
+DEC-DECWRITER-I\r
+DEC-DECWRITER-II\r
+DEC-GIGI\r
+DEC-GT40\r
+DEC-GT40A\r
+DEC-GT42\r
+DEC-LA120\r
+DEC-LA30\r
+DEC-LA36\r
+DEC-LA38\r
+DEC-VT05\r
+DEC-VT100\r
+DEC-VT101\r
+DEC-VT102\r
+DEC-VT125\r
+DEC-VT131\r
+DEC-VT132\r
+DEC-VT200\r
+DEC-VT220\r
+DEC-VT240\r
+DEC-VT241\r
+DEC-VT300\r
+DEC-VT320\r
+DEC-VT340\r
+DEC-VT50\r
+DEC-VT50H\r
+DEC-VT52\r
+DEC-VT55\r
+DEC-VT61\r
+DEC-VT62\r
+DELTA-DATA-5000\r
+DELTA-DATA-NIH-7000\r
+DELTA-TELTERM-2\r
+DIABLO-1620\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 220]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+DIABLO-1640\r
+DIGILOG-333\r
+DTC-300S\r
+DTC-382\r
+EDT-1200\r
+ETOS52-APL\r
+ETOS52-CRT\r
+ETOS52-FDW\r
+ETOS52-FUP\r
+ETOS52-GFM\r
+ETOS52-SPR\r
+EXECUPORT-4000\r
+EXECUPORT-4080\r
+FACIT-TWIST-4440\r
+FREEDOM-100\r
+FREEDOM-110\r
+FREEDOM-200\r
+GENERAL-TERMINAL-100A\r
+GENERAL-TERMINAL-101\r
+GIPSI-TX-M\r
+GIPSI-TX-ME\r
+GIPSI-TX-C4\r
+GIPSI-TX-C8\r
+GSI\r
+HAZELTINE-1420\r
+HAZELTINE-1500\r
+HAZELTINE-1510\r
+HAZELTINE-1520\r
+HAZELTINE-1552\r
+HAZELTINE-2000\r
+HAZELTINE-ESPRIT\r
+HITACHI-5601\r
+HITACHI-5603\r
+HITACHI-5603E\r
+HITACHI-5603EA\r
+HITACHI-560X\r
+HITACHI-560XE\r
+HITACHI-560XEA\r
+HITACHI-560PR\r
+HITACHI-HOAP1\r
+HITACHI-HOAP2\r
+HITACHI-HOAP3\r
+HITACHI-HOAP4\r
+HP-2392\r
+HP-2621\r
+HP-2621A\r
+HP-2621P\r
+HP-2623\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 221]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+HP-2626\r
+HP-2626A\r
+HP-2626P\r
+HP-2627\r
+HP-2640\r
+HP-2640A\r
+HP-2640B\r
+HP-2645\r
+HP-2645A\r
+HP-2648\r
+HP-2648A\r
+HP-2649\r
+HP-2649A\r
+IBM-1050\r
+IBM-2741\r
+IBM-3101\r
+IBM-3101-10\r
+IBM-3151\r
+IBM-3179-2\r
+IBM-3180-2\r
+IBM-3196-A1\r
+IBM-3275-2\r
+IBM-3276-2\r
+IBM-3276-3\r
+IBM-3276-4\r
+IBM-3277-2\r
+IBM-3278-2\r
+IBM-3278-3\r
+IBM-3278-4\r
+IBM-3278-5\r
+IBM-3279-2\r
+IBM-3279-3\r
+IBM-3477-FC\r
+IBM-3477-FG\r
+IBM-5081\r
+IBM-5151\r
+IBM-5154\r
+IBM-5251-11\r
+IBM-5291-1\r
+IBM-5292-2\r
+IBM-5555-B01\r
+IBM-5555-C01\r
+IBM-6153\r
+IBM-6154\r
+IBM-6155\r
+IBM-AED\r
+IBM-3278-2-E\r
+IBM-3278-3-E\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 222]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+IBM-3278-4-E\r
+IBM-3278-5-E\r
+IBM-3279-2-E\r
+IBM-3279-3-E\r
+IMLAC\r
+INFOTON-100\r
+INFOTON-400\r
+INFOTONKAS\r
+ISC-8001\r
+LSI-ADM-1\r
+LSI-ADM-11\r
+LSI-ADM-12\r
+LSI-ADM-2\r
+LSI-ADM-20\r
+LSI-ADM-22\r
+LSI-ADM-220\r
+LSI-ADM-3\r
+LSI-ADM-31\r
+LSI-ADM-3A\r
+LSI-ADM-42\r
+LSI-ADM-5\r
+MEMOREX-1240\r
+MICROBEE\r
+MICROTERM-ACT-IV\r
+MICROTERM-ACT-V\r
+MICROTERM-ERGO-301\r
+MICROTERM-MIME-1\r
+MICROTERM-MIME-2\r
+MICROTERM-ACT-5A\r
+MICROTERM-TWIST\r
+NEC-5520\r
+NETRONICS\r
+NETWORK-VIRTUAL-TERMINAL\r
+OMRON-8025AG\r
+PERKIN-ELMER-550\r
+PERKIN-ELMER-1100\r
+PERKIN-ELMER-1200\r
+PERQ\r
+PLASMA-PANEL\r
+QUME-SPRINT-5\r
+QUME-101\r
+QUME-102\r
+SOROC\r
+SOROC-120\r
+SOUTHWEST-TECHNICAL-PRODUCTS-CT82\r
+SUN\r
+SUPERBEE\r
+SUPERBEE-III-M\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 223]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+TEC\r
+TEKTRONIX-4006\r
+TEKTRONIX-4010\r
+TEKTRONIX-4012\r
+TEKTRONIX-4013\r
+TEKTRONIX-4014\r
+TEKTRONIX-4023\r
+TEKTRONIX-4024\r
+TEKTRONIX-4025\r
+TEKTRONIX-4027\r
+TEKTRONIX-4105\r
+TEKTRONIX-4107\r
+TEKTRONIX-4110\r
+TEKTRONIX-4112\r
+TEKTRONIX-4113\r
+TEKTRONIX-4114\r
+TEKTRONIX-4115\r
+TEKTRONIX-4125\r
+TEKTRONIX-4404\r
+TELERAY-1061\r
+TELERAY-3700\r
+TELERAY-3800\r
+TELETEC-DATASCREEN\r
+TELETERM-1030\r
+TELETYPE-33\r
+TELETYPE-35\r
+TELETYPE-37\r
+TELETYPE-38\r
+TELETYPE-40\r
+TELETYPE-43\r
+TELEVIDEO-910\r
+TELEVIDEO-912\r
+TELEVIDEO-920\r
+TELEVIDEO-920B\r
+TELEVIDEO-920C\r
+TELEVIDEO-925\r
+TELEVIDEO-955\r
+TELEVIDEO-950\r
+TELEVIDEO-970\r
+TELEVIDEO-975\r
+TERMINET-1200\r
+TERMINET-300\r
+TI-700\r
+TI-733\r
+TI-735\r
+TI-743\r
+TI-745\r
+TI-800\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 224]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+TYCOM\r
+UNIVAC-DCT-500\r
+VIDEO-SYSTEMS-1200\r
+VIDEO-SYSTEMS-5000\r
+VOLKER-CRAIG-303\r
+VOLKER-CRAIG-303A\r
+VOLKER-CRAIG-404\r
+VISUAL-200\r
+VISUAL-55\r
+WYSE-30\r
+WYSE-50\r
+WYSE-60\r
+WYSE-75\r
+WYSE-85\r
+WYSE-99GT\r
+WYSE-100\r
+WYSE-120\r
+WYSE-120ES\r
+WYSE-150\r
+WYSE-150ES\r
+WYSE-160\r
+WYSE-160ES\r
+WYSE-185\r
+WYSE-185ES\r
+WYSE-285\r
+WYSE-285ES\r
+WYSE-325\r
+WYSE-325ES\r
+WYSE-350\r
+WYSE-370\r
+XEROX-1720\r
+XTERM\r
+ZENITH-H19\r
+ZENITH-Z29\r
+ZENTEC-30\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC930] Solomon, M., and E. Wimmers, "Telnet Terminal Type Option",\r
+         RFC 930, University of Wisconsin, Madison, January 1985.\r
+\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/terminal-type-names\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 225]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+PROTOCOL AND SERVICE NAMES\r
+\r
+\r
+These are the Official Protocol Names as they appear in the Domain\r
+Name System WKS records and the NIC Host Table.  Their use is\r
+described in [RFC952].\r
+\r
+A protocol or service may be up to 40 characters taken from the set of\r
+uppercase letters, digits, and the punctuation character hyphen.  It\r
+must start with a letter, and end with a letter or digit.\r
+\r
+\r
+ARGUS               - ARGUS Protocol\r
+ARP                 - Address Resolution Protocol\r
+AUTH                - Authentication Service\r
+BBN-RCC-MON         - BBN RCC Monitoring\r
+BL-IDM              - Britton Lee Intelligent Database Machine\r
+BOOTP               - Bootstrap Protocol\r
+BOOTPC              - Bootstrap Protocol Client\r
+BOOTPS              - Bootstrap Protocol Server\r
+BR-SAT-MON          - Backroom SATNET Monitoring\r
+CFTP                - CFTP\r
+CHAOS               - CHAOS Protocol\r
+CHARGEN             - Character Generator Protocol\r
+CISCO-FNA           - CISCO FNATIVE\r
+CISCO-TNA           - CISCO TNATIVE\r
+CISCO-SYS           - CISCO SYSMAINT\r
+CLOCK               - DCNET Time Server Protocol\r
+CMOT                - Common Mgmnt Info Ser and Prot over TCP/IP\r
+COOKIE-JAR          - Authentication Scheme\r
+CSNET-NS            - CSNET Mailbox Nameserver Protocol\r
+DAYTIME             - Daytime Protocol\r
+DCN-MEAS            - DCN Measurement Subsystems Protocol\r
+DCP                 - Device Control Protocol\r
+DGP                 - Dissimilar Gateway Protocol\r
+DISCARD             - Discard Protocol\r
+DMF-MAIL            - Digest Message Format for Mail\r
+DOMAIN              - Domain Name System\r
+ECHO                - Echo Protocol\r
+EGP                 - Exterior Gateway Protocol\r
+EHF-MAIL            - Encoding Header Field for Mail\r
+EMCON               - Emission Control Protocol\r
+EMFIS-CNTL          - EMFIS Control Service\r
+EMFIS-DATA          - EMFIS Data Service\r
+FCONFIG             - Fujitsu Config Protocol\r
+FINGER              - Finger Protocol\r
+FTP                 - File Transfer Protocol\r
+FTP-DATA            - File Transfer Protocol Data\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 226]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+GGP                 - Gateway Gateway Protocol\r
+GRAPHICS            - Graphics Protocol\r
+HMP                 - Host Monitoring Protocol\r
+HOST2-NS            - Host2 Name Server\r
+HOSTNAME            - Hostname Protocol\r
+ICMP                - Internet Control Message Protocol\r
+IGMP                - Internet Group Management Protocol\r
+IGP                 - Interior Gateway Protocol\r
+IMAP2               - Interim Mail Access Protocol version 2\r
+INGRES-NET          - INGRES-NET Service\r
+IP                  - Internet Protocol\r
+IPCU                - Internet Packet Core Utility\r
+IPPC                - Internet Pluribus Packet Core\r
+IP-ARC              - Internet Protocol on ARCNET\r
+IP-ARPA             - Internet Protocol on ARPANET\r
+IP-CMPRS            - Compressing TCP/IP Headers\r
+IP-DC               - Internet Protocol on DC Networks\r
+IP-DVMRP            - Distance Vector Multicast Routing Protocol\r
+IP-E                - Internet Protocol on Ethernet Networks\r
+IP-EE               - Internet Protocol on Exp. Ethernet Nets\r
+IP-FDDI             - Transmission of IP over FDDI\r
+IP-HC               - Internet Protocol on Hyperchannnel\r
+IP-IEEE             - Internet Protocol on IEEE 802\r
+IP-IPX              - Transmission of 802.2 over IPX Networks\r
+IP-MTU              - IP MTU Discovery Options\r
+IP-NETBIOS          - Internet Protocol over NetBIOS Networks\r
+IP-SLIP             - Transmission of IP over Serial Lines\r
+IP-WB               - Internet Protocol on Wideband Network\r
+IP-X25              - Internet Protocol on X.25 Networks\r
+IRTP                - Internet Reliable Transaction Protocol\r
+ISI-GL              - ISI Graphics Language Protocol\r
+ISO-TP4             - ISO Transport Protocol Class 4\r
+ISO-TSAP            - ISO TSAP\r
+LA-MAINT            - IMP Logical Address Maintenance\r
+LARP                - Locus Address Resoultion Protocol\r
+LDP                 - Loader Debugger Protocol\r
+LEAF-1              - Leaf-1 Protocol\r
+LEAF-2              - Leaf-2 Protocol\r
+LINK                - Link Protocol\r
+LOC-SRV             - Location Service\r
+LOGIN               - Login Host Protocol\r
+MAIL                - Format of Electronic Mail Messages\r
+MERIT-INP           - MERIT Internodal Protocol\r
+METAGRAM            - Metagram Relay\r
+MIB                 - Management Information Base\r
+MIT-ML-DEV          - MIT ML Device\r
+MFE-NSP             - MFE Network Services Protocol\r
+MIT-SUBNET          - MIT Subnet Support\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 227]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+MIT-DOV             - MIT Dover Spooler\r
+MPM                 - Internet Message Protocol (Multimedia Mail)\r
+MPM-FLAGS           - MPM Flags Protocol\r
+MPM-SND             - MPM Send Protocol\r
+MSG-AUTH            - MSG Authentication Protocol\r
+MSG-ICP             - MSG ICP Protocol\r
+MUX                 - Multiplexing Protocol\r
+NAMESERVER          - Host Name Server\r
+NETBIOS-DGM         - NETBIOS Datagram Service\r
+NETBIOS-NS          - NETBIOS Name Service\r
+NETBIOS-SSN         - NETBIOS Session Service\r
+NETBLT              - Bulk Data Transfer Protocol\r
+NETED               - Network Standard Text Editor\r
+NETRJS              - Remote Job Service\r
+NI-FTP              - NI File Transfer Protocol\r
+NI-MAIL             - NI Mail Protocol\r
+NICNAME             - Who Is Protocol\r
+NFILE               - A File Access Protocol\r
+NNTP                - Network News Transfer Protocol\r
+NSW-FE              - NSW User System Front End\r
+NTP                 - Network Time Protocol\r
+NVP-II              - Network Voice Protocol\r
+OSPF                - Open Shortest Path First Interior GW Protocol\r
+PCMAIL              - Pcmail Transport Protocol\r
+POP2                - Post Office Protocol - Version 2\r
+POP3                - Post Office Protocol - Version 3\r
+PPP                 - Point-to-Point Protocol\r
+PRM                 - Packet Radio Measurement\r
+PUP                 - PUP Protocol\r
+PWDGEN              - Password Generator Protocol\r
+QUOTE               - Quote of the Day Protocol\r
+RARP                - A Reverse Address Resolution Protocol\r
+RATP                - Reliable Asynchronous Transfer Protocol\r
+RE-MAIL-CK          - Remote Mail Checking Protocol\r
+RDP                 - Reliable Data Protocol\r
+RIP                 - Routing Information Protocol\r
+RJE                 - Remote Job Entry\r
+RLP                 - Resource Location Protocol\r
+RTELNET             - Remote Telnet Service\r
+RVD                 - Remote Virtual Disk Protocol\r
+SAT-EXPAK           - Satnet and Backroom EXPAK\r
+SAT-MON             - SATNET Monitoring\r
+SEP                 - Sequential Exchange Protocol\r
+SFTP                - Simple File Transfer Protocol\r
+SGMP                - Simple Gateway Monitoring Protocol\r
+SNMP                - Simple Network Management Protocol\r
+SMI                 - Structure of Management Information\r
+SMTP                - Simple Mail Transfer Protocol\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 228]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+SQLSRV              - SQL Service\r
+ST                  - Stream Protocol\r
+STATSRV             - Statistics Service\r
+SU-MIT-TG           - SU/MIT Telnet Gateway Protocol\r
+SUN-RPC             - SUN Remote Procedure Call\r
+SUPDUP              - SUPDUP Protocol\r
+SUR-MEAS            - Survey Measurement\r
+SWIFT-RVF           - Remote Virtual File Protocol\r
+TACACS-DS           - TACACS-Database Service\r
+TACNEWS             - TAC News\r
+TCP                 - Transmission Control Protocol\r
+TCP-ACO             - TCP Alternate Checksum Option\r
+TELNET              - Telnet Protocol\r
+TFTP                - Trivial File Transfer Protocol\r
+THINWIRE            - Thinwire Protocol\r
+TIME                - Time Server Protocol\r
+TP-TCP              - ISO Transport Service on top of the TCP\r
+TRUNK-1             - Trunk-1 Protocol\r
+TRUNK-2             - Trunk-2 Protocol\r
+UCL                 - University College London Protocol\r
+UDP                 - User Datagram Protocol\r
+NNTP                - Network News Transfer Protocol\r
+USERS               - Active Users Protocol\r
+UUCP-PATH           - UUCP Path Service\r
+VIA-FTP             - VIA Systems-File Transfer Protocol\r
+VISA                - VISA Protocol\r
+VMTP                - Versatile Message Transaction Protocol\r
+WB-EXPAK            - Wideband EXPAK\r
+WB-MON              - Wideband Monitoring\r
+XNET                - Cross Net Debugger\r
+XNS-IDP             - Xerox NS IDP\r
+\r
+\r
+REFERENCES\r
+\r
+[RFC952] Harrenstien, K., Stahl, M., and E. Feinler, "DoD Internet\r
+         Host Table Specification", RFC 952, SRI, October 1985.\r
+\r
+[]\r
+\r
+\r
+URL = ftp://ftp.isi.edu/in-notes/iana/assignments/service-names\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 229]\r
+\f\r
+RFC 1700                    Assigned Numbers                October 1994\r
+\r
+\r
+Security Considerations\r
+\r
+   Security issues are not discussed in this memo.\r
+\r
+Authors' Addresses\r
+\r
+   Joyce K. Reynolds\r
+   USC/Information Sciences Institute\r
+   4676 Admiralty Way\r
+   Marina del Rey, California  90292-6695\r
+\r
+   Phone: +1 310-822-1511\r
+   EMail: jkrey@isi.edu\r
+\r
+\r
+   Jon Postel\r
+   USC/Information Sciences Institute\r
+   4676 Admiralty Way\r
+   Marina del Rey, California  90292-6695\r
+\r
+   Phone: +1 310-822-1511\r
+   EMail: postel@isi.edu\r
+\r
+   []\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Reynolds & Postel                                             [Page 230]\r
+\f\r
+\r
+\r
diff --git a/doc/rfc/rfc854.txt b/doc/rfc/rfc854.txt
new file mode 100644 (file)
index 0000000..5e8c597
--- /dev/null
@@ -0,0 +1,855 @@
+Network Working Group                                          J. Postel\r
+Request for Comments: 854                                    J. Reynolds\r
+                                                                     ISI\r
+Obsoletes: NIC 18639                                            May 1983\r
+\r
+                     TELNET PROTOCOL SPECIFICATION\r
+\r
+\r
+This RFC specifies a standard for the ARPA Internet community.  Hosts on\r
+the ARPA Internet are expected to adopt and implement this standard.\r
+\r
+INTRODUCTION\r
+\r
+   The purpose of the TELNET Protocol is to provide a fairly general,\r
+   bi-directional, eight-bit byte oriented communications facility.  Its\r
+   primary goal is to allow a standard method of interfacing terminal\r
+   devices and terminal-oriented processes to each other.  It is\r
+   envisioned that the protocol may also be used for terminal-terminal\r
+   communication ("linking") and process-process communication\r
+   (distributed computation).\r
+\r
+GENERAL CONSIDERATIONS\r
+\r
+   A TELNET connection is a Transmission Control Protocol (TCP)\r
+   connection used to transmit data with interspersed TELNET control\r
+   information.\r
+\r
+   The TELNET Protocol is built upon three main ideas:  first, the\r
+   concept of a "Network Virtual Terminal"; second, the principle of\r
+   negotiated options; and third, a symmetric view of terminals and\r
+   processes.\r
+\r
+   1.  When a TELNET connection is first established, each end is\r
+   assumed to originate and terminate at a "Network Virtual Terminal",\r
+   or NVT.  An NVT is an imaginary device which provides a standard,\r
+   network-wide, intermediate representation of a canonical terminal.\r
+   This eliminates the need for "server" and "user" hosts to keep\r
+   information about the characteristics of each other's terminals and\r
+   terminal handling conventions.  All hosts, both user and server, map\r
+   their local device characteristics and conventions so as to appear to\r
+   be dealing with an NVT over the network, and each can assume a\r
+   similar mapping by the other party.  The NVT is intended to strike a\r
+   balance between being overly restricted (not providing hosts a rich\r
+   enough vocabulary for mapping into their local character sets), and\r
+   being overly inclusive (penalizing users with modest terminals).\r
+\r
+      NOTE:  The "user" host is the host to which the physical terminal\r
+      is normally attached, and the "server" host is the host which is\r
+      normally providing some service.  As an alternate point of view,\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 1]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+      applicable even in terminal-to-terminal or process-to-process\r
+      communications, the "user" host is the host which initiated the\r
+      communication.\r
+\r
+   2.  The principle of negotiated options takes cognizance of the fact\r
+   that many hosts will wish to provide additional services over and\r
+   above those available within an NVT, and many users will have\r
+   sophisticated terminals and would like to have elegant, rather than\r
+   minimal, services.  Independent of, but structured within the TELNET\r
+   Protocol are various "options" that will be sanctioned and may be\r
+   used with the "DO, DON'T, WILL, WON'T" structure (discussed below) to\r
+   allow a user and server to agree to use a more elaborate (or perhaps\r
+   just different) set of conventions for their TELNET connection.  Such\r
+   options could include changing the character set, the echo mode, etc.\r
+\r
+   The basic strategy for setting up the use of options is to have\r
+   either party (or both) initiate a request that some option take\r
+   effect.  The other party may then either accept or reject the\r
+   request.  If the request is accepted the option immediately takes\r
+   effect; if it is rejected the associated aspect of the connection\r
+   remains as specified for an NVT.  Clearly, a party may always refuse\r
+   a request to enable, and must never refuse a request to disable some\r
+   option since all parties must be prepared to support the NVT.\r
+\r
+   The syntax of option negotiation has been set up so that if both\r
+   parties request an option simultaneously, each will see the other's\r
+   request as the positive acknowledgment of its own.\r
+\r
+   3.  The symmetry of the negotiation syntax can potentially lead to\r
+   nonterminating acknowledgment loops -- each party seeing the incoming\r
+   commands not as acknowledgments but as new requests which must be\r
+   acknowledged.  To prevent such loops, the following rules prevail:\r
+\r
+      a. Parties may only request a change in option status; i.e., a\r
+      party may not send out a "request" merely to announce what mode it\r
+      is in.\r
+\r
+      b. If a party receives what appears to be a request to enter some\r
+      mode it is already in, the request should not be acknowledged.\r
+      This non-response is essential to prevent endless loops in the\r
+      negotiation.  It is required that a response be sent to requests\r
+      for a change of mode -- even if the mode is not changed.\r
+\r
+      c. Whenever one party sends an option command to a second party,\r
+      whether as a request or an acknowledgment, and use of the option\r
+      will have any effect on the processing of the data being sent from\r
+      the first party to the second, then the command must be inserted\r
+      in the data stream at the point where it is desired that it take\r
+\r
+\r
+Postel & Reynolds                                               [Page 2]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+      effect.  (It should be noted that some time will elapse between\r
+      the transmission of a request and the receipt of an\r
+      acknowledgment, which may be negative.  Thus, a host may wish to\r
+      buffer data, after requesting an option, until it learns whether\r
+      the request is accepted or rejected, in order to hide the\r
+      "uncertainty period" from the user.)\r
+\r
+   Option requests are likely to flurry back and forth when a TELNET\r
+   connection is first established, as each party attempts to get the\r
+   best possible service from the other party.  Beyond that, however,\r
+   options can be used to dynamically modify the characteristics of the\r
+   connection to suit changing local conditions.  For example, the NVT,\r
+   as will be explained later, uses a transmission discipline well\r
+   suited to the many "line at a time" applications such as BASIC, but\r
+   poorly suited to the many "character at a time" applications such as\r
+   NLS.  A server might elect to devote the extra processor overhead\r
+   required for a "character at a time" discipline when it was suitable\r
+   for the local process and would negotiate an appropriate option.\r
+   However, rather than then being permanently burdened with the extra\r
+   processing overhead, it could switch (i.e., negotiate) back to NVT\r
+   when the detailed control was no longer necessary.\r
+\r
+   It is possible for requests initiated by processes to stimulate a\r
+   nonterminating request loop if the process responds to a rejection by\r
+   merely re-requesting the option.  To prevent such loops from\r
+   occurring, rejected requests should not be repeated until something\r
+   changes.  Operationally, this can mean the process is running a\r
+   different program, or the user has given another command, or whatever\r
+   makes sense in the context of the given process and the given option.\r
+   A good rule of thumb is that a re-request should only occur as a\r
+   result of subsequent information from the other end of the connection\r
+   or when demanded by local human intervention.\r
+\r
+   Option designers should not feel constrained by the somewhat limited\r
+   syntax available for option negotiation.  The intent of the simple\r
+   syntax is to make it easy to have options -- since it is\r
+   correspondingly easy to profess ignorance about them.  If some\r
+   particular option requires a richer negotiation structure than\r
+   possible within "DO, DON'T, WILL, WON'T", the proper tack is to use\r
+   "DO, DON'T, WILL, WON'T" to establish that both parties understand\r
+   the option, and once this is accomplished a more exotic syntax can be\r
+   used freely.  For example, a party might send a request to alter\r
+   (establish) line length.  If it is accepted, then a different syntax\r
+   can be used for actually negotiating the line length -- such a\r
+   "sub-negotiation" might include fields for minimum allowable, maximum\r
+   allowable and desired line lengths.  The important concept is that\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 3]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+   such expanded negotiations should never begin until some prior\r
+   (standard) negotiation has established that both parties are capable\r
+   of parsing the expanded syntax.\r
+\r
+   In summary, WILL XXX is sent, by either party, to indicate that\r
+   party's desire (offer) to begin performing option XXX, DO XXX and\r
+   DON'T XXX being its positive and negative acknowledgments; similarly,\r
+   DO XXX is sent to indicate a desire (request) that the other party\r
+   (i.e., the recipient of the DO) begin performing option XXX, WILL XXX\r
+   and WON'T XXX being the positive and negative acknowledgments.  Since\r
+   the NVT is what is left when no options are enabled, the DON'T and\r
+   WON'T responses are guaranteed to leave the connection in a state\r
+   which both ends can handle.  Thus, all hosts may implement their\r
+   TELNET processes to be totally unaware of options that are not\r
+   supported, simply returning a rejection to (i.e., refusing) any\r
+   option request that cannot be understood.\r
+\r
+   As much as possible, the TELNET protocol has been made server-user\r
+   symmetrical so that it easily and naturally covers the user-user\r
+   (linking) and server-server (cooperating processes) cases.  It is\r
+   hoped, but not absolutely required, that options will further this\r
+   intent.  In any case, it is explicitly acknowledged that symmetry is\r
+   an operating principle rather than an ironclad rule.\r
+\r
+   A companion document, "TELNET Option Specifications," should be\r
+   consulted for information about the procedure for establishing new\r
+   options.\r
+\r
+THE NETWORK VIRTUAL TERMINAL\r
+\r
+   The Network Virtual Terminal (NVT) is a bi-directional character\r
+   device.  The NVT has a printer and a keyboard.  The printer responds\r
+   to incoming data and the keyboard produces outgoing data which is\r
+   sent over the TELNET connection and, if "echoes" are desired, to the\r
+   NVT's printer as well.  "Echoes" will not be expected to traverse the\r
+   network (although options exist to enable a "remote" echoing mode of\r
+   operation, no host is required to implement this option).  The code\r
+   set is seven-bit USASCII in an eight-bit field, except as modified\r
+   herein.  Any code conversion and timing considerations are local\r
+   problems and do not affect the NVT.\r
+\r
+   TRANSMISSION OF DATA\r
+\r
+      Although a TELNET connection through the network is intrinsically\r
+      full duplex, the NVT is to be viewed as a half-duplex device\r
+      operating in a line-buffered mode.  That is, unless and until\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 4]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+      options are negotiated to the contrary, the following default\r
+      conditions pertain to the transmission of data over the TELNET\r
+      connection:\r
+\r
+         1)  Insofar as the availability of local buffer space permits,\r
+         data should be accumulated in the host where it is generated\r
+         until a complete line of data is ready for transmission, or\r
+         until some locally-defined explicit signal to transmit occurs.\r
+         This signal could be generated either by a process or by a\r
+         human user.\r
+\r
+         The motivation for this rule is the high cost, to some hosts,\r
+         of processing network input interrupts, coupled with the\r
+         default NVT specification that "echoes" do not traverse the\r
+         network.  Thus, it is reasonable to buffer some amount of data\r
+         at its source.  Many systems take some processing action at the\r
+         end of each input line (even line printers or card punches\r
+         frequently tend to work this way), so the transmission should\r
+         be triggered at the end of a line.  On the other hand, a user\r
+         or process may sometimes find it necessary or desirable to\r
+         provide data which does not terminate at the end of a line;\r
+         therefore implementers are cautioned to provide methods of\r
+         locally signaling that all buffered data should be transmitted\r
+         immediately.\r
+\r
+         2)  When a process has completed sending data to an NVT printer\r
+         and has no queued input from the NVT keyboard for further\r
+         processing (i.e., when a process at one end of a TELNET\r
+         connection cannot proceed without input from the other end),\r
+         the process must transmit the TELNET Go Ahead (GA) command.\r
+\r
+         This rule is not intended to require that the TELNET GA command\r
+         be sent from a terminal at the end of each line, since server\r
+         hosts do not normally require a special signal (in addition to\r
+         end-of-line or other locally-defined characters) in order to\r
+         commence processing.  Rather, the TELNET GA is designed to help\r
+         a user's local host operate a physically half duplex terminal\r
+         which has a "lockable" keyboard such as the IBM 2741.  A\r
+         description of this type of terminal may help to explain the\r
+         proper use of the GA command.\r
+\r
+         The terminal-computer connection is always under control of\r
+         either the user or the computer.  Neither can unilaterally\r
+         seize control from the other; rather the controlling end must\r
+         relinguish its control explicitly.  At the terminal end, the\r
+         hardware is constructed so as to relinquish control each time\r
+         that a "line" is terminated (i.e., when the "New Line" key is\r
+         typed by the user).  When this occurs, the attached (local)\r
+\r
+\r
+Postel & Reynolds                                               [Page 5]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+         computer processes the input data, decides if output should be\r
+         generated, and if not returns control to the terminal.  If\r
+         output should be generated, control is retained by the computer\r
+         until all output has been transmitted.\r
+\r
+         The difficulties of using this type of terminal through the\r
+         network should be obvious.  The "local" computer is no longer\r
+         able to decide whether to retain control after seeing an\r
+         end-of-line signal or not; this decision can only be made by\r
+         the "remote" computer which is processing the data.  Therefore,\r
+         the TELNET GA command provides a mechanism whereby the "remote"\r
+         (server) computer can signal the "local" (user) computer that\r
+         it is time to pass control to the user of the terminal.  It\r
+         should be transmitted at those times, and only at those times,\r
+         when the user should be given control of the terminal.  Note\r
+         that premature transmission of the GA command may result in the\r
+         blocking of output, since the user is likely to assume that the\r
+         transmitting system has paused, and therefore he will fail to\r
+         turn the line around manually.\r
+\r
+      The foregoing, of course, does not apply to the user-to-server\r
+      direction of communication.  In this direction, GAs may be sent at\r
+      any time, but need not ever be sent.  Also, if the TELNET\r
+      connection is being used for process-to-process communication, GAs\r
+      need not be sent in either direction.  Finally, for\r
+      terminal-to-terminal communication, GAs may be required in\r
+      neither, one, or both directions.  If a host plans to support\r
+      terminal-to-terminal communication it is suggested that the host\r
+      provide the user with a means of manually signaling that it is\r
+      time for a GA to be sent over the TELNET connection; this,\r
+      however, is not a requirement on the implementer of a TELNET\r
+      process.\r
+\r
+      Note that the symmetry of the TELNET model requires that there is\r
+      an NVT at each end of the TELNET connection, at least\r
+      conceptually.\r
+\r
+   STANDARD REPRESENTATION OF CONTROL FUNCTIONS\r
+\r
+      As stated in the Introduction to this document, the primary goal\r
+      of the TELNET protocol is the provision of a standard interfacing\r
+      of terminal devices and terminal-oriented processes through the\r
+      network.  Early experiences with this type of interconnection have\r
+      shown that certain functions are implemented by most servers, but\r
+      that the methods of invoking these functions differ widely.  For a\r
+      human user who interacts with several server systems, these\r
+      differences are highly frustrating.  TELNET, therefore, defines a\r
+      standard representation for five of these functions, as described\r
+\r
+\r
+Postel & Reynolds                                               [Page 6]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+      below.  These standard representations have standard, but not\r
+      required, meanings (with the exception that the Interrupt Process\r
+      (IP) function may be required by other protocols which use\r
+      TELNET); that is, a system which does not provide the function to\r
+      local users need not provide it to network users and may treat the\r
+      standard representation for the function as a No-operation.  On\r
+      the other hand, a system which does provide the function to a\r
+      local user is obliged to provide the same function to a network\r
+      user who transmits the standard representation for the function.\r
+\r
+      Interrupt Process (IP)\r
+\r
+         Many systems provide a function which suspends, interrupts,\r
+         aborts, or terminates the operation of a user process.  This\r
+         function is frequently used when a user believes his process is\r
+         in an unending loop, or when an unwanted process has been\r
+         inadvertently activated.  IP is the standard representation for\r
+         invoking this function.  It should be noted by implementers\r
+         that IP may be required by other protocols which use TELNET,\r
+         and therefore should be implemented if these other protocols\r
+         are to be supported.\r
+\r
+      Abort Output (AO)\r
+\r
+         Many systems provide a function which allows a process, which\r
+         is generating output, to run to completion (or to reach the\r
+         same stopping point it would reach if running to completion)\r
+         but without sending the output to the user's terminal.\r
+         Further, this function typically clears any output already\r
+         produced but not yet actually printed (or displayed) on the\r
+         user's terminal.  AO is the standard representation for\r
+         invoking this function.  For example, some subsystem might\r
+         normally accept a user's command, send a long text string to\r
+         the user's terminal in response, and finally signal readiness\r
+         to accept the next command by sending a "prompt" character\r
+         (preceded by <CR><LF>) to the user's terminal.  If the AO were\r
+         received during the transmission of the text string, a\r
+         reasonable implementation would be to suppress the remainder of\r
+         the text string, but transmit the prompt character and the\r
+         preceding <CR><LF>.  (This is possibly in distinction to the\r
+         action which might be taken if an IP were received; the IP\r
+         might cause suppression of the text string and an exit from the\r
+         subsystem.)\r
+\r
+         It should be noted, by server systems which provide this\r
+         function, that there may be buffers external to the system (in\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 7]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+         the network and the user's local host) which should be cleared;\r
+         the appropriate way to do this is to transmit the "Synch"\r
+         signal (described below) to the user system.\r
+\r
+      Are You There (AYT)\r
+\r
+         Many systems provide a function which provides the user with\r
+         some visible (e.g., printable) evidence that the system is\r
+         still up and running.  This function may be invoked by the user\r
+         when the system is unexpectedly "silent" for a long time,\r
+         because of the unanticipated (by the user) length of a\r
+         computation, an unusually heavy system load, etc.  AYT is the\r
+         standard representation for invoking this function.\r
+\r
+      Erase Character (EC)\r
+\r
+         Many systems provide a function which deletes the last\r
+         preceding undeleted character or "print position"* from the\r
+         stream of data being supplied by the user.  This function is\r
+         typically used to edit keyboard input when typing mistakes are\r
+         made.  EC is the standard representation for invoking this\r
+         function.\r
+\r
+            *NOTE:  A "print position" may contain several characters\r
+            which are the result of overstrikes, or of sequences such as\r
+            <char1> BS <char2>...\r
+\r
+      Erase Line (EL)\r
+\r
+         Many systems provide a function which deletes all the data in\r
+         the current "line" of input.  This function is typically used\r
+         to edit keyboard input.  EL is the standard representation for\r
+         invoking this function.\r
+\r
+   THE TELNET "SYNCH" SIGNAL\r
+\r
+      Most time-sharing systems provide mechanisms which allow a\r
+      terminal user to regain control of a "runaway" process; the IP and\r
+      AO functions described above are examples of these mechanisms.\r
+      Such systems, when used locally, have access to all of the signals\r
+      supplied by the user, whether these are normal characters or\r
+      special "out of band" signals such as those supplied by the\r
+      teletype "BREAK" key or the IBM 2741 "ATTN" key.  This is not\r
+      necessarily true when terminals are connected to the system\r
+      through the network; the network's flow control mechanisms may\r
+      cause such a signal to be buffered elsewhere, for example in the\r
+      user's host.\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 8]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+      To counter this problem, the TELNET "Synch" mechanism is\r
+      introduced.  A Synch signal consists of a TCP Urgent notification,\r
+      coupled with the TELNET command DATA MARK.  The Urgent\r
+      notification, which is not subject to the flow control pertaining\r
+      to the TELNET connection, is used to invoke special handling of\r
+      the data stream by the process which receives it.  In this mode,\r
+      the data stream is immediately scanned for "interesting" signals\r
+      as defined below, discarding intervening data.  The TELNET command\r
+      DATA MARK (DM) is the synchronizing mark in the data stream which\r
+      indicates that any special signal has already occurred and the\r
+      recipient can return to normal processing of the data stream.\r
+\r
+         The Synch is sent via the TCP send operation with the Urgent\r
+         flag set and the DM as the last (or only) data octet.\r
+\r
+      When several Synchs are sent in rapid succession, the Urgent\r
+      notifications may be merged.  It is not possible to count Urgents\r
+      since the number received will be less than or equal the number\r
+      sent.  When in normal mode, a DM is a no operation; when in urgent\r
+      mode, it signals the end of the urgent processing.\r
+\r
+         If TCP indicates the end of Urgent data before the DM is found,\r
+         TELNET should continue the special handling of the data stream\r
+         until the DM is found.\r
+\r
+         If TCP indicates more Urgent data after the DM is found, it can\r
+         only be because of a subsequent Synch.  TELNET should continue\r
+         the special handling of the data stream until another DM is\r
+         found.\r
+\r
+      "Interesting" signals are defined to be:  the TELNET standard\r
+      representations of IP, AO, and AYT (but not EC or EL); the local\r
+      analogs of these standard representations (if any); all other\r
+      TELNET commands; other site-defined signals which can be acted on\r
+      without delaying the scan of the data stream.\r
+\r
+      Since one effect of the SYNCH mechanism is the discarding of\r
+      essentially all characters (except TELNET commands) between the\r
+      sender of the Synch and its recipient, this mechanism is specified\r
+      as the standard way to clear the data path when that is desired.\r
+      For example, if a user at a terminal causes an AO to be\r
+      transmitted, the server which receives the AO (if it provides that\r
+      function at all) should return a Synch to the user.\r
+\r
+      Finally, just as the TCP Urgent notification is needed at the\r
+      TELNET level as an out-of-band signal, so other protocols which\r
+      make use of TELNET may require a TELNET command which can be\r
+      viewed as an out-of-band signal at a different level.\r
+\r
+\r
+Postel & Reynolds                                               [Page 9]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+      By convention the sequence [IP, Synch] is to be used as such a\r
+      signal.  For example, suppose that some other protocol, which uses\r
+      TELNET, defines the character string STOP analogously to the\r
+      TELNET command AO.  Imagine that a user of this protocol wishes a\r
+      server to process the STOP string, but the connection is blocked\r
+      because the server is processing other commands.  The user should\r
+      instruct his system to:\r
+\r
+         1. Send the TELNET IP character;\r
+\r
+         2. Send the TELNET SYNC sequence, that is:\r
+\r
+            Send the Data Mark (DM) as the only character\r
+            in a TCP urgent mode send operation.\r
+\r
+         3. Send the character string STOP; and\r
+\r
+         4. Send the other protocol's analog of the TELNET DM, if any.\r
+\r
+      The user (or process acting on his behalf) must transmit the\r
+      TELNET SYNCH sequence of step 2 above to ensure that the TELNET IP\r
+      gets through to the server's TELNET interpreter.\r
+\r
+         The Urgent should wake up the TELNET process; the IP should\r
+         wake up the next higher level process.\r
+\r
+   THE NVT PRINTER AND KEYBOARD\r
+\r
+      The NVT printer has an unspecified carriage width and page length\r
+      and can produce representations of all 95 USASCII graphics (codes\r
+      32 through 126).  Of the 33 USASCII control codes (0 through 31\r
+      and 127), and the 128 uncovered codes (128 through 255), the\r
+      following have specified meaning to the NVT printer:\r
+\r
+         NAME                  CODE         MEANING\r
+\r
+         NULL (NUL)              0      No Operation\r
+         Line Feed (LF)         10      Moves the printer to the\r
+                                        next print line, keeping the\r
+                                        same horizontal position.\r
+         Carriage Return (CR)   13      Moves the printer to the left\r
+                                        margin of the current line.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 10]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+         In addition, the following codes shall have defined, but not\r
+         required, effects on the NVT printer.  Neither end of a TELNET\r
+         connection may assume that the other party will take, or will\r
+         have taken, any particular action upon receipt or transmission\r
+         of these:\r
+\r
+         BELL (BEL)              7      Produces an audible or\r
+                                        visible signal (which does\r
+                                        NOT move the print head).\r
+         Back Space (BS)         8      Moves the print head one\r
+                                        character position towards\r
+                                        the left margin.\r
+         Horizontal Tab (HT)     9      Moves the printer to the\r
+                                        next horizontal tab stop.\r
+                                        It remains unspecified how\r
+                                        either party determines or\r
+                                        establishes where such tab\r
+                                        stops are located.\r
+         Vertical Tab (VT)       11     Moves the printer to the\r
+                                        next vertical tab stop.  It\r
+                                        remains unspecified how\r
+                                        either party determines or\r
+                                        establishes where such tab\r
+                                        stops are located.\r
+         Form Feed (FF)          12     Moves the printer to the top\r
+                                        of the next page, keeping\r
+                                        the same horizontal position.\r
+\r
+      All remaining codes do not cause the NVT printer to take any\r
+      action.\r
+\r
+      The sequence "CR LF", as defined, will cause the NVT to be\r
+      positioned at the left margin of the next print line (as would,\r
+      for example, the sequence "LF CR").  However, many systems and\r
+      terminals do not treat CR and LF independently, and will have to\r
+      go to some effort to simulate their effect.  (For example, some\r
+      terminals do not have a CR independent of the LF, but on such\r
+      terminals it may be possible to simulate a CR by backspacing.)\r
+      Therefore, the sequence "CR LF" must be treated as a single "new\r
+      line" character and used whenever their combined action is\r
+      intended; the sequence "CR NUL" must be used where a carriage\r
+      return alone is actually desired; and the CR character must be\r
+      avoided in other contexts.  This rule gives assurance to systems\r
+      which must decide whether to perform a "new line" function or a\r
+      multiple-backspace that the TELNET stream contains a character\r
+      following a CR that will allow a rational decision.\r
+\r
+         Note that "CR LF" or "CR NUL" is required in both directions\r
+\r
+\r
+Postel & Reynolds                                              [Page 11]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+         (in the default ASCII mode), to preserve the symmetry of the\r
+         NVT model.  Even though it may be known in some situations\r
+         (e.g., with remote echo and suppress go ahead options in\r
+         effect) that characters are not being sent to an actual\r
+         printer, nonetheless, for the sake of consistency, the protocol\r
+         requires that a NUL be inserted following a CR not followed by\r
+         a LF in the data stream.  The converse of this is that a NUL\r
+         received in the data stream after a CR (in the absence of\r
+         options negotiations which explicitly specify otherwise) should\r
+         be stripped out prior to applying the NVT to local character\r
+         set mapping.\r
+\r
+      The NVT keyboard has keys, or key combinations, or key sequences,\r
+      for generating all 128 USASCII codes.  Note that although many\r
+      have no effect on the NVT printer, the NVT keyboard is capable of\r
+      generating them.\r
+\r
+      In addition to these codes, the NVT keyboard shall be capable of\r
+      generating the following additional codes which, except as noted,\r
+      have defined, but not reguired, meanings.  The actual code\r
+      assignments for these "characters" are in the TELNET Command\r
+      section, because they are viewed as being, in some sense, generic\r
+      and should be available even when the data stream is interpreted\r
+      as being some other character set.\r
+\r
+      Synch\r
+\r
+         This key allows the user to clear his data path to the other\r
+         party.  The activation of this key causes a DM (see command\r
+         section) to be sent in the data stream and a TCP Urgent\r
+         notification is associated with it.  The pair DM-Urgent is to\r
+         have required meaning as defined previously.\r
+\r
+      Break (BRK)\r
+\r
+         This code is provided because it is a signal outside the\r
+         USASCII set which is currently given local meaning within many\r
+         systems.  It is intended to indicate that the Break Key or the\r
+         Attention Key was hit.  Note, however, that this is intended to\r
+         provide a 129th code for systems which require it, not as a\r
+         synonym for the IP standard representation.\r
+\r
+      Interrupt Process (IP)\r
+\r
+         Suspend, interrupt, abort or terminate the process to which the\r
+         NVT is connected.  Also, part of the out-of-band signal for\r
+         other protocols which use TELNET.\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 12]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+      Abort Output (AO)\r
+\r
+         Allow the current process to (appear to) run to completion, but\r
+         do not send its output to the user.  Also, send a Synch to the\r
+         user.\r
+\r
+      Are You There (AYT)\r
+\r
+         Send back to the NVT some visible (i.e., printable) evidence\r
+         that the AYT was received.\r
+\r
+      Erase Character (EC)\r
+\r
+         The recipient should delete the last preceding undeleted\r
+         character or "print position" from the data stream.\r
+\r
+      Erase Line (EL)\r
+\r
+         The recipient should delete characters from the data stream\r
+         back to, but not including, the last "CR LF" sequence sent over\r
+         the TELNET connection.\r
+\r
+      The spirit of these "extra" keys, and also the printer format\r
+      effectors, is that they should represent a natural extension of\r
+      the mapping that already must be done from "NVT" into "local".\r
+      Just as the NVT data byte 68 (104 octal) should be mapped into\r
+      whatever the local code for "uppercase D" is, so the EC character\r
+      should be mapped into whatever the local "Erase Character"\r
+      function is.  Further, just as the mapping for 124 (174 octal) is\r
+      somewhat arbitrary in an environment that has no "vertical bar"\r
+      character, the EL character may have a somewhat arbitrary mapping\r
+      (or none at all) if there is no local "Erase Line" facility.\r
+      Similarly for format effectors:  if the terminal actually does\r
+      have a "Vertical Tab", then the mapping for VT is obvious, and\r
+      only when the terminal does not have a vertical tab should the\r
+      effect of VT be unpredictable.\r
+\r
+TELNET COMMAND STRUCTURE\r
+\r
+   All TELNET commands consist of at least a two byte sequence:  the\r
+   "Interpret as Command" (IAC) escape character followed by the code\r
+   for the command.  The commands dealing with option negotiation are\r
+   three byte sequences, the third byte being the code for the option\r
+   referenced.  This format was chosen so that as more comprehensive use\r
+   of the "data space" is made -- by negotiations from the basic NVT, of\r
+   course -- collisions of data bytes with reserved command values will\r
+   be minimized, all such collisions requiring the inconvenience, and\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 13]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+   inefficiency, of "escaping" the data bytes into the stream.  With the\r
+   current set-up, only the IAC need be doubled to be sent as data, and\r
+   the other 255 codes may be passed transparently.\r
+\r
+   The following are the defined TELNET commands.  Note that these codes\r
+   and code sequences have the indicated meaning only when immediately\r
+   preceded by an IAC.\r
+\r
+      NAME               CODE              MEANING\r
+\r
+      SE                  240    End of subnegotiation parameters.\r
+      NOP                 241    No operation.\r
+      Data Mark           242    The data stream portion of a Synch.\r
+                                 This should always be accompanied\r
+                                 by a TCP Urgent notification.\r
+      Break               243    NVT character BRK.\r
+      Interrupt Process   244    The function IP.\r
+      Abort output        245    The function AO.\r
+      Are You There       246    The function AYT.\r
+      Erase character     247    The function EC.\r
+      Erase Line          248    The function EL.\r
+      Go ahead            249    The GA signal.\r
+      SB                  250    Indicates that what follows is\r
+                                 subnegotiation of the indicated\r
+                                 option.\r
+      WILL (option code)  251    Indicates the desire to begin\r
+                                 performing, or confirmation that\r
+                                 you are now performing, the\r
+                                 indicated option.\r
+      WON'T (option code) 252    Indicates the refusal to perform,\r
+                                 or continue performing, the\r
+                                 indicated option.\r
+      DO (option code)    253    Indicates the request that the\r
+                                 other party perform, or\r
+                                 confirmation that you are expecting\r
+                                 the other party to perform, the\r
+                                 indicated option.\r
+      DON'T (option code) 254    Indicates the demand that the\r
+                                 other party stop performing,\r
+                                 or confirmation that you are no\r
+                                 longer expecting the other party\r
+                                 to perform, the indicated option.\r
+      IAC                 255    Data Byte 255.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 14]\r
+\f\r
+\r
+\r
+RFC 854                                                         May 1983\r
+\r
+\r
+CONNECTION ESTABLISHMENT\r
+\r
+   The TELNET TCP connection is established between the user's port U\r
+   and the server's port L.  The server listens on its well known port L\r
+   for such connections.  Since a TCP connection is full duplex and\r
+   identified by the pair of ports, the server can engage in many\r
+   simultaneous connections involving its port L and different user\r
+   ports U.\r
+\r
+   Port Assignment\r
+\r
+      When used for remote user access to service hosts (i.e., remote\r
+      terminal access) this protocol is assigned server port 23\r
+      (27 octal).  That is L=23.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 15]\r
+\f\r
+\r
+\r
diff --git a/doc/rfc/std5.txt b/doc/rfc/std5.txt
new file mode 100644 (file)
index 0000000..e32de91
--- /dev/null
@@ -0,0 +1,7227 @@
+\r
+RFC:  791\r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                           INTERNET PROTOCOL\r
+                                    \r
+                                    \r
+                         DARPA INTERNET PROGRAM\r
+                                    \r
+                         PROTOCOL SPECIFICATION\r
+                                    \r
+                                    \r
+                                    \r
+                             September 1981\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                              prepared for\r
+\r
+               Defense Advanced Research Projects Agency\r
+                Information Processing Techniques Office\r
+                         1400 Wilson Boulevard\r
+                       Arlington, Virginia  22209\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                   by\r
+\r
+                     Information Sciences Institute\r
+                   University of Southern California\r
+                           4676 Admiralty Way\r
+                   Marina del Rey, California  90291\r
+\f\r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+                           TABLE OF CONTENTS\r
+\r
+    PREFACE ........................................................ iii\r
+\r
+1.  INTRODUCTION ..................................................... 1\r
+\r
+  1.1  Motivation .................................................... 1\r
+  1.2  Scope ......................................................... 1\r
+  1.3  Interfaces .................................................... 1\r
+  1.4  Operation ..................................................... 2\r
+\r
+2.  OVERVIEW ......................................................... 5\r
+\r
+  2.1  Relation to Other Protocols ................................... 9\r
+  2.2  Model of Operation ............................................ 5\r
+  2.3  Function Description .......................................... 7\r
+  2.4  Gateways ...................................................... 9\r
+\r
+3.  SPECIFICATION ................................................... 11\r
+\r
+  3.1  Internet Header Format ....................................... 11\r
+  3.2  Discussion ................................................... 23\r
+  3.3  Interfaces ................................................... 31\r
+\r
+APPENDIX A:  Examples & Scenarios ................................... 34\r
+APPENDIX B:  Data Transmission Order ................................ 39\r
+\r
+GLOSSARY ............................................................ 41\r
+\r
+REFERENCES .......................................................... 45\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page i]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page ii]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+                                PREFACE\r
+\r
+\r
+\r
+This document specifies the DoD Standard Internet Protocol.  This\r
+document is based on six earlier editions of the ARPA Internet Protocol\r
+Specification, and the present text draws heavily from them.  There have\r
+been many contributors to this work both in terms of concepts and in\r
+terms of text.  This edition revises aspects of addressing, error\r
+handling, option codes, and the security, precedence, compartments, and\r
+handling restriction features of the internet protocol.\r
+\r
+                                                           Jon Postel\r
+\r
+                                                           Editor\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                              [Page iii]\r
+\f\r
+\f\r
+\r
+                                                          September 1981\r
+\r
+\r
+RFC:  791\r
+Replaces:  RFC 760\r
+IENs 128, 123, 111,\r
+80, 54, 44, 41, 28, 26\r
+\r
+                           INTERNET PROTOCOL\r
+\r
+                         DARPA INTERNET PROGRAM\r
+                         PROTOCOL SPECIFICATION\r
+\r
+\r
+\r
+                            1.  INTRODUCTION\r
+\r
+1.1.  Motivation\r
+\r
+  The Internet Protocol is designed for use in interconnected systems of\r
+  packet-switched computer communication networks.  Such a system has\r
+  been called a "catenet" [1].  The internet protocol provides for\r
+  transmitting blocks of data called datagrams from sources to\r
+  destinations, where sources and destinations are hosts identified by\r
+  fixed length addresses.  The internet protocol also provides for\r
+  fragmentation and reassembly of long datagrams, if necessary, for\r
+  transmission through "small packet" networks.\r
+\r
+1.2.  Scope\r
+\r
+  The internet protocol is specifically limited in scope to provide the\r
+  functions necessary to deliver a package of bits (an internet\r
+  datagram) from a source to a destination over an interconnected system\r
+  of networks.  There are no mechanisms to augment end-to-end data\r
+  reliability, flow control, sequencing, or other services commonly\r
+  found in host-to-host protocols.  The internet protocol can capitalize\r
+  on the services of its supporting networks to provide various types\r
+  and qualities of service.\r
+\r
+1.3.  Interfaces\r
+\r
+  This protocol is called on by host-to-host protocols in an internet\r
+  environment.  This protocol calls on local network protocols to carry\r
+  the internet datagram to the next gateway or destination host.\r
+\r
+  For example, a TCP module would call on the internet module to take a\r
+  TCP segment (including the TCP header and user data) as the data\r
+  portion of an internet datagram.  The TCP module would provide the\r
+  addresses and other parameters in the internet header to the internet\r
+  module as arguments of the call.  The internet module would then\r
+  create an internet datagram and call on the local network interface to\r
+  transmit the internet datagram.\r
+\r
+  In the ARPANET case, for example, the internet module would call on a\r
+\r
+\r
+                                                                [Page 1]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Introduction\r
+\r
+\r
+\r
+  local net module which would add the 1822 leader [2] to the internet\r
+  datagram creating an ARPANET message to transmit to the IMP.  The\r
+  ARPANET address would be derived from the internet address by the\r
+  local network interface and would be the address of some host in the\r
+  ARPANET, that host might be a gateway to other networks.\r
+\r
+1.4.  Operation\r
+\r
+  The internet protocol implements two basic functions:  addressing and\r
+  fragmentation.\r
+\r
+  The internet modules use the addresses carried in the internet header\r
+  to transmit internet datagrams toward their destinations.  The\r
+  selection of a path for transmission is called routing.\r
+\r
+  The internet modules use fields in the internet header to fragment and\r
+  reassemble internet datagrams when necessary for transmission through\r
+  "small packet" networks.\r
+\r
+  The model of operation is that an internet module resides in each host\r
+  engaged in internet communication and in each gateway that\r
+  interconnects networks.  These modules share common rules for\r
+  interpreting address fields and for fragmenting and assembling\r
+  internet datagrams.  In addition, these modules (especially in\r
+  gateways) have procedures for making routing decisions and other\r
+  functions.\r
+\r
+  The internet protocol treats each internet datagram as an independent\r
+  entity unrelated to any other internet datagram.  There are no\r
+  connections or logical circuits (virtual or otherwise).\r
+\r
+  The internet protocol uses four key mechanisms in providing its\r
+  service:  Type of Service, Time to Live, Options, and Header Checksum.\r
+\r
+  The Type of Service is used to indicate the quality of the service\r
+  desired.  The type of service is an abstract or generalized set of\r
+  parameters which characterize the service choices provided in the\r
+  networks that make up the internet.  This type of service indication\r
+  is to be used by gateways to select the actual transmission parameters\r
+  for a particular network, the network to be used for the next hop, or\r
+  the next gateway when routing an internet datagram.\r
+\r
+  The Time to Live is an indication of an upper bound on the lifetime of\r
+  an internet datagram.  It is set by the sender of the datagram and\r
+  reduced at the points along the route where it is processed.  If the\r
+  time to live reaches zero before the internet datagram reaches its\r
+  destination, the internet datagram is destroyed.  The time to live can\r
+  be thought of as a self destruct time limit.\r
+\r
+\r
+[Page 2]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                            Introduction\r
+\r
+\r
+\r
+  The Options provide for control functions needed or useful in some\r
+  situations but unnecessary for the most common communications.  The\r
+  options include provisions for timestamps, security, and special\r
+  routing.\r
+\r
+  The Header Checksum provides a verification that the information used\r
+  in processing internet datagram has been transmitted correctly.  The\r
+  data may contain errors.  If the header checksum fails, the internet\r
+  datagram is discarded at once by the entity which detects the error.\r
+\r
+  The internet protocol does not provide a reliable communication\r
+  facility.  There are no acknowledgments either end-to-end or\r
+  hop-by-hop.  There is no error control for data, only a header\r
+  checksum.  There are no retransmissions.  There is no flow control.\r
+\r
+  Errors detected may be reported via the Internet Control Message\r
+  Protocol (ICMP) [3] which is implemented in the internet protocol\r
+  module.\r
+\r
+  \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 3]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 4]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+                              2.  OVERVIEW\r
+\r
+2.1.  Relation to Other Protocols\r
+\r
+  The following diagram illustrates the place of the internet protocol\r
+  in the protocol hierarchy:\r
+\r
+                                    \r
+                 +------+ +-----+ +-----+     +-----+  \r
+                 |Telnet| | FTP | | TFTP| ... | ... |  \r
+                 +------+ +-----+ +-----+     +-----+  \r
+                       |   |         |           |     \r
+                      +-----+     +-----+     +-----+  \r
+                      | TCP |     | UDP | ... | ... |  \r
+                      +-----+     +-----+     +-----+  \r
+                         |           |           |     \r
+                      +--------------------------+----+\r
+                      |    Internet Protocol & ICMP   |\r
+                      +--------------------------+----+\r
+                                     |                 \r
+                        +---------------------------+  \r
+                        |   Local Network Protocol  |  \r
+                        +---------------------------+  \r
+\r
+                         Protocol Relationships\r
+\r
+                               Figure 1.\r
+\r
+  Internet protocol interfaces on one side to the higher level\r
+  host-to-host protocols and on the other side to the local network\r
+  protocol.  In this context a "local network" may be a small network in\r
+  a building or a large network such as the ARPANET.\r
+\r
+2.2.  Model of Operation\r
+\r
+  The  model of operation for transmitting a datagram from one\r
+  application program to another is illustrated by the following\r
+  scenario:\r
+\r
+    We suppose that this transmission will involve one intermediate\r
+    gateway.\r
+\r
+    The sending application program prepares its data and calls on its\r
+    local internet module to send that data as a datagram and passes the\r
+    destination address and other parameters as arguments of the call.\r
+\r
+    The internet module prepares a datagram header and attaches the data\r
+    to it.  The internet module determines a local network address for\r
+    this internet address, in this case it is the address of a gateway.\r
+\r
+\r
+                                                                [Page 5]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Overview\r
+\r
+\r
+\r
+    It sends this datagram and the local network address to the local\r
+    network interface.\r
+\r
+    The local network interface creates a local network header, and\r
+    attaches the datagram to it, then sends the result via the local\r
+    network.\r
+\r
+    The datagram arrives at a gateway host wrapped in the local network\r
+    header, the local network interface strips off this header, and\r
+    turns the datagram over to the internet module.  The internet module\r
+    determines from the internet address that the datagram is to be\r
+    forwarded to another host in a second network.  The internet module\r
+    determines a local net address for the destination host.  It calls\r
+    on the local network interface for that network to send the\r
+    datagram.\r
+\r
+    This local network interface creates a local network header and\r
+    attaches the datagram sending the result to the destination host.\r
+\r
+    At this destination host the datagram is stripped of the local net\r
+    header by the local network interface and handed to the internet\r
+    module.\r
+\r
+    The internet module determines that the datagram is for an\r
+    application program in this host.  It passes the data to the\r
+    application program in response to a system call, passing the source\r
+    address and other parameters as results of the call.\r
+\r
+                                    \r
+   Application                                           Application\r
+   Program                                                   Program\r
+         \                                                   /      \r
+       Internet Module      Internet Module      Internet Module    \r
+             \                 /       \                /           \r
+             LNI-1          LNI-1      LNI-2         LNI-2          \r
+                \           /             \          /              \r
+               Local Network 1           Local Network 2            \r
+\r
+\r
+\r
+                            Transmission Path\r
+\r
+                                Figure 2\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 6]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                                Overview\r
+\r
+\r
+\r
+2.3.  Function Description\r
+\r
+  The function or purpose of Internet Protocol is to move datagrams\r
+  through an interconnected set of networks.  This is done by passing\r
+  the datagrams from one internet module to another until the\r
+  destination is reached.  The internet modules reside in hosts and\r
+  gateways in the internet system.  The datagrams are routed from one\r
+  internet module to another through individual networks based on the\r
+  interpretation of an internet address.  Thus, one important mechanism\r
+  of the internet protocol is the internet address.\r
+\r
+  In the routing of messages from one internet module to another,\r
+  datagrams may need to traverse a network whose maximum packet size is\r
+  smaller than the size of the datagram.  To overcome this difficulty, a\r
+  fragmentation mechanism is provided in the internet protocol.\r
+\r
+  Addressing\r
+\r
+    A distinction is made between names, addresses, and routes [4].   A\r
+    name indicates what we seek.  An address indicates where it is.  A\r
+    route indicates how to get there.  The internet protocol deals\r
+    primarily with addresses.  It is the task of higher level (i.e.,\r
+    host-to-host or application) protocols to make the mapping from\r
+    names to addresses.   The internet module maps internet addresses to\r
+    local net addresses.  It is the task of lower level (i.e., local net\r
+    or gateways) procedures to make the mapping from local net addresses\r
+    to routes.\r
+\r
+    Addresses are fixed length of four octets (32 bits).  An address\r
+    begins with a network number, followed by local address (called the\r
+    "rest" field).  There are three formats or classes of internet\r
+    addresses:  in class a, the high order bit is zero, the next 7 bits\r
+    are the network, and the last 24 bits are the local address; in\r
+    class b, the high order two bits are one-zero, the next 14 bits are\r
+    the network and the last 16 bits are the local address; in class c,\r
+    the high order three bits are one-one-zero, the next 21 bits are the\r
+    network and the last 8 bits are the local address.\r
+\r
+    Care must be taken in mapping internet addresses to local net\r
+    addresses; a single physical host must be able to act as if it were\r
+    several distinct hosts to the extent of using several distinct\r
+    internet addresses.  Some hosts will also have several physical\r
+    interfaces (multi-homing).\r
+\r
+    That is, provision must be made for a host to have several physical\r
+    interfaces to the network with each having several logical internet\r
+    addresses.\r
+\r
+\r
+\r
+                                                                [Page 7]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Overview\r
+\r
+\r
+\r
+    Examples of address mappings may be found in "Address Mappings" [5].\r
+\r
+  Fragmentation\r
+\r
+    Fragmentation of an internet datagram is necessary when it\r
+    originates in a local net that allows a large packet size and must\r
+    traverse a local net that limits packets to a smaller size to reach\r
+    its destination.\r
+\r
+    An internet datagram can be marked "don't fragment."  Any internet\r
+    datagram so marked is not to be internet fragmented under any\r
+    circumstances.  If internet datagram marked don't fragment cannot be\r
+    delivered to its destination without fragmenting it, it is to be\r
+    discarded instead.\r
+\r
+    Fragmentation, transmission and reassembly across a local network\r
+    which is invisible to the internet protocol module is called\r
+    intranet fragmentation and may be used [6].\r
+\r
+    The internet fragmentation and reassembly procedure needs to be able\r
+    to break a datagram into an almost arbitrary number of pieces that\r
+    can be later reassembled.  The receiver of the fragments uses the\r
+    identification field to ensure that fragments of different datagrams\r
+    are not mixed.  The fragment offset field tells the receiver the\r
+    position of a fragment in the original datagram.  The fragment\r
+    offset and length determine the portion of the original datagram\r
+    covered by this fragment.  The more-fragments flag indicates (by\r
+    being reset) the last fragment.  These fields provide sufficient\r
+    information to reassemble datagrams.\r
+\r
+    The identification field is used to distinguish the fragments of one\r
+    datagram from those of another.  The originating protocol module of\r
+    an internet datagram sets the identification field to a value that\r
+    must be unique for that source-destination pair and protocol for the\r
+    time the datagram will be active in the internet system.  The\r
+    originating protocol module of a complete datagram sets the\r
+    more-fragments flag to zero and the fragment offset to zero.\r
+\r
+    To fragment a long internet datagram, an internet protocol module\r
+    (for example, in a gateway), creates two new internet datagrams and\r
+    copies the contents of the internet header fields from the long\r
+    datagram into both new internet headers.  The data of the long\r
+    datagram is divided into two portions on a 8 octet (64 bit) boundary\r
+    (the second portion might not be an integral multiple of 8 octets,\r
+    but the first must be).  Call the number of 8 octet blocks in the\r
+    first portion NFB (for Number of Fragment Blocks).  The first\r
+    portion of the data is placed in the first new internet datagram,\r
+    and the total length field is set to the length of the first\r
+\r
+\r
+[Page 8] \r
+\f\r
+\r
+September 1981 \r
+                                                       Internet Protocol\r
+                                                                Overview\r
+\r
+\r
+\r
+    datagram.  The more-fragments flag is set to one.  The second\r
+    portion of the data is placed in the second new internet datagram,\r
+    and the total length field is set to the length of the second\r
+    datagram.  The more-fragments flag carries the same value as the\r
+    long datagram.  The fragment offset field of the second new internet\r
+    datagram is set to the value of that field in the long datagram plus\r
+    NFB.\r
+\r
+    This procedure can be generalized for an n-way split, rather than\r
+    the two-way split described.\r
+\r
+    To assemble the fragments of an internet datagram, an internet\r
+    protocol module (for example at a destination host) combines\r
+    internet datagrams that all have the same value for the four fields:\r
+    identification, source, destination, and protocol.  The combination\r
+    is done by placing the data portion of each fragment in the relative\r
+    position indicated by the fragment offset in that fragment's\r
+    internet header.  The first fragment will have the fragment offset\r
+    zero, and the last fragment will have the more-fragments flag reset\r
+    to zero.\r
+\r
+2.4.  Gateways\r
+\r
+  Gateways implement internet protocol to forward datagrams between\r
+  networks.  Gateways also implement the Gateway to Gateway Protocol\r
+  (GGP) [7] to coordinate routing and other internet control\r
+  information.\r
+\r
+  In a gateway the higher level protocols need not be implemented and\r
+  the GGP functions are added to the IP module.\r
+\r
+                                    \r
+                   +-------------------------------+   \r
+                   | Internet Protocol & ICMP & GGP|   \r
+                   +-------------------------------+   \r
+                           |                 |         \r
+                 +---------------+   +---------------+ \r
+                 |   Local Net   |   |   Local Net   | \r
+                 +---------------+   +---------------+ \r
+\r
+                           Gateway Protocols\r
+\r
+                               Figure 3.\r
+\r
+  \r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 9]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 10]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+                           3.  SPECIFICATION\r
+\r
+3.1.  Internet Header Format\r
+\r
+  A summary of the contents of the internet header follows:\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |Version|  IHL  |Type of Service|          Total Length         |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |         Identification        |Flags|      Fragment Offset    |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |  Time to Live |    Protocol   |         Header Checksum       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                       Source Address                          |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                    Destination Address                        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                    Options                    |    Padding    |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+                    Example Internet Datagram Header\r
+\r
+                               Figure 4.\r
+\r
+  Note that each tick mark represents one bit position.\r
+\r
+  Version:  4 bits\r
+\r
+    The Version field indicates the format of the internet header.  This\r
+    document describes version 4.\r
+\r
+  IHL:  4 bits\r
+\r
+    Internet Header Length is the length of the internet header in 32\r
+    bit words, and thus points to the beginning of the data.  Note that\r
+    the minimum value for a correct header is 5.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 11]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+  Type of Service:  8 bits\r
+\r
+    The Type of Service provides an indication of the abstract\r
+    parameters of the quality of service desired.  These parameters are\r
+    to be used to guide the selection of the actual service parameters\r
+    when transmitting a datagram through a particular network.  Several\r
+    networks offer service precedence, which somehow treats high\r
+    precedence traffic as more important than other traffic (generally\r
+    by accepting only traffic above a certain precedence at time of high\r
+    load).  The major choice is a three way tradeoff between low-delay,\r
+    high-reliability, and high-throughput.\r
+\r
+      Bits 0-2:  Precedence.\r
+      Bit    3:  0 = Normal Delay,      1 = Low Delay.\r
+      Bits   4:  0 = Normal Throughput, 1 = High Throughput.\r
+      Bits   5:  0 = Normal Relibility, 1 = High Relibility.\r
+      Bit  6-7:  Reserved for Future Use.\r
+\r
+         0     1     2     3     4     5     6     7\r
+      +-----+-----+-----+-----+-----+-----+-----+-----+\r
+      |                 |     |     |     |     |     |\r
+      |   PRECEDENCE    |  D  |  T  |  R  |  0  |  0  |\r
+      |                 |     |     |     |     |     |\r
+      +-----+-----+-----+-----+-----+-----+-----+-----+\r
+\r
+        Precedence\r
+\r
+          111 - Network Control\r
+          110 - Internetwork Control\r
+          101 - CRITIC/ECP\r
+          100 - Flash Override\r
+          011 - Flash\r
+          010 - Immediate\r
+          001 - Priority\r
+          000 - Routine\r
+\r
+    The use of the Delay, Throughput, and Reliability indications may\r
+    increase the cost (in some sense) of the service.  In many networks\r
+    better performance for one of these parameters is coupled with worse\r
+    performance on another.  Except for very unusual cases at most two\r
+    of these three indications should be set.\r
+\r
+    The type of service is used to specify the treatment of the datagram\r
+    during its transmission through the internet system.  Example\r
+    mappings of the internet type of service to the actual service\r
+    provided on networks such as AUTODIN II, ARPANET, SATNET, and PRNET\r
+    is given in "Service Mappings" [8].\r
+\r
+\r
+\r
+[Page 12]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+    The Network Control precedence designation is intended to be used\r
+    within a network only.  The actual use and control of that\r
+    designation is up to each network. The Internetwork Control\r
+    designation is intended for use by gateway control originators only.\r
+    If the actual use of these precedence designations is of concern to\r
+    a particular network, it is the responsibility of that network to\r
+    control the access to, and use of, those precedence designations.\r
+\r
+  Total Length:  16 bits\r
+\r
+    Total Length is the length of the datagram, measured in octets,\r
+    including internet header and data.  This field allows the length of\r
+    a datagram to be up to 65,535 octets.  Such long datagrams are\r
+    impractical for most hosts and networks.  All hosts must be prepared\r
+    to accept datagrams of up to 576 octets (whether they arrive whole\r
+    or in fragments).  It is recommended that hosts only send datagrams\r
+    larger than 576 octets if they have assurance that the destination\r
+    is prepared to accept the larger datagrams.\r
+\r
+    The number 576 is selected to allow a reasonable sized data block to\r
+    be transmitted in addition to the required header information.  For\r
+    example, this size allows a data block of 512 octets plus 64 header\r
+    octets to fit in a datagram.  The maximal internet header is 60\r
+    octets, and a typical internet header is 20 octets, allowing a\r
+    margin for headers of higher level protocols.\r
+\r
+  Identification:  16 bits\r
+\r
+    An identifying value assigned by the sender to aid in assembling the\r
+    fragments of a datagram.\r
+\r
+  Flags:  3 bits\r
+\r
+    Various Control Flags.\r
+\r
+      Bit 0: reserved, must be zero\r
+      Bit 1: (DF) 0 = May Fragment,  1 = Don't Fragment.\r
+      Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.\r
+\r
+          0   1   2\r
+        +---+---+---+\r
+        |   | D | M |\r
+        | 0 | F | F |\r
+        +---+---+---+\r
+\r
+  Fragment Offset:  13 bits\r
+\r
+    This field indicates where in the datagram this fragment belongs.\r
+\r
+\r
+                                                               [Page 13]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+    The fragment offset is measured in units of 8 octets (64 bits).  The\r
+    first fragment has offset zero.\r
+\r
+  Time to Live:  8 bits\r
+\r
+    This field indicates the maximum time the datagram is allowed to\r
+    remain in the internet system.  If this field contains the value\r
+    zero, then the datagram must be destroyed.  This field is modified\r
+    in internet header processing.  The time is measured in units of\r
+    seconds, but since every module that processes a datagram must\r
+    decrease the TTL by at least one even if it process the datagram in\r
+    less than a second, the TTL must be thought of only as an upper\r
+    bound on the time a datagram may exist.  The intention is to cause\r
+    undeliverable datagrams to be discarded, and to bound the maximum\r
+    datagram lifetime.\r
+\r
+  Protocol:  8 bits\r
+\r
+    This field indicates the next level protocol used in the data\r
+    portion of the internet datagram.  The values for various protocols\r
+    are specified in "Assigned Numbers" [9].\r
+\r
+  Header Checksum:  16 bits\r
+\r
+    A checksum on the header only.  Since some header fields change\r
+    (e.g., time to live), this is recomputed and verified at each point\r
+    that the internet header is processed.\r
+\r
+    The checksum algorithm is:\r
+\r
+      The checksum field is the 16 bit one's complement of the one's\r
+      complement sum of all 16 bit words in the header.  For purposes of\r
+      computing the checksum, the value of the checksum field is zero.\r
+\r
+    This is a simple to compute checksum and experimental evidence\r
+    indicates it is adequate, but it is provisional and may be replaced\r
+    by a CRC procedure, depending on further experience.\r
+\r
+  Source Address:  32 bits\r
+\r
+    The source address.  See section 3.2.\r
+\r
+  Destination Address:  32 bits\r
+\r
+    The destination address.  See section 3.2.\r
+\r
+\r
+\r
+\r
+\r
+[Page 14]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+  Options:  variable\r
+\r
+    The options may appear or not in datagrams.  They must be\r
+    implemented by all IP modules (host and gateways).  What is optional\r
+    is their transmission in any particular datagram, not their\r
+    implementation.\r
+\r
+    In some environments the security option may be required in all\r
+    datagrams.\r
+\r
+    The option field is variable in length.  There may be zero or more\r
+    options.  There are two cases for the format of an option:\r
+\r
+      Case 1:  A single octet of option-type.\r
+\r
+      Case 2:  An option-type octet, an option-length octet, and the\r
+               actual option-data octets.\r
+\r
+    The option-length octet counts the option-type octet and the\r
+    option-length octet as well as the option-data octets.\r
+\r
+    The option-type octet is viewed as having 3 fields:\r
+\r
+      1 bit   copied flag,\r
+      2 bits  option class,\r
+      5 bits  option number.\r
+\r
+    The copied flag indicates that this option is copied into all\r
+    fragments on fragmentation.\r
+\r
+      0 = not copied\r
+      1 = copied\r
+\r
+    The option classes are:\r
+\r
+      0 = control\r
+      1 = reserved for future use\r
+      2 = debugging and measurement\r
+      3 = reserved for future use\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 15]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+    The following internet options are defined:\r
+\r
+      CLASS NUMBER LENGTH DESCRIPTION\r
+      ----- ------ ------ -----------\r
+        0     0      -    End of Option list.  This option occupies only\r
+                          1 octet; it has no length octet.\r
+        0     1      -    No Operation.  This option occupies only 1\r
+                          octet; it has no length octet.\r
+        0     2     11    Security.  Used to carry Security,\r
+                          Compartmentation, User Group (TCC), and\r
+                          Handling Restriction Codes compatible with DOD\r
+                          requirements.\r
+        0     3     var.  Loose Source Routing.  Used to route the\r
+                          internet datagram based on information\r
+                          supplied by the source.\r
+        0     9     var.  Strict Source Routing.  Used to route the\r
+                          internet datagram based on information\r
+                          supplied by the source.\r
+        0     7     var.  Record Route.  Used to trace the route an\r
+                          internet datagram takes.\r
+        0     8      4    Stream ID.  Used to carry the stream\r
+                          identifier.\r
+        2     4     var.  Internet Timestamp.\r
+\r
+      \r
+\r
+    Specific Option Definitions\r
+\r
+      End of Option List\r
+\r
+        +--------+\r
+        |00000000|\r
+        +--------+\r
+          Type=0\r
+\r
+        This option indicates the end of the option list.  This might\r
+        not coincide with the end of the internet header according to\r
+        the internet header length.  This is used at the end of all\r
+        options, not the end of each option, and need only be used if\r
+        the end of the options would not otherwise coincide with the end\r
+        of the internet header.\r
+\r
+        May be copied, introduced, or deleted on fragmentation, or for\r
+        any other reason.\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 16]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+      No Operation\r
+\r
+        +--------+\r
+        |00000001|\r
+        +--------+\r
+          Type=1\r
+\r
+        This option may be used between options, for example, to align\r
+        the beginning of a subsequent option on a 32 bit boundary.\r
+\r
+        May be copied, introduced, or deleted on fragmentation, or for\r
+        any other reason.\r
+\r
+      Security\r
+\r
+        This option provides a way for hosts to send security,\r
+        compartmentation, handling restrictions, and TCC (closed user\r
+        group) parameters.  The format for this option is as follows:\r
+\r
+          +--------+--------+---//---+---//---+---//---+---//---+\r
+          |10000010|00001011|SSS  SSS|CCC  CCC|HHH  HHH|  TCC   |\r
+          +--------+--------+---//---+---//---+---//---+---//---+\r
+           Type=130 Length=11\r
+\r
+        Security (S field):  16 bits\r
+\r
+          Specifies one of 16 levels of security (eight of which are\r
+          reserved for future use).\r
+\r
+            00000000 00000000 - Unclassified\r
+            11110001 00110101 - Confidential\r
+            01111000 10011010 - EFTO\r
+            10111100 01001101 - MMMM\r
+            01011110 00100110 - PROG\r
+            10101111 00010011 - Restricted\r
+            11010111 10001000 - Secret\r
+            01101011 11000101 - Top Secret\r
+            00110101 11100010 - (Reserved for future use)\r
+            10011010 11110001 - (Reserved for future use)\r
+            01001101 01111000 - (Reserved for future use)\r
+            00100100 10111101 - (Reserved for future use)\r
+            00010011 01011110 - (Reserved for future use)\r
+            10001001 10101111 - (Reserved for future use)\r
+            11000100 11010110 - (Reserved for future use)\r
+            11100010 01101011 - (Reserved for future use)\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 17]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+        Compartments (C field):  16 bits\r
+\r
+          An all zero value is used when the information transmitted is\r
+          not compartmented.  Other values for the compartments field\r
+          may be obtained from the Defense Intelligence Agency.\r
+\r
+        Handling Restrictions (H field):  16 bits\r
+\r
+          The values for the control and release markings are\r
+          alphanumeric digraphs and are defined in the Defense\r
+          Intelligence Agency Manual DIAM 65-19, "Standard Security\r
+          Markings".\r
+\r
+        Transmission Control Code (TCC field):  24 bits\r
+\r
+          Provides a means to segregate traffic and define controlled\r
+          communities of interest among subscribers. The TCC values are\r
+          trigraphs, and are available from HQ DCA Code 530.\r
+\r
+        Must be copied on fragmentation.  This option appears at most\r
+        once in a datagram.\r
+\r
+      Loose Source and Record Route\r
+\r
+        +--------+--------+--------+---------//--------+\r
+        |10000011| length | pointer|     route data    |\r
+        +--------+--------+--------+---------//--------+\r
+         Type=131\r
+\r
+        The loose source and record route (LSRR) option provides a means\r
+        for the source of an internet datagram to supply routing\r
+        information to be used by the gateways in forwarding the\r
+        datagram to the destination, and to record the route\r
+        information.\r
+\r
+        The option begins with the option type code.  The second octet\r
+        is the option length which includes the option type code and the\r
+        length octet, the pointer octet, and length-3 octets of route\r
+        data.  The third octet is the pointer into the route data\r
+        indicating the octet which begins the next source address to be\r
+        processed.  The pointer is relative to this option, and the\r
+        smallest legal value for the pointer is 4.\r
+\r
+        A route data is composed of a series of internet addresses.\r
+        Each internet address is 32 bits or 4 octets.  If the pointer is\r
+        greater than the length, the source route is empty (and the\r
+        recorded route full) and the routing is to be based on the\r
+        destination address field.\r
+\r
+\r
+[Page 18]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+        If the address in destination address field has been reached and\r
+        the pointer is not greater than the length, the next address in\r
+        the source route replaces the address in the destination address\r
+        field, and the recorded route address replaces the source\r
+        address just used, and pointer is increased by four.\r
+\r
+        The recorded route address is the internet module's own internet\r
+        address as known in the environment into which this datagram is\r
+        being forwarded.\r
+\r
+        This procedure of replacing the source route with the recorded\r
+        route (though it is in the reverse of the order it must be in to\r
+        be used as a source route) means the option (and the IP header\r
+        as a whole) remains a constant length as the datagram progresses\r
+        through the internet.\r
+\r
+        This option is a loose source route because the gateway or host\r
+        IP is allowed to use any route of any number of other\r
+        intermediate gateways to reach the next address in the route.\r
+\r
+        Must be copied on fragmentation.  Appears at most once in a\r
+        datagram.\r
+\r
+      Strict Source and Record Route\r
+\r
+        +--------+--------+--------+---------//--------+\r
+        |10001001| length | pointer|     route data    |\r
+        +--------+--------+--------+---------//--------+\r
+         Type=137\r
+\r
+        The strict source and record route (SSRR) option provides a\r
+        means for the source of an internet datagram to supply routing\r
+        information to be used by the gateways in forwarding the\r
+        datagram to the destination, and to record the route\r
+        information.\r
+\r
+        The option begins with the option type code.  The second octet\r
+        is the option length which includes the option type code and the\r
+        length octet, the pointer octet, and length-3 octets of route\r
+        data.  The third octet is the pointer into the route data\r
+        indicating the octet which begins the next source address to be\r
+        processed.  The pointer is relative to this option, and the\r
+        smallest legal value for the pointer is 4.\r
+\r
+        A route data is composed of a series of internet addresses.\r
+        Each internet address is 32 bits or 4 octets.  If the pointer is\r
+        greater than the length, the source route is empty (and the\r
+\r
+\r
+\r
+                                                               [Page 19]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+        recorded route full) and the routing is to be based on the\r
+        destination address field.\r
+\r
+        If the address in destination address field has been reached and\r
+        the pointer is not greater than the length, the next address in\r
+        the source route replaces the address in the destination address\r
+        field, and the recorded route address replaces the source\r
+        address just used, and pointer is increased by four.\r
+\r
+        The recorded route address is the internet module's own internet\r
+        address as known in the environment into which this datagram is\r
+        being forwarded.\r
+\r
+        This procedure of replacing the source route with the recorded\r
+        route (though it is in the reverse of the order it must be in to\r
+        be used as a source route) means the option (and the IP header\r
+        as a whole) remains a constant length as the datagram progresses\r
+        through the internet.\r
+\r
+        This option is a strict source route because the gateway or host\r
+        IP must send the datagram directly to the next address in the\r
+        source route through only the directly connected network\r
+        indicated in the next address to reach the next gateway or host\r
+        specified in the route.\r
+\r
+        Must be copied on fragmentation.  Appears at most once in a\r
+        datagram.\r
+\r
+      Record Route\r
+\r
+        +--------+--------+--------+---------//--------+\r
+        |00000111| length | pointer|     route data    |\r
+        +--------+--------+--------+---------//--------+\r
+          Type=7\r
+\r
+        The record route option provides a means to record the route of\r
+        an internet datagram.\r
+\r
+        The option begins with the option type code.  The second octet\r
+        is the option length which includes the option type code and the\r
+        length octet, the pointer octet, and length-3 octets of route\r
+        data.  The third octet is the pointer into the route data\r
+        indicating the octet which begins the next area to store a route\r
+        address.  The pointer is relative to this option, and the\r
+        smallest legal value for the pointer is 4.\r
+\r
+        A recorded route is composed of a series of internet addresses.\r
+        Each internet address is 32 bits or 4 octets.  If the pointer is\r
+\r
+\r
+[Page 20]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+        greater than the length, the recorded route data area is full.\r
+        The originating host must compose this option with a large\r
+        enough route data area to hold all the address expected.  The\r
+        size of the option does not change due to adding addresses.  The\r
+        intitial contents of the route data area must be zero.\r
+\r
+        When an internet module routes a datagram it checks to see if\r
+        the record route option is present.  If it is, it inserts its\r
+        own internet address as known in the environment into which this\r
+        datagram is being forwarded into the recorded route begining at\r
+        the octet indicated by the pointer, and increments the pointer\r
+        by four.\r
+\r
+        If the route data area is already full (the pointer exceeds the\r
+        length) the datagram is forwarded without inserting the address\r
+        into the recorded route.  If there is some room but not enough\r
+        room for a full address to be inserted, the original datagram is\r
+        considered to be in error and is discarded.  In either case an\r
+        ICMP parameter problem message may be sent to the source\r
+        host [3].\r
+\r
+        Not copied on fragmentation, goes in first fragment only.\r
+        Appears at most once in a datagram.\r
+\r
+      Stream Identifier\r
+\r
+        +--------+--------+--------+--------+\r
+        |10001000|00000010|    Stream ID    |\r
+        +--------+--------+--------+--------+\r
+         Type=136 Length=4\r
+\r
+        This option provides a way for the 16-bit SATNET stream\r
+        identifier to be carried through networks that do not support\r
+        the stream concept.\r
+\r
+        Must be copied on fragmentation.  Appears at most once in a\r
+        datagram.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 21]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+      Internet Timestamp\r
+\r
+        +--------+--------+--------+--------+\r
+        |01000100| length | pointer|oflw|flg|\r
+        +--------+--------+--------+--------+\r
+        |         internet address          |\r
+        +--------+--------+--------+--------+\r
+        |             timestamp             |\r
+        +--------+--------+--------+--------+\r
+        |                 .                 |\r
+                          .\r
+                          .\r
+        Type = 68\r
+\r
+        The Option Length is the number of octets in the option counting\r
+        the type, length, pointer, and overflow/flag octets (maximum\r
+        length 40).\r
+\r
+        The Pointer is the number of octets from the beginning of this\r
+        option to the end of timestamps plus one (i.e., it points to the\r
+        octet beginning the space for next timestamp).  The smallest\r
+        legal value is 5.  The timestamp area is full when the pointer\r
+        is greater than the length.\r
+\r
+        The Overflow (oflw) [4 bits] is the number of IP modules that\r
+        cannot register timestamps due to lack of space.\r
+\r
+        The Flag (flg) [4 bits] values are\r
+\r
+          0 -- time stamps only, stored in consecutive 32-bit words,\r
+\r
+          1 -- each timestamp is preceded with internet address of the\r
+               registering entity,\r
+\r
+          3 -- the internet address fields are prespecified.  An IP\r
+               module only registers its timestamp if it matches its own\r
+               address with the next specified internet address.\r
+\r
+        The Timestamp is a right-justified, 32-bit timestamp in\r
+        milliseconds since midnight UT.  If the time is not available in\r
+        milliseconds or cannot be provided with respect to midnight UT\r
+        then any time may be inserted as a timestamp provided the high\r
+        order bit of the timestamp field is set to one to indicate the\r
+        use of a non-standard value.\r
+\r
+        The originating host must compose this option with a large\r
+        enough timestamp data area to hold all the timestamp information\r
+        expected.  The size of the option does not change due to adding\r
+\r
+\r
+[Page 22]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+        timestamps.  The intitial contents of the timestamp data area\r
+        must be zero or internet address/zero pairs.\r
+\r
+        If the timestamp data area is already full (the pointer exceeds\r
+        the length) the datagram is forwarded without inserting the\r
+        timestamp, but the overflow count is incremented by one.\r
+\r
+        If there is some room but not enough room for a full timestamp\r
+        to be inserted, or the overflow count itself overflows, the\r
+        original datagram is considered to be in error and is discarded.\r
+        In either case an ICMP parameter problem message may be sent to\r
+        the source host [3].\r
+\r
+        The timestamp option is not copied upon fragmentation.  It is\r
+        carried in the first fragment.  Appears at most once in a\r
+        datagram.\r
+\r
+  Padding:  variable\r
+\r
+    The internet header padding is used to ensure that the internet\r
+    header ends on a 32 bit boundary.  The padding is zero.\r
+\r
+3.2.  Discussion\r
+\r
+  The implementation of a protocol must be robust.  Each implementation\r
+  must expect to interoperate with others created by different\r
+  individuals.  While the goal of this specification is to be explicit\r
+  about the protocol there is the possibility of differing\r
+  interpretations.  In general, an implementation must be conservative\r
+  in its sending behavior, and liberal in its receiving behavior.  That\r
+  is, it must be careful to send well-formed datagrams, but must accept\r
+  any datagram that it can interpret (e.g., not object to technical\r
+  errors where the meaning is still clear).\r
+\r
+  The basic internet service is datagram oriented and provides for the\r
+  fragmentation of datagrams at gateways, with reassembly taking place\r
+  at the destination internet protocol module in the destination host.\r
+  Of course, fragmentation and reassembly of datagrams within a network\r
+  or by private agreement between the gateways of a network is also\r
+  allowed since this is transparent to the internet protocols and the\r
+  higher-level protocols.  This transparent type of fragmentation and\r
+  reassembly is termed "network-dependent" (or intranet) fragmentation\r
+  and is not discussed further here.\r
+\r
+  Internet addresses distinguish sources and destinations to the host\r
+  level and provide a protocol field as well.  It is assumed that each\r
+  protocol will provide for whatever multiplexing is necessary within a\r
+  host.\r
+\r
+\r
+                                                               [Page 23]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+  Addressing\r
+\r
+    To provide for flexibility in assigning address to networks and\r
+    allow for the  large number of small to intermediate sized networks\r
+    the interpretation of the address field is coded to specify a small\r
+    number of networks with a large number of host, a moderate number of\r
+    networks with a moderate number of hosts, and a large number of\r
+    networks with a small number of hosts.  In addition there is an\r
+    escape code for extended addressing mode.\r
+\r
+    Address Formats:\r
+\r
+      High Order Bits   Format                           Class\r
+      ---------------   -------------------------------  -----\r
+            0            7 bits of net, 24 bits of host    a\r
+            10          14 bits of net, 16 bits of host    b\r
+            110         21 bits of net,  8 bits of host    c\r
+            111         escape to extended addressing mode\r
+\r
+      A value of zero in the network field means this network.  This is\r
+      only used in certain ICMP messages.  The extended addressing mode\r
+      is undefined.  Both of these features are reserved for future use.\r
+\r
+    The actual values assigned for network addresses is given in\r
+    "Assigned Numbers" [9].\r
+\r
+    The local address, assigned by the local network, must allow for a\r
+    single physical host to act as several distinct internet hosts.\r
+    That is, there must be a mapping between internet host addresses and\r
+    network/host interfaces that allows several internet addresses to\r
+    correspond to one interface.  It must also be allowed for a host to\r
+    have several physical interfaces and to treat the datagrams from\r
+    several of them as if they were all addressed to a single host.\r
+\r
+    Address mappings between internet addresses and addresses for\r
+    ARPANET, SATNET, PRNET, and other networks are described in "Address\r
+    Mappings" [5].\r
+\r
+  Fragmentation and Reassembly.\r
+\r
+    The internet identification field (ID) is used together with the\r
+    source and destination address, and the protocol fields, to identify\r
+    datagram fragments for reassembly.\r
+\r
+    The More Fragments flag bit (MF) is set if the datagram is not the\r
+    last fragment.  The Fragment Offset field identifies the fragment\r
+    location, relative to the beginning of the original unfragmented\r
+    datagram.  Fragments are counted in units of 8 octets.  The\r
+\r
+\r
+[Page 24]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+    fragmentation strategy is designed so than an unfragmented datagram\r
+    has all zero fragmentation information (MF = 0, fragment offset =\r
+    0).  If an internet datagram is fragmented, its data portion must be\r
+    broken on 8 octet boundaries.\r
+\r
+    This format allows 2**13 = 8192 fragments of 8 octets each for a\r
+    total of 65,536 octets.  Note that this is consistent with the the\r
+    datagram total length field (of course, the header is counted in the\r
+    total length and not in the fragments).\r
+\r
+    When fragmentation occurs, some options are copied, but others\r
+    remain with the first fragment only.\r
+\r
+    Every internet module must be able to forward a datagram of 68\r
+    octets without further fragmentation.  This is because an internet\r
+    header may be up to 60 octets, and the minimum fragment is 8 octets.\r
+\r
+    Every internet destination must be able to receive a datagram of 576\r
+    octets either in one piece or in fragments to be reassembled.\r
+\r
+    The fields which may be affected by fragmentation include:\r
+\r
+      (1) options field\r
+      (2) more fragments flag\r
+      (3) fragment offset\r
+      (4) internet header length field\r
+      (5) total length field\r
+      (6) header checksum\r
+\r
+    If the Don't Fragment flag (DF) bit is set, then internet\r
+    fragmentation of this datagram is NOT permitted, although it may be\r
+    discarded.  This can be used to prohibit fragmentation in cases\r
+    where the receiving host does not have sufficient resources to\r
+    reassemble internet fragments.\r
+\r
+    One example of use of the Don't Fragment feature is to down line\r
+    load a small host.  A small host could have a boot strap program\r
+    that accepts a datagram stores it in memory and then executes it.\r
+\r
+    The fragmentation and reassembly procedures are most easily\r
+    described by examples.  The following procedures are example\r
+    implementations.\r
+\r
+    General notation in the following pseudo programs: "=<" means "less\r
+    than or equal", "#" means "not equal", "=" means "equal", "<-" means\r
+    "is set to".  Also, "x to y" includes x and excludes y; for example,\r
+    "4 to 7" would include 4, 5, and 6 (but not 7).\r
+\r
+\r
+\r
+                                                               [Page 25]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+    An Example Fragmentation Procedure\r
+\r
+      The maximum sized datagram that can be transmitted through the\r
+      next network is called the maximum transmission unit (MTU).\r
+\r
+      If the total length is less than or equal the maximum transmission\r
+      unit then submit this datagram to the next step in datagram\r
+      processing; otherwise cut the datagram into two fragments, the\r
+      first fragment being the maximum size, and the second fragment\r
+      being the rest of the datagram.  The first fragment is submitted\r
+      to the next step in datagram processing, while the second fragment\r
+      is submitted to this procedure in case it is still too large.\r
+\r
+      Notation:\r
+\r
+        FO    -  Fragment Offset\r
+        IHL   -  Internet Header Length\r
+        DF    -  Don't Fragment flag\r
+        MF    -  More Fragments flag\r
+        TL    -  Total Length\r
+        OFO   -  Old Fragment Offset\r
+        OIHL  -  Old Internet Header Length\r
+        OMF   -  Old More Fragments flag\r
+        OTL   -  Old Total Length\r
+        NFB   -  Number of Fragment Blocks\r
+        MTU   -  Maximum Transmission Unit\r
+\r
+      Procedure:\r
+\r
+        IF TL =< MTU THEN Submit this datagram to the next step\r
+             in datagram processing ELSE IF DF = 1 THEN discard the\r
+        datagram ELSE\r
+        To produce the first fragment:\r
+        (1)  Copy the original internet header;\r
+        (2)  OIHL <- IHL; OTL <- TL; OFO <- FO; OMF <- MF;\r
+        (3)  NFB <- (MTU-IHL*4)/8;\r
+        (4)  Attach the first NFB*8 data octets;\r
+        (5)  Correct the header:\r
+             MF <- 1;  TL <- (IHL*4)+(NFB*8);\r
+             Recompute Checksum;\r
+        (6)  Submit this fragment to the next step in\r
+             datagram processing;\r
+        To produce the second fragment:\r
+        (7)  Selectively copy the internet header (some options\r
+             are not copied, see option definitions);\r
+        (8)  Append the remaining data;\r
+        (9)  Correct the header:\r
+             IHL <- (((OIHL*4)-(length of options not copied))+3)/4;\r
+\r
+\r
+[Page 26]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+             TL <- OTL - NFB*8 - (OIHL-IHL)*4);\r
+             FO <- OFO + NFB;  MF <- OMF;  Recompute Checksum;\r
+        (10) Submit this fragment to the fragmentation test; DONE.\r
+\r
+      In the above procedure each fragment (except the last) was made\r
+      the maximum allowable size.  An alternative might produce less\r
+      than the maximum size datagrams.  For example, one could implement\r
+      a fragmentation procedure that repeatly divided large datagrams in\r
+      half until the resulting fragments were less than the maximum\r
+      transmission unit size.\r
+\r
+    An Example Reassembly Procedure\r
+\r
+      For each datagram the buffer identifier is computed as the\r
+      concatenation of the source, destination, protocol, and\r
+      identification fields.  If this is a whole datagram (that is both\r
+      the fragment offset and the more fragments  fields are zero), then\r
+      any reassembly resources associated with this buffer identifier\r
+      are released and the datagram is forwarded to the next step in\r
+      datagram processing.\r
+\r
+      If no other fragment with this buffer identifier is on hand then\r
+      reassembly resources are allocated.  The reassembly resources\r
+      consist of a data buffer, a header buffer, a fragment block bit\r
+      table, a total data length field, and a timer.  The data from the\r
+      fragment is placed in the data buffer according to its fragment\r
+      offset and length, and bits are set in the fragment block bit\r
+      table corresponding to the fragment blocks received.\r
+\r
+      If this is the first fragment (that is the fragment offset is\r
+      zero)  this header is placed in the header buffer.  If this is the\r
+      last fragment ( that is the more fragments field is zero) the\r
+      total data length is computed.  If this fragment completes the\r
+      datagram (tested by checking the bits set in the fragment block\r
+      table), then the datagram is sent to the next step in datagram\r
+      processing; otherwise the timer is set to the maximum of the\r
+      current timer value and the value of the time to live field from\r
+      this fragment; and the reassembly routine gives up control.\r
+\r
+      If the timer runs out, the all reassembly resources for this\r
+      buffer identifier are released.  The initial setting of the timer\r
+      is a lower bound on the reassembly waiting time.  This is because\r
+      the waiting time will be increased if the Time to Live in the\r
+      arriving fragment is greater than the current timer value but will\r
+      not be decreased if it is less.  The maximum this timer value\r
+      could reach is the maximum time to live (approximately 4.25\r
+      minutes).  The current recommendation for the initial timer\r
+      setting is 15 seconds.  This may be changed as experience with\r
+\r
+\r
+                                                               [Page 27]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+      this protocol accumulates.  Note that the choice of this parameter\r
+      value is related to the buffer capacity available and the data\r
+      rate of the transmission medium; that is, data rate times timer\r
+      value equals buffer size (e.g., 10Kb/s X 15s = 150Kb).\r
+\r
+      Notation:\r
+\r
+        FO    -  Fragment Offset\r
+        IHL   -  Internet Header Length\r
+        MF    -  More Fragments flag\r
+        TTL   -  Time To Live\r
+        NFB   -  Number of Fragment Blocks\r
+        TL    -  Total Length\r
+        TDL   -  Total Data Length\r
+        BUFID -  Buffer Identifier\r
+        RCVBT -  Fragment Received Bit Table\r
+        TLB   -  Timer Lower Bound\r
+\r
+      Procedure:\r
+\r
+        (1)  BUFID <- source|destination|protocol|identification;\r
+        (2)  IF FO = 0 AND MF = 0\r
+        (3)     THEN IF buffer with BUFID is allocated\r
+        (4)             THEN flush all reassembly for this BUFID;\r
+        (5)          Submit datagram to next step; DONE.\r
+        (6)     ELSE IF no buffer with BUFID is allocated\r
+        (7)             THEN allocate reassembly resources\r
+                             with BUFID;\r
+                             TIMER <- TLB; TDL <- 0;\r
+        (8)          put data from fragment into data buffer with\r
+                     BUFID from octet FO*8 to\r
+                                         octet (TL-(IHL*4))+FO*8;\r
+        (9)          set RCVBT bits from FO\r
+                                        to FO+((TL-(IHL*4)+7)/8);\r
+        (10)         IF MF = 0 THEN TDL <- TL-(IHL*4)+(FO*8)\r
+        (11)         IF FO = 0 THEN put header in header buffer\r
+        (12)         IF TDL # 0\r
+        (13)          AND all RCVBT bits from 0\r
+                                             to (TDL+7)/8 are set\r
+        (14)            THEN TL <- TDL+(IHL*4)\r
+        (15)                 Submit datagram to next step;\r
+        (16)                 free all reassembly resources\r
+                             for this BUFID; DONE.\r
+        (17)         TIMER <- MAX(TIMER,TTL);\r
+        (18)         give up until next fragment or timer expires;\r
+        (19) timer expires: flush all reassembly with this BUFID; DONE.\r
+\r
+      In the case that two or more fragments contain the same data\r
+\r
+\r
+[Page 28]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+      either identically or through a partial overlap, this procedure\r
+      will use the more recently arrived copy in the data buffer and\r
+      datagram delivered.\r
+\r
+  Identification\r
+\r
+    The choice of the Identifier for a datagram is based on the need to\r
+    provide a way to uniquely identify the fragments of a particular\r
+    datagram.  The protocol module assembling fragments judges fragments\r
+    to belong to the same datagram if they have the same source,\r
+    destination, protocol, and Identifier.  Thus, the sender must choose\r
+    the Identifier to be unique for this source, destination pair and\r
+    protocol for the time the datagram (or any fragment of it) could be\r
+    alive in the internet.\r
+\r
+    It seems then that a sending protocol module needs to keep a table\r
+    of Identifiers, one entry for each destination it has communicated\r
+    with in the last maximum packet lifetime for the internet.\r
+\r
+    However, since the Identifier field allows 65,536 different values,\r
+    some host may be able to simply use unique identifiers independent\r
+    of destination.\r
+\r
+    It is appropriate for some higher level protocols to choose the\r
+    identifier. For example, TCP protocol modules may retransmit an\r
+    identical TCP segment, and the probability for correct reception\r
+    would be enhanced if the retransmission carried the same identifier\r
+    as the original transmission since fragments of either datagram\r
+    could be used to construct a correct TCP segment.\r
+\r
+  Type of Service\r
+\r
+    The type of service (TOS) is for internet service quality selection.\r
+    The type of service is specified along the abstract parameters\r
+    precedence, delay, throughput, and reliability.  These abstract\r
+    parameters are to be mapped into the actual service parameters of\r
+    the particular networks the datagram traverses.\r
+\r
+    Precedence.  An independent measure of the importance of this\r
+    datagram.\r
+\r
+    Delay.  Prompt delivery is important for datagrams with this\r
+    indication.\r
+\r
+    Throughput.  High data rate is important for datagrams with this\r
+    indication.\r
+\r
+\r
+\r
+\r
+                                                               [Page 29]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+    Reliability.  A higher level of effort to ensure delivery is\r
+    important for datagrams with this indication.\r
+\r
+    For example, the ARPANET has a priority bit, and a choice between\r
+    "standard" messages (type 0) and "uncontrolled" messages (type 3),\r
+    (the choice between single packet and multipacket messages can also\r
+    be considered a service parameter). The uncontrolled messages tend\r
+    to be less reliably delivered and suffer less delay.  Suppose an\r
+    internet datagram is to be sent through the ARPANET.  Let the\r
+    internet type of service be given as:\r
+\r
+      Precedence:    5\r
+      Delay:         0\r
+      Throughput:    1\r
+      Reliability:   1\r
+\r
+    In this example, the mapping of these parameters to those available\r
+    for the ARPANET would be  to set the ARPANET priority bit on since\r
+    the Internet precedence is in the upper half of its range, to select\r
+    standard messages since the throughput and reliability requirements\r
+    are indicated and delay is not.  More details are given on service\r
+    mappings in "Service Mappings" [8].\r
+\r
+  Time to Live\r
+\r
+    The time to live is set by the sender to the maximum time the\r
+    datagram is allowed to be in the internet system.  If the datagram\r
+    is in the internet system longer than the time to live, then the\r
+    datagram must be destroyed.\r
+\r
+    This field must be decreased at each point that the internet header\r
+    is processed to reflect the time spent processing the datagram.\r
+    Even if no local information is available on the time actually\r
+    spent, the field must be decremented by 1.  The time is measured in\r
+    units of seconds (i.e. the value 1 means one second).  Thus, the\r
+    maximum time to live is 255 seconds or 4.25 minutes.  Since every\r
+    module that processes a datagram must decrease the TTL by at least\r
+    one even if it process the datagram in less than a second, the TTL\r
+    must be thought of only as an upper bound on the time a datagram may\r
+    exist.  The intention is to cause undeliverable datagrams to be\r
+    discarded, and to bound the maximum datagram lifetime.\r
+\r
+    Some higher level reliable connection protocols are based on\r
+    assumptions that old duplicate datagrams will not arrive after a\r
+    certain time elapses.  The TTL is a way for such protocols to have\r
+    an assurance that their assumption is met.\r
+\r
+\r
+\r
+\r
+[Page 30]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+  Options\r
+\r
+    The options are optional in each datagram, but required in\r
+    implementations.  That is, the presence or absence of an option is\r
+    the choice of the sender, but each internet module must be able to\r
+    parse every option.  There can be several options present in the\r
+    option field.\r
+\r
+    The options might not end on a 32-bit boundary.  The internet header\r
+    must be filled out with octets of zeros.  The first of these would\r
+    be interpreted as the end-of-options option, and the remainder as\r
+    internet header padding.\r
+\r
+    Every internet module must be able to act on every option.  The\r
+    Security Option is required if classified, restricted, or\r
+    compartmented traffic is to be passed.\r
+\r
+  Checksum\r
+\r
+    The internet header checksum is recomputed if the internet header is\r
+    changed.  For example, a reduction of the time to live, additions or\r
+    changes to internet options, or due to fragmentation.  This checksum\r
+    at the internet level is intended to protect the internet header\r
+    fields from transmission errors.\r
+\r
+    There are some applications where a few data bit errors are\r
+    acceptable while retransmission delays are not.  If the internet\r
+    protocol enforced data correctness such applications could not be\r
+    supported.\r
+\r
+  Errors\r
+\r
+    Internet protocol errors may be reported via the ICMP messages [3].\r
+\r
+3.3.  Interfaces\r
+\r
+  The functional description of user interfaces to the IP is, at best,\r
+  fictional, since every operating system will have different\r
+  facilities.  Consequently, we must warn readers that different IP\r
+  implementations may have different user interfaces.  However, all IPs\r
+  must provide a certain minimum  set of services to guarantee that all\r
+  IP implementations can support the same protocol hierarchy.  This\r
+  section specifies the functional interfaces required of all IP\r
+  implementations.\r
+\r
+  Internet protocol interfaces on one side to the local network and on\r
+  the other side to either a higher level protocol or an application\r
+  program.  In the following, the higher level protocol or application\r
+\r
+\r
+                                                               [Page 31]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Specification\r
+\r
+\r
+\r
+  program (or even a gateway program) will be called the "user" since it\r
+  is using the internet module.  Since internet protocol is a datagram\r
+  protocol, there is minimal memory or state maintained between datagram\r
+  transmissions, and each call on the internet protocol module by the\r
+  user supplies all information necessary for the IP to perform the\r
+  service requested.\r
+\r
+  An Example Upper Level Interface\r
+\r
+  The following two example calls satisfy the requirements for the user\r
+  to internet protocol module communication ("=>" means returns):\r
+\r
+  SEND (src, dst, prot, TOS, TTL, BufPTR, len, Id, DF, opt => result)\r
+\r
+    where:\r
+\r
+      src = source address\r
+      dst = destination address\r
+      prot = protocol\r
+      TOS = type of service\r
+      TTL = time to live\r
+      BufPTR = buffer pointer\r
+      len = length of buffer\r
+      Id  = Identifier\r
+      DF = Don't Fragment\r
+      opt = option data\r
+      result = response\r
+        OK = datagram sent ok\r
+        Error = error in arguments or local network error\r
+\r
+    Note that the precedence is included in the TOS and the\r
+    security/compartment is passed as an option.\r
+\r
+  RECV (BufPTR, prot, => result, src, dst, TOS, len, opt)\r
+\r
+    where:\r
+\r
+      BufPTR = buffer pointer\r
+      prot = protocol\r
+      result = response\r
+        OK = datagram received ok\r
+        Error = error in arguments\r
+      len = length of buffer\r
+      src = source address\r
+      dst = destination address\r
+      TOS = type of service\r
+      opt = option data\r
+\r
+\r
+\r
+[Page 32]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                           Specification\r
+\r
+\r
+\r
+  When the user sends a datagram, it executes the SEND call supplying\r
+  all the arguments.  The internet protocol module, on receiving this\r
+  call, checks the arguments and prepares and sends the message.  If the\r
+  arguments are good and the datagram is accepted by the local network,\r
+  the call returns successfully.  If either the arguments are bad, or\r
+  the datagram is not accepted by the local network, the call returns\r
+  unsuccessfully.  On unsuccessful returns, a reasonable report must be\r
+  made as to the cause of the problem, but the details of such reports\r
+  are up to individual implementations.\r
+\r
+  When a datagram arrives at the internet protocol module from the local\r
+  network, either there is a pending RECV call from the user addressed\r
+  or there is not.  In the first case, the pending call is satisfied by\r
+  passing the information from the datagram to the user.  In the second\r
+  case, the user addressed is notified of a pending datagram.  If the\r
+  user addressed does not exist, an ICMP error message is returned to\r
+  the sender, and the data is discarded.\r
+\r
+  The notification of a user may be via a pseudo interrupt or similar\r
+  mechanism, as appropriate in the particular operating system\r
+  environment of the implementation.\r
+\r
+  A user's RECV call may then either be immediately satisfied by a\r
+  pending datagram, or the call may be pending until a datagram arrives.\r
+\r
+  The source address is included in the send call in case the sending\r
+  host has several addresses (multiple physical connections or logical\r
+  addresses).  The internet module must check to see that the source\r
+  address is one of the legal address for this host.\r
+\r
+  An implementation may also allow or require a call to the internet\r
+  module to indicate interest in or reserve exclusive use of a class of\r
+  datagrams (e.g., all those with a certain value in the protocol\r
+  field).\r
+\r
+  This section functionally characterizes a USER/IP interface.  The\r
+  notation used is similar to most procedure of function calls in high\r
+  level languages, but this usage is not meant to rule out trap type\r
+  service calls (e.g., SVCs, UUOs, EMTs), or any other form of\r
+  interprocess communication.\r
+\r
+  \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 33]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+\r
+\r
+\r
+APPENDIX A:  Examples & Scenarios\r
+\r
+Example 1:\r
+\r
+  This is an example of the minimal data carrying internet datagram:\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |Ver= 4 |IHL= 5 |Type of Service|        Total Length = 21      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |      Identification = 111     |Flg=0|   Fragment Offset = 0   |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |   Time = 123  |  Protocol = 1 |        header checksum        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                         source address                        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                      destination address                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     data      |                                                \r
+   +-+-+-+-+-+-+-+-+                                                \r
+\r
+                       Example Internet Datagram\r
+\r
+                               Figure 5.\r
+\r
+  Note that each tick mark represents one bit position.\r
+\r
+  This is a internet datagram in version 4 of internet protocol; the\r
+  internet header consists of five 32 bit words, and the total length of\r
+  the datagram is 21 octets.  This datagram is a complete datagram (not\r
+  a fragment).\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 34]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+Example 2:\r
+\r
+  In this example, we show first a moderate size internet datagram (452\r
+  data octets), then two internet fragments that might result from the\r
+  fragmentation of this datagram if the maximum sized transmission\r
+  allowed were 280 octets.\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |Ver= 4 |IHL= 5 |Type of Service|       Total Length = 472      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Identification = 111      |Flg=0|     Fragment Offset = 0 |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |   Time = 123  | Protocol = 6  |        header checksum        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                         source address                        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                      destination address                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   \                                                               \\r
+   \                                                               \\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |             data              |                                \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                                \r
+\r
+                       Example Internet Datagram\r
+\r
+                               Figure 6.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 35]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+\r
+\r
+\r
+  Now the first fragment that results from splitting the datagram after\r
+  256 data octets.\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |Ver= 4 |IHL= 5 |Type of Service|       Total Length = 276      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Identification = 111      |Flg=1|     Fragment Offset = 0 |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |   Time = 119  | Protocol = 6  |        Header Checksum        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                         source address                        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                      destination address                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   \                                                               \\r
+   \                                                               \\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+                       Example Internet Fragment\r
+\r
+                               Figure 7.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 36]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+  And the second fragment.\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |Ver= 4 |IHL= 5 |Type of Service|       Total Length = 216      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Identification = 111      |Flg=0|  Fragment Offset  =  32 |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |   Time = 119  | Protocol = 6  |        Header Checksum        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                         source address                        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                      destination address                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   \                                                               \\r
+   \                                                               \\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |            data               |                                \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                                \r
+\r
+                       Example Internet Fragment\r
+\r
+                               Figure 8.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 37]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+\r
+\r
+\r
+Example 3:\r
+\r
+  Here, we show an example of a datagram containing options:\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |Ver= 4 |IHL= 8 |Type of Service|       Total Length = 576      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |       Identification = 111    |Flg=0|     Fragment Offset = 0 |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |   Time = 123  |  Protocol = 6 |       Header Checksum         |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                        source address                         |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                      destination address                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   | Opt. Code = x | Opt.  Len.= 3 | option value  | Opt. Code = x |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   | Opt. Len. = 4 |           option value        | Opt. Code = 1 |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   | Opt. Code = y | Opt. Len. = 3 |  option value | Opt. Code = 0 |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   \                                                               \\r
+   \                                                               \\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+                       Example Internet Datagram\r
+\r
+                               Figure 9.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 38]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+APPENDIX B:  Data Transmission Order\r
+\r
+The order of transmission of the header and data described in this\r
+document is resolved to the octet level.  Whenever a diagram shows a\r
+group of octets, the order of transmission of those octets is the normal\r
+order in which they are read in English.  For example, in the following\r
+diagram the octets are transmitted in the order they are numbered.\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |       1       |       2       |       3       |       4       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |       5       |       6       |       7       |       8       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |       9       |      10       |      11       |      12       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+                      Transmission Order of Bytes\r
+\r
+                               Figure 10.\r
+\r
+Whenever an octet represents a numeric quantity the left most bit in the\r
+diagram is the high order or most significant bit.  That is, the bit\r
+labeled 0 is the most significant bit.  For example, the following\r
+diagram represents the value 170 (decimal).\r
+\r
+                                    \r
+                            0 1 2 3 4 5 6 7 \r
+                           +-+-+-+-+-+-+-+-+\r
+                           |1 0 1 0 1 0 1 0|\r
+                           +-+-+-+-+-+-+-+-+\r
+\r
+                          Significance of Bits\r
+\r
+                               Figure 11.\r
+\r
+Similarly, whenever a multi-octet field represents a numeric quantity\r
+the left most bit of the whole field is the most significant bit.  When\r
+a multi-octet quantity is transmitted the most significant octet is\r
+transmitted first.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 39]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 40]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+                                GLOSSARY\r
+\r
+\r
+\r
+1822\r
+          BBN Report 1822, "The Specification of the Interconnection of\r
+          a Host and an IMP".  The specification of interface between a\r
+          host and the ARPANET.\r
+\r
+ARPANET leader\r
+          The control information on an ARPANET message at the host-IMP\r
+          interface.\r
+\r
+ARPANET message\r
+          The unit of transmission between a host and an IMP in the\r
+          ARPANET.  The maximum size is about 1012 octets (8096 bits).\r
+\r
+ARPANET packet\r
+          A unit of transmission used internally in the ARPANET between\r
+          IMPs. The maximum size is about 126 octets (1008 bits).\r
+\r
+Destination\r
+          The destination address, an internet header field.\r
+\r
+DF\r
+          The Don't Fragment bit carried in the flags field.\r
+\r
+Flags\r
+          An internet header field carrying various control flags.\r
+\r
+Fragment Offset\r
+          This internet header field indicates where in the internet\r
+          datagram a fragment belongs.\r
+\r
+GGP\r
+          Gateway to Gateway Protocol, the protocol used primarily\r
+          between gateways to control routing and other gateway\r
+          functions.\r
+\r
+header\r
+          Control information at the beginning of a message, segment,\r
+          datagram, packet or block of data.\r
+\r
+ICMP\r
+          Internet Control Message Protocol, implemented in the internet\r
+          module, the ICMP is used from gateways to hosts and between\r
+          hosts to report errors and make routing suggestions.\r
+\r
+\r
+\r
+\r
+                                                               [Page 41]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Glossary\r
+\r
+\r
+\r
+Identification\r
+          An internet header field carrying the identifying value\r
+          assigned by the sender to aid in assembling the fragments of a\r
+          datagram.\r
+\r
+IHL\r
+          The internet header field Internet Header Length is the length\r
+          of the internet header measured in 32 bit words.\r
+\r
+IMP\r
+          The Interface Message Processor, the packet switch of the\r
+          ARPANET.\r
+\r
+Internet Address\r
+          A four octet (32 bit) source or destination address consisting\r
+          of a Network field and a Local Address field.\r
+\r
+internet datagram\r
+          The unit of data exchanged between a pair of internet modules\r
+          (includes the internet header).\r
+\r
+internet fragment\r
+          A portion of the data of an internet datagram with an internet\r
+          header.\r
+\r
+Local Address\r
+          The address of a host within a network.  The actual mapping of\r
+          an internet local address on to the host addresses in a\r
+          network is quite general, allowing for many to one mappings.\r
+\r
+MF\r
+          The More-Fragments Flag carried in the internet header flags\r
+          field.\r
+\r
+module\r
+          An implementation, usually in software, of a protocol or other\r
+          procedure.\r
+\r
+more-fragments flag\r
+          A flag indicating whether or not this internet datagram\r
+          contains the end of an internet datagram, carried in the\r
+          internet header Flags field.\r
+\r
+NFB\r
+          The Number of Fragment Blocks in a the data portion of an\r
+          internet fragment.  That is, the length of a portion of data\r
+          measured in 8 octet units.\r
+\r
+\r
+\r
+[Page 42]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+                                                                Glossary\r
+\r
+\r
+\r
+octet\r
+          An eight bit byte.\r
+\r
+Options\r
+          The internet header Options field may contain several options,\r
+          and each option may be several octets in length.\r
+\r
+Padding\r
+          The internet header Padding field is used to ensure that the\r
+          data begins on 32 bit word boundary.  The padding is zero.\r
+\r
+Protocol\r
+          In this document, the next higher level protocol identifier,\r
+          an internet header field.\r
+\r
+Rest\r
+          The local address portion of an Internet Address.\r
+\r
+Source\r
+          The source address, an internet header field.\r
+\r
+TCP\r
+          Transmission Control Protocol:  A host-to-host protocol for\r
+          reliable communication in internet environments.\r
+\r
+TCP Segment\r
+          The unit of data exchanged between TCP modules (including the\r
+          TCP header).\r
+\r
+TFTP\r
+          Trivial File Transfer Protocol:  A simple file transfer\r
+          protocol built on UDP.\r
+\r
+Time to Live\r
+          An internet header field which indicates the upper bound on\r
+          how long this internet datagram may exist.\r
+\r
+TOS\r
+          Type of Service\r
+\r
+Total Length\r
+          The internet header field Total Length is the length of the\r
+          datagram in octets including internet header and data.\r
+\r
+TTL\r
+          Time to Live\r
+\r
+\r
+\r
+\r
+                                                               [Page 43]\r
+\f\r
+\r
+                                                          September 1981\r
+Internet Protocol\r
+Glossary\r
+\r
+\r
+\r
+Type of Service\r
+          An internet header field which indicates the type (or quality)\r
+          of service for this internet datagram.\r
+\r
+UDP\r
+          User Datagram Protocol:  A user level protocol for transaction\r
+          oriented applications.\r
+\r
+User\r
+          The user of the internet protocol.  This may be a higher level\r
+          protocol module, an application program, or a gateway program.\r
+\r
+Version\r
+          The Version field indicates the format of the internet header.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 44]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                                       Internet Protocol\r
+\r
+\r
+\r
+                               REFERENCES\r
+\r
+\r
+\r
+[1]  Cerf, V., "The Catenet Model for Internetworking," Information\r
+     Processing Techniques Office, Defense Advanced Research Projects\r
+     Agency, IEN 48, July 1978.\r
+\r
+[2]  Bolt Beranek and Newman, "Specification for the Interconnection of\r
+     a Host and an IMP," BBN Technical Report 1822, Revised May 1978.\r
+\r
+[3]  Postel, J., "Internet Control Message Protocol - DARPA Internet\r
+     Program Protocol Specification," RFC 792, USC/Information Sciences\r
+     Institute, September 1981.\r
+\r
+[4]  Shoch, J., "Inter-Network Naming, Addressing, and Routing,"\r
+     COMPCON, IEEE Computer Society, Fall 1978.\r
+\r
+[5]  Postel, J., "Address Mappings," RFC 796, USC/Information Sciences\r
+     Institute, September 1981.\r
+\r
+[6]  Shoch, J., "Packet Fragmentation in Inter-Network Protocols,"\r
+     Computer Networks, v. 3, n. 1, February 1979.\r
+\r
+[7]  Strazisar, V., "How to Build a Gateway", IEN 109, Bolt Beranek and\r
+     Newman, August 1979.\r
+\r
+[8]  Postel, J., "Service Mappings," RFC 795, USC/Information Sciences\r
+     Institute, September 1981.\r
+\r
+[9]  Postel, J., "Assigned Numbers," RFC 790, USC/Information Sciences\r
+     Institute, September 1981.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 45]\r
+\f\r
+\r
+========================================================================\r
+\r
+Network Working Group                                J. Mogul (Stanford)\r
+Request for Comments: 950                                J. Postel (ISI)\r
+                                                             August 1985\r
+\r
+                 Internet Standard Subnetting Procedure\r
+\r
+\r
+Status Of This Memo\r
+\r
+   This RFC specifies a protocol for the ARPA-Internet community.  If\r
+   subnetting is implemented it is strongly recommended that these\r
+   procedures be followed.  Distribution of this memo is unlimited.\r
+\r
+Overview\r
+\r
+   This memo discusses the utility of "subnets" of Internet networks,\r
+   which are logically visible sub-sections of a single Internet\r
+   network.  For administrative or technical reasons, many organizations\r
+   have chosen to divide one Internet network into several subnets,\r
+   instead of acquiring a set of Internet network numbers.  This memo\r
+   specifies procedures for the use of subnets.  These procedures are\r
+   for hosts (e.g., workstations).  The procedures used in and between\r
+   subnet gateways are not fully described.  Important motivation and\r
+   background information for a subnetting standard is provided in\r
+   RFC-940 [7].\r
+\r
+Acknowledgment\r
+\r
+   This memo is based on RFC-917 [1].  Many people contributed to the\r
+   development of the concepts described here.  J. Noel Chiappa, Chris\r
+   Kent, and Tim Mann, in particular, provided important suggestions.\r
+   Additional contributions in shaping this memo were made by Zaw-Sing\r
+   Su, Mike Karels, and the Gateway Algorithms and Data Structures Task\r
+   Force (GADS).\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                  [Page 1]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+1.  Motivation\r
+\r
+   The original view of the Internet universe was a two-level hierarchy:\r
+   the top level the Internet as a whole, and the level below it\r
+   individual networks, each with its own network number.  The Internet\r
+   does not have a hierarchical topology, rather the interpretation of\r
+   addresses is hierarchical.  In this two-level model, each host sees\r
+   its network as a single entity; that is, the network may be treated\r
+   as a "black box" to which a set of hosts is connected.\r
+\r
+   While this view has proved simple and powerful, a number of\r
+   organizations have found it inadequate, and have added a third level\r
+   to the interpretation of Internet addresses.  In this view, a given\r
+   Internet network is divided into a collection of subnets.\r
+\r
+   The three-level model is useful in networks belonging to moderately\r
+   large organizations (e.g., Universities or companies with more than\r
+   one building), where it is often necessary to use more than one LAN\r
+   cable to cover a "local area".  Each LAN may then be treated as a\r
+   subnet.\r
+\r
+   There are several reasons why an organization might use more than one\r
+   cable to cover a campus:\r
+\r
+      - Different technologies:  Especially in a research environment,\r
+        there may be more than one kind of LAN in use; e.g., an\r
+        organization may have some equipment that supports Ethernet, and\r
+        some that supports a ring network.\r
+\r
+      - Limits of technologies:  Most LAN technologies impose limits,\r
+        based on electrical parameters, on the number of hosts\r
+        connected, and on the total length of the cable.  It is easy to\r
+        exceed these limits, especially those on cable length.\r
+\r
+      - Network congestion:  It is possible for a small subset of the\r
+        hosts on a LAN to monopolize most of the bandwidth.  A common\r
+        solution to this problem is to divide the hosts into cliques of\r
+        high mutual communication, and put these cliques on separate\r
+        cables.\r
+\r
+      - Point-to-Point links:  Sometimes a "local area", such as a\r
+        university campus, is split into two locations too far apart to\r
+        connect using the preferred LAN technology.  In this case,\r
+        high-speed point-to-point links might connect several LANs.\r
+\r
+   An organization that has been forced to use more than one LAN has\r
+   three choices for assigning Internet addresses:\r
+\r
+\r
+Mogul & Postel                                                  [Page 2]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+      1. Acquire a distinct Internet network number for each cable;\r
+         subnets are not used at all.\r
+\r
+      2. Use a single network number for the entire organization, but\r
+         assign host numbers without regard to which LAN a host is on\r
+         ("transparent subnets").\r
+\r
+      3. Use a single network number, and partition the host address\r
+         space by assigning subnet numbers to the LANs ("explicit\r
+         subnets").\r
+\r
+   Each of these approaches has disadvantages.  The first, although not\r
+   requiring any new or modified protocols, results in an explosion in\r
+   the size of Internet routing tables.  Information about the internal\r
+   details of local connectivity is propagated everywhere, although it\r
+   is of little or no use outside the local organization.  Especially as\r
+   some current gateway implementations do not have much space for\r
+   routing tables, it would be good to avoid this problem.\r
+\r
+   The second approach requires some convention or protocol that makes\r
+   the collection of LANs appear to be a single Internet network.  For\r
+   example, this can be done on LANs where each Internet address is\r
+   translated to a hardware address using an Address Resolution Protocol\r
+   (ARP), by having the bridges between the LANs intercept ARP requests\r
+   for non-local targets, see RFC-925 [2].  However, it is not possible\r
+   to do this for all LAN technologies, especially those where ARP\r
+   protocols are not currently used, or if the LAN does not support\r
+   broadcasts.  A more fundamental problem is that bridges must discover\r
+   which LAN a host is on, perhaps by using a broadcast algorithm.  As\r
+   the number of LANs grows, the cost of broadcasting grows as well;\r
+   also, the size of translation caches required in the bridges grows\r
+   with the total number of hosts in the network.\r
+\r
+   The third approach is to explicitly support subnets.  This does have\r
+   a disadvantage, in that it is a modification of the Internet\r
+   Protocol, and thus requires changes to IP implementations already in\r
+   use (if these implementations are to be used on a subnetted network).\r
+   However, these changes are relatively minor, and once made, yield a\r
+   simple and efficient solution to the problem.  Also, the approach\r
+   avoids any changes that would be incompatible with existing hosts on\r
+   non-subnetted networks.\r
+\r
+   Further, when appropriate design choices are made, it is possible for\r
+   hosts which believe they are on a non-subnetted network to be used on\r
+   a subnetted one, as explained in RFC-917 [1].  This is useful when it\r
+   is not possible to modify some of the hosts to support subnets\r
+   explicitly, or when a gradual transition is preferred.\r
+\r
+\r
+Mogul & Postel                                                  [Page 3]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+2.  Standards for Subnet Addressing\r
+\r
+   This section first describes a proposal for interpretation of\r
+   Internet addresses to support subnets.  Next it discusses changes to\r
+   host software to support subnets.  Finally, it presents a procedures\r
+   for discovering what address interpretation is in use on a given\r
+   network (i.e., what address mask is in use).\r
+\r
+   2.1. Interpretation of Internet Addresses\r
+\r
+      Suppose that an organization has been assigned an Internet network\r
+      number, has further divided that network into a set of subnets,\r
+      and wants to assign host addresses: how should this be done?\r
+      Since there are minimal restrictions on the assignment of the\r
+      "local address" part of the Internet address, several approaches\r
+      have been proposed for representing the subnet number:\r
+\r
+         1. Variable-width field:  Any number of the bits of the local\r
+            address part are used for the subnet number; the size of\r
+            this field, although constant for a given network, varies\r
+            from network to network.  If the field width is zero, then\r
+            subnets are not in use.\r
+\r
+         2. Fixed-width field:  A specific number of bits (e.g., eight)\r
+            is used for the subnet number, if subnets are in use.\r
+\r
+         3. Self-encoding variable-width field:  Just as the width\r
+            (i.e., class) of the network number field is encoded by its\r
+            high-order bits, the width of the subnet field is similarly\r
+            encoded.\r
+\r
+         4. Self-encoding fixed-width field:  A specific number of bits\r
+            is used for the subnet number.\r
+\r
+         5. Masked bits:  Use a bit mask ("address mask") to identify\r
+            which bits of the local address field indicate the subnet\r
+            number.\r
+\r
+      What criteria can be used to choose one of these five schemes?\r
+      First, should we use a self-encoding scheme?  And, should it be\r
+      possible to tell from examining an Internet address if it refers\r
+      to a subnetted network, without reference to any other\r
+      information?\r
+\r
+         An interesting feature of self-encoding is that it allows the\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                  [Page 4]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+         address space of a network to be divided into subnets of\r
+         different sizes, typically one subnet of half the address space\r
+         and a set of small subnets.\r
+\r
+            For example, consider a class C network that uses a\r
+            self-encoding scheme with one bit to indicate if it is the\r
+            large subnet or not and an additional three bits to identify\r
+            the small subnet.  If the first bit is zero then this is the\r
+            large subnet, if the first bit is one then the following\r
+            bits (3 in this example) give the subnet number.  There is\r
+            one subnet with 128 host addresses, and eight subnets with\r
+            16 hosts each.\r
+\r
+         To establish a subnetting standard the parameters and\r
+         interpretation of the self-encoding scheme must be fixed and\r
+         consistent throughout the Internet.\r
+\r
+         It could be assumed that all networks are subnetted.  This\r
+         would allow addresses to be interpreted without reference to\r
+         any other information.\r
+\r
+            This is a significant advantage, that given the Internet\r
+            address no additional information is needed for an\r
+            implementation to determine if two addresses are on the same\r
+            subnet.  However, this can also be viewed as a disadvantage:\r
+            it may cause problems for networks which have existing host\r
+            numbers that use arbitrary bits in the local address part.\r
+            In other words, it is useful to be able to control whether a\r
+            network is subnetted independently from the assignment of\r
+            host addresses.\r
+\r
+         The alternative is to have the fact that a network is subnetted\r
+         kept separate from the address.  If one finds, somehow, that\r
+         the network is subnetted then the standard self-encoded\r
+         subnetted network address rules are followed, otherwise the\r
+         non-subnetted network addressing rules are followed.\r
+\r
+      If a self-encoding scheme is not used, there is no reason to use a\r
+      fixed-width field scheme: since there must in any case be some\r
+      per-network "flag" to indicate if subnets are in use, the\r
+      additional cost of using an integer (a subnet field width or\r
+      address mask) instead of a boolean is negligible.  The advantage\r
+      of using the address mask scheme is that it allows each\r
+      organization to choose the best way to allocate relatively scarce\r
+      bits of local address to subnet and host numbers.  Therefore, we\r
+      choose the address-mask scheme: it is the most flexible scheme,\r
+      yet costs no more to implement than any other.\r
+\r
+\r
+Mogul & Postel                                                  [Page 5]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+      For example, the Internet address might be interpreted as:\r
+\r
+         <network-number><subnet-number><host-number>\r
+\r
+      where the <network-number> field is as defined by IP [3], the\r
+      <host-number> field is at least 1-bit wide, and the width of the\r
+      <subnet-number> field is constant for a given network.  No further\r
+      structure is required for the <subnet-number> or <host-number>\r
+      fields.  If the width of the <subnet-number> field is zero, then\r
+      the network is not subnetted (i.e., the interpretation of [3] is\r
+      used).\r
+\r
+      For example, on a Class B network with a 6-bit wide subnet field,\r
+      an address would be broken down like this:\r
+\r
+                           1                   2                   3\r
+       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+      |1 0|        NETWORK            |  SUBNET   |    Host Number    |\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+      Since the bits that identify the subnet are specified by a\r
+      bitmask, they need not be adjacent in the address.  However, we\r
+      recommend that the subnet bits be contiguous and located as the\r
+      most significant bits of the local address.\r
+\r
+      Special Addresses:\r
+\r
+         From the Assigned Numbers memo [9]:\r
+\r
+            "In certain contexts, it is useful to have fixed addresses\r
+            with functional significance rather than as identifiers of\r
+            specific hosts.  When such usage is called for, the address\r
+            zero is to be interpreted as meaning "this", as in "this\r
+            network".  The address of all ones are to be interpreted as\r
+            meaning "all", as in "all hosts".  For example, the address\r
+            128.9.255.255 could be interpreted as meaning all hosts on\r
+            the network 128.9.  Or, the address 0.0.0.37 could be\r
+            interpreted as meaning host 37 on this network."\r
+\r
+         It is useful to preserve and extend the interpretation of these\r
+         special addresses in subnetted networks.  This means the values\r
+         of all zeros and all ones in the subnet field should not be\r
+         assigned to actual (physical) subnets.\r
+\r
+            In the example above, the 6-bit wide subnet field may have\r
+            any value except 0 and 63.\r
+\r
+\r
+Mogul & Postel                                                  [Page 6]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+         Please note that there is no effect or new restriction on the\r
+         addresses of hosts on non-subnetted networks.\r
+\r
+   2.2. Changes to Host Software to Support Subnets\r
+\r
+      In most implementations of IP, there is code in the module that\r
+      handles outgoing datagrams to decide if a datagram can be sent\r
+      directly to the destination on the local network or if it must be\r
+      sent to a gateway.\r
+\r
+      Generally the code is something like this:\r
+\r
+         IF ip_net_number(dg.ip_dest) = ip_net_number(my_ip_addr)\r
+             THEN\r
+                 send_dg_locally(dg, dg.ip_dest)\r
+             ELSE\r
+                 send_dg_locally(dg,\r
+                                  gateway_to(ip_net_number(dg.ip_dest)))\r
+\r
+      (If the code supports multiply-connected networks, it will be more\r
+      complicated, but this is irrelevant to the current discussion.)\r
+\r
+      To support subnets, it is necessary to store one more 32-bit\r
+      quantity, called my_ip_mask.  This is a bit-mask with bits set in\r
+      the fields corresponding to the IP network number, and additional\r
+      bits set corresponding to the subnet number field.\r
+\r
+      The code then becomes:\r
+\r
+         IF bitwise_and(dg.ip_dest, my_ip_mask)\r
+                                   = bitwise_and(my_ip_addr, my_ip_mask)\r
+             THEN\r
+                 send_dg_locally(dg, dg.ip_dest)\r
+             ELSE\r
+                 send_dg_locally(dg,\r
+                        gateway_to(bitwise_and(dg.ip_dest, my_ip_mask)))\r
+\r
+      Of course, part of the expression in the conditional can be\r
+      pre-computed.\r
+\r
+      It may or may not be necessary to modify the "gateway_to"\r
+      function, so that it too takes the subnet field bits into account\r
+      when performing comparisons.\r
+\r
+      To support multiply-connected hosts, the code can be changed to\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                  [Page 7]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+      keep  the "my_ip_addr" and "my_ip_mask" quantities on a\r
+      per-interface basis; the expression in the conditional must then\r
+      be evaluated for each interface.\r
+\r
+   2.3. Finding the Address Mask\r
+\r
+      How can a host determine what address mask is in use on a subnet\r
+      to which it is connected?  The problem is analogous to several\r
+      other "bootstrapping" problems for Internet hosts: how a host\r
+      determines its own address, and how it locates a gateway on its\r
+      local network.  In all three cases, there are two basic solutions:\r
+      "hardwired" information, and broadcast-based protocols.\r
+\r
+      Hardwired information is that available to a host in isolation\r
+      from a network.  It may be compiled-in, or (preferably) stored in\r
+      a disk file.  However, for the increasingly common case of a\r
+      diskless workstation that is bootloaded over a LAN, neither\r
+      hardwired solution is satisfactory.\r
+\r
+      Instead, since most LAN technology supports broadcasting, a better\r
+      method is for the newly-booted host to broadcast a request for the\r
+      necessary information.  For example, for the purpose of\r
+      determining its Internet address, a host may use the "Reverse\r
+      Address Resolution Protocol" (RARP) [4].\r
+\r
+      However, since a newly-booted host usually needs to gather several\r
+      facts (e.g., its IP address, the hardware address of a gateway,\r
+      the IP address of a domain name server, the subnet address mask),\r
+      it would be better to acquire all this information in one request\r
+      if possible, rather than doing numerous broadcasts on the network.\r
+      The mechanisms designed to boot diskless workstations can also\r
+      load per-host specific configuration files that contain the\r
+      required information (e.g., see RFC-951 [8]).  It is possible, and\r
+      desirable, to obtain all the facts necessary to operate a host\r
+      from a boot server using only one broadcast message.\r
+\r
+      In the case where it is necessary for a host to find the address\r
+      mask as a separate operation the following mechanism is provided:\r
+\r
+         To provide the address mask information the ICMP protocol [5]\r
+         is extended by adding a new pair of ICMP message types,\r
+         "Address Mask Request" and "Address Mask Reply", analogous to\r
+         the "Information Request" and "Information Reply" ICMP\r
+         messages.  These are described in detail in Appendix I.\r
+\r
+         The intended use of these new ICMP messages is that a host,\r
+         when booting, broadcast an "Address Mask Request" message.  A\r
+\r
+\r
+Mogul & Postel                                                  [Page 8]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+         gateway (or a host acting in lieu of a gateway) that receives\r
+         this message responds with an "Address Mask Reply".  If there\r
+         is no indication in the request which host sent it (i.e., the\r
+         IP Source Address is zero), the reply is broadcast as well.\r
+         The requesting host will hear the response, and from it\r
+         determine the address mask.\r
+\r
+         Since there is only one possible value that can be sent in an\r
+         "Address Mask Reply" on any given LAN, there is no need for the\r
+         requesting host to match the responses it hears against the\r
+         request it sent; similarly, there is no problem if more than\r
+         one gateway responds.  We assume that hosts reboot\r
+         infrequently, so the broadcast load on a network from use of\r
+         this protocol should be small.\r
+\r
+      If a host is connected to more than one LAN, it might have to find\r
+      the address mask for each.\r
+\r
+      One potential problem is what a host should do if it can not find\r
+      out the address mask, even after a reasonable number of tries.\r
+      Three interpretations can be placed on the situation:\r
+\r
+         1. The local net exists in (permanent) isolation from all other\r
+            nets.\r
+\r
+         2. Subnets are not in use, and no host can supply the address\r
+            mask.\r
+\r
+         3. All gateways on the local net are (temporarily) down.\r
+\r
+      The first and second situations imply that the address mask is\r
+      identical with the Internet network number mask.  In the third\r
+      situation, there is no way to determine what the proper value is;\r
+      the safest choice is thus a mask identical with the Internet\r
+      network number mask.  Although this might later turn out to be\r
+      wrong, it will not prevent transmissions that would otherwise\r
+      succeed.  It is possible for a host to recover from a wrong\r
+      choice: when a gateway comes up, it should broadcast an "Address\r
+      Mask Reply"; when a host receives such a message that disagrees\r
+      with its guess, it should change its mask to conform to the\r
+      received value.  No host or gateway should send an "Address Mask\r
+      Reply" based on a "guessed" value.\r
+\r
+      Finally, note that no host is required to use this ICMP protocol\r
+      to discover the address mask; it is perfectly reasonable for a\r
+      host with non-volatile storage to use stored information\r
+      (including a configuration file from a boot server).\r
+\r
+\r
+Mogul & Postel                                                  [Page 9]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+Appendix I.  Address Mask ICMP\r
+\r
+   Address Mask Request or Address Mask Reply\r
+\r
+       0                   1                   2                   3\r
+       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+      |     Type      |      Code     |          Checksum             |\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+      |           Identifier          |       Sequence Number         |\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+      |                        Address Mask                           |\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+      IP Fields:\r
+\r
+         Addresses\r
+\r
+            The address of the source in an address mask request message\r
+            will be the destination of the address mask reply message.\r
+            To form an address mask reply message, the source address of\r
+            the request becomes the destination address of the reply,\r
+            the source address of the reply is set to the replier's\r
+            address, the type code changed to AM2, the address mask\r
+            value inserted into the Address Mask field, and the checksum\r
+            recomputed.  However, if the source address in the request\r
+            message is zero, then the destination address for the reply\r
+            message should denote a broadcast.\r
+\r
+      ICMP Fields:\r
+\r
+         Type\r
+\r
+            AM1 for address mask request message\r
+\r
+            AM2 for address mask reply message\r
+\r
+         Code\r
+\r
+            0 for address mask request message\r
+\r
+            0 for address mask reply message\r
+\r
+         Checksum\r
+\r
+            The checksum is the 16-bit one's complement of the one's\r
+\r
+\r
+\r
+Mogul & Postel                                                 [Page 10]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+            complement sum of the ICMP message starting with the ICMP\r
+            Type.  For computing the checksum, the checksum field should\r
+            be zero.  This checksum may be replaced in the future.\r
+\r
+         Identifier\r
+\r
+            An identifier to aid in matching requests and replies, may\r
+            be zero.\r
+\r
+         Sequence Number\r
+\r
+            A sequence number to aid in matching requests and replies,\r
+            may be zero.\r
+\r
+         Address Mask\r
+\r
+            A 32-bit mask.\r
+\r
+      Description\r
+\r
+         A gateway receiving an address mask request should return it\r
+         with the address mask field set to the 32-bit mask of the bits\r
+         identifying the subnet and network, for the subnet on which the\r
+         request was received.\r
+\r
+         If the requesting host does not know its own IP address, it may\r
+         leave the source field zero; the reply should then be\r
+         broadcast.  However, this approach should be avoided if at all\r
+         possible, since it increases the superfluous broadcast load on\r
+         the network.  Even when the replies are broadcast, since there\r
+         is only one possible address mask for a subnet, there is no\r
+         need to match requests with replies.  The "Identifier" and\r
+         "Sequence Number" fields can be ignored.\r
+\r
+            Type AM1 may be received from a gateway or a host.\r
+\r
+            Type AM2 may be received from a gateway, or a host acting in\r
+            lieu of a gateway.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                 [Page 11]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+Appendix II.  Examples\r
+\r
+   These examples show how a host can find out the address mask using\r
+   the ICMP Address Mask Request and Address Mask Reply messages.  For\r
+   the following examples, assume that address 255.255.255.255 denotes\r
+   "broadcast to this physical medium" [6].\r
+\r
+   1.  A Class A Network Case\r
+\r
+      For this case, assume that the requesting host is on class A\r
+      network 36.0.0.0, has address 36.40.0.123, that there is a gateway\r
+      at 36.40.0.62, and that a 8-bit wide subnet field is in use, that\r
+      is, the address mask is 255.255.0.0.\r
+\r
+      The most efficient method, and the one we recommend, is for a host\r
+      to first discover its own address (perhaps using "RARP" [4]), and\r
+      then to send the ICMP request to 255.255.255.255:\r
+\r
+         Source address:          36.40.0.123\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      The gateway can then respond directly to the requesting host.\r
+\r
+         Source address:          36.40.0.62\r
+         Destination address:     36.40.0.123\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.0.0\r
+\r
+      Suppose that 36.40.0.123 is a diskless workstation, and does not\r
+      know even its own host number.  It could send the following\r
+      datagram:\r
+\r
+         Source address:          0.0.0.0\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      36.40.0.62 will hear the datagram, and should respond with this\r
+      datagram:\r
+\r
+\r
+Mogul & Postel                                                 [Page 12]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+         Source address:          36.40.0.62\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.0.0\r
+\r
+      Note that the gateway uses the narrowest possible broadcast to\r
+      reply.  Even so, the over use of broadcasts presents an\r
+      unnecessary load to all hosts on the subnet, and so the use of the\r
+      "anonymous" (0.0.0.0) source address must be kept to a minimum.\r
+\r
+      If broadcasting is not allowed, we assume that hosts have wired-in\r
+      information about neighbor gateways; thus, 36.40.0.123 might send\r
+      this datagram:\r
+\r
+         Source address:          36.40.0.123\r
+         Destination address:     36.40.0.62\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      36.40.0.62 should respond exactly as in the previous case.\r
+\r
+         Source address:          36.40.0.62\r
+         Destination address:     36.40.0.123\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.0.0\r
+\r
+   2.  A Class B Network Case\r
+\r
+      For this case, assume that the requesting host is on class B\r
+      network 128.99.0.0, has address 128.99.4.123, that there is a\r
+      gateway at 128.99.4.62, and that a 6-bit wide subnet field is in\r
+      use, that is, the address mask is 255.255.252.0.\r
+\r
+      The host sends the ICMP request to 255.255.255.255:\r
+\r
+         Source address:          128.99.4.123\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+\r
+Mogul & Postel                                                 [Page 13]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+      The gateway can then respond directly to the requesting host.\r
+\r
+         Source address:          128.99.4.62\r
+         Destination address:     128.99.4.123\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.252.0\r
+\r
+      In the diskless workstation case the host sends:\r
+\r
+         Source address:          0.0.0.0\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      128.99.4.62 will hear the datagram, and should respond with this\r
+      datagram:\r
+\r
+         Source address:          128.99.4.62\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.252.0\r
+\r
+      If broadcasting is not allowed 128.99.4.123 sends:\r
+\r
+         Source address:          128.99.4.123\r
+         Destination address:     128.99.4.62\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      128.99.4.62 should respond exactly as in the previous case.\r
+\r
+         Source address:          128.99.4.62\r
+         Destination address:     128.99.4.123\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.252.0\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                 [Page 14]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+   3.  A Class C Network Case (illustrating non-contiguous subnet bits)\r
+\r
+      For this case, assume that the requesting host is on class C\r
+      network 192.1.127.0, has address 192.1.127.19, that there is a\r
+      gateway at 192.1.127.50, and that on network an 3-bit subnet field\r
+      is in use (01011000), that is, the address mask is 255.255.255.88.\r
+\r
+      The host sends the ICMP request to 255.255.255.255:\r
+\r
+         Source address:          192.1.127.19\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      The gateway can then respond directly to the requesting host.\r
+\r
+         Source address:          192.1.127.50\r
+         Destination address:     192.1.127.19\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.255.88.\r
+\r
+      In the diskless workstation case the host sends:\r
+\r
+         Source address:          0.0.0.0\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      192.1.127.50 will hear the datagram, and should respond with this\r
+      datagram:\r
+\r
+         Source address:          192.1.127.50\r
+         Destination address:     255.255.255.255\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.255.88.\r
+\r
+      If broadcasting is not allowed 192.1.127.19 sends:\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                 [Page 15]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+         Source address:          192.1.127.19\r
+         Destination address:     192.1.127.50\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Request = AM1\r
+         Code:                    0\r
+         Mask:                    0\r
+\r
+      192.1.127.50 should respond exactly as in the previous case.\r
+\r
+         Source address:          192.1.127.50\r
+         Destination address:     192.1.127.19\r
+         Protocol:                ICMP = 1\r
+         Type:                    Address Mask Reply = AM2\r
+         Code:                    0\r
+         Mask:                    255.255.255.88\r
+\r
+Appendix III.  Glossary\r
+\r
+   Bridge\r
+\r
+      A node connected to two or more administratively indistinguishable\r
+      but physically distinct subnets, that automatically forwards\r
+      datagrams when necessary, but whose existence is not known to\r
+      other hosts.  Also called a "software repeater".\r
+\r
+   Gateway\r
+\r
+      A node connected to two or more administratively distinct networks\r
+      and/or subnets, to which hosts send datagrams to be forwarded.\r
+\r
+   Host Field\r
+\r
+      The bit field in an Internet address used for denoting a specific\r
+      host.\r
+\r
+   Internet\r
+\r
+      The collection of connected networks using the IP protocol.\r
+\r
+   Local Address\r
+\r
+      The rest field of the Internet address (as defined in [3]).\r
+\r
+   Network\r
+\r
+      A single Internet network (which may or may not be divided into\r
+      subnets).\r
+\r
+\r
+Mogul & Postel                                                 [Page 16]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+   Network Number\r
+\r
+      The network field of the Internet address.\r
+\r
+   Subnet\r
+\r
+      One or more physical networks forming a subset of an Internet\r
+      network.  A subnet is explicitly identified in the Internet\r
+      address.\r
+\r
+   Subnet Field\r
+\r
+      The bit field in an Internet address denoting the subnet number.\r
+      The bits making up this field are not necessarily contiguous in\r
+      the address.\r
+\r
+   Subnet Number\r
+\r
+      A number identifying a subnet within a network.\r
+\r
+Appendix IV.  Assigned Numbers\r
+\r
+   The following assignments are made for protocol parameters used in\r
+   the support of subnets.  The only assignments needed are for the\r
+   Internet Control Message Protocol (ICMP) [5].\r
+\r
+   ICMP Message Types\r
+\r
+      AM1 = 17\r
+\r
+      AM2 = 18\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                 [Page 17]\r
+\f\r
+\r
+\r
+RFC 950                                                      August 1985\r
+Internet Standard Subnetting Procedure\r
+\r
+\r
+References\r
+\r
+   [1]  Mogul, J., "Internet Subnets", RFC-917, Stanford University,\r
+        October 1984.\r
+\r
+   [2]  Postel, J., "Multi-LAN Address Resolution", RFC-925,\r
+        USC/Information Sciences Institute, October 1984.\r
+\r
+   [3]  Postel, J., "Internet Protocol", RFC-791, USC/Information\r
+        Sciences Institute, September 1981.\r
+\r
+   [4]  Finlayson, R., T. Mann, J. Mogul, M. Theimer, "A Reverse Address\r
+        Resolution Protocol", RFC-903, Stanford University, June 1984.\r
+\r
+   [5]  Postel, J., "Internet Control Message Protocol", RFC-792,\r
+        USC/Information Sciences Institute, September 1981.\r
+\r
+   [6]  Mogul, J., "Broadcasting Internet Datagrams", RFC-919, Stanford\r
+        University, October 1984.\r
+\r
+   [7]  GADS, "Towards an Internet Standard Scheme for Subnetting",\r
+        RFC-940, Network Information Center, SRI International,\r
+        April 1985.\r
+\r
+   [8]  Croft, B., and J. Gilmore, "BOOTP -- UDP Bootstrap Protocol",\r
+        RFC-951, Stanford University, August 1985.\r
+\r
+   [9]  Reynolds, J., and J. Postel, "Assigned Numbers", RFC-943,\r
+        USC/Information Sciences Institute, April 1985.\r
+\r
+   \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul & Postel                                                 [Page 18]\r
+\f\r
+========================================================================\r
+\r
+Network Working Group                                      Jeffrey Mogul\r
+Request for Comments: 919                    Computer Science Department\r
+                                                     Stanford University\r
+                                                            October 1984\r
+\r
+                     BROADCASTING INTERNET DATAGRAMS\r
+\r
+\r
+Status of this Memo\r
+\r
+   We propose simple rules for broadcasting Internet datagrams on local\r
+   networks that support broadcast, for addressing broadcasts, and for\r
+   how gateways should handle them.\r
+\r
+   This RFC suggests a proposed protocol for the ARPA-Internet\r
+   community, and requests discussion and suggestions for improvements.\r
+   Distribution of this memo is unlimited.\r
+\r
+Acknowledgement\r
+\r
+   This proposal is the result of discussion with several other people,\r
+   especially J. Noel Chiappa and Christopher A. Kent, both of whom both\r
+   pointed me at important references.\r
+\r
+1. Introduction\r
+\r
+   The use of broadcasts, especially on high-speed local area networks,\r
+   is a good base for many applications.  Since broadcasting is not\r
+   covered in the basic IP specification [13], there is no agreed-upon\r
+   way to do it, and so protocol designers have not made use of it. (The\r
+   issue has been touched upon before, e.g. [6], but has not been the\r
+   subject of a standard.)\r
+\r
+   We consider here only the case of unreliable, unsequenced, possibly\r
+   duplicated datagram broadcasts (for a discussion of TCP broadcasting,\r
+   see [11].) Even though unreliable and limited in length, datagram\r
+   broadcasts are quite useful [1].\r
+\r
+   We assume that the data link layer of the local network supports\r
+   efficient broadcasting.  Most common local area networks do support\r
+   broadcast; for example, Ethernet [7, 5], ChaosNet [10], token ring\r
+   networks [2], etc.\r
+\r
+   We do not assume, however, that broadcasts are reliably delivered.\r
+   (One might consider providing a reliable broadcast protocol as a\r
+   layer above IP.) It is quite expensive to guarantee delivery of\r
+   broadcasts; instead, what we assume is that a host will receive most\r
+   of the broadcasts that are sent.  This is important to avoid\r
+   excessive use of broadcasts; since every host on the network devotes\r
+   at least some effort to every broadcast, they are costly.\r
+\r
+\r
+\r
+Mogul                                                           [Page 1]\r
+\f\r
+\r
+\r
+RFC 919                                                     October 1984\r
+Broadcasting Internet Datagrams\r
+\r
+\r
+   When a datagram is broadcast, it imposes a cost on every host that\r
+   hears it.  Therefore, broadcasting should not be used\r
+   indiscriminately, but rather only when it is the best solution to a\r
+   problem.\r
+\r
+   Note: some organizations have divided their IP networks into subnets,\r
+   for which a standard [8] has been proposed.  This RFC does not cover\r
+   the numerous complications arising from the interactions between\r
+   subnets and broadcasting; see [9] for a complete discussion.\r
+\r
+2. Terminology\r
+\r
+   Because broadcasting depends on the specific data link layer in use\r
+   on a local network, we must discuss it with reference to both\r
+   physical networks and logical networks.\r
+\r
+   The terms we will use in referring to physical networks are, from the\r
+   point of view of the host sending or forwarding a broadcast:\r
+\r
+   Local Hardware Network\r
+\r
+      The physical link to which the host is attached.\r
+\r
+   Remote Hardware Network\r
+\r
+      A physical network which is separated from the host by at least\r
+      one gateway.\r
+\r
+   Collection of Hardware Networks\r
+\r
+      A set of hardware networks (transitively) connected by gateways.\r
+\r
+   The IP world includes several kinds of logical network.  To avoid\r
+   ambiguity, we will use the following terms:\r
+\r
+   Internet\r
+\r
+      The DARPA Internet collection of IP networks.\r
+\r
+   IP Network\r
+\r
+      One or a collection of several hardware networks that have one\r
+      specific IP network number.\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 2]\r
+\f\r
+\r
+\r
+RFC 919                                                     October 1984\r
+Broadcasting Internet Datagrams\r
+\r
+\r
+3. Why Broadcast?\r
+\r
+   Broadcasts are useful when a host needs to find information without\r
+   knowing exactly what other host can supply it, or when a host wants\r
+   to provide information to a large set of hosts in a timely manner.\r
+\r
+   When a host needs information that one or more of its neighbors might\r
+   have, it could have a list of neighbors to ask, or it could poll all\r
+   of its possible neighbors until one responds.  Use of a wired-in list\r
+   creates obvious network management problems (early binding is\r
+   inflexible).  On the other hand, asking all of one's neighbors is\r
+   slow if one must generate plausible host addresses, and try them\r
+   until one works.  On the ARPANET, for example, there are roughly 65\r
+   thousand plausible host numbers.  Most IP implementations have used\r
+   wired-in lists (for example, addresses of "Prime" gateways.)\r
+   Fortunately, broadcasting provides a fast and simple way for a host\r
+   to reach all of its neighbors.\r
+\r
+   A host might also use a broadcast to provide all of its neighbors\r
+   with some information; for example, a gateway might announce its\r
+   presence to other gateways.\r
+\r
+   One way to view broadcasting is as an imperfect substitute for\r
+   multicasting, the sending of messages to a subset of the hosts on a\r
+   network.  In practice, broadcasts are usually used where multicasts\r
+   are what is wanted; packets are broadcast at the hardware level, but\r
+   filtering software in the receiving hosts gives the effect of\r
+   multicasting.\r
+\r
+   For more examples of broadcast applications, see [1, 3].\r
+\r
+4. Broadcast Classes\r
+\r
+   There are several classes of IP broadcasting:\r
+\r
+      - Single-destination datagram broadcast on the local IP net: A\r
+        datagrams is destined for a specific IP host, but the sending\r
+        host broadcasts it at the data link layer, perhaps to avoid\r
+        having to do routing.  Since this is not an IP broadcast, the IP\r
+        layer is not involved, except that a host should discard\r
+        datagrams not meant for it without becoming flustered (i.e.,\r
+        printing an error message).\r
+\r
+      - Broadcast to all hosts on the local IP net: A distinguished\r
+        value for the host-number part of the IP address denotes\r
+        broadcast instead of a specific host.  The receiving IP layer\r
+        must be able to recognize this address as well as its own.\r
+\r
+\r
+Mogul                                                           [Page 3]\r
+\f\r
+\r
+\r
+RFC 919                                                     October 1984\r
+Broadcasting Internet Datagrams\r
+\r
+\r
+        However, it might still be useful to distinguish at higher\r
+        levels between broadcasts and non-broadcasts, especially in\r
+        gateways. This is the most useful case of broadcast; it allows a\r
+        host to discover gateways without wired-in tables, it is the\r
+        basis for address resolution protocols, and it is also useful\r
+        for accessing such utilities as name servers, time servers,\r
+        etc., without requiring wired-in addresses.\r
+\r
+      - Broadcast to all hosts on a remote IP network: It is\r
+        occasionally useful to send a broadcast to all hosts on a\r
+        non-local network; for example, to find the latest version of a\r
+        hostname database, to bootload a host on an IP network without a\r
+        bootserver, or to monitor the timeservers on the IP network.\r
+        This case is the same as local-network broadcasts; the datagram\r
+        is routed by normal mechanisms until it reaches a gateway\r
+        attached to the destination IP network, at which point it is\r
+        broadcast. This class of broadcasting is also known as "directed\r
+        broadcasting", or quaintly as sending a "letter bomb" [1].\r
+\r
+      - Broadcast to the entire Internet: This is probably not useful,\r
+        and almost certainly not desirable.\r
+\r
+   For reasons of performance or security, a gateway may choose not to\r
+   forward broadcasts; especially, it may be a good idea to ban\r
+   broadcasts into or out of an autonomous group of networks.\r
+\r
+5. Broadcast Methods\r
+\r
+   A host's IP receiving layer must be modified to support broadcasting.\r
+   In the absence of broadcasting, a host determines if it is the\r
+   recipient of a datagram by matching the destination address against\r
+   all of its IP addresses.  With broadcasting, a host must compare the\r
+   destination address not only against the host's addresses, but also\r
+   against the possible broadcast addresses for that host.\r
+\r
+   The problem of how best to send a broadcast has been extensively\r
+   discussed [1, 3, 4, 14, 15].  Since we assume that the problem has\r
+   already been solved at the data link layer, an IP host wishing to\r
+   send either a local broadcast or a directed broadcast need only\r
+   specify the appropriate destination address and send the datagram as\r
+   usual.  Any sophisticated algorithms need only reside in gateways.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 4]\r
+\f\r
+\r
+\r
+RFC 919                                                     October 1984\r
+Broadcasting Internet Datagrams\r
+\r
+\r
+6. Gateways and Broadcasts\r
+\r
+   Most of the complexity in supporting broadcasts lies in gateways.  If\r
+   a gateway receives a directed broadcast for a network to which it is\r
+   not connected, it simply forwards it using the usual mechanism.\r
+   Otherwise, it must do some additional work.\r
+\r
+   When a gateway receives a local broadcast datagram, there are several\r
+   things it might have to do with it.  The situation is unambiguous,\r
+   but without due care it is possible to create infinite loops.\r
+\r
+   The appropriate action to take on receipt of a broadcast datagram\r
+   depends on several things: the subnet it was received on, the\r
+   destination network, and the addresses of the gateway.\r
+\r
+      - The primary rule for avoiding loops is "never broadcast a\r
+        datagram on the hardware network it was received on". It is not\r
+        sufficient simply to avoid repeating datagrams that a gateway\r
+        has heard from itself; this still allows loops if there are\r
+        several gateways on a hardware network.\r
+\r
+      - If the datagram is received on the hardware network to which it\r
+        is addressed, then it should not be forwarded.  However, the\r
+        gateway should consider itself to be a destination of the\r
+        datagram (for example, it might be a routing table update.)\r
+\r
+      - Otherwise, if the datagram is addressed to a hardware network to\r
+        which the gateway is connected, it should be sent as a (data\r
+        link layer) broadcast on that network.  Again, the gateway\r
+        should consider itself a destination of the datagram.\r
+\r
+      - Otherwise, the gateway should use its normal routing procedure\r
+        to choose a subsequent gateway, and send the datagram along to\r
+        it.\r
+\r
+7. Broadcast IP Addressing - Proposed Standards\r
+\r
+   If different IP implementations are to be compatible, there must be a\r
+   distinguished number to denote "all hosts".\r
+\r
+   Since the local network layer can always map an IP address into data\r
+   link layer address, the choice of an IP "broadcast host number" is\r
+   somewhat arbitrary.  For simplicity, it should be one not likely to\r
+   be assigned to a real host.  The number whose bits are all ones has\r
+   this property; this assignment was first proposed in [6].  In the few\r
+   cases where a host has been assigned an address with a host-number\r
+   part of all ones, it does not seem onerous to require renumbering.\r
+\r
+\r
+Mogul                                                           [Page 5]\r
+\f\r
+\r
+\r
+RFC 919                                                     October 1984\r
+Broadcasting Internet Datagrams\r
+\r
+\r
+   The address 255.255.255.255 denotes a broadcast on a local hardware\r
+   network, which must not be forwarded.  This address may be used, for\r
+   example, by hosts that do not know their network number and are\r
+   asking some server for it.\r
+\r
+   Thus, a host on net 36, for example, may:\r
+\r
+      - broadcast to all of its immediate neighbors by using\r
+        255.255.255.255\r
+\r
+      - broadcast to all of net 36 by using 36.255.255.255\r
+\r
+   (Note that unless the network has been broken up into subnets, these\r
+   two methods have identical effects.)\r
+\r
+   If the use of "all ones" in a field of an IP address means\r
+   "broadcast", using "all zeros" could be viewed as meaning\r
+   "unspecified".  There is probably no reason for such addresses to\r
+   appear anywhere but as the source address of an ICMP Information\r
+   Request datagram.  However, as a notational convention, we refer to\r
+   networks (as opposed to hosts) by using addresses with zero fields.\r
+   For example, 36.0.0.0 means "network number 36" while 36.255.255.255\r
+   means "all hosts on network number 36".\r
+\r
+   7.1. ARP Servers and Broadcasts\r
+\r
+      The Address Resolution Protocol (ARP) described in [12] can, if\r
+      incorrectly implemented, cause problems when broadcasts are used\r
+      on a network where not all hosts share an understanding of what a\r
+      broadcast address is.  The temptation exists to modify the ARP\r
+      server so that it provides the mapping between an IP broadcast\r
+      address and the hardware broadcast address.\r
+\r
+      This temptation must be resisted.  An ARP server should never\r
+      respond to a request whose target is a broadcast address.  Such a\r
+      request can only come from a host that does not recognize the\r
+      broadcast address as such, and so honoring it would almost\r
+      certainly lead to a forwarding loop.  If there are N such hosts on\r
+      the physical network that do not recognize this address as a\r
+      broadcast, then a datagram sent with a Time-To-Live of T could\r
+      potentially give rise to T**N spurious re-broadcasts.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 6]\r
+\f\r
+\r
+\r
+RFC 919                                                     October 1984\r
+Broadcasting Internet Datagrams\r
+\r
+\r
+8. References\r
+\r
+   1.   David Reeves Boggs.  Internet Broadcasting.  Ph.D. Th., Stanford\r
+        University, January 1982.\r
+\r
+   2.   D.D. Clark, K.T. Pogran, and D.P. Reed.  "An Introduction to\r
+        Local Area Networks".  Proc. IEEE 66, 11, pp1497-1516, 1978.\r
+\r
+   3.   Yogan Kantilal Dalal.  Broadcast Protocols in Packet Switched\r
+        Computer Networks.  Ph.D. Th., Stanford University, April 1977.\r
+\r
+   4.   Yogan K. Dalal and Robert M. Metcalfe.  "Reverse Path Forwarding\r
+        of Broadcast Packets".  Comm. ACM 21, 12, pp1040-1048, December\r
+        1978.\r
+\r
+   5.   The Ethernet, A Local Area Network: Data Link Layer and Physical\r
+        Layer Specifications.  Version 1.0, Digital Equipment\r
+        Corporation, Intel, Xerox, September 1980.\r
+\r
+   6.   Robert Gurwitz and Robert Hinden.  IP - Local Area Network\r
+        Addressing Issues.  IEN-212, Bolt Beranek and Newman, September\r
+        1982.\r
+\r
+   7.    R.M. Metcalfe and D.R. Boggs. "Ethernet: Distributed Packet\r
+        Switching for Local Computer Networks".  Comm. ACM 19, 7,\r
+        pp395-404, July 1976.  Also CSL-75-7, Xerox Palo Alto Research\r
+        Center, reprinted in CSL-80-2.\r
+\r
+   8.   Jeffrey Mogul.  Internet Subnets.  RFC-917, Stanford University,\r
+        October 1984.\r
+\r
+   9.   Jeffrey Mogul.  Broadcasting Internet Packets in the Presence of\r
+        Subnets.  RFC-922, Stanford University, October 1984.\r
+\r
+   10.  David A. Moon.  Chaosnet.  A.I. Memo 628, Massachusetts\r
+        Institute of Technology Artificial Intelligence Laboratory, June\r
+        1981.\r
+\r
+   11.  William W. Plummer.  Internet Broadcast Protocols.  IEN-10, Bolt\r
+        Beranek and Newman, March 1977.\r
+\r
+   12.  David Plummer.  An Ethernet Address Resolution Protocol.\r
+        RFC-826, Symbolics, September 1982.\r
+\r
+   13.  Jon Postel.  Internet Protocol.  RFC 791, ISI, September 1981.\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 7]\r
+\f\r
+\r
+\r
+RFC 919                                                     October 1984\r
+Broadcasting Internet Datagrams\r
+\r
+\r
+   14.  David W. Wall.  Mechanisms for Broadcast and Selective\r
+        Broadcast.  Ph.D. Th., Stanford University, June 1980.\r
+\r
+   15.  David W. Wall and Susan S. Owicki.  Center-based Broadcasting.\r
+        Computer Systems Lab Technical Report TR189, Stanford\r
+        University, June 1980.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 8]\r
+\f\r
+========================================================================\r
+\r
+Network Working Group                                      Jeffrey Mogul\r
+Request for Comments: 922                    Computer Science Department\r
+                                                     Stanford University\r
+                                                            October 1984\r
+\r
+       BROADCASTING INTERNET DATAGRAMS IN THE PRESENCE OF SUBNETS\r
+\r
+\r
+Status of this Memo\r
+\r
+   We propose simple rules for broadcasting Internet datagrams on local\r
+   networks that support broadcast, for addressing broadcasts, and for\r
+   how gateways should handle them.\r
+\r
+   This RFC suggests a proposed protocol for the ARPA-Internet\r
+   community, and requests discussion and suggestions for improvements.\r
+   Distribution of this memo is unlimited.\r
+\r
+Acknowledgement\r
+\r
+   This proposal here is the result of discussion with several other\r
+   people, especially J. Noel Chiappa and Christopher A. Kent, both of\r
+   whom both pointed me at important references.\r
+\r
+1. Introduction\r
+\r
+   The use of broadcasts, especially on high-speed local area networks,\r
+   is a good base for many applications.  Since broadcasting is not\r
+   covered in the basic IP specification [12], there is no agreed-upon\r
+   way to do it, and so protocol designers have not made use of it. (The\r
+   issue has been touched upon before, e.g. [6], but has not been the\r
+   subject of a standard.)\r
+\r
+   We consider here only the case of unreliable, unsequenced, possibly\r
+   duplicated datagram broadcasts (for a discussion of TCP broadcasting,\r
+   see [10].) Even though unreliable and limited in length, datagram\r
+   broadcasts are quite useful [1].\r
+\r
+   We assume that the data link layer of the local network supports\r
+   efficient broadcasting.  Most common local area networks do support\r
+   broadcast; for example, Ethernet [7, 5], ChaosNet [9], token ring\r
+   networks [2], etc.\r
+\r
+   We do not assume, however, that broadcasts are reliably delivered.\r
+   (One might consider providing a reliable datagram broadcast protocol\r
+   as a layer above IP.) It is quite expensive to guarantee delivery of\r
+   broadcasts; instead, what we assume is that a host will receive most\r
+   of the broadcasts that are sent.  This is important to avoid\r
+   excessive use of broadcasts; since every host on the network devotes\r
+   at least some effort to every broadcast, they are costly.\r
+\r
+\r
+\r
+Mogul                                                           [Page 1]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+   When a datagram is broadcast, it imposes a cost on every host that\r
+   hears it.  Therefore, broadcasting should not be used\r
+   indiscriminately, but rather only when it is the best solution to a\r
+   problem.\r
+\r
+2. Terminology\r
+\r
+   Because broadcasting depends on the specific data link layer in use\r
+   on a local network, we must discuss it with reference to both\r
+   physical networks and logical networks.\r
+\r
+   The terms we will use in referring to physical networks are, from the\r
+   point of view of the host sending or forwarding a broadcast:\r
+\r
+   Local Hardware Network\r
+\r
+      The physical link to which the host is attached.\r
+\r
+   Remote Hardware Network\r
+\r
+      A physical network which is separated from the host by at least\r
+      one gateway.\r
+\r
+   Collection of Hardware Networks\r
+\r
+      A set of hardware networks (transitively) connected by gateways.\r
+\r
+   The IP world includes several kinds of logical network.  To avoid\r
+   ambiguity, we will use the following terms:\r
+\r
+   Internet\r
+\r
+      The DARPA Internet collection of IP networks.\r
+\r
+   IP Network\r
+\r
+      One or a collection of several hardware networks that have one\r
+      specific IP network number.\r
+\r
+   Subnet\r
+\r
+      A single member of the collection of hardware networks that\r
+      compose an IP network.  Host addresses on a given subnet share an\r
+      IP network number with hosts on all other subnets of that IP\r
+      network, but the local-address part is divided into subnet-number\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 2]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+      and host-number fields to indicate which subnet a host is on.  We\r
+      do not assume a particular division of the local-address part;\r
+      this could vary from network to network.\r
+\r
+   The introduction of a subnet level in the addressing hierarchy is at\r
+   variance with the IP specification [12], but as the use of\r
+   addressable subnets proliferates it is obvious that a broadcasting\r
+   scheme should support subnetting.  For more on subnets, see [8].\r
+\r
+   In this paper, the term "host address" refers to the host-on-subnet\r
+   address field of a subnetted IP network, or the host-part field\r
+   otherwise.\r
+\r
+   An IP network may consist of a single hardware network or a\r
+   collection of subnets; from the point of view of a host on another IP\r
+   network, it should not matter.\r
+\r
+3. Why Broadcast?\r
+\r
+   Broadcasts are useful when a host needs to find information without\r
+   knowing exactly what other host can supply it, or when a host wants\r
+   to provide information to a large set of hosts in a timely manner.\r
+\r
+   When a host needs information that one or more of its neighbors might\r
+   have, it could have a list of neighbors to ask, or it could poll all\r
+   of its possible neighbors until one responds.  Use of a wired-in list\r
+   creates obvious network management problems (early binding is\r
+   inflexible).  On the other hand, asking all of one's neighbors is\r
+   slow if one must generate plausible host addresses, and try them\r
+   until one works.  On the ARPANET, for example, there are roughly 65\r
+   thousand plausible host numbers.  Most IP implementations have used\r
+   wired-in lists (for example, addresses of "Prime" gateways.)\r
+   Fortunately, broadcasting provides a fast and simple way for a host\r
+   to reach all of its neighbors.\r
+\r
+   A host might also use a broadcast to provide all of its neighbors\r
+   with some information; for example, a gateway might announce its\r
+   presence to other gateways.\r
+\r
+   One way to view broadcasting is as an imperfect substitute for\r
+   multicasting, the sending of messages to a subset of the hosts on a\r
+   network.  In practice, broadcasts are usually used where multicasts\r
+   are what is wanted; datagrams are broadcast at the hardware level,\r
+   but filtering software in the receiving hosts gives the effect of\r
+   multicasting.\r
+\r
+   For more examples of broadcast applications, see [1, 3].\r
+\r
+\r
+Mogul                                                           [Page 3]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+4. Broadcast Classes\r
+\r
+   There are several classes of IP broadcasting:\r
+\r
+      - Single-destination datagrams broadcast on the local hardware\r
+        net: A datagram is destined for a specific IP host, but the\r
+        sending host broadcasts it at the data link layer, perhaps to\r
+        avoid having to do routing.  Since this is not an IP broadcast,\r
+        the IP layer is not involved, except that a host should discard\r
+        datagram not meant for it without becoming flustered (i.e.,\r
+        printing an error message).\r
+\r
+      - Broadcast to all hosts on the local hardware net: A\r
+        distinguished value for the host-number part of the IP address\r
+        denotes broadcast instead of a specific host.  The receiving IP\r
+        layer must be able to recognize this address as well as its own.\r
+        However, it might still be useful to distinguish at higher\r
+        levels between broadcasts and non-broadcasts, especially in\r
+        gateways.  This is the most useful case of broadcast; it allows\r
+        a host to discover gateways without wired-in tables, it is the\r
+        basis for address resolution protocols, and it is also useful\r
+        for accessing such utilities as name servers, time servers,\r
+        etc., without requiring wired-in addresses.\r
+\r
+      - Broadcast to all hosts on a remote hardware network: It is\r
+        occasionally useful to send a broadcast to all hosts on a\r
+        non-local network; for example, to find the latest version of a\r
+        hostname database, to bootload a host on a subnet without a\r
+        bootserver, or to monitor the timeservers on the subnet.  This\r
+        case is the same as local-network broadcasts; the datagram is\r
+        routed by normal mechanisms until it reaches a gateway attached\r
+        to the destination hardware network, at which point it is\r
+        broadcast.  This class of broadcasting is also known as\r
+        "directed broadcasting", or quaintly as sending a "letter bomb"\r
+        [1].\r
+\r
+      - Broadcast to all hosts on a subnetted IP network (Multi-subnet\r
+        broadcasts): A distinguished value for the subnet-number part of\r
+        the IP address is used to denote "all subnets".  Broadcasts to\r
+        all hosts of a remote subnetted IP network are done just as\r
+        directed broadcasts to a single subnet.\r
+\r
+      - Broadcast to the entire Internet: This is probably not useful,\r
+        and almost certainly not desirable.\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 4]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+   For reasons of performance or security, a gateway may choose not to\r
+   forward broadcasts; especially, it may be a good idea to ban\r
+   broadcasts into or out of an autonomous group of networks.\r
+\r
+5. Broadcast Methods\r
+\r
+   A host's IP receiving layer must be modified to support broadcasting.\r
+   In the absence of broadcasting, a host determines if it is the\r
+   recipient of a datagram by matching the destination address against\r
+   all of its IP addresses.  With broadcasting, a host must compare the\r
+   destination address not only against the host's addresses, but also\r
+   against the possible broadcast addresses for that host.\r
+\r
+   The problem of how best to send a broadcast has been extensively\r
+   discussed [1, 3, 4, 13, 14].  Since we assume that the problem has\r
+   already been solved at the data link layer, an IP host wishing to\r
+   send either a local broadcast or a directed broadcast need only\r
+   specify the appropriate destination address and send the datagram as\r
+   usual.  Any sophisticated algorithms need only reside in gateways.\r
+\r
+   The problem of broadcasting to all hosts on a subnetted IP network is\r
+   apparently somewhat harder.  However, even in this case it turns out\r
+   that the best known algorithms require no additional complexity in\r
+   non-gateway hosts.  A good broadcast method will meet these\r
+   additional criteria:\r
+\r
+      - No modification of the IP datagram format.\r
+\r
+      - Reasonable efficiency in terms of the number of excess copies\r
+        generated and the cost of paths chosen.\r
+\r
+      - Minimization of gateway modification, in both code and data\r
+        space.\r
+\r
+      - High likelihood of delivery.\r
+\r
+   The algorithm that appears best is the Reverse Path Forwarding (RPF)\r
+   method [4].  While RPF is suboptimal in cost and reliability, it is\r
+   quite good, and is extremely simple to implement, requiring no\r
+   additional data space in a gateway.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 5]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+6. Gateways and Broadcasts\r
+\r
+   Most of the complexity in supporting broadcasts lies in gateways.  If\r
+   a gateway receives a directed broadcast for a network to which it is\r
+   not connected, it simply forwards it using the usual mechanism.\r
+   Otherwise, it must do some additional work.\r
+\r
+   6.1. Local Broadcasts\r
+\r
+      When a gateway receives a local broadcast datagram, there are\r
+      several things it might have to do with it.  The situation is\r
+      unambiguous, but without due care it is possible to create\r
+      infinite loops.\r
+\r
+      The appropriate action to take on receipt of a broadcast datagram\r
+      depends on several things: the subnet it was received on, the\r
+      destination network, and the addresses of the gateway.\r
+\r
+         - The primary rule for avoiding loops is "never broadcast a\r
+           datagram on the hardware network it was received on". It is\r
+           not sufficient simply to avoid repeating datagram that a\r
+           gateway has heard from itself; this still allows loops if\r
+           there are several gateways on a hardware network.\r
+\r
+         - If the datagram is received on the hardware network to which\r
+           it is addressed, then it should not be forwarded.  However,\r
+           the gateway should consider itself to be a destination of the\r
+           datagram (for example, it might be a routing table update.)\r
+\r
+         - Otherwise, if the datagram is addressed to a hardware network\r
+           to which the gateway is connected, it should be sent as a\r
+           (data link layer) broadcast on that network.  Again, the\r
+           gateway should consider itself a destination of the datagram.\r
+\r
+         - Otherwise, the gateway should use its normal routing\r
+           procedure to choose a subsequent gateway, and send the\r
+           datagram along to it.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 6]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+   6.2. Multi-subnet broadcasts\r
+\r
+      When a gateway receives a broadcast meant for all subnets of an IP\r
+      network, it must use the Reverse Path Forwarding algorithm to\r
+      decide what to do.  The method is simple: the gateway should\r
+      forward copies of the datagram along all connected links, if and\r
+      only if the datagram arrived on the link which is part of the best\r
+      route between the gateway and the source of the datagram.\r
+      Otherwise, the datagram should be discarded.\r
+\r
+      This algorithm may be improved if some or all of the gateways\r
+      exchange among themselves additional information; this can be done\r
+      transparently from the point of view of other hosts and even other\r
+      gateways.  See [4, 3] for details.\r
+\r
+   6.3. Pseudo-Algol Routing Algorithm\r
+\r
+      This is a pseudo-Algol description of the routing algorithm a\r
+      gateway should use.  The algorithm is shown in figure 1.  Some\r
+      definitions are:\r
+\r
+      RouteLink(host)\r
+\r
+         A function taking a host address as a parameter and returning\r
+         the first-hop link from the gateway to the host.\r
+\r
+      RouteHost(host)\r
+\r
+         As above but returns the first-hop host address.\r
+\r
+      ResolveAddress(host)\r
+\r
+         Returns the hardware address for an IP host.\r
+\r
+      IncomingLink\r
+\r
+         The link on which the packet arrived.\r
+\r
+      OutgoingLinkSet\r
+\r
+         The set of links on which the packet should be sent.\r
+\r
+      OutgoingHardwareHost\r
+\r
+         The hardware host address to send the packet to.\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 7]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+      Destination.host\r
+\r
+         The host-part of the destination address.\r
+\r
+      Destination.subnet\r
+\r
+         The subnet-part of the destination address.\r
+\r
+      Destination.ipnet\r
+\r
+         The IP-network-part of the destination address.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                           [Page 8]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+BEGIN\r
+   IF Destination.ipnet IN AllLinks THEN\r
+      BEGIN\r
+         IF IsSubnetted(Destination.ipnet) THEN\r
+            BEGIN\r
+               IF Destination.subnet = BroadcastSubnet THEN\r
+                  BEGIN      /* use Reverse Path Forwarding algorithm */\r
+                     IF IncomingLink = RouteLink(Source) THEN\r
+                        BEGIN IF Destination.host = BroadcastHost THEN\r
+                              OutgoingLinkSet <- AllLinks -\r
+                           IncomingLink;\r
+                           OutgoingHost <- BroadcastHost;\r
+                           Examine packet for possible internal use;\r
+                        END\r
+                     ELSE  /* duplicate from another gateway, discard */\r
+                        Discard;\r
+                  END\r
+               ELSE\r
+                  IF Destination.subnet = IncomingLink.subnet THEN\r
+                     BEGIN           /* forwarding would cause a loop */\r
+                        IF Destination.host = BroadcastHost THEN\r
+                           Examine packet for possible internal use;\r
+                        Discard;\r
+                     END\r
+                  ELSE BEGIN    /* forward to (possibly local) subnet */\r
+                        OutgoingLinkSet <- RouteLink(Destination);\r
+                        OutgoingHost <- RouteHost(Destination);\r
+                     END\r
+            END\r
+         ELSE BEGIN         /* destined for one of our local networks */\r
+               IF Destination.ipnet = IncomingLink.ipnet THEN\r
+                  BEGIN              /* forwarding would cause a loop */\r
+                     IF Destination.host = BroadcastHost THEN\r
+                        Examine packet for possible internal use;\r
+                     Discard;\r
+                  END\r
+               ELSE BEGIN                     /* might be a broadcast */\r
+                     OutgoingLinkSet <- RouteLink(Destination);\r
+                     OutgoingHost <- RouteHost(Destination);\r
+                  END\r
+            END\r
+      END\r
+   ELSE BEGIN                    /* forward to a non-local IP network */\r
+         OutgoingLinkSet <- RouteLink(Destination);\r
+         OutgoingHost <- RouteHost(Destination);\r
+      END\r
+   OutgoingHardwareHost <- ResolveAddress(OutgoingHost);\r
+END\r
+\r
+Figure 1: Pseudo-Algol algorithm for routing broadcasts by gateways\r
+\r
+Mogul                                                           [Page 9]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+7. Broadcast IP Addressing - Conventions\r
+\r
+   If different IP implementations are to be compatible, there must be\r
+   convention distinguished number to denote "all hosts" and "all\r
+   subnets".\r
+\r
+   Since the local network layer can always map an IP address into data\r
+   link layer address, the choice of an IP "broadcast host number" is\r
+   somewhat arbitrary.  For simplicity, it should be one not likely to\r
+   be assigned to a real host.  The number whose bits are all ones has\r
+   this property; this assignment was first proposed in [6].  In the few\r
+   cases where a host has been assigned an address with a host-number\r
+   part of all ones, it does not seem onerous to require renumbering.\r
+\r
+   The "all subnets" number is also all ones; this means that a host\r
+   wishing to broadcast to all hosts on a remote IP network need not\r
+   know how the destination address is divided up into subnet and host\r
+   fields, or if it is even divided at all.  For example, 36.255.255.255\r
+   may denote all the hosts on a single hardware network, or all the\r
+   hosts on a subnetted IP network with 1 byte of subnet field and 2\r
+   bytes of host field, or any other possible division.\r
+\r
+   The address 255.255.255.255 denotes a broadcast on a local hardware\r
+   network that must not be forwarded.  This address may be used, for\r
+   example, by hosts that do not know their network number and are\r
+   asking some server for it.\r
+\r
+   Thus, a host on net 36, for example, may:\r
+\r
+      - broadcast to all of its immediate neighbors by using\r
+        255.255.255.255\r
+\r
+      - broadcast to all of net 36 by using 36.255.255.255\r
+\r
+   without knowing if the net is subnetted; if it is not, then both\r
+   addresses have the same effect. A robust application might try the\r
+   former address, and if no response is received, then try the latter.\r
+   See [1] for a discussion of such "expanding ring search" techniques.\r
+\r
+   If the use of "all ones" in a field of an IP address means\r
+   "broadcast", using "all zeros" could be viewed as meaning\r
+   "unspecified".  There is probably no reason for such addresses to\r
+   appear anywhere but as the source address of an ICMP Information\r
+   Request datagram.  However, as a notational convention, we refer to\r
+   networks (as opposed to hosts) by using addresses with zero fields.\r
+   For example, 36.0.0.0 means "network number 36" while 36.255.255.255\r
+   means "all hosts on network number 36".\r
+\r
+\r
+Mogul                                                          [Page 10]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+   7.1. ARP Servers and Broadcasts\r
+\r
+      The Address Resolution Protocol (ARP) described in [11] can, if\r
+      incorrectly implemented, cause problems when broadcasts are used\r
+      on a network where not all hosts share an understanding of what a\r
+      broadcast address is.  The temptation exists to modify the ARP\r
+      server so that it provides the mapping between an IP broadcast\r
+      address and the hardware broadcast address.\r
+\r
+      This temptation must be resisted.  An ARP server should never\r
+      respond to a request whose target is a broadcast address.  Such a\r
+      request can only come from a host that does not recognize the\r
+      broadcast address as such, and so honoring it would almost\r
+      certainly lead to a forwarding loop.  If there are N such hosts on\r
+      the physical network that do not recognize this address as a\r
+      broadcast, then a datagram sent with a Time-To-Live of T could\r
+      potentially give rise to T**N spurious re-broadcasts.\r
+\r
+8. References\r
+\r
+   1.   David Reeves Boggs.  Internet Broadcasting.  Ph.D. Th., Stanford\r
+        University, January 1982.\r
+\r
+   2.   D.D. Clark, K.T. Pogran, and D.P. Reed.  "An Introduction to\r
+        Local Area Networks".  Proc. IEEE 66, 11, pp1497-1516,\r
+        November 1978.\r
+\r
+   3.   Yogan Kantilal Dalal.  Broadcast Protocols in Packet Switched\r
+        Computer Networks.  Ph.D. Th., Stanford University, April 1977.\r
+\r
+   4.   Yogan K. Dalal and Robert M. Metcalfe.  "Reverse Path Forwarding\r
+        of Broadcast Packets".  Comm. ACM 21, 12, pp1040-1048,\r
+        December 1978.\r
+\r
+   5.   The Ethernet, A Local Area Network: Data Link Layer and Physical\r
+        Layer Specifications.  Version 1.0, Digital Equipment\r
+        Corporation, Intel, Xerox, September 1980.\r
+\r
+   6.   Robert Gurwitz and Robert Hinden.  IP - Local Area Network\r
+        Addressing Issues.  IEN-212, BBN, September 1982.\r
+\r
+   7.   R.M. Metcalfe and D.R. Boggs.  "Ethernet: Distributed Packet\r
+        Switching for Local Computer Networks".  Comm. ACM 19, 7,\r
+        pp395-404, July 1976.  Also CSL-75-7, Xerox Palo Alto Research\r
+        Center, reprinted in CSL-80-2.\r
+\r
+\r
+\r
+\r
+Mogul                                                          [Page 11]\r
+\f\r
+\r
+\r
+RFC 922                                                     October 1984\r
+Broadcasting Internet Datagrams in the Presence of Subnets\r
+\r
+\r
+   8.   Jeffrey Mogul.  Internet Subnets.  RFC-917, Stanford University,\r
+        October 1984.\r
+\r
+   9.   David A. Moon.  Chaosnet.  A.I. Memo 628, Massachusetts\r
+        Institute of Technology Artificial Intelligence Laboratory,\r
+        June 1981.\r
+\r
+   10.  William W. Plummer.  Internet Broadcast Protocols.  IEN-10, BBN,\r
+        March 1977.\r
+\r
+   11.  David Plummer.  An Ethernet Address Resolution Protocol.\r
+        RFC-826, Symbolics, September 1982.\r
+\r
+   12.  Jon Postel.  Internet Protocol.  RFC-791, ISI, September 1981.\r
+\r
+   13.  David W. Wall.  Mechanisms for Broadcast and Selective\r
+        Broadcast.  Ph.D. Th., Stanford University, June 1980.\r
+\r
+   14.  David W. Wall and Susan S. Owicki.  Center-based Broadcasting.\r
+        Computer Systems Lab Technical Report TR189, Stanford\r
+        University, June 1980.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Mogul                                                          [Page 12]\r
+\f\r
+========================================================================\r
+\r
+Network Working Group                                          J. Postel\r
+Request for Comments:  792                                           ISI\r
+                                                          September 1981\r
+Updates:  RFCs 777, 760\r
+Updates:  IENs 109, 128\r
+\r
+                   INTERNET CONTROL MESSAGE PROTOCOL\r
+\r
+                         DARPA INTERNET PROGRAM\r
+                         PROTOCOL SPECIFICATION\r
+\r
+\r
+\r
+Introduction\r
+\r
+   The Internet Protocol (IP) [1] is used for host-to-host datagram\r
+   service in a system of interconnected networks called the\r
+   Catenet [2].  The network connecting devices are called Gateways.\r
+   These gateways communicate between themselves for control purposes\r
+   via a Gateway to Gateway Protocol (GGP) [3,4].  Occasionally a\r
+   gateway or destination host will communicate with a source host, for\r
+   example, to report an error in datagram processing.  For such\r
+   purposes this protocol, the Internet Control Message Protocol (ICMP),\r
+   is used.  ICMP, uses the basic support of IP as if it were a higher\r
+   level protocol, however, ICMP is actually an integral part of IP, and\r
+   must be implemented by every IP module.\r
+\r
+   ICMP messages are sent in several situations:  for example, when a\r
+   datagram cannot reach its destination, when the gateway does not have\r
+   the buffering capacity to forward a datagram, and when the gateway\r
+   can direct the host to send traffic on a shorter route.\r
+\r
+   The Internet Protocol is not designed to be absolutely reliable.  The\r
+   purpose of these control messages is to provide feedback about\r
+   problems in the communication environment, not to make IP reliable.\r
+   There are still no guarantees that a datagram will be delivered or a\r
+   control message will be returned.  Some datagrams may still be\r
+   undelivered without any report of their loss.  The higher level\r
+   protocols that use IP must implement their own reliability procedures\r
+   if reliable communication is required.\r
+\r
+   The ICMP messages typically report errors in the processing of\r
+   datagrams.  To avoid the infinite regress of messages about messages\r
+   etc., no ICMP messages are sent about ICMP messages.  Also ICMP\r
+   messages are only sent about errors in handling fragment zero of\r
+   fragemented datagrams.  (Fragment zero has the fragment offeset equal\r
+   zero).\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 1]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Message Formats\r
+\r
+   ICMP messages are sent using the basic IP header.  The first octet of\r
+   the data portion of the datagram is a ICMP type field; the value of\r
+   this field determines the format of the remaining data.  Any field\r
+   labeled "unused" is reserved for later extensions and must be zero\r
+   when sent, but receivers should not use these fields (except to\r
+   include them in the checksum).  Unless otherwise noted under the\r
+   individual format descriptions, the values of the internet header\r
+   fields are as follows:\r
+\r
+   Version\r
+\r
+      4\r
+\r
+   IHL\r
+\r
+      Internet header length in 32-bit words.\r
+\r
+   Type of Service\r
+\r
+      0\r
+\r
+   Total Length\r
+\r
+      Length of internet header and data in octets.\r
+\r
+   Identification, Flags, Fragment Offset\r
+\r
+      Used in fragmentation, see [1].\r
+\r
+   Time to Live\r
+\r
+      Time to live in seconds; as this field is decremented at each\r
+      machine in which the datagram is processed, the value in this\r
+      field should be at least as great as the number of gateways which\r
+      this datagram will traverse.\r
+\r
+   Protocol\r
+\r
+      ICMP = 1\r
+\r
+   Header Checksum\r
+\r
+      The 16 bit one's complement of the one's complement sum of all 16\r
+      bit words in the header.  For computing the checksum, the checksum\r
+      field should be zero.  This checksum may be replaced in the\r
+      future.\r
+\r
+\r
+[Page 2]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+   Source Address\r
+\r
+      The address of the gateway or host that composes the ICMP message.\r
+      Unless otherwise noted, this can be any of a gateway's addresses.\r
+\r
+   Destination Address\r
+\r
+      The address of the gateway or host to which the message should be\r
+      sent.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 3]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Destination Unreachable Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |     Code      |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             unused                            |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |      Internet Header + 64 bits of Original Data Datagram      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+   IP Fields:\r
+\r
+   Destination Address\r
+\r
+      The source network and address from the original datagram's data.\r
+\r
+   ICMP Fields:\r
+\r
+   Type\r
+\r
+      3\r
+\r
+   Code\r
+\r
+      0 = net unreachable;\r
+\r
+      1 = host unreachable;\r
+\r
+      2 = protocol unreachable;\r
+\r
+      3 = port unreachable;\r
+\r
+      4 = fragmentation needed and DF set;\r
+\r
+      5 = source route failed.\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      This checksum may be replaced in the future.\r
+\r
+   Internet Header + 64 bits of Data Datagram\r
+\r
+      The internet header plus the first 64 bits of the original\r
+\r
+\r
+[Page 4]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+      datagram's data.  This data is used by the host to match the\r
+      message to the appropriate process.  If a higher level protocol\r
+      uses port numbers, they are assumed to be in the first 64 data\r
+      bits of the original datagram's data.\r
+\r
+   Description\r
+\r
+      If, according to the information in the gateway's routing tables,\r
+      the network specified in the internet destination field of a\r
+      datagram is unreachable, e.g., the distance to the network is\r
+      infinity, the gateway may send a destination unreachable message\r
+      to the internet source host of the datagram.  In addition, in some\r
+      networks, the gateway may be able to determine if the internet\r
+      destination host is unreachable.  Gateways in these networks may\r
+      send destination unreachable messages to the source host when the\r
+      destination host is unreachable.\r
+\r
+      If, in the destination host, the IP module cannot deliver the\r
+      datagram  because the indicated protocol module or process port is\r
+      not active, the destination host may send a destination\r
+      unreachable message to the source host.\r
+\r
+      Another case is when a datagram must be fragmented to be forwarded\r
+      by a gateway yet the Don't Fragment flag is on.  In this case the\r
+      gateway must discard the datagram and may return a destination\r
+      unreachable message.\r
+\r
+      Codes 0, 1, 4, and 5 may be received from a gateway.  Codes 2 and\r
+      3 may be received from a host.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 5]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Time Exceeded Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |     Code      |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             unused                            |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |      Internet Header + 64 bits of Original Data Datagram      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+   IP Fields:\r
+\r
+   Destination Address\r
+\r
+      The source network and address from the original datagram's data.\r
+\r
+   ICMP Fields:\r
+\r
+   Type\r
+\r
+      11\r
+\r
+   Code\r
+\r
+      0 = time to live exceeded in transit;\r
+\r
+      1 = fragment reassembly time exceeded.\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      This checksum may be replaced in the future.\r
+\r
+   Internet Header + 64 bits of Data Datagram\r
+\r
+      The internet header plus the first 64 bits of the original\r
+      datagram's data.  This data is used by the host to match the\r
+      message to the appropriate process.  If a higher level protocol\r
+      uses port numbers, they are assumed to be in the first 64 data\r
+      bits of the original datagram's data.\r
+\r
+   Description\r
+\r
+      If the gateway processing a datagram finds the time to live field\r
+\r
+\r
+[Page 6]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+      is zero it must discard the datagram.  The gateway may also notify\r
+      the source host via the time exceeded message.\r
+\r
+      If a host reassembling a fragmented datagram cannot complete the\r
+      reassembly due to missing fragments within its time limit it\r
+      discards the datagram, and it may send a time exceeded message.\r
+\r
+      If fragment zero is not available then no time exceeded need be\r
+      sent at all.\r
+\r
+      Code 0 may be received from a gateway.  Code 1 may be received\r
+      from a host.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 7]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Parameter Problem Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |     Code      |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |    Pointer    |                   unused                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |      Internet Header + 64 bits of Original Data Datagram      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+   IP Fields:\r
+\r
+   Destination Address\r
+\r
+      The source network and address from the original datagram's data.\r
+\r
+   ICMP Fields:\r
+\r
+   Type\r
+\r
+      12\r
+\r
+   Code\r
+\r
+      0 = pointer indicates the error.\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      This checksum may be replaced in the future.\r
+\r
+   Pointer\r
+\r
+      If code = 0, identifies the octet where an error was detected.\r
+\r
+   Internet Header + 64 bits of Data Datagram\r
+\r
+      The internet header plus the first 64 bits of the original\r
+      datagram's data.  This data is used by the host to match the\r
+      message to the appropriate process.  If a higher level protocol\r
+      uses port numbers, they are assumed to be in the first 64 data\r
+      bits of the original datagram's data.\r
+\r
+\r
+\r
+\r
+[Page 8]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+   Description\r
+\r
+      If the gateway or host processing a datagram finds a problem with\r
+      the header parameters such that it cannot complete processing the\r
+      datagram it must discard the datagram.  One potential source of\r
+      such a problem is with incorrect arguments in an option.  The\r
+      gateway or host may also notify the source host via the parameter\r
+      problem message.  This message is only sent if the error caused\r
+      the datagram to be discarded.\r
+\r
+      The pointer identifies the octet of the original datagram's header\r
+      where the error was detected (it may be in the middle of an\r
+      option).  For example, 1 indicates something is wrong with the\r
+      Type of Service, and (if there are options present) 20 indicates\r
+      something is wrong with the type code of the first option.\r
+\r
+      Code 0 may be received from a gateway or a host.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 9]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Source Quench Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |     Code      |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             unused                            |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |      Internet Header + 64 bits of Original Data Datagram      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+   IP Fields:\r
+\r
+   Destination Address\r
+\r
+      The source network and address of the original datagram's data.\r
+\r
+   ICMP Fields:\r
+\r
+   Type\r
+\r
+      4\r
+\r
+   Code\r
+\r
+      0\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      This checksum may be replaced in the future.\r
+\r
+   Internet Header + 64 bits of Data Datagram\r
+\r
+      The internet header plus the first 64 bits of the original\r
+      datagram's data.  This data is used by the host to match the\r
+      message to the appropriate process.  If a higher level protocol\r
+      uses port numbers, they are assumed to be in the first 64 data\r
+      bits of the original datagram's data.\r
+\r
+   Description\r
+\r
+      A gateway may discard internet datagrams if it does not have the\r
+      buffer space needed to queue the datagrams for output to the next\r
+      network on the route to the destination network.  If a gateway\r
+\r
+\r
+[Page 10]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+      discards a datagram, it may send a source quench message to the\r
+      internet source host of the datagram.  A destination host may also\r
+      send a source quench message if datagrams arrive too fast to be\r
+      processed.  The source quench message is a request to the host to\r
+      cut back the rate at which it is sending traffic to the internet\r
+      destination.  The gateway may send a source quench message for\r
+      every message that it discards.  On receipt of a source quench\r
+      message, the source host should cut back the rate at which it is\r
+      sending traffic to the specified destination until it no longer\r
+      receives source quench messages from the gateway.  The source host\r
+      can then gradually increase the rate at which it sends traffic to\r
+      the destination until it again receives source quench messages.\r
+\r
+      The gateway or host may send the source quench message when it\r
+      approaches its capacity limit rather than waiting until the\r
+      capacity is exceeded.  This means that the data datagram which\r
+      triggered the source quench message may be delivered.\r
+\r
+      Code 0 may be received from a gateway or a host.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 11]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Redirect Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |     Code      |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                 Gateway Internet Address                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |      Internet Header + 64 bits of Original Data Datagram      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+   IP Fields:\r
+\r
+   Destination Address\r
+\r
+      The source network and address of the original datagram's data.\r
+\r
+   ICMP Fields:\r
+\r
+   Type\r
+\r
+      5\r
+\r
+   Code\r
+\r
+      0 = Redirect datagrams for the Network.\r
+\r
+      1 = Redirect datagrams for the Host.\r
+\r
+      2 = Redirect datagrams for the Type of Service and Network.\r
+\r
+      3 = Redirect datagrams for the Type of Service and Host.\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      This checksum may be replaced in the future.\r
+\r
+   Gateway Internet Address\r
+\r
+      Address of the gateway to which traffic for the network specified\r
+      in the internet destination network field of the original\r
+      datagram's data should be sent.\r
+\r
+\r
+\r
+\r
+[Page 12]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+   Internet Header + 64 bits of Data Datagram\r
+\r
+      The internet header plus the first 64 bits of the original\r
+      datagram's data.  This data is used by the host to match the\r
+      message to the appropriate process.  If a higher level protocol\r
+      uses port numbers, they are assumed to be in the first 64 data\r
+      bits of the original datagram's data.\r
+\r
+   Description\r
+\r
+      The gateway sends a redirect message to a host in the following\r
+      situation.  A gateway, G1, receives an internet datagram from a\r
+      host on a network to which the gateway is attached.  The gateway,\r
+      G1, checks its routing table and obtains the address of the next\r
+      gateway, G2, on the route to the datagram's internet destination\r
+      network, X.  If G2 and the host identified by the internet source\r
+      address of the datagram are on the same network, a redirect\r
+      message is sent to the host.  The redirect message advises the\r
+      host to send its traffic for network X directly to gateway G2 as\r
+      this is a shorter path to the destination.  The gateway forwards\r
+      the original datagram's data to its internet destination.\r
+\r
+      For datagrams with the IP source route options and the gateway\r
+      address in the destination address field, a redirect message is\r
+      not sent even if there is a better route to the ultimate\r
+      destination than the next address in the source route.\r
+\r
+      Codes 0, 1, 2, and 3 may be received from a gateway.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 13]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Echo or Echo Reply Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |     Code      |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |           Identifier          |        Sequence Number        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Data ...\r
+   +-+-+-+-+-\r
+\r
+   IP Fields:\r
+\r
+   Addresses\r
+\r
+      The address of the source in an echo message will be the\r
+      destination of the echo reply message.  To form an echo reply\r
+      message, the source and destination addresses are simply reversed,\r
+      the type code changed to 0, and the checksum recomputed.\r
+\r
+   IP Fields:\r
+\r
+   Type\r
+\r
+      8 for echo message;\r
+\r
+      0 for echo reply message.\r
+\r
+   Code\r
+\r
+      0\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      If the total length is odd, the received data is padded with one\r
+      octet of zeros for computing the checksum.  This checksum may be\r
+      replaced in the future.\r
+\r
+   Identifier\r
+\r
+      If code = 0, an identifier to aid in matching echos and replies,\r
+      may be zero.\r
+\r
+   Sequence Number\r
+\r
+\r
+[Page 14]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+      If code = 0, a sequence number to aid in matching echos and\r
+      replies, may be zero.\r
+\r
+   Description\r
+\r
+      The data received in the echo message must be returned in the echo\r
+      reply message.\r
+\r
+      The identifier and sequence number may be used by the echo sender\r
+      to aid in matching the replies with the echo requests.  For\r
+      example, the identifier might be used like a port in TCP or UDP to\r
+      identify a session, and the sequence number might be incremented\r
+      on each echo request sent.  The echoer returns these same values\r
+      in the echo reply.\r
+\r
+      Code 0 may be received from a gateway or a host.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 15]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Timestamp or Timestamp Reply Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |      Code     |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |           Identifier          |        Sequence Number        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Originate Timestamp                                       |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Receive Timestamp                                         |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Transmit Timestamp                                        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+   IP Fields:\r
+\r
+   Addresses\r
+\r
+      The address of the source in a timestamp message will be the\r
+      destination of the timestamp reply message.  To form a timestamp\r
+      reply message, the source and destination addresses are simply\r
+      reversed, the type code changed to 14, and the checksum\r
+      recomputed.\r
+\r
+   IP Fields:\r
+\r
+   Type\r
+\r
+      13 for timestamp message;\r
+\r
+      14 for timestamp reply message.\r
+\r
+   Code\r
+\r
+      0\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      This checksum may be replaced in the future.\r
+\r
+   Identifier\r
+\r
+\r
+\r
+\r
+[Page 16]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+      If code = 0, an identifier to aid in matching timestamp and\r
+      replies, may be zero.\r
+\r
+   Sequence Number\r
+\r
+      If code = 0, a sequence number to aid in matching timestamp and\r
+      replies, may be zero.\r
+\r
+   Description\r
+\r
+      The data received (a timestamp) in the message is returned in the\r
+      reply together with an additional timestamp.  The timestamp is 32\r
+      bits of milliseconds since midnight UT.  One use of these\r
+      timestamps is described by Mills [5].\r
+\r
+      The Originate Timestamp is the time the sender last touched the\r
+      message before sending it, the Receive Timestamp is the time the\r
+      echoer first touched it on receipt, and the Transmit Timestamp is\r
+      the time the echoer last touched the message on sending it.\r
+\r
+      If the time is not available in miliseconds or cannot be provided\r
+      with respect to midnight UT then any time can be inserted in a\r
+      timestamp provided the high order bit of the timestamp is also set\r
+      to indicate this non-standard value.\r
+\r
+      The identifier and sequence number may be used by the echo sender\r
+      to aid in matching the replies with the requests.  For example,\r
+      the identifier might be used like a port in TCP or UDP to identify\r
+      a session, and the sequence number might be incremented on each\r
+      request sent.  The destination returns these same values in the\r
+      reply.\r
+\r
+      Code 0 may be received from a gateway or a host.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 17]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Information Request or Information Reply Message\r
+\r
+    0                   1                   2                   3\r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |     Type      |      Code     |          Checksum             |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |           Identifier          |        Sequence Number        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+   IP Fields:\r
+\r
+   Addresses\r
+\r
+      The address of the source in a information request message will be\r
+      the destination of the information reply message.  To form a\r
+      information reply message, the source and destination addresses\r
+      are simply reversed, the type code changed to 16, and the checksum\r
+      recomputed.\r
+\r
+   IP Fields:\r
+\r
+   Type\r
+\r
+      15 for information request message;\r
+\r
+      16 for information reply message.\r
+\r
+   Code\r
+\r
+      0\r
+\r
+   Checksum\r
+\r
+      The checksum is the 16-bit ones's complement of the one's\r
+      complement sum of the ICMP message starting with the ICMP Type.\r
+      For computing the checksum , the checksum field should be zero.\r
+      This checksum may be replaced in the future.\r
+\r
+   Identifier\r
+\r
+      If code = 0, an identifier to aid in matching request and replies,\r
+      may be zero.\r
+\r
+   Sequence Number\r
+\r
+      If code = 0, a sequence number to aid in matching request and\r
+      replies, may be zero.\r
+\r
+\r
+[Page 18]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+   Description\r
+\r
+      This message may be sent with the source network in the IP header\r
+      source and destination address fields zero (which means "this"\r
+      network).  The replying IP module should send the reply with the\r
+      addresses fully specified.  This message is a way for a host to\r
+      find out the number of the network it is on.\r
+\r
+      The identifier and sequence number may be used by the echo sender\r
+      to aid in matching the replies with the requests.  For example,\r
+      the identifier might be used like a port in TCP or UDP to identify\r
+      a session, and the sequence number might be incremented on each\r
+      request sent.  The destination returns these same values in the\r
+      reply.\r
+\r
+      Code 0 may be received from a gateway or a host.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 19]\r
+\f\r
+\r
+                                                          September 1981\r
+RFC 792\r
+\r
+\r
+\r
+Summary of Message Types\r
+\r
+    0  Echo Reply\r
+\r
+    3  Destination Unreachable\r
+\r
+    4  Source Quench\r
+\r
+    5  Redirect\r
+\r
+    8  Echo\r
+\r
+   11  Time Exceeded\r
+\r
+   12  Parameter Problem\r
+\r
+   13  Timestamp\r
+\r
+   14  Timestamp Reply\r
+\r
+   15  Information Request\r
+\r
+   16  Information Reply\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 20]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+RFC 792\r
+\r
+\r
+\r
+References\r
+\r
+   [1]  Postel, J. (ed.), "Internet Protocol - DARPA Internet Program\r
+         Protocol Specification," RFC 791, USC/Information Sciences\r
+         Institute, September 1981.\r
+\r
+   [2]   Cerf, V., "The Catenet Model for Internetworking," IEN 48,\r
+         Information Processing Techniques Office, Defense Advanced\r
+         Research Projects Agency, July 1978.\r
+\r
+   [3]   Strazisar, V., "Gateway Routing:  An Implementation\r
+         Specification", IEN 30, Bolt Beranek and Newman, April 1979.\r
+\r
+   [4]   Strazisar, V., "How to Build a Gateway", IEN 109, Bolt Beranek\r
+         and Newman, August 1979.\r
+\r
+   [5]   Mills, D., "DCNET Internet Clock Service," RFC 778, COMSAT\r
+         Laboratories, April 1981.\r
+\r
+   \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 21]\r
+\f\r
+========================================================================\r
+\r
+\r
+\r
+\r
+Network Working Group                                        S. Deering\r
+Request for Comments: 1112                          Stanford University\r
+Obsoletes: RFCs 988, 1054                                   August 1989\r
+\r
+\r
+                  Host Extensions for IP Multicasting\r
+\r
+1. STATUS OF THIS MEMO\r
+\r
+   This memo specifies the extensions required of a host implementation\r
+   of the Internet Protocol (IP) to support multicasting.  It is the\r
+   recommended standard for IP multicasting in the Internet.\r
+   Distribution of this memo is unlimited.\r
+\r
+2. INTRODUCTION\r
+\r
+   IP multicasting is the transmission of an IP datagram to a "host\r
+   group", a set of zero or more hosts identified by a single IP\r
+   destination address.  A multicast datagram is delivered to all\r
+   members of its destination host group with the same "best-efforts"\r
+   reliability as regular unicast IP datagrams, i.e., the datagram is\r
+   not guaranteed to arrive intact at all members of the destination\r
+   group or in the same order relative to other datagrams.\r
+\r
+   The membership of a host group is dynamic; that is, hosts may join\r
+   and leave groups at any time.  There is no restriction on the\r
+   location or number of members in a host group.  A host may be a\r
+   member of more than one group at a time.  A host need not be a member\r
+   of a group to send datagrams to it.\r
+\r
+   A host group may be permanent or transient.  A permanent group has a\r
+   well-known, administratively assigned IP address.  It is the address,\r
+   not the membership of the group, that is permanent; at any time a\r
+   permanent group may have any number of members, even zero.  Those IP\r
+   multicast addresses that are not reserved for permanent groups are\r
+   available for dynamic assignment to transient groups which exist only\r
+   as long as they have members.\r
+\r
+   Internetwork forwarding of IP multicast datagrams is handled by\r
+   "multicast routers" which may be co-resident with, or separate from,\r
+   internet gateways.  A host transmits an IP multicast datagram as a\r
+   local network multicast which reaches all immediately-neighboring\r
+   members of the destination host group.  If the datagram has an IP\r
+   time-to-live greater than 1, the multicast router(s) attached to the\r
+   local network take responsibility for forwarding it towards all other\r
+   networks that have members of the destination group.  On those other\r
+   member networks that are reachable within the IP time-to-live, an\r
+   attached multicast router completes delivery by transmitting the\r
+\r
+\r
+\r
+Deering                                                         [Page 1]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+   datagram as a local multicast.\r
+\r
+   This memo specifies the extensions required of a host IP\r
+   implementation to support IP multicasting, where a "host" is any\r
+   internet host or gateway other than those acting as multicast\r
+   routers.  The algorithms and protocols used within and between\r
+   multicast routers are transparent to hosts and will be specified in\r
+   separate documents.  This memo also does not specify how local\r
+   network multicasting is accomplished for all types of network,\r
+   although it does specify the required service interface to an\r
+   arbitrary local network and gives an Ethernet specification as an\r
+   example.  Specifications for other types of network will be the\r
+   subject of future memos.\r
+\r
+3. LEVELS OF CONFORMANCE\r
+\r
+   There are three levels of conformance to this specification:\r
+\r
+      Level 0: no support for IP multicasting.\r
+\r
+   There is, at this time, no requirement that all IP implementations\r
+   support IP multicasting.  Level 0 hosts will, in general, be\r
+   unaffected by multicast activity.  The only exception arises on some\r
+   types of local network, where the presence of level 1 or 2 hosts may\r
+   cause misdelivery of multicast IP datagrams to level 0 hosts.  Such\r
+   datagrams can easily be identified by the presence of a class D IP\r
+   address in their destination address field; they should be quietly\r
+   discarded by hosts that do not support IP multicasting.  Class D\r
+   addresses are described in section 4 of this memo.\r
+\r
+      Level 1: support for sending but not receiving multicast IP\r
+      datagrams.\r
+\r
+   Level 1 allows a host to partake of some multicast-based services,\r
+   such as resource location or status reporting, but it does not allow\r
+   a host to join any host groups.  An IP implementation may be upgraded\r
+   from level 0 to level 1 very easily and with little new code.  Only\r
+   sections 4, 5, and 6 of this memo are applicable to level 1\r
+   implementations.\r
+\r
+      Level 2: full support for IP multicasting.\r
+\r
+   Level 2 allows a host to join and leave host groups, as well as send\r
+   IP datagrams to host groups.  It requires implementation of the\r
+   Internet Group Management Protocol (IGMP) and extension of the IP and\r
+   local network service interfaces within the host.  All of the\r
+   following sections of this memo are applicable to level 2\r
+   implementations.\r
+\r
+\r
+\r
+Deering                                                         [Page 2]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+4. HOST GROUP ADDRESSES\r
+\r
+   Host groups are identified by class D IP addresses, i.e., those with\r
+   "1110" as their high-order four bits.  Class E IP addresses, i.e.,\r
+   those with "1111" as their high-order four bits, are reserved for\r
+   future addressing modes.\r
+\r
+   In Internet standard "dotted decimal" notation, host group addresses\r
+   range from 224.0.0.0 to 239.255.255.255.  The address 224.0.0.0 is\r
+   guaranteed not to be assigned to any group, and 224.0.0.1 is assigned\r
+   to the permanent group of all IP hosts (including gateways).  This is\r
+   used to address all multicast hosts on the directly connected\r
+   network.  There is no multicast address (or any other IP address) for\r
+   all hosts on the total Internet.  The addresses of other well-known,\r
+   permanent groups are to be published in "Assigned Numbers".\r
+\r
+   Appendix II contains some background discussion of several issues\r
+   related to host group addresses.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Deering                                                         [Page 3]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+5. MODEL OF A HOST IP IMPLEMENTATION\r
+\r
+   The multicast extensions to a host IP implementation are specified in\r
+   terms of the layered model illustrated below.  In this model, ICMP\r
+   and (for level 2 hosts) IGMP are considered to be implemented within\r
+   the IP module, and the mapping of IP addresses to local network\r
+   addresses is considered to be the responsibility of local network\r
+   modules.  This model is for expository purposes only, and should not\r
+   be construed as constraining an actual implementation.\r
+\r
+         |                                                          |\r
+         |              Upper-Layer Protocol Modules                |\r
+         |__________________________________________________________|\r
+\r
+      --------------------- IP Service Interface -----------------------\r
+          __________________________________________________________\r
+         |                            |              |              |\r
+         |                            |     ICMP     |     IGMP     |\r
+         |             IP             |______________|______________|\r
+         |           Module                                         |\r
+         |                                                          |\r
+         |__________________________________________________________|\r
+\r
+      ---------------- Local Network Service Interface -----------------\r
+          __________________________________________________________\r
+         |                            |                             |\r
+         |           Local            | IP-to-local address mapping |\r
+         |          Network           |         (e.g., ARP)         |\r
+         |          Modules           |_____________________________|\r
+         |      (e.g., Ethernet)                                    |\r
+         |                                                          |\r
+\r
+   To provide level 1 multicasting, a host IP implementation must\r
+   support the transmission of multicast IP datagrams.  To provide level\r
+   2 multicasting, a host must also support the reception of multicast\r
+   IP datagrams.  Each of these two new services is described in a\r
+   separate section, below.  For each service, extensions are specified\r
+   for the IP service interface, the IP module, the local network\r
+   service interface, and an Ethernet local network module.  Extensions\r
+   to local network modules other than Ethernet are mentioned briefly,\r
+   but are not specified in detail.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Deering                                                         [Page 4]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+6. SENDING MULTICAST IP DATAGRAMS\r
+\r
+6.1. Extensions to the IP Service Interface\r
+\r
+   Multicast IP datagrams are sent using the same "Send IP" operation\r
+   used to send unicast IP datagrams; an upper-layer protocol module\r
+   merely specifies an IP host group address, rather than an individual\r
+   IP address, as the destination.  However, a number of extensions may\r
+   be necessary or desirable.\r
+\r
+   First, the service interface should provide a way for the upper-layer\r
+   protocol to specify the IP time-to-live of an outgoing multicast\r
+   datagram, if such a capability does not already exist.  If the\r
+   upper-layer protocol chooses not to specify a time-to-live, it should\r
+   default to 1 for all multicast IP datagrams, so that an explicit\r
+   choice is required to multicast beyond a single network.\r
+\r
+   Second, for hosts that may be attached to more than one network, the\r
+   service interface should provide a way for the upper-layer protocol\r
+   to identify which network interface is be used for the multicast\r
+   transmission.  Only one interface is used for the initial\r
+   transmission; multicast routers are responsible for forwarding to any\r
+   other networks, if necessary.  If the upper-layer protocol chooses\r
+   not to identify an outgoing interface, a default interface should be\r
+   used, preferably under the control of system management.\r
+\r
+   Third (level 2 implementations only), for the case in which the host\r
+   is itself a member of a group to which a datagram is being sent, the\r
+   service interface should provide a way for the upper-layer protocol\r
+   to inhibit local delivery of the datagram; by default, a copy of the\r
+   datagram is looped back.  This is a performance optimization for\r
+   upper-layer protocols that restrict the membership of a group to one\r
+   process per host (such as a routing protocol), or that handle\r
+   loopback of group communication at a higher layer (such as a\r
+   multicast transport protocol).\r
+\r
+6.2. Extensions to the IP Module\r
+\r
+   To support the sending of multicast IP datagrams, the IP module must\r
+   be extended to recognize IP host group addresses when routing\r
+   outgoing datagrams.  Most IP implementations include the following\r
+   logic:\r
+\r
+        if IP-destination is on the same local network,\r
+           send datagram locally to IP-destination\r
+        else\r
+           send datagram locally to GatewayTo( IP-destination )\r
+\r
+\r
+\r
+\r
+Deering                                                         [Page 5]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+   To allow multicast transmissions, the routing logic must be changed\r
+   to:\r
+\r
+        if IP-destination is on the same local network\r
+        or IP-destination is a host group,\r
+           send datagram locally to IP-destination\r
+        else\r
+           send datagram locally to GatewayTo( IP-destination )\r
+\r
+\r
+   If the sending host is itself a member of the destination group on\r
+   the outgoing interface, a copy of the outgoing datagram must be\r
+   looped-back for local delivery, unless inhibited by the sender.\r
+   (Level 2 implementations only.)\r
+\r
+   The IP source address of the outgoing datagram must be one of the\r
+   individual addresses corresponding to the outgoing interface.\r
+\r
+   A host group address must never be placed in the source address field\r
+   or anywhere in a source route or record route option of an outgoing\r
+   IP datagram.\r
+\r
+6.3. Extensions to the Local Network Service Interface\r
+\r
+   No change to the local network service interface is required to\r
+   support the sending of multicast IP datagrams.  The IP module merely\r
+   specifies an IP host group destination, rather than an individual IP\r
+   destination, when it invokes the existing "Send Local" operation.\r
+\r
+6.4. Extensions to an Ethernet Local Network Module\r
+\r
+   The Ethernet directly supports the sending of local multicast packets\r
+   by allowing multicast addresses in the destination field of Ethernet\r
+   packets.  All that is needed to support the sending of multicast IP\r
+   datagrams is a procedure for mapping IP host group addresses to\r
+   Ethernet multicast addresses.\r
+\r
+   An IP host group address is mapped to an Ethernet multicast address\r
+   by placing the low-order 23-bits of the IP address into the low-order\r
+   23 bits of the Ethernet multicast address 01-00-5E-00-00-00 (hex).\r
+   Because there are 28 significant bits in an IP host group address,\r
+   more than one host group address may map to the same Ethernet\r
+   multicast address.\r
+\r
+6.5. Extensions to Local Network Modules other than Ethernet\r
+\r
+   Other networks that directly support multicasting, such as rings or\r
+   buses conforming to the IEEE 802.2 standard, may be handled the same\r
+\r
+\r
+\r
+Deering                                                         [Page 6]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+   way as Ethernet for the purpose of sending multicast IP datagrams.\r
+   For a network that supports broadcast but not multicast, such as the\r
+   Experimental Ethernet, all IP host group addresses may be mapped to a\r
+   single local broadcast address (at the cost of increased overhead on\r
+   all local hosts).  For a point-to-point link joining two hosts (or a\r
+   host and a multicast router), multicasts should be transmitted\r
+   exactly like unicasts.  For a store-and-forward network like the\r
+   ARPANET or a public X.25 network, all IP host group addresses might\r
+   be mapped to the well-known local address of an IP multicast router;\r
+   a router on such a network would take responsibility for completing\r
+   multicast delivery within the network as well as among networks.\r
+\r
+7. RECEIVING MULTICAST IP DATAGRAMS\r
+\r
+7.1. Extensions to the IP Service Interface\r
+\r
+   Incoming multicast IP datagrams are received by upper-layer protocol\r
+   modules using the same "Receive IP" operation as normal, unicast\r
+   datagrams.  Selection of a destination upper-layer protocol is based\r
+   on the protocol field in the IP header, regardless of the destination\r
+   IP address.  However, before any datagrams destined to a particular\r
+   group can be received, an upper-layer protocol must ask the IP module\r
+   to join that group.  Thus, the IP service interface must be extended\r
+   to provide two new operations:\r
+\r
+                 JoinHostGroup  ( group-address, interface )\r
+\r
+                 LeaveHostGroup ( group-address, interface )\r
+\r
+   The JoinHostGroup operation requests that this host become a member\r
+   of the host group identified by "group-address" on the given network\r
+   interface.  The LeaveGroup operation requests that this host give up\r
+   its membership in the host group identified by "group-address" on the\r
+   given network interface.  The interface argument may be omitted on\r
+   hosts that support only one interface.  For hosts that may be\r
+   attached to more than one network, the upper-layer protocol may\r
+   choose to leave the interface unspecified, in which case the request\r
+   will apply to the default interface for sending multicast datagrams\r
+   (see section 6.1).\r
+\r
+   It is permissible to join the same group on more than one interface,\r
+   in which case duplicate multicast datagrams may be received.  It is\r
+   also permissible for more than one upper-layer protocol to request\r
+   membership in the same group.\r
+\r
+   Both operations should return immediately (i.e., they are non-\r
+   blocking operations), indicating success or failure.  Either\r
+   operation may fail due to an invalid group address or interface\r
+\r
+\r
+\r
+Deering                                                         [Page 7]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+   identifier.  JoinHostGroup may fail due to lack of local resources.\r
+   LeaveHostGroup may fail because the host does not belong to the given\r
+   group on the given interface.  LeaveHostGroup may succeed, but the\r
+   membership persist, if more than one upper-layer protocol has\r
+   requested membership in the same group.\r
+\r
+7.2. Extensions to the IP Module\r
+\r
+   To support the reception of multicast IP datagrams, the IP module\r
+   must be extended to maintain a list of host group memberships\r
+   associated with each network interface.  An incoming datagram\r
+   destined to one of those groups is processed exactly the same way as\r
+   datagrams destined to one of the host's individual addresses.\r
+\r
+   Incoming datagrams destined to groups to which the host does not\r
+   belong are discarded without generating any error report or log\r
+   entry.  On hosts with more than one network interface, if a datagram\r
+   arrives via one interface, destined for a group to which the host\r
+   belongs only on a different interface, the datagram is quietly\r
+   discarded.  (These cases should occur only as a result of inadequate\r
+   multicast address filtering in a local network module.)\r
+\r
+   An incoming datagram is not rejected for having an IP time-to-live of\r
+   1 (i.e., the time-to-live should not automatically be decremented on\r
+   arriving datagrams that are not being forwarded).  An incoming\r
+   datagram with an IP host group address in its source address field is\r
+   quietly discarded.  An ICMP error message (Destination Unreachable,\r
+   Time Exceeded, Parameter Problem, Source Quench, or Redirect) is\r
+   never generated in response to a datagram destined to an IP host\r
+   group.\r
+\r
+   The list of host group memberships is updated in response to\r
+   JoinHostGroup and LeaveHostGroup requests from upper-layer protocols.\r
+   Each membership should have an associated reference count or similar\r
+   mechanism to handle multiple requests to join and leave the same\r
+   group.  On the first request to join and the last request to leave a\r
+   group on a given interface, the local network module for that\r
+   interface is notified, so that it may update its multicast reception\r
+   filter (see section 7.3).\r
+\r
+   The IP module must also be extended to implement the IGMP protocol,\r
+   specified in Appendix I. IGMP is used to keep neighboring multicast\r
+   routers informed of the host group memberships present on a\r
+   particular local network.  To support IGMP, every level 2 host must\r
+   join the "all-hosts" group (address 224.0.0.1) on each network\r
+   interface at initialization time and must remain a member for as long\r
+   as the host is active.\r
+\r
+\r
+\r
+\r
+Deering                                                         [Page 8]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+   (Datagrams addressed to the all-hosts group are recognized as a\r
+   special case by the multicast routers and are never forwarded beyond\r
+   a single network, regardless of their time-to-live.  Thus, the all-\r
+   hosts address may not be used as an internet-wide broadcast address.\r
+   For the purpose of IGMP, membership in the all-hosts group is really\r
+   necessary only while the host belongs to at least one other group.\r
+   However, it is specified that the host shall remain a member of the\r
+   all-hosts group at all times because (1) it is simpler, (2) the\r
+   frequency of reception of unnecessary IGMP queries should be low\r
+   enough that overhead is negligible, and (3) the all-hosts address may\r
+   serve other routing-oriented purposes, such as advertising the\r
+   presence of gateways or resolving local addresses.)\r
+\r
+7.3. Extensions to the Local Network Service Interface\r
+\r
+   Incoming local network multicast packets are delivered to the IP\r
+   module using the same "Receive Local" operation as local network\r
+   unicast packets.  To allow the IP module to tell the local network\r
+   module which multicast packets to accept, the local network service\r
+   interface is extended to provide two new operations:\r
+\r
+                      JoinLocalGroup  ( group-address )\r
+\r
+                      LeaveLocalGroup ( group-address )\r
+\r
+   where "group-address" is an IP host group address.  The\r
+   JoinLocalGroup operation requests the local network module to accept\r
+   and deliver up subsequently arriving packets destined to the given IP\r
+   host group address.  The LeaveLocalGroup operation requests the local\r
+   network module to stop delivering up packets destined to the given IP\r
+   host group address.  The local network module is expected to map the\r
+   IP host group addresses to local network addresses as required to\r
+   update its multicast reception filter.  Any local network module is\r
+   free to ignore LeaveLocalGroup requests, and may deliver up packets\r
+   destined to more addresses than just those specified in\r
+   JoinLocalGroup requests, if it is unable to filter incoming packets\r
+   adequately.\r
+\r
+   The local network module must not deliver up any multicast packets\r
+   that were transmitted from that module; loopback of multicasts is\r
+   handled at the IP layer or higher.\r
+\r
+7.4. Extensions to an Ethernet Local Network Module\r
+\r
+   To support the reception of multicast IP datagrams, an Ethernet\r
+   module must be able to receive packets addressed to the Ethernet\r
+   multicast addresses that correspond to the host's IP host group\r
+   addresses.  It is highly desirable to take advantage of any address\r
+\r
+\r
+\r
+Deering                                                         [Page 9]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+   filtering capabilities that the Ethernet hardware interface may have,\r
+   so that the host receives only those packets that are destined to it.\r
+\r
+   Unfortunately, many current Ethernet interfaces have a small limit on\r
+   the number of addresses that the hardware can be configured to\r
+   recognize.  Nevertheless, an implementation must be capable of\r
+   listening on an arbitrary number of Ethernet multicast addresses,\r
+   which may mean "opening up" the address filter to accept all\r
+   multicast packets during those periods when the number of addresses\r
+   exceeds the limit of the filter.\r
+\r
+   For interfaces with inadequate hardware address filtering, it may be\r
+   desirable (for performance reasons) to perform Ethernet address\r
+   filtering within the software of the Ethernet module.  This is not\r
+   mandatory, however, because the IP module performs its own filtering\r
+   based on IP destination addresses.\r
+\r
+7.5. Extensions to Local Network Modules other than Ethernet\r
+\r
+   Other multicast networks, such as IEEE 802.2 networks, can be handled\r
+   the same way as Ethernet for the purpose of receiving multicast IP\r
+   datagrams.  For pure broadcast networks, such as the Experimental\r
+   Ethernet, all incoming broadcast packets can be accepted and passed\r
+   to the IP module for IP-level filtering.  On point-to-point or\r
+   store-and-forward networks, multicast IP datagrams will arrive as\r
+   local network unicasts, so no change to the local network module\r
+   should be necessary.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Deering                                                        [Page 10]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+APPENDIX I. INTERNET GROUP MANAGEMENT PROTOCOL (IGMP)\r
+\r
+   The Internet Group Management Protocol (IGMP) is used by IP hosts to\r
+   report their host group memberships to any immediately-neighboring\r
+   multicast routers.  IGMP is an asymmetric protocol and is specified\r
+   here from the point of view of a host, rather than a multicast\r
+   router.  (IGMP may also be used, symmetrically or asymmetrically,\r
+   between multicast routers.  Such use is not specified here.)\r
+\r
+   Like ICMP, IGMP is a integral part of IP.  It is required to be\r
+   implemented by all hosts conforming to level 2 of the IP multicasting\r
+   specification.  IGMP messages are encapsulated in IP datagrams, with\r
+   an IP protocol number of 2.  All IGMP messages of concern to hosts\r
+   have the following format:\r
+\r
+       0                   1                   2                   3\r
+       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+      |Version| Type  |    Unused     |           Checksum            |\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+      |                         Group Address                         |\r
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+      Version\r
+\r
+         This memo specifies version 1 of IGMP.  Version 0 is specified\r
+         in RFC-988 and is now obsolete.\r
+\r
+      Type\r
+\r
+         There are two types of IGMP message of concern to hosts:\r
+\r
+            1 = Host Membership Query\r
+            2 = Host Membership Report\r
+\r
+      Unused\r
+\r
+         Unused field, zeroed when sent, ignored when received.\r
+\r
+      Checksum\r
+\r
+         The checksum is the 16-bit one's complement of the one's\r
+         complement sum of the 8-octet IGMP message.  For computing\r
+         the checksum, the checksum field is zeroed.\r
+\r
+      Group Address\r
+\r
+         In a Host Membership Query message, the group address field\r
+\r
+\r
+\r
+Deering                                                        [Page 11]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+         is zeroed when sent, ignored when received.\r
+\r
+         In a Host Membership Report message, the group address field\r
+         holds the IP host group address of the group being reported.\r
+\r
+Informal Protocol Description\r
+\r
+   Multicast routers send Host Membership Query messages (hereinafter\r
+   called Queries) to discover which host groups have members on their\r
+   attached local networks.  Queries are addressed to the all-hosts\r
+   group (address 224.0.0.1), and carry an IP time-to-live of 1.\r
+\r
+   Hosts respond to a Query by generating Host Membership Reports\r
+   (hereinafter called Reports), reporting each host group to which they\r
+   belong on the network interface from which the Query was received.\r
+   In order to avoid an "implosion" of concurrent Reports and to reduce\r
+   the total number of Reports transmitted, two techniques are used:\r
+\r
+      1. When a host receives a Query, rather than sending Reports\r
+         immediately, it starts a report delay timer for each of its\r
+         group memberships on the network interface of the incoming\r
+         Query.  Each timer is set to a different, randomly-chosen\r
+         value between zero and D seconds.  When a timer expires, a\r
+         Report is generated for the corresponding host group.  Thus,\r
+         Reports are spread out over a D second interval instead of\r
+         all occurring at once.\r
+\r
+      2. A Report is sent with an IP destination address equal to the\r
+         host group address being reported, and with an IP\r
+         time-to-live of 1, so that other members of the same group on\r
+         the same network can overhear the Report.  If a host hears a\r
+         Report for a group to which it belongs on that network, the\r
+         host stops its own timer for that group and does not generate\r
+         a Report for that group.  Thus, in the normal case, only one\r
+         Report will be generated for each group present on the\r
+         network, by the member host whose delay timer expires first.\r
+         Note that the multicast routers receive all IP multicast\r
+         datagrams, and therefore need not be addressed explicitly.\r
+         Further note that the routers need not know which hosts\r
+         belong to a group, only that at least one host belongs to a\r
+         group on a particular network.\r
+\r
+   There are two exceptions to the behavior described above.  First, if\r
+   a report delay timer is already running for a group membership when a\r
+   Query is received, that timer is not reset to a new random value, but\r
+   rather allowed to continue running with its current value.  Second, a\r
+   report delay timer is never set for a host's membership in the all-\r
+   hosts group (224.0.0.1), and that membership is never reported.\r
+\r
+\r
+\r
+Deering                                                        [Page 12]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+   If a host uses a pseudo-random number generator to compute the\r
+   reporting delays, one of the host's own individual IP address should\r
+   be used as part of the seed for the generator, to reduce the chance\r
+   of multiple hosts generating the same sequence of delays.\r
+\r
+   A host should confirm that a received Report has the same IP host\r
+   group address in its IP destination field and its IGMP group address\r
+   field, to ensure that the host's own Report is not cancelled by an\r
+   erroneous received Report.  A host should quietly discard any IGMP\r
+   message of type other than Host Membership Query or Host Membership\r
+   Report.\r
+\r
+   Multicast routers send Queries periodically to refresh their\r
+   knowledge of memberships present on a particular network.  If no\r
+   Reports are received for a particular group after some number of\r
+   Queries, the routers assume that that group has no local members and\r
+   that they need not forward remotely-originated multicasts for that\r
+   group onto the local network.  Queries are normally sent infrequently\r
+   (no more than once a minute) so as to keep the IGMP overhead on hosts\r
+   and networks very low.  However, when a multicast router starts up,\r
+   it may issue several closely-spaced Queries in order to build up its\r
+   knowledge of local memberships quickly.\r
+\r
+   When a host joins a new group, it should immediately transmit a\r
+   Report for that group, rather than waiting for a Query, in case it is\r
+   the first member of that group on the network.  To cover the\r
+   possibility of the initial Report being lost or damaged, it is\r
+   recommended that it be repeated once or twice after short delays.  (A\r
+   simple way to accomplish this is to act as if a Query had been\r
+   received for that group only, setting the group's random report delay\r
+   timer.  The state transition diagram below illustrates this\r
+   approach.)\r
+\r
+   Note that, on a network with no multicast routers present, the only\r
+   IGMP traffic is the one or more Reports sent whenever a host joins a\r
+   new group.\r
+\r
+State Transition Diagram\r
+\r
+   IGMP behavior is more formally specified by the state transition\r
+   diagram below.  A host may be in one of three possible states, with\r
+   respect to any single IP host group on any single network interface:\r
+\r
+      - Non-Member state, when the host does not belong to the group\r
+        on the interface.  This is the initial state for all\r
+        memberships on all network interfaces; it requires no storage\r
+        in the host.\r
+\r
+\r
+\r
+\r
+Deering                                                        [Page 13]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+      - Delaying Member state, when the host belongs to the group on\r
+        the interface and has a report delay timer running for that\r
+        membership.\r
+\r
+      - Idle Member state, when the host belongs to the group on the\r
+        interface and does not have a report delay timer running for\r
+        that membership.\r
+\r
+   There are five significant events that can cause IGMP state\r
+   transitions:\r
+\r
+      - "join group" occurs when the host decides to join the group on\r
+        the interface.  It may occur only in the Non-Member state.\r
+\r
+      - "leave group" occurs when the host decides to leave the group\r
+        on the interface.  It may occur only in the Delaying Member\r
+        and Idle Member states.\r
+\r
+      - "query received" occurs when the host receives a valid IGMP\r
+        Host Membership Query message.  To be valid, the Query message\r
+        must be at least 8 octets long, have a correct IGMP\r
+        checksum and have an IP destination address of 224.0.0.1.\r
+        A single Query applies to all memberships on the\r
+        interface from which the Query is received.  It is ignored for\r
+        memberships in the Non-Member or Delaying Member state.\r
+\r
+      - "report received" occurs when the host receives a valid IGMP\r
+        Host Membership Report message.  To be valid, the Report\r
+        message must be at least 8 octets long, have a correct IGMP\r
+        checksum, and contain the same IP host group address in its IP\r
+        destination field and its IGMP group address field.  A Report\r
+        applies only to the membership in the group identified by the\r
+        Report, on the interface from which the Report is received.\r
+        It is ignored for memberships in the Non-Member or Idle Member\r
+        state.\r
+\r
+      - "timer expired" occurs when the report delay timer for the\r
+        group on the interface expires.  It may occur only in the\r
+        Delaying Member state.\r
+\r
+   All other events, such as receiving invalid IGMP messages, or IGMP\r
+   messages other than Query or Report, are ignored in all states.\r
+\r
+   There are three possible actions that may be taken in response to the\r
+   above events:\r
+\r
+      - "send report" for the group on the interface.\r
+\r
+\r
+\r
+\r
+Deering                                                        [Page 14]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+      - "start timer" for the group on the interface, using a random\r
+        delay value between 0 and D seconds.\r
+\r
+      - "stop timer" for the group on the interface.\r
+\r
+   In the following diagram, each state transition arc is labelled with\r
+   the event that causes the transition, and, in parentheses, any\r
+   actions taken during the transition.\r
+\r
+                              ________________\r
+                             |                |\r
+                             |                |\r
+                             |                |\r
+                             |                |\r
+                   --------->|   Non-Member   |<---------\r
+                  |          |                |          |\r
+                  |          |                |          |\r
+                  |          |                |          |\r
+                  |          |________________|          |\r
+                  |                   |                  |\r
+                  | leave group       | join group       | leave group\r
+                  | (stop timer)      |(send report,     |\r
+                  |                   | start timer)     |\r
+          ________|________           |          ________|________\r
+         |                 |<---------          |                 |\r
+         |                 |                    |                 |\r
+         |                 |<-------------------|                 |\r
+         |                 |   query received   |                 |\r
+         | Delaying Member |    (start timer)   |   Idle Member   |\r
+         |                 |------------------->|                 |\r
+         |                 |   report received  |                 |\r
+         |                 |    (stop timer)    |                 |\r
+         |_________________|------------------->|_________________|\r
+                                timer expired\r
+                                (send report)\r
+\r
+   The all-hosts group (address 224.0.0.1) is handled as a special case.\r
+   The host starts in Idle Member state for that group on every\r
+   interface, never transitions to another state, and never sends a\r
+   report for that group.\r
+\r
+Protocol Parameters\r
+\r
+   The maximum report delay, D, is 10 seconds.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Deering                                                        [Page 15]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+APPENDIX II. HOST GROUP ADDRESS ISSUES\r
+\r
+   This appendix is not part of the IP multicasting specification, but\r
+   provides background discussion of several issues related to IP host\r
+   group addresses.\r
+\r
+Group Address Binding\r
+\r
+   The binding of IP host group addresses to physical hosts may be\r
+   considered a generalization of the binding of IP unicast addresses.\r
+   An IP unicast address is statically bound to a single local network\r
+   interface on a single IP network.  An IP host group address is\r
+   dynamically bound to a set of local network interfaces on a set of IP\r
+   networks.\r
+\r
+   It is important to understand that an IP host group address is NOT\r
+   bound to a set of IP unicast addresses.  The multicast routers do not\r
+   need to maintain a list of individual members of each host group.\r
+   For example, a multicast router attached to an Ethernet need\r
+   associate only a single Ethernet multicast address with each host\r
+   group having local members, rather than a list of the members'\r
+   individual IP or Ethernet addresses.\r
+\r
+Allocation of Transient Host Group Addresses\r
+\r
+   This memo does not specify how transient group address are allocated.\r
+   It is anticipated that different portions of the IP transient host\r
+   group address space will be allocated using different techniques.\r
+   For example, there may be a number of servers that can be contacted\r
+   to acquire a new transient group address.  Some higher-level\r
+   protocols (such as VMTP, specified in RFC-1045) may generate higher-\r
+   level transient "process group" or "entity group" addresses which are\r
+   then algorithmically mapped to a subset of the IP transient host\r
+   group addresses, similarly to the way that IP host group addresses\r
+   are mapped to Ethernet multicast addresses.  A portion of the IP\r
+   group address space may be set aside for random allocation by\r
+   applications that can tolerate occasional collisions with other\r
+   multicast users, perhaps generating new addresses until a suitably\r
+   "quiet" one is found.\r
+\r
+   In general, a host cannot assume that datagrams sent to any host\r
+   group address will reach only the intended hosts, or that datagrams\r
+   received as a member of a transient host group are intended for the\r
+   recipient.  Misdelivery must be detected at a level above IP, using\r
+   higher-level identifiers or authentication tokens.  Information\r
+   transmitted to a host group address should be encrypted or governed\r
+   by administrative routing controls if the sender is concerned about\r
+   unwanted listeners.\r
+\r
+\r
+\r
+Deering                                                        [Page 16]\r
+\f\r
+RFC 1112          Host Extensions for IP Multicasting        August 1989\r
+\r
+\r
+Author's Address\r
+\r
+   Steve Deering\r
+   Stanford University\r
+   Computer Science Department\r
+   Stanford, CA 94305-2140\r
+\r
+   Phone: (415) 723-9427\r
+\r
+   EMail: deering@PESCADERO.STANFORD.EDU\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Deering                                                        [Page 17]\r
+\f\r
+\r
diff --git a/doc/rfc/std7.txt b/doc/rfc/std7.txt
new file mode 100644 (file)
index 0000000..a7c36a1
--- /dev/null
@@ -0,0 +1,5248 @@
+\r
+RFC: 793\r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                                    \r
+                     TRANSMISSION CONTROL PROTOCOL\r
+                                    \r
+                                    \r
+                         DARPA INTERNET PROGRAM\r
+                                    \r
+                         PROTOCOL SPECIFICATION\r
+                                    \r
+                                    \r
+                                    \r
+                             September 1981\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                              prepared for\r
+                                    \r
+               Defense Advanced Research Projects Agency\r
+                Information Processing Techniques Office\r
+                         1400 Wilson Boulevard\r
+                       Arlington, Virginia  22209\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                   by\r
+\r
+                     Information Sciences Institute\r
+                   University of Southern California\r
+                           4676 Admiralty Way\r
+                   Marina del Rey, California  90291\r
+\f\r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+\r
+\r
+\r
+                           TABLE OF CONTENTS\r
+\r
+    PREFACE ........................................................ iii\r
+\r
+1.  INTRODUCTION ..................................................... 1\r
+\r
+  1.1  Motivation .................................................... 1\r
+  1.2  Scope ......................................................... 2\r
+  1.3  About This Document ........................................... 2\r
+  1.4  Interfaces .................................................... 3\r
+  1.5  Operation ..................................................... 3\r
+\r
+2.  PHILOSOPHY ....................................................... 7\r
+\r
+  2.1  Elements of the Internetwork System ........................... 7\r
+  2.2  Model of Operation ............................................ 7\r
+  2.3  The Host Environment .......................................... 8\r
+  2.4  Interfaces .................................................... 9\r
+  2.5  Relation to Other Protocols ................................... 9\r
+  2.6  Reliable Communication ........................................ 9\r
+  2.7  Connection Establishment and Clearing ........................ 10\r
+  2.8  Data Communication ........................................... 12\r
+  2.9  Precedence and Security ...................................... 13\r
+  2.10 Robustness Principle ......................................... 13\r
+\r
+3.  FUNCTIONAL SPECIFICATION ........................................ 15\r
+\r
+  3.1  Header Format ................................................ 15\r
+  3.2  Terminology .................................................. 19\r
+  3.3  Sequence Numbers ............................................. 24\r
+  3.4  Establishing a connection .................................... 30\r
+  3.5  Closing a Connection ......................................... 37\r
+  3.6  Precedence and Security ...................................... 40\r
+  3.7  Data Communication ........................................... 40\r
+  3.8  Interfaces ................................................... 44\r
+  3.9  Event Processing ............................................. 52\r
+\r
+GLOSSARY ............................................................ 79\r
+\r
+REFERENCES .......................................................... 85\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page i]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page ii]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+\r
+\r
+\r
+                                PREFACE\r
+\r
+\r
+\r
+This document describes the DoD Standard Transmission Control Protocol\r
+(TCP).  There have been nine earlier editions of the ARPA TCP\r
+specification on which this standard is based, and the present text\r
+draws heavily from them.  There have been many contributors to this work\r
+both in terms of concepts and in terms of text.  This edition clarifies\r
+several details and removes the end-of-letter buffer-size adjustments,\r
+and redescribes the letter mechanism as a push function.\r
+\r
+                                                           Jon Postel\r
+\r
+                                                           Editor\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                              [Page iii]\r
+\f\r
+\f\r
+\r
+\r
+RFC:  793\r
+Replaces: RFC 761\r
+IENs:  129, 124, 112, 81,\r
+55, 44, 40, 27, 21, 5\r
+\r
+                     TRANSMISSION CONTROL PROTOCOL\r
+\r
+                         DARPA INTERNET PROGRAM\r
+                         PROTOCOL SPECIFICATION\r
+\r
+\r
+\r
+                            1.  INTRODUCTION\r
+\r
+The Transmission Control Protocol (TCP) is intended for use as a highly\r
+reliable host-to-host protocol between hosts in packet-switched computer\r
+communication networks, and in interconnected systems of such networks.\r
+\r
+This document describes the functions to be performed by the\r
+Transmission Control Protocol, the program that implements it, and its\r
+interface to programs or users that require its services.\r
+\r
+1.1.  Motivation\r
+\r
+  Computer communication systems are playing an increasingly important\r
+  role in military, government, and civilian environments.  This\r
+  document focuses its attention primarily on military computer\r
+  communication requirements, especially robustness in the presence of\r
+  communication unreliability and availability in the presence of\r
+  congestion, but many of these problems are found in the civilian and\r
+  government sector as well.\r
+\r
+  As strategic and tactical computer communication networks are\r
+  developed and deployed, it is essential to provide means of\r
+  interconnecting them and to provide standard interprocess\r
+  communication protocols which can support a broad range of\r
+  applications.  In anticipation of the need for such standards, the\r
+  Deputy Undersecretary of Defense for Research and Engineering has\r
+  declared the Transmission Control Protocol (TCP) described herein to\r
+  be a basis for DoD-wide inter-process communication protocol\r
+  standardization.\r
+\r
+  TCP is a connection-oriented, end-to-end reliable protocol designed to\r
+  fit into a layered hierarchy of protocols which support multi-network\r
+  applications.  The TCP provides for reliable inter-process\r
+  communication between pairs of processes in host computers attached to\r
+  distinct but interconnected computer communication networks.  Very few\r
+  assumptions are made as to the reliability of the communication\r
+  protocols below the TCP layer.  TCP assumes it can obtain a simple,\r
+  potentially unreliable datagram service from the lower level\r
+  protocols.  In principle, the TCP should be able to operate above a\r
+  wide spectrum of communication systems ranging from hard-wired\r
+  connections to packet-switched or circuit-switched networks.\r
+\r
+\r
+                                                                [Page 1]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Introduction\r
+\r
+\r
+\r
+  TCP is based on concepts first described by Cerf and Kahn in [1].  The\r
+  TCP fits into a layered protocol architecture just above a basic\r
+  Internet Protocol [2] which provides a way for the TCP to send and\r
+  receive variable-length segments of information enclosed in internet\r
+  datagram "envelopes".  The internet datagram provides a means for\r
+  addressing source and destination TCPs in different networks.  The\r
+  internet protocol also deals with any fragmentation or reassembly of\r
+  the TCP segments required to achieve transport and delivery through\r
+  multiple networks and interconnecting gateways.  The internet protocol\r
+  also carries information on the precedence, security classification\r
+  and compartmentation of the TCP segments, so this information can be\r
+  communicated end-to-end across multiple networks.\r
+\r
+                           Protocol Layering\r
+\r
+                        +---------------------+\r
+                        |     higher-level    |\r
+                        +---------------------+\r
+                        |        TCP          |\r
+                        +---------------------+\r
+                        |  internet protocol  |\r
+                        +---------------------+\r
+                        |communication network|\r
+                        +---------------------+\r
+\r
+                                Figure 1\r
+\r
+  Much of this document is written in the context of TCP implementations\r
+  which are co-resident with higher level protocols in the host\r
+  computer.  Some computer systems will be connected to networks via\r
+  front-end computers which house the TCP and internet protocol layers,\r
+  as well as network specific software.  The TCP specification describes\r
+  an interface to the higher level protocols which appears to be\r
+  implementable even for the front-end case, as long as a suitable\r
+  host-to-front end protocol is implemented.\r
+\r
+1.2.  Scope\r
+\r
+  The TCP is intended to provide a reliable process-to-process\r
+  communication service in a multinetwork environment.  The TCP is\r
+  intended to be a host-to-host protocol in common use in multiple\r
+  networks.\r
+\r
+1.3.  About this Document\r
+\r
+  This document represents a specification of the behavior required of\r
+  any TCP implementation, both in its interactions with higher level\r
+  protocols and in its interactions with other TCPs.  The rest of this\r
+\r
+\r
+[Page 2]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                            Introduction\r
+\r
+\r
+\r
+  section offers a very brief view of the protocol interfaces and\r
+  operation.  Section 2 summarizes the philosophical basis for the TCP\r
+  design.  Section 3 offers both a detailed description of the actions\r
+  required of TCP when various events occur (arrival of new segments,\r
+  user calls, errors, etc.) and the details of the formats of TCP\r
+  segments.\r
+\r
+1.4.  Interfaces\r
+\r
+  The TCP interfaces on one side to user or application processes and on\r
+  the other side to a lower level protocol such as Internet Protocol.\r
+\r
+  The interface between an application process and the TCP is\r
+  illustrated in reasonable detail.  This interface consists of a set of\r
+  calls much like the calls an operating system provides to an\r
+  application process for manipulating files.  For example, there are\r
+  calls to open and close connections and to send and receive data on\r
+  established connections.  It is also expected that the TCP can\r
+  asynchronously communicate with application programs.  Although\r
+  considerable freedom is permitted to TCP implementors to design\r
+  interfaces which are appropriate to a particular operating system\r
+  environment, a minimum functionality is required at the TCP/user\r
+  interface for any valid implementation.\r
+\r
+  The interface between TCP and lower level protocol is essentially\r
+  unspecified except that it is assumed there is a mechanism whereby the\r
+  two levels can asynchronously pass information to each other.\r
+  Typically, one expects the lower level protocol to specify this\r
+  interface.  TCP is designed to work in a very general environment of\r
+  interconnected networks.  The lower level protocol which is assumed\r
+  throughout this document is the Internet Protocol [2].\r
+\r
+1.5.  Operation\r
+\r
+  As noted above, the primary purpose of the TCP is to provide reliable,\r
+  securable logical circuit or connection service between pairs of\r
+  processes.  To provide this service on top of a less reliable internet\r
+  communication system requires facilities in the following areas:\r
+\r
+    Basic Data Transfer\r
+    Reliability\r
+    Flow Control\r
+    Multiplexing\r
+    Connections\r
+    Precedence and Security\r
+\r
+  The basic operation of the TCP in each of these areas is described in\r
+  the following paragraphs.\r
+\r
+\r
+                                                                [Page 3]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Introduction\r
+\r
+\r
+\r
+  Basic Data Transfer:\r
+\r
+    The TCP is able to transfer a continuous stream of octets in each\r
+    direction between its users by packaging some number of octets into\r
+    segments for transmission through the internet system.  In general,\r
+    the TCPs decide when to block and forward data at their own\r
+    convenience.\r
+\r
+    Sometimes users need to be sure that all the data they have\r
+    submitted to the TCP has been transmitted.  For this purpose a push\r
+    function is defined.  To assure that data submitted to a TCP is\r
+    actually transmitted the sending user indicates that it should be\r
+    pushed through to the receiving user.  A push causes the TCPs to\r
+    promptly forward and deliver data up to that point to the receiver.\r
+    The exact push point might not be visible to the receiving user and\r
+    the push function does not supply a record boundary marker.\r
+\r
+  Reliability:\r
+\r
+    The TCP must recover from data that is damaged, lost, duplicated, or\r
+    delivered out of order by the internet communication system.  This\r
+    is achieved by assigning a sequence number to each octet\r
+    transmitted, and requiring a positive acknowledgment (ACK) from the\r
+    receiving TCP.  If the ACK is not received within a timeout\r
+    interval, the data is retransmitted.  At the receiver, the sequence\r
+    numbers are used to correctly order segments that may be received\r
+    out of order and to eliminate duplicates.  Damage is handled by\r
+    adding a checksum to each segment transmitted, checking it at the\r
+    receiver, and discarding damaged segments.\r
+\r
+    As long as the TCPs continue to function properly and the internet\r
+    system does not become completely partitioned, no transmission\r
+    errors will affect the correct delivery of data.  TCP recovers from\r
+    internet communication system errors.\r
+\r
+  Flow Control:\r
+\r
+    TCP provides a means for the receiver to govern the amount of data\r
+    sent by the sender.  This is achieved by returning a "window" with\r
+    every ACK indicating a range of acceptable sequence numbers beyond\r
+    the last segment successfully received.  The window indicates an\r
+    allowed number of octets that the sender may transmit before\r
+    receiving further permission.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 4]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                            Introduction\r
+\r
+\r
+\r
+  Multiplexing:\r
+\r
+    To allow for many processes within a single Host to use TCP\r
+    communication facilities simultaneously, the TCP provides a set of\r
+    addresses or ports within each host.  Concatenated with the network\r
+    and host addresses from the internet communication layer, this forms\r
+    a socket.  A pair of sockets uniquely identifies each connection.\r
+    That is, a socket may be simultaneously used in multiple\r
+    connections.\r
+\r
+    The binding of ports to processes is handled independently by each\r
+    Host.  However, it proves useful to attach frequently used processes\r
+    (e.g., a "logger" or timesharing service) to fixed sockets which are\r
+    made known to the public.  These services can then be accessed\r
+    through the known addresses.  Establishing and learning the port\r
+    addresses of other processes may involve more dynamic mechanisms.\r
+\r
+  Connections:\r
+\r
+    The reliability and flow control mechanisms described above require\r
+    that TCPs initialize and maintain certain status information for\r
+    each data stream.  The combination of this information, including\r
+    sockets, sequence numbers, and window sizes, is called a connection.\r
+    Each connection is uniquely specified by a pair of sockets\r
+    identifying its two sides.\r
+\r
+    When two processes wish to communicate, their TCP's must first\r
+    establish a connection (initialize the status information on each\r
+    side).  When their communication is complete, the connection is\r
+    terminated or closed to free the resources for other uses.\r
+\r
+    Since connections must be established between unreliable hosts and\r
+    over the unreliable internet communication system, a handshake\r
+    mechanism with clock-based sequence numbers is used to avoid\r
+    erroneous initialization of connections.\r
+\r
+  Precedence and Security:\r
+\r
+    The users of TCP may indicate the security and precedence of their\r
+    communication.  Provision is made for default values to be used when\r
+    these features are not needed.\r
+\r
+    \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                                [Page 5]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 6]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+\r
+\r
+\r
+                             2.  PHILOSOPHY\r
+\r
+2.1.  Elements of the Internetwork System\r
+\r
+  The internetwork environment consists of hosts connected to networks\r
+  which are in turn interconnected via gateways.  It is assumed here\r
+  that the networks may be either local networks (e.g., the ETHERNET) or\r
+  large networks (e.g., the ARPANET), but in any case are based on\r
+  packet switching technology.  The active agents that produce and\r
+  consume messages are processes.  Various levels of protocols in the\r
+  networks, the gateways, and the hosts support an interprocess\r
+  communication system that provides two-way data flow on logical\r
+  connections between process ports.\r
+\r
+  The term packet is used generically here to mean the data of one\r
+  transaction between a host and its network.  The format of data blocks\r
+  exchanged within the a network will generally not be of concern to us.\r
+\r
+  Hosts are computers attached to a network, and from the communication\r
+  network's point of view, are the sources and destinations of packets.\r
+  Processes are viewed as the active elements in host computers (in\r
+  accordance with the fairly common definition of a process as a program\r
+  in execution).  Even terminals and files or other I/O devices are\r
+  viewed as communicating with each other through the use of processes.\r
+  Thus, all communication is viewed as inter-process communication.\r
+\r
+  Since a process may need to distinguish among several communication\r
+  streams between itself and another process (or processes), we imagine\r
+  that each process may have a number of ports through which it\r
+  communicates with the ports of other processes.\r
+\r
+2.2.  Model of Operation\r
+\r
+  Processes transmit data by calling on the TCP and passing buffers of\r
+  data as arguments.  The TCP packages the data from these buffers into\r
+  segments and calls on the internet module to transmit each segment to\r
+  the destination TCP.  The receiving TCP places the data from a segment\r
+  into the receiving user's buffer and notifies the receiving user.  The\r
+  TCPs include control information in the segments which they use to\r
+  ensure reliable ordered data transmission.\r
+\r
+  The model of internet communication is that there is an internet\r
+  protocol module associated with each TCP which provides an interface\r
+  to the local network.  This internet module packages TCP segments\r
+  inside internet datagrams and routes these datagrams to a destination\r
+  internet module or intermediate gateway.  To transmit the datagram\r
+  through the local network, it is embedded in a local network packet.\r
+\r
+  The packet switches may perform further packaging, fragmentation, or\r
+\r
+\r
+                                                                [Page 7]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Philosophy\r
+\r
+\r
+\r
+  other operations to achieve the delivery of the local packet to the\r
+  destination internet module.\r
+\r
+  At a gateway between networks, the internet datagram is "unwrapped"\r
+  from its local packet and examined to determine through which network\r
+  the internet datagram should travel next.  The internet datagram is\r
+  then "wrapped" in a local packet suitable to the next network and\r
+  routed to the next gateway, or to the final destination.\r
+\r
+  A gateway is permitted to break up an internet datagram into smaller\r
+  internet datagram fragments if this is necessary for transmission\r
+  through the next network.  To do this, the gateway produces a set of\r
+  internet datagrams; each carrying a fragment.  Fragments may be\r
+  further broken into smaller fragments at subsequent gateways.  The\r
+  internet datagram fragment format is designed so that the destination\r
+  internet module can reassemble fragments into internet datagrams.\r
+\r
+  A destination internet module unwraps the segment from the datagram\r
+  (after reassembling the datagram, if necessary) and passes it to the\r
+  destination TCP.\r
+\r
+  This simple model of the operation glosses over many details.  One\r
+  important feature is the type of service.  This provides information\r
+  to the gateway (or internet module) to guide it in selecting the\r
+  service parameters to be used in traversing the next network.\r
+  Included in the type of service information is the precedence of the\r
+  datagram.  Datagrams may also carry security information to permit\r
+  host and gateways that operate in multilevel secure environments to\r
+  properly segregate datagrams for security considerations.\r
+\r
+2.3.  The Host Environment\r
+\r
+  The TCP is assumed to be a module in an operating system.  The users\r
+  access the TCP much like they would access the file system.  The TCP\r
+  may call on other operating system functions, for example, to manage\r
+  data structures.  The actual interface to the network is assumed to be\r
+  controlled by a device driver module.  The TCP does not call on the\r
+  network device driver directly, but rather calls on the internet\r
+  datagram protocol module which may in turn call on the device driver.\r
+\r
+  The mechanisms of TCP do not preclude implementation of the TCP in a\r
+  front-end processor.  However, in such an implementation, a\r
+  host-to-front-end protocol must provide the functionality to support\r
+  the type of TCP-user interface described in this document.\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 8]                                                                \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                              Philosophy\r
+\r
+\r
+\r
+2.4.  Interfaces\r
+\r
+  The TCP/user interface provides for calls made by the user on the TCP\r
+  to OPEN or CLOSE a connection, to SEND or RECEIVE data, or to obtain\r
+  STATUS about a connection.  These calls are like other calls from user\r
+  programs on the operating system, for example, the calls to open, read\r
+  from, and close a file.\r
+\r
+  The TCP/internet interface provides calls to send and receive\r
+  datagrams addressed to TCP modules in hosts anywhere in the internet\r
+  system.  These calls have parameters for passing the address, type of\r
+  service, precedence, security, and other control information.\r
+\r
+2.5.  Relation to Other Protocols\r
+\r
+  The following diagram illustrates the place of the TCP in the protocol\r
+  hierarchy:\r
+\r
+                                    \r
+       +------+ +-----+ +-----+       +-----+                    \r
+       |Telnet| | FTP | |Voice|  ...  |     |  Application Level \r
+       +------+ +-----+ +-----+       +-----+                    \r
+             |   |         |             |                       \r
+            +-----+     +-----+       +-----+                    \r
+            | TCP |     | RTP |  ...  |     |  Host Level        \r
+            +-----+     +-----+       +-----+                    \r
+               |           |             |                       \r
+            +-------------------------------+                    \r
+            |    Internet Protocol & ICMP   |  Gateway Level     \r
+            +-------------------------------+                    \r
+                           |                                     \r
+              +---------------------------+                      \r
+              |   Local Network Protocol  |    Network Level     \r
+              +---------------------------+                      \r
+\r
+                         Protocol Relationships\r
+\r
+                               Figure 2.\r
+\r
+  It is expected that the TCP will be able to support higher level\r
+  protocols efficiently.  It should be easy to interface higher level\r
+  protocols like the ARPANET Telnet or AUTODIN II THP to the TCP.\r
+\r
+2.6.  Reliable Communication\r
+\r
+  A stream of data sent on a TCP connection is delivered reliably and in\r
+  order at the destination.\r
+\r
+\r
+\r
+                                                                [Page 9]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Philosophy\r
+\r
+\r
+\r
+  Transmission is made reliable via the use of sequence numbers and\r
+  acknowledgments.  Conceptually, each octet of data is assigned a\r
+  sequence number.  The sequence number of the first octet of data in a\r
+  segment is transmitted with that segment and is called the segment\r
+  sequence number.  Segments also carry an acknowledgment number which\r
+  is the sequence number of the next expected data octet of\r
+  transmissions in the reverse direction.  When the TCP transmits a\r
+  segment containing data, it puts a copy on a retransmission queue and\r
+  starts a timer; when the acknowledgment for that data is received, the\r
+  segment is deleted from the queue.  If the acknowledgment is not\r
+  received before the timer runs out, the segment is retransmitted.\r
+\r
+  An acknowledgment by TCP does not guarantee that the data has been\r
+  delivered to the end user, but only that the receiving TCP has taken\r
+  the responsibility to do so.\r
+\r
+  To govern the flow of data between TCPs, a flow control mechanism is\r
+  employed.  The receiving TCP reports a "window" to the sending TCP.\r
+  This window specifies the number of octets, starting with the\r
+  acknowledgment number, that the receiving TCP is currently prepared to\r
+  receive.\r
+\r
+2.7.  Connection Establishment and Clearing\r
+\r
+  To identify the separate data streams that a TCP may handle, the TCP\r
+  provides a port identifier.  Since port identifiers are selected\r
+  independently by each TCP they might not be unique.  To provide for\r
+  unique addresses within each TCP, we concatenate an internet address\r
+  identifying the TCP with a port identifier to create a socket which\r
+  will be unique throughout all networks connected together.\r
+\r
+  A connection is fully specified by the pair of sockets at the ends.  A\r
+  local socket may participate in many connections to different foreign\r
+  sockets.  A connection can be used to carry data in both directions,\r
+  that is, it is "full duplex".\r
+\r
+  TCPs are free to associate ports with processes however they choose.\r
+  However, several basic concepts are necessary in any implementation.\r
+  There must be well-known sockets which the TCP associates only with\r
+  the "appropriate" processes by some means.  We envision that processes\r
+  may "own" ports, and that processes can initiate connections only on\r
+  the ports they own.  (Means for implementing ownership is a local\r
+  issue, but we envision a Request Port user command, or a method of\r
+  uniquely allocating a group of ports to a given process, e.g., by\r
+  associating the high order bits of a port name with a given process.)\r
+\r
+  A connection is specified in the OPEN call by the local port and\r
+  foreign socket arguments.  In return, the TCP supplies a (short) local\r
+\r
+\r
+[Page 10]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                              Philosophy\r
+\r
+\r
+\r
+  connection name by which the user refers to the connection in\r
+  subsequent calls.  There are several things that must be remembered\r
+  about a connection.  To store this information we imagine that there\r
+  is a data structure called a Transmission Control Block (TCB).  One\r
+  implementation strategy would have the local connection name be a\r
+  pointer to the TCB for this connection.  The OPEN call also specifies\r
+  whether the connection establishment is to be actively pursued, or to\r
+  be passively waited for.\r
+\r
+  A passive OPEN request means that the process wants to accept incoming\r
+  connection requests rather than attempting to initiate a connection.\r
+  Often the process requesting a passive OPEN will accept a connection\r
+  request from any caller.  In this case a foreign socket of all zeros\r
+  is used to denote an unspecified socket.  Unspecified foreign sockets\r
+  are allowed only on passive OPENs.\r
+\r
+  A service process that wished to provide services for unknown other\r
+  processes would issue a passive OPEN request with an unspecified\r
+  foreign socket.  Then a connection could be made with any process that\r
+  requested a connection to this local socket.  It would help if this\r
+  local socket were known to be associated with this service.\r
+\r
+  Well-known sockets are a convenient mechanism for a priori associating\r
+  a socket address with a standard service.  For instance, the\r
+  "Telnet-Server" process is permanently assigned to a particular\r
+  socket, and other sockets are reserved for File Transfer, Remote Job\r
+  Entry, Text Generator, Echoer, and Sink processes (the last three\r
+  being for test purposes).  A socket address might be reserved for\r
+  access to a "Look-Up" service which would return the specific socket\r
+  at which a newly created service would be provided.  The concept of a\r
+  well-known socket is part of the TCP specification, but the assignment\r
+  of sockets to services is outside this specification.  (See [4].)\r
+\r
+  Processes can issue passive OPENs and wait for matching active OPENs\r
+  from other processes and be informed by the TCP when connections have\r
+  been established.  Two processes which issue active OPENs to each\r
+  other at the same time will be correctly connected.  This flexibility\r
+  is critical for the support of distributed computing in which\r
+  components act asynchronously with respect to each other.\r
+\r
+  There are two principal cases for matching the sockets in the local\r
+  passive OPENs and an foreign active OPENs.  In the first case, the\r
+  local passive OPENs has fully specified the foreign socket.  In this\r
+  case, the match must be exact.  In the second case, the local passive\r
+  OPENs has left the foreign socket unspecified.  In this case, any\r
+  foreign socket is acceptable as long as the local sockets match.\r
+  Other possibilities include partially restricted matches.\r
+\r
+\r
+\r
+                                                               [Page 11]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Philosophy\r
+\r
+\r
+\r
+  If there are several pending passive OPENs (recorded in TCBs) with the\r
+  same local socket, an foreign active OPEN will be matched to a TCB\r
+  with the specific foreign socket in the foreign active OPEN, if such a\r
+  TCB exists, before selecting a TCB with an unspecified foreign socket.\r
+\r
+  The procedures to establish connections utilize the synchronize (SYN)\r
+  control flag and involves an exchange of three messages.  This\r
+  exchange has been termed a three-way hand shake [3].\r
+\r
+  A connection is initiated by the rendezvous of an arriving segment\r
+  containing a SYN and a waiting TCB entry each created by a user OPEN\r
+  command.  The matching of local and foreign sockets determines when a\r
+  connection has been initiated.  The connection becomes "established"\r
+  when sequence numbers have been synchronized in both directions.\r
+\r
+  The clearing of a connection also involves the exchange of segments,\r
+  in this case carrying the FIN control flag.\r
+\r
+2.8.  Data Communication\r
+\r
+  The data that flows on a connection may be thought of as a stream of\r
+  octets.  The sending user indicates in each SEND call whether the data\r
+  in that call (and any preceeding calls) should be immediately pushed\r
+  through to the receiving user by the setting of the PUSH flag.\r
+\r
+  A sending TCP is allowed to collect data from the sending user and to\r
+  send that data in segments at its own convenience, until the push\r
+  function is signaled, then it must send all unsent data.  When a\r
+  receiving TCP sees the PUSH flag, it must not wait for more data from\r
+  the sending TCP before passing the data to the receiving process.\r
+\r
+  There is no necessary relationship between push functions and segment\r
+  boundaries.  The data in any particular segment may be the result of a\r
+  single SEND call, in whole or part, or of multiple SEND calls.\r
+\r
+  The purpose of push function and the PUSH flag is to push data through\r
+  from the sending user to the receiving user.  It does not provide a\r
+  record service.\r
+\r
+  There is a coupling between the push function and the use of buffers\r
+  of data that cross the TCP/user interface.  Each time a PUSH flag is\r
+  associated with data placed into the receiving user's buffer, the\r
+  buffer is returned to the user for processing even if the buffer is\r
+  not filled.  If data arrives that fills the user's buffer before a\r
+  PUSH is seen, the data is passed to the user in buffer size units.\r
+\r
+  TCP also provides a means to communicate to the receiver of data that\r
+  at some point further along in the data stream than the receiver is\r
+\r
+\r
+[Page 12]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                              Philosophy\r
+\r
+\r
+\r
+  currently reading there is urgent data.  TCP does not attempt to\r
+  define what the user specifically does upon being notified of pending\r
+  urgent data, but the general notion is that the receiving process will\r
+  take action to process the urgent data quickly.\r
+\r
+2.9.  Precedence and Security\r
+\r
+  The TCP makes use of the internet protocol type of service field and\r
+  security option to provide precedence and security on a per connection\r
+  basis to TCP users.  Not all TCP modules will necessarily function in\r
+  a multilevel secure environment; some may be limited to unclassified\r
+  use only, and others may operate at only one security level and\r
+  compartment.  Consequently, some TCP implementations and services to\r
+  users may be limited to a subset of the multilevel secure case.\r
+\r
+  TCP modules which operate in a multilevel secure environment must\r
+  properly mark outgoing segments with the security, compartment, and\r
+  precedence.  Such TCP modules must also provide to their users or\r
+  higher level protocols such as Telnet or THP an interface to allow\r
+  them to specify the desired security level, compartment, and\r
+  precedence of connections.\r
+\r
+2.10.  Robustness Principle\r
+\r
+  TCP implementations will follow a general principle of robustness:  be\r
+  conservative in what you do, be liberal in what you accept from\r
+  others.\r
+\r
+  \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 13]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 14]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+\r
+\r
+\r
+                      3.  FUNCTIONAL SPECIFICATION\r
+\r
+3.1.  Header Format\r
+\r
+  TCP segments are sent as internet datagrams.  The Internet Protocol\r
+  header carries several information fields, including the source and\r
+  destination host addresses [2].  A TCP header follows the internet\r
+  header, supplying information specific to the TCP protocol.  This\r
+  division allows for the existence of host level protocols other than\r
+  TCP.\r
+\r
+  TCP Header Format\r
+\r
+                                    \r
+    0                   1                   2                   3   \r
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |          Source Port          |       Destination Port        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                        Sequence Number                        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                    Acknowledgment Number                      |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |  Data |           |U|A|P|R|S|F|                               |\r
+   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |\r
+   |       |           |G|K|H|T|N|N|                               |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |           Checksum            |         Urgent Pointer        |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                    Options                    |    Padding    |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+   |                             data                              |\r
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+\r
+                            TCP Header Format\r
+\r
+          Note that one tick mark represents one bit position.\r
+\r
+                               Figure 3.\r
+\r
+  Source Port:  16 bits\r
+\r
+    The source port number.\r
+\r
+  Destination Port:  16 bits\r
+\r
+    The destination port number.\r
+\r
+\r
+\r
+\r
+                                                               [Page 15]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  Sequence Number:  32 bits\r
+\r
+    The sequence number of the first data octet in this segment (except\r
+    when SYN is present). If SYN is present the sequence number is the\r
+    initial sequence number (ISN) and the first data octet is ISN+1.\r
+\r
+  Acknowledgment Number:  32 bits\r
+\r
+    If the ACK control bit is set this field contains the value of the\r
+    next sequence number the sender of the segment is expecting to\r
+    receive.  Once a connection is established this is always sent.\r
+\r
+  Data Offset:  4 bits\r
+\r
+    The number of 32 bit words in the TCP Header.  This indicates where\r
+    the data begins.  The TCP header (even one including options) is an\r
+    integral number of 32 bits long.\r
+\r
+  Reserved:  6 bits\r
+\r
+    Reserved for future use.  Must be zero.\r
+\r
+  Control Bits:  6 bits (from left to right):\r
+\r
+    URG:  Urgent Pointer field significant\r
+    ACK:  Acknowledgment field significant\r
+    PSH:  Push Function\r
+    RST:  Reset the connection\r
+    SYN:  Synchronize sequence numbers\r
+    FIN:  No more data from sender\r
+\r
+  Window:  16 bits\r
+\r
+    The number of data octets beginning with the one indicated in the\r
+    acknowledgment field which the sender of this segment is willing to\r
+    accept.\r
+\r
+  Checksum:  16 bits\r
+\r
+    The checksum field is the 16 bit one's complement of the one's\r
+    complement sum of all 16 bit words in the header and text.  If a\r
+    segment contains an odd number of header and text octets to be\r
+    checksummed, the last octet is padded on the right with zeros to\r
+    form a 16 bit word for checksum purposes.  The pad is not\r
+    transmitted as part of the segment.  While computing the checksum,\r
+    the checksum field itself is replaced with zeros.\r
+\r
+    The checksum also covers a 96 bit pseudo header conceptually\r
+\r
+\r
+[Page 16]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+    prefixed to the TCP header.  This pseudo header contains the Source\r
+    Address, the Destination Address, the Protocol, and TCP length.\r
+    This gives the TCP protection against misrouted segments.  This\r
+    information is carried in the Internet Protocol and is transferred\r
+    across the TCP/Network interface in the arguments or results of\r
+    calls by the TCP on the IP.\r
+\r
+                     +--------+--------+--------+--------+\r
+                     |           Source Address          |\r
+                     +--------+--------+--------+--------+\r
+                     |         Destination Address       |\r
+                     +--------+--------+--------+--------+\r
+                     |  zero  |  PTCL  |    TCP Length   |\r
+                     +--------+--------+--------+--------+\r
+\r
+      The TCP Length is the TCP header length plus the data length in\r
+      octets (this is not an explicitly transmitted quantity, but is\r
+      computed), and it does not count the 12 octets of the pseudo\r
+      header.\r
+\r
+  Urgent Pointer:  16 bits\r
+\r
+    This field communicates the current value of the urgent pointer as a\r
+    positive offset from the sequence number in this segment.  The\r
+    urgent pointer points to the sequence number of the octet following\r
+    the urgent data.  This field is only be interpreted in segments with\r
+    the URG control bit set.\r
+\r
+  Options:  variable\r
+\r
+    Options may occupy space at the end of the TCP header and are a\r
+    multiple of 8 bits in length.  All options are included in the\r
+    checksum.  An option may begin on any octet boundary.  There are two\r
+    cases for the format of an option:\r
+\r
+      Case 1:  A single octet of option-kind.\r
+\r
+      Case 2:  An octet of option-kind, an octet of option-length, and\r
+               the actual option-data octets.\r
+\r
+    The option-length counts the two octets of option-kind and\r
+    option-length as well as the option-data octets.\r
+\r
+    Note that the list of options may be shorter than the data offset\r
+    field might imply.  The content of the header beyond the\r
+    End-of-Option option must be header padding (i.e., zero).\r
+\r
+    A TCP must implement all options.\r
+\r
+\r
+                                                               [Page 17]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+    Currently defined options include (kind indicated in octal):\r
+\r
+      Kind     Length    Meaning\r
+      ----     ------    -------\r
+       0         -       End of option list.\r
+       1         -       No-Operation.\r
+       2         4       Maximum Segment Size.\r
+      \r
+\r
+    Specific Option Definitions\r
+\r
+      End of Option List\r
+\r
+        +--------+\r
+        |00000000|\r
+        +--------+\r
+         Kind=0\r
+\r
+        This option code indicates the end of the option list.  This\r
+        might not coincide with the end of the TCP header according to\r
+        the Data Offset field.  This is used at the end of all options,\r
+        not the end of each option, and need only be used if the end of\r
+        the options would not otherwise coincide with the end of the TCP\r
+        header.\r
+\r
+      No-Operation\r
+\r
+        +--------+\r
+        |00000001|\r
+        +--------+\r
+         Kind=1\r
+\r
+        This option code may be used between options, for example, to\r
+        align the beginning of a subsequent option on a word boundary.\r
+        There is no guarantee that senders will use this option, so\r
+        receivers must be prepared to process options even if they do\r
+        not begin on a word boundary.\r
+\r
+      Maximum Segment Size\r
+\r
+        +--------+--------+---------+--------+\r
+        |00000010|00000100|   max seg size   |\r
+        +--------+--------+---------+--------+\r
+         Kind=2   Length=4\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 18]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+        Maximum Segment Size Option Data:  16 bits\r
+\r
+          If this option is present, then it communicates the maximum\r
+          receive segment size at the TCP which sends this segment.\r
+          This field must only be sent in the initial connection request\r
+          (i.e., in segments with the SYN control bit set).  If this\r
+          option is not used, any segment size is allowed.\r
+\r
+  Padding:  variable\r
+\r
+    The TCP header padding is used to ensure that the TCP header ends\r
+    and data begins on a 32 bit boundary.  The padding is composed of\r
+    zeros.\r
+\r
+3.2.  Terminology\r
+\r
+  Before we can discuss very much about the operation of the TCP we need\r
+  to introduce some detailed terminology.  The maintenance of a TCP\r
+  connection requires the remembering of several variables.  We conceive\r
+  of these variables being stored in a connection record called a\r
+  Transmission Control Block or TCB.  Among the variables stored in the\r
+  TCB are the local and remote socket numbers, the security and\r
+  precedence of the connection, pointers to the user's send and receive\r
+  buffers, pointers to the retransmit queue and to the current segment.\r
+  In addition several variables relating to the send and receive\r
+  sequence numbers are stored in the TCB.\r
+\r
+    Send Sequence Variables\r
+\r
+      SND.UNA - send unacknowledged\r
+      SND.NXT - send next\r
+      SND.WND - send window\r
+      SND.UP  - send urgent pointer\r
+      SND.WL1 - segment sequence number used for last window update\r
+      SND.WL2 - segment acknowledgment number used for last window\r
+                update\r
+      ISS     - initial send sequence number\r
+\r
+    Receive Sequence Variables\r
+\r
+      RCV.NXT - receive next\r
+      RCV.WND - receive window\r
+      RCV.UP  - receive urgent pointer\r
+      IRS     - initial receive sequence number\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 19]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  The following diagrams may help to relate some of these variables to\r
+  the sequence space.\r
+\r
+  Send Sequence Space\r
+\r
+                   1         2          3          4      \r
+              ----------|----------|----------|---------- \r
+                     SND.UNA    SND.NXT    SND.UNA        \r
+                                          +SND.WND        \r
+\r
+        1 - old sequence numbers which have been acknowledged  \r
+        2 - sequence numbers of unacknowledged data            \r
+        3 - sequence numbers allowed for new data transmission \r
+        4 - future sequence numbers which are not yet allowed  \r
+\r
+                          Send Sequence Space\r
+\r
+                               Figure 4.\r
+    \r
+    \r
+\r
+  The send window is the portion of the sequence space labeled 3 in\r
+  figure 4.\r
+\r
+  Receive Sequence Space\r
+\r
+                       1          2          3      \r
+                   ----------|----------|---------- \r
+                          RCV.NXT    RCV.NXT        \r
+                                    +RCV.WND        \r
+\r
+        1 - old sequence numbers which have been acknowledged  \r
+        2 - sequence numbers allowed for new reception         \r
+        3 - future sequence numbers which are not yet allowed  \r
+\r
+                         Receive Sequence Space\r
+\r
+                               Figure 5.\r
+    \r
+    \r
+\r
+  The receive window is the portion of the sequence space labeled 2 in\r
+  figure 5.\r
+\r
+  There are also some variables used frequently in the discussion that\r
+  take their values from the fields of the current segment.\r
+\r
+\r
+\r
+\r
+[Page 20]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+    Current Segment Variables\r
+\r
+      SEG.SEQ - segment sequence number\r
+      SEG.ACK - segment acknowledgment number\r
+      SEG.LEN - segment length\r
+      SEG.WND - segment window\r
+      SEG.UP  - segment urgent pointer\r
+      SEG.PRC - segment precedence value\r
+\r
+  A connection progresses through a series of states during its\r
+  lifetime.  The states are:  LISTEN, SYN-SENT, SYN-RECEIVED,\r
+  ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK,\r
+  TIME-WAIT, and the fictional state CLOSED.  CLOSED is fictional\r
+  because it represents the state when there is no TCB, and therefore,\r
+  no connection.  Briefly the meanings of the states are:\r
+\r
+    LISTEN - represents waiting for a connection request from any remote\r
+    TCP and port.\r
+\r
+    SYN-SENT - represents waiting for a matching connection request\r
+    after having sent a connection request.\r
+\r
+    SYN-RECEIVED - represents waiting for a confirming connection\r
+    request acknowledgment after having both received and sent a\r
+    connection request.\r
+\r
+    ESTABLISHED - represents an open connection, data received can be\r
+    delivered to the user.  The normal state for the data transfer phase\r
+    of the connection.\r
+\r
+    FIN-WAIT-1 - represents waiting for a connection termination request\r
+    from the remote TCP, or an acknowledgment of the connection\r
+    termination request previously sent.\r
+\r
+    FIN-WAIT-2 - represents waiting for a connection termination request\r
+    from the remote TCP.\r
+\r
+    CLOSE-WAIT - represents waiting for a connection termination request\r
+    from the local user.\r
+\r
+    CLOSING - represents waiting for a connection termination request\r
+    acknowledgment from the remote TCP.\r
+\r
+    LAST-ACK - represents waiting for an acknowledgment of the\r
+    connection termination request previously sent to the remote TCP\r
+    (which includes an acknowledgment of its connection termination\r
+    request).\r
+\r
+\r
+\r
+                                                               [Page 21]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+    TIME-WAIT - represents waiting for enough time to pass to be sure\r
+    the remote TCP received the acknowledgment of its connection\r
+    termination request.\r
+\r
+    CLOSED - represents no connection state at all.\r
+\r
+  A TCP connection progresses from one state to another in response to\r
+  events.  The events are the user calls, OPEN, SEND, RECEIVE, CLOSE,\r
+  ABORT, and STATUS; the incoming segments, particularly those\r
+  containing the SYN, ACK, RST and FIN flags; and timeouts.\r
+\r
+  The state diagram in figure 6 illustrates only state changes, together\r
+  with the causing events and resulting actions, but addresses neither\r
+  error conditions nor actions which are not connected with state\r
+  changes.  In a later section, more detail is offered with respect to\r
+  the reaction of the TCP to events.\r
+\r
+  NOTE BENE:  this diagram is only a summary and must not be taken as\r
+  the total specification.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 22]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+                                    \r
+                              +---------+ ---------\      active OPEN  \r
+                              |  CLOSED |            \    -----------  \r
+                              +---------+<---------\   \   create TCB  \r
+                                |     ^              \   \  snd SYN    \r
+                   passive OPEN |     |   CLOSE        \   \           \r
+                   ------------ |     | ----------       \   \         \r
+                    create TCB  |     | delete TCB         \   \       \r
+                                V     |                      \   \     \r
+                              +---------+            CLOSE    |    \   \r
+                              |  LISTEN |          ---------- |     |  \r
+                              +---------+          delete TCB |     |  \r
+                   rcv SYN      |     |     SEND              |     |  \r
+                  -----------   |     |    -------            |     V  \r
+ +---------+      snd SYN,ACK  /       \   snd SYN          +---------+\r
+ |         |<-----------------           ------------------>|         |\r
+ |   SYN   |                    rcv SYN                     |   SYN   |\r
+ |   RCVD  |<-----------------------------------------------|   SENT  |\r
+ |         |                    snd ACK                     |         |\r
+ |         |------------------           -------------------|         |\r
+ +---------+   rcv ACK of SYN  \       /  rcv SYN,ACK       +---------+\r
+   |           --------------   |     |   -----------                  \r
+   |                  x         |     |     snd ACK                    \r
+   |                            V     V                                \r
+   |  CLOSE                   +---------+                              \r
+   | -------                  |  ESTAB  |                              \r
+   | snd FIN                  +---------+                              \r
+   |                   CLOSE    |     |    rcv FIN                     \r
+   V                  -------   |     |    -------                     \r
+ +---------+          snd FIN  /       \   snd ACK          +---------+\r
+ |  FIN    |<-----------------           ------------------>|  CLOSE  |\r
+ | WAIT-1  |------------------                              |   WAIT  |\r
+ +---------+          rcv FIN  \                            +---------+\r
+   | rcv ACK of FIN   -------   |                            CLOSE  |  \r
+   | --------------   snd ACK   |                           ------- |  \r
+   V        x                   V                           snd FIN V  \r
+ +---------+                  +---------+                   +---------+\r
+ |FINWAIT-2|                  | CLOSING |                   | LAST-ACK|\r
+ +---------+                  +---------+                   +---------+\r
+   |                rcv ACK of FIN |                 rcv ACK of FIN |  \r
+   |  rcv FIN       -------------- |    Timeout=2MSL -------------- |  \r
+   |  -------              x       V    ------------        x       V  \r
+    \ snd ACK                 +---------+delete TCB         +---------+\r
+     ------------------------>|TIME WAIT|------------------>| CLOSED  |\r
+                              +---------+                   +---------+\r
+\r
+                      TCP Connection State Diagram\r
+                               Figure 6.\r
+\r
+\r
+                                                               [Page 23]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+3.3.  Sequence Numbers\r
+\r
+  A fundamental notion in the design is that every octet of data sent\r
+  over a TCP connection has a sequence number.  Since every octet is\r
+  sequenced, each of them can be acknowledged.  The acknowledgment\r
+  mechanism employed is cumulative so that an acknowledgment of sequence\r
+  number X indicates that all octets up to but not including X have been\r
+  received.  This mechanism allows for straight-forward duplicate\r
+  detection in the presence of retransmission.  Numbering of octets\r
+  within a segment is that the first data octet immediately following\r
+  the header is the lowest numbered, and the following octets are\r
+  numbered consecutively.\r
+\r
+  It is essential to remember that the actual sequence number space is\r
+  finite, though very large.  This space ranges from 0 to 2**32 - 1.\r
+  Since the space is finite, all arithmetic dealing with sequence\r
+  numbers must be performed modulo 2**32.  This unsigned arithmetic\r
+  preserves the relationship of sequence numbers as they cycle from\r
+  2**32 - 1 to 0 again.  There are some subtleties to computer modulo\r
+  arithmetic, so great care should be taken in programming the\r
+  comparison of such values.  The symbol "=<" means "less than or equal"\r
+  (modulo 2**32).\r
+\r
+  The typical kinds of sequence number comparisons which the TCP must\r
+  perform include:\r
+\r
+    (a)  Determining that an acknowledgment refers to some sequence\r
+         number sent but not yet acknowledged.\r
+\r
+    (b)  Determining that all sequence numbers occupied by a segment\r
+         have been acknowledged (e.g., to remove the segment from a\r
+         retransmission queue).\r
+\r
+    (c)  Determining that an incoming segment contains sequence numbers\r
+         which are expected (i.e., that the segment "overlaps" the\r
+         receive window).\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 24]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  In response to sending data the TCP will receive acknowledgments.  The\r
+  following comparisons are needed to process the acknowledgments.\r
+\r
+    SND.UNA = oldest unacknowledged sequence number\r
+\r
+    SND.NXT = next sequence number to be sent\r
+\r
+    SEG.ACK = acknowledgment from the receiving TCP (next sequence\r
+              number expected by the receiving TCP)\r
+\r
+    SEG.SEQ = first sequence number of a segment\r
+\r
+    SEG.LEN = the number of octets occupied by the data in the segment\r
+              (counting SYN and FIN)\r
+\r
+    SEG.SEQ+SEG.LEN-1 = last sequence number of a segment\r
+\r
+  A new acknowledgment (called an "acceptable ack"), is one for which\r
+  the inequality below holds:\r
+\r
+    SND.UNA < SEG.ACK =< SND.NXT\r
+\r
+  A segment on the retransmission queue is fully acknowledged if the sum\r
+  of its sequence number and length is less or equal than the\r
+  acknowledgment value in the incoming segment.\r
+\r
+  When data is received the following comparisons are needed:\r
+\r
+    RCV.NXT = next sequence number expected on an incoming segments, and\r
+        is the left or lower edge of the receive window\r
+\r
+    RCV.NXT+RCV.WND-1 = last sequence number expected on an incoming\r
+        segment, and is the right or upper edge of the receive window\r
+\r
+    SEG.SEQ = first sequence number occupied by the incoming segment\r
+\r
+    SEG.SEQ+SEG.LEN-1 = last sequence number occupied by the incoming\r
+        segment\r
+\r
+  A segment is judged to occupy a portion of valid receive sequence\r
+  space if\r
+\r
+    RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND\r
+\r
+  or\r
+\r
+    RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND\r
+\r
+\r
+\r
+                                                               [Page 25]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  The first part of this test checks to see if the beginning of the\r
+  segment falls in the window, the second part of the test checks to see\r
+  if the end of the segment falls in the window; if the segment passes\r
+  either part of the test it contains data in the window.\r
+\r
+  Actually, it is a little more complicated than this.  Due to zero\r
+  windows and zero length segments, we have four cases for the\r
+  acceptability of an incoming segment:\r
+\r
+    Segment Receive  Test\r
+    Length  Window\r
+    ------- -------  -------------------------------------------\r
+\r
+       0       0     SEG.SEQ = RCV.NXT\r
+\r
+       0      >0     RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND\r
+\r
+      >0       0     not acceptable\r
+\r
+      >0      >0     RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND\r
+                  or RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND\r
+\r
+  Note that when the receive window is zero no segments should be\r
+  acceptable except ACK segments.  Thus, it is be possible for a TCP to\r
+  maintain a zero receive window while transmitting data and receiving\r
+  ACKs.  However, even when the receive window is zero, a TCP must\r
+  process the RST and URG fields of all incoming segments.\r
+\r
+  We have taken advantage of the numbering scheme to protect certain\r
+  control information as well.  This is achieved by implicitly including\r
+  some control flags in the sequence space so they can be retransmitted\r
+  and acknowledged without confusion (i.e., one and only one copy of the\r
+  control will be acted upon).  Control information is not physically\r
+  carried in the segment data space.  Consequently, we must adopt rules\r
+  for implicitly assigning sequence numbers to control.  The SYN and FIN\r
+  are the only controls requiring this protection, and these controls\r
+  are used only at connection opening and closing.  For sequence number\r
+  purposes, the SYN is considered to occur before the first actual data\r
+  octet of the segment in which it occurs, while the FIN is considered\r
+  to occur after the last actual data octet in a segment in which it\r
+  occurs.  The segment length (SEG.LEN) includes both data and sequence\r
+  space occupying controls.  When a SYN is present then SEG.SEQ is the\r
+  sequence number of the SYN.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 26]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  Initial Sequence Number Selection\r
+\r
+  The protocol places no restriction on a particular connection being\r
+  used over and over again.  A connection is defined by a pair of\r
+  sockets.  New instances of a connection will be referred to as\r
+  incarnations of the connection.  The problem that arises from this is\r
+  -- "how does the TCP identify duplicate segments from previous\r
+  incarnations of the connection?"  This problem becomes apparent if the\r
+  connection is being opened and closed in quick succession, or if the\r
+  connection breaks with loss of memory and is then reestablished.\r
+\r
+  To avoid confusion we must prevent segments from one incarnation of a\r
+  connection from being used while the same sequence numbers may still\r
+  be present in the network from an earlier incarnation.  We want to\r
+  assure this, even if a TCP crashes and loses all knowledge of the\r
+  sequence numbers it has been using.  When new connections are created,\r
+  an initial sequence number (ISN) generator is employed which selects a\r
+  new 32 bit ISN.  The generator is bound to a (possibly fictitious) 32\r
+  bit clock whose low order bit is incremented roughly every 4\r
+  microseconds.  Thus, the ISN cycles approximately every 4.55 hours.\r
+  Since we assume that segments will stay in the network no more than\r
+  the Maximum Segment Lifetime (MSL) and that the MSL is less than 4.55\r
+  hours we can reasonably assume that ISN's will be unique.\r
+\r
+  For each connection there is a send sequence number and a receive\r
+  sequence number.  The initial send sequence number (ISS) is chosen by\r
+  the data sending TCP, and the initial receive sequence number (IRS) is\r
+  learned during the connection establishing procedure.\r
+\r
+  For a connection to be established or initialized, the two TCPs must\r
+  synchronize on each other's initial sequence numbers.  This is done in\r
+  an exchange of connection establishing segments carrying a control bit\r
+  called "SYN" (for synchronize) and the initial sequence numbers.  As a\r
+  shorthand, segments carrying the SYN bit are also called "SYNs".\r
+  Hence, the solution requires a suitable mechanism for picking an\r
+  initial sequence number and a slightly involved handshake to exchange\r
+  the ISN's.\r
+\r
+  The synchronization requires each side to send it's own initial\r
+  sequence number and to receive a confirmation of it in acknowledgment\r
+  from the other side.  Each side must also receive the other side's\r
+  initial sequence number and send a confirming acknowledgment.\r
+\r
+    1) A --> B  SYN my sequence number is X\r
+    2) A <-- B  ACK your sequence number is X\r
+    3) A <-- B  SYN my sequence number is Y\r
+    4) A --> B  ACK your sequence number is Y\r
+\r
+\r
+\r
+                                                               [Page 27]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  Because steps 2 and 3 can be combined in a single message this is\r
+  called the three way (or three message) handshake.\r
+\r
+  A three way handshake is necessary because sequence numbers are not\r
+  tied to a global clock in the network, and TCPs may have different\r
+  mechanisms for picking the ISN's.  The receiver of the first SYN has\r
+  no way of knowing whether the segment was an old delayed one or not,\r
+  unless it remembers the last sequence number used on the connection\r
+  (which is not always possible), and so it must ask the sender to\r
+  verify this SYN.  The three way handshake and the advantages of a\r
+  clock-driven scheme are discussed in [3].\r
+\r
+  Knowing When to Keep Quiet\r
+\r
+  To be sure that a TCP does not create a segment that carries a\r
+  sequence number which may be duplicated by an old segment remaining in\r
+  the network, the TCP must keep quiet for a maximum segment lifetime\r
+  (MSL) before assigning any sequence numbers upon starting up or\r
+  recovering from a crash in which memory of sequence numbers in use was\r
+  lost.  For this specification the MSL is taken to be 2 minutes.  This\r
+  is an engineering choice, and may be changed if experience indicates\r
+  it is desirable to do so.  Note that if a TCP is reinitialized in some\r
+  sense, yet retains its memory of sequence numbers in use, then it need\r
+  not wait at all; it must only be sure to use sequence numbers larger\r
+  than those recently used.\r
+\r
+  The TCP Quiet Time Concept\r
+\r
+    This specification provides that hosts which "crash" without\r
+    retaining any knowledge of the last sequence numbers transmitted on\r
+    each active (i.e., not closed) connection shall delay emitting any\r
+    TCP segments for at least the agreed Maximum Segment Lifetime (MSL)\r
+    in the internet system of which the host is a part.  In the\r
+    paragraphs below, an explanation for this specification is given.\r
+    TCP implementors may violate the "quiet time" restriction, but only\r
+    at the risk of causing some old data to be accepted as new or new\r
+    data rejected as old duplicated by some receivers in the internet\r
+    system.\r
+\r
+    TCPs consume sequence number space each time a segment is formed and\r
+    entered into the network output queue at a source host. The\r
+    duplicate detection and sequencing algorithm in the TCP protocol\r
+    relies on the unique binding of segment data to sequence space to\r
+    the extent that sequence numbers will not cycle through all 2**32\r
+    values before the segment data bound to those sequence numbers has\r
+    been delivered and acknowledged by the receiver and all duplicate\r
+    copies of the segments have "drained" from the internet.  Without\r
+    such an assumption, two distinct TCP segments could conceivably be\r
+\r
+\r
+[Page 28]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+    assigned the same or overlapping sequence numbers, causing confusion\r
+    at the receiver as to which data is new and which is old.  Remember\r
+    that each segment is bound to as many consecutive sequence numbers\r
+    as there are octets of data in the segment.\r
+\r
+    Under normal conditions, TCPs keep track of the next sequence number\r
+    to emit and the oldest awaiting acknowledgment so as to avoid\r
+    mistakenly using a sequence number over before its first use has\r
+    been acknowledged.  This alone does not guarantee that old duplicate\r
+    data is drained from the net, so the sequence space has been made\r
+    very large to reduce the probability that a wandering duplicate will\r
+    cause trouble upon arrival.  At 2 megabits/sec. it takes 4.5 hours\r
+    to use up 2**32 octets of sequence space.  Since the maximum segment\r
+    lifetime in the net is not likely to exceed a few tens of seconds,\r
+    this is deemed ample protection for foreseeable nets, even if data\r
+    rates escalate to l0's of megabits/sec.  At 100 megabits/sec, the\r
+    cycle time is 5.4 minutes which may be a little short, but still\r
+    within reason.\r
+\r
+    The basic duplicate detection and sequencing algorithm in TCP can be\r
+    defeated, however, if a source TCP does not have any memory of the\r
+    sequence numbers it last used on a given connection. For example, if\r
+    the TCP were to start all connections with sequence number 0, then\r
+    upon crashing and restarting, a TCP might re-form an earlier\r
+    connection (possibly after half-open connection resolution) and emit\r
+    packets with sequence numbers identical to or overlapping with\r
+    packets still in the network which were emitted on an earlier\r
+    incarnation of the same connection.  In the absence of knowledge\r
+    about the sequence numbers used on a particular connection, the TCP\r
+    specification recommends that the source delay for MSL seconds\r
+    before emitting segments on the connection, to allow time for\r
+    segments from the earlier connection incarnation to drain from the\r
+    system.\r
+\r
+    Even hosts which can remember the time of day and used it to select\r
+    initial sequence number values are not immune from this problem\r
+    (i.e., even if time of day is used to select an initial sequence\r
+    number for each new connection incarnation).\r
+\r
+    Suppose, for example, that a connection is opened starting with\r
+    sequence number S.  Suppose that this connection is not used much\r
+    and that eventually the initial sequence number function (ISN(t))\r
+    takes on a value equal to the sequence number, say S1, of the last\r
+    segment sent by this TCP on a particular connection.  Now suppose,\r
+    at this instant, the host crashes, recovers, and establishes a new\r
+    incarnation of the connection. The initial sequence number chosen is\r
+    S1 = ISN(t) -- last used sequence number on old incarnation of\r
+    connection!  If the recovery occurs quickly enough, any old\r
+\r
+\r
+                                                               [Page 29]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+    duplicates in the net bearing sequence numbers in the neighborhood\r
+    of S1 may arrive and be treated as new packets by the receiver of\r
+    the new incarnation of the connection.\r
+\r
+    The problem is that the recovering host may not know for how long it\r
+    crashed nor does it know whether there are still old duplicates in\r
+    the system from earlier connection incarnations.\r
+\r
+    One way to deal with this problem is to deliberately delay emitting\r
+    segments for one MSL after recovery from a crash- this is the "quite\r
+    time" specification.  Hosts which prefer to avoid waiting are\r
+    willing to risk possible confusion of old and new packets at a given\r
+    destination may choose not to wait for the "quite time".\r
+    Implementors may provide TCP users with the ability to select on a\r
+    connection by connection basis whether to wait after a crash, or may\r
+    informally implement the "quite time" for all connections.\r
+    Obviously, even where a user selects to "wait," this is not\r
+    necessary after the host has been "up" for at least MSL seconds.\r
+\r
+    To summarize: every segment emitted occupies one or more sequence\r
+    numbers in the sequence space, the numbers occupied by a segment are\r
+    "busy" or "in use" until MSL seconds have passed, upon crashing a\r
+    block of space-time is occupied by the octets of the last emitted\r
+    segment, if a new connection is started too soon and uses any of the\r
+    sequence numbers in the space-time footprint of the last segment of\r
+    the previous connection incarnation, there is a potential sequence\r
+    number overlap area which could cause confusion at the receiver.\r
+\r
+3.4.  Establishing a connection\r
+\r
+  The "three-way handshake" is the procedure used to establish a\r
+  connection.  This procedure normally is initiated by one TCP and\r
+  responded to by another TCP.  The procedure also works if two TCP\r
+  simultaneously initiate the procedure.  When simultaneous attempt\r
+  occurs, each TCP receives a "SYN" segment which carries no\r
+  acknowledgment after it has sent a "SYN".  Of course, the arrival of\r
+  an old duplicate "SYN" segment can potentially make it appear, to the\r
+  recipient, that a simultaneous connection initiation is in progress.\r
+  Proper use of "reset" segments can disambiguate these cases.\r
+\r
+  Several examples of connection initiation follow.  Although these\r
+  examples do not show connection synchronization using data-carrying\r
+  segments, this is perfectly legitimate, so long as the receiving TCP\r
+  doesn't deliver the data to the user until it is clear the data is\r
+  valid (i.e., the data must be buffered at the receiver until the\r
+  connection reaches the ESTABLISHED state).  The three-way handshake\r
+  reduces the possibility of false connections.  It is the\r
+\r
+\r
+\r
+[Page 30]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  implementation of a trade-off between memory and messages to provide\r
+  information for this checking.\r
+\r
+  The simplest three-way handshake is shown in figure 7 below.  The\r
+  figures should be interpreted in the following way.  Each line is\r
+  numbered for reference purposes.  Right arrows (-->) indicate\r
+  departure of a TCP segment from TCP A to TCP B, or arrival of a\r
+  segment at B from A.  Left arrows (<--), indicate the reverse.\r
+  Ellipsis (...) indicates a segment which is still in the network\r
+  (delayed).  An "XXX" indicates a segment which is lost or rejected.\r
+  Comments appear in parentheses.  TCP states represent the state AFTER\r
+  the departure or arrival of the segment (whose contents are shown in\r
+  the center of each line).  Segment contents are shown in abbreviated\r
+  form, with sequence number, control flags, and ACK field.  Other\r
+  fields such as window, addresses, lengths, and text have been left out\r
+  in the interest of clarity.\r
+\r
+  \r
+\r
+      TCP A                                                TCP B\r
+\r
+  1.  CLOSED                                               LISTEN\r
+\r
+  2.  SYN-SENT    --> <SEQ=100><CTL=SYN>               --> SYN-RECEIVED\r
+\r
+  3.  ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK>  <-- SYN-RECEIVED\r
+\r
+  4.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK>       --> ESTABLISHED\r
+\r
+  5.  ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED\r
+\r
+          Basic 3-Way Handshake for Connection Synchronization\r
+\r
+                                Figure 7.\r
+\r
+  In line 2 of figure 7, TCP A begins by sending a SYN segment\r
+  indicating that it will use sequence numbers starting with sequence\r
+  number 100.  In line 3, TCP B sends a SYN and acknowledges the SYN it\r
+  received from TCP A.  Note that the acknowledgment field indicates TCP\r
+  B is now expecting to hear sequence 101, acknowledging the SYN which\r
+  occupied sequence 100.\r
+\r
+  At line 4, TCP A responds with an empty segment containing an ACK for\r
+  TCP B's SYN; and in line 5, TCP A sends some data.  Note that the\r
+  sequence number of the segment in line 5 is the same as in line 4\r
+  because the ACK does not occupy sequence number space (if it did, we\r
+  would wind up ACKing ACK's!).\r
+\r
+\r
+\r
+                                                               [Page 31]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  Simultaneous initiation is only slightly more complex, as is shown in\r
+  figure 8.  Each TCP cycles from CLOSED to SYN-SENT to SYN-RECEIVED to\r
+  ESTABLISHED.\r
+\r
+  \r
+\r
+      TCP A                                            TCP B\r
+\r
+  1.  CLOSED                                           CLOSED\r
+\r
+  2.  SYN-SENT     --> <SEQ=100><CTL=SYN>              ...\r
+\r
+  3.  SYN-RECEIVED <-- <SEQ=300><CTL=SYN>              <-- SYN-SENT\r
+\r
+  4.               ... <SEQ=100><CTL=SYN>              --> SYN-RECEIVED\r
+\r
+  5.  SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...\r
+\r
+  6.  ESTABLISHED  <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED\r
+\r
+  7.               ... <SEQ=101><ACK=301><CTL=ACK>     --> ESTABLISHED\r
+\r
+                Simultaneous Connection Synchronization\r
+\r
+                               Figure 8.\r
+\r
+  The principle reason for the three-way handshake is to prevent old\r
+  duplicate connection initiations from causing confusion.  To deal with\r
+  this, a special control message, reset, has been devised.  If the\r
+  receiving TCP is in a  non-synchronized state (i.e., SYN-SENT,\r
+  SYN-RECEIVED), it returns to LISTEN on receiving an acceptable reset.\r
+  If the TCP is in one of the synchronized states (ESTABLISHED,\r
+  FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT), it\r
+  aborts the connection and informs its user.  We discuss this latter\r
+  case under "half-open" connections below.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 32]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  \r
+\r
+      TCP A                                                TCP B\r
+\r
+  1.  CLOSED                                               LISTEN\r
+\r
+  2.  SYN-SENT    --> <SEQ=100><CTL=SYN>               ...\r
+\r
+  3.  (duplicate) ... <SEQ=90><CTL=SYN>               --> SYN-RECEIVED\r
+\r
+  4.  SYN-SENT    <-- <SEQ=300><ACK=91><CTL=SYN,ACK>  <-- SYN-RECEIVED\r
+\r
+  5.  SYN-SENT    --> <SEQ=91><CTL=RST>               --> LISTEN\r
+  \r
+\r
+  6.              ... <SEQ=100><CTL=SYN>               --> SYN-RECEIVED\r
+\r
+  7.  SYN-SENT    <-- <SEQ=400><ACK=101><CTL=SYN,ACK>  <-- SYN-RECEIVED\r
+\r
+  8.  ESTABLISHED --> <SEQ=101><ACK=401><CTL=ACK>      --> ESTABLISHED\r
+\r
+                    Recovery from Old Duplicate SYN\r
+\r
+                               Figure 9.\r
+\r
+  As a simple example of recovery from old duplicates, consider\r
+  figure 9.  At line 3, an old duplicate SYN arrives at TCP B.  TCP B\r
+  cannot tell that this is an old duplicate, so it responds normally\r
+  (line 4).  TCP A detects that the ACK field is incorrect and returns a\r
+  RST (reset) with its SEQ field selected to make the segment\r
+  believable.  TCP B, on receiving the RST, returns to the LISTEN state.\r
+  When the original SYN (pun intended) finally arrives at line 6, the\r
+  synchronization proceeds normally.  If the SYN at line 6 had arrived\r
+  before the RST, a more complex exchange might have occurred with RST's\r
+  sent in both directions.\r
+\r
+  Half-Open Connections and Other Anomalies\r
+\r
+  An established connection is said to be  "half-open" if one of the\r
+  TCPs has closed or aborted the connection at its end without the\r
+  knowledge of the other, or if the two ends of the connection have\r
+  become desynchronized owing to a crash that resulted in loss of\r
+  memory.  Such connections will automatically become reset if an\r
+  attempt is made to send data in either direction.  However, half-open\r
+  connections are expected to be unusual, and the recovery procedure is\r
+  mildly involved.\r
+\r
+  If at site A the connection no longer exists, then an attempt by the\r
+\r
+\r
+                                                               [Page 33]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  user at site B to send any data on it will result in the site B TCP\r
+  receiving a reset control message.  Such a message indicates to the\r
+  site B TCP that something is wrong, and it is expected to abort the\r
+  connection.\r
+\r
+  Assume that two user processes A and B are communicating with one\r
+  another when a crash occurs causing loss of memory to A's TCP.\r
+  Depending on the operating system supporting A's TCP, it is likely\r
+  that some error recovery mechanism exists.  When the TCP is up again,\r
+  A is likely to start again from the beginning or from a recovery\r
+  point.  As a result, A will probably try to OPEN the connection again\r
+  or try to SEND on the connection it believes open.  In the latter\r
+  case, it receives the error message "connection not open" from the\r
+  local (A's) TCP.  In an attempt to establish the connection, A's TCP\r
+  will send a segment containing SYN.  This scenario leads to the\r
+  example shown in figure 10.  After TCP A crashes, the user attempts to\r
+  re-open the connection.  TCP B, in the meantime, thinks the connection\r
+  is open.\r
+\r
+  \r
+\r
+      TCP A                                           TCP B\r
+\r
+  1.  (CRASH)                               (send 300,receive 100)\r
+\r
+  2.  CLOSED                                           ESTABLISHED\r
+\r
+  3.  SYN-SENT --> <SEQ=400><CTL=SYN>              --> (??)\r
+\r
+  4.  (!!)     <-- <SEQ=300><ACK=100><CTL=ACK>     <-- ESTABLISHED\r
+\r
+  5.  SYN-SENT --> <SEQ=100><CTL=RST>              --> (Abort!!)\r
+\r
+  6.  SYN-SENT                                         CLOSED\r
+\r
+  7.  SYN-SENT --> <SEQ=400><CTL=SYN>              -->\r
+\r
+                     Half-Open Connection Discovery\r
+\r
+                               Figure 10.\r
+\r
+  When the SYN arrives at line 3, TCP B, being in a synchronized state,\r
+  and the incoming segment outside the window, responds with an\r
+  acknowledgment indicating what sequence it next expects to hear (ACK\r
+  100).  TCP A sees that this segment does not acknowledge anything it\r
+  sent and, being unsynchronized, sends a reset (RST) because it has\r
+  detected a half-open connection.  TCP B aborts at line 5.  TCP A will\r
+\r
+\r
+\r
+[Page 34]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  continue to try to establish the connection; the problem is now\r
+  reduced to the basic 3-way handshake of figure 7.\r
+\r
+  An interesting alternative case occurs when TCP A crashes and TCP B\r
+  tries to send data on what it thinks is a synchronized connection.\r
+  This is illustrated in figure 11.  In this case, the data arriving at\r
+  TCP A from TCP B (line 2) is unacceptable because no such connection\r
+  exists, so TCP A sends a RST.  The RST is acceptable so TCP B\r
+  processes it and aborts the connection.\r
+\r
+  \r
+\r
+        TCP A                                              TCP B\r
+\r
+  1.  (CRASH)                                   (send 300,receive 100)\r
+\r
+  2.  (??)    <-- <SEQ=300><ACK=100><DATA=10><CTL=ACK> <-- ESTABLISHED\r
+\r
+  3.          --> <SEQ=100><CTL=RST>                   --> (ABORT!!)\r
+\r
+           Active Side Causes Half-Open Connection Discovery\r
+\r
+                               Figure 11.\r
+\r
+  In figure 12, we find the two TCPs A and B with passive connections\r
+  waiting for SYN.  An old duplicate arriving at TCP B (line 2) stirs B\r
+  into action.  A SYN-ACK is returned (line 3) and causes TCP A to\r
+  generate a RST (the ACK in line 3 is not acceptable).  TCP B accepts\r
+  the reset and returns to its passive LISTEN state.\r
+\r
+  \r
+\r
+      TCP A                                         TCP B\r
+\r
+  1.  LISTEN                                        LISTEN\r
+\r
+  2.       ... <SEQ=Z><CTL=SYN>                -->  SYN-RECEIVED\r
+\r
+  3.  (??) <-- <SEQ=X><ACK=Z+1><CTL=SYN,ACK>   <--  SYN-RECEIVED\r
+\r
+  4.       --> <SEQ=Z+1><CTL=RST>              -->  (return to LISTEN!)\r
+\r
+  5.  LISTEN                                        LISTEN\r
+\r
+       Old Duplicate SYN Initiates a Reset on two Passive Sockets\r
+\r
+                               Figure 12.\r
+\r
+\r
+\r
+                                                               [Page 35]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  A variety of other cases are possible, all of which are accounted for\r
+  by the following rules for RST generation and processing.\r
+\r
+  Reset Generation\r
+\r
+  As a general rule, reset (RST) must be sent whenever a segment arrives\r
+  which apparently is not intended for the current connection.  A reset\r
+  must not be sent if it is not clear that this is the case.\r
+\r
+  There are three groups of states:\r
+\r
+    1.  If the connection does not exist (CLOSED) then a reset is sent\r
+    in response to any incoming segment except another reset.  In\r
+    particular, SYNs addressed to a non-existent connection are rejected\r
+    by this means.\r
+\r
+    If the incoming segment has an ACK field, the reset takes its\r
+    sequence number from the ACK field of the segment, otherwise the\r
+    reset has sequence number zero and the ACK field is set to the sum\r
+    of the sequence number and segment length of the incoming segment.\r
+    The connection remains in the CLOSED state.\r
+\r
+    2.  If the connection is in any non-synchronized state (LISTEN,\r
+    SYN-SENT, SYN-RECEIVED), and the incoming segment acknowledges\r
+    something not yet sent (the segment carries an unacceptable ACK), or\r
+    if an incoming segment has a security level or compartment which\r
+    does not exactly match the level and compartment requested for the\r
+    connection, a reset is sent.\r
+\r
+    If our SYN has not been acknowledged and the precedence level of the\r
+    incoming segment is higher than the precedence level requested then\r
+    either raise the local precedence level (if allowed by the user and\r
+    the system) or send a reset; or if the precedence level of the\r
+    incoming segment is lower than the precedence level requested then\r
+    continue as if the precedence matched exactly (if the remote TCP\r
+    cannot raise the precedence level to match ours this will be\r
+    detected in the next segment it sends, and the connection will be\r
+    terminated then).  If our SYN has been acknowledged (perhaps in this\r
+    incoming segment) the precedence level of the incoming segment must\r
+    match the local precedence level exactly, if it does not a reset\r
+    must be sent.\r
+\r
+    If the incoming segment has an ACK field, the reset takes its\r
+    sequence number from the ACK field of the segment, otherwise the\r
+    reset has sequence number zero and the ACK field is set to the sum\r
+    of the sequence number and segment length of the incoming segment.\r
+    The connection remains in the same state.\r
+\r
+\r
+\r
+[Page 36]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+    3.  If the connection is in a synchronized state (ESTABLISHED,\r
+    FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT),\r
+    any unacceptable segment (out of window sequence number or\r
+    unacceptible acknowledgment number) must elicit only an empty\r
+    acknowledgment segment containing the current send-sequence number\r
+    and an acknowledgment indicating the next sequence number expected\r
+    to be received, and the connection remains in the same state.\r
+\r
+    If an incoming segment has a security level, or compartment, or\r
+    precedence which does not exactly match the level, and compartment,\r
+    and precedence requested for the connection,a reset is sent and\r
+    connection goes to the CLOSED state.  The reset takes its sequence\r
+    number from the ACK field of the incoming segment.\r
+\r
+  Reset Processing\r
+\r
+  In all states except SYN-SENT, all reset (RST) segments are validated\r
+  by checking their SEQ-fields.  A reset is valid if its sequence number\r
+  is in the window.  In the SYN-SENT state (a RST received in response\r
+  to an initial SYN), the RST is acceptable if the ACK field\r
+  acknowledges the SYN.\r
+\r
+  The receiver of a RST first validates it, then changes state.  If the\r
+  receiver was in the LISTEN state, it ignores it.  If the receiver was\r
+  in SYN-RECEIVED state and had previously been in the LISTEN state,\r
+  then the receiver returns to the LISTEN state, otherwise the receiver\r
+  aborts the connection and goes to the CLOSED state.  If the receiver\r
+  was in any other state, it aborts the connection and advises the user\r
+  and goes to the CLOSED state.\r
+\r
+3.5.  Closing a Connection\r
+\r
+  CLOSE is an operation meaning "I have no more data to send."  The\r
+  notion of closing a full-duplex connection is subject to ambiguous\r
+  interpretation, of course, since it may not be obvious how to treat\r
+  the receiving side of the connection.  We have chosen to treat CLOSE\r
+  in a simplex fashion.  The user who CLOSEs may continue to RECEIVE\r
+  until he is told that the other side has CLOSED also.  Thus, a program\r
+  could initiate several SENDs followed by a CLOSE, and then continue to\r
+  RECEIVE until signaled that a RECEIVE failed because the other side\r
+  has CLOSED.  We assume that the TCP will signal a user, even if no\r
+  RECEIVEs are outstanding, that the other side has closed, so the user\r
+  can terminate his side gracefully.  A TCP will reliably deliver all\r
+  buffers SENT before the connection was CLOSED so a user who expects no\r
+  data in return need only wait to hear the connection was CLOSED\r
+  successfully to know that all his data was received at the destination\r
+  TCP.  Users must keep reading connections they close for sending until\r
+  the TCP says no more data.\r
+\r
+\r
+                                                               [Page 37]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  There are essentially three cases:\r
+\r
+    1) The user initiates by telling the TCP to CLOSE the connection\r
+\r
+    2) The remote TCP initiates by sending a FIN control signal\r
+\r
+    3) Both users CLOSE simultaneously\r
+\r
+  Case 1:  Local user initiates the close\r
+\r
+    In this case, a FIN segment can be constructed and placed on the\r
+    outgoing segment queue.  No further SENDs from the user will be\r
+    accepted by the TCP, and it enters the FIN-WAIT-1 state.  RECEIVEs\r
+    are allowed in this state.  All segments preceding and including FIN\r
+    will be retransmitted until acknowledged.  When the other TCP has\r
+    both acknowledged the FIN and sent a FIN of its own, the first TCP\r
+    can ACK this FIN.  Note that a TCP receiving a FIN will ACK but not\r
+    send its own FIN until its user has CLOSED the connection also.\r
+\r
+  Case 2:  TCP receives a FIN from the network\r
+\r
+    If an unsolicited FIN arrives from the network, the receiving TCP\r
+    can ACK it and tell the user that the connection is closing.  The\r
+    user will respond with a CLOSE, upon which the TCP can send a FIN to\r
+    the other TCP after sending any remaining data.  The TCP then waits\r
+    until its own FIN is acknowledged whereupon it deletes the\r
+    connection.  If an ACK is not forthcoming, after the user timeout\r
+    the connection is aborted and the user is told.\r
+\r
+  Case 3:  both users close simultaneously\r
+\r
+    A simultaneous CLOSE by users at both ends of a connection causes\r
+    FIN segments to be exchanged.  When all segments preceding the FINs\r
+    have been processed and acknowledged, each TCP can ACK the FIN it\r
+    has received.  Both will, upon receiving these ACKs, delete the\r
+    connection.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 38]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  \r
+\r
+      TCP A                                                TCP B\r
+\r
+  1.  ESTABLISHED                                          ESTABLISHED\r
+\r
+  2.  (Close)\r
+      FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  --> CLOSE-WAIT\r
+\r
+  3.  FIN-WAIT-2  <-- <SEQ=300><ACK=101><CTL=ACK>      <-- CLOSE-WAIT\r
+\r
+  4.                                                       (Close)\r
+      TIME-WAIT   <-- <SEQ=300><ACK=101><CTL=FIN,ACK>  <-- LAST-ACK\r
+\r
+  5.  TIME-WAIT   --> <SEQ=101><ACK=301><CTL=ACK>      --> CLOSED\r
+\r
+  6.  (2 MSL)\r
+      CLOSED                                                      \r
+\r
+                         Normal Close Sequence\r
+\r
+                               Figure 13.\r
+\r
+  \r
+\r
+      TCP A                                                TCP B\r
+\r
+  1.  ESTABLISHED                                          ESTABLISHED\r
+\r
+  2.  (Close)                                              (Close)\r
+      FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  ... FIN-WAIT-1\r
+                  <-- <SEQ=300><ACK=100><CTL=FIN,ACK>  <--\r
+                  ... <SEQ=100><ACK=300><CTL=FIN,ACK>  -->\r
+\r
+  3.  CLOSING     --> <SEQ=101><ACK=301><CTL=ACK>      ... CLOSING\r
+                  <-- <SEQ=301><ACK=101><CTL=ACK>      <--\r
+                  ... <SEQ=101><ACK=301><CTL=ACK>      -->\r
+\r
+  4.  TIME-WAIT                                            TIME-WAIT\r
+      (2 MSL)                                              (2 MSL)\r
+      CLOSED                                               CLOSED\r
+\r
+                      Simultaneous Close Sequence\r
+\r
+                               Figure 14.\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 39]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+3.6.  Precedence and Security\r
+\r
+  The intent is that connection be allowed only between ports operating\r
+  with exactly the same security and compartment values and at the\r
+  higher of the precedence level requested by the two ports.\r
+\r
+  The precedence and security parameters used in TCP are exactly those\r
+  defined in the Internet Protocol (IP) [2].  Throughout this TCP\r
+  specification the term "security/compartment" is intended to indicate\r
+  the security parameters used in IP including security, compartment,\r
+  user group, and handling restriction.\r
+\r
+  A connection attempt with mismatched security/compartment values or a\r
+  lower precedence value must be rejected by sending a reset.  Rejecting\r
+  a connection due to too low a precedence only occurs after an\r
+  acknowledgment of the SYN has been received.\r
+\r
+  Note that TCP modules which operate only at the default value of\r
+  precedence will still have to check the precedence of incoming\r
+  segments and possibly raise the precedence level they use on the\r
+  connection.\r
+\r
+  The security paramaters may be used even in a non-secure environment\r
+  (the values would indicate unclassified data), thus hosts in\r
+  non-secure environments must be prepared to receive the security\r
+  parameters, though they need not send them.\r
+\r
+3.7.  Data Communication\r
+\r
+  Once the connection is established data is communicated by the\r
+  exchange of segments.  Because segments may be lost due to errors\r
+  (checksum test failure), or network congestion, TCP uses\r
+  retransmission (after a timeout) to ensure delivery of every segment.\r
+  Duplicate segments may arrive due to network or TCP retransmission.\r
+  As discussed in the section on sequence numbers the TCP performs\r
+  certain tests on the sequence and acknowledgment numbers in the\r
+  segments to verify their acceptability.\r
+\r
+  The sender of data keeps track of the next sequence number to use in\r
+  the variable SND.NXT.  The receiver of data keeps track of the next\r
+  sequence number to expect in the variable RCV.NXT.  The sender of data\r
+  keeps track of the oldest unacknowledged sequence number in the\r
+  variable SND.UNA.  If the data flow is momentarily idle and all data\r
+  sent has been acknowledged then the three variables will be equal.\r
+\r
+  When the sender creates a segment and transmits it the sender advances\r
+  SND.NXT.  When the receiver accepts a segment it advances RCV.NXT and\r
+  sends an acknowledgment.  When the data sender receives an\r
+\r
+\r
+[Page 40]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  acknowledgment it advances SND.UNA.  The extent to which the values of\r
+  these variables differ is a measure of the delay in the communication.\r
+  The amount by which the variables are advanced is the length of the\r
+  data in the segment.  Note that once in the ESTABLISHED state all\r
+  segments must carry current acknowledgment information.\r
+\r
+  The CLOSE user call implies a push function, as does the FIN control\r
+  flag in an incoming segment.\r
+\r
+  Retransmission Timeout\r
+\r
+  Because of the variability of the networks that compose an\r
+  internetwork system and the wide range of uses of TCP connections the\r
+  retransmission timeout must be dynamically determined.  One procedure\r
+  for determining a retransmission time out is given here as an\r
+  illustration.\r
+\r
+    An Example Retransmission Timeout Procedure\r
+\r
+      Measure the elapsed time between sending a data octet with a\r
+      particular sequence number and receiving an acknowledgment that\r
+      covers that sequence number (segments sent do not have to match\r
+      segments received).  This measured elapsed time is the Round Trip\r
+      Time (RTT).  Next compute a Smoothed Round Trip Time (SRTT) as:\r
+\r
+        SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)\r
+\r
+      and based on this, compute the retransmission timeout (RTO) as:\r
+\r
+        RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]]\r
+\r
+      where UBOUND is an upper bound on the timeout (e.g., 1 minute),\r
+      LBOUND is a lower bound on the timeout (e.g., 1 second), ALPHA is\r
+      a smoothing factor (e.g., .8 to .9), and BETA is a delay variance\r
+      factor (e.g., 1.3 to 2.0).\r
+\r
+  The Communication of Urgent Information\r
+\r
+  The objective of the TCP urgent mechanism is to allow the sending user\r
+  to stimulate the receiving user to accept some urgent data and to\r
+  permit the receiving TCP to indicate to the receiving user when all\r
+  the currently known urgent data has been received by the user.\r
+\r
+  This mechanism permits a point in the data stream to be designated as\r
+  the end of urgent information.  Whenever this point is in advance of\r
+  the receive sequence number (RCV.NXT) at the receiving TCP, that TCP\r
+  must tell the user to go into "urgent mode"; when the receive sequence\r
+  number catches up to the urgent pointer, the TCP must tell user to go\r
+\r
+\r
+                                                               [Page 41]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+  into "normal mode".  If the urgent pointer is updated while the user\r
+  is in "urgent mode", the update will be invisible to the user.\r
+\r
+  The method employs a urgent field which is carried in all segments\r
+  transmitted.  The URG control flag indicates that the urgent field is\r
+  meaningful and must be added to the segment sequence number to yield\r
+  the urgent pointer.  The absence of this flag indicates that there is\r
+  no urgent data outstanding.\r
+\r
+  To send an urgent indication the user must also send at least one data\r
+  octet.  If the sending user also indicates a push, timely delivery of\r
+  the urgent information to the destination process is enhanced.\r
+\r
+  Managing the Window\r
+\r
+  The window sent in each segment indicates the range of sequence\r
+  numbers the sender of the window (the data receiver) is currently\r
+  prepared to accept.  There is an assumption that this is related to\r
+  the currently available data buffer space available for this\r
+  connection.\r
+\r
+  Indicating a large window encourages transmissions.  If more data\r
+  arrives than can be accepted, it will be discarded.  This will result\r
+  in excessive retransmissions, adding unnecessarily to the load on the\r
+  network and the TCPs.  Indicating a small window may restrict the\r
+  transmission of data to the point of introducing a round trip delay\r
+  between each new segment transmitted.\r
+\r
+  The mechanisms provided allow a TCP to advertise a large window and to\r
+  subsequently advertise a much smaller window without having accepted\r
+  that much data.  This, so called "shrinking the window," is strongly\r
+  discouraged.  The robustness principle dictates that TCPs will not\r
+  shrink the window themselves, but will be prepared for such behavior\r
+  on the part of other TCPs.\r
+\r
+  The sending TCP must be prepared to accept from the user and send at\r
+  least one octet of new data even if the send window is zero.  The\r
+  sending TCP must regularly retransmit to the receiving TCP even when\r
+  the window is zero.  Two minutes is recommended for the retransmission\r
+  interval when the window is zero.  This retransmission is essential to\r
+  guarantee that when either TCP has a zero window the re-opening of the\r
+  window will be reliably reported to the other.\r
+\r
+  When the receiving TCP has a zero window and a segment arrives it must\r
+  still send an acknowledgment showing its next expected sequence number\r
+  and current window (zero).\r
+\r
+  The sending TCP packages the data to be transmitted into segments\r
+\r
+\r
+[Page 42]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  which fit the current window, and may repackage segments on the\r
+  retransmission queue.  Such repackaging is not required, but may be\r
+  helpful.\r
+\r
+  In a connection with a one-way data flow, the window information will\r
+  be carried in acknowledgment segments that all have the same sequence\r
+  number so there will be no way to reorder them if they arrive out of\r
+  order.  This is not a serious problem, but it will allow the window\r
+  information to be on occasion temporarily based on old reports from\r
+  the data receiver.  A refinement to avoid this problem is to act on\r
+  the window information from segments that carry the highest\r
+  acknowledgment number (that is segments with acknowledgment number\r
+  equal or greater than the highest previously received).\r
+\r
+  The window management procedure has significant influence on the\r
+  communication performance.  The following comments are suggestions to\r
+  implementers.\r
+\r
+    Window Management Suggestions\r
+\r
+      Allocating a very small window causes data to be transmitted in\r
+      many small segments when better performance is achieved using\r
+      fewer large segments.\r
+\r
+      One suggestion for avoiding small windows is for the receiver to\r
+      defer updating a window until the additional allocation is at\r
+      least X percent of the maximum allocation possible for the\r
+      connection (where X might be 20 to 40).\r
+\r
+      Another suggestion is for the sender to avoid sending small\r
+      segments by waiting until the window is large enough before\r
+      sending data.  If the the user signals a push function then the\r
+      data must be sent even if it is a small segment.\r
+\r
+      Note that the acknowledgments should not be delayed or unnecessary\r
+      retransmissions will result.  One strategy would be to send an\r
+      acknowledgment when a small segment arrives (with out updating the\r
+      window information), and then to send another acknowledgment with\r
+      new window information when the window is larger.\r
+\r
+      The segment sent to probe a zero window may also begin a break up\r
+      of transmitted data into smaller and smaller segments.  If a\r
+      segment containing a single data octet sent to probe a zero window\r
+      is accepted, it consumes one octet of the window now available.\r
+      If the sending TCP simply sends as much as it can whenever the\r
+      window is non zero, the transmitted data will be broken into\r
+      alternating big and small segments.  As time goes on, occasional\r
+      pauses in the receiver making window allocation available will\r
+\r
+\r
+                                                               [Page 43]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+      result in breaking the big segments into a small and not quite so\r
+      big pair. And after a while the data transmission will be in\r
+      mostly small segments.\r
+\r
+      The suggestion here is that the TCP implementations need to\r
+      actively attempt to combine small window allocations into larger\r
+      windows, since the mechanisms for managing the window tend to lead\r
+      to many small windows in the simplest minded implementations.\r
+\r
+3.8.  Interfaces\r
+\r
+  There are of course two interfaces of concern:  the user/TCP interface\r
+  and the TCP/lower-level interface.  We have a fairly elaborate model\r
+  of the user/TCP interface, but the interface to the lower level\r
+  protocol module is left unspecified here, since it will be specified\r
+  in detail by the specification of the lowel level protocol.  For the\r
+  case that the lower level is IP we note some of the parameter values\r
+  that TCPs might use.\r
+\r
+  User/TCP Interface\r
+\r
+    The following functional description of user commands to the TCP is,\r
+    at best, fictional, since every operating system will have different\r
+    facilities.  Consequently, we must warn readers that different TCP\r
+    implementations may have different user interfaces.  However, all\r
+    TCPs must provide a certain minimum set of services to guarantee\r
+    that all TCP implementations can support the same protocol\r
+    hierarchy.  This section specifies the functional interfaces\r
+    required of all TCP implementations.\r
+\r
+    TCP User Commands\r
+\r
+      The following sections functionally characterize a USER/TCP\r
+      interface.  The notation used is similar to most procedure or\r
+      function calls in high level languages, but this usage is not\r
+      meant to rule out trap type service calls (e.g., SVCs, UUOs,\r
+      EMTs).\r
+\r
+      The user commands described below specify the basic functions the\r
+      TCP must perform to support interprocess communication.\r
+      Individual implementations must define their own exact format, and\r
+      may provide combinations or subsets of the basic functions in\r
+      single calls.  In particular, some implementations may wish to\r
+      automatically OPEN a connection on the first SEND or RECEIVE\r
+      issued by the user for a given connection.\r
+\r
+\r
+\r
+\r
+\r
+[Page 44]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+      In providing interprocess communication facilities, the TCP must\r
+      not only accept commands, but must also return information to the\r
+      processes it serves.  The latter consists of:\r
+\r
+        (a) general information about a connection (e.g., interrupts,\r
+        remote close, binding of unspecified foreign socket).\r
+\r
+        (b) replies to specific user commands indicating success or\r
+        various types of failure.\r
+\r
+      Open\r
+\r
+        Format:  OPEN (local port, foreign socket, active/passive\r
+        [, timeout] [, precedence] [, security/compartment] [, options])\r
+        -> local connection name\r
+\r
+        We assume that the local TCP is aware of the identity of the\r
+        processes it serves and will check the authority of the process\r
+        to use the connection specified.  Depending upon the\r
+        implementation of the TCP, the local network and TCP identifiers\r
+        for the source address will either be supplied by the TCP or the\r
+        lower level protocol (e.g., IP).  These considerations are the\r
+        result of concern about security, to the extent that no TCP be\r
+        able to masquerade as another one, and so on.  Similarly, no\r
+        process can masquerade as another without the collusion of the\r
+        TCP.\r
+\r
+        If the active/passive flag is set to passive, then this is a\r
+        call to LISTEN for an incoming connection.  A passive open may\r
+        have either a fully specified foreign socket to wait for a\r
+        particular connection or an unspecified foreign socket to wait\r
+        for any call.  A fully specified passive call can be made active\r
+        by the subsequent execution of a SEND.\r
+\r
+        A transmission control block (TCB) is created and partially\r
+        filled in with data from the OPEN command parameters.\r
+\r
+        On an active OPEN command, the TCP will begin the procedure to\r
+        synchronize (i.e., establish) the connection at once.\r
+\r
+        The timeout, if present, permits the caller to set up a timeout\r
+        for all data submitted to TCP.  If data is not successfully\r
+        delivered to the destination within the timeout period, the TCP\r
+        will abort the connection.  The present global default is five\r
+        minutes.\r
+\r
+        The TCP or some component of the operating system will verify\r
+        the users authority to open a connection with the specified\r
+\r
+\r
+                                                               [Page 45]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+        precedence or security/compartment.  The absence of precedence\r
+        or security/compartment specification in the OPEN call indicates\r
+        the default values must be used.\r
+\r
+        TCP will accept incoming requests as matching only if the\r
+        security/compartment information is exactly the same and only if\r
+        the precedence is equal to or higher than the precedence\r
+        requested in the OPEN call.\r
+\r
+        The precedence for the connection is the higher of the values\r
+        requested in the OPEN call and received from the incoming\r
+        request, and fixed at that value for the life of the\r
+        connection.Implementers may want to give the user control of\r
+        this precedence negotiation.  For example, the user might be\r
+        allowed to specify that the precedence must be exactly matched,\r
+        or that any attempt to raise the precedence be confirmed by the\r
+        user.\r
+\r
+        A local connection name will be returned to the user by the TCP.\r
+        The local connection name can then be used as a short hand term\r
+        for the connection defined by the <local socket, foreign socket>\r
+        pair.\r
+\r
+      Send\r
+\r
+        Format:  SEND (local connection name, buffer address, byte\r
+        count, PUSH flag, URGENT flag [,timeout])\r
+\r
+        This call causes the data contained in the indicated user buffer\r
+        to be sent on the indicated connection.  If the connection has\r
+        not been opened, the SEND is considered an error.  Some\r
+        implementations may allow users to SEND first; in which case, an\r
+        automatic OPEN would be done.  If the calling process is not\r
+        authorized to use this connection, an error is returned.\r
+\r
+        If the PUSH flag is set, the data must be transmitted promptly\r
+        to the receiver, and the PUSH bit will be set in the last TCP\r
+        segment created from the buffer.  If the PUSH flag is not set,\r
+        the data may be combined with data from subsequent SENDs for\r
+        transmission efficiency.\r
+\r
+        If the URGENT flag is set, segments sent to the destination TCP\r
+        will have the urgent pointer set.  The receiving TCP will signal\r
+        the urgent condition to the receiving process if the urgent\r
+        pointer indicates that data preceding the urgent pointer has not\r
+        been consumed by the receiving process.  The purpose of urgent\r
+        is to stimulate the receiver to process the urgent data and to\r
+        indicate to the receiver when all the currently known urgent\r
+\r
+\r
+[Page 46]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+        data has been received.  The number of times the sending user's\r
+        TCP signals urgent will not necessarily be equal to the number\r
+        of times the receiving user will be notified of the presence of\r
+        urgent data.\r
+\r
+        If no foreign socket was specified in the OPEN, but the\r
+        connection is established (e.g., because a LISTENing connection\r
+        has become specific due to a foreign segment arriving for the\r
+        local socket), then the designated buffer is sent to the implied\r
+        foreign socket.  Users who make use of OPEN with an unspecified\r
+        foreign socket can make use of SEND without ever explicitly\r
+        knowing the foreign socket address.\r
+\r
+        However, if a SEND is attempted before the foreign socket\r
+        becomes specified, an error will be returned.  Users can use the\r
+        STATUS call to determine the status of the connection.  In some\r
+        implementations the TCP may notify the user when an unspecified\r
+        socket is bound.\r
+\r
+        If a timeout is specified, the current user timeout for this\r
+        connection is changed to the new one.\r
+\r
+        In the simplest implementation, SEND would not return control to\r
+        the sending process until either the transmission was complete\r
+        or the timeout had been exceeded.  However, this simple method\r
+        is both subject to deadlocks (for example, both sides of the\r
+        connection might try to do SENDs before doing any RECEIVEs) and\r
+        offers poor performance, so it is not recommended.  A more\r
+        sophisticated implementation would return immediately to allow\r
+        the process to run concurrently with network I/O, and,\r
+        furthermore, to allow multiple SENDs to be in progress.\r
+        Multiple SENDs are served in first come, first served order, so\r
+        the TCP will queue those it cannot service immediately.\r
+\r
+        We have implicitly assumed an asynchronous user interface in\r
+        which a SEND later elicits some kind of SIGNAL or\r
+        pseudo-interrupt from the serving TCP.  An alternative is to\r
+        return a response immediately.  For instance, SENDs might return\r
+        immediate local acknowledgment, even if the segment sent had not\r
+        been acknowledged by the distant TCP.  We could optimistically\r
+        assume eventual success.  If we are wrong, the connection will\r
+        close anyway due to the timeout.  In implementations of this\r
+        kind (synchronous), there will still be some asynchronous\r
+        signals, but these will deal with the connection itself, and not\r
+        with specific segments or buffers.\r
+\r
+        In order for the process to distinguish among error or success\r
+        indications for different SENDs, it might be appropriate for the\r
+\r
+\r
+                                                               [Page 47]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+        buffer address to be returned along with the coded response to\r
+        the SEND request.  TCP-to-user signals are discussed below,\r
+        indicating the information which should be returned to the\r
+        calling process.\r
+\r
+      Receive\r
+\r
+        Format:  RECEIVE (local connection name, buffer address, byte\r
+        count) -> byte count, urgent flag, push flag\r
+\r
+        This command allocates a receiving buffer associated with the\r
+        specified connection.  If no OPEN precedes this command or the\r
+        calling process is not authorized to use this connection, an\r
+        error is returned.\r
+\r
+        In the simplest implementation, control would not return to the\r
+        calling program until either the buffer was filled, or some\r
+        error occurred, but this scheme is highly subject to deadlocks.\r
+        A more sophisticated implementation would permit several\r
+        RECEIVEs to be outstanding at once.  These would be filled as\r
+        segments arrive.  This strategy permits increased throughput at\r
+        the cost of a more elaborate scheme (possibly asynchronous) to\r
+        notify the calling program that a PUSH has been seen or a buffer\r
+        filled.\r
+\r
+        If enough data arrive to fill the buffer before a PUSH is seen,\r
+        the PUSH flag will not be set in the response to the RECEIVE.\r
+        The buffer will be filled with as much data as it can hold.  If\r
+        a PUSH is seen before the buffer is filled the buffer will be\r
+        returned partially filled and PUSH indicated.\r
+\r
+        If there is urgent data the user will have been informed as soon\r
+        as it arrived via a TCP-to-user signal.  The receiving user\r
+        should thus be in "urgent mode".  If the URGENT flag is on,\r
+        additional urgent data remains.  If the URGENT flag is off, this\r
+        call to RECEIVE has returned all the urgent data, and the user\r
+        may now leave "urgent mode".  Note that data following the\r
+        urgent pointer (non-urgent data) cannot be delivered to the user\r
+        in the same buffer with preceeding urgent data unless the\r
+        boundary is clearly marked for the user.\r
+\r
+        To distinguish among several outstanding RECEIVEs and to take\r
+        care of the case that a buffer is not completely filled, the\r
+        return code is accompanied by both a buffer pointer and a byte\r
+        count indicating the actual length of the data received.\r
+\r
+        Alternative implementations of RECEIVE might have the TCP\r
+\r
+\r
+\r
+[Page 48]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+        allocate buffer storage, or the TCP might share a ring buffer\r
+        with the user.\r
+\r
+      Close\r
+\r
+        Format:  CLOSE (local connection name)\r
+\r
+        This command causes the connection specified to be closed.  If\r
+        the connection is not open or the calling process is not\r
+        authorized to use this connection, an error is returned.\r
+        Closing connections is intended to be a graceful operation in\r
+        the sense that outstanding SENDs will be transmitted (and\r
+        retransmitted), as flow control permits, until all have been\r
+        serviced.  Thus, it should be acceptable to make several SEND\r
+        calls, followed by a CLOSE, and expect all the data to be sent\r
+        to the destination.  It should also be clear that users should\r
+        continue to RECEIVE on CLOSING connections, since the other side\r
+        may be trying to transmit the last of its data.  Thus, CLOSE\r
+        means "I have no more to send" but does not mean "I will not\r
+        receive any more."  It may happen (if the user level protocol is\r
+        not well thought out) that the closing side is unable to get rid\r
+        of all its data before timing out.  In this event, CLOSE turns\r
+        into ABORT, and the closing TCP gives up.\r
+\r
+        The user may CLOSE the connection at any time on his own\r
+        initiative, or in response to various prompts from the TCP\r
+        (e.g., remote close executed, transmission timeout exceeded,\r
+        destination inaccessible).\r
+\r
+        Because closing a connection requires communication with the\r
+        foreign TCP, connections may remain in the closing state for a\r
+        short time.  Attempts to reopen the connection before the TCP\r
+        replies to the CLOSE command will result in error responses.\r
+\r
+        Close also implies push function.\r
+\r
+      Status\r
+\r
+        Format:  STATUS (local connection name) -> status data\r
+\r
+        This is an implementation dependent user command and could be\r
+        excluded without adverse effect.  Information returned would\r
+        typically come from the TCB associated with the connection.\r
+\r
+        This command returns a data block containing the following\r
+        information:\r
+\r
+          local socket,\r
+\r
+\r
+                                                               [Page 49]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+          foreign socket,\r
+          local connection name,\r
+          receive window,\r
+          send window,\r
+          connection state,\r
+          number of buffers awaiting acknowledgment,\r
+          number of buffers pending receipt,\r
+          urgent state,\r
+          precedence,\r
+          security/compartment,\r
+          and transmission timeout.\r
+\r
+        Depending on the state of the connection, or on the\r
+        implementation itself, some of this information may not be\r
+        available or meaningful.  If the calling process is not\r
+        authorized to use this connection, an error is returned.  This\r
+        prevents unauthorized processes from gaining information about a\r
+        connection.\r
+\r
+      Abort\r
+\r
+        Format:  ABORT (local connection name)\r
+\r
+        This command causes all pending SENDs and RECEIVES to be\r
+        aborted, the TCB to be removed, and a special RESET message to\r
+        be sent to the TCP on the other side of the connection.\r
+        Depending on the implementation, users may receive abort\r
+        indications for each outstanding SEND or RECEIVE, or may simply\r
+        receive an ABORT-acknowledgment.\r
+\r
+    TCP-to-User Messages\r
+\r
+      It is assumed that the operating system environment provides a\r
+      means for the TCP to asynchronously signal the user program.  When\r
+      the TCP does signal a user program, certain information is passed\r
+      to the user.  Often in the specification the information will be\r
+      an error message.  In other cases there will be information\r
+      relating to the completion of processing a SEND or RECEIVE or\r
+      other user call.\r
+\r
+      The following information is provided:\r
+\r
+        Local Connection Name                    Always\r
+        Response String                          Always\r
+        Buffer Address                           Send & Receive\r
+        Byte count (counts bytes received)       Receive\r
+        Push flag                                Receive\r
+        Urgent flag                              Receive\r
+\r
+\r
+[Page 50]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  TCP/Lower-Level Interface\r
+\r
+    The TCP calls on a lower level protocol module to actually send and\r
+    receive information over a network.  One case is that of the ARPA\r
+    internetwork system where the lower level module is the Internet\r
+    Protocol (IP) [2].\r
+\r
+    If the lower level protocol is IP it provides arguments for a type\r
+    of service and for a time to live.  TCP uses the following settings\r
+    for these parameters:\r
+\r
+      Type of Service = Precedence: routine, Delay: normal, Throughput:\r
+      normal, Reliability: normal; or 00000000.\r
+\r
+      Time to Live    = one minute, or 00111100.\r
+\r
+        Note that the assumed maximum segment lifetime is two minutes.\r
+        Here we explicitly ask that a segment be destroyed if it cannot\r
+        be delivered by the internet system within one minute.\r
+\r
+    If the lower level is IP (or other protocol that provides this\r
+    feature) and source routing is used, the interface must allow the\r
+    route information to be communicated.  This is especially important\r
+    so that the source and destination addresses used in the TCP\r
+    checksum be the originating source and ultimate destination. It is\r
+    also important to preserve the return route to answer connection\r
+    requests.\r
+\r
+    Any lower level protocol will have to provide the source address,\r
+    destination address, and protocol fields, and some way to determine\r
+    the "TCP length", both to provide the functional equivlent service\r
+    of IP and to be used in the TCP checksum.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 51]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+\r
+\r
+\r
+3.9.  Event Processing\r
+\r
+  The processing depicted in this section is an example of one possible\r
+  implementation.  Other implementations may have slightly different\r
+  processing sequences, but they should differ from those in this\r
+  section only in detail, not in substance.\r
+\r
+  The activity of the TCP can be characterized as responding to events.\r
+  The events that occur can be cast into three categories:  user calls,\r
+  arriving segments, and timeouts.  This section describes the\r
+  processing the TCP does in response to each of the events.  In many\r
+  cases the processing required depends on the state of the connection.\r
+\r
+    Events that occur:\r
+\r
+      User Calls\r
+\r
+        OPEN\r
+        SEND\r
+        RECEIVE\r
+        CLOSE\r
+        ABORT\r
+        STATUS\r
+\r
+      Arriving Segments\r
+\r
+        SEGMENT ARRIVES\r
+\r
+      Timeouts\r
+\r
+        USER TIMEOUT\r
+        RETRANSMISSION TIMEOUT\r
+        TIME-WAIT TIMEOUT\r
+\r
+  The model of the TCP/user interface is that user commands receive an\r
+  immediate return and possibly a delayed response via an event or\r
+  pseudo interrupt.  In the following descriptions, the term "signal"\r
+  means cause a delayed response.\r
+\r
+  Error responses are given as character strings.  For example, user\r
+  commands referencing connections that do not exist receive "error:\r
+  connection not open".\r
+\r
+  Please note in the following that all arithmetic on sequence numbers,\r
+  acknowledgment numbers, windows, et cetera, is modulo 2**32 the size\r
+  of the sequence number space.  Also note that "=<" means less than or\r
+  equal to (modulo 2**32).\r
+\r
+\r
+\r
+[Page 52]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+\r
+\r
+\r
+  A natural way to think about processing incoming segments is to\r
+  imagine that they are first tested for proper sequence number (i.e.,\r
+  that their contents lie in the range of the expected "receive window"\r
+  in the sequence number space) and then that they are generally queued\r
+  and processed in sequence number order.\r
+\r
+  When a segment overlaps other already received segments we reconstruct\r
+  the segment to contain just the new data, and adjust the header fields\r
+  to be consistent.\r
+\r
+  Note that if no state change is mentioned the TCP stays in the same\r
+  state.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 53]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                               OPEN Call\r
+\r
+\r
+\r
+  OPEN Call\r
+\r
+    CLOSED STATE (i.e., TCB does not exist)\r
+\r
+      Create a new transmission control block (TCB) to hold connection\r
+      state information.  Fill in local socket identifier, foreign\r
+      socket, precedence, security/compartment, and user timeout\r
+      information.  Note that some parts of the foreign socket may be\r
+      unspecified in a passive OPEN and are to be filled in by the\r
+      parameters of the incoming SYN segment.  Verify the security and\r
+      precedence requested are allowed for this user, if not return\r
+      "error:  precedence not allowed" or "error:  security/compartment\r
+      not allowed."  If passive enter the LISTEN state and return.  If\r
+      active and the foreign socket is unspecified, return "error:\r
+      foreign socket unspecified"; if active and the foreign socket is\r
+      specified, issue a SYN segment.  An initial send sequence number\r
+      (ISS) is selected.  A SYN segment of the form <SEQ=ISS><CTL=SYN>\r
+      is sent.  Set SND.UNA to ISS, SND.NXT to ISS+1, enter SYN-SENT\r
+      state, and return.\r
+\r
+      If the caller does not have access to the local socket specified,\r
+      return "error:  connection illegal for this process".  If there is\r
+      no room to create a new connection, return "error:  insufficient\r
+      resources".\r
+\r
+    LISTEN STATE\r
+\r
+      If active and the foreign socket is specified, then change the\r
+      connection from passive to active, select an ISS.  Send a SYN\r
+      segment, set SND.UNA to ISS, SND.NXT to ISS+1.  Enter SYN-SENT\r
+      state.  Data associated with SEND may be sent with SYN segment or\r
+      queued for transmission after entering ESTABLISHED state.  The\r
+      urgent bit if requested in the command must be sent with the data\r
+      segments sent as a result of this command.  If there is no room to\r
+      queue the request, respond with "error:  insufficient resources".\r
+      If Foreign socket was not specified, then return "error:  foreign\r
+      socket unspecified".\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 54]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+OPEN Call\r
+\r
+\r
+\r
+    SYN-SENT STATE\r
+    SYN-RECEIVED STATE\r
+    ESTABLISHED STATE\r
+    FIN-WAIT-1 STATE\r
+    FIN-WAIT-2 STATE\r
+    CLOSE-WAIT STATE\r
+    CLOSING STATE\r
+    LAST-ACK STATE\r
+    TIME-WAIT STATE\r
+\r
+      Return "error:  connection already exists".\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 55]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                               SEND Call\r
+\r
+\r
+\r
+  SEND Call\r
+\r
+    CLOSED STATE (i.e., TCB does not exist)\r
+\r
+      If the user does not have access to such a connection, then return\r
+      "error:  connection illegal for this process".\r
+\r
+      Otherwise, return "error:  connection does not exist".\r
+\r
+    LISTEN STATE\r
+\r
+      If the foreign socket is specified, then change the connection\r
+      from passive to active, select an ISS.  Send a SYN segment, set\r
+      SND.UNA to ISS, SND.NXT to ISS+1.  Enter SYN-SENT state.  Data\r
+      associated with SEND may be sent with SYN segment or queued for\r
+      transmission after entering ESTABLISHED state.  The urgent bit if\r
+      requested in the command must be sent with the data segments sent\r
+      as a result of this command.  If there is no room to queue the\r
+      request, respond with "error:  insufficient resources".  If\r
+      Foreign socket was not specified, then return "error:  foreign\r
+      socket unspecified".\r
+\r
+    SYN-SENT STATE\r
+    SYN-RECEIVED STATE\r
+\r
+      Queue the data for transmission after entering ESTABLISHED state.\r
+      If no space to queue, respond with "error:  insufficient\r
+      resources".\r
+\r
+    ESTABLISHED STATE\r
+    CLOSE-WAIT STATE\r
+\r
+      Segmentize the buffer and send it with a piggybacked\r
+      acknowledgment (acknowledgment value = RCV.NXT).  If there is\r
+      insufficient space to remember this buffer, simply return "error:\r
+      insufficient resources".\r
+\r
+      If the urgent flag is set, then SND.UP <- SND.NXT-1 and set the\r
+      urgent pointer in the outgoing segments.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 56]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+SEND Call\r
+\r
+\r
+\r
+    FIN-WAIT-1 STATE\r
+    FIN-WAIT-2 STATE\r
+    CLOSING STATE\r
+    LAST-ACK STATE\r
+    TIME-WAIT STATE\r
+\r
+      Return "error:  connection closing" and do not service request.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 57]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                            RECEIVE Call\r
+\r
+\r
+\r
+  RECEIVE Call\r
+\r
+    CLOSED STATE (i.e., TCB does not exist)\r
+\r
+      If the user does not have access to such a connection, return\r
+      "error:  connection illegal for this process".\r
+\r
+      Otherwise return "error:  connection does not exist".\r
+\r
+    LISTEN STATE\r
+    SYN-SENT STATE\r
+    SYN-RECEIVED STATE\r
+\r
+      Queue for processing after entering ESTABLISHED state.  If there\r
+      is no room to queue this request, respond with "error:\r
+      insufficient resources".\r
+\r
+    ESTABLISHED STATE\r
+    FIN-WAIT-1 STATE\r
+    FIN-WAIT-2 STATE\r
+\r
+      If insufficient incoming segments are queued to satisfy the\r
+      request, queue the request.  If there is no queue space to\r
+      remember the RECEIVE, respond with "error:  insufficient\r
+      resources".\r
+\r
+      Reassemble queued incoming segments into receive buffer and return\r
+      to user.  Mark "push seen" (PUSH) if this is the case.\r
+\r
+      If RCV.UP is in advance of the data currently being passed to the\r
+      user notify the user of the presence of urgent data.\r
+\r
+      When the TCP takes responsibility for delivering data to the user\r
+      that fact must be communicated to the sender via an\r
+      acknowledgment.  The formation of such an acknowledgment is\r
+      described below in the discussion of processing an incoming\r
+      segment.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 58]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+RECEIVE Call\r
+\r
+\r
+\r
+    CLOSE-WAIT STATE\r
+\r
+      Since the remote side has already sent FIN, RECEIVEs must be\r
+      satisfied by text already on hand, but not yet delivered to the\r
+      user.  If no text is awaiting delivery, the RECEIVE will get a\r
+      "error:  connection closing" response.  Otherwise, any remaining\r
+      text can be used to satisfy the RECEIVE.\r
+\r
+    CLOSING STATE\r
+    LAST-ACK STATE\r
+    TIME-WAIT STATE\r
+\r
+      Return "error:  connection closing".\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 59]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                              CLOSE Call\r
+\r
+\r
+\r
+  CLOSE Call\r
+\r
+    CLOSED STATE (i.e., TCB does not exist)\r
+\r
+      If the user does not have access to such a connection, return\r
+      "error:  connection illegal for this process".\r
+\r
+      Otherwise, return "error:  connection does not exist".\r
+\r
+    LISTEN STATE\r
+\r
+      Any outstanding RECEIVEs are returned with "error:  closing"\r
+      responses.  Delete TCB, enter CLOSED state, and return.\r
+\r
+    SYN-SENT STATE\r
+\r
+      Delete the TCB and return "error:  closing" responses to any\r
+      queued SENDs, or RECEIVEs.\r
+\r
+    SYN-RECEIVED STATE\r
+\r
+      If no SENDs have been issued and there is no pending data to send,\r
+      then form a FIN segment and send it, and enter FIN-WAIT-1 state;\r
+      otherwise queue for processing after entering ESTABLISHED state.\r
+\r
+    ESTABLISHED STATE\r
+\r
+      Queue this until all preceding SENDs have been segmentized, then\r
+      form a FIN segment and send it.  In any case, enter FIN-WAIT-1\r
+      state.\r
+\r
+    FIN-WAIT-1 STATE\r
+    FIN-WAIT-2 STATE\r
+\r
+      Strictly speaking, this is an error and should receive a "error:\r
+      connection closing" response.  An "ok" response would be\r
+      acceptable, too, as long as a second FIN is not emitted (the first\r
+      FIN may be retransmitted though).\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 60]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+CLOSE Call\r
+\r
+\r
+\r
+    CLOSE-WAIT STATE\r
+\r
+      Queue this request until all preceding SENDs have been\r
+      segmentized; then send a FIN segment, enter CLOSING state.\r
+\r
+    CLOSING STATE\r
+    LAST-ACK STATE\r
+    TIME-WAIT STATE\r
+\r
+      Respond with "error:  connection closing".\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 61]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                              ABORT Call\r
+\r
+\r
+\r
+  ABORT Call\r
+\r
+    CLOSED STATE (i.e., TCB does not exist)\r
+\r
+      If the user should not have access to such a connection, return\r
+      "error:  connection illegal for this process".\r
+\r
+      Otherwise return "error:  connection does not exist".\r
+\r
+    LISTEN STATE\r
+\r
+      Any outstanding RECEIVEs should be returned with "error:\r
+      connection reset" responses.  Delete TCB, enter CLOSED state, and\r
+      return.\r
+\r
+    SYN-SENT STATE\r
+\r
+      All queued SENDs and RECEIVEs should be given "connection reset"\r
+      notification, delete the TCB, enter CLOSED state, and return.\r
+\r
+    SYN-RECEIVED STATE\r
+    ESTABLISHED STATE\r
+    FIN-WAIT-1 STATE\r
+    FIN-WAIT-2 STATE\r
+    CLOSE-WAIT STATE\r
+\r
+      Send a reset segment:\r
+\r
+        <SEQ=SND.NXT><CTL=RST>\r
+\r
+      All queued SENDs and RECEIVEs should be given "connection reset"\r
+      notification; all segments queued for transmission (except for the\r
+      RST formed above) or retransmission should be flushed, delete the\r
+      TCB, enter CLOSED state, and return.\r
+\r
+    CLOSING STATE\r
+    LAST-ACK STATE\r
+    TIME-WAIT STATE\r
+\r
+      Respond with "ok" and delete the TCB, enter CLOSED state, and\r
+      return.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 62]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+STATUS Call\r
+\r
+\r
+\r
+  STATUS Call\r
+\r
+    CLOSED STATE (i.e., TCB does not exist)\r
+\r
+      If the user should not have access to such a connection, return\r
+      "error:  connection illegal for this process".\r
+\r
+      Otherwise return "error:  connection does not exist".\r
+\r
+    LISTEN STATE\r
+\r
+      Return "state = LISTEN", and the TCB pointer.\r
+\r
+    SYN-SENT STATE\r
+\r
+      Return "state = SYN-SENT", and the TCB pointer.\r
+\r
+    SYN-RECEIVED STATE\r
+\r
+      Return "state = SYN-RECEIVED", and the TCB pointer.\r
+\r
+    ESTABLISHED STATE\r
+\r
+      Return "state = ESTABLISHED", and the TCB pointer.\r
+\r
+    FIN-WAIT-1 STATE\r
+\r
+      Return "state = FIN-WAIT-1", and the TCB pointer.\r
+\r
+    FIN-WAIT-2 STATE\r
+\r
+      Return "state = FIN-WAIT-2", and the TCB pointer.\r
+\r
+    CLOSE-WAIT STATE\r
+\r
+      Return "state = CLOSE-WAIT", and the TCB pointer.\r
+\r
+    CLOSING STATE\r
+\r
+      Return "state = CLOSING", and the TCB pointer.\r
+\r
+    LAST-ACK STATE\r
+\r
+      Return "state = LAST-ACK", and the TCB pointer.\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 63]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                             STATUS Call\r
+\r
+\r
+\r
+    TIME-WAIT STATE\r
+\r
+      Return "state = TIME-WAIT", and the TCB pointer.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 64]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+SEGMENT ARRIVES\r
+\r
+\r
+\r
+  SEGMENT ARRIVES\r
+\r
+    If the state is CLOSED (i.e., TCB does not exist) then\r
+\r
+      all data in the incoming segment is discarded.  An incoming\r
+      segment containing a RST is discarded.  An incoming segment not\r
+      containing a RST causes a RST to be sent in response.  The\r
+      acknowledgment and sequence field values are selected to make the\r
+      reset sequence acceptable to the TCP that sent the offending\r
+      segment.\r
+\r
+      If the ACK bit is off, sequence number zero is used,\r
+\r
+        <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK>\r
+\r
+      If the ACK bit is on,\r
+\r
+        <SEQ=SEG.ACK><CTL=RST>\r
+\r
+      Return.\r
+\r
+    If the state is LISTEN then\r
+\r
+      first check for an RST\r
+\r
+        An incoming RST should be ignored.  Return.\r
+\r
+      second check for an ACK\r
+\r
+        Any acknowledgment is bad if it arrives on a connection still in\r
+        the LISTEN state.  An acceptable reset segment should be formed\r
+        for any arriving ACK-bearing segment.  The RST should be\r
+        formatted as follows:\r
+\r
+          <SEQ=SEG.ACK><CTL=RST>\r
+\r
+        Return.\r
+\r
+      third check for a SYN\r
+\r
+        If the SYN bit is set, check the security.  If the\r
+        security/compartment on the incoming segment does not exactly\r
+        match the security/compartment in the TCB then send a reset and\r
+        return.\r
+\r
+          <SEQ=SEG.ACK><CTL=RST>\r
+\r
+\r
+\r
+                                                               [Page 65]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                         SEGMENT ARRIVES\r
+\r
+\r
+\r
+        If the SEG.PRC is greater than the TCB.PRC then if allowed by\r
+        the user and the system set TCB.PRC<-SEG.PRC, if not allowed\r
+        send a reset and return.\r
+\r
+          <SEQ=SEG.ACK><CTL=RST>\r
+\r
+        If the SEG.PRC is less than the TCB.PRC then continue.\r
+\r
+        Set RCV.NXT to SEG.SEQ+1, IRS is set to SEG.SEQ and any other\r
+        control or text should be queued for processing later.  ISS\r
+        should be selected and a SYN segment sent of the form:\r
+\r
+          <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK>\r
+\r
+        SND.NXT is set to ISS+1 and SND.UNA to ISS.  The connection\r
+        state should be changed to SYN-RECEIVED.  Note that any other\r
+        incoming control or data (combined with SYN) will be processed\r
+        in the SYN-RECEIVED state, but processing of SYN and ACK should\r
+        not be repeated.  If the listen was not fully specified (i.e.,\r
+        the foreign socket was not fully specified), then the\r
+        unspecified fields should be filled in now.\r
+\r
+      fourth other text or control\r
+\r
+        Any other control or text-bearing segment (not containing SYN)\r
+        must have an ACK and thus would be discarded by the ACK\r
+        processing.  An incoming RST segment could not be valid, since\r
+        it could not have been sent in response to anything sent by this\r
+        incarnation of the connection.  So you are unlikely to get here,\r
+        but if you do, drop the segment, and return.\r
+\r
+    If the state is SYN-SENT then\r
+\r
+      first check the ACK bit\r
+\r
+        If the ACK bit is set\r
+\r
+          If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send a reset (unless\r
+          the RST bit is set, if so drop the segment and return)\r
+\r
+            <SEQ=SEG.ACK><CTL=RST>\r
+\r
+          and discard the segment.  Return.\r
+\r
+          If SND.UNA =< SEG.ACK =< SND.NXT then the ACK is acceptable.\r
+\r
+      second check the RST bit\r
+\r
+\r
+[Page 66]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+SEGMENT ARRIVES\r
+\r
+\r
+\r
+        If the RST bit is set\r
+\r
+          If the ACK was acceptable then signal the user "error:\r
+          connection reset", drop the segment, enter CLOSED state,\r
+          delete TCB, and return.  Otherwise (no ACK) drop the segment\r
+          and return.\r
+\r
+      third check the security and precedence\r
+\r
+        If the security/compartment in the segment does not exactly\r
+        match the security/compartment in the TCB, send a reset\r
+\r
+          If there is an ACK\r
+\r
+            <SEQ=SEG.ACK><CTL=RST>\r
+\r
+          Otherwise\r
+\r
+            <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK>\r
+\r
+        If there is an ACK\r
+\r
+          The precedence in the segment must match the precedence in the\r
+          TCB, if not, send a reset\r
+\r
+            <SEQ=SEG.ACK><CTL=RST>\r
+\r
+        If there is no ACK\r
+\r
+          If the precedence in the segment is higher than the precedence\r
+          in the TCB then if allowed by the user and the system raise\r
+          the precedence in the TCB to that in the segment, if not\r
+          allowed to raise the prec then send a reset.\r
+\r
+            <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK>\r
+\r
+          If the precedence in the segment is lower than the precedence\r
+          in the TCB continue.\r
+\r
+        If a reset was sent, discard the segment and return.\r
+\r
+      fourth check the SYN bit\r
+\r
+        This step should be reached only if the ACK is ok, or there is\r
+        no ACK, and it the segment did not contain a RST.\r
+\r
+        If the SYN bit is on and the security/compartment and precedence\r
+\r
+\r
+                                                               [Page 67]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                         SEGMENT ARRIVES\r
+\r
+\r
+\r
+        are acceptable then, RCV.NXT is set to SEG.SEQ+1, IRS is set to\r
+        SEG.SEQ.  SND.UNA should be advanced to equal SEG.ACK (if there\r
+        is an ACK), and any segments on the retransmission queue which\r
+        are thereby acknowledged should be removed.\r
+\r
+        If SND.UNA > ISS (our SYN has been ACKed), change the connection\r
+        state to ESTABLISHED, form an ACK segment\r
+\r
+          <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>\r
+\r
+        and send it.  Data or controls which were queued for\r
+        transmission may be included.  If there are other controls or\r
+        text in the segment then continue processing at the sixth step\r
+        below where the URG bit is checked, otherwise return.\r
+\r
+        Otherwise enter SYN-RECEIVED, form a SYN,ACK segment\r
+\r
+          <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK>\r
+\r
+        and send it.  If there are other controls or text in the\r
+        segment, queue them for processing after the ESTABLISHED state\r
+        has been reached, return.\r
+\r
+      fifth, if neither of the SYN or RST bits is set then drop the\r
+      segment and return.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 68]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+SEGMENT ARRIVES\r
+\r
+\r
+\r
+    Otherwise,\r
+\r
+    first check sequence number\r
+\r
+      SYN-RECEIVED STATE\r
+      ESTABLISHED STATE\r
+      FIN-WAIT-1 STATE\r
+      FIN-WAIT-2 STATE\r
+      CLOSE-WAIT STATE\r
+      CLOSING STATE\r
+      LAST-ACK STATE\r
+      TIME-WAIT STATE\r
+\r
+        Segments are processed in sequence.  Initial tests on arrival\r
+        are used to discard old duplicates, but further processing is\r
+        done in SEG.SEQ order.  If a segment's contents straddle the\r
+        boundary between old and new, only the new parts should be\r
+        processed.\r
+\r
+        There are four cases for the acceptability test for an incoming\r
+        segment:\r
+\r
+        Segment Receive  Test\r
+        Length  Window\r
+        ------- -------  -------------------------------------------\r
+\r
+           0       0     SEG.SEQ = RCV.NXT\r
+\r
+           0      >0     RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND\r
+\r
+          >0       0     not acceptable\r
+\r
+          >0      >0     RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND\r
+                      or RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND\r
+\r
+        If the RCV.WND is zero, no segments will be acceptable, but\r
+        special allowance should be made to accept valid ACKs, URGs and\r
+        RSTs.\r
+\r
+        If an incoming segment is not acceptable, an acknowledgment\r
+        should be sent in reply (unless the RST bit is set, if so drop\r
+        the segment and return):\r
+\r
+          <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>\r
+\r
+        After sending the acknowledgment, drop the unacceptable segment\r
+        and return.\r
+\r
+\r
+                                                               [Page 69]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                         SEGMENT ARRIVES\r
+\r
+\r
+\r
+        In the following it is assumed that the segment is the idealized\r
+        segment that begins at RCV.NXT and does not exceed the window.\r
+        One could tailor actual segments to fit this assumption by\r
+        trimming off any portions that lie outside the window (including\r
+        SYN and FIN), and only processing further if the segment then\r
+        begins at RCV.NXT.  Segments with higher begining sequence\r
+        numbers may be held for later processing.\r
+\r
+    second check the RST bit,\r
+\r
+      SYN-RECEIVED STATE\r
+\r
+        If the RST bit is set\r
+\r
+          If this connection was initiated with a passive OPEN (i.e.,\r
+          came from the LISTEN state), then return this connection to\r
+          LISTEN state and return.  The user need not be informed.  If\r
+          this connection was initiated with an active OPEN (i.e., came\r
+          from SYN-SENT state) then the connection was refused, signal\r
+          the user "connection refused".  In either case, all segments\r
+          on the retransmission queue should be removed.  And in the\r
+          active OPEN case, enter the CLOSED state and delete the TCB,\r
+          and return.\r
+\r
+      ESTABLISHED\r
+      FIN-WAIT-1\r
+      FIN-WAIT-2\r
+      CLOSE-WAIT\r
+\r
+        If the RST bit is set then, any outstanding RECEIVEs and SEND\r
+        should receive "reset" responses.  All segment queues should be\r
+        flushed.  Users should also receive an unsolicited general\r
+        "connection reset" signal.  Enter the CLOSED state, delete the\r
+        TCB, and return.\r
+\r
+      CLOSING STATE\r
+      LAST-ACK STATE\r
+      TIME-WAIT\r
+\r
+        If the RST bit is set then, enter the CLOSED state, delete the\r
+        TCB, and return.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 70]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+SEGMENT ARRIVES\r
+\r
+\r
+\r
+    third check security and precedence\r
+\r
+      SYN-RECEIVED\r
+\r
+        If the security/compartment and precedence in the segment do not\r
+        exactly match the security/compartment and precedence in the TCB\r
+        then send a reset, and return.\r
+\r
+      ESTABLISHED STATE\r
+\r
+        If the security/compartment and precedence in the segment do not\r
+        exactly match the security/compartment and precedence in the TCB\r
+        then send a reset, any outstanding RECEIVEs and SEND should\r
+        receive "reset" responses.  All segment queues should be\r
+        flushed.  Users should also receive an unsolicited general\r
+        "connection reset" signal.  Enter the CLOSED state, delete the\r
+        TCB, and return.\r
+\r
+      Note this check is placed following the sequence check to prevent\r
+      a segment from an old connection between these ports with a\r
+      different security or precedence from causing an abort of the\r
+      current connection.\r
+\r
+    fourth, check the SYN bit,\r
+\r
+      SYN-RECEIVED\r
+      ESTABLISHED STATE\r
+      FIN-WAIT STATE-1\r
+      FIN-WAIT STATE-2\r
+      CLOSE-WAIT STATE\r
+      CLOSING STATE\r
+      LAST-ACK STATE\r
+      TIME-WAIT STATE\r
+\r
+        If the SYN is in the window it is an error, send a reset, any\r
+        outstanding RECEIVEs and SEND should receive "reset" responses,\r
+        all segment queues should be flushed, the user should also\r
+        receive an unsolicited general "connection reset" signal, enter\r
+        the CLOSED state, delete the TCB, and return.\r
+\r
+        If the SYN is not in the window this step would not be reached\r
+        and an ack would have been sent in the first step (sequence\r
+        number check).\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 71]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                         SEGMENT ARRIVES\r
+\r
+\r
+\r
+    fifth check the ACK field,\r
+\r
+      if the ACK bit is off drop the segment and return\r
+\r
+      if the ACK bit is on\r
+\r
+        SYN-RECEIVED STATE\r
+\r
+          If SND.UNA =< SEG.ACK =< SND.NXT then enter ESTABLISHED state\r
+          and continue processing.\r
+\r
+            If the segment acknowledgment is not acceptable, form a\r
+            reset segment,\r
+\r
+              <SEQ=SEG.ACK><CTL=RST>\r
+\r
+            and send it.\r
+\r
+        ESTABLISHED STATE\r
+\r
+          If SND.UNA < SEG.ACK =< SND.NXT then, set SND.UNA <- SEG.ACK.\r
+          Any segments on the retransmission queue which are thereby\r
+          entirely acknowledged are removed.  Users should receive\r
+          positive acknowledgments for buffers which have been SENT and\r
+          fully acknowledged (i.e., SEND buffer should be returned with\r
+          "ok" response).  If the ACK is a duplicate\r
+          (SEG.ACK < SND.UNA), it can be ignored.  If the ACK acks\r
+          something not yet sent (SEG.ACK > SND.NXT) then send an ACK,\r
+          drop the segment, and return.\r
+\r
+          If SND.UNA < SEG.ACK =< SND.NXT, the send window should be\r
+          updated.  If (SND.WL1 < SEG.SEQ or (SND.WL1 = SEG.SEQ and\r
+          SND.WL2 =< SEG.ACK)), set SND.WND <- SEG.WND, set\r
+          SND.WL1 <- SEG.SEQ, and set SND.WL2 <- SEG.ACK.\r
+\r
+          Note that SND.WND is an offset from SND.UNA, that SND.WL1\r
+          records the sequence number of the last segment used to update\r
+          SND.WND, and that SND.WL2 records the acknowledgment number of\r
+          the last segment used to update SND.WND.  The check here\r
+          prevents using old segments to update the window.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 72]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+SEGMENT ARRIVES\r
+\r
+\r
+\r
+        FIN-WAIT-1 STATE\r
+\r
+          In addition to the processing for the ESTABLISHED state, if\r
+          our FIN is now acknowledged then enter FIN-WAIT-2 and continue\r
+          processing in that state.\r
+\r
+        FIN-WAIT-2 STATE\r
+\r
+          In addition to the processing for the ESTABLISHED state, if\r
+          the retransmission queue is empty, the user's CLOSE can be\r
+          acknowledged ("ok") but do not delete the TCB.\r
+\r
+        CLOSE-WAIT STATE\r
+\r
+          Do the same processing as for the ESTABLISHED state.\r
+\r
+        CLOSING STATE\r
+\r
+          In addition to the processing for the ESTABLISHED state, if\r
+          the ACK acknowledges our FIN then enter the TIME-WAIT state,\r
+          otherwise ignore the segment.\r
+\r
+        LAST-ACK STATE\r
+\r
+          The only thing that can arrive in this state is an\r
+          acknowledgment of our FIN.  If our FIN is now acknowledged,\r
+          delete the TCB, enter the CLOSED state, and return.\r
+\r
+        TIME-WAIT STATE\r
+\r
+          The only thing that can arrive in this state is a\r
+          retransmission of the remote FIN.  Acknowledge it, and restart\r
+          the 2 MSL timeout.\r
+\r
+    sixth, check the URG bit,\r
+\r
+      ESTABLISHED STATE\r
+      FIN-WAIT-1 STATE\r
+      FIN-WAIT-2 STATE\r
+\r
+        If the URG bit is set, RCV.UP <- max(RCV.UP,SEG.UP), and signal\r
+        the user that the remote side has urgent data if the urgent\r
+        pointer (RCV.UP) is in advance of the data consumed.  If the\r
+        user has already been signaled (or is still in the "urgent\r
+        mode") for this continuous sequence of urgent data, do not\r
+        signal the user again.\r
+\r
+\r
+\r
+                                                               [Page 73]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                         SEGMENT ARRIVES\r
+\r
+\r
+\r
+      CLOSE-WAIT STATE\r
+      CLOSING STATE\r
+      LAST-ACK STATE\r
+      TIME-WAIT\r
+\r
+        This should not occur, since a FIN has been received from the\r
+        remote side.  Ignore the URG.\r
+\r
+    seventh, process the segment text,\r
+\r
+      ESTABLISHED STATE\r
+      FIN-WAIT-1 STATE\r
+      FIN-WAIT-2 STATE\r
+\r
+        Once in the ESTABLISHED state, it is possible to deliver segment\r
+        text to user RECEIVE buffers.  Text from segments can be moved\r
+        into buffers until either the buffer is full or the segment is\r
+        empty.  If the segment empties and carries an PUSH flag, then\r
+        the user is informed, when the buffer is returned, that a PUSH\r
+        has been received.\r
+\r
+        When the TCP takes responsibility for delivering the data to the\r
+        user it must also acknowledge the receipt of the data.\r
+\r
+        Once the TCP takes responsibility for the data it advances\r
+        RCV.NXT over the data accepted, and adjusts RCV.WND as\r
+        apporopriate to the current buffer availability.  The total of\r
+        RCV.NXT and RCV.WND should not be reduced.\r
+\r
+        Please note the window management suggestions in section 3.7.\r
+\r
+        Send an acknowledgment of the form:\r
+\r
+          <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>\r
+\r
+        This acknowledgment should be piggybacked on a segment being\r
+        transmitted if possible without incurring undue delay.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 74]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+SEGMENT ARRIVES\r
+\r
+\r
+\r
+      CLOSE-WAIT STATE\r
+      CLOSING STATE\r
+      LAST-ACK STATE\r
+      TIME-WAIT STATE\r
+\r
+        This should not occur, since a FIN has been received from the\r
+        remote side.  Ignore the segment text.\r
+\r
+    eighth, check the FIN bit,\r
+\r
+      Do not process the FIN if the state is CLOSED, LISTEN or SYN-SENT\r
+      since the SEG.SEQ cannot be validated; drop the segment and\r
+      return.\r
+\r
+      If the FIN bit is set, signal the user "connection closing" and\r
+      return any pending RECEIVEs with same message, advance RCV.NXT\r
+      over the FIN, and send an acknowledgment for the FIN.  Note that\r
+      FIN implies PUSH for any segment text not yet delivered to the\r
+      user.\r
+\r
+        SYN-RECEIVED STATE\r
+        ESTABLISHED STATE\r
+\r
+          Enter the CLOSE-WAIT state.\r
+\r
+        FIN-WAIT-1 STATE\r
+\r
+          If our FIN has been ACKed (perhaps in this segment), then\r
+          enter TIME-WAIT, start the time-wait timer, turn off the other\r
+          timers; otherwise enter the CLOSING state.\r
+\r
+        FIN-WAIT-2 STATE\r
+\r
+          Enter the TIME-WAIT state.  Start the time-wait timer, turn\r
+          off the other timers.\r
+\r
+        CLOSE-WAIT STATE\r
+\r
+          Remain in the CLOSE-WAIT state.\r
+\r
+        CLOSING STATE\r
+\r
+          Remain in the CLOSING state.\r
+\r
+        LAST-ACK STATE\r
+\r
+          Remain in the LAST-ACK state.\r
+\r
+\r
+                                                               [Page 75]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Functional Specification\r
+                                                         SEGMENT ARRIVES\r
+\r
+\r
+\r
+        TIME-WAIT STATE\r
+\r
+          Remain in the TIME-WAIT state.  Restart the 2 MSL time-wait\r
+          timeout.\r
+\r
+    and return.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 76]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                Functional Specification\r
+USER TIMEOUT\r
+\r
+\r
+\r
+  USER TIMEOUT\r
+\r
+    For any state if the user timeout expires, flush all queues, signal\r
+    the user "error:  connection aborted due to user timeout" in general\r
+    and for any outstanding calls, delete the TCB, enter the CLOSED\r
+    state and return.\r
+\r
+  RETRANSMISSION TIMEOUT\r
+\r
+    For any state if the retransmission timeout expires on a segment in\r
+    the retransmission queue, send the segment at the front of the\r
+    retransmission queue again, reinitialize the retransmission timer,\r
+    and return.\r
+\r
+  TIME-WAIT TIMEOUT\r
+\r
+    If the time-wait timeout expires on a connection delete the TCB,\r
+    enter the CLOSED state and return.\r
+\r
+   \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 77]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+[Page 78]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+\r
+\r
+\r
+                                GLOSSARY\r
+\r
+\r
+\r
+1822\r
+          BBN Report 1822, "The Specification of the Interconnection of\r
+          a Host and an IMP".  The specification of interface between a\r
+          host and the ARPANET.\r
+\r
+ACK\r
+          A control bit (acknowledge) occupying no sequence space, which\r
+          indicates that the acknowledgment field of this segment\r
+          specifies the next sequence number the sender of this segment\r
+          is expecting to receive, hence acknowledging receipt of all\r
+          previous sequence numbers.\r
+\r
+ARPANET message\r
+          The unit of transmission between a host and an IMP in the\r
+          ARPANET.  The maximum size is about 1012 octets (8096 bits).\r
+\r
+ARPANET packet\r
+          A unit of transmission used internally in the ARPANET between\r
+          IMPs.  The maximum size is about 126 octets (1008 bits).\r
+\r
+connection\r
+          A logical communication path identified by a pair of sockets.\r
+\r
+datagram\r
+          A message sent in a packet switched computer communications\r
+          network.\r
+\r
+Destination Address\r
+          The destination address, usually the network and host\r
+          identifiers.\r
+\r
+FIN\r
+          A control bit (finis) occupying one sequence number, which\r
+          indicates that the sender will send no more data or control\r
+          occupying sequence space.\r
+\r
+fragment\r
+          A portion of a logical unit of data, in particular an internet\r
+          fragment is a portion of an internet datagram.\r
+\r
+FTP\r
+          A file transfer protocol.\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 79]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Glossary\r
+\r
+\r
+\r
+header\r
+          Control information at the beginning of a message, segment,\r
+          fragment, packet or block of data.\r
+\r
+host\r
+          A computer.  In particular a source or destination of messages\r
+          from the point of view of the communication network.\r
+\r
+Identification\r
+          An Internet Protocol field.  This identifying value assigned\r
+          by the sender aids in assembling the fragments of a datagram.\r
+\r
+IMP\r
+          The Interface Message Processor, the packet switch of the\r
+          ARPANET.\r
+\r
+internet address\r
+          A source or destination address specific to the host level.\r
+\r
+internet datagram\r
+          The unit of data exchanged between an internet module and the\r
+          higher level protocol together with the internet header.\r
+\r
+internet fragment\r
+          A portion of the data of an internet datagram with an internet\r
+          header.\r
+\r
+IP\r
+          Internet Protocol.\r
+\r
+IRS\r
+          The Initial Receive Sequence number.  The first sequence\r
+          number used by the sender on a connection.\r
+\r
+ISN\r
+          The Initial Sequence Number.  The first sequence number used\r
+          on a connection, (either ISS or IRS).  Selected on a clock\r
+          based procedure.\r
+\r
+ISS\r
+          The Initial Send Sequence number.  The first sequence number\r
+          used by the sender on a connection.\r
+\r
+leader\r
+          Control information at the beginning of a message or block of\r
+          data.  In particular, in the ARPANET, the control information\r
+          on an ARPANET message at the host-IMP interface.\r
+\r
+\r
+\r
+[Page 80]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                                Glossary\r
+\r
+\r
+\r
+left sequence\r
+          This is the next sequence number to be acknowledged by the\r
+          data receiving TCP (or the lowest currently unacknowledged\r
+          sequence number) and is sometimes referred to as the left edge\r
+          of the send window.\r
+\r
+local packet\r
+          The unit of transmission within a local network.\r
+\r
+module\r
+          An implementation, usually in software, of a protocol or other\r
+          procedure.\r
+\r
+MSL\r
+          Maximum Segment Lifetime, the time a TCP segment can exist in\r
+          the internetwork system.  Arbitrarily defined to be 2 minutes.\r
+\r
+octet\r
+          An eight bit byte.\r
+\r
+Options\r
+          An Option field may contain several options, and each option\r
+          may be several octets in length.  The options are used\r
+          primarily in testing situations; for example, to carry\r
+          timestamps.  Both the Internet Protocol and TCP provide for\r
+          options fields.\r
+\r
+packet\r
+          A package of data with a header which may or may not be\r
+          logically complete.  More often a physical packaging than a\r
+          logical packaging of data.\r
+\r
+port\r
+          The portion of a socket that specifies which logical input or\r
+          output channel of a process is associated with the data.\r
+\r
+process\r
+          A program in execution.  A source or destination of data from\r
+          the point of view of the TCP or other host-to-host protocol.\r
+\r
+PUSH\r
+          A control bit occupying no sequence space, indicating that\r
+          this segment contains data that must be pushed through to the\r
+          receiving user.\r
+\r
+RCV.NXT\r
+          receive next sequence number\r
+\r
+\r
+\r
+                                                               [Page 81]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Glossary\r
+\r
+\r
+\r
+RCV.UP\r
+          receive urgent pointer\r
+\r
+RCV.WND\r
+          receive window\r
+\r
+receive next sequence number\r
+          This is the next sequence number the local TCP is expecting to\r
+          receive.\r
+\r
+receive window\r
+          This represents the sequence numbers the local (receiving) TCP\r
+          is willing to receive.  Thus, the local TCP considers that\r
+          segments overlapping the range RCV.NXT to\r
+          RCV.NXT + RCV.WND - 1 carry acceptable data or control.\r
+          Segments containing sequence numbers entirely outside of this\r
+          range are considered duplicates and discarded.\r
+\r
+RST\r
+          A control bit (reset), occupying no sequence space, indicating\r
+          that the receiver should delete the connection without further\r
+          interaction.  The receiver can determine, based on the\r
+          sequence number and acknowledgment fields of the incoming\r
+          segment, whether it should honor the reset command or ignore\r
+          it.  In no case does receipt of a segment containing RST give\r
+          rise to a RST in response.\r
+\r
+RTP\r
+          Real Time Protocol:  A host-to-host protocol for communication\r
+          of time critical information.\r
+\r
+SEG.ACK\r
+          segment acknowledgment\r
+\r
+SEG.LEN\r
+          segment length\r
+\r
+SEG.PRC\r
+          segment precedence value\r
+\r
+SEG.SEQ\r
+          segment sequence\r
+\r
+SEG.UP\r
+          segment urgent pointer field\r
+\r
+\r
+\r
+\r
+\r
+[Page 82]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+                                                                Glossary\r
+\r
+\r
+\r
+SEG.WND\r
+          segment window field\r
+\r
+segment\r
+          A logical unit of data, in particular a TCP segment is the\r
+          unit of data transfered between a pair of TCP modules.\r
+\r
+segment acknowledgment\r
+          The sequence number in the acknowledgment field of the\r
+          arriving segment.\r
+\r
+segment length\r
+          The amount of sequence number space occupied by a segment,\r
+          including any controls which occupy sequence space.\r
+\r
+segment sequence\r
+          The number in the sequence field of the arriving segment.\r
+\r
+send sequence\r
+          This is the next sequence number the local (sending) TCP will\r
+          use on the connection.  It is initially selected from an\r
+          initial sequence number curve (ISN) and is incremented for\r
+          each octet of data or sequenced control transmitted.\r
+\r
+send window\r
+          This represents the sequence numbers which the remote\r
+          (receiving) TCP is willing to receive.  It is the value of the\r
+          window field specified in segments from the remote (data\r
+          receiving) TCP.  The range of new sequence numbers which may\r
+          be emitted by a TCP lies between SND.NXT and\r
+          SND.UNA + SND.WND - 1. (Retransmissions of sequence numbers\r
+          between SND.UNA and SND.NXT are expected, of course.)\r
+\r
+SND.NXT\r
+          send sequence\r
+\r
+SND.UNA\r
+          left sequence\r
+\r
+SND.UP\r
+          send urgent pointer\r
+\r
+SND.WL1\r
+          segment sequence number at last window update\r
+\r
+SND.WL2\r
+          segment acknowledgment number at last window update\r
+\r
+\r
+\r
+                                                               [Page 83]\r
+\f\r
+\r
+                                                          September 1981\r
+Transmission Control Protocol\r
+Glossary\r
+\r
+\r
+\r
+SND.WND\r
+          send window\r
+\r
+socket\r
+          An address which specifically includes a port identifier, that\r
+          is, the concatenation of an Internet Address with a TCP port.\r
+\r
+Source Address\r
+          The source address, usually the network and host identifiers.\r
+\r
+SYN\r
+          A control bit in the incoming segment, occupying one sequence\r
+          number, used at the initiation of a connection, to indicate\r
+          where the sequence numbering will start.\r
+\r
+TCB\r
+          Transmission control block, the data structure that records\r
+          the state of a connection.\r
+\r
+TCB.PRC\r
+          The precedence of the connection.\r
+\r
+TCP\r
+          Transmission Control Protocol:  A host-to-host protocol for\r
+          reliable communication in internetwork environments.\r
+\r
+TOS\r
+          Type of Service, an Internet Protocol field.\r
+\r
+Type of Service\r
+          An Internet Protocol field which indicates the type of service\r
+          for this internet fragment.\r
+\r
+URG\r
+          A control bit (urgent), occupying no sequence space, used to\r
+          indicate that the receiving user should be notified to do\r
+          urgent processing as long as there is data to be consumed with\r
+          sequence numbers less than the value indicated in the urgent\r
+          pointer.\r
+\r
+urgent pointer\r
+          A control field meaningful only when the URG bit is on.  This\r
+          field communicates the value of the urgent pointer which\r
+          indicates the data octet associated with the sending user's\r
+          urgent call.\r
+\r
+          \r
+\r
+\r
+\r
+[Page 84]                                                               \r
+\f\r
+\r
+September 1981                                                          \r
+                                           Transmission Control Protocol\r
+\r
+\r
+\r
+                               REFERENCES\r
+\r
+\r
+\r
+[1]  Cerf, V., and R. Kahn, "A Protocol for Packet Network\r
+     Intercommunication", IEEE Transactions on Communications,\r
+     Vol. COM-22, No. 5, pp 637-648, May 1974.\r
+\r
+[2]  Postel, J. (ed.), "Internet Protocol - DARPA Internet Program\r
+     Protocol Specification", RFC 791, USC/Information Sciences\r
+     Institute, September 1981.\r
+\r
+[3]  Dalal, Y. and C. Sunshine, "Connection Management in Transport\r
+     Protocols", Computer Networks, Vol. 2, No. 6, pp. 454-473,\r
+     December 1978.\r
+\r
+[4]  Postel, J., "Assigned Numbers", RFC 790, USC/Information Sciences\r
+     Institute, September 1981.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                                               [Page 85]\r
+\f\r
+\r
+\r
diff --git a/doc/rfc/std9.txt b/doc/rfc/std9.txt
new file mode 100644 (file)
index 0000000..2357b82
--- /dev/null
@@ -0,0 +1,3934 @@
+                                                                        \r
+Network Working Group                                          J. Postel\r
+Request for Comments: 959                                    J. Reynolds\r
+                                                                     ISI\r
+Obsoletes RFC: 765 (IEN 149)                                October 1985\r
+\r
+                      FILE TRANSFER PROTOCOL (FTP)\r
+\r
+\r
+Status of this Memo\r
+\r
+   This memo is the official specification of the File Transfer\r
+   Protocol (FTP).  Distribution of this memo is unlimited.\r
+\r
+   The following new optional commands are included in this edition of\r
+   the specification:\r
+\r
+      CDUP (Change to Parent Directory), SMNT (Structure Mount), STOU\r
+      (Store Unique), RMD (Remove Directory), MKD (Make Directory), PWD\r
+      (Print Directory), and SYST (System).\r
+\r
+   Note that this specification is compatible with the previous edition.\r
+\r
+1.  INTRODUCTION\r
+\r
+   The objectives of FTP are 1) to promote sharing of files (computer\r
+   programs and/or data), 2) to encourage indirect or implicit (via\r
+   programs) use of remote computers, 3) to shield a user from\r
+   variations in file storage systems among hosts, and 4) to transfer\r
+   data reliably and efficiently.  FTP, though usable directly by a user\r
+   at a terminal, is designed mainly for use by programs.\r
+\r
+   The attempt in this specification is to satisfy the diverse needs of\r
+   users of maxi-hosts, mini-hosts, personal workstations, and TACs,\r
+   with a simple, and easily implemented protocol design.\r
+\r
+   This paper assumes knowledge of the Transmission Control Protocol\r
+   (TCP) [2] and the Telnet Protocol [3].  These documents are contained\r
+   in the ARPA-Internet protocol handbook [1].\r
+\r
+2.  OVERVIEW\r
+\r
+   In this section, the history, the terminology, and the FTP model are\r
+   discussed.  The terms defined in this section are only those that\r
+   have special significance in FTP.  Some of the terminology is very\r
+   specific to the FTP model; some readers may wish to turn to the\r
+   section on the FTP model while reviewing the terminology.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 1]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   2.1.  HISTORY\r
+\r
+      FTP has had a long evolution over the years.  Appendix III is a\r
+      chronological compilation of Request for Comments documents\r
+      relating to FTP.  These include the first proposed file transfer\r
+      mechanisms in 1971 that were developed for implementation on hosts\r
+      at M.I.T. (RFC 114), plus comments and discussion in RFC 141.\r
+\r
+      RFC 172 provided a user-level oriented protocol for file transfer\r
+      between host computers (including terminal IMPs).  A revision of\r
+      this as RFC 265, restated FTP for additional review, while RFC 281\r
+      suggested further changes.  The use of a "Set Data Type"\r
+      transaction was proposed in RFC 294 in January 1982.\r
+\r
+      RFC 354 obsoleted RFCs 264 and 265.  The File Transfer Protocol\r
+      was now defined as a protocol for file transfer between HOSTs on\r
+      the ARPANET, with the primary function of FTP defined as\r
+      transfering files efficiently and reliably among hosts and\r
+      allowing the convenient use of remote file storage capabilities.\r
+      RFC 385 further commented on errors, emphasis points, and\r
+      additions to the protocol, while RFC 414 provided a status report\r
+      on the working server and user FTPs.  RFC 430, issued in 1973,\r
+      (among other RFCs too numerous to mention) presented further\r
+      comments on FTP.  Finally, an "official" FTP document was\r
+      published as RFC 454.\r
+\r
+      By July 1973, considerable changes from the last versions of FTP\r
+      were made, but the general structure remained the same.  RFC 542\r
+      was published as a new "official" specification to reflect these\r
+      changes.  However, many implementations based on the older\r
+      specification were not updated.\r
+\r
+      In 1974, RFCs 607 and 614 continued comments on FTP.  RFC 624\r
+      proposed further design changes and minor modifications.  In 1975,\r
+      RFC 686 entitled, "Leaving Well Enough Alone", discussed the\r
+      differences between all of the early and later versions of FTP.\r
+      RFC 691 presented a minor revision of RFC 686, regarding the\r
+      subject of print files.\r
+\r
+      Motivated by the transition from the NCP to the TCP as the\r
+      underlying protocol, a phoenix was born out of all of the above\r
+      efforts in RFC 765 as the specification of FTP for use on TCP.\r
+\r
+      This current edition of the FTP specification is intended to\r
+      correct some minor documentation errors, to improve the\r
+      explanation of some protocol features, and to add some new\r
+      optional commands.\r
+\r
+\r
+Postel & Reynolds                                               [Page 2]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      In particular, the following new optional commands are included in\r
+      this edition of the specification:\r
+\r
+         CDUP - Change to Parent Directory\r
+\r
+         SMNT - Structure Mount\r
+\r
+         STOU - Store Unique\r
+\r
+         RMD - Remove Directory\r
+\r
+         MKD - Make Directory\r
+\r
+         PWD - Print Directory\r
+\r
+         SYST - System\r
+\r
+      This specification is compatible with the previous edition.  A\r
+      program implemented in conformance to the previous specification\r
+      should automatically be in conformance to this specification.\r
+\r
+   2.2.  TERMINOLOGY\r
+\r
+      ASCII\r
+\r
+         The ASCII character set is as defined in the ARPA-Internet\r
+         Protocol Handbook.  In FTP, ASCII characters are defined to be\r
+         the lower half of an eight-bit code set (i.e., the most\r
+         significant bit is zero).\r
+\r
+      access controls\r
+\r
+         Access controls define users' access privileges to the use of a\r
+         system, and to the files in that system.  Access controls are\r
+         necessary to prevent unauthorized or accidental use of files.\r
+         It is the prerogative of a server-FTP process to invoke access\r
+         controls.\r
+\r
+      byte size\r
+\r
+         There are two byte sizes of interest in FTP:  the logical byte\r
+         size of the file, and the transfer byte size used for the\r
+         transmission of the data.  The transfer byte size is always 8\r
+         bits.  The transfer byte size is not necessarily the byte size\r
+         in which data is to be stored in a system, nor the logical byte\r
+         size for interpretation of the structure of the data.\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 3]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      control connection\r
+\r
+         The communication path between the USER-PI and SERVER-PI for\r
+         the exchange of commands and replies.  This connection follows\r
+         the Telnet Protocol.\r
+\r
+      data connection\r
+\r
+         A full duplex connection over which data is transferred, in a\r
+         specified mode and type. The data transferred may be a part of\r
+         a file, an entire file or a number of files.  The path may be\r
+         between a server-DTP and a user-DTP, or between two\r
+         server-DTPs.\r
+\r
+      data port\r
+\r
+         The passive data transfer process "listens" on the data port\r
+         for a connection from the active transfer process in order to\r
+         open the data connection.\r
+\r
+      DTP\r
+\r
+         The data transfer process establishes and manages the data\r
+         connection.  The DTP can be passive or active.\r
+\r
+      End-of-Line\r
+\r
+         The end-of-line sequence defines the separation of printing\r
+         lines.  The sequence is Carriage Return, followed by Line Feed.\r
+\r
+      EOF\r
+\r
+         The end-of-file condition that defines the end of a file being\r
+         transferred.\r
+\r
+      EOR\r
+\r
+         The end-of-record condition that defines the end of a record\r
+         being transferred.\r
+\r
+      error recovery\r
+\r
+         A procedure that allows a user to recover from certain errors\r
+         such as failure of either host system or transfer process.  In\r
+         FTP, error recovery may involve restarting a file transfer at a\r
+         given checkpoint.\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 4]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      FTP commands\r
+\r
+         A set of commands that comprise the control information flowing\r
+         from the user-FTP to the server-FTP process.\r
+\r
+      file\r
+\r
+         An ordered set of computer data (including programs), of\r
+         arbitrary length, uniquely identified by a pathname.\r
+\r
+      mode\r
+\r
+         The mode in which data is to be transferred via the data\r
+         connection.  The mode defines the data format during transfer\r
+         including EOR and EOF.  The transfer modes defined in FTP are\r
+         described in the Section on Transmission Modes.\r
+\r
+      NVT\r
+\r
+         The Network Virtual Terminal as defined in the Telnet Protocol.\r
+\r
+      NVFS\r
+\r
+         The Network Virtual File System.  A concept which defines a\r
+         standard network file system with standard commands and\r
+         pathname conventions.\r
+\r
+      page\r
+\r
+         A file may be structured as a set of independent parts called\r
+         pages.  FTP supports the transmission of discontinuous files as\r
+         independent indexed pages.\r
+\r
+      pathname\r
+\r
+         Pathname is defined to be the character string which must be\r
+         input to a file system by a user in order to identify a file.\r
+         Pathname normally contains device and/or directory names, and\r
+         file name specification.  FTP does not yet specify a standard\r
+         pathname convention.  Each user must follow the file naming\r
+         conventions of the file systems involved in the transfer.\r
+\r
+      PI\r
+\r
+         The protocol interpreter.  The user and server sides of the\r
+         protocol have distinct roles implemented in a user-PI and a\r
+         server-PI.\r
+\r
+\r
+Postel & Reynolds                                               [Page 5]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      record\r
+\r
+         A sequential file may be structured as a number of contiguous\r
+         parts called records.  Record structures are supported by FTP\r
+         but a file need not have record structure.\r
+\r
+      reply\r
+\r
+         A reply is an acknowledgment (positive or negative) sent from\r
+         server to user via the control connection in response to FTP\r
+         commands.  The general form of a reply is a completion code\r
+         (including error codes) followed by a text string.  The codes\r
+         are for use by programs and the text is usually intended for\r
+         human users.\r
+\r
+      server-DTP\r
+\r
+         The data transfer process, in its normal "active" state,\r
+         establishes the data connection with the "listening" data port.\r
+         It sets up parameters for transfer and storage, and transfers\r
+         data on command from its PI.  The DTP can be placed in a\r
+         "passive" state to listen for, rather than initiate a\r
+         connection on the data port.\r
+\r
+      server-FTP process\r
+\r
+         A process or set of processes which perform the function of\r
+         file transfer in cooperation with a user-FTP process and,\r
+         possibly, another server.  The functions consist of a protocol\r
+         interpreter (PI) and a data transfer process (DTP).\r
+\r
+      server-PI\r
+\r
+         The server protocol interpreter "listens" on Port L for a\r
+         connection from a user-PI and establishes a control\r
+         communication connection.  It receives standard FTP commands\r
+         from the user-PI, sends replies, and governs the server-DTP.\r
+\r
+      type\r
+\r
+         The data representation type used for data transfer and\r
+         storage.  Type implies certain transformations between the time\r
+         of data storage and data transfer.  The representation types\r
+         defined in FTP are described in the Section on Establishing\r
+         Data Connections.\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 6]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      user\r
+\r
+         A person or a process on behalf of a person wishing to obtain\r
+         file transfer service.  The human user may interact directly\r
+         with a server-FTP process, but use of a user-FTP process is\r
+         preferred since the protocol design is weighted towards\r
+         automata.\r
+\r
+      user-DTP\r
+\r
+         The data transfer process "listens" on the data port for a\r
+         connection from a server-FTP process.  If two servers are\r
+         transferring data between them, the user-DTP is inactive.\r
+\r
+      user-FTP process\r
+\r
+         A set of functions including a protocol interpreter, a data\r
+         transfer process and a user interface which together perform\r
+         the function of file transfer in cooperation with one or more\r
+         server-FTP processes.  The user interface allows a local\r
+         language to be used in the command-reply dialogue with the\r
+         user.\r
+\r
+      user-PI\r
+\r
+         The user protocol interpreter initiates the control connection\r
+         from its port U to the server-FTP process, initiates FTP\r
+         commands, and governs the user-DTP if that process is part of\r
+         the file transfer.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 7]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   2.3.  THE FTP MODEL\r
+\r
+      With the above definitions in mind, the following model (shown in\r
+      Figure 1) may be diagrammed for an FTP service.\r
+\r
+                                            -------------\r
+                                            |/---------\|\r
+                                            ||   User  ||    --------\r
+                                            ||Interface|<--->| User |\r
+                                            |\----^----/|    --------\r
+                  ----------                |     |     |\r
+                  |/------\|  FTP Commands  |/----V----\|\r
+                  ||Server|<---------------->|   User  ||\r
+                  ||  PI  ||   FTP Replies  ||    PI   ||\r
+                  |\--^---/|                |\----^----/|\r
+                  |   |    |                |     |     |\r
+      --------    |/--V---\|      Data      |/----V----\|    --------\r
+      | File |<--->|Server|<---------------->|  User   |<--->| File |\r
+      |System|    || DTP  ||   Connection   ||   DTP   ||    |System|\r
+      --------    |\------/|                |\---------/|    --------\r
+                  ----------                -------------\r
+\r
+                  Server-FTP                   USER-FTP\r
+\r
+      NOTES: 1. The data connection may be used in either direction.\r
+             2. The data connection need not exist all of the time.\r
+\r
+                      Figure 1  Model for FTP Use\r
+\r
+      In the model described in Figure 1, the user-protocol interpreter\r
+      initiates the control connection.  The control connection follows\r
+      the Telnet protocol.  At the initiation of the user, standard FTP\r
+      commands are generated by the user-PI and transmitted to the\r
+      server process via the control connection.  (The user may\r
+      establish a direct control connection to the server-FTP, from a\r
+      TAC terminal for example, and generate standard FTP commands\r
+      independently, bypassing the user-FTP process.) Standard replies\r
+      are sent from the server-PI to the user-PI over the control\r
+      connection in response to the commands.\r
+\r
+      The FTP commands specify the parameters for the data connection\r
+      (data port, transfer mode, representation type, and structure) and\r
+      the nature of file system operation (store, retrieve, append,\r
+      delete, etc.).  The user-DTP or its designate should "listen" on\r
+      the specified data port, and the server initiate the data\r
+      connection and data transfer in accordance with the specified\r
+      parameters.  It should be noted that the data port need not be in\r
+\r
+\r
+Postel & Reynolds                                               [Page 8]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      the same host that initiates the FTP commands via the control\r
+      connection, but the user or the user-FTP process must ensure a\r
+      "listen" on the specified data port.  It ought to also be noted\r
+      that the data connection may be used for simultaneous sending and\r
+      receiving.\r
+\r
+      In another situation a user might wish to transfer files between\r
+      two hosts, neither of which is a local host. The user sets up\r
+      control connections to the two servers and then arranges for a\r
+      data connection between them.  In this manner, control information\r
+      is passed to the user-PI but data is transferred between the\r
+      server data transfer processes.  Following is a model of this\r
+      server-server interaction.\r
+\r
+      \r
+                    Control     ------------   Control\r
+                    ---------->| User-FTP |<-----------\r
+                    |          | User-PI  |           |\r
+                    |          |   "C"    |           |\r
+                    V          ------------           V\r
+            --------------                        --------------\r
+            | Server-FTP |   Data Connection      | Server-FTP |\r
+            |    "A"     |<---------------------->|    "B"     |\r
+            -------------- Port (A)      Port (B) --------------\r
+      \r
+\r
+                                 Figure 2\r
+\r
+      The protocol requires that the control connections be open while\r
+      data transfer is in progress.  It is the responsibility of the\r
+      user to request the closing of the control connections when\r
+      finished using the FTP service, while it is the server who takes\r
+      the action.  The server may abort data transfer if the control\r
+      connections are closed without command.\r
+\r
+      The Relationship between FTP and Telnet:\r
+\r
+         The FTP uses the Telnet protocol on the control connection.\r
+         This can be achieved in two ways: first, the user-PI or the\r
+         server-PI may implement the rules of the Telnet Protocol\r
+         directly in their own procedures; or, second, the user-PI or\r
+         the server-PI may make use of the existing Telnet module in the\r
+         system.\r
+\r
+         Ease of implementaion, sharing code, and modular programming\r
+         argue for the second approach.  Efficiency and independence\r
+\r
+\r
+\r
+Postel & Reynolds                                               [Page 9]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         argue for the first approach.  In practice, FTP relies on very\r
+         little of the Telnet Protocol, so the first approach does not\r
+         necessarily involve a large amount of code.\r
+\r
+3.  DATA TRANSFER FUNCTIONS\r
+\r
+   Files are transferred only via the data connection.  The control\r
+   connection is used for the transfer of commands, which describe the\r
+   functions to be performed, and the replies to these commands (see the\r
+   Section on FTP Replies).  Several commands are concerned with the\r
+   transfer of data between hosts.  These data transfer commands include\r
+   the MODE command which specify how the bits of the data are to be\r
+   transmitted, and the STRUcture and TYPE commands, which are used to\r
+   define the way in which the data are to be represented.  The\r
+   transmission and representation are basically independent but the\r
+   "Stream" transmission mode is dependent on the file structure\r
+   attribute and if "Compressed" transmission mode is used, the nature\r
+   of the filler byte depends on the representation type.\r
+\r
+   3.1.  DATA REPRESENTATION AND STORAGE\r
+\r
+      Data is transferred from a storage device in the sending host to a\r
+      storage device in the receiving host.  Often it is necessary to\r
+      perform certain transformations on the data because data storage\r
+      representations in the two systems are different.  For example,\r
+      NVT-ASCII has different data storage representations in different\r
+      systems.  DEC TOPS-20s's generally store NVT-ASCII as five 7-bit\r
+      ASCII characters, left-justified in a 36-bit word. IBM Mainframe's\r
+      store NVT-ASCII as 8-bit EBCDIC codes.  Multics stores NVT-ASCII\r
+      as four 9-bit characters in a 36-bit word.  It is desirable to\r
+      convert characters into the standard NVT-ASCII representation when\r
+      transmitting text between dissimilar systems.  The sending and\r
+      receiving sites would have to perform the necessary\r
+      transformations between the standard representation and their\r
+      internal representations.\r
+\r
+      A different problem in representation arises when transmitting\r
+      binary data (not character codes) between host systems with\r
+      different word lengths.  It is not always clear how the sender\r
+      should send data, and the receiver store it.  For example, when\r
+      transmitting 32-bit bytes from a 32-bit word-length system to a\r
+      36-bit word-length system, it may be desirable (for reasons of\r
+      efficiency and usefulness) to store the 32-bit bytes\r
+      right-justified in a 36-bit word in the latter system.  In any\r
+      case, the user should have the option of specifying data\r
+      representation and transformation functions.  It should be noted\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 10]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      that FTP provides for very limited data type representations.\r
+      Transformations desired beyond this limited capability should be\r
+      performed by the user directly.\r
+\r
+      3.1.1.  DATA TYPES\r
+\r
+         Data representations are handled in FTP by a user specifying a\r
+         representation type.  This type may implicitly (as in ASCII or\r
+         EBCDIC) or explicitly (as in Local byte) define a byte size for\r
+         interpretation which is referred to as the "logical byte size."\r
+         Note that this has nothing to do with the byte size used for\r
+         transmission over the data connection, called the "transfer\r
+         byte size", and the two should not be confused.  For example,\r
+         NVT-ASCII has a logical byte size of 8 bits.  If the type is\r
+         Local byte, then the TYPE command has an obligatory second\r
+         parameter specifying the logical byte size.  The transfer byte\r
+         size is always 8 bits.\r
+\r
+         3.1.1.1.  ASCII TYPE\r
+\r
+            This is the default type and must be accepted by all FTP\r
+            implementations.  It is intended primarily for the transfer\r
+            of text files, except when both hosts would find the EBCDIC\r
+            type more convenient.\r
+\r
+            The sender converts the data from an internal character\r
+            representation to the standard 8-bit NVT-ASCII\r
+            representation (see the Telnet specification).  The receiver\r
+            will convert the data from the standard form to his own\r
+            internal form.\r
+\r
+            In accordance with the NVT standard, the <CRLF> sequence\r
+            should be used where necessary to denote the end of a line\r
+            of text.  (See the discussion of file structure at the end\r
+            of the Section on Data Representation and Storage.)\r
+\r
+            Using the standard NVT-ASCII representation means that data\r
+            must be interpreted as 8-bit bytes.\r
+\r
+            The Format parameter for ASCII and EBCDIC types is discussed\r
+            below.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 11]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         3.1.1.2.  EBCDIC TYPE\r
+\r
+            This type is intended for efficient transfer between hosts\r
+            which use EBCDIC for their internal character\r
+            representation.\r
+\r
+            For transmission, the data are represented as 8-bit EBCDIC\r
+            characters.  The character code is the only difference\r
+            between the functional specifications of EBCDIC and ASCII\r
+            types.\r
+\r
+            End-of-line (as opposed to end-of-record--see the discussion\r
+            of structure) will probably be rarely used with EBCDIC type\r
+            for purposes of denoting structure, but where it is\r
+            necessary the <NL> character should be used.\r
+\r
+         3.1.1.3.  IMAGE TYPE\r
+\r
+            The data are sent as contiguous bits which, for transfer,\r
+            are packed into the 8-bit transfer bytes.  The receiving\r
+            site must store the data as contiguous bits.  The structure\r
+            of the storage system might necessitate the padding of the\r
+            file (or of each record, for a record-structured file) to\r
+            some convenient boundary (byte, word or block).  This\r
+            padding, which must be all zeros, may occur only at the end\r
+            of the file (or at the end of each record) and there must be\r
+            a way of identifying the padding bits so that they may be\r
+            stripped off if the file is retrieved.  The padding\r
+            transformation should be well publicized to enable a user to\r
+            process a file at the storage site.\r
+\r
+            Image type is intended for the efficient storage and\r
+            retrieval of files and for the transfer of binary data.  It\r
+            is recommended that this type be accepted by all FTP\r
+            implementations.\r
+\r
+         3.1.1.4.  LOCAL TYPE\r
+\r
+            The data is transferred in logical bytes of the size\r
+            specified by the obligatory second parameter, Byte size.\r
+            The value of Byte size must be a decimal integer; there is\r
+            no default value.  The logical byte size is not necessarily\r
+            the same as the transfer byte size.  If there is a\r
+            difference in byte sizes, then the logical bytes should be\r
+            packed contiguously, disregarding transfer byte boundaries\r
+            and with any necessary padding at the end.\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 12]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            When the data reaches the receiving host, it will be\r
+            transformed in a manner dependent on the logical byte size\r
+            and the particular host.  This transformation must be\r
+            invertible (i.e., an identical file can be retrieved if the\r
+            same parameters are used) and should be well publicized by\r
+            the FTP implementors.\r
+\r
+            For example, a user sending 36-bit floating-point numbers to\r
+            a host with a 32-bit word could send that data as Local byte\r
+            with a logical byte size of 36.  The receiving host would\r
+            then be expected to store the logical bytes so that they\r
+            could be easily manipulated; in this example putting the\r
+            36-bit logical bytes into 64-bit double words should\r
+            suffice.\r
+\r
+            In another example, a pair of hosts with a 36-bit word size\r
+            may send data to one another in words by using TYPE L 36.\r
+            The data would be sent in the 8-bit transmission bytes\r
+            packed so that 9 transmission bytes carried two host words.\r
+\r
+         3.1.1.5.  FORMAT CONTROL\r
+\r
+            The types ASCII and EBCDIC also take a second (optional)\r
+            parameter; this is to indicate what kind of vertical format\r
+            control, if any, is associated with a file.  The following\r
+            data representation types are defined in FTP:\r
+\r
+            A character file may be transferred to a host for one of\r
+            three purposes: for printing, for storage and later\r
+            retrieval, or for processing.  If a file is sent for\r
+            printing, the receiving host must know how the vertical\r
+            format control is represented.  In the second case, it must\r
+            be possible to store a file at a host and then retrieve it\r
+            later in exactly the same form.  Finally, it should be\r
+            possible to move a file from one host to another and process\r
+            the file at the second host without undue trouble.  A single\r
+            ASCII or EBCDIC format does not satisfy all these\r
+            conditions.  Therefore, these types have a second parameter\r
+            specifying one of the following three formats:\r
+\r
+            3.1.1.5.1.  NON PRINT\r
+\r
+               This is the default format to be used if the second\r
+               (format) parameter is omitted.  Non-print format must be\r
+               accepted by all FTP implementations.\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 13]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+               The file need contain no vertical format information.  If\r
+               it is passed to a printer process, this process may\r
+               assume standard values for spacing and margins.\r
+\r
+               Normally, this format will be used with files destined\r
+               for processing or just storage.\r
+\r
+            3.1.1.5.2.  TELNET FORMAT CONTROLS\r
+\r
+               The file contains ASCII/EBCDIC vertical format controls\r
+               (i.e., <CR>, <LF>, <NL>, <VT>, <FF>) which the printer\r
+               process will interpret appropriately.  <CRLF>, in exactly\r
+               this sequence, also denotes end-of-line.\r
+\r
+            3.1.1.5.2.  CARRIAGE CONTROL (ASA)\r
+\r
+               The file contains ASA (FORTRAN) vertical format control\r
+               characters.  (See RFC 740 Appendix C; and Communications\r
+               of the ACM, Vol. 7, No. 10, p. 606, October 1964.)  In a\r
+               line or a record formatted according to the ASA Standard,\r
+               the first character is not to be printed.  Instead, it\r
+               should be used to determine the vertical movement of the\r
+               paper which should take place before the rest of the\r
+               record is printed.\r
+\r
+               The ASA Standard specifies the following control\r
+               characters:\r
+\r
+                  Character     Vertical Spacing\r
+\r
+                  blank         Move paper up one line\r
+                  0             Move paper up two lines\r
+                  1             Move paper to top of next page\r
+                  +             No movement, i.e., overprint\r
+\r
+               Clearly there must be some way for a printer process to\r
+               distinguish the end of the structural entity.  If a file\r
+               has record structure (see below) this is no problem;\r
+               records will be explicitly marked during transfer and\r
+               storage.  If the file has no record structure, the <CRLF>\r
+               end-of-line sequence is used to separate printing lines,\r
+               but these format effectors are overridden by the ASA\r
+               controls.\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 14]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      3.1.2.  DATA STRUCTURES\r
+\r
+         In addition to different representation types, FTP allows the\r
+         structure of a file to be specified.  Three file structures are\r
+         defined in FTP:\r
+\r
+            file-structure,     where there is no internal structure and\r
+                                the file is considered to be a\r
+                                continuous sequence of data bytes,\r
+\r
+            record-structure,   where the file is made up of sequential\r
+                                records,\r
+\r
+            and page-structure, where the file is made up of independent\r
+                                indexed pages.\r
+\r
+         File-structure is the default to be assumed if the STRUcture\r
+         command has not been used but both file and record structures\r
+         must be accepted for "text" files (i.e., files with TYPE ASCII\r
+         or EBCDIC) by all FTP implementations.  The structure of a file\r
+         will affect both the transfer mode of a file (see the Section\r
+         on Transmission Modes) and the interpretation and storage of\r
+         the file.\r
+\r
+         The "natural" structure of a file will depend on which host\r
+         stores the file.  A source-code file will usually be stored on\r
+         an IBM Mainframe in fixed length records but on a DEC TOPS-20\r
+         as a stream of characters partitioned into lines, for example\r
+         by <CRLF>.  If the transfer of files between such disparate\r
+         sites is to be useful, there must be some way for one site to\r
+         recognize the other's assumptions about the file.\r
+\r
+         With some sites being naturally file-oriented and others\r
+         naturally record-oriented there may be problems if a file with\r
+         one structure is sent to a host oriented to the other.  If a\r
+         text file is sent with record-structure to a host which is file\r
+         oriented, then that host should apply an internal\r
+         transformation to the file based on the record structure.\r
+         Obviously, this transformation should be useful, but it must\r
+         also be invertible so that an identical file may be retrieved\r
+         using record structure.\r
+\r
+         In the case of a file being sent with file-structure to a\r
+         record-oriented host, there exists the question of what\r
+         criteria the host should use to divide the file into records\r
+         which can be processed locally.  If this division is necessary,\r
+         the FTP implementation should use the end-of-line sequence,\r
+\r
+\r
+Postel & Reynolds                                              [Page 15]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         <CRLF> for ASCII, or <NL> for EBCDIC text files, as the\r
+         delimiter.  If an FTP implementation adopts this technique, it\r
+         must be prepared to reverse the transformation if the file is\r
+         retrieved with file-structure.\r
+\r
+         3.1.2.1.  FILE STRUCTURE\r
+\r
+            File structure is the default to be assumed if the STRUcture\r
+            command has not been used.\r
+\r
+            In file-structure there is no internal structure and the\r
+            file is considered to be a continuous sequence of data\r
+            bytes.\r
+\r
+         3.1.2.2.  RECORD STRUCTURE\r
+\r
+            Record structures must be accepted for "text" files (i.e.,\r
+            files with TYPE ASCII or EBCDIC) by all FTP implementations.\r
+\r
+            In record-structure the file is made up of sequential\r
+            records.\r
+\r
+         3.1.2.3.  PAGE STRUCTURE\r
+\r
+            To transmit files that are discontinuous, FTP defines a page\r
+            structure.  Files of this type are sometimes known as\r
+            "random access files" or even as "holey files".  In these\r
+            files there is sometimes other information associated with\r
+            the file as a whole (e.g., a file descriptor), or with a\r
+            section of the file (e.g., page access controls), or both.\r
+            In FTP, the sections of the file are called pages.\r
+\r
+            To provide for various page sizes and associated\r
+            information, each page is sent with a page header.  The page\r
+            header has the following defined fields:\r
+\r
+               Header Length\r
+\r
+                  The number of logical bytes in the page header\r
+                  including this byte.  The minimum header length is 4.\r
+\r
+               Page Index\r
+\r
+                  The logical page number of this section of the file.\r
+                  This is not the transmission sequence number of this\r
+                  page, but the index used to identify this page of the\r
+                  file.\r
+\r
+\r
+Postel & Reynolds                                              [Page 16]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+               Data Length\r
+\r
+                  The number of logical bytes in the page data.  The\r
+                  minimum data length is 0.\r
+\r
+               Page Type\r
+\r
+                  The type of page this is.  The following page types\r
+                  are defined:\r
+\r
+                     0 = Last Page\r
+\r
+                        This is used to indicate the end of a paged\r
+                        structured transmission.  The header length must\r
+                        be 4, and the data length must be 0.\r
+\r
+                     1 = Simple Page\r
+\r
+                        This is the normal type for simple paged files\r
+                        with no page level associated control\r
+                        information.  The header length must be 4.\r
+\r
+                     2 = Descriptor Page\r
+\r
+                        This type is used to transmit the descriptive\r
+                        information for the file as a whole.\r
+\r
+                     3 = Access Controlled Page\r
+\r
+                        This type includes an additional header field\r
+                        for paged files with page level access control\r
+                        information.  The header length must be 5.\r
+\r
+               Optional Fields\r
+\r
+                  Further header fields may be used to supply per page\r
+                  control information, for example, per page access\r
+                  control.\r
+\r
+            All fields are one logical byte in length.  The logical byte\r
+            size is specified by the TYPE command.  See Appendix I for\r
+            further details and a specific case at the page structure.\r
+\r
+      A note of caution about parameters:  a file must be stored and\r
+      retrieved with the same parameters if the retrieved version is to\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 17]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      be identical to the version originally transmitted.  Conversely,\r
+      FTP implementations must return a file identical to the original\r
+      if the parameters used to store and retrieve a file are the same.\r
+\r
+   3.2.  ESTABLISHING DATA CONNECTIONS\r
+\r
+      The mechanics of transferring data consists of setting up the data\r
+      connection to the appropriate ports and choosing the parameters\r
+      for transfer.  Both the user and the server-DTPs have a default\r
+      data port.  The user-process default data port is the same as the\r
+      control connection port (i.e., U).  The server-process default\r
+      data port is the port adjacent to the control connection port\r
+      (i.e., L-1).\r
+\r
+      The transfer byte size is 8-bit bytes.  This byte size is relevant\r
+      only for the actual transfer of the data; it has no bearing on\r
+      representation of the data within a host's file system.\r
+\r
+      The passive data transfer process (this may be a user-DTP or a\r
+      second server-DTP) shall "listen" on the data port prior to\r
+      sending a transfer request command.  The FTP request command\r
+      determines the direction of the data transfer.  The server, upon\r
+      receiving the transfer request, will initiate the data connection\r
+      to the port.  When the connection is established, the data\r
+      transfer begins between DTP's, and the server-PI sends a\r
+      confirming reply to the user-PI.\r
+\r
+      Every FTP implementation must support the use of the default data\r
+      ports, and only the USER-PI can initiate a change to non-default\r
+      ports.\r
+\r
+      It is possible for the user to specify an alternate data port by\r
+      use of the PORT command.  The user may want a file dumped on a TAC\r
+      line printer or retrieved from a third party host.  In the latter\r
+      case, the user-PI sets up control connections with both\r
+      server-PI's.  One server is then told (by an FTP command) to\r
+      "listen" for a connection which the other will initiate.  The\r
+      user-PI sends one server-PI a PORT command indicating the data\r
+      port of the other.  Finally, both are sent the appropriate\r
+      transfer commands.  The exact sequence of commands and replies\r
+      sent between the user-controller and the servers is defined in the\r
+      Section on FTP Replies.\r
+\r
+      In general, it is the server's responsibility to maintain the data\r
+      connection--to initiate it and to close it.  The exception to this\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 18]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      is when the user-DTP is sending the data in a transfer mode that\r
+      requires the connection to be closed to indicate EOF.  The server\r
+      MUST close the data connection under the following conditions:\r
+\r
+         1. The server has completed sending data in a transfer mode\r
+            that requires a close to indicate EOF.\r
+\r
+         2. The server receives an ABORT command from the user.\r
+\r
+         3. The port specification is changed by a command from the\r
+            user.\r
+\r
+         4. The control connection is closed legally or otherwise.\r
+\r
+         5. An irrecoverable error condition occurs.\r
+\r
+      Otherwise the close is a server option, the exercise of which the\r
+      server must indicate to the user-process by either a 250 or 226\r
+      reply only.\r
+\r
+   3.3.  DATA CONNECTION MANAGEMENT\r
+\r
+      Default Data Connection Ports:  All FTP implementations must\r
+      support use of the default data connection ports, and only the\r
+      User-PI may initiate the use of non-default ports.\r
+\r
+      Negotiating Non-Default Data Ports:   The User-PI may specify a\r
+      non-default user side data port with the PORT command.  The\r
+      User-PI may request the server side to identify a non-default\r
+      server side data port with the PASV command.  Since a connection\r
+      is defined by the pair of addresses, either of these actions is\r
+      enough to get a different data connection, still it is permitted\r
+      to do both commands to use new ports on both ends of the data\r
+      connection.\r
+\r
+      Reuse of the Data Connection:  When using the stream mode of data\r
+      transfer the end of the file must be indicated by closing the\r
+      connection.  This causes a problem if multiple files are to be\r
+      transfered in the session, due to need for TCP to hold the\r
+      connection record for a time out period to guarantee the reliable\r
+      communication.  Thus the connection can not be reopened at once.\r
+\r
+         There are two solutions to this problem.  The first is to\r
+         negotiate a non-default port.  The second is to use another\r
+         transfer mode.\r
+\r
+         A comment on transfer modes.  The stream transfer mode is\r
+\r
+\r
+Postel & Reynolds                                              [Page 19]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         inherently unreliable, since one can not determine if the\r
+         connection closed prematurely or not.  The other transfer modes\r
+         (Block, Compressed) do not close the connection to indicate the\r
+         end of file.  They have enough FTP encoding that the data\r
+         connection can be parsed to determine the end of the file.\r
+         Thus using these modes one can leave the data connection open\r
+         for multiple file transfers.\r
+\r
+   3.4.  TRANSMISSION MODES\r
+\r
+      The next consideration in transferring data is choosing the\r
+      appropriate transmission mode.  There are three modes: one which\r
+      formats the data and allows for restart procedures; one which also\r
+      compresses the data for efficient transfer; and one which passes\r
+      the data with little or no processing.  In this last case the mode\r
+      interacts with the structure attribute to determine the type of\r
+      processing.  In the compressed mode, the representation type\r
+      determines the filler byte.\r
+\r
+      All data transfers must be completed with an end-of-file (EOF)\r
+      which may be explicitly stated or implied by the closing of the\r
+      data connection.  For files with record structure, all the\r
+      end-of-record markers (EOR) are explicit, including the final one.\r
+      For files transmitted in page structure a "last-page" page type is\r
+      used.\r
+\r
+      NOTE:  In the rest of this section, byte means "transfer byte"\r
+      except where explicitly stated otherwise.\r
+\r
+      For the purpose of standardized transfer, the sending host will\r
+      translate its internal end of line or end of record denotation\r
+      into the representation prescribed by the transfer mode and file\r
+      structure, and the receiving host will perform the inverse\r
+      translation to its internal denotation.  An IBM Mainframe record\r
+      count field may not be recognized at another host, so the\r
+      end-of-record information may be transferred as a two byte control\r
+      code in Stream mode or as a flagged bit in a Block or Compressed\r
+      mode descriptor.  End-of-line in an ASCII or EBCDIC file with no\r
+      record structure should be indicated by <CRLF> or <NL>,\r
+      respectively.  Since these transformations imply extra work for\r
+      some systems, identical systems transferring non-record structured\r
+      text files might wish to use a binary representation and stream\r
+      mode for the transfer.\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 20]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      The following transmission modes are defined in FTP:\r
+\r
+      3.4.1.  STREAM MODE\r
+\r
+         The data is transmitted as a stream of bytes.  There is no\r
+         restriction on the representation type used; record structures\r
+         are allowed.\r
+\r
+         In a record structured file EOR and EOF will each be indicated\r
+         by a two-byte control code.  The first byte of the control code\r
+         will be all ones, the escape character.  The second byte will\r
+         have the low order bit on and zeros elsewhere for EOR and the\r
+         second low order bit on for EOF; that is, the byte will have\r
+         value 1 for EOR and value 2 for EOF.  EOR and EOF may be\r
+         indicated together on the last byte transmitted by turning both\r
+         low order bits on (i.e., the value 3).  If a byte of all ones\r
+         was intended to be sent as data, it should be repeated in the\r
+         second byte of the control code.\r
+\r
+         If the structure is a file structure, the EOF is indicated by\r
+         the sending host closing the data connection and all bytes are\r
+         data bytes.\r
+\r
+      3.4.2.  BLOCK MODE\r
+\r
+         The file is transmitted as a series of data blocks preceded by\r
+         one or more header bytes.  The header bytes contain a count\r
+         field, and descriptor code.  The count field indicates the\r
+         total length of the data block in bytes, thus marking the\r
+         beginning of the next data block (there are no filler bits).\r
+         The descriptor code defines:  last block in the file (EOF) last\r
+         block in the record (EOR), restart marker (see the Section on\r
+         Error Recovery and Restart) or suspect data (i.e., the data\r
+         being transferred is suspected of errors and is not reliable).\r
+         This last code is NOT intended for error control within FTP.\r
+         It is motivated by the desire of sites exchanging certain types\r
+         of data (e.g., seismic or weather data) to send and receive all\r
+         the data despite local errors (such as "magnetic tape read\r
+         errors"), but to indicate in the transmission that certain\r
+         portions are suspect).  Record structures are allowed in this\r
+         mode, and any representation type may be used.\r
+\r
+         The header consists of the three bytes.  Of the 24 bits of\r
+         header information, the 16 low order bits shall represent byte\r
+         count, and the 8 high order bits shall represent descriptor\r
+         codes as shown below.\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 21]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         Block Header\r
+\r
+            +----------------+----------------+----------------+\r
+            | Descriptor     |    Byte Count                   |\r
+            |         8 bits |                      16 bits    |\r
+            +----------------+----------------+----------------+\r
+            \r
+\r
+         The descriptor codes are indicated by bit flags in the\r
+         descriptor byte.  Four codes have been assigned, where each\r
+         code number is the decimal value of the corresponding bit in\r
+         the byte.\r
+\r
+            Code     Meaning\r
+            \r
+             128     End of data block is EOR\r
+              64     End of data block is EOF\r
+              32     Suspected errors in data block\r
+              16     Data block is a restart marker\r
+\r
+         With this encoding, more than one descriptor coded condition\r
+         may exist for a particular block.  As many bits as necessary\r
+         may be flagged.\r
+\r
+         The restart marker is embedded in the data stream as an\r
+         integral number of 8-bit bytes representing printable\r
+         characters in the language being used over the control\r
+         connection (e.g., default--NVT-ASCII).  <SP> (Space, in the\r
+         appropriate language) must not be used WITHIN a restart marker.\r
+\r
+         For example, to transmit a six-character marker, the following\r
+         would be sent:\r
+\r
+            +--------+--------+--------+\r
+            |Descrptr|  Byte count     |\r
+            |code= 16|             = 6 |\r
+            +--------+--------+--------+\r
+\r
+            +--------+--------+--------+\r
+            | Marker | Marker | Marker |\r
+            | 8 bits | 8 bits | 8 bits |\r
+            +--------+--------+--------+\r
+\r
+            +--------+--------+--------+\r
+            | Marker | Marker | Marker |\r
+            | 8 bits | 8 bits | 8 bits |\r
+            +--------+--------+--------+\r
+\r
+\r
+Postel & Reynolds                                              [Page 22]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      3.4.3.  COMPRESSED MODE\r
+\r
+         There are three kinds of information to be sent:  regular data,\r
+         sent in a byte string; compressed data, consisting of\r
+         replications or filler; and control information, sent in a\r
+         two-byte escape sequence.  If n>0 bytes (up to 127) of regular\r
+         data are sent, these n bytes are preceded by a byte with the\r
+         left-most bit set to 0 and the right-most 7 bits containing the\r
+         number n.\r
+\r
+         Byte string:\r
+\r
+             1       7                8                     8\r
+            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+\r
+            |0|       n     | |    d(1)       | ... |      d(n)     |\r
+            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+\r
+                                          ^             ^\r
+                                          |---n bytes---|\r
+                                              of data\r
+\r
+            String of n data bytes d(1),..., d(n)\r
+            Count n must be positive.\r
+\r
+         To compress a string of n replications of the data byte d, the\r
+         following 2 bytes are sent:\r
+\r
+         Replicated Byte:\r
+\r
+              2       6               8\r
+            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\r
+            |1 0|     n     | |       d       |\r
+            +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\r
+\r
+         A string of n filler bytes can be compressed into a single\r
+         byte, where the filler byte varies with the representation\r
+         type.  If the type is ASCII or EBCDIC the filler byte is <SP>\r
+         (Space, ASCII code 32, EBCDIC code 64).  If the type is Image\r
+         or Local byte the filler is a zero byte.\r
+\r
+         Filler String:\r
+\r
+              2       6\r
+            +-+-+-+-+-+-+-+-+\r
+            |1 1|     n     |\r
+            +-+-+-+-+-+-+-+-+\r
+\r
+         The escape sequence is a double byte, the first of which is the\r
+\r
+\r
+Postel & Reynolds                                              [Page 23]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         escape byte (all zeros) and the second of which contains\r
+         descriptor codes as defined in Block mode.  The descriptor\r
+         codes have the same meaning as in Block mode and apply to the\r
+         succeeding string of bytes.\r
+\r
+         Compressed mode is useful for obtaining increased bandwidth on\r
+         very large network transmissions at a little extra CPU cost.\r
+         It can be most effectively used to reduce the size of printer\r
+         files such as those generated by RJE hosts.\r
+\r
+   3.5.  ERROR RECOVERY AND RESTART\r
+\r
+      There is no provision for detecting bits lost or scrambled in data\r
+      transfer; this level of error control is handled by the TCP.\r
+      However, a restart procedure is provided to protect users from\r
+      gross system failures (including failures of a host, an\r
+      FTP-process, or the underlying network).\r
+\r
+      The restart procedure is defined only for the block and compressed\r
+      modes of data transfer.  It requires the sender of data to insert\r
+      a special marker code in the data stream with some marker\r
+      information.  The marker information has meaning only to the\r
+      sender, but must consist of printable characters in the default or\r
+      negotiated language of the control connection (ASCII or EBCDIC).\r
+      The marker could represent a bit-count, a record-count, or any\r
+      other information by which a system may identify a data\r
+      checkpoint.  The receiver of data, if it implements the restart\r
+      procedure, would then mark the corresponding position of this\r
+      marker in the receiving system, and return this information to the\r
+      user.\r
+\r
+      In the event of a system failure, the user can restart the data\r
+      transfer by identifying the marker point with the FTP restart\r
+      procedure.  The following example illustrates the use of the\r
+      restart procedure.\r
+\r
+      The sender of the data inserts an appropriate marker block in the\r
+      data stream at a convenient point.  The receiving host marks the\r
+      corresponding data point in its file system and conveys the last\r
+      known sender and receiver marker information to the user, either\r
+      directly or over the control connection in a 110 reply (depending\r
+      on who is the sender).  In the event of a system failure, the user\r
+      or controller process restarts the server at the last server\r
+      marker by sending a restart command with server's marker code as\r
+      its argument.  The restart command is transmitted over the control\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 24]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      connection and is immediately followed by the command (such as\r
+      RETR, STOR or LIST) which was being executed when the system\r
+      failure occurred.\r
+\r
+4.  FILE TRANSFER FUNCTIONS\r
+\r
+   The communication channel from the user-PI to the server-PI is\r
+   established as a TCP connection from the user to the standard server\r
+   port.  The user protocol interpreter is responsible for sending FTP\r
+   commands and interpreting the replies received; the server-PI\r
+   interprets commands, sends replies and directs its DTP to set up the\r
+   data connection and transfer the data.  If the second party to the\r
+   data transfer (the passive transfer process) is the user-DTP, then it\r
+   is governed through the internal protocol of the user-FTP host; if it\r
+   is a second server-DTP, then it is governed by its PI on command from\r
+   the user-PI.  The FTP replies are discussed in the next section.  In\r
+   the description of a few of the commands in this section, it is\r
+   helpful to be explicit about the possible replies.\r
+\r
+   4.1.  FTP COMMANDS\r
+\r
+      4.1.1.  ACCESS CONTROL COMMANDS\r
+\r
+         The following commands specify access control identifiers\r
+         (command codes are shown in parentheses).\r
+\r
+         USER NAME (USER)\r
+\r
+            The argument field is a Telnet string identifying the user.\r
+            The user identification is that which is required by the\r
+            server for access to its file system.  This command will\r
+            normally be the first command transmitted by the user after\r
+            the control connections are made (some servers may require\r
+            this).  Additional identification information in the form of\r
+            a password and/or an account command may also be required by\r
+            some servers.  Servers may allow a new USER command to be\r
+            entered at any point in order to change the access control\r
+            and/or accounting information.  This has the effect of\r
+            flushing any user, password, and account information already\r
+            supplied and beginning the login sequence again.  All\r
+            transfer parameters are unchanged and any file transfer in\r
+            progress is completed under the old access control\r
+            parameters.\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 25]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         PASSWORD (PASS)\r
+\r
+            The argument field is a Telnet string specifying the user's\r
+            password.  This command must be immediately preceded by the\r
+            user name command, and, for some sites, completes the user's\r
+            identification for access control.  Since password\r
+            information is quite sensitive, it is desirable in general\r
+            to "mask" it or suppress typeout.  It appears that the\r
+            server has no foolproof way to achieve this.  It is\r
+            therefore the responsibility of the user-FTP process to hide\r
+            the sensitive password information.\r
+\r
+         ACCOUNT (ACCT)\r
+\r
+            The argument field is a Telnet string identifying the user's\r
+            account.  The command is not necessarily related to the USER\r
+            command, as some sites may require an account for login and\r
+            others only for specific access, such as storing files.  In\r
+            the latter case the command may arrive at any time.\r
+\r
+            There are reply codes to differentiate these cases for the\r
+            automation: when account information is required for login,\r
+            the response to a successful PASSword command is reply code\r
+            332.  On the other hand, if account information is NOT\r
+            required for login, the reply to a successful PASSword\r
+            command is 230; and if the account information is needed for\r
+            a command issued later in the dialogue, the server should\r
+            return a 332 or 532 reply depending on whether it stores\r
+            (pending receipt of the ACCounT command) or discards the\r
+            command, respectively.\r
+\r
+         CHANGE WORKING DIRECTORY (CWD)\r
+\r
+            This command allows the user to work with a different\r
+            directory or dataset for file storage or retrieval without\r
+            altering his login or accounting information.  Transfer\r
+            parameters are similarly unchanged.  The argument is a\r
+            pathname specifying a directory or other system dependent\r
+            file group designator.\r
+\r
+         CHANGE TO PARENT DIRECTORY (CDUP)\r
+\r
+            This command is a special case of CWD, and is included to\r
+            simplify the implementation of programs for transferring\r
+            directory trees between operating systems having different\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 26]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            syntaxes for naming the parent directory.  The reply codes\r
+            shall be identical to the reply codes of CWD.  See\r
+            Appendix II for further details.\r
+\r
+         STRUCTURE MOUNT (SMNT)\r
+\r
+            This command allows the user to mount a different file\r
+            system data structure without altering his login or\r
+            accounting information.  Transfer parameters are similarly\r
+            unchanged.  The argument is a pathname specifying a\r
+            directory or other system dependent file group designator.\r
+\r
+         REINITIALIZE (REIN)\r
+\r
+            This command terminates a USER, flushing all I/O and account\r
+            information, except to allow any transfer in progress to be\r
+            completed.  All parameters are reset to the default settings\r
+            and the control connection is left open.  This is identical\r
+            to the state in which a user finds himself immediately after\r
+            the control connection is opened.  A USER command may be\r
+            expected to follow.\r
+\r
+         LOGOUT (QUIT)\r
+\r
+            This command terminates a USER and if file transfer is not\r
+            in progress, the server closes the control connection.  If\r
+            file transfer is in progress, the connection will remain\r
+            open for result response and the server will then close it.\r
+            If the user-process is transferring files for several USERs\r
+            but does not wish to close and then reopen connections for\r
+            each, then the REIN command should be used instead of QUIT.\r
+\r
+            An unexpected close on the control connection will cause the\r
+            server to take the effective action of an abort (ABOR) and a\r
+            logout (QUIT).\r
+\r
+      4.1.2.  TRANSFER PARAMETER COMMANDS\r
+\r
+         All data transfer parameters have default values, and the\r
+         commands specifying data transfer parameters are required only\r
+         if the default parameter values are to be changed.  The default\r
+         value is the last specified value, or if no value has been\r
+         specified, the standard default value is as stated here.  This\r
+         implies that the server must "remember" the applicable default\r
+         values.  The commands may be in any order except that they must\r
+         precede the FTP service request.  The following commands\r
+         specify data transfer parameters:\r
+\r
+\r
+Postel & Reynolds                                              [Page 27]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         DATA PORT (PORT)\r
+\r
+            The argument is a HOST-PORT specification for the data port\r
+            to be used in data connection.  There are defaults for both\r
+            the user and server data ports, and under normal\r
+            circumstances this command and its reply are not needed.  If\r
+            this command is used, the argument is the concatenation of a\r
+            32-bit internet host address and a 16-bit TCP port address.\r
+            This address information is broken into 8-bit fields and the\r
+            value of each field is transmitted as a decimal number (in\r
+            character string representation).  The fields are separated\r
+            by commas.  A port command would be:\r
+\r
+               PORT h1,h2,h3,h4,p1,p2\r
+\r
+            where h1 is the high order 8 bits of the internet host\r
+            address.\r
+\r
+         PASSIVE (PASV)\r
+\r
+            This command requests the server-DTP to "listen" on a data\r
+            port (which is not its default data port) and to wait for a\r
+            connection rather than initiate one upon receipt of a\r
+            transfer command.  The response to this command includes the\r
+            host and port address this server is listening on.\r
+\r
+         REPRESENTATION TYPE (TYPE)\r
+\r
+            The argument specifies the representation type as described\r
+            in the Section on Data Representation and Storage.  Several\r
+            types take a second parameter.  The first parameter is\r
+            denoted by a single Telnet character, as is the second\r
+            Format parameter for ASCII and EBCDIC; the second parameter\r
+            for local byte is a decimal integer to indicate Bytesize.\r
+            The parameters are separated by a <SP> (Space, ASCII code\r
+            32).\r
+\r
+            The following codes are assigned for type:\r
+\r
+                         \    /\r
+               A - ASCII |    | N - Non-print\r
+                         |-><-| T - Telnet format effectors\r
+               E - EBCDIC|    | C - Carriage Control (ASA)\r
+                         /    \\r
+               I - Image\r
+               \r
+               L <byte size> - Local byte Byte size\r
+\r
+\r
+Postel & Reynolds                                              [Page 28]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            The default representation type is ASCII Non-print.  If the\r
+            Format parameter is changed, and later just the first\r
+            argument is changed, Format then returns to the Non-print\r
+            default.\r
+\r
+         FILE STRUCTURE (STRU)\r
+\r
+            The argument is a single Telnet character code specifying\r
+            file structure described in the Section on Data\r
+            Representation and Storage.\r
+\r
+            The following codes are assigned for structure:\r
+\r
+               F - File (no record structure)\r
+               R - Record structure\r
+               P - Page structure\r
+\r
+            The default structure is File.\r
+\r
+         TRANSFER MODE (MODE)\r
+\r
+            The argument is a single Telnet character code specifying\r
+            the data transfer modes described in the Section on\r
+            Transmission Modes.\r
+\r
+            The following codes are assigned for transfer modes:\r
+\r
+               S - Stream\r
+               B - Block\r
+               C - Compressed\r
+\r
+            The default transfer mode is Stream.\r
+\r
+      4.1.3.  FTP SERVICE COMMANDS\r
+\r
+         The FTP service commands define the file transfer or the file\r
+         system function requested by the user.  The argument of an FTP\r
+         service command will normally be a pathname.  The syntax of\r
+         pathnames must conform to server site conventions (with\r
+         standard defaults applicable), and the language conventions of\r
+         the control connection.  The suggested default handling is to\r
+         use the last specified device, directory or file name, or the\r
+         standard default defined for local users.  The commands may be\r
+         in any order except that a "rename from" command must be\r
+         followed by a "rename to" command and the restart command must\r
+         be followed by the interrupted service command (e.g., STOR or\r
+         RETR).  The data, when transferred in response to FTP service\r
+\r
+\r
+Postel & Reynolds                                              [Page 29]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         commands, shall always be sent over the data connection, except\r
+         for certain informative replies.  The following commands\r
+         specify FTP service requests:\r
+\r
+         RETRIEVE (RETR)\r
+\r
+            This command causes the server-DTP to transfer a copy of the\r
+            file, specified in the pathname, to the server- or user-DTP\r
+            at the other end of the data connection.  The status and\r
+            contents of the file at the server site shall be unaffected.\r
+\r
+         STORE (STOR)\r
+\r
+            This command causes the server-DTP to accept the data\r
+            transferred via the data connection and to store the data as\r
+            a file at the server site.  If the file specified in the\r
+            pathname exists at the server site, then its contents shall\r
+            be replaced by the data being transferred.  A new file is\r
+            created at the server site if the file specified in the\r
+            pathname does not already exist.\r
+\r
+         STORE UNIQUE (STOU)\r
+\r
+            This command behaves like STOR except that the resultant\r
+            file is to be created in the current directory under a name\r
+            unique to that directory.  The 250 Transfer Started response\r
+            must include the name generated.\r
+\r
+         APPEND (with create) (APPE)\r
+\r
+            This command causes the server-DTP to accept the data\r
+            transferred via the data connection and to store the data in\r
+            a file at the server site.  If the file specified in the\r
+            pathname exists at the server site, then the data shall be\r
+            appended to that file; otherwise the file specified in the\r
+            pathname shall be created at the server site.\r
+\r
+         ALLOCATE (ALLO)\r
+\r
+            This command may be required by some servers to reserve\r
+            sufficient storage to accommodate the new file to be\r
+            transferred.  The argument shall be a decimal integer\r
+            representing the number of bytes (using the logical byte\r
+            size) of storage to be reserved for the file.  For files\r
+            sent with record or page structure a maximum record or page\r
+            size (in logical bytes) might also be necessary; this is\r
+            indicated by a decimal integer in a second argument field of\r
+\r
+\r
+Postel & Reynolds                                              [Page 30]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            the command.  This second argument is optional, but when\r
+            present should be separated from the first by the three\r
+            Telnet characters <SP> R <SP>.  This command shall be\r
+            followed by a STORe or APPEnd command.  The ALLO command\r
+            should be treated as a NOOP (no operation) by those servers\r
+            which do not require that the maximum size of the file be\r
+            declared beforehand, and those servers interested in only\r
+            the maximum record or page size should accept a dummy value\r
+            in the first argument and ignore it.\r
+\r
+         RESTART (REST)\r
+\r
+            The argument field represents the server marker at which\r
+            file transfer is to be restarted.  This command does not\r
+            cause file transfer but skips over the file to the specified\r
+            data checkpoint.  This command shall be immediately followed\r
+            by the appropriate FTP service command which shall cause\r
+            file transfer to resume.\r
+\r
+         RENAME FROM (RNFR)\r
+\r
+            This command specifies the old pathname of the file which is\r
+            to be renamed.  This command must be immediately followed by\r
+            a "rename to" command specifying the new file pathname.\r
+\r
+         RENAME TO (RNTO)\r
+\r
+            This command specifies the new pathname of the file\r
+            specified in the immediately preceding "rename from"\r
+            command.  Together the two commands cause a file to be\r
+            renamed.\r
+\r
+         ABORT (ABOR)\r
+\r
+            This command tells the server to abort the previous FTP\r
+            service command and any associated transfer of data.  The\r
+            abort command may require "special action", as discussed in\r
+            the Section on FTP Commands, to force recognition by the\r
+            server.  No action is to be taken if the previous command\r
+            has been completed (including data transfer).  The control\r
+            connection is not to be closed by the server, but the data\r
+            connection must be closed.\r
+\r
+            There are two cases for the server upon receipt of this\r
+            command: (1) the FTP service command was already completed,\r
+            or (2) the FTP service command is still in progress.\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 31]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+               In the first case, the server closes the data connection\r
+               (if it is open) and responds with a 226 reply, indicating\r
+               that the abort command was successfully processed.\r
+\r
+               In the second case, the server aborts the FTP service in\r
+               progress and closes the data connection, returning a 426\r
+               reply to indicate that the service request terminated\r
+               abnormally.  The server then sends a 226 reply,\r
+               indicating that the abort command was successfully\r
+               processed.\r
+\r
+         DELETE (DELE)\r
+\r
+            This command causes the file specified in the pathname to be\r
+            deleted at the server site.  If an extra level of protection\r
+            is desired (such as the query, "Do you really wish to\r
+            delete?"), it should be provided by the user-FTP process.\r
+\r
+         REMOVE DIRECTORY (RMD)\r
+\r
+            This command causes the directory specified in the pathname\r
+            to be removed as a directory (if the pathname is absolute)\r
+            or as a subdirectory of the current working directory (if\r
+            the pathname is relative).  See Appendix II.\r
+\r
+         MAKE DIRECTORY (MKD)\r
+\r
+            This command causes the directory specified in the pathname\r
+            to be created as a directory (if the pathname is absolute)\r
+            or as a subdirectory of the current working directory (if\r
+            the pathname is relative).  See Appendix II.\r
+\r
+         PRINT WORKING DIRECTORY (PWD)\r
+\r
+            This command causes the name of the current working\r
+            directory to be returned in the reply.  See Appendix II.\r
+\r
+         LIST (LIST)\r
+\r
+            This command causes a list to be sent from the server to the\r
+            passive DTP.  If the pathname specifies a directory or other\r
+            group of files, the server should transfer a list of files\r
+            in the specified directory.  If the pathname specifies a\r
+            file then the server should send current information on the\r
+            file.  A null argument implies the user's current working or\r
+            default directory.  The data transfer is over the data\r
+            connection in type ASCII or type EBCDIC.  (The user must\r
+\r
+\r
+Postel & Reynolds                                              [Page 32]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            ensure that the TYPE is appropriately ASCII or EBCDIC).\r
+            Since the information on a file may vary widely from system\r
+            to system, this information may be hard to use automatically\r
+            in a program, but may be quite useful to a human user.\r
+\r
+         NAME LIST (NLST)\r
+\r
+            This command causes a directory listing to be sent from\r
+            server to user site.  The pathname should specify a\r
+            directory or other system-specific file group descriptor; a\r
+            null argument implies the current directory.  The server\r
+            will return a stream of names of files and no other\r
+            information.  The data will be transferred in ASCII or\r
+            EBCDIC type over the data connection as valid pathname\r
+            strings separated by <CRLF> or <NL>.  (Again the user must\r
+            ensure that the TYPE is correct.)  This command is intended\r
+            to return information that can be used by a program to\r
+            further process the files automatically.  For example, in\r
+            the implementation of a "multiple get" function.\r
+\r
+         SITE PARAMETERS (SITE)\r
+\r
+            This command is used by the server to provide services\r
+            specific to his system that are essential to file transfer\r
+            but not sufficiently universal to be included as commands in\r
+            the protocol.  The nature of these services and the\r
+            specification of their syntax can be stated in a reply to\r
+            the HELP SITE command.\r
+\r
+         SYSTEM (SYST)\r
+\r
+            This command is used to find out the type of operating\r
+            system at the server.  The reply shall have as its first\r
+            word one of the system names listed in the current version\r
+            of the Assigned Numbers document [4].\r
+\r
+         STATUS (STAT)\r
+\r
+            This command shall cause a status response to be sent over\r
+            the control connection in the form of a reply.  The command\r
+            may be sent during a file transfer (along with the Telnet IP\r
+            and Synch signals--see the Section on FTP Commands) in which\r
+            case the server will respond with the status of the\r
+            operation in progress, or it may be sent between file\r
+            transfers.  In the latter case, the command may have an\r
+            argument field.  If the argument is a pathname, the command\r
+            is analogous to the "list" command except that data shall be\r
+\r
+\r
+Postel & Reynolds                                              [Page 33]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            transferred over the control connection.  If a partial\r
+            pathname is given, the server may respond with a list of\r
+            file names or attributes associated with that specification.\r
+            If no argument is given, the server should return general\r
+            status information about the server FTP process.  This\r
+            should include current values of all transfer parameters and\r
+            the status of connections.\r
+\r
+         HELP (HELP)\r
+\r
+            This command shall cause the server to send helpful\r
+            information regarding its implementation status over the\r
+            control connection to the user.  The command may take an\r
+            argument (e.g., any command name) and return more specific\r
+            information as a response.  The reply is type 211 or 214.\r
+            It is suggested that HELP be allowed before entering a USER\r
+            command. The server may use this reply to specify\r
+            site-dependent parameters, e.g., in response to HELP SITE.\r
+\r
+         NOOP (NOOP)\r
+\r
+            This command does not affect any parameters or previously\r
+            entered commands. It specifies no action other than that the\r
+            server send an OK reply.\r
+\r
+   The File Transfer Protocol follows the specifications of the Telnet\r
+   protocol for all communications over the control connection.  Since\r
+   the language used for Telnet communication may be a negotiated\r
+   option, all references in the next two sections will be to the\r
+   "Telnet language" and the corresponding "Telnet end-of-line code".\r
+   Currently, one may take these to mean NVT-ASCII and <CRLF>.  No other\r
+   specifications of the Telnet protocol will be cited.\r
+\r
+   FTP commands are "Telnet strings" terminated by the "Telnet end of\r
+   line code".  The command codes themselves are alphabetic characters\r
+   terminated by the character <SP> (Space) if parameters follow and\r
+   Telnet-EOL otherwise.  The command codes and the semantics of\r
+   commands are described in this section; the detailed syntax of\r
+   commands is specified in the Section on Commands, the reply sequences\r
+   are discussed in the Section on Sequencing of Commands and Replies,\r
+   and scenarios illustrating the use of commands are provided in the\r
+   Section on Typical FTP Scenarios.\r
+\r
+   FTP commands may be partitioned as those specifying access-control\r
+   identifiers, data transfer parameters, or FTP service requests.\r
+   Certain commands (such as ABOR, STAT, QUIT) may be sent over the\r
+   control connection while a data transfer is in progress.  Some\r
+\r
+\r
+Postel & Reynolds                                              [Page 34]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   servers may not be able to monitor the control and data connections\r
+   simultaneously, in which case some special action will be necessary\r
+   to get the server's attention.  The following ordered format is\r
+   tentatively recommended:\r
+\r
+      1. User system inserts the Telnet "Interrupt Process" (IP) signal\r
+      in the Telnet stream.\r
+\r
+      2. User system sends the Telnet "Synch" signal.\r
+\r
+      3. User system inserts the command (e.g., ABOR) in the Telnet\r
+      stream.\r
+\r
+      4. Server PI, after receiving "IP", scans the Telnet stream for\r
+      EXACTLY ONE FTP command.\r
+\r
+   (For other servers this may not be necessary but the actions listed\r
+   above should have no unusual effect.)\r
+\r
+   4.2.  FTP REPLIES\r
+\r
+      Replies to File Transfer Protocol commands are devised to ensure\r
+      the synchronization of requests and actions in the process of file\r
+      transfer, and to guarantee that the user process always knows the\r
+      state of the Server.  Every command must generate at least one\r
+      reply, although there may be more than one; in the latter case,\r
+      the multiple replies must be easily distinguished.  In addition,\r
+      some commands occur in sequential groups, such as USER, PASS and\r
+      ACCT, or RNFR and RNTO.  The replies show the existence of an\r
+      intermediate state if all preceding commands have been successful.\r
+      A failure at any point in the sequence necessitates the repetition\r
+      of the entire sequence from the beginning.\r
+\r
+         The details of the command-reply sequence are made explicit in\r
+         a set of state diagrams below.\r
+\r
+      An FTP reply consists of a three digit number (transmitted as\r
+      three alphanumeric characters) followed by some text.  The number\r
+      is intended for use by automata to determine what state to enter\r
+      next; the text is intended for the human user.  It is intended\r
+      that the three digits contain enough encoded information that the\r
+      user-process (the User-PI) will not need to examine the text and\r
+      may either discard it or pass it on to the user, as appropriate.\r
+      In particular, the text may be server-dependent, so there are\r
+      likely to be varying texts for each reply code.\r
+\r
+      A reply is defined to contain the 3-digit code, followed by Space\r
+\r
+\r
+Postel & Reynolds                                              [Page 35]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      <SP>, followed by one line of text (where some maximum line length\r
+      has been specified), and terminated by the Telnet end-of-line\r
+      code.  There will be cases however, where the text is longer than\r
+      a single line.  In these cases the complete text must be bracketed\r
+      so the User-process knows when it may stop reading the reply (i.e.\r
+      stop processing input on the control connection) and go do other\r
+      things.  This requires a special format on the first line to\r
+      indicate that more than one line is coming, and another on the\r
+      last line to designate it as the last.  At least one of these must\r
+      contain the appropriate reply code to indicate the state of the\r
+      transaction.  To satisfy all factions, it was decided that both\r
+      the first and last line codes should be the same.\r
+\r
+         Thus the format for multi-line replies is that the first line\r
+         will begin with the exact required reply code, followed\r
+         immediately by a Hyphen, "-" (also known as Minus), followed by\r
+         text.  The last line will begin with the same code, followed\r
+         immediately by Space <SP>, optionally some text, and the Telnet\r
+         end-of-line code.\r
+\r
+            For example:\r
+                                123-First line\r
+                                Second line\r
+                                  234 A line beginning with numbers\r
+                                123 The last line\r
+\r
+         The user-process then simply needs to search for the second\r
+         occurrence of the same reply code, followed by <SP> (Space), at\r
+         the beginning of a line, and ignore all intermediary lines.  If\r
+         an intermediary line begins with a 3-digit number, the Server\r
+         must pad the front  to avoid confusion.\r
+\r
+            This scheme allows standard system routines to be used for\r
+            reply information (such as for the STAT reply), with\r
+            "artificial" first and last lines tacked on.  In rare cases\r
+            where these routines are able to generate three digits and a\r
+            Space at the beginning of any line, the beginning of each\r
+            text line should be offset by some neutral text, like Space.\r
+\r
+         This scheme assumes that multi-line replies may not be nested.\r
+\r
+      The three digits of the reply each have a special significance.\r
+      This is intended to allow a range of very simple to very\r
+      sophisticated responses by the user-process.  The first digit\r
+      denotes whether the response is good, bad or incomplete.\r
+      (Referring to the state diagram), an unsophisticated user-process\r
+      will be able to determine its next action (proceed as planned,\r
+\r
+\r
+Postel & Reynolds                                              [Page 36]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      redo, retrench, etc.) by simply examining this first digit.  A\r
+      user-process that wants to know approximately what kind of error\r
+      occurred (e.g. file system error, command syntax error) may\r
+      examine the second digit, reserving the third digit for the finest\r
+      gradation of information (e.g., RNTO command without a preceding\r
+      RNFR).\r
+\r
+         There are five values for the first digit of the reply code:\r
+\r
+            1yz   Positive Preliminary reply\r
+\r
+               The requested action is being initiated; expect another\r
+               reply before proceeding with a new command.  (The\r
+               user-process sending another command before the\r
+               completion reply would be in violation of protocol; but\r
+               server-FTP processes should queue any commands that\r
+               arrive while a preceding command is in progress.)  This\r
+               type of reply can be used to indicate that the command\r
+               was accepted and the user-process may now pay attention\r
+               to the data connections, for implementations where\r
+               simultaneous monitoring is difficult.  The server-FTP\r
+               process may send at most, one 1yz reply per command.\r
+\r
+            2yz   Positive Completion reply\r
+\r
+               The requested action has been successfully completed.  A\r
+               new request may be initiated.\r
+\r
+            3yz   Positive Intermediate reply\r
+\r
+               The command has been accepted, but the requested action\r
+               is being held in abeyance, pending receipt of further\r
+               information.  The user should send another command\r
+               specifying this information.  This reply is used in\r
+               command sequence groups.\r
+\r
+            4yz   Transient Negative Completion reply\r
+\r
+               The command was not accepted and the requested action did\r
+               not take place, but the error condition is temporary and\r
+               the action may be requested again.  The user should\r
+               return to the beginning of the command sequence, if any.\r
+               It is difficult to assign a meaning to "transient",\r
+               particularly when two distinct sites (Server- and\r
+               User-processes) have to agree on the interpretation.\r
+               Each reply in the 4yz category might have a slightly\r
+               different time value, but the intent is that the\r
+\r
+\r
+Postel & Reynolds                                              [Page 37]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+               user-process is encouraged to try again.  A rule of thumb\r
+               in determining if a reply fits into the 4yz or the 5yz\r
+               (Permanent Negative) category is that replies are 4yz if\r
+               the commands can be repeated without any change in\r
+               command form or in properties of the User or Server\r
+               (e.g., the command is spelled the same with the same\r
+               arguments used; the user does not change his file access\r
+               or user name; the server does not put up a new\r
+               implementation.)\r
+\r
+            5yz   Permanent Negative Completion reply\r
+\r
+               The command was not accepted and the requested action did\r
+               not take place.  The User-process is discouraged from\r
+               repeating the exact request (in the same sequence).  Even\r
+               some "permanent" error conditions can be corrected, so\r
+               the human user may want to direct his User-process to\r
+               reinitiate the command sequence by direct action at some\r
+               point in the future (e.g., after the spelling has been\r
+               changed, or the user has altered his directory status.)\r
+\r
+         The following function groupings are encoded in the second\r
+         digit:\r
+\r
+            x0z   Syntax - These replies refer to syntax errors,\r
+                  syntactically correct commands that don't fit any\r
+                  functional category, unimplemented or superfluous\r
+                  commands.\r
+\r
+            x1z   Information -  These are replies to requests for\r
+                  information, such as status or help.\r
+\r
+            x2z   Connections - Replies referring to the control and\r
+                  data connections.\r
+\r
+            x3z   Authentication and accounting - Replies for the login\r
+                  process and accounting procedures.\r
+\r
+            x4z   Unspecified as yet.\r
+\r
+            x5z   File system - These replies indicate the status of the\r
+                  Server file system vis-a-vis the requested transfer or\r
+                  other file system action.\r
+\r
+         The third digit gives a finer gradation of meaning in each of\r
+         the function categories, specified by the second digit.  The\r
+         list of replies below will illustrate this.  Note that the text\r
+\r
+\r
+Postel & Reynolds                                              [Page 38]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         associated with each reply is recommended, rather than\r
+         mandatory, and may even change according to the command with\r
+         which it is associated.  The reply codes, on the other hand,\r
+         must strictly follow the specifications in the last section;\r
+         that is, Server implementations should not invent new codes for\r
+         situations that are only slightly different from the ones\r
+         described here, but rather should adapt codes already defined.\r
+\r
+            A command such as TYPE or ALLO whose successful execution\r
+            does not offer the user-process any new information will\r
+            cause a 200 reply to be returned.  If the command is not\r
+            implemented by a particular Server-FTP process because it\r
+            has no relevance to that computer system, for example ALLO\r
+            at a TOPS20 site, a Positive Completion reply is still\r
+            desired so that the simple User-process knows it can proceed\r
+            with its course of action.  A 202 reply is used in this case\r
+            with, for example, the reply text:  "No storage allocation\r
+            necessary."  If, on the other hand, the command requests a\r
+            non-site-specific action and is unimplemented, the response\r
+            is 502.  A refinement of that is the 504 reply for a command\r
+            that is implemented, but that requests an unimplemented\r
+            parameter.\r
+\r
+      4.2.1  Reply Codes by Function Groups\r
+\r
+         200 Command okay.\r
+         500 Syntax error, command unrecognized.\r
+             This may include errors such as command line too long.\r
+         501 Syntax error in parameters or arguments.\r
+         202 Command not implemented, superfluous at this site.\r
+         502 Command not implemented.\r
+         503 Bad sequence of commands.\r
+         504 Command not implemented for that parameter.\r
+          \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 39]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         110 Restart marker reply.\r
+             In this case, the text is exact and not left to the\r
+             particular implementation; it must read:\r
+                  MARK yyyy = mmmm\r
+             Where yyyy is User-process data stream marker, and mmmm\r
+             server's equivalent marker (note the spaces between markers\r
+             and "=").\r
+         211 System status, or system help reply.\r
+         212 Directory status.\r
+         213 File status.\r
+         214 Help message.\r
+             On how to use the server or the meaning of a particular\r
+             non-standard command.  This reply is useful only to the\r
+             human user.\r
+         215 NAME system type.\r
+             Where NAME is an official system name from the list in the\r
+             Assigned Numbers document.\r
+          \r
+         120 Service ready in nnn minutes.\r
+         220 Service ready for new user.\r
+         221 Service closing control connection.\r
+             Logged out if appropriate.\r
+         421 Service not available, closing control connection.\r
+             This may be a reply to any command if the service knows it\r
+             must shut down.\r
+         125 Data connection already open; transfer starting.\r
+         225 Data connection open; no transfer in progress.\r
+         425 Can't open data connection.\r
+         226 Closing data connection.\r
+             Requested file action successful (for example, file\r
+             transfer or file abort).\r
+         426 Connection closed; transfer aborted.\r
+         227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).\r
+          \r
+         230 User logged in, proceed.\r
+         530 Not logged in.\r
+         331 User name okay, need password.\r
+         332 Need account for login.\r
+         532 Need account for storing files.\r
+          \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 40]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         150 File status okay; about to open data connection.\r
+         250 Requested file action okay, completed.\r
+         257 "PATHNAME" created.\r
+         350 Requested file action pending further information.\r
+         450 Requested file action not taken.\r
+             File unavailable (e.g., file busy).\r
+         550 Requested action not taken.\r
+             File unavailable (e.g., file not found, no access).\r
+         451 Requested action aborted. Local error in processing.\r
+         551 Requested action aborted. Page type unknown.\r
+         452 Requested action not taken.\r
+             Insufficient storage space in system.\r
+         552 Requested file action aborted.\r
+             Exceeded storage allocation (for current directory or\r
+             dataset).\r
+         553 Requested action not taken.\r
+             File name not allowed.\r
+         \r
+\r
+      4.2.2 Numeric  Order List of Reply Codes\r
+\r
+         110 Restart marker reply.\r
+             In this case, the text is exact and not left to the\r
+             particular implementation; it must read:\r
+                  MARK yyyy = mmmm\r
+             Where yyyy is User-process data stream marker, and mmmm\r
+             server's equivalent marker (note the spaces between markers\r
+             and "=").\r
+         120 Service ready in nnn minutes.\r
+         125 Data connection already open; transfer starting.\r
+         150 File status okay; about to open data connection.\r
+          \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 41]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         200 Command okay.\r
+         202 Command not implemented, superfluous at this site.\r
+         211 System status, or system help reply.\r
+         212 Directory status.\r
+         213 File status.\r
+         214 Help message.\r
+             On how to use the server or the meaning of a particular\r
+             non-standard command.  This reply is useful only to the\r
+             human user.\r
+         215 NAME system type.\r
+             Where NAME is an official system name from the list in the\r
+             Assigned Numbers document.\r
+         220 Service ready for new user.\r
+         221 Service closing control connection.\r
+             Logged out if appropriate.\r
+         225 Data connection open; no transfer in progress.\r
+         226 Closing data connection.\r
+             Requested file action successful (for example, file\r
+             transfer or file abort).\r
+         227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).\r
+         230 User logged in, proceed.\r
+         250 Requested file action okay, completed.\r
+         257 "PATHNAME" created.\r
+          \r
+         331 User name okay, need password.\r
+         332 Need account for login.\r
+         350 Requested file action pending further information.\r
+          \r
+         421 Service not available, closing control connection.\r
+             This may be a reply to any command if the service knows it\r
+             must shut down.\r
+         425 Can't open data connection.\r
+         426 Connection closed; transfer aborted.\r
+         450 Requested file action not taken.\r
+             File unavailable (e.g., file busy).\r
+         451 Requested action aborted: local error in processing.\r
+         452 Requested action not taken.\r
+             Insufficient storage space in system.\r
+          \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 42]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         500 Syntax error, command unrecognized.\r
+             This may include errors such as command line too long.\r
+         501 Syntax error in parameters or arguments.\r
+         502 Command not implemented.\r
+         503 Bad sequence of commands.\r
+         504 Command not implemented for that parameter.\r
+         530 Not logged in.\r
+         532 Need account for storing files.\r
+         550 Requested action not taken.\r
+             File unavailable (e.g., file not found, no access).\r
+         551 Requested action aborted: page type unknown.\r
+         552 Requested file action aborted.\r
+             Exceeded storage allocation (for current directory or\r
+             dataset).\r
+         553 Requested action not taken.\r
+             File name not allowed.\r
+         \r
+\r
+5.  DECLARATIVE SPECIFICATIONS\r
+\r
+   5.1.  MINIMUM IMPLEMENTATION\r
+\r
+      In order to make FTP workable without needless error messages, the\r
+      following minimum implementation is required for all servers:\r
+\r
+         TYPE - ASCII Non-print\r
+         MODE - Stream\r
+         STRUCTURE - File, Record\r
+         COMMANDS - USER, QUIT, PORT,\r
+                    TYPE, MODE, STRU,\r
+                      for the default values\r
+                    RETR, STOR,\r
+                    NOOP.\r
+\r
+      The default values for transfer parameters are:\r
+\r
+         TYPE - ASCII Non-print\r
+         MODE - Stream\r
+         STRU - File\r
+\r
+      All hosts must accept the above as the standard defaults.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 43]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   5.2.  CONNECTIONS\r
+\r
+      The server protocol interpreter shall "listen" on Port L.  The\r
+      user or user protocol interpreter shall initiate the full-duplex\r
+      control connection.  Server- and user- processes should follow the\r
+      conventions of the Telnet protocol as specified in the\r
+      ARPA-Internet Protocol Handbook [1].  Servers are under no\r
+      obligation to provide for editing of command lines and may require\r
+      that it be done in the user host.  The control connection shall be\r
+      closed by the server at the user's request after all transfers and\r
+      replies are completed.\r
+\r
+      The user-DTP must "listen" on the specified data port; this may be\r
+      the default user port (U) or a port specified in the PORT command.\r
+      The server shall initiate the data connection from his own default\r
+      data port (L-1) using the specified user data port.  The direction\r
+      of the transfer and the port used will be determined by the FTP\r
+      service command.\r
+\r
+      Note that all FTP implementation must support data transfer using\r
+      the default port, and that only the USER-PI may initiate the use\r
+      of non-default ports.\r
+\r
+      When data is to be transferred between two servers, A and B (refer\r
+      to Figure 2), the user-PI, C, sets up control connections with\r
+      both server-PI's.  One of the servers, say A, is then sent a PASV\r
+      command telling him to "listen" on his data port rather than\r
+      initiate a connection when he receives a transfer service command.\r
+      When the user-PI receives an acknowledgment to the PASV command,\r
+      which includes the identity of the host and port being listened\r
+      on, the user-PI then sends A's port, a, to B in a PORT command; a\r
+      reply is returned.  The user-PI may then send the corresponding\r
+      service commands to A and B.  Server B initiates the connection\r
+      and the transfer proceeds.  The command-reply sequence is listed\r
+      below where the messages are vertically synchronous but\r
+      horizontally asynchronous:\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 44]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         User-PI - Server A                User-PI - Server B\r
+         ------------------                ------------------\r
+         \r
+         C->A : Connect                    C->B : Connect\r
+         C->A : PASV\r
+         A->C : 227 Entering Passive Mode. A1,A2,A3,A4,a1,a2\r
+                                           C->B : PORT A1,A2,A3,A4,a1,a2\r
+                                           B->C : 200 Okay\r
+         C->A : STOR                       C->B : RETR\r
+                    B->A : Connect to HOST-A, PORT-a\r
+\r
+                                Figure 3\r
+\r
+      The data connection shall be closed by the server under the\r
+      conditions described in the Section on Establishing Data\r
+      Connections.  If the data connection is to be closed following a\r
+      data transfer where closing the connection is not required to\r
+      indicate the end-of-file, the server must do so immediately.\r
+      Waiting until after a new transfer command is not permitted\r
+      because the user-process will have already tested the data\r
+      connection to see if it needs to do a "listen"; (remember that the\r
+      user must "listen" on a closed data port BEFORE sending the\r
+      transfer request).  To prevent a race condition here, the server\r
+      sends a reply (226) after closing the data connection (or if the\r
+      connection is left open, a "file transfer completed" reply (250)\r
+      and the user-PI should wait for one of these replies before\r
+      issuing a new transfer command).\r
+\r
+      Any time either the user or server see that the connection is\r
+      being closed by the other side, it should promptly read any\r
+      remaining data queued on the connection and issue the close on its\r
+      own side.\r
+\r
+   5.3.  COMMANDS\r
+\r
+      The commands are Telnet character strings transmitted over the\r
+      control connections as described in the Section on FTP Commands.\r
+      The command functions and semantics are described in the Section\r
+      on Access Control Commands, Transfer Parameter Commands, FTP\r
+      Service Commands, and Miscellaneous Commands.  The command syntax\r
+      is specified here.\r
+\r
+      The commands begin with a command code followed by an argument\r
+      field.  The command codes are four or fewer alphabetic characters.\r
+      Upper and lower case alphabetic characters are to be treated\r
+      identically.  Thus, any of the following may represent the\r
+      retrieve command:\r
+\r
+\r
+Postel & Reynolds                                              [Page 45]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+                  RETR    Retr    retr    ReTr    rETr\r
+\r
+      This also applies to any symbols representing parameter values,\r
+      such as A or a for ASCII TYPE.  The command codes and the argument\r
+      fields are separated by one or more spaces.\r
+\r
+      The argument field consists of a variable length character string\r
+      ending with the character sequence <CRLF> (Carriage Return, Line\r
+      Feed) for NVT-ASCII representation; for other negotiated languages\r
+      a different end of line character might be used.  It should be\r
+      noted that the server is to take no action until the end of line\r
+      code is received.\r
+\r
+      The syntax is specified below in NVT-ASCII.  All characters in the\r
+      argument field are ASCII characters including any ASCII\r
+      represented decimal integers.  Square brackets denote an optional\r
+      argument field.  If the option is not taken, the appropriate\r
+      default is implied.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 46]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      5.3.1.  FTP COMMANDS\r
+\r
+         The following are the FTP commands:\r
+\r
+            USER <SP> <username> <CRLF>\r
+            PASS <SP> <password> <CRLF>\r
+            ACCT <SP> <account-information> <CRLF>\r
+            CWD  <SP> <pathname> <CRLF>\r
+            CDUP <CRLF>\r
+            SMNT <SP> <pathname> <CRLF>\r
+            QUIT <CRLF>\r
+            REIN <CRLF>\r
+            PORT <SP> <host-port> <CRLF>\r
+            PASV <CRLF>\r
+            TYPE <SP> <type-code> <CRLF>\r
+            STRU <SP> <structure-code> <CRLF>\r
+            MODE <SP> <mode-code> <CRLF>\r
+            RETR <SP> <pathname> <CRLF>\r
+            STOR <SP> <pathname> <CRLF>\r
+            STOU <CRLF>\r
+            APPE <SP> <pathname> <CRLF>\r
+            ALLO <SP> <decimal-integer>\r
+                [<SP> R <SP> <decimal-integer>] <CRLF>\r
+            REST <SP> <marker> <CRLF>\r
+            RNFR <SP> <pathname> <CRLF>\r
+            RNTO <SP> <pathname> <CRLF>\r
+            ABOR <CRLF>\r
+            DELE <SP> <pathname> <CRLF>\r
+            RMD  <SP> <pathname> <CRLF>\r
+            MKD  <SP> <pathname> <CRLF>\r
+            PWD  <CRLF>\r
+            LIST [<SP> <pathname>] <CRLF>\r
+            NLST [<SP> <pathname>] <CRLF>\r
+            SITE <SP> <string> <CRLF>\r
+            SYST <CRLF>\r
+            STAT [<SP> <pathname>] <CRLF>\r
+            HELP [<SP> <string>] <CRLF>\r
+            NOOP <CRLF>\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 47]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      5.3.2.  FTP COMMAND ARGUMENTS\r
+\r
+         The syntax of the above argument fields (using BNF notation\r
+         where applicable) is:\r
+\r
+            <username> ::= <string>\r
+            <password> ::= <string>\r
+            <account-information> ::= <string>\r
+            <string> ::= <char> | <char><string>\r
+            <char> ::= any of the 128 ASCII characters except <CR> and\r
+            <LF>\r
+            <marker> ::= <pr-string>\r
+            <pr-string> ::= <pr-char> | <pr-char><pr-string>\r
+            <pr-char> ::= printable characters, any\r
+                          ASCII code 33 through 126\r
+            <byte-size> ::= <number>\r
+            <host-port> ::= <host-number>,<port-number>\r
+            <host-number> ::= <number>,<number>,<number>,<number>\r
+            <port-number> ::= <number>,<number>\r
+            <number> ::= any decimal integer 1 through 255\r
+            <form-code> ::= N | T | C\r
+            <type-code> ::= A [<sp> <form-code>]\r
+                          | E [<sp> <form-code>]\r
+                          | I\r
+                          | L <sp> <byte-size>\r
+            <structure-code> ::= F | R | P\r
+            <mode-code> ::= S | B | C\r
+            <pathname> ::= <string>\r
+            <decimal-integer> ::= any decimal integer\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 48]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   5.4.  SEQUENCING OF COMMANDS AND REPLIES\r
+\r
+      The communication between the user and server is intended to be an\r
+      alternating dialogue.  As such, the user issues an FTP command and\r
+      the server responds with a prompt primary reply.  The user should\r
+      wait for this initial primary success or failure response before\r
+      sending further commands.\r
+\r
+      Certain commands require a second reply for which the user should\r
+      also wait.  These replies may, for example, report on the progress\r
+      or completion of file transfer or the closing of the data\r
+      connection.  They are secondary replies to file transfer commands.\r
+\r
+      One important group of informational replies is the connection\r
+      greetings.  Under normal circumstances, a server will send a 220\r
+      reply, "awaiting input", when the connection is completed.  The\r
+      user should wait for this greeting message before sending any\r
+      commands.  If the server is unable to accept input right away, a\r
+      120 "expected delay" reply should be sent immediately and a 220\r
+      reply when ready.  The user will then know not to hang up if there\r
+      is a delay.\r
+\r
+      Spontaneous Replies\r
+\r
+         Sometimes "the system" spontaneously has a message to be sent\r
+         to a user (usually all users).  For example, "System going down\r
+         in 15 minutes".  There is no provision in FTP for such\r
+         spontaneous information to be sent from the server to the user.\r
+         It is recommended that such information be queued in the\r
+         server-PI and delivered to the user-PI in the next reply\r
+         (possibly making it a multi-line reply).\r
+\r
+      The table below lists alternative success and failure replies for\r
+      each command.  These must be strictly adhered to; a server may\r
+      substitute text in the replies, but the meaning and action implied\r
+      by the code numbers and by the specific command reply sequence\r
+      cannot be altered.\r
+\r
+      Command-Reply Sequences\r
+\r
+         In this section, the command-reply sequence is presented.  Each\r
+         command is listed with its possible replies; command groups are\r
+         listed together.  Preliminary replies are listed first (with\r
+         their succeeding replies indented and under them), then\r
+         positive and negative completion, and finally intermediary\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 49]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+         replies with the remaining commands from the sequence\r
+         following.  This listing forms the basis for the state\r
+         diagrams, which will be presented separately.\r
+\r
+            Connection Establishment\r
+               120\r
+                  220\r
+               220\r
+               421\r
+            Login\r
+               USER\r
+                  230\r
+                  530\r
+                  500, 501, 421\r
+                  331, 332\r
+               PASS\r
+                  230\r
+                  202\r
+                  530\r
+                  500, 501, 503, 421\r
+                  332\r
+               ACCT\r
+                  230\r
+                  202\r
+                  530\r
+                  500, 501, 503, 421\r
+               CWD\r
+                  250\r
+                  500, 501, 502, 421, 530, 550\r
+               CDUP\r
+                  200\r
+                  500, 501, 502, 421, 530, 550\r
+               SMNT\r
+                  202, 250\r
+                  500, 501, 502, 421, 530, 550\r
+            Logout\r
+               REIN\r
+                  120\r
+                     220\r
+                  220\r
+                  421\r
+                  500, 502\r
+               QUIT\r
+                  221\r
+                  500\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 50]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            Transfer parameters\r
+               PORT\r
+                  200\r
+                  500, 501, 421, 530\r
+               PASV\r
+                  227\r
+                  500, 501, 502, 421, 530\r
+               MODE\r
+                  200\r
+                  500, 501, 504, 421, 530\r
+               TYPE\r
+                  200\r
+                  500, 501, 504, 421, 530\r
+               STRU\r
+                  200\r
+                  500, 501, 504, 421, 530\r
+            File action commands\r
+               ALLO\r
+                  200\r
+                  202\r
+                  500, 501, 504, 421, 530\r
+               REST\r
+                  500, 501, 502, 421, 530\r
+                  350\r
+               STOR\r
+                  125, 150\r
+                     (110)\r
+                     226, 250\r
+                     425, 426, 451, 551, 552\r
+                  532, 450, 452, 553\r
+                  500, 501, 421, 530\r
+               STOU\r
+                  125, 150\r
+                     (110)\r
+                     226, 250\r
+                     425, 426, 451, 551, 552\r
+                  532, 450, 452, 553\r
+                  500, 501, 421, 530\r
+               RETR\r
+                  125, 150\r
+                     (110)\r
+                     226, 250\r
+                     425, 426, 451\r
+                  450, 550\r
+                  500, 501, 421, 530\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 51]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+               LIST\r
+                  125, 150\r
+                     226, 250\r
+                     425, 426, 451\r
+                  450\r
+                  500, 501, 502, 421, 530\r
+               NLST\r
+                  125, 150\r
+                     226, 250\r
+                     425, 426, 451\r
+                  450\r
+                  500, 501, 502, 421, 530\r
+               APPE\r
+                  125, 150\r
+                     (110)\r
+                     226, 250\r
+                     425, 426, 451, 551, 552\r
+                  532, 450, 550, 452, 553\r
+                  500, 501, 502, 421, 530\r
+               RNFR\r
+                  450, 550\r
+                  500, 501, 502, 421, 530\r
+                  350\r
+               RNTO\r
+                  250\r
+                  532, 553\r
+                  500, 501, 502, 503, 421, 530\r
+               DELE\r
+                  250\r
+                  450, 550\r
+                  500, 501, 502, 421, 530\r
+               RMD\r
+                  250\r
+                  500, 501, 502, 421, 530, 550\r
+               MKD\r
+                  257\r
+                  500, 501, 502, 421, 530, 550\r
+               PWD\r
+                  257\r
+                  500, 501, 502, 421, 550\r
+               ABOR\r
+                  225, 226\r
+                  500, 501, 502, 421\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 52]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+            Informational commands\r
+               SYST\r
+                  215\r
+                  500, 501, 502, 421\r
+               STAT\r
+                  211, 212, 213\r
+                  450\r
+                  500, 501, 502, 421, 530\r
+               HELP\r
+                  211, 214\r
+                  500, 501, 502, 421\r
+            Miscellaneous commands\r
+               SITE\r
+                  200\r
+                  202\r
+                  500, 501, 530\r
+               NOOP\r
+                  200\r
+                  500 421\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 53]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+6.  STATE DIAGRAMS\r
+\r
+   Here we present state diagrams for a very simple minded FTP\r
+   implementation.  Only the first digit of the reply codes is used.\r
+   There is one state diagram for each group of FTP commands or command\r
+   sequences.\r
+\r
+   The command groupings were determined by constructing a model for\r
+   each command then collecting together the commands with structurally\r
+   identical models.\r
+\r
+   For each command or command sequence there are three possible\r
+   outcomes: success (S), failure (F), and error (E).  In the state\r
+   diagrams below we use the symbol B for "begin", and the symbol W for\r
+   "wait for reply".\r
+\r
+   We first present the diagram that represents the largest group of FTP\r
+   commands:\r
+\r
+      \r
+                               1,3    +---+\r
+                          ----------->| E |\r
+                         |            +---+\r
+                         |\r
+      +---+    cmd    +---+    2      +---+\r
+      | B |---------->| W |---------->| S |\r
+      +---+           +---+           +---+\r
+                         |\r
+                         |     4,5    +---+\r
+                          ----------->| F |\r
+                                      +---+\r
+      \r
+\r
+      This diagram models the commands:\r
+\r
+         ABOR, ALLO, DELE, CWD, CDUP, SMNT, HELP, MODE, NOOP, PASV,\r
+         QUIT, SITE, PORT, SYST, STAT, RMD, MKD, PWD, STRU, and TYPE.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 54]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   The other large group of commands is represented by a very similar\r
+   diagram:\r
+\r
+      \r
+                               3      +---+\r
+                          ----------->| E |\r
+                         |            +---+\r
+                         |\r
+      +---+    cmd    +---+    2      +---+\r
+      | B |---------->| W |---------->| S |\r
+      +---+       --->+---+           +---+\r
+                 |     | |\r
+                 |     | |     4,5    +---+\r
+                 |  1  |  ----------->| F |\r
+                  -----               +---+\r
+      \r
+\r
+      This diagram models the commands:\r
+\r
+         APPE, LIST, NLST, REIN, RETR, STOR, and STOU.\r
+\r
+   Note that this second model could also be used to represent the first\r
+   group of commands, the only difference being that in the first group\r
+   the 100 series replies are unexpected and therefore treated as error,\r
+   while the second group expects (some may require) 100 series replies.\r
+   Remember that at most, one 100 series reply is allowed per command.\r
+\r
+   The remaining diagrams model command sequences, perhaps the simplest\r
+   of these is the rename sequence:\r
+\r
+      \r
+      +---+   RNFR    +---+    1,2    +---+\r
+      | B |---------->| W |---------->| E |\r
+      +---+           +---+        -->+---+\r
+                       | |        |\r
+                3      | | 4,5    |\r
+         --------------  ------   |\r
+        |                      |  |   +---+\r
+        |               ------------->| S |\r
+        |              |   1,3 |  |   +---+\r
+        |             2|  --------\r
+        |              | |     |\r
+        V              | |     |\r
+      +---+   RNTO    +---+ 4,5 ----->+---+\r
+      |   |---------->| W |---------->| F |\r
+      +---+           +---+           +---+\r
+      \r
+\r
+\r
+Postel & Reynolds                                              [Page 55]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   The next diagram is a simple model of the Restart command:\r
+\r
+      \r
+      +---+   REST    +---+    1,2    +---+\r
+      | B |---------->| W |---------->| E |\r
+      +---+           +---+        -->+---+\r
+                       | |        |\r
+                3      | | 4,5    |\r
+         --------------  ------   |\r
+        |                      |  |   +---+\r
+        |               ------------->| S |\r
+        |              |   3   |  |   +---+\r
+        |             2|  --------\r
+        |              | |     |\r
+        V              | |     |\r
+      +---+   cmd     +---+ 4,5 ----->+---+\r
+      |   |---------->| W |---------->| F |\r
+      +---+        -->+---+           +---+\r
+                  |      |\r
+                  |  1   |\r
+                   ------\r
+      \r
+\r
+         Where "cmd" is APPE, STOR, or RETR.\r
+\r
+   We note that the above three models are similar.  The Restart differs\r
+   from the Rename two only in the treatment of 100 series replies at\r
+   the second stage, while the second group expects (some may require)\r
+   100 series replies.  Remember that at most, one 100 series reply is\r
+   allowed per command.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 56]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   The most complicated diagram is for the Login sequence:\r
+\r
+      \r
+                            1\r
+      +---+   USER    +---+------------->+---+\r
+      | B |---------->| W | 2       ---->| E |\r
+      +---+           +---+------  |  -->+---+\r
+                       | |       | | |\r
+                     3 | | 4,5   | | |\r
+         --------------   -----  | | |\r
+        |                      | | | |\r
+        |                      | | | |\r
+        |                 ---------  |\r
+        |               1|     | |   |\r
+        V                |     | |   |\r
+      +---+   PASS    +---+ 2  |  ------>+---+\r
+      |   |---------->| W |------------->| S |\r
+      +---+           +---+   ---------->+---+\r
+                       | |   | |     |\r
+                     3 | |4,5| |     |\r
+         --------------   --------   |\r
+        |                    | |  |  |\r
+        |                    | |  |  |\r
+        |                 -----------\r
+        |             1,3|   | |  |\r
+        V                |  2| |  |\r
+      +---+   ACCT    +---+--  |   ----->+---+\r
+      |   |---------->| W | 4,5 -------->| F |\r
+      +---+           +---+------------->+---+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 57]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   Finally, we present a generalized diagram that could be used to model\r
+   the command and reply interchange:\r
+\r
+      \r
+               ------------------------------------\r
+              |                                    |\r
+      Begin   |                                    |\r
+        |     V                                    |\r
+        |   +---+  cmd   +---+ 2         +---+     |\r
+         -->|   |------->|   |---------->|   |     |\r
+            |   |        | W |           | S |-----|\r
+         -->|   |     -->|   |-----      |   |     |\r
+        |   +---+    |   +---+ 4,5 |     +---+     |\r
+        |     |      |    | |      |               |\r
+        |     |      |   1| |3     |     +---+     |\r
+        |     |      |    | |      |     |   |     |\r
+        |     |       ----  |       ---->| F |-----\r
+        |     |             |            |   |\r
+        |     |             |            +---+\r
+         -------------------\r
+              |\r
+              |\r
+              V\r
+             End\r
+      \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 58]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+7.  TYPICAL FTP SCENARIO\r
+\r
+   User at host U wanting to transfer files to/from host S:\r
+\r
+   In general, the user will communicate to the server via a mediating\r
+   user-FTP process.  The following may be a typical scenario.  The\r
+   user-FTP prompts are shown in parentheses, '---->' represents\r
+   commands from host U to host S, and '<----' represents replies from\r
+   host S to host U.\r
+\r
+      LOCAL COMMANDS BY USER              ACTION INVOLVED\r
+\r
+      ftp (host) multics<CR>         Connect to host S, port L,\r
+                                     establishing control connections.\r
+                                     <---- 220 Service ready <CRLF>.\r
+      username Doe <CR>              USER Doe<CRLF>---->\r
+                                     <---- 331 User name ok,\r
+                                               need password<CRLF>.\r
+      password mumble <CR>           PASS mumble<CRLF>---->\r
+                                     <---- 230 User logged in<CRLF>.\r
+      retrieve (local type) ASCII<CR>\r
+      (local pathname) test 1 <CR>   User-FTP opens local file in ASCII.\r
+      (for. pathname) test.pl1<CR>   RETR test.pl1<CRLF> ---->\r
+                                     <---- 150 File status okay;\r
+                                           about to open data\r
+                                           connection<CRLF>.\r
+                                     Server makes data connection\r
+                                     to port U.\r
+      \r
+                                     <---- 226 Closing data connection,\r
+                                         file transfer successful<CRLF>.\r
+      type Image<CR>                 TYPE I<CRLF> ---->\r
+                                     <---- 200 Command OK<CRLF>\r
+      store (local type) image<CR>\r
+      (local pathname) file dump<CR> User-FTP opens local file in Image.\r
+      (for.pathname) >udd>cn>fd<CR>  STOR >udd>cn>fd<CRLF> ---->\r
+                                     <---- 550 Access denied<CRLF>\r
+      terminate                      QUIT <CRLF> ---->\r
+                                     Server closes all\r
+                                     connections.\r
+\r
+8.  CONNECTION ESTABLISHMENT\r
+\r
+   The FTP control connection is established via TCP between the user\r
+   process port U and the server process port L.  This protocol is\r
+   assigned the service port 21 (25 octal), that is L=21.\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 59]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+APPENDIX I -  PAGE STRUCTURE\r
+\r
+   The need for FTP to support page structure derives principally from\r
+   the  need to support efficient transmission of files between TOPS-20\r
+   systems, particularly the files used by NLS.\r
+\r
+   The file system of TOPS-20 is based on the concept of pages.  The\r
+   operating system is most efficient at manipulating files as pages.\r
+   The operating system provides an interface to the file system so that\r
+   many applications view files as sequential streams of characters.\r
+   However, a few applications use the underlying page structures\r
+   directly, and some of these create holey files.\r
+\r
+   A TOPS-20 disk file consists of four things: a pathname, a page\r
+   table, a (possibly empty) set of pages, and a set of attributes.\r
+\r
+   The pathname is specified in the RETR or STOR command.  It includes\r
+   the directory name, file name, file name extension, and generation\r
+   number.\r
+\r
+   The page table contains up to 2**18 entries.  Each entry may be\r
+   EMPTY, or may point to a page.  If it is not empty, there are also\r
+   some page-specific access bits; not all pages of a file need have the\r
+   same access protection.\r
+\r
+      A page is a contiguous set of 512 words of 36 bits each.\r
+\r
+   The attributes of the file, in the File Descriptor Block (FDB),\r
+   contain such things as creation time, write time, read time, writer's\r
+   byte-size, end-of-file pointer, count of reads and writes, backup\r
+   system tape numbers, etc.\r
+\r
+   Note that there is NO requirement that entries in the page table be\r
+   contiguous.  There may be empty page table slots between occupied\r
+   ones.  Also, the end of file pointer is simply a number.  There is no\r
+   requirement that it in fact point at the "last" datum in the file.\r
+   Ordinary sequential I/O calls in TOPS-20 will cause the end of file\r
+   pointer to be left after the last datum written, but other operations\r
+   may cause it not to be so, if a particular programming system so\r
+   requires.\r
+\r
+   In fact, in both of these special cases, "holey" files and\r
+   end-of-file pointers NOT at the end of the file, occur with NLS data\r
+   files.\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 60]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   The TOPS-20 paged files can be sent with the FTP transfer parameters:\r
+   TYPE L 36, STRU P, and MODE S (in fact, any mode could be used).\r
+\r
+   Each page of information has a header.  Each header field, which is a\r
+   logical byte, is a TOPS-20 word, since the TYPE is L 36.\r
+\r
+   The header fields are:\r
+\r
+      Word 0: Header Length.\r
+\r
+         The header length is 5.\r
+\r
+      Word 1: Page Index.\r
+\r
+         If the data is a disk file page, this is the number of that\r
+         page in the file's page map.  Empty pages (holes) in the file\r
+         are simply not sent.  Note that a hole is NOT the same as a\r
+         page of zeros.\r
+\r
+      Word 2: Data Length.\r
+\r
+         The number of data words in this page, following the header.\r
+         Thus, the total length of the transmission unit is the Header\r
+         Length plus the Data Length.\r
+\r
+      Word 3: Page Type.\r
+\r
+         A code for what type of chunk this is.  A data page is type 3,\r
+         the FDB page is type 2.\r
+\r
+      Word 4: Page Access Control.\r
+\r
+         The access bits associated with the page in the file's page\r
+         map.  (This full word quantity is put into AC2 of an SPACS by\r
+         the program reading from net to disk.)\r
+\r
+   After the header are Data Length data words.  Data Length is\r
+   currently either 512 for a data page or 31 for an FDB.  Trailing\r
+   zeros in a disk file page may be discarded, making Data Length less\r
+   than 512 in that case.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 61]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+APPENDIX II -  DIRECTORY COMMANDS\r
+\r
+   Since UNIX has a tree-like directory structure in which directories\r
+   are as easy to manipulate as ordinary files, it is useful to expand\r
+   the FTP servers on these machines to include commands which deal with\r
+   the creation of directories.  Since there are other hosts on the\r
+   ARPA-Internet which have tree-like directories (including TOPS-20 and\r
+   Multics), these commands are as general as possible.\r
+\r
+      Four directory commands have been added to FTP:\r
+\r
+         MKD pathname\r
+\r
+            Make a directory with the name "pathname".\r
+\r
+         RMD pathname\r
+\r
+            Remove the directory with the name "pathname".\r
+\r
+         PWD\r
+\r
+            Print the current working directory name.\r
+\r
+         CDUP\r
+\r
+            Change to the parent of the current working directory.\r
+\r
+   The  "pathname"  argument should be created (removed) as a\r
+   subdirectory of the current working directory, unless the "pathname"\r
+   string contains sufficient information to specify otherwise to the\r
+   server, e.g., "pathname" is an absolute pathname (in UNIX and\r
+   Multics), or pathname is something like "<abso.lute.path>" to\r
+   TOPS-20.\r
+\r
+   REPLY CODES\r
+\r
+      The CDUP command is a special case of CWD, and is included to\r
+      simplify the implementation of programs for transferring directory\r
+      trees between operating systems having different syntaxes for\r
+      naming the parent directory.  The reply codes for CDUP be\r
+      identical to the reply codes of CWD.\r
+\r
+      The reply codes for RMD be identical to the reply codes for its\r
+      file analogue, DELE.\r
+\r
+      The reply codes for MKD, however, are a bit more complicated.  A\r
+      freshly created directory will probably be the object of a future\r
+\r
+\r
+Postel & Reynolds                                              [Page 62]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      CWD command.  Unfortunately, the argument to MKD may not always be\r
+      a suitable argument for CWD.  This is the case, for example, when\r
+      a TOPS-20 subdirectory is created by giving just the subdirectory\r
+      name.  That is, with a TOPS-20 server FTP, the command sequence\r
+\r
+         MKD MYDIR\r
+         CWD MYDIR\r
+\r
+      will fail.  The new directory may only be referred to by its\r
+      "absolute" name; e.g., if the MKD command above were issued while\r
+      connected to the directory <DFRANKLIN>, the new subdirectory\r
+      could only be referred to by the name <DFRANKLIN.MYDIR>.\r
+\r
+      Even on UNIX and Multics, however, the argument given to MKD may\r
+      not be suitable.  If it is a "relative" pathname (i.e., a pathname\r
+      which is interpreted relative to the current directory), the user\r
+      would need to be in the same current directory in order to reach\r
+      the subdirectory.  Depending on the application, this may be\r
+      inconvenient.  It is not very robust in any case.\r
+\r
+      To solve these problems, upon successful completion of an MKD\r
+      command, the server should return a line of the form:\r
+\r
+         257<space>"<directory-name>"<space><commentary>\r
+\r
+      That is, the server will tell the user what string to use when\r
+      referring to the created  directory.  The directory name can\r
+      contain any character; embedded double-quotes should be escaped by\r
+      double-quotes (the "quote-doubling" convention).\r
+\r
+      For example, a user connects to the directory /usr/dm, and creates\r
+      a subdirectory, named pathname:\r
+\r
+         CWD /usr/dm\r
+         200 directory changed to /usr/dm\r
+         MKD pathname\r
+         257 "/usr/dm/pathname" directory created\r
+\r
+      An example with an embedded double quote:\r
+\r
+         MKD foo"bar\r
+         257 "/usr/dm/foo""bar" directory created\r
+         CWD /usr/dm/foo"bar\r
+         200 directory changed to /usr/dm/foo"bar\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 63]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      The prior existence of a subdirectory with the same name is an\r
+      error, and the server must return an "access denied" error reply\r
+      in that case.\r
+\r
+         CWD /usr/dm\r
+         200 directory changed to /usr/dm\r
+         MKD pathname\r
+         521-"/usr/dm/pathname" directory already exists;\r
+         521 taking no action.\r
+\r
+      The failure replies for MKD are analogous to its file  creating\r
+      cousin, STOR.  Also, an "access denied" return is given if a file\r
+      name with the same name as the subdirectory will conflict with the\r
+      creation of the subdirectory (this is a problem on UNIX, but\r
+      shouldn't be one on TOPS-20).\r
+\r
+      Essentially because the PWD command returns the same type of\r
+      information as the successful MKD command, the successful PWD\r
+      command uses the 257 reply code as well.\r
+\r
+   SUBTLETIES\r
+\r
+      Because these commands will be most useful in transferring\r
+      subtrees from one machine to another, carefully observe that the\r
+      argument to MKD is to be interpreted as a sub-directory of  the\r
+      current working directory, unless it contains enough information\r
+      for the destination host to tell otherwise.  A hypothetical\r
+      example of its use in the TOPS-20 world:\r
+\r
+         CWD <some.where>\r
+         200 Working directory changed\r
+         MKD overrainbow\r
+         257 "<some.where.overrainbow>" directory created\r
+         CWD overrainbow\r
+         431 No such directory\r
+         CWD <some.where.overrainbow>\r
+         200 Working directory changed\r
+\r
+         CWD <some.where>\r
+         200 Working directory changed to <some.where>\r
+         MKD <unambiguous>\r
+         257 "<unambiguous>" directory created\r
+         CWD <unambiguous>\r
+\r
+      Note that the first example results in a subdirectory of the\r
+      connected directory.  In contrast, the argument in the second\r
+      example contains enough information for TOPS-20 to tell that  the\r
+\r
+\r
+Postel & Reynolds                                              [Page 64]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+      <unambiguous> directory is a top-level directory.  Note also that\r
+      in the first example the user "violated" the protocol by\r
+      attempting to access the freshly created directory with a name\r
+      other than the one returned by TOPS-20.  Problems could have\r
+      resulted in this case had there been an <overrainbow> directory;\r
+      this is an ambiguity inherent in some TOPS-20 implementations.\r
+      Similar considerations apply to the RMD command.  The point is\r
+      this: except where to do so would violate a host's conventions for\r
+      denoting relative versus absolute pathnames, the host should treat\r
+      the operands of the MKD and RMD commands as subdirectories.  The\r
+      257 reply to the MKD command must always contain the absolute\r
+      pathname of the created directory.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 65]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+APPENDIX III - RFCs on FTP\r
+\r
+   Bhushan, Abhay, "A File Transfer Protocol", RFC 114 (NIC 5823),\r
+   MIT-Project MAC, 16 April 1971.\r
+\r
+   Harslem, Eric, and John Heafner, "Comments on RFC 114 (A File\r
+   Transfer Protocol)", RFC 141 (NIC 6726), RAND, 29 April 1971.\r
+\r
+   Bhushan, Abhay, et al, "The File Transfer Protocol", RFC 172\r
+   (NIC 6794), MIT-Project MAC, 23 June 1971.\r
+\r
+   Braden, Bob, "Comments on DTP and FTP Proposals", RFC 238 (NIC 7663),\r
+   UCLA/CCN, 29 September 1971.\r
+\r
+   Bhushan, Abhay, et al, "The File Transfer Protocol", RFC 265\r
+   (NIC 7813), MIT-Project MAC, 17 November 1971.\r
+\r
+   McKenzie, Alex, "A Suggested Addition to File Transfer Protocol",\r
+   RFC 281 (NIC 8163), BBN, 8 December 1971.\r
+\r
+   Bhushan, Abhay, "The Use of "Set Data Type" Transaction in File\r
+   Transfer Protocol", RFC 294 (NIC 8304), MIT-Project MAC,\r
+   25 January 1972.\r
+\r
+   Bhushan, Abhay, "The File Transfer Protocol", RFC 354 (NIC 10596),\r
+   MIT-Project MAC, 8 July 1972.\r
+\r
+   Bhushan, Abhay, "Comments on the File Transfer Protocol (RFC 354)",\r
+   RFC 385 (NIC 11357), MIT-Project MAC, 18 August 1972.\r
+\r
+   Hicks, Greg, "User FTP Documentation", RFC 412 (NIC 12404), Utah,\r
+   27 November 1972.\r
+\r
+   Bhushan, Abhay, "File Transfer Protocol (FTP) Status and Further\r
+   Comments", RFC 414 (NIC 12406), MIT-Project MAC, 20 November 1972.\r
+\r
+   Braden, Bob, "Comments on File Transfer Protocol", RFC 430\r
+   (NIC 13299), UCLA/CCN, 7 February 1973.\r
+\r
+   Thomas, Bob, and Bob Clements, "FTP Server-Server Interaction",\r
+   RFC 438 (NIC 13770), BBN, 15 January 1973.\r
+\r
+   Braden, Bob, "Print Files in FTP", RFC 448 (NIC 13299), UCLA/CCN,\r
+   27 February 1973.\r
+\r
+   McKenzie, Alex, "File Transfer Protocol", RFC 454 (NIC 14333), BBN,\r
+   16 February 1973.\r
+\r
+\r
+Postel & Reynolds                                              [Page 66]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   Bressler, Bob, and Bob Thomas, "Mail Retrieval via FTP", RFC 458\r
+   (NIC 14378), BBN-NET and BBN-TENEX, 20 February 1973.\r
+\r
+   Neigus, Nancy, "File Transfer Protocol", RFC 542 (NIC 17759), BBN,\r
+   12 July 1973.\r
+\r
+   Krilanovich, Mark, and George Gregg, "Comments on the File Transfer\r
+   Protocol", RFC 607 (NIC 21255), UCSB, 7 January 1974.\r
+\r
+   Pogran, Ken, and Nancy Neigus, "Response to RFC 607 - Comments on the\r
+   File Transfer Protocol", RFC 614 (NIC 21530), BBN, 28 January 1974.\r
+\r
+   Krilanovich, Mark, George Gregg, Wayne Hathaway, and Jim White,\r
+   "Comments on the File Transfer Protocol", RFC 624 (NIC 22054), UCSB,\r
+   Ames Research Center, SRI-ARC, 28 February 1974.\r
+\r
+   Bhushan, Abhay, "FTP Comments and Response to RFC 430", RFC 463\r
+   (NIC 14573), MIT-DMCG, 21 February 1973.\r
+\r
+   Braden, Bob, "FTP Data Compression", RFC 468 (NIC 14742), UCLA/CCN,\r
+   8 March 1973.\r
+\r
+   Bhushan, Abhay, "FTP and Network Mail System", RFC 475 (NIC 14919),\r
+   MIT-DMCG, 6 March 1973.\r
+\r
+   Bressler, Bob, and Bob Thomas "FTP Server-Server Interaction - II",\r
+   RFC 478 (NIC 14947), BBN-NET and BBN-TENEX, 26 March 1973.\r
+\r
+   White, Jim, "Use of FTP by the NIC Journal", RFC 479 (NIC 14948),\r
+   SRI-ARC, 8 March 1973.\r
+\r
+   White, Jim, "Host-Dependent FTP Parameters", RFC 480 (NIC 14949),\r
+   SRI-ARC, 8 March 1973.\r
+\r
+   Padlipsky, Mike, "An FTP Command-Naming Problem", RFC 506\r
+   (NIC 16157), MIT-Multics, 26 June 1973.\r
+\r
+   Day, John, "Memo to FTP Group (Proposal for File Access Protocol)",\r
+   RFC 520 (NIC 16819), Illinois, 25 June 1973.\r
+\r
+   Merryman, Robert, "The UCSD-CC Server-FTP Facility", RFC 532\r
+   (NIC 17451), UCSD-CC, 22 June 1973.\r
+\r
+   Braden, Bob, "TENEX FTP Problem", RFC 571 (NIC 18974), UCLA/CCN,\r
+   15 November 1973.\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 67]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+   McKenzie, Alex, and Jon Postel, "Telnet and FTP Implementation -\r
+   Schedule Change", RFC 593 (NIC 20615), BBN and MITRE,\r
+   29 November 1973.\r
+\r
+   Sussman, Julie, "FTP Error Code Usage for More Reliable Mail\r
+   Service", RFC 630 (NIC 30237), BBN, 10 April 1974.\r
+\r
+   Postel, Jon, "Revised FTP Reply Codes", RFC 640 (NIC 30843),\r
+   UCLA/NMC, 5 June 1974.\r
+\r
+   Harvey, Brian, "Leaving Well Enough Alone", RFC 686 (NIC 32481),\r
+   SU-AI, 10 May 1975.\r
+\r
+   Harvey, Brian, "One More Try on the FTP", RFC 691 (NIC 32700), SU-AI,\r
+   28 May 1975.\r
+\r
+   Lieb, J., "CWD Command of FTP", RFC 697 (NIC 32963), 14 July 1975.\r
+\r
+   Harrenstien, Ken, "FTP Extension: XSEN", RFC 737 (NIC 42217), SRI-KL,\r
+   31 October 1977.\r
+\r
+   Harrenstien, Ken, "FTP Extension: XRSQ/XRCP", RFC 743 (NIC 42758),\r
+   SRI-KL, 30 December 1977.\r
+\r
+   Lebling, P. David, "Survey of FTP Mail and MLFL", RFC 751, MIT,\r
+   10 December 1978.\r
+\r
+   Postel, Jon, "File Transfer Protocol Specification", RFC 765, ISI,\r
+   June 1980.\r
+\r
+   Mankins, David, Dan Franklin, and Buzz Owen, "Directory Oriented FTP\r
+   Commands", RFC 776, BBN, December 1980.\r
+\r
+   Padlipsky, Michael, "FTP Unique-Named Store Command", RFC 949, MITRE,\r
+   July 1985.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 68]\r
+\f\r
+\r
+                                                                        \r
+RFC 959                                                     October 1985\r
+File Transfer Protocol\r
+\r
+\r
+REFERENCES\r
+\r
+   [1]  Feinler, Elizabeth, "Internet Protocol Transition Workbook",\r
+        Network Information Center, SRI International, March 1982.\r
+\r
+   [2]  Postel, Jon, "Transmission Control Protocol - DARPA Internet\r
+        Program Protocol Specification", RFC 793, DARPA, September 1981.\r
+\r
+   [3]  Postel, Jon, and Joyce Reynolds, "Telnet Protocol\r
+        Specification", RFC 854, ISI, May 1983.\r
+\r
+   [4]  Reynolds, Joyce, and Jon Postel, "Assigned Numbers", RFC 943,\r
+        ISI, April 1985.\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Postel & Reynolds                                              [Page 69]\r
+\f\r
+\r
+\r
index 21ef830..84108fe 100644 (file)
@@ -80,6 +80,9 @@ extern int wait __P((int *statloc));
 extern int write __P((int d, void *buf, uint nbytes));\r
 extern int reboot __P((char p1, char p2));\r
 extern int systrace __P((int onoff));\r
+#if 1 /* Nick */\r
+extern int sysdebug __P((int onoff));\r
+#endif\r
 extern int unix __P((int callno, ...)); /* ensures IAR doesn't use regparms */\r
 extern long unix_long __P((int callno, ...)); /* ensures IAR doesn't use reg */\r
 \r
index 6c98251..503b75f 100644 (file)
@@ -47,6 +47,7 @@ relsysb\symlink.rel
 relsysb\sync.rel\r
 relsysb\sys0b.rel\r
 relsysb\sys1b.rel\r
+relsysb\sysdebug.rel\r
 relsysb\systrace.rel\r
 relsysb\time.rel\r
 relsysb\times.rel\r
index 1cb0d32..e77395d 100644 (file)
@@ -47,6 +47,7 @@ relsysl\symlink.rel
 relsysl\sync.rel\r
 relsysl\sys0l.rel\r
 relsysl\sys1l.rel\r
+relsysl\sysdebug.rel\r
 relsysl\systrace.rel\r
 relsysl\time.rel\r
 relsysl\times.rel\r
diff --git a/lib/relsysb/sysdebug.rel b/lib/relsysb/sysdebug.rel
new file mode 100644 (file)
index 0000000..a64d4cd
--- /dev/null
@@ -0,0 +1,22 @@
+XL4\r
+H 2 areas 7 global symbols\r
+M _sysdebug\r
+S unix Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
+S ?ENT_PARM_DIRECT_L09 Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 1A flags 0\r
+S sysdebug Def00000000\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 CD 00 00 00 00 D5 21 0C 00 E5 21\r
+R 00 00 01 00 02 05 02 00\r
+T 09 00 00 00 07 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 00 00\r
+T 0F 00 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 00 00 02 09 03 00\r
+T 16 00 00 00 F1 C3 00 00 00 00\r
+R 00 00 01 00 02 06 01 00\r
diff --git a/lib/relsysl/sysdebug.rel b/lib/relsysl/sysdebug.rel
new file mode 100644 (file)
index 0000000..c293814
--- /dev/null
@@ -0,0 +1,19 @@
+XL4\r
+H 2 areas 6 global symbols\r
+M _sysdebug\r
+S ?CL64180L_4_06_L00 Ref00000000\r
+S unix Ref00000000\r
+S ?LEAVE_DIRECT_L09 Ref00000000\r
+S ?ENT_PARM_DIRECT_L09 Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 15 flags 0\r
+S sysdebug Def00000000\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 CD 00 00 00 00 D5 21 0C 00 E5 21\r
+R 00 00 01 00 02 05 03 00\r
+T 09 00 00 00 07 00 E5 CD 00 00 00 00 F1 F1 F1\r
+R 00 00 01 00 02 08 01 00\r
+T 12 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 02 00\r
diff --git a/relnotes/20030512.txt b/relnotes/20030512.txt
new file mode 100644 (file)
index 0000000..d427663
--- /dev/null
@@ -0,0 +1,667 @@
+HYTECH-INTERNATIONAL BV\r
+CMX/UZI TESTRELEASE FOR SOFTWARE DEPARTMENT 030512SD\r
+\r
+MANIFEST\r
+\r
+-rw-r--r--    1 nick     users     8907957 May 12 16:02 uzi.zip\r
+\r
+Please download the files for this release from:\r
+http://www.hytechscales.com/release/nld/test/030512SD\r
+\r
+INTRODUCTION\r
+\r
+Full release of the Hytech CMX/UZI kernel and associated utilities.  In the\r
+folders within the zip we have a complete set of binaries, libraries and\r
+source, including pre-built flash card images.  Contains a version of Joost's\r
+login and test programs, with X/Y positioning of text slightly modified by\r
+Nick.  This operating system release is much more stable than the previous one,\r
+and should be adopted as the platform for application level development.\r
+\r
+The kernel is not substantially changed from the previous 030306SD testrelease,\r
+except for the addition of debugging changes, and a bugfix for a problem\r
+discovered by Joost.  The utility programs received a few enhancements and\r
+bugfixes.  The most major change is to the filesystem, ie. the folder structure\r
+of the flash card, the scripts which control the building of the card, and the\r
+subsequent loading phases.\r
+\r
+Support for the touchscreen is also improved, with new font files being\r
+available on the flash card for downloading to the touchscreen.  These are also\r
+downloaded automatically once, during the initial loading process.  The source\r
+image files for the fonts are easily edited, using Photoshop or similar.  Using\r
+the new font compiler, we can easily add new typefaces, or arbitrary graphics\r
+and images specific to the application.\r
+\r
+DETAILS OF CHANGES TO THE KERNEL\r
+\r
+1.  Extensive support for debuglevels in the kernel.  An example of the new\r
+format for debugging code in the kernel is as follows:\r
+\r
+        ...\r
+        variable = 1;\r
+#if DEBUG >= 2\r
+ dprintf(2, "the value of variable = %d\n", variable);\r
+#endif\r
+        switch (variable)\r
+        ...\r
+\r
+In this case the programmer wanted to inspect the value of some variable during\r
+a critical operation.  To better control when this diagnostic should be\r
+printed, the programmer has selected debuglevel 2, with the minimum debuglevel\r
+being 1, and an increasing debuglevel indicating more and more detailed\r
+information.  The dprintf() function is new in this release.  It works the same\r
+as kprintf() but the first argument is an integer debuglevel.\r
+\r
+2.  We now have both compile-time and run-time selection of the debuglevel.\r
+The compile-time setting is controlled by "/uzi/src/kernel/build.ban" and\r
+should be edited on every line beginning with "iccz80".  For example:\r
+\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2\r
+..\libc\memcpy\r
+@if errorlevel 1 goto failure\r
+del memcpy.r01\r
+as-z80 -l -o memcpy.s01\r
+@if errorlevel 1 goto failure\r
+If we want to change the debuglevel compiled into kernel's internal "memcpy"\r
+function, we would change the -DDEBUG=2 option to the compiler into something\r
+different.  In particular, if the option is set to 0, or omitted entirely, no\r
+debuglevel support is compiled in, and we achieve a smaller kernel executable.\r
+There is no specific limit to what the debuglevel could be set to, other than\r
+the range of an "int", but commonsense limits us to about 10.\r
+\r
+3.  Typically the compile-time selection will be the same for all modules, so\r
+you can just load up the file "/uzi/src/kernel/build.ban" into your text editor\r
+and perform a search and replace eg. change "DEBUG=2" into "DEBUG=4" if you\r
+require more detailed debugging output.  Then recompile the kernel and load.\r
+You must run "mkboot.bat" then "n.bat" in "/uzi/bin".  Nick has configured the\r
+debuglevels in this release, so that most of the system calls will provide some\r
+output at debuglevel 2, with more detailed information (eg. dumps of directory\r
+searches and block cache operations) being available at debuglevels 3 and 4.\r
+\r
+4.  Changing the compile-time debuglevel selection will not have any immediate\r
+effect, because debugging output is turned off by default, when the system\r
+boots.  At the moment there is no key combination which will allow changing the\r
+debuglevel, (unlike the Ctrl-N command which enables/disables global system\r
+tracing), but instead, requests for kernel debugging output must be compiled\r
+into your programs.  The "/uzi/src/libsys/sysdebug.c" module and the\r
+corresponding system call handling in the kernel have been provided to control\r
+this.\r
+\r
+5.  For example, when Nick was debugging a problem in the falign() system call,\r
+the offending call was bracketed with sysdebug(4) and sysdebug(0) calls.  Thus,\r
+an extensive amount of debugging information was turned on while processing\r
+this one particular system call, with no debugging information being printed at\r
+bootup or after finishing the call.  This control is very important because it\r
+can take an impossibly long time to boot the system when full debugging output\r
+is turned on.  Similarly the systrace() call is available for your use.\r
+\r
+6.  Fixed a bug which was causing problems for Joost's development.  This\r
+subtle bug was due to IAR's default of "unsigned char" whereas the original\r
+author of the filesystem code had obviously expected char to default to "signed\r
+char".  The bug could be observed in the fork() system call, as it tried to\r
+increment reference counts for all the inherited handles.  The kernel thought\r
+all handles were open, and so it went and incremented a byte of memory which\r
+happened to lie in the disk block cache.  Strange and subtle corruption of the\r
+disks was the result, manifested in an ECORRUPTFS error down the track.  Now\r
+fixed!\r
+\r
+7.  Removed support for the original UZI filesystem.  Since the 030306SD\r
+release, we have been running on a customised filesystem containing various new\r
+locking fields and bitmaps.  These are needed to make the "align" command\r
+perform its magic.  The older UZI filesystem was still useable although it\r
+didn't support the "align" command.  This meant we wasted a lot of space in the\r
+superblock for the "inode free list" and "block free list", which have now been\r
+replaced by the "inode free bitmap" and "block free bitmap".  To make the disks\r
+more compact, all references to the older filesystem in the kernel and\r
+utilities are gone.\r
+\r
+8.  Fixed a subtle bug in the alignment procedure, which was caused by a script\r
+"unlinking" itself during running.  Normally, in this case, the file remains\r
+intact on disk until the last handle is closed, at which point its space is\r
+reclaimed.  This led to an inconsistency between the inode's linkcount and its\r
+reference count, which caused the alignment routine to think the filesystem was\r
+corrupt and bomb out.  I decided to modify the i_open routine so a linkcount of\r
+zero is allowed, as long as the in-core reference count is nonzero.\r
+\r
+DETAILS OF CHANGES TO SUPPORT PROGRAMS\r
+\r
+1.  The "ls" command no longer relies on the line-wrap performed by your\r
+terminal.  Instead the "ls" program counts how many filenames have been\r
+printed, and issues a newline after 5 columns.  This works better on broken\r
+terminals such as Hyperterminal and Minicom, which don't correctly perform a\r
+linewrap if the end of the screen was reached by tabbing.  Instead they leave\r
+the cursor on the last column of the display ie. just before the tab stop.\r
+This was rather unsightly when viewing the "ls" output, so it's now been fixed.\r
+\r
+2.  We now have "banked" versions of the "fsck" and "mkfs" support utilities.\r
+Previously it didn't make sense to run these programs after the system had been\r
+loaded, but we now keep a "banked" version of the "fsck" program in memory all\r
+the time.  The startup scripts have been changed so that we always perform a\r
+filesystem check at boot.  Errors are fixed automatically, although this might\r
+not be appropriate for the running system.  For now, we just want to detect\r
+corruption.  Please note:  The filesystem is mounted read/write during the\r
+filecheck.  This will soon be fixed by Nick, with support for "mount -o\r
+remount,rw".\r
+\r
+3.  Removed support for the original UZI filesystem.  Since the 030306SD\r
+release, we have been running on a customised filesystem containing various new\r
+locking fields and bitmaps.  As mentioned in the section on kernel level\r
+changes, all references to the older filesystem in the kernel and utilities are\r
+gone.  This meant quite a few changes to the "mkfs" and "fsck" utilities, in\r
+particular their use of malloc() to allocate memory for the bitmaps.  The\r
+switch "-b" to "mkfs" is now redundant and is longer accepted, since the\r
+filesystem is always a bitmapped filesystem.  So I also removed "-b" from the\r
+"/uzi/bin/*.bat" scripts.\r
+\r
+4.  Added the commands "chown" and "chgrp" to our "ucp" (unix copy) utility.\r
+As mentioned further down, this is needed to set the ownerships for home\r
+directories in the pre-prepared filesystem.  Code was lifted out of\r
+"/uzi/src/simple/chown.c" and "/uzi/src/simple/chgrp.c" and inserted into\r
+"/uzi/src/fsutil/ucp.c" and "/uzi/src/fsutil/ucpsub.c".  I also added a new\r
+wrapper function "UZIXchown()" for interfacing to the kernel code.  Please\r
+note:  "ucp" also needs a setting to allow operating on a disk file other than\r
+"uzidisk.dat".  Coming soon.  We'll probably provide a command line switch,\r
+plus an option to the "root" command.\r
+\r
+5.  Added several "fatal error" messages to the Minix shell, in particular\r
+where it does heap and stack management.  A subtle incompatibility with the\r
+"uzix" C runtime library was discovered when running a shell script which used\r
+globbing.  The opendir() and closedir() functions had used malloc() and free(),\r
+which is not allowed because the Minix shell relies on doing its own heap\r
+management using brk() and sbrk().  Next time the Minix shell tried to push an\r
+object on its stack, it bombed out using abort(), but now we have a proper\r
+error message.  The actual bug is fixed by adding functions nick_opendir(),\r
+nick_readdir(), etc.\r
+\r
+6.  Changes to the time/date setting in the "/uzio/src/init/init.c" program.\r
+Previously there had been an inconsistency because the date was printed first,\r
+followed by the time, whereas the keyboard input format required the time\r
+first, followed by the date.  We've now standardised on "time followed by date"\r
+and the "init.c" code was changed to reflect this.  Please follow this example\r
+whenever times and dates must be printed.  We now prompt the user to "Please\r
+enter time/date" rather than "Please enter date/time".  The "setclock" utility\r
+in "/uzi/src/simple/setclock.c" received a cosmetic change because of this.\r
+\r
+DETAILS OF CHANGES TO THE FILESYSTEM\r
+\r
+1.  The "w.sh", "w.bat" and "w.ucp" scripts have now changed to "appinst.sh",\r
+"appinst.bat" and "appinst.ucp".  The name better reflects the function of the\r
+scripts, and the folder position of the "w.sh" file on the running system has\r
+also changed.  Previously the "w.sh" file was held in /wnd on the flash card,\r
+and copied to /wnd on the memory filesystem.  It's now always executed from\r
+/boot on the flash card, or /usr/boot when the card is mounted on /usr as it\r
+normally is.\r
+\r
+2.  We now have the following extra directories in "/uzi/bin":\r
+data    Joost's screenfiles.  Soon to be upgraded to XML.\r
+font    Nick's fontfiles.  Suitable for copying to /dev/lcdx.\r
+The files from these directories end up in "/wnd" and "/usr/lib/font",\r
+respectively, when the system reaches its running state.  The intermediate\r
+directories "/uzi/bin/data" and "/uzi/bin/font" are only present on your PC,\r
+and are referenced from the "*.ucp" scripts.  Please feel free to add new\r
+folders under "/uzi/bin" if this helps keep things organised.\r
+\r
+3.  We now have a prototype "fstab.txt", which states where the filesystems\r
+should be mounted in the running system.  The file "/uzi/bin/fstab.txt" becomes\r
+the "/etc/fstab" of the running system.  The file "/uzi/bin/xfstab.txt" is the\r
+"/etc/fstab" of the flash card - this is not normally referenced, but would be\r
+significant if the system is booted directly from the card, ie. if the card is\r
+for some reason mounted as the root filesystem.\r
+\r
+4.  We now have a prototype "mtab.txt", which is really a dummy file since it\r
+gets deleted immediately on startup, but the mere existence of the file is\r
+needed to prevent an ugly error message on the initial boot.  The file\r
+"/uzi/bin/mtab.txt" becomes the "/etc/mtab" of the running system.  The file\r
+"/uzi/bin/xmtab.txt" is the "/etc/mtab" of the flash card - this is not\r
+normally referenced, but would be significant if the system is booted directly\r
+from the card, ie. if the card is for some reason mounted as the root\r
+filesystem.\r
+\r
+5.  The prototype group.txt has been edited by Nick.  The "users" group has\r
+been removed and we now have groups called "operator" and "manager" instead.\r
+The entries in the /etc/passwd file of the running system are graded in access\r
+level by specifying which "group" the user belongs to.  Application programs\r
+should inspect the group id (gid) to see which level of userinterface\r
+functionality should be revealed to the user.\r
+\r
+6.  The prototype passwd.txt has been edited by Nick.  The "90" user remains\r
+unchanged, so as not to break Joost's login code, but Nick has added several\r
+new users in the style we wish to adopt.  For the added users, the Unix user\r
+number is also the Hytech user number which gets entered as the first 2 digits\r
+of the PIN.  This should be less confusing, and it means the Unix username can\r
+now be set to arbitrary text.\r
+\r
+user=downingn pass=666 uid=60 gid=100 name=Downing, Nick\r
+user=morsinkj pass=777 uid=70 gid=100 name=Morsink, Joost\r
+user=buijsr pass=888 uid=80 gid=100 name=Buijs, Rob\r
+user=90 pass=999 uid=11 gid=101 (we'll delete this later on)\r
+\r
+7.  The format of /etc/inittab has been extended.  This is a simple list of\r
+programs which are executed by "init" before any spawning of ttys begins.  We\r
+can now specify arguments to the programs to be executed (though there is no\r
+shell-like substitution or quote expansion), and we can specify "silent"\r
+entries, which won't show any indication whether the command could be executed\r
+or not.  This is specifically for the new "runonce.sh" functionality, which\r
+will be described below.\r
+\r
+8.  The prototype inittab.txt has been edited by Nick.  This is the starting\r
+point of the new loading structure, so it should be understood thoroughly\r
+before examining the other scripts.  The file /uzi/bin/inittab.txt becomes the\r
+/etc/inittab of the running system, whereas the file /uzi/bin/xinittab.txt\r
+becomes the /etc/inittab of the flash card.  As with xfstab.txt, this file is\r
+only significant if the system is booted directly from the flash card (not the\r
+default way).\r
+\r
+The commands in the new /uzi/bin/inittab.txt are as follows:\r
+\r
+# Hytech initialisation table for running system\r
+\r
+@/etc/rc.d/rc.sysinit\r
+@/etc/rc.d/rc.runonce\r
+/bin/grlogin\r
+\r
+The first 2 lines are required for the loading system and should not be\r
+changed.  The @ indicates that the entries are silent, so if you want to\r
+disable the functionality of the "rc.runonce" or "rc.sysinit" scripts, just\r
+make sure those scripts are not loaded onto the flash card.  The last line\r
+refers to Joost's front-end login program, and can be changed to whatever is\r
+most appropriate for a particular customer.\r
+\r
+9.  The scripts "rc.sysinit" and "rc.runonce" have been added to the system by\r
+Nick.  These reside in a special folder called "/etc/rc.d" (runlevel control\r
+directory).  For better compatibility with DOS style text editors the master\r
+files are "/uzi/bin/sysinit.rc" and "/uzi/bin/runonce.rc" and the renaming\r
+takes place inside the scripts which build the flash card filesystem:\r
+"/uzi/bin/n.ucp" and "/uzi/bin/mkboot.ucp".  The scripts "rc.sysinit" and\r
+"rc.runonce" are copied into the RAM filesystem's "/etc/rc.d" folder during the\r
+initial boot.\r
+\r
+The commands in the new /uzi/bin/sysinit.rc are as follows:\r
+\r
+#!/bin/sh\r
+\r
+echo "/etc/rc.d/rc.sysinit"\r
+fsck -y /dev/hd0\r
+\r
+The "echo" command compensates for the fact that the script is invoked by a\r
+"silent" inittab entry.  The string is output on the console (SERIAL 1) so we\r
+can see which scripts are being executed.  The "fsck" command causes a startup\r
+filecheck on every bootstrap.\r
+\r
+The commands in the new /uzi/bin/runonce.rc are as follows:\r
+\r
+#!/bin/sh\r
+\r
+echo "/etc/rc.d/rc.runonce"\r
+rm -v /etc/rc.d/rc.runonce\r
+exec /usr/boot/runonce.sh\r
+\r
+As before, the "echo" command just allows us to see which script is being\r
+executed.  After this, we execute an "rm -v" command which deletes the\r
+executing script "rc.runonce" from the RAM filesystem.  Thus, on a subsequent\r
+bootstrap, the "silent" inittab entry referring to the non-existent file\r
+/etc/rc.d/rc.runonce will have no effect.  We then proceed to do any required\r
+first-time initialisation, for both operating system and application programs.\r
+\r
+This file, which gets deleted after the first bootstrap, has deliberately been\r
+kept as short as possible.  Thus, not so much information is lost when we\r
+delete the file.  The real initialisation sequence is executed from the flash\r
+card, by invoking a further script "/usr/boot/runonce.sh".  This is\r
+deliberately not copied to the RAM filesystem, for reasons which will be\r
+outlined further down.  The initialisation can of course be repeated at any\r
+time, by executing /usr/boot/runonce.sh from the console.  (eg. to re-download\r
+font files).\r
+\r
+10.  As outlined in the description for "rc.runonce", the real initialisation\r
+of the system is performed by a further script held on the flash card in /boot.\r
+The master file for this further script is "/uzi/bin/runonce.sh", which appears\r
+as "/usr/boot/runonce.sh" after the flash card has been mounted on /usr, as it\r
+usually is.  However, this script should not be modified, except by Nick, since\r
+a deliberate hook has been provided in the new "appinst.sh".\r
+\r
+The commands in the new /uzi/bin/runonce.sh are as follows:\r
+\r
+#!/bin/sh\r
+\r
+echo ""\r
+echo "Installing LCD character sets"\r
+echo ""\r
+\r
+cp -v /usr/lib/font/lcd0.cmd /dev/lcd0\r
+cp -v /usr/lib/font/lcd1.cmd /dev/lcd1\r
+\r
+umask 022\r
+mkdir /wnd\r
+exec /usr/boot/appinst.sh\r
+\r
+Notice that we are now trying to be more user-friendly by printing a few blank\r
+lines and a large banner saying what we are doing.  This script is executed on\r
+initial loading, and it takes a while to execute.  So we want to tell the user\r
+what we're doing.  This only appears on the console for now, but we could later\r
+extend it to display on the touchscreen also.\r
+\r
+This "runonce.sh" file is intended to contain operating system initialisation,\r
+which will probably be extended further by Nick (eg. initialising a hostname,\r
+setting up an IP address, downloading to the thermal printer and the Cognitive\r
+printer, etc).  For the moment, we just download the required command files to\r
+the touchscreen and customer display.  Once this is done, we proceed to the\r
+application-dependent initialisation by executing the new\r
+"/usr/boot/appinst.sh", formerly "/usr/wnd/w.sh".\r
+\r
+11.  In addition to the renaming of "w.sh" to "appinst.sh", Nick has edited the\r
+contents.  The new installation sequence for the application software is as\r
+follows:\r
+\r
+#!/bin/sh\r
+\r
+echo ""\r
+echo "Installing application program"\r
+echo ""\r
+\r
+rm -f /wnd/*.scr\r
+cp -v /usr/boot/inst/wnd/*.scr /wnd\r
+\r
+rm -f /bin/grlogin /bin/test\r
+cp -v /usr/boot/inst/bin/grlogin /usr/boot/inst/bin/test /bin\r
+align -v /bin/grlogin /bin/test\r
+\r
+echo ""\r
+echo "Finished installing application"\r
+echo ""\r
+\r
+Notice that we remove the "/wnd/*.scr" files before copying them afresh.  This\r
+might be important if files are renamed or deleted.  However we could probably\r
+optimise the install by copying only changed files.  Nick will look into this\r
+in due course.  For the moment, we also have to delete any aligned executables\r
+before copying the replacements in.  This is described in "030306SD test\r
+readme.txt".  Hence the "rm -f /bin/grlogin /bin/test" command.\r
+\r
+Please note that this relies on having a "/boot/inst/wnd" directory on the\r
+flash card which contains the "*.scr" files, and a separate "/boot/inst/bin"\r
+directory with the binaries.  Nick has added these new directories by editing\r
+the script "appinst.ucp", formerly "w.ucp".  Of course the layout and filenames\r
+are completely up to the developer, so the files "appinst.*" will probably need\r
+to be changed as the application development progresses.\r
+\r
+The function of the new "/boot/inst" folder (which appears as "/usr/boot/inst"\r
+after the flash card has been mounted on /usr as it normally is), is somewhat\r
+analogous to the already existing "/boot/skel" folder that contains the\r
+skeleton filesystem.  For early development we used "/wnd" and "/boot/skel/wnd"\r
+but this has been superseded by the new "/boot/inst".  Therefore we keep the\r
+operating system files separate from the application files.  This will become\r
+important if we want to distribute pre-built flash card images of the system.\r
+\r
+12.  Home directories are now created.  In the previous release, there was an\r
+oversight meaning that the sample home directory "/home/90" was not writeable\r
+by the user 90, and so could not be used as a home directory.  In this release,\r
+the "mkramfs.sh" script is not yet fixed, since it's not operational.  So if\r
+you are using home directories, you must boot via the filesystem self-extractor\r
+described in the next section.  Fortunately this is already selected for you.\r
+The home directories in the pre-prepared filesystem have the correct ownership,\r
+set by the new "chown" and "chgrp" commands in our "ucp" (unix copy) utility.\r
+\r
+DETAILS OF THE FILESYSTEM SELF-EXTRACTOR\r
+\r
+1.  The loading phase, from a completely cold boot, is normally controlled by\r
+the "/boot/mkramfs.sh" script, at least until the change described here.\r
+Because the loading from cold was taking an excessively long time (4 or 5\r
+minutes), we now initialise the filesystem from a pre-prepared image, rather\r
+than using scripts to copy the required files.  This means less redundant\r
+copying, and we get the benefit of data compression as well.\r
+\r
+2.  The "mkramfs.sh" script is no longer referenced, although we can revert to\r
+the earlier loading method at any time.  The same applies to the "/boot/skel"\r
+folder on the flash card.  The "mkramfs.sh" and "/boot/skel" files have been\r
+updated with this release, and will continue to be updated by Nick, although\r
+they're not directly used.  To select the earlier loading method, edit the file\r
+"/uzi/bin/n.bat" and refer to the "@rem" comments.\r
+\r
+3.  The new filesystem image is prepared with the usual "mkfs.exe" and\r
+"ucp.exe" programs.  For details please see the new "/uzi/bin/mkboot.bat" and\r
+"/uzi/bin/mkboot.ucp" scripts prepared by Nick.  After we have prepared the\r
+"uzidisk.dat" image for a filesystem of the correct size (768k), with the\r
+correct locking options, and the unallocated space not written, we then\r
+compress the disk image using "gzip" to produce the "/uzi/bin/uzboot.gz"\r
+compressed filesystem image.  This might eventually be distributed in pre-built\r
+form by Nick.\r
+\r
+4.  Since the bootstrap is controlled by a fixed size area (2 kbytes is\r
+reserved from the 768 kbyte disk for the "gboot.bin" boot loader), it was not\r
+possible to include unzipping code in the boot loader.  Instead, the\r
+"uzboot.gz" image is packaged into a self extracting executable, which looks\r
+like a kernel for boot loading purposes.  This packaging is done by\r
+concatenating the "uzboot.ldr" executable with the "uzboot.gz" data to produce\r
+"uzboot.bin".  For the source code of "uzboot.ldr", please see the files\r
+"/uzi/src/gboot/uz*.asm".\r
+\r
+5.  The boot loader did not need to be changed to accommodate the new self\r
+extractor.  Instead, the self extractor masquerades as a kernel, and then\r
+reboots once its job is done.  By the time of the reboot, the filesystem has\r
+been unzipped and we execute the (real) kernel found on the pre-prepared\r
+filesystem.  Because of the new requirement for two different kernels (one for\r
+the initial loading, and one for building into the pre-prepared filesystem), we\r
+now keep separate copies in the "/boot" and "/boot/skel/boot" folders of the\r
+flash card.\r
+\r
+6.  This means the "mkramfs.sh" script is simplified, since it now copies\r
+everything from "/boot/skel" instead of needing an extra step to copy the\r
+kernel from "/boot".  However, the process of building the flash card is\r
+slightly complicated because of the different kernels needed.  While the flash\r
+card is being built, we grab "uzboot.bin" (the initial kernel) and rename it to\r
+"kernel.bin" for the "/boot" folder of the flash card.  Then we grab\r
+"kernel.bin" (the real kernel) and place it in the "/boot/skel/boot" folder of\r
+the card.\r
+\r
+7.  The "/boot/skel/boot/kernel.bin" would be the kernel copied into "/boot" of\r
+the RAM filesystem during the initial copying of files controlled by\r
+"/boot/mkramfs.sh".  However, since we now have the kernel self-extractor, the\r
+"/boot/skel/boot/kernel.bin" file is not referenced, and instead we must ensure\r
+the correct (real) kernel has been preloaded into the "uzboot.bin" filesystem\r
+that was built with "/uzi/bin/mkboot.bat".  Fortunately, this doesn't need any\r
+renaming, but it means you must run "mkboot.bat" before running "n.bat".\r
+\r
+8.  Another tricky step is the generation of the "/boot/checksum" and\r
+"/boot/crc" files on the flash card.  These are needed for compatibility with\r
+the Hytech version 5.544+ EPROM.  We use the old "crc.com" program from a POS\r
+distribution for this purpose.  In this operating system release, the\r
+"/uzi/bin/n.bat" command is modified so that the checksum files are always\r
+regenerated when the flash card is rebuilt.  This should be more reliable, but\r
+you need to be aware that software releases in "/nlddl" would get rudely\r
+overwritten each time you run "/uzi/bin/n.bat".  This is a limitation of the\r
+"crc" program and will be fixed soon.\r
+\r
+9.  The "/boot/checksum" file controls loading by the Hytech version 5.544+\r
+EPROM.  It will read this file, from the hard coded location of "/boot", and\r
+then read any further files specified here.  For the current setup we request\r
+the EPROM to load "/boot/kernel.bin" and "/boot/boot.bin", these end up as\r
+"A:KERNEL.BIN" and "A:BOOT.BIN" after being downloaded by the EPROM code.  The\r
+"/boot/crc" file is a hardlinked copy of "/boot/checksum", and this is needed\r
+if we are forced to boot from an earlier version EPROM by downloading the\r
+version 5.544+ RAM operating system first.  This was needed by Nick in\r
+developing the new EPROM.\r
+\r
+10.  The filename "BOOT.BIN" is special and allows our custom boot loader to\r
+get control when the EPROM reboots after downloading the needed files from\r
+"/boot" on the flash card.  The filename "KERNEL.BIN" is arbitrary, although it\r
+must match the filename expected by the BOOT.BIN code.  This could be changed\r
+by editing "/uzi/src/gboot.asm".  However, I did not want to change the boot\r
+loader, so instead I specified that "uzboot.bin" be renamed to "kernel.bin".\r
+Later we could clean this up, but I wanted to keep supporting the old style\r
+bootstrap copying of files for the moment.  Hence, we are stuck with the name\r
+"KERNEL.BIN".\r
+\r
+11.  The maximum size of the "uzboot.bin" image is 256 kbytes.  This is because\r
+it gets loaded at physical addresses C:0000 thru F:FFFF during the initial\r
+boot.  The filesystem contained within "uzboot.bin" could potentially be up to\r
+512 kbytes in size, and this gets loaded at physical addresses 4:0000 thru\r
+B:FFFF.  We could also increase these limits by overwriting the compressed data\r
+during decompression, but I didn't think it was necessary for now.  The\r
+unzipper is based on the "ZIPFILE.INC" decompressor from the 5.529+ EPROM, with\r
+modifications to handle "gzip" rather than "pkzip" format.  Most "gzip" options\r
+are not supported, so we use the commandline "gzip --best < infile > outfile"\r
+to compress.\r
+\r
+12.  When the self-extractor has done its work and the filesystem has been\r
+unpacked to the terminal's RAM drive, we reboot and execute the\r
+"/etc/rc.d/rc.sysinit" and "/etc/rc.d/rc.runonce" scripts that have been\r
+preloaded onto the gzipped filesystem.  It is expected that system\r
+initialisation performed by "rc.sysinit" will be specific to the kernel\r
+unpacked.  However, the first-time initialisation triggered by "rc.runonce" is\r
+dependent on the application, and might be changed independent of any kernel\r
+changes.  So the first-time initialisation is really done by "/boot/runonce.sh"\r
+from the flash card, and it is expected that the "rc.runonce" script will not\r
+need to be changed.  Thus the "uzboot.bin" file can be distributed\r
+independently of the application specific files, and should be very stable.\r
+\r
+DETAILS OF SUPPORT FOR THE TOUCHSCREEN\r
+\r
+1.  The new character set compiler suite is built in "/uzi/src/mkfont" and the\r
+executables are placed in "/uzi/src/bin".  As mentioned in "030306SD test\r
+readme.txt", the folder "/uzi/src/bin" must be placed in your path for correct\r
+building of the software.  The new executables are "bmp2txt.exe", "txt2chs.exe"\r
+and "chs2cmd.exe".  We perform the conversion in 3 stages.  Intermediate files\r
+of "setxx.txt" and "setxx.chs" are built before creating the final "lcdx.cmd"\r
+file containing all character sets for a particular device.\r
+\r
+2.  The new fonts themselves are built in "/uzi/src/font" and the font files\r
+"lcdx.cmd" are placed in "/uzi/bin/font".  The fonts are easily editable by\r
+changing "setxx.bmp" with some kind of image editor, such as Photoshop or The\r
+Gimp.  After editing the source image files, just run "n.bat" in\r
+"/uzi/src/font" and then rebuild the flash card.  If the assignment of fonts to\r
+devices must be changed, you must edit "n.bat".  Look for the lines containing:\r
+\r
+chs2cmd set01.chs 1\r
+chs2cmd set02.chs 2\r
+chs2cmd set03.chs 3\r
+chs2cmd set04.chs 4\r
+chs2cmd set05.chs 5\r
+chs2cmd set06.chs 6\r
+\r
+copy/b set01.cmd+set02.cmd+set03.cmd+set04.cmd+set05.cmd+set06.cmd lcd0.cmd\r
+copy/b set01.cmd+set02.cmd+set03.cmd+set04.cmd+set05.cmd lcd1.cmd\r
+\r
+This indicates that the operator display (lcd0) is to receive fonts 1 thru 6.\r
+The customer display (lcd1) is to receive fonts 1 thru 5.  The difference is\r
+necessary because of the reduced RAM available on the customer display\r
+controller (32 kbytes rather than 128 kbytes).  At the moment, the font numbers\r
+are chosen so that they are identical on both devices.  However this may not\r
+always be possible in the future.  If some kind of font translation needs to be\r
+performed, the building sequence could be changed as follows:\r
+\r
+chs2cmd set01.chs 1\r
+chs2cmd set02.chs 2\r
+chs2cmd set03.chs 3\r
+chs2cmd set04.chs 4\r
+chs2cmd set05.chs 5\r
+chs2cmd set06.chs 6\r
+copy/b set01.cmd+set02.cmd+set03.cmd+set04.cmd+set05.cmd+set06.cmd lcd0.cmd\r
+\r
+chs2cmd set07.chs 1\r
+chs2cmd set08.chs 2\r
+chs2cmd set09.chs 3\r
+chs2cmd set10.chs 4\r
+chs2cmd set11.chs 5\r
+copy/b set01.cmd+set02.cmd+set03.cmd+set04.cmd+set05.cmd lcd1.cmd\r
+\r
+In this example, the operator display assignments are unchanged, but the 5\r
+fonts loaded to the customer display are completely new fonts designed for the\r
+purpose.  The bitmaps would be "set07.bmp" through "set11.bmp" but the fonts\r
+would be selected as fonts 1 thru 5.  We need this translation because the\r
+customer display is only capable of addressing 1 thru 5.\r
+\r
+3.  The purpose of the initial step, performed by "bmp2txt.exe", is to analyse\r
+the user's bitmap and try to locate the lines of text within the bitmap.  We\r
+then try to determine the baseline of the text using a weighted average of the\r
+pixel contents of each line.  Finally we break each line of text into\r
+individual characters, and spit them out individually in an intermediate text\r
+format.  Here is the lowercase "j" from "/uzi/src/font/set02.txt":\r
+\r
+at 103,67 size 4,10\r
+\r
+  ####\r
+\r
+######\r
+  ####\r
+  ####\r
+  ####\r
+__####__\r
+  ####\r
+####\r
+\r
+The header line, "at 103,67 size 4,10" tells us that the character was located\r
+at location 103,67 in the user's bitmap and the detected size of the character\r
+is 4 pixels wide by 10 pixels high.  The height of all characters in each line\r
+of text gathered from the bitmap should be the same, since they are determined\r
+as a group.  Similarly, the relative position of the baseline (shown above by\r
+the underline characters) should be the same for the entire line of text.\r
+\r
+If the user's bitmap is split into several lines of text, they might be output\r
+with different heights eg. all characters on the line containing the "$" sign\r
+might be output a few pixels taller, because of the ascender on the "$" coming\r
+up a bit higher than the other characters.  This doesn't matter though, because\r
+the subsequent step, performed by "txt2chs.exe", will trim all characters to\r
+size.  In this case the "j" would be trimmed to size 3,9.\r
+\r
+As you can see from the example above, the text files are output in "double\r
+width", so that 2 consecutive "#" signs indicate a single dark pixel.  Two\r
+consecutive spaces or underlines indicate a single light pixel.  This is simply\r
+to aid readability.  Also, a fixed amount of inter-character space is appended\r
+to each character on the right.  In this case it is one single pixel, as can be\r
+seen by the fact that the underline extends 2 columns to the right of the\r
+character.  The converter "bmp2txt.exe" always appends one single pixel of\r
+space.\r
+\r
+4.  The purpose of the subsequent step, performed by "txt2chs.exe", is to\r
+examine the individual character bitmaps found in the previous step, along with\r
+their size and baseline information, then trim each character to its exact\r
+extents.  In the process, "offset" X/Y values are generated, which tell the\r
+touchscreen or customer display exactly where the trimmed bitmap should be\r
+drawn, relative to a given cursor position.  Finally the bitmaps are padded to\r
+a multiple of 8 bits horizontally, and stored in a compact binary format.\r
+\r
+The binary format of the "*.chs" files is determined by the AVR code running in\r
+the touchscreen and customer display modules, and can't be easily changed.\r
+Briefly, the format consists of 16 dummy header bytes, followed by an index for\r
+256 characters, followed by a few miscellaneous byte-sized fields.  The index\r
+consists of 256 "word" sized pointers into the data (specified relative to the\r
+starting position of the index).  The touchscreen or customer display follows\r
+the index pointer corresponding to the ASCII value of a character to be drawn,\r
+to find the character data (X/Y size bytes followed by a raw bitmap array).\r
+\r
+In the miscellaneous data area immediately following the index, we have a few\r
+fields that can be determined automatically (for example the X and Y cell size\r
+when fixed spacing is being used), and a few fields which need to be specified\r
+via the command line to "bmp2chs.exe".  This includes inter-character and\r
+inter-line space, which can be set to arbitrary values.  For example in the\r
+subsequent processing of the "j" example we use the command:\r
+\r
+txt2chs set02.txt 1 3\r
+This means that the input file "/uzi/src/font/set02.txt" should be converted to\r
+the output file "/uzi/src/font/set02.chs" with an inter-character spacing of 1\r
+and an inter-line spacing of 3.  Given that a normal uppercase character in the\r
+set has height 8, we end up with a total cell height of 8 + 3 = 11 pixels, of\r
+which 3 will usually be blank separators.  The height of an uppercase character\r
+is determined by a clever "median" algorithm in which the heights of all\r
+characters are post processed after being trimmed to size.  In general we can\r
+determine the cell width and height automatically, but the inter-character and\r
+inter-line space need to be adjusted manually, to visually pleasing values.\r
+\r
+5.  If arbitrary images are to be added into the character sets, for example\r
+the customer's logo, or icons representing letters or parcels, they should be\r
+added by extending the font bitmap vertically and placing the image on a line\r
+by itself.  This way any awkwardly shaped images will not upset the normal\r
+process of determining the baselines and heights of text.  The system will\r
+still assign a baseline intelligently, by ignoring any narrow protrusions from\r
+the bottom of the image, but this will not upset the baselines of other\r
+characters.  In some cases we DO want this interaction, for example if you\r
+define a set of 4 "arrow" characters pointing in different directions, they\r
+should become a single "line" of text in the font.  Thus they are assigned a\r
+common baseline and will drawn aligned with each other.\r
+\r
+6.  Please note that Nick is working on a utility to extract the widths of\r
+characters from the "*.chs" files and generate a smaller binary format for use\r
+by Joost's GUI and other applications.  Sorry, this didn't make it into the\r
+current release.  I thought it was more important to document the changes to\r
+date and get them out the door.  The new width tables will be generated using a\r
+modification of the public domain "mkfont" utility downloaded by Nick.  Thus\r
+they will be compatible with text formatters like "groff", "ditroff" and "man".\r
+\r
diff --git a/silly.bat b/silly.bat
deleted file mode 100644 (file)
index 1b8cb90..0000000
--- a/silly.bat
+++ /dev/null
@@ -1,3 +0,0 @@
-del uzi.zip\r
-pkzipc -add=update -path=relative -recurse -excl=build -excl=build-b -excl=build-l -excl=*.s01 -excl=*.lst -excl=*.i86 -excl=*.rst -excl=*.obj -excl=*.pdb -excl=*.ilk silly *\r
-xcopy silly.zip \\darkstar\public\uzi.backup.zip\r
diff --git a/src/as-z80/as-z80.exe b/src/as-z80/as-z80.exe
deleted file mode 100644 (file)
index 632a28d..0000000
Binary files a/src/as-z80/as-z80.exe and /dev/null differ
diff --git a/src/as-z80/as-z80.map b/src/as-z80/as-z80.map
deleted file mode 100644 (file)
index fd58a66..0000000
+++ /dev/null
@@ -1,533 +0,0 @@
- as-z80\r
-\r
- Timestamp is 3e5dbb0b (Thu Feb 27 18:15:23 2003)\r
-\r
- Preferred load address is 00400000\r
-\r
- Start         Length     Name                   Class\r
- 0001:00000000 00011801H .text                   CODE\r
- 0002:00000000 000005d1H .rdata                  DATA\r
- 0002:000005d1 00000000H .edata                  DATA\r
- 0003:00000000 00000104H .CRT$XCA                DATA\r
- 0003:00000104 00000104H .CRT$XCZ                DATA\r
- 0003:00000208 00000104H .CRT$XIA                DATA\r
- 0003:0000030c 00000109H .CRT$XIC                DATA\r
- 0003:00000418 00000104H .CRT$XIZ                DATA\r
- 0003:0000051c 00000104H .CRT$XPA                DATA\r
- 0003:00000620 00000104H .CRT$XPX                DATA\r
- 0003:00000724 00000104H .CRT$XPZ                DATA\r
- 0003:00000828 00000104H .CRT$XTA                DATA\r
- 0003:0000092c 00000104H .CRT$XTZ                DATA\r
- 0003:00000a30 00002d2aH .data                   DATA\r
- 0003:0000375c 00003568H .bss                    DATA\r
- 0004:00000000 00000014H .idata$2                DATA\r
- 0004:00000014 00000014H .idata$3                DATA\r
- 0004:00000028 000000fcH .idata$4                DATA\r
- 0004:00000124 000000fcH .idata$5                DATA\r
- 0004:00000220 00000444H .idata$6                DATA\r
-\r
-  Address         Publics by Value              Rva+Base     Lib:Object\r
-\r
- 0001:000003d0       _expr                      004013d0 f   asexpr.obj\r
- 0001:0000085b       _getop                     0040185b f   asexpr.obj\r
- 0001:00000892       _getnop                    00401892 f   asexpr.obj\r
- 0001:000008e6       _getop_binary              004018e6 f   asexpr.obj\r
- 0001:00000965       _getop_unary               00401965 f   asexpr.obj\r
- 0001:000009ff       _getop_srch                004019ff f   asexpr.obj\r
- 0001:00000aa3       _absexpr                   00401aa3 f   asexpr.obj\r
- 0001:00000ad6       _term                      00401ad6 f   asexpr.obj\r
- 0001:000015cc       _digit                     004025cc f   asexpr.obj\r
- 0001:00001681       _abscheck                  00402681 f   asexpr.obj\r
- 0001:000016b0       _is_abs                    004026b0 f   asexpr.obj\r
- 0001:000016d2       _oprio                     004026d2 f   asexpr.obj\r
- 0001:0000173f       _clrexpr                   0040273f f   asexpr.obj\r
- 0001:0000176c       _exprmasks                 0040276c f   asexpr.obj\r
- 0001:00001d10       _getid                     00402d10 f   aslex.obj\r
- 0001:00001dcd       _getst                     00402dcd f   aslex.obj\r
- 0001:00001e55       _getnb                     00402e55 f   aslex.obj\r
- 0001:00001e76       _get                       00402e76 f   aslex.obj\r
- 0001:00001ea4       _unget                     00402ea4 f   aslex.obj\r
- 0001:00001ec8       _getmap                    00402ec8 f   aslex.obj\r
- 0001:00002015       _getline                   00403015 f   aslex.obj\r
- 0001:000021f4       _more                      004031f4 f   aslex.obj\r
- 0001:00002231       _endline                   00403231 f   aslex.obj\r
- 0001:00002370       _list                      00403370 f   aslist.obj\r
- 0001:00002c6f       _list1                     00403c6f f   aslist.obj\r
- 0001:00002e99       _list2                     00403e99 f   aslist.obj\r
- 0001:00002fb6       _slew                      00403fb6 f   aslist.obj\r
- 0001:00003096       _lstsym                    00404096 f   aslist.obj\r
- 0001:00003f70       _main                      00404f70 f   asmain.obj\r
- 0001:00004548       _asexit                    00405548 f   asmain.obj\r
- 0001:00004614       _asmbl                     00405614 f   asmain.obj\r
- 0001:00005874       _afile                     00406874 f   asmain.obj\r
- 0001:0000591a       _afilex                    0040691a f   asmain.obj\r
- 0001:00005a81       _fndidx                    00406a81 f   asmain.obj\r
- 0001:00005af7       _newdot                    00406af7 f   asmain.obj\r
- 0001:00005b43       _phase                     00406b43 f   asmain.obj\r
- 0001:00005b68       _usage                     00406b68 f   asmain.obj\r
- 0001:000062d0       _outab                     004072d0 f   asout.obj\r
- 0001:000062e3       _outaw                     004072e3 f   asout.obj\r
- 0001:000062f6       _outa3b                    004072f6 f   asout.obj\r
- 0001:00006309       _outa4b                    00407309 f   asout.obj\r
- 0001:0000631c       _outaxb                    0040731c f   asout.obj\r
- 0001:00006372       _outatxb                   00407372 f   asout.obj\r
- 0001:000064d1       _outrb                     004074d1 f   asout.obj\r
- 0001:000064e8       _outrw                     004074e8 f   asout.obj\r
- 0001:000064ff       _outr3b                    004074ff f   asout.obj\r
- 0001:00006516       _outr4b                    00407516 f   asout.obj\r
- 0001:0000652d       _outrxb                    0040752d f   asout.obj\r
- 0001:0000674b       _outdp                     0040774b f   asout.obj\r
- 0001:00006853       _outall                    00407853 f   asout.obj\r
- 0001:00006877       _outdot                    00407877 f   asout.obj\r
- 0001:0000692c       _outchk                    0040792c f   asout.obj\r
- 0001:000069ce       _outbuf                    004079ce f   asout.obj\r
- 0001:00006a7d       _outgsd                    00407a7d f   asout.obj\r
- 0001:00006d4a       _outarea                   00407d4a f   asout.obj\r
- 0001:00006e0a       _outsym                    00407e0a f   asout.obj\r
- 0001:00006f43       _out                       00407f43 f   asout.obj\r
- 0001:00007013       _out_lb                    00408013 f   asout.obj\r
- 0001:00007056       _out_lw                    00408056 f   asout.obj\r
- 0001:0000706d       _out_l3b                   0040806d f   asout.obj\r
- 0001:00007084       _out_l4b                   00408084 f   asout.obj\r
- 0001:0000709b       _out_lxb                   0040809b f   asout.obj\r
- 0001:00007267       _out_rw                    00408267 f   asout.obj\r
- 0001:00007303       _out_txb                   00408303 f   asout.obj\r
- 0001:00007462       _lobyte                    00408462 f   asout.obj\r
- 0001:0000746f       _hibyte                    0040846f f   asout.obj\r
- 0001:0000747f       _thrdbyte                  0040847f f   asout.obj\r
- 0001:0000748f       _frthbyte                  0040848f f   asout.obj\r
- 0001:0000749f       _outr11                    0040849f f   asout.obj\r
- 0001:0000760f       _outr19                    0040860f f   asout.obj\r
- 0001:00007cb0       _err                       00408cb0 f   assubr.obj\r
- 0001:00007d25       _diag                      00408d25 f   assubr.obj\r
- 0001:00007e7f       _rerr                      00408e7f f   assubr.obj\r
- 0001:00007e8e       _aerr                      00408e8e f   assubr.obj\r
- 0001:00007e9d       _qerr                      00408e9d f   assubr.obj\r
- 0001:00007eac       _geterr                    00408eac f   assubr.obj\r
- 0001:00007fb0       _syminit                   00408fb0 f   assym.obj\r
- 0001:000080b5       _alookup                   004090b5 f   assym.obj\r
- 0001:000080f5       _mlookup                   004090f5 f   assym.obj\r
- 0001:0000814d       _slookup                   0040914d f   assym.obj\r
- 0001:000081ae       _lookup                    004091ae f   assym.obj\r
- 0001:000082a1       _symglob                   004092a1 f   assym.obj\r
- 0001:000082fb       _allglob                   004092fb f   assym.obj\r
- 0001:0000835f       _symeq                     0040935f f   assym.obj\r
- 0001:00008404       _hash                      00409404 f   assym.obj\r
- 0001:00008465       _strsto                    00409465 f   assym.obj\r
- 0001:000084e4       _new                       004094e4 f   assym.obj\r
- 0001:00008680       _addr                      00409680 f   z80adr.obj\r
- 0001:00008949       _admode                    00409949 f   z80adr.obj\r
- 0001:000089b8       _srch                      004099b8 f   z80adr.obj\r
- 0001:00008a7d       _any                       00409a7d f   z80adr.obj\r
- 0001:00008bc0       _machine                   00409bc0 f   z80mch.obj\r
- 0001:00009c59       _genop                     0040ac59 f   z80mch.obj\r
- 0001:00009d73       _gixiy                     0040ad73 f   z80mch.obj\r
- 0001:00009de9       _mchpcr                    0040ade9 f   z80mch.obj\r
- 0001:00009e2b       _comma                     0040ae2b f   z80mch.obj\r
- 0001:00009e44       _minit                     0040ae44 f   z80mch.obj\r
- 0001:0000a230       _strlen                    0040b230 f   LIBC:strlen.obj\r
- 0001:0000a2b0       _strcpy                    0040b2b0 f   LIBC:strcat.obj\r
- 0001:0000a2c0       _strcat                    0040b2c0 f   LIBC:strcat.obj\r
- 0001:0000a3a0       _fclose                    0040b3a0 f   LIBC:fclose.obj\r
- 0001:0000a3f6       _fgets                     0040b3f6 f   LIBC:fgets.obj\r
- 0001:0000a44d       __flsbuf                   0040b44d f   LIBC:_flsbuf.obj\r
- 0001:0000a562       _fprintf                   0040b562 f   LIBC:fprintf.obj\r
- 0001:0000a5a0       _strcmp                    0040b5a0 f   LIBC:strcmp.obj\r
- 0001:0000a624       _malloc                    0040b624 f   LIBC:malloc.obj\r
- 0001:0000a636       __nh_malloc                0040b636 f   LIBC:malloc.obj\r
- 0001:0000a662       __heap_alloc               0040b662 f   LIBC:malloc.obj\r
- 0001:0000a698       _rewind                    0040b698 f   LIBC:rewind.obj\r
- 0001:0000a6ec       ___initstdio               0040b6ec f   LIBC:_file.obj\r
- 0001:0000a791       ___endstdio                0040b791 f   LIBC:_file.obj\r
- 0001:0000a7a8       __setjmp3                  0040b7a8 f   LIBC:setjmp3.obj\r
- 0001:0000a823       __cinit                    0040b823 f   LIBC:crt0dat.obj\r
- 0001:0000a850       _exit                      0040b850 f   LIBC:crt0dat.obj\r
- 0001:0000a861       __exit                     0040b861 f   LIBC:crt0dat.obj\r
- 0001:0000a872       __cexit                    0040b872 f   LIBC:crt0dat.obj\r
- 0001:0000a881       __c_exit                   0040b881 f   LIBC:crt0dat.obj\r
- 0001:0000a943       __fsopen                   0040b943 f   LIBC:fopen.obj\r
- 0001:0000a963       _fopen                     0040b963 f   LIBC:fopen.obj\r
- 0001:0000a980       _strncpy                   0040b980 f   LIBC:strncpy.obj\r
- 0001:0000aa80       _strrchr                   0040ba80 f   LIBC:strrchr.obj\r
- 0001:0000aaa8       _longjmp                   0040baa8 f   LIBC:longjmp.obj\r
- 0001:0000ab21       _sprintf                   0040bb21 f   LIBC:sprintf.obj\r
- 0001:0000ab73       _mainCRTStartup            0040bb73 f   LIBC:crt0.obj\r
- 0001:0000ac52       __amsg_exit                0040bc52 f   LIBC:crt0.obj\r
- 0001:0000ac9b       _free                      0040bc9b f   LIBC:free.obj\r
- 0001:0000acca       __close                    0040bcca f   LIBC:close.obj\r
- 0001:0000ad7d       __freebuf                  0040bd7d f   LIBC:_freebuf.obj\r
- 0001:0000ada8       _fflush                    0040bda8 f   LIBC:fflush.obj\r
- 0001:0000ade3       __flush                    0040bde3 f   LIBC:fflush.obj\r
- 0001:0000ae3f       __flushall                 0040be3f f   LIBC:fflush.obj\r
- 0001:0000aeb5       __filbuf                   0040beb5 f   LIBC:_filbuf.obj\r
- 0001:0000af8e       __lseek                    0040bf8e f   LIBC:lseek.obj\r
- 0001:0000b028       __ioinit                   0040c028 f   LIBC:ioinit.obj\r
- 0001:0000b1d3       __ioterm                   0040c1d3 f   LIBC:ioinit.obj\r
- 0001:0000b1f6       __write                    0040c1f6 f   LIBC:write.obj\r
- 0001:0000b3a3       __getbuf                   0040c3a3 f   LIBC:_getbuf.obj\r
- 0001:0000b3e7       __isatty                   0040c3e7 f   LIBC:isatty.obj\r
- 0001:0000b40d       __stbuf                    0040c40d f   LIBC:_sftbuf.obj\r
- 0001:0000b49a       __ftbuf                    0040c49a f   LIBC:_sftbuf.obj\r
- 0001:0000b4d7       __output                   0040c4d7 f   LIBC:output.obj\r
- 0001:0000bce1       ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z 0040cce1 f   LIBC:handler.obj\r
- 0001:0000bcf1       ?_query_new_handler@@YAP6AHI@ZXZ 0040ccf1 f   LIBC:handler.obj\r
- 0001:0000bcf7       __callnewh                 0040ccf7 f   LIBC:handler.obj\r
- 0001:0000bd12       __heap_init                0040cd12 f   LIBC:heapinit.obj\r
- 0001:0000bd4e       __heap_term                0040cd4e f   LIBC:heapinit.obj\r
- 0001:0000bdc3       __get_sbh_threshold        0040cdc3 f   LIBC:sbheap.obj\r
- 0001:0000bdc9       __set_sbh_threshold        0040cdc9 f   LIBC:sbheap.obj\r
- 0001:0000bde0       ___sbh_heap_init           0040cde0 f   LIBC:sbheap.obj\r
- 0001:0000be1e       ___sbh_find_block          0040ce1e f   LIBC:sbheap.obj\r
- 0001:0000be49       ___sbh_free_block          0040ce49 f   LIBC:sbheap.obj\r
- 0001:0000c174       ___sbh_alloc_block         0040d174 f   LIBC:sbheap.obj\r
- 0001:0000c47d       ___sbh_alloc_new_region    0040d47d f   LIBC:sbheap.obj\r
- 0001:0000c52e       ___sbh_alloc_new_group     0040d52e f   LIBC:sbheap.obj\r
- 0001:0000c629       ___sbh_resize_block        0040d629 f   LIBC:sbheap.obj\r
- 0001:0000c91f       ___sbh_heapmin             0040d91f f   LIBC:sbheap.obj\r
- 0001:0000c9f0       ___sbh_heap_check          0040d9f0 f   LIBC:sbheap.obj\r
- 0001:0000cd1f       _calloc                    0040dd1f f   LIBC:calloc.obj\r
- 0001:0000cd9c       __fcloseall                0040dd9c f   LIBC:closeall.obj\r
- 0001:0000cdf4       __global_unwind2           0040ddf4 f   LIBC:exsup.obj\r
- 0001:0000ce36       __local_unwind2            0040de36 f   LIBC:exsup.obj\r
- 0001:0000ce8e       __NLG_Return2              0040de8e f   LIBC:exsup.obj\r
- 0001:0000ce9e       __abnormal_termination     0040de9e f   LIBC:exsup.obj\r
- 0001:0000cec1       __NLG_Notify1              0040dec1 f   LIBC:exsup.obj\r
- 0001:0000ceca       __NLG_Notify               0040deca f   LIBC:exsup.obj\r
- 0001:0000cedd       __NLG_Dispatch             0040dedd f   LIBC:exsup.obj\r
- 0001:0000cee2       __openfile                 0040dee2 f   LIBC:_open.obj\r
- 0001:0000d052       __getstream                0040e052 f   LIBC:stream.obj\r
- 0001:0000d0ca       __rt_probe_read4@4         0040e0ca f   LIBC:sehsupp.obj\r
- 0001:0000d12f       __XcptFilter               0040e12f f   LIBC:winxfltr.obj\r
- 0001:0000d2b3       __setenvp                  0040e2b3 f   LIBC:stdenvp.obj\r
- 0001:0000d36c       __setargv                  0040e36c f   LIBC:stdargv.obj\r
- 0001:0000d5b9       ___crtGetEnvironmentStringsA 0040e5b9 f   LIBC:a_env.obj\r
- 0001:0000d6f4       __except_handler3          0040e6f4 f   LIBC:exsup3.obj\r
- 0001:0000d7b1       __seh_longjmp_unwind@4     0040e7b1 f   LIBC:exsup3.obj\r
- 0001:0000d7cc       __FF_MSGBANNER             0040e7cc f   LIBC:crt0msg.obj\r
- 0001:0000d805       __NMSG_WRITE               0040e805 f   LIBC:crt0msg.obj\r
- 0001:0000d958       __GET_RTERRMSG             0040e958 f   LIBC:crt0msg.obj\r
- 0001:0000d989       __dosmaperr                0040e989 f   LIBC:dosmap.obj\r
- 0001:0000d9f0       __alloc_osfhnd             0040e9f0 f   LIBC:osfinfo.obj\r
- 0001:0000da85       __set_osfhnd               0040ea85 f   LIBC:osfinfo.obj\r
- 0001:0000dafc       __free_osfhnd              0040eafc f   LIBC:osfinfo.obj\r
- 0001:0000db76       __get_osfhandle            0040eb76 f   LIBC:osfinfo.obj\r
- 0001:0000dbb3       __open_osfhandle           0040ebb3 f   LIBC:osfinfo.obj\r
- 0001:0000dc50       __commit                   0040ec50 f   LIBC:commit.obj\r
- 0001:0000dca7       __read                     0040eca7 f   LIBC:read.obj\r
- 0001:0000de9d       _wctomb                    0040ee9d f   LIBC:wctomb.obj\r
- 0001:0000df10       __aulldiv                  0040ef10 f   LIBC:ulldiv.obj\r
- 0001:0000df80       __aullrem                  0040ef80 f   LIBC:ullrem.obj\r
- 0001:0000e000       _memmove                   0040f000 f   LIBC:memmove.obj\r
- 0001:0000e340       _memset                    0040f340 f   LIBC:memset.obj\r
- 0001:0000e398       __open                     0040f398 f   LIBC:open.obj\r
- 0001:0000e3af       __sopen                    0040f3af f   LIBC:open.obj\r
- 0001:0000e668       __setmbcp                  0040f668 f   LIBC:mbctype.obj\r
- 0001:0000ea2c       __getmbcp                  0040fa2c f   LIBC:mbctype.obj\r
- 0001:0000ea3c       ___initmbctable            0040fa3c f   LIBC:mbctype.obj\r
- 0001:0000ea60       _memcpy                    0040fa60 f   LIBC:memcpy.obj\r
- 0001:0000ed95       ___crtMessageBoxA          0040fd95 f   LIBC:crtmbox.obj\r
- 0001:0000ee1e       __fptrap                   0040fe1e f   LIBC:crt0fp.obj\r
- 0001:0000ee27       __chsize                   0040fe27 f   LIBC:chsize.obj\r
- 0001:0000ef6d       ___crtLCMapStringA         0040ff6d f   LIBC:a_map.obj\r
- 0001:0000f1bc       ___crtGetStringTypeA       004101bc f   LIBC:a_str.obj\r
- 0001:0000f305       __setmode                  00410305 f   LIBC:setmode.obj\r
- 0001:0000f380       __alloca_probe             00410380 f   LIBC:chkstk.obj\r
- 0001:0000f380       __chkstk                   00410380 f   LIBC:chkstk.obj\r
- 0001:0000f3b0       _HeapAlloc@12              004103b0 f   kernel32:KERNEL32.dll\r
- 0001:0000f3b6       _ExitProcess@4             004103b6 f   kernel32:KERNEL32.dll\r
- 0001:0000f3bc       _TerminateProcess@8        004103bc f   kernel32:KERNEL32.dll\r
- 0001:0000f3c2       _GetCurrentProcess@0       004103c2 f   kernel32:KERNEL32.dll\r
- 0001:0000f3c8       _GetCommandLineA@0         004103c8 f   kernel32:KERNEL32.dll\r
- 0001:0000f3ce       _GetVersion@0              004103ce f   kernel32:KERNEL32.dll\r
- 0001:0000f3d4       _HeapFree@12               004103d4 f   kernel32:KERNEL32.dll\r
- 0001:0000f3da       _GetLastError@0            004103da f   kernel32:KERNEL32.dll\r
- 0001:0000f3e0       _CloseHandle@4             004103e0 f   kernel32:KERNEL32.dll\r
- 0001:0000f3e6       _SetFilePointer@16         004103e6 f   kernel32:KERNEL32.dll\r
- 0001:0000f3ec       _SetHandleCount@4          004103ec f   kernel32:KERNEL32.dll\r
- 0001:0000f3f2       _GetStdHandle@4            004103f2 f   kernel32:KERNEL32.dll\r
- 0001:0000f3f8       _GetFileType@4             004103f8 f   kernel32:KERNEL32.dll\r
- 0001:0000f3fe       _GetStartupInfoA@4         004103fe f   kernel32:KERNEL32.dll\r
- 0001:0000f404       _WriteFile@20              00410404 f   kernel32:KERNEL32.dll\r
- 0001:0000f40a       _HeapDestroy@4             0041040a f   kernel32:KERNEL32.dll\r
- 0001:0000f410       _HeapCreate@12             00410410 f   kernel32:KERNEL32.dll\r
- 0001:0000f416       _VirtualFree@12            00410416 f   kernel32:KERNEL32.dll\r
- 0001:0000f41c       _VirtualAlloc@16           0041041c f   kernel32:KERNEL32.dll\r
- 0001:0000f422       _HeapReAlloc@16            00410422 f   kernel32:KERNEL32.dll\r
- 0001:0000f428       _IsBadWritePtr@8           00410428 f   kernel32:KERNEL32.dll\r
- 0001:0000f42e       _RtlUnwind@16              0041042e f   kernel32:KERNEL32.dll\r
- 0001:0000f434       _UnhandledExceptionFilter@4 00410434 f   kernel32:KERNEL32.dll\r
- 0001:0000f43a       _GetModuleFileNameA@12     0041043a f   kernel32:KERNEL32.dll\r
- 0001:0000f440       _FreeEnvironmentStringsA@4 00410440 f   kernel32:KERNEL32.dll\r
- 0001:0000f446       _FreeEnvironmentStringsW@4 00410446 f   kernel32:KERNEL32.dll\r
- 0001:0000f44c       _WideCharToMultiByte@32    0041044c f   kernel32:KERNEL32.dll\r
- 0001:0000f452       _GetEnvironmentStrings@0   00410452 f   kernel32:KERNEL32.dll\r
- 0001:0000f458       _GetEnvironmentStringsW@0  00410458 f   kernel32:KERNEL32.dll\r
- 0001:0000f45e       _SetStdHandle@8            0041045e f   kernel32:KERNEL32.dll\r
- 0001:0000f464       _FlushFileBuffers@4        00410464 f   kernel32:KERNEL32.dll\r
- 0001:0000f46a       _ReadFile@20               0041046a f   kernel32:KERNEL32.dll\r
- 0001:0000f470       _CreateFileA@28            00410470 f   kernel32:KERNEL32.dll\r
- 0001:0000f476       _GetCPInfo@8               00410476 f   kernel32:KERNEL32.dll\r
- 0001:0000f47c       _GetACP@0                  0041047c f   kernel32:KERNEL32.dll\r
- 0001:0000f482       _GetOEMCP@0                00410482 f   kernel32:KERNEL32.dll\r
- 0001:0000f488       _GetProcAddress@8          00410488 f   kernel32:KERNEL32.dll\r
- 0001:0000f48e       _LoadLibraryA@4            0041048e f   kernel32:KERNEL32.dll\r
- 0001:0000f494       _SetEndOfFile@4            00410494 f   kernel32:KERNEL32.dll\r
- 0001:0000f49a       _MultiByteToWideChar@24    0041049a f   kernel32:KERNEL32.dll\r
- 0001:0000f4a0       _LCMapStringA@24           004104a0 f   kernel32:KERNEL32.dll\r
- 0001:0000f4a6       _LCMapStringW@24           004104a6 f   kernel32:KERNEL32.dll\r
- 0001:0000f4ac       _GetStringTypeA@20         004104ac f   kernel32:KERNEL32.dll\r
- 0001:0000f4b2       _GetStringTypeW@16         004104b2 f   kernel32:KERNEL32.dll\r
- 0002:0000002c       ___lookuptable             0041302c     LIBC:output.obj\r
- 0002:00000088       ??_C@_1O@POHA@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 00413088     LIBC:output.obj\r
- 0002:00000098       ??_C@_06ONKE@?$CInull?$CJ?$AA@ 00413098     LIBC:output.obj\r
- 0002:000000ac       ??_C@_0P@GGKG@runtime?5error?5?$AA@ 004130ac     LIBC:crt0msg.obj\r
- 0002:000000bc       ??_C@_02PIMC@?$AN?6?$AA@   004130bc     LIBC:crt0msg.obj\r
- 0002:000000c0       ??_C@_0O@DELO@TLOSS?5error?$AN?6?$AA@ 004130c0     LIBC:crt0msg.obj\r
- 0002:000000d0       ??_C@_0N@OMLL@SING?5error?$AN?6?$AA@ 004130d0     LIBC:crt0msg.obj\r
- 0002:000000e0       ??_C@_0P@OJAK@DOMAIN?5error?$AN?6?$AA@ 004130e0     LIBC:crt0msg.obj\r
- 0002:000000f0       ??_C@_0CF@EANP@R6028?$AN?6?9?5unable?5to?5initialize?5he@ 004130f0     LIBC:crt0msg.obj\r
- 0002:00000118       ??_C@_0DF@ECGN@R6027?$AN?6?9?5not?5enough?5space?5for?5lo@ 00413118     LIBC:crt0msg.obj\r
- 0002:00000150       ??_C@_0DF@FKAC@R6026?$AN?6?9?5not?5enough?5space?5for?5st@ 00413150     LIBC:crt0msg.obj\r
- 0002:00000188       ??_C@_0CG@DPMN@R6025?$AN?6?9?5pure?5virtual?5function?5c@ 00413188     LIBC:crt0msg.obj\r
- 0002:000001b0       ??_C@_0DF@CKIP@R6024?$AN?6?9?5not?5enough?5space?5for?5_o@ 004131b0     LIBC:crt0msg.obj\r
- 0002:000001e8       ??_C@_0CJ@GGOE@R6019?$AN?6?9?5unable?5to?5open?5console?5@ 004131e8     LIBC:crt0msg.obj\r
- 0002:00000214       ??_C@_0CB@LBOB@R6018?$AN?6?9?5unexpected?5heap?5error?$AN?6@ 00413214     LIBC:crt0msg.obj\r
- 0002:00000238       ??_C@_0CN@FPEG@R6017?$AN?6?9?5unexpected?5multithread?5@ 00413238     LIBC:crt0msg.obj\r
- 0002:00000268       ??_C@_0CM@OBIC@R6016?$AN?6?9?5not?5enough?5space?5for?5th@ 00413268     LIBC:crt0msg.obj\r
- 0002:00000294       ??_C@_0CB@HPAL@?$AN?6abnormal?5program?5termination?$AN?6@ 00413294     LIBC:crt0msg.obj\r
- 0002:000002b8       ??_C@_0CM@JOOB@R6009?$AN?6?9?5not?5enough?5space?5for?5en@ 004132b8     LIBC:crt0msg.obj\r
- 0002:000002e4       ??_C@_0CK@OIBL@R6008?$AN?6?9?5not?5enough?5space?5for?5ar@ 004132e4     LIBC:crt0msg.obj\r
- 0002:00000310       ??_C@_0CF@LKPB@R6002?$AN?6?9?5floating?5point?5not?5load@ 00413310     LIBC:crt0msg.obj\r
- 0002:00000338       ??_C@_0CF@JPDF@Microsoft?5Visual?5C?$CL?$CL?5Runtime?5Lib@ 00413338     LIBC:crt0msg.obj\r
- 0002:00000360       ??_C@_02JJJH@?6?6?$AA@     00413360     LIBC:crt0msg.obj\r
- 0002:00000364       ??_C@_0BK@DEOK@Runtime?5Error?$CB?6?6Program?3?5?$AA@ 00413364     LIBC:crt0msg.obj\r
- 0002:00000380       ??_C@_03NAME@?4?4?4?$AA@   00413380     LIBC:crt0msg.obj\r
- 0002:00000384       ??_C@_0BH@NNCD@?$DMprogram?5name?5unknown?$DO?$AA@ 00413384     LIBC:crt0msg.obj\r
- 0002:0000039c       ??_C@_0BD@NJFP@GetLastActivePopup?$AA@ 0041339c     LIBC:crtmbox.obj\r
- 0002:000003b0       ??_C@_0BA@GILI@GetActiveWindow?$AA@ 004133b0     LIBC:crtmbox.obj\r
- 0002:000003c0       ??_C@_0M@PKCK@MessageBoxA?$AA@ 004133c0     LIBC:crtmbox.obj\r
- 0002:000003cc       ??_C@_0L@HKL@user32?4dll?$AA@ 004133cc     LIBC:crtmbox.obj\r
- 0002:000003d8       ??_C@_01A@?$AA?$AA@        004133d8     LIBC:a_map.obj\r
- 0002:000003dc       ??_C@_13A@?$AA?$AA?$AA?$AA@ 004133dc     LIBC:a_map.obj\r
- 0003:00000000       ___xc_a                    00414000     LIBC:crt0init.obj\r
- 0003:00000104       ___xc_z                    00414104     LIBC:crt0init.obj\r
- 0003:00000208       ___xi_a                    00414208     LIBC:crt0init.obj\r
- 0003:00000418       ___xi_z                    00414418     LIBC:crt0init.obj\r
- 0003:0000051c       ___xp_a                    0041451c     LIBC:crt0init.obj\r
- 0003:00000724       ___xp_z                    00414724     LIBC:crt0init.obj\r
- 0003:00000828       ___xt_a                    00414828     LIBC:crt0init.obj\r
- 0003:0000092c       ___xt_z                    0041492c     LIBC:crt0init.obj\r
- 0003:00000a30       _symtbl                    00414a30     asdata.obj\r
- 0003:00000a40       _aretbl                    00414a40     asdata.obj\r
- 0003:00000a50       _sym                       00414a50     asdata.obj\r
- 0003:00000a88       _area                      00414a88     asdata.obj\r
- 0003:00000aa0       _ctype                     00414aa0     asdata.obj\r
- 0003:00000b20       _ccase                     00414b20     asdata.obj\r
- 0003:00001214       _usetxt                    00415214     asmain.obj\r
- 0003:00001614       _txtp                      00415614     asout.obj\r
- 0003:00001618       _relp                      00415618     asout.obj\r
- 0003:000017c4       _errors                    004157c4     assubr.obj\r
- 0003:00001b18       _R8                        00415b18     z80adr.obj\r
- 0003:00001b58       _R8X                       00415b58     z80adr.obj\r
- 0003:00001b70       _R16                       00415b70     z80adr.obj\r
- 0003:00001ba8       _R16X                      00415ba8     z80adr.obj\r
- 0003:00001bc0       _CND                       00415bc0     z80adr.obj\r
- 0003:00001c44       _cpu                       00415c44     z80ext.obj\r
- 0003:00001c48       _dsft                      00415c48     z80ext.obj\r
- 0003:00001c74       _imtab                     00415c74     z80mch.obj\r
- 0003:00001c78       _mne                       00415c78     z80pst.obj\r
- 0003:00002c30       __iob                      00416c30     LIBC:_file.obj\r
- 0003:00002eb0       __aexit_rtn                00416eb0     LIBC:crt0.obj\r
- 0003:00002eb4       ___app_type                00416eb4     LIBC:crt0.obj\r
- 0003:00002eb8       ___badioinfo               00416eb8     LIBC:ioinit.obj\r
- 0003:00002ec0       ___nullstring              00416ec0     LIBC:output.obj\r
- 0003:00002ec4       ___wnullstring             00416ec4     LIBC:output.obj\r
- 0003:00002ec8       __amblksiz                 00416ec8     LIBC:heapinit.obj\r
- 0003:00002ecc       ___sbh_threshold           00416ecc     LIBC:sbheap.obj\r
- 0003:00002ed0       __NLG_Destination          00416ed0     LIBC:exsup.obj\r
- 0003:00002ee0       __XcptActTab               00416ee0     LIBC:winxfltr.obj\r
- 0003:00002f58       __First_FPE_Indx           00416f58     LIBC:winxfltr.obj\r
- 0003:00002f5c       __Num_FPE                  00416f5c     LIBC:winxfltr.obj\r
- 0003:00002f60       __XcptActTabCount          00416f60     LIBC:winxfltr.obj\r
- 0003:00002f64       __fpecode                  00416f64     LIBC:winxfltr.obj\r
- 0003:00003160       __cfltcvt_tab              00417160     LIBC:cmiscdat.obj\r
- 0003:00003178       __pctype                   00417178     LIBC:ctype.obj\r
- 0003:0000317c       __pwctype                  0041717c     LIBC:ctype.obj\r
- 0003:00003180       __ctype                    00417180     LIBC:ctype.obj\r
- 0003:00003490       ___mb_cur_max              00417490     LIBC:nlsdata1.obj\r
- 0003:00003494       ___decimal_point           00417494     LIBC:nlsdata1.obj\r
- 0003:00003498       ___decimal_point_length    00417498     LIBC:nlsdata1.obj\r
- 0003:00003784       _hd64                      00417784     <common>\r
- 0003:000037a0       _fflag                     004177a0     <common>\r
- 0003:000037a4       _hilo                      004177a4     z80ext.obj\r
- 0003:000037a8       __cflush                   004177a8     LIBC:_file.obj\r
- 0003:000037ac       _errno                     004177ac     LIBC:crt0dat.obj\r
- 0003:000037b0       __doserrno                 004177b0     LIBC:crt0dat.obj\r
- 0003:000037b4       __umaskval                 004177b4     LIBC:crt0dat.obj\r
- 0003:000037b8       __osver                    004177b8     LIBC:crt0dat.obj\r
- 0003:000037bc       __winver                   004177bc     LIBC:crt0dat.obj\r
- 0003:000037c0       __winmajor                 004177c0     LIBC:crt0dat.obj\r
- 0003:000037c4       __winminor                 004177c4     LIBC:crt0dat.obj\r
- 0003:000037c8       ___argc                    004177c8     LIBC:crt0dat.obj\r
- 0003:000037cc       ___argv                    004177cc     LIBC:crt0dat.obj\r
- 0003:000037d0       ___wargv                   004177d0     LIBC:crt0dat.obj\r
- 0003:000037d4       __environ                  004177d4     LIBC:crt0dat.obj\r
- 0003:000037d8       ___initenv                 004177d8     LIBC:crt0dat.obj\r
- 0003:000037dc       __wenviron                 004177dc     LIBC:crt0dat.obj\r
- 0003:000037e0       ___winitenv                004177e0     LIBC:crt0dat.obj\r
- 0003:000037e4       __pgmptr                   004177e4     LIBC:crt0dat.obj\r
- 0003:000037e8       __wpgmptr                  004177e8     LIBC:crt0dat.obj\r
- 0003:000037ec       __exitflag                 004177ec     LIBC:crt0dat.obj\r
- 0003:000037f0       __C_Termination_Done       004177f0     LIBC:crt0dat.obj\r
- 0003:000037f4       __C_Exit_Done              004177f4     LIBC:crt0dat.obj\r
- 0003:000037f8       __aenvptr                  004177f8     LIBC:crt0.obj\r
- 0003:000037fc       __wenvptr                  004177fc     LIBC:crt0.obj\r
- 0003:00003800       ___error_mode              00417800     LIBC:crt0.obj\r
- 0003:00003804       __stdbuf                   00417804     LIBC:_sftbuf.obj\r
- 0003:0000380c       __newmode                  0041780c     LIBC:_newmode.obj\r
- 0003:00003810       ?_pnhHeap@@3P6AHI@ZA       00417810     LIBC:handler.obj\r
- 0003:00003814       __pxcptinfoptrs            00417814     LIBC:winxfltr.obj\r
- 0003:00003920       __adbgmsg                  00417920     LIBC:crt0msg.obj\r
- 0003:00003924       __commode                  00417924     LIBC:ncommode.obj\r
- 0003:00003938       ___lc_handle               00417938     LIBC:nlsdata2.obj\r
- 0003:00003950       ___lc_codepage             00417950     LIBC:nlsdata2.obj\r
- 0003:00003954       ___lc_collate_cp           00417954     LIBC:nlsdata2.obj\r
- 0003:00003958       __fmode                    00417958     LIBC:txtmode.obj\r
- 0003:00003964       _tlevel                    00417964     <common>\r
- 0003:00003968       _symp                      00417968     <common>\r
- 0003:0000396c       _inpfil                    0041796c     <common>\r
- 0003:00003970       _rel                       00417970     <common>\r
- 0003:00003980       _txt                       00417980     <common>\r
- 0003:00003990       _afp                       00417990     <common>\r
- 0003:00003994       _lmode                     00417994     <common>\r
- 0003:00003998       _laddr                     00417998     <common>\r
- 0003:0000399c       _cpt                       0041799c     <common>\r
- 0003:000039a0       _module                    004179a0     <common>\r
- 0003:000039f4       _fuzz                      004179f4     <common>\r
- 0003:000039f8       _incfil                    004179f8     <common>\r
- 0003:000039fc       _cfile                     004179fc     <common>\r
- 0003:00003a00       _afn                       00417a00     <common>\r
- 0003:00003b00       _cbt                       00417b00     <common>\r
- 0003:00003d00       _symhash                   00417d00     <common>\r
- 0003:00003e00       _mnehash                   00417e00     <common>\r
- 0003:00003f00       _srcfn                     00417f00     <common>\r
- 0003:00004500       _srcfp                     00418500     <common>\r
- 0003:00004518       _lfp                       00418518     <common>\r
- 0003:0000451c       _gflag                     0041851c     <common>\r
- 0003:00004520       _erb                       00418520     <common>\r
- 0003:000045a4       _a_mask                    004185a4     <common>\r
- 0003:000045a8       _line                      004185a8     <common>\r
- 0003:000045ac       _lop                       004185ac     <common>\r
- 0003:000045b0       _ofp                       004185b0     <common>\r
- 0003:000045b4       _zflag                     004185b4     <common>\r
- 0003:000045b8       _oflag                     004185b8     <common>\r
- 0003:000045bc       _areap                     004185bc     <common>\r
- 0003:000045c0       _incfn                     004185c0     <common>\r
- 0003:00004bc0       _incfp                     00418bc0     <common>\r
- 0003:00004bd8       _tfp                       00418bd8     <common>\r
- 0003:00004bdc       _page                      00418bdc     <common>\r
- 0003:00004be0       _ifp                       00418be0     <common>\r
- 0003:00004bf8       _pass                      00418bf8     <common>\r
- 0003:00004bfc       _sflag                     00418bfc     <common>\r
- 0003:00004c00       _srcline                   00418c00     <common>\r
- 0003:00004c18       _eb                        00418c18     <common>\r
- 0003:00004c1c       _cp                        00418c1c     <common>\r
- 0003:00004c20       _sfp                       00418c20     <common>\r
- 0003:00004c38       _aserr                     00418c38     <common>\r
- 0003:00004c3c       _ep                        00418c3c     <common>\r
- 0003:00004c40       _stb                       00418c40     <common>\r
- 0003:00004c90       _wflag                     00418c90     <common>\r
- 0003:00004c94       _ip                        00418c94     <common>\r
- 0003:00004c98       _lflag                     00418c98     <common>\r
- 0003:00004c9c       _a_bytes                   00418c9c     <common>\r
- 0003:00004ca0       _cb                        00418ca0     <common>\r
- 0003:00004d20       _ib                        00418d20     <common>\r
- 0003:00004da0       _afntmp                    00418da0     <common>\r
- 0003:00004ea0       _tb                        00418ea0     <common>\r
- 0003:00004ef0       _afptmp                    00418ef0     <common>\r
- 0003:00004ef4       _pflag                     00418ef4     <common>\r
- 0003:00004ef8       _aflag                     00418ef8     <common>\r
- 0003:00004efc       _s_mask                    00418efc     <common>\r
- 0003:00004f00       _incline                   00418f00     <common>\r
- 0003:00004f18       _xflag                     00418f18     <common>\r
- 0003:00004f1c       _radix                     00418f1c     <common>\r
- 0003:00004f20       _ifcnd                     00418f20     <common>\r
- 0003:00004f4c       _flevel                    00418f4c     <common>\r
- 0003:00004f50       _v_mask                    00418f50     <common>\r
- 0003:00004f60       _jump_env                  00418f60     <common>\r
- 0003:00004fa0       _iflvl                     00418fa0     <common>\r
- 0003:0000552c       ___mbcodepage              0041952c     <common>\r
- 0003:000055b0       ___mbulinfo                004195b0     <common>\r
- 0003:000055bc       ___ismbcodepage            004195bc     <common>\r
- 0003:000055c0       __mbcasemap                004195c0     <common>\r
- 0003:000056c0       __mbctype                  004196c0     <common>\r
- 0003:000057c4       ___mblcid                  004197c4     <common>\r
- 0003:000057c8       ___sbh_sizeHeaderList      004197c8     <common>\r
- 0003:000057d8       ___sbh_indGroupDefer       004197d8     <common>\r
- 0003:000057dc       ___sbh_pHeaderScan         004197dc     <common>\r
- 0003:000057e0       ___sbh_pHeaderDefer        004197e0     <common>\r
- 0003:000057e4       ___sbh_cntHeaderList       004197e4     <common>\r
- 0003:000057e8       ___sbh_pHeaderList         004197e8     <common>\r
- 0003:000057ec       __crtheap                  004197ec     <common>\r
- 0003:00005800       ___pioinfo                 00419800     <common>\r
- 0003:0000593c       __nhandle                  0041993c     <common>\r
- 0003:00005940       __acmdln                   00419940     <common>\r
- 0003:0000594c       __setjmpexused             0041994c     <common>\r
- 0003:00005958       ___env_initialized         00419958     <common>\r
- 0003:00005968       ___mbctype_initialized     00419968     <common>\r
- 0003:0000596c       ___onexitend               0041996c     <common>\r
- 0003:00005970       ___onexitbegin             00419970     <common>\r
- 0003:00005974       __FPinit                   00419974     <common>\r
- 0003:00005978       ___piob                    00419978     <common>\r
- 0003:00005cc0       __bufin                    00419cc0     <common>\r
- 0003:00006cc0       __nstream                  0041acc0     <common>\r
- 0004:00000000       __IMPORT_DESCRIPTOR_KERNEL32 0041b000     kernel32:KERNEL32.dll\r
- 0004:00000014       __NULL_IMPORT_DESCRIPTOR   0041b014     kernel32:KERNEL32.dll\r
- 0004:00000124       __imp__UnhandledExceptionFilter@4 0041b124     kernel32:KERNEL32.dll\r
- 0004:00000128       __imp__ExitProcess@4       0041b128     kernel32:KERNEL32.dll\r
- 0004:0000012c       __imp__TerminateProcess@8  0041b12c     kernel32:KERNEL32.dll\r
- 0004:00000130       __imp__GetCurrentProcess@0 0041b130     kernel32:KERNEL32.dll\r
- 0004:00000134       __imp__GetCommandLineA@0   0041b134     kernel32:KERNEL32.dll\r
- 0004:00000138       __imp__GetVersion@0        0041b138     kernel32:KERNEL32.dll\r
- 0004:0000013c       __imp__HeapFree@12         0041b13c     kernel32:KERNEL32.dll\r
- 0004:00000140       __imp__GetLastError@0      0041b140     kernel32:KERNEL32.dll\r
- 0004:00000144       __imp__CloseHandle@4       0041b144     kernel32:KERNEL32.dll\r
- 0004:00000148       __imp__SetFilePointer@16   0041b148     kernel32:KERNEL32.dll\r
- 0004:0000014c       __imp__SetHandleCount@4    0041b14c     kernel32:KERNEL32.dll\r
- 0004:00000150       __imp__GetStdHandle@4      0041b150     kernel32:KERNEL32.dll\r
- 0004:00000154       __imp__GetFileType@4       0041b154     kernel32:KERNEL32.dll\r
- 0004:00000158       __imp__GetStartupInfoA@4   0041b158     kernel32:KERNEL32.dll\r
- 0004:0000015c       __imp__WriteFile@20        0041b15c     kernel32:KERNEL32.dll\r
- 0004:00000160       __imp__HeapDestroy@4       0041b160     kernel32:KERNEL32.dll\r
- 0004:00000164       __imp__HeapCreate@12       0041b164     kernel32:KERNEL32.dll\r
- 0004:00000168       __imp__VirtualFree@12      0041b168     kernel32:KERNEL32.dll\r
- 0004:0000016c       __imp__VirtualAlloc@16     0041b16c     kernel32:KERNEL32.dll\r
- 0004:00000170       __imp__HeapReAlloc@16      0041b170     kernel32:KERNEL32.dll\r
- 0004:00000174       __imp__IsBadWritePtr@8     0041b174     kernel32:KERNEL32.dll\r
- 0004:00000178       __imp__RtlUnwind@16        0041b178     kernel32:KERNEL32.dll\r
- 0004:0000017c       __imp__HeapAlloc@12        0041b17c     kernel32:KERNEL32.dll\r
- 0004:00000180       __imp__GetModuleFileNameA@12 0041b180     kernel32:KERNEL32.dll\r
- 0004:00000184       __imp__FreeEnvironmentStringsA@4 0041b184     kernel32:KERNEL32.dll\r
- 0004:00000188       __imp__FreeEnvironmentStringsW@4 0041b188     kernel32:KERNEL32.dll\r
- 0004:0000018c       __imp__WideCharToMultiByte@32 0041b18c     kernel32:KERNEL32.dll\r
- 0004:00000190       __imp__GetEnvironmentStrings@0 0041b190     kernel32:KERNEL32.dll\r
- 0004:00000194       __imp__GetEnvironmentStringsW@0 0041b194     kernel32:KERNEL32.dll\r
- 0004:00000198       __imp__SetStdHandle@8      0041b198     kernel32:KERNEL32.dll\r
- 0004:0000019c       __imp__FlushFileBuffers@4  0041b19c     kernel32:KERNEL32.dll\r
- 0004:000001a0       __imp__ReadFile@20         0041b1a0     kernel32:KERNEL32.dll\r
- 0004:000001a4       __imp__CreateFileA@28      0041b1a4     kernel32:KERNEL32.dll\r
- 0004:000001a8       __imp__GetCPInfo@8         0041b1a8     kernel32:KERNEL32.dll\r
- 0004:000001ac       __imp__GetACP@0            0041b1ac     kernel32:KERNEL32.dll\r
- 0004:000001b0       __imp__GetOEMCP@0          0041b1b0     kernel32:KERNEL32.dll\r
- 0004:000001b4       __imp__GetProcAddress@8    0041b1b4     kernel32:KERNEL32.dll\r
- 0004:000001b8       __imp__LoadLibraryA@4      0041b1b8     kernel32:KERNEL32.dll\r
- 0004:000001bc       __imp__SetEndOfFile@4      0041b1bc     kernel32:KERNEL32.dll\r
- 0004:000001c0       __imp__MultiByteToWideChar@24 0041b1c0     kernel32:KERNEL32.dll\r
- 0004:000001c4       __imp__LCMapStringA@24     0041b1c4     kernel32:KERNEL32.dll\r
- 0004:000001c8       __imp__LCMapStringW@24     0041b1c8     kernel32:KERNEL32.dll\r
- 0004:000001cc       __imp__GetStringTypeA@20   0041b1cc     kernel32:KERNEL32.dll\r
- 0004:000001d0       __imp__GetStringTypeW@16   0041b1d0     kernel32:KERNEL32.dll\r
- 0004:000001d4       \177KERNEL32_NULL_THUNK_DATA 0041b1d4     kernel32:KERNEL32.dll\r
-\r
- entry point at        0001:0000ab73\r
-\r
diff --git a/src/avr/2313def.inc b/src/avr/2313def.inc
new file mode 100644 (file)
index 0000000..969a3c5
--- /dev/null
@@ -0,0 +1,232 @@
+;***************************************************************************\r
+;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y\r
+;* \r
+;* Number              :AVR000\r
+;* File Name           :"2313def.inc"\r
+;* Title               :Register/Bit Definitions for the AT90S2313\r
+;* Date                        :98.05.22\r
+;* Version             :1.22\r
+;* Support telephone   :+47 72 88 43 88 (ATMEL Norway)\r
+;* Support fax         :+47 72 88 43 99 (ATMEL Norway)\r
+;* Support E-Mail      :avr@atmel.com\r
+;* Target MCU          :AT90S2313\r
+;*\r
+;* DESCRIPTION\r
+;* When including this file in the assembly program file, all I/O register\r
+;* names and I/O register bit names appearing in the data book can be used.\r
+;* \r
+;* The Register names are represented by their hexadecimal addresses.\r
+;* \r
+;* The Register Bit names are represented by their bit number (0-7).\r
+;* \r
+;* Please observe the difference in using the bit names with instructions\r
+;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" \r
+;* (skip if bit in register set/cleared). The following example illustrates\r
+;* this:\r
+;* \r
+;* in  r16,PORTB               ;read PORTB latch\r
+;* sbr r16,(1<<PB6)+(1<<PB5)   ;set PB6 and PB5 (use masks, not bit#)\r
+;* out  PORTB,r16              ;output to PORTB\r
+;*\r
+;* in  r16,TIFR                ;read the Timer Interrupt Flag Register\r
+;* sbrc        r16,TOV0                ;test the overflow flag (use bit#)\r
+;* rjmp        TOV0_is_set             ;jump if set\r
+;* ...                         ;otherwise do something else\r
+;***************************************************************************\r
+\r
+;***** Specify Device\r
+.device AT90S2313\r
+\r
+;***** I/O Register Definitions\r
+.equ   SREG    =$3f\r
+.equ   SPL     =$3d\r
+.equ   GIMSK   =$3b\r
+.equ   GIFR    =$3a\r
+.equ   TIMSK   =$39\r
+.equ   TIFR    =$38\r
+.equ   MCUCR   =$35\r
+.equ   TCCR0   =$33\r
+.equ   TCNT0   =$32\r
+.equ   TCCR1A  =$2f\r
+.equ   TCCR1B  =$2e\r
+.equ   TCNT1H  =$2d\r
+.equ   TCNT1L  =$2c\r
+.equ   OCR1AH  =$2b\r
+.equ   OCR1AL  =$2a\r
+.equ   ICR1H   =$25\r
+.equ   ICR1L   =$24\r
+.equ   WDTCR   =$21\r
+.equ   EEAR    =$1e\r
+.equ   EEARL   =$1e\r
+.equ   EEDR    =$1d\r
+.equ   EECR    =$1c\r
+.equ   PORTB   =$18\r
+.equ   DDRB    =$17\r
+.equ   PINB    =$16\r
+.equ   PORTD   =$12\r
+.equ   DDRD    =$11\r
+.equ   PIND    =$10\r
+.equ   UDR     =$0c\r
+.equ   USR     =$0b\r
+.equ   UCR     =$0a\r
+.equ   UBRR    =$09\r
+.equ   ACSR    =$08\r
+\r
+\r
+;***** Bit Definitions\r
+.equ   SP7     =7\r
+.equ   SP6     =6\r
+.equ   SP5     =5\r
+.equ   SP4     =4\r
+.equ   SP3     =3\r
+.equ   SP2     =2\r
+.equ   SP1     =1\r
+.equ   SP0     =0\r
+\r
+.equ   INT1    =7\r
+.equ   INT0    =6\r
+\r
+.equ   INTF1   =7\r
+.equ   INTF0   =6\r
+\r
+.equ   TOIE1   =7\r
+.equ   OCIE1A  =6\r
+.equ   TICIE   =3\r
+.equ   TOIE0   =1\r
+\r
+.equ   TOV1    =7\r
+.equ   OCF1A   =6\r
+.equ   ICF1    =3\r
+.equ   TOV0    =1\r
+\r
+.equ   SE      =5\r
+.equ   SM      =4\r
+.equ   ISC11   =3\r
+.equ   ISC10   =2\r
+.equ   ISC01   =1\r
+.equ   ISC00   =0\r
+\r
+.equ   CS02    =2\r
+.equ   CS01    =1\r
+.equ   CS00    =0\r
+\r
+.equ   COM1A1  =7\r
+.equ   COM1A0  =6\r
+.equ   PWM11   =1\r
+.equ   PWM10   =0\r
+\r
+.equ   ICNC1   =7\r
+.equ   ICES1   =6\r
+.equ   CTC1    =3\r
+.equ   CS12    =2\r
+.equ   CS11    =1\r
+.equ   CS10    =0\r
+\r
+.equ   WDTOE   =4\r
+.equ   WDE     =3\r
+.equ   WDP2    =2\r
+.equ   WDP1    =1\r
+.equ   WDP0    =0\r
+\r
+.equ   EEMWE   =2\r
+.equ   EEWE    =1\r
+.equ   EERE    =0\r
+\r
+.equ   PB7     =7\r
+.equ   PB6     =6\r
+.equ   PB5     =5\r
+.equ   PB4     =4\r
+.equ   PB3     =3\r
+.equ   PB2     =2\r
+.equ   PB1     =1\r
+.equ   PB0     =0\r
+\r
+.equ   DDB7    =7\r
+.equ   DDB6    =6\r
+.equ   DDB5    =5\r
+.equ   DDB4    =4\r
+.equ   DDB3    =3\r
+.equ   DDB2    =2\r
+.equ   DDB1    =1\r
+.equ   DDB0    =0\r
+\r
+.equ   PINB7   =7\r
+.equ   PINB6   =6\r
+.equ   PINB5   =5\r
+.equ   PINB4   =4\r
+.equ   PINB3   =3\r
+.equ   PINB2   =2\r
+.equ   PINB1   =1\r
+.equ   PINB0   =0\r
+\r
+.equ   PD6     =6\r
+.equ   PD5     =5\r
+.equ   PD4     =4\r
+.equ   PD3     =3\r
+.equ   PD2     =2\r
+.equ   PD1     =1\r
+.equ   PD0     =0\r
+\r
+.equ   DDD6    =6\r
+.equ   DDD5    =5\r
+.equ   DDD4    =4\r
+.equ   DDD3    =3\r
+.equ   DDD2    =2\r
+.equ   DDD1    =1\r
+.equ   DDD0    =0\r
+\r
+.equ   PIND6   =6\r
+.equ   PIND5   =5\r
+.equ   PIND4   =4\r
+.equ   PIND3   =3\r
+.equ   PIND2   =2\r
+.equ   PIND1   =1\r
+.equ   PIND0   =0\r
+\r
+.equ   RXC     =7\r
+.equ   TXC     =6\r
+.equ   UDRE    =5\r
+.equ   FE      =4\r
+.equ   OR      =3\r
+\r
+.equ   RXCIE   =7\r
+.equ   TXCIE   =6\r
+.equ   UDRIE   =5\r
+.equ   RXEN    =4\r
+.equ   TXEN    =3\r
+.equ   CHR9    =2\r
+.equ   RXB8    =1\r
+.equ   TXB8    =0\r
+\r
+.equ   ACD     =7\r
+.equ   ACO     =5\r
+.equ   ACI     =4\r
+.equ   ACIE    =3\r
+.equ   ACIC    =2\r
+.equ   ACIS1   =1\r
+.equ   ACIS0   =0\r
+\r
+.def   XL      =r26\r
+.def   XH      =r27\r
+.def   YL      =r28\r
+.def   YH      =r29\r
+.def   ZL      =r30\r
+.def   ZH      =r31\r
+\r
+.equ    RAMEND  =$DF    ;Last On-Chip SRAM Location\r
+.equ   XRAMEND =$DF\r
+.equ   E2END   =$7F\r
+.equ   FLASHEND=$3FF\r
+\r
+\r
+.equ   INT0addr=$001   ;External Interrupt0 Vector Address\r
+.equ   INT1addr=$002   ;External Interrupt1 Vector Address\r
+.equ   ICP1addr=$003   ;Input Capture1 Interrupt Vector Address\r
+.equ   OC1addr =$004   ;Output Compare1 Interrupt Vector Address\r
+.equ   OVF1addr=$005   ;Overflow1 Interrupt Vector Address\r
+.equ   OVF0addr=$006   ;Overflow0 Interrupt Vector Address\r
+.equ   URXCaddr=$007   ;UART Receive Complete Interrupt Vector Address\r
+.equ   UDREaddr=$008   ;UART Data Register Empty Interrupt Vector Address\r
+.equ   UTXCaddr=$009   ;UART Transmit Complete Interrupt Vector Address\r
+.equ   ACIaddr =$00a   ;Analog Comparator Interrupt Vector Address\r
+\r
diff --git a/src/avr/4433def.inc b/src/avr/4433def.inc
new file mode 100644 (file)
index 0000000..78dfeed
--- /dev/null
@@ -0,0 +1,296 @@
+\r
+;***************************************************************************\r
+;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y\r
+;* \r
+;* Number              :AVR000\r
+;* File Name           :"4433def.inc"\r
+;* Title               :Register/Bit Definitions for the AT90S4433\r
+;* Date                 :98.11.25\r
+;* Version              :1.23\r
+;* Support telephone   :+47 72 88 43 88 (ATMEL Norway)\r
+;* Support fax         :+47 72 88 43 99 (ATMEL Norway)\r
+;* Support E-mail      :avr@atmel.com\r
+;* Target MCU          :AT90S4433\r
+;*\r
+;* DESCRIPTION\r
+;* When including this file in the assembly program file, all I/O register     \r
+;* names and I/O register bit names appearing in the data book can be used.\r
+;* In addition, the six registers forming the three data pointers X, Y and\r
+;* Z have been assigned names XL - ZH. Highest RAM address for Internal \r
+;* SRAM is also defined \r
+;*\r
+;* The Register names are represented by their hexadecimal address.\r
+;* \r
+;* The Register Bit names are represented by their bit number (0-7).\r
+;* \r
+;* Please observe the difference in using the bit names with instructions\r
+;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" \r
+;* (skip if bit in register set/cleared). The following example illustrates\r
+;* this:\r
+;* \r
+;* in  r16,PORTB               ;read PORTB latch\r
+;* sbr r16,(1<<PB6)+(1<<PB5)   ;set PB6 and PB5 (use masks, not bit#)\r
+;* out  PORTB,r16              ;output to PORTB\r
+;*\r
+;* in  r16,TIFR                ;read the Timer Interrupt Flag Register\r
+;* sbrc        r16,TOV0                ;test the overflow flag (use bit#)\r
+;* rjmp        TOV0_is_set             ;jump if set\r
+;* ...                         ;otherwise do something else\r
+;***** Specify Device\r
+;.device AT90S4433\r
+.device AT90S4434\r
+\r
+;***** I/O Register Definitions\r
+.equ   SREG    =$3f\r
+.equ   SP      =$3d\r
+.equ   SPL     =$3d\r
+.equ   GIMSK   =$3b\r
+.equ   GIFR    =$3a\r
+.equ   TIMSK   =$39\r
+.equ   TIFR    =$38\r
+.equ    MCUCR   =$35\r
+.equ    MCUSR   =$34\r
+.equ   TCCR0   =$33\r
+.equ   TCNT0   =$32\r
+.equ   TCCR1A  =$2f\r
+.equ   TCCR1B  =$2e\r
+.equ   TCNT1H  =$2d\r
+.equ   TCNT1L  =$2c\r
+.equ   OCR1H   =$2b\r
+.equ   OCR1L   =$2a\r
+.equ   ICR1H   =$27\r
+.equ   ICR1L   =$26\r
+.equ   WDTCR   =$21\r
+.equ   EEAR    =$1e\r
+.equ   EEDR    =$1d\r
+.equ   EECR    =$1c\r
+.equ   PORTB   =$18\r
+.equ   DDRB    =$17\r
+.equ   PINB    =$16\r
+.equ   PORTC   =$15\r
+.equ   DDRC    =$14\r
+.equ   PINC    =$13\r
+.equ   PORTD   =$12\r
+.equ   DDRD    =$11\r
+.equ   PIND    =$10\r
+.equ   SPDR    =$0f\r
+.equ   SPSR    =$0e\r
+.equ   SPCR    =$0d\r
+.equ   UDR     =$0c\r
+.equ   UCSRA   =$0b\r
+.equ   UCSRB   =$0a\r
+.equ   UBRR    =$09\r
+.equ   UBRRL   =$09\r
+.equ   ACSR    =$08\r
+.equ    ADMUX   =$07\r
+.equ    ADCSR   =$06\r
+.equ    ADCH    =$05\r
+.equ    ADCL    =$04\r
+.equ   UBRRH   =$03\r
+\r
+\r
+;***** Bit Definitions\r
+\r
+.equ   WDRF    =3\r
+.equ   BORF    =2\r
+.equ   EXTRF   =1\r
+.equ   PORF    =0\r
+\r
+.equ   INT1    =7\r
+.equ   INT0    =6\r
+\r
+.equ   INTF1   =7\r
+.equ   INTF0   =6\r
+\r
+\r
+.equ    TOIE1   =7\r
+.equ    OCIE1   =6\r
+.equ    TICIE1  =3\r
+.equ    TOIE0   =1\r
+\r
+.equ    TOV1    =7\r
+.equ    OCF1    =6\r
+.equ    ICF1    =3\r
+.equ    TOV0    =1\r
+\r
+.equ    SE      =5\r
+.equ    SM      =4\r
+.equ    ISC11   =3\r
+.equ    ISC10   =2\r
+.equ    ISC01   =1\r
+.equ    ISC00   =0\r
+\r
+.equ   CS02    =2\r
+.equ   CS01    =1\r
+.equ   CS00    =0\r
+\r
+.equ   COM11   =7\r
+.equ   COM10   =6\r
+.equ   PWM11   =1\r
+.equ   PWM10   =0\r
+\r
+.equ   ICNC1   =7\r
+.equ   ICES1   =6\r
+.equ   CTC1    =3\r
+.equ   CS12    =2\r
+.equ   CS11    =1\r
+.equ   CS10    =0\r
+\r
+.equ   WDTOE   =4\r
+.equ   WDE     =3\r
+.equ   WDP2    =2\r
+.equ   WDP1    =1\r
+.equ   WDP0    =0\r
+\r
+.equ    EERIE   =3\r
+.equ   EEMWE   =2\r
+.equ   EEWE    =1\r
+.equ   EERE    =0\r
+\r
+.equ   SPIE    =7\r
+.equ   SPE     =6\r
+.equ   DORD    =5\r
+.equ   MSTR    =4\r
+.equ   CPOL    =3\r
+.equ   CPHA    =2\r
+.equ   SPR1    =1\r
+.equ   SPR0    =0\r
+\r
+.equ   SPIF    =7\r
+.equ   WCOL    =6\r
+\r
+.equ   RXC     =7\r
+.equ   TXC     =6\r
+.equ   UDRE    =5\r
+.equ   FE      =4\r
+; removed for AVRA / TAVRASM:\r
+;.equ  OR      =3\r
+.equ    MPCM    =0\r
+\r
+.equ   RXCIE   =7\r
+.equ   TXCIE   =6\r
+.equ   UDRIE   =5\r
+.equ   RXEN    =4\r
+.equ   TXEN    =3\r
+.equ   CHR9    =2\r
+.equ   RXB8    =1\r
+.equ   TXB8    =0\r
+\r
+.equ   ACD     =7\r
+.equ   AINBG   =6\r
+.equ   ACO     =5\r
+.equ   ACI     =4\r
+.equ   ACIE    =3\r
+.equ   ACIC    =2\r
+.equ   ACIS1   =1\r
+.equ   ACIS0   =0\r
+\r
+.equ   ADCBG   =6\r
+.equ    MUX2    =2\r
+.equ    MUX1    =1\r
+.equ    MUX0    =0\r
+\r
+.equ    ADEN    =7\r
+.equ    ADSC    =6\r
+.equ    ADFR    =5\r
+.equ    ADIF    =4\r
+.equ    ADIE    =3\r
+.equ    ADPS2   =2\r
+.equ    ADPS1   =1\r
+.equ    ADPS0   =0\r
+\r
+.equ   PB5     =5\r
+.equ   PB4     =4\r
+.equ   PB3     =3\r
+.equ   PB2     =2\r
+.equ   PB1     =1\r
+.equ   PB0     =0\r
+\r
+.equ   DDB5    =5\r
+.equ   DDB4    =4\r
+.equ   DDB3    =3\r
+.equ   DDB2    =2\r
+.equ   DDB1    =1\r
+.equ   DDB0    =0\r
+\r
+.equ   PINB5   =5\r
+.equ   PINB4   =4\r
+.equ   PINB3   =3\r
+.equ   PINB2   =2\r
+.equ   PINB1   =1\r
+.equ   PINB0   =0\r
+\r
+.equ   PC5     =5\r
+.equ   PC4     =4\r
+.equ   PC3     =3\r
+.equ   PC2     =2\r
+.equ   PC1     =1\r
+.equ   PC0     =0\r
+\r
+.equ   DDC5    =5\r
+.equ   DDC4    =4\r
+.equ   DDC3    =3\r
+.equ   DDC2    =2\r
+.equ   DDC1    =1\r
+.equ   DDC0    =0\r
+\r
+.equ   PINC5   =5\r
+.equ   PINC4   =4\r
+.equ   PINC3   =3\r
+.equ   PINC2   =2\r
+.equ   PINC1   =1\r
+.equ   PINC0   =0\r
+\r
+.equ   PD7     =7\r
+.equ   PD6     =6\r
+.equ   PD5     =5\r
+.equ   PD4     =4\r
+.equ   PD3     =3\r
+.equ   PD2     =2\r
+.equ   PD1     =1\r
+.equ   PD0     =0\r
+\r
+.equ   DDD7    =7\r
+.equ   DDD6    =6\r
+.equ   DDD5    =5\r
+.equ   DDD4    =4\r
+.equ   DDD3    =3\r
+.equ   DDD2    =2\r
+.equ   DDD1    =1\r
+.equ   DDD0    =0\r
+\r
+.equ   PIND7   =7\r
+.equ   PIND6   =6\r
+.equ   PIND5   =5\r
+.equ   PIND4   =4\r
+.equ   PIND3   =3\r
+.equ   PIND2   =2\r
+.equ   PIND1   =1\r
+.equ   PIND0   =0\r
+\r
+\r
+.def   XL      =r26\r
+.def   XH      =r27\r
+.def   YL      =r28\r
+.def   YH      =r29\r
+.def   ZL      =r30\r
+.def   ZH      =r31\r
+\r
+.equ   RAMEND  =$DF    ;Last On-Chip SRAM Location\r
+.equ   XRAMEND =$DF\r
+.equ   E2END   =$7F\r
+.equ   FLASHEND=$7FF\r
+\r
+.equ   INT0addr=$001   ;External Interrupt0 Vector Address\r
+.equ   INT1addr=$002   ;External Interrupt1 Vector Address\r
+.equ   ICP1addr=$003   ;Input Capture1 Interrupt Vector Address\r
+.equ   OC1Aaddr=$004   ;Output Compare1A Interrupt Vector Address\r
+.equ   OVF1addr=$005   ;Overflow1 Interrupt Vector Address\r
+.equ   OVF0addr=$006   ;Overflow0 Interrupt Vector Address\r
+.equ   SPIaddr =$007   ;SPI Interrupt Vector Address\r
+.equ   URXCaddr=$008   ;UART Receive Complete Interrupt Vector Address\r
+.equ   UDREaddr=$009   ;UART Data Register Empty Interrupt Vector Address\r
+.equ   UTXCaddr=$00a   ;UART Transmit Complete Interrupt Vector Address\r
+.equ   ADCCaddr =$00b  ;ADC Interrupt Vector Address\r
+.equ   ERDYaddr =$00c  ;EEPROM Interrupt Vector Address\r
+.equ   ACIaddr  =$00d  ;Analog Comparator Interrupt Vector Address\r
diff --git a/src/avr/4434def.inc b/src/avr/4434def.inc
new file mode 100644 (file)
index 0000000..358f400
--- /dev/null
@@ -0,0 +1,364 @@
+;***************************************************************************\r
+;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y\r
+;* \r
+;* Number              :AVR000\r
+;* File Name           :"4434def.inc"\r
+;* Title               :Register/Bit Definitions for the AT90S4434\r
+;* Date                 :98.05.22\r
+;* Version              :1.22\r
+;* Support telephone   :+47 72 88 43 88 (ATMEL Norway)\r
+;* Support fax         :+47 72 88 43 99 (ATMEL Norway)\r
+;* Support E-mail      :avr@atmel.com\r
+;* Target MCU          :AT90S4434\r
+;*\r
+;* DESCRIPTION\r
+;* When including this file in the assembly program file, all I/O register     \r
+;* names and I/O register bit names appearing in the data book can be used.\r
+;* In addition, the six registers forming the three data pointers X, Y and\r
+;* Z have been assigned names XL - ZH. Highest RAM address for Internal \r
+;* SRAM is also defined \r
+;*\r
+;* The Register names are represented by their hexadecimal address.\r
+;* \r
+;* The Register Bit names are represented by their bit number (0-7).\r
+;* \r
+;* Please observe the difference in using the bit names with instructions\r
+;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" \r
+;* (skip if bit in register set/cleared). The following example illustrates\r
+;* this:\r
+;* \r
+;* in  r16,PORTB               ;read PORTB latch\r
+;* sbr r16,(1<<PB6)+(1<<PB5)   ;set PB6 and PB5 (use masks, not bit#)\r
+;* out  PORTB,r16              ;output to PORTB\r
+;*\r
+;* in  r16,TIFR                ;read the Timer Interrupt Flag Register\r
+;* sbrc        r16,TOV0                ;test the overflow flag (use bit#)\r
+;* rjmp        TOV0_is_set             ;jump if set\r
+;* ...                         ;otherwise do something else\r
+;***************************************************************************\r
+\r
+;***** Specify Device\r
+.device AT90S4434\r
+\r
+;***** I/O Register Definitions\r
+.equ   SREG    =$3f\r
+.equ   SPH     =$3e\r
+.equ   SPL     =$3d\r
+.equ   GIMSK   =$3b\r
+.equ   GIFR    =$3a\r
+.equ   TIMSK   =$39\r
+.equ   TIFR    =$38\r
+\r
+.equ   MCUCR   =$35\r
+.equ   MCUSR   =$34\r
+\r
+.equ   TCCR0   =$33\r
+.equ   TCNT0   =$32\r
+\r
+.equ   TCCR1A  =$2f\r
+.equ   TCCR1B  =$2e\r
+.equ   TCNT1H  =$2d\r
+.equ   TCNT1L  =$2c\r
+.equ   OCR1AH  =$2b\r
+.equ   OCR1AL  =$2a\r
+.equ   OCR1BH  =$29\r
+.equ   OCR1BL  =$28\r
+.equ   ICR1H   =$27\r
+.equ   ICR1L   =$26\r
+\r
+.equ   TCCR2   =$25\r
+.equ   TCNT2   =$24\r
+.equ   OCR2    =$23\r
+.equ   ASSR    =$22\r
+\r
+.equ   WDTCR   =$21\r
+.equ   EEARH   =$1f\r
+.equ   EEARL   =$1e\r
+.equ   EEDR    =$1d\r
+.equ   EECR    =$1c\r
+.equ   PORTA   =$1b\r
+.equ   DDRA    =$1a\r
+.equ   PINA    =$19\r
+.equ   PORTB   =$18\r
+.equ   DDRB    =$17\r
+.equ   PINB    =$16\r
+.equ   PORTC   =$15\r
+.equ   DDRC    =$14\r
+.equ   PINC    =$13\r
+.equ   PORTD   =$12\r
+.equ   DDRD    =$11\r
+.equ   PIND    =$10\r
+.equ   SPDR    =$0f\r
+.equ   SPSR    =$0e\r
+.equ   SPCR    =$0d\r
+.equ   UDR     =$0c\r
+.equ   USR     =$0b\r
+.equ   UCR     =$0a\r
+.equ   UBRR    =$09\r
+.equ   ACSR    =$08\r
+.equ    ADMUX   =$07\r
+.equ    ADCSR   =$06\r
+.equ    ADCH    =$05\r
+.equ    ADCL    =$04\r
+\r
+;***** Bit Definitions\r
+\r
+.equ   EXTRF   =1\r
+.equ   PORF    =0\r
+\r
+.equ   INT1    =7\r
+.equ   INT0    =6\r
+\r
+.equ   INTF1   =7\r
+.equ   INTF0   =6\r
+\r
+.equ   OCIE2   =7\r
+.equ   TOIE2   =6\r
+.equ   TICIE1  =5\r
+.equ   OCIE1A  =4\r
+.equ   OCIE1B  =3\r
+.equ   TOIE1   =2\r
+.equ   TOIE0   =0\r
+\r
+.equ   OCF2    =7\r
+.equ   TOV2    =6\r
+.equ   ICF1    =5\r
+.equ   OCF1A   =4\r
+.equ   OCF1B   =3\r
+.equ   TOV1    =2\r
+.equ   TOV0    =0\r
+\r
+.equ   SE      =6\r
+.equ   SM1     =5\r
+.equ   SM0     =4\r
+.equ   ISC11   =3\r
+.equ   ISC10   =2\r
+.equ   ISC01   =1\r
+.equ   ISC00   =0\r
+\r
+.equ   CS02    =2\r
+.equ   CS01    =1\r
+.equ   CS00    =0\r
+\r
+.equ   COM1A1  =7\r
+.equ   COM1A0  =6\r
+.equ   COM1B1  =5\r
+.equ   COM1B0  =4\r
+.equ   PWM11   =1\r
+.equ   PWM10   =0\r
+\r
+.equ   ICNC1   =7\r
+.equ   ICES1   =6\r
+.equ   CTC1    =3\r
+.equ   CS12    =2\r
+.equ   CS11    =1\r
+.equ   CS10    =0\r
+\r
+.equ   PWM2    =6\r
+.equ   COM21   =5\r
+.equ   COM20   =4\r
+.equ   CTC2    =3\r
+.equ   CS22    =2\r
+.equ   CS21    =1\r
+.equ   CS20    =0\r
+\r
+.equ   AS2     =3\r
+.equ   TCN2UB  =2\r
+.equ   OCR2UB  =1\r
+.equ   TCR2UB  =0\r
+\r
+.equ   WDDE    =4\r
+.equ   WDE     =3\r
+.equ   WDP2    =2\r
+.equ   WDP1    =1\r
+.equ   WDP0    =0\r
+\r
+.equ   EERIE   =3\r
+.equ   EEMWE   =2\r
+.equ   EEWE    =1\r
+.equ   EERE    =0\r
+\r
+.equ   PA7     =7\r
+.equ   PA6     =6\r
+.equ   PA5     =5\r
+.equ   PA4     =4\r
+.equ   PA3     =3\r
+.equ   PA2     =2\r
+.equ   PA1     =1\r
+.equ   PA0     =0\r
+\r
+.equ   DDA7    =7\r
+.equ   DDA6    =6\r
+.equ   DDA5    =5\r
+.equ   DDA4    =4\r
+.equ   DDA3    =3\r
+.equ   DDA2    =2\r
+.equ   DDA1    =1\r
+.equ   DDA0    =0\r
+\r
+.equ   PINA7   =7\r
+.equ   PINA6   =6\r
+.equ   PINA5   =5\r
+.equ   PINA4   =4\r
+.equ   PINA3   =3\r
+.equ   PINA2   =2\r
+.equ   PINA1   =1\r
+.equ   PINA0   =0\r
+\r
+.equ   PB7     =7\r
+.equ   PB6     =6\r
+.equ   PB5     =5\r
+.equ   PB4     =4\r
+.equ   PB3     =3\r
+.equ   PB2     =2\r
+.equ   PB1     =1\r
+.equ   PB0     =0\r
+\r
+.equ   DDB7    =7\r
+.equ   DDB6    =6\r
+.equ   DDB5    =5\r
+.equ   DDB4    =4\r
+.equ   DDB3    =3\r
+.equ   DDB2    =2\r
+.equ   DDB1    =1\r
+.equ   DDB0    =0\r
+\r
+.equ   PINB7   =7\r
+.equ   PINB6   =6\r
+.equ   PINB5   =5\r
+.equ   PINB4   =4\r
+.equ   PINB3   =3\r
+.equ   PINB2   =2\r
+.equ   PINB1   =1\r
+.equ   PINB0   =0\r
+\r
+.equ   PC7     =7\r
+.equ   PC6     =6\r
+.equ   PC5     =5\r
+.equ   PC4     =4\r
+.equ   PC3     =3\r
+.equ   PC2     =2\r
+.equ   PC1     =1\r
+.equ   PC0     =0\r
+\r
+.equ   DDC7    =7\r
+.equ   DDC6    =6\r
+.equ   DDC5    =5\r
+.equ   DDC4    =4\r
+.equ   DDC3    =3\r
+.equ   DDC2    =2\r
+.equ   DDC1    =1\r
+.equ   DDC0    =0\r
+\r
+.equ   PINC7   =7\r
+.equ   PINC6   =6\r
+.equ   PINC5   =5\r
+.equ   PINC4   =4\r
+.equ   PINC3   =3\r
+.equ   PINC2   =2\r
+.equ   PINC1   =1\r
+.equ   PINC0   =0\r
+\r
+.equ   PD7     =7\r
+.equ   PD6     =6\r
+.equ   PD5     =5\r
+.equ   PD4     =4\r
+.equ   PD3     =3\r
+.equ   PD2     =2\r
+.equ   PD1     =1\r
+.equ   PD0     =0\r
+\r
+.equ   DDD7    =7\r
+.equ   DDD6    =6\r
+.equ   DDD5    =5\r
+.equ   DDD4    =4\r
+.equ   DDD3    =3\r
+.equ   DDD2    =2\r
+.equ   DDD1    =1\r
+.equ   DDD0    =0\r
+\r
+.equ   PIND7   =7\r
+.equ   PIND6   =6\r
+.equ   PIND5   =5\r
+.equ   PIND4   =4\r
+.equ   PIND3   =3\r
+.equ   PIND2   =2\r
+.equ   PIND1   =1\r
+.equ   PIND0   =0\r
+\r
+.equ   SPIE    =7\r
+.equ   SPE     =6\r
+.equ   DORD    =5\r
+.equ   MSTR    =4\r
+.equ   CPOL    =3\r
+.equ   CPHA    =2\r
+.equ   SPR1    =1\r
+.equ   SPR0    =0\r
+\r
+.equ   SPIF    =7\r
+.equ   WCOL    =6\r
+\r
+.equ   RXC     =7\r
+.equ   TXC     =6\r
+.equ   UDRE    =5\r
+.equ   FE      =4\r
+.equ   OR      =3\r
+\r
+.equ   RXCIE   =7\r
+.equ   TXCIE   =6\r
+.equ   UDRIE   =5\r
+.equ   RXEN    =4\r
+.equ   TXEN    =3\r
+.equ   CHR9    =2\r
+.equ   RXB8    =1\r
+.equ   TXB8    =0\r
+\r
+.equ   ACD     =7\r
+.equ   ACO     =5\r
+.equ   ACI     =4\r
+.equ   ACIE    =3\r
+.equ   ACIC    =2\r
+.equ   ACIS1   =1\r
+.equ   ACIS0   =0\r
+\r
+.equ   MUX2    =2\r
+.equ   MUX1    =1\r
+.equ   MUX0    =0\r
+\r
+.equ   ADEN    =7\r
+.equ   ADSC    =6\r
+.equ   ADFR    =5\r
+.equ   ADIF    =4\r
+.equ   ADIE    =3\r
+.equ   ADPS2   =2\r
+.equ   ADPS1   =1\r
+.equ   ADPS0   =0\r
+\r
+.def   XL      =r26\r
+.def   XH      =r27\r
+.def   YL      =r28\r
+.def   YH      =r29\r
+.def   ZL      =r30\r
+.def   ZH      =r31\r
+\r
+.equ   RAMEND  =$15F   ;Last On-Chip SRAM location\r
+.equ   XRAMEND =$15F\r
+.equ   E2END   =$FF\r
+.equ   FLASHEND=$7FF\r
+\r
+.equ   INT0addr=$001   ;External Interrupt0 Vector Address\r
+.equ   INT1addr=$002   ;External Interrupt1 Vector Address\r
+.equ   OC2addr =$003   ;Timer2 compare match Vector Address\r
+.equ   OVF2addr=$004   ;Timer2 overflow Vector Address\r
+.equ   ICP1addr=$005   ;Timer1 Input Capture Vector Address\r
+.equ   OC1Aaddr=$006   ;Timer1 Output Compare A Interrupt Vector Address\r
+.equ   OC1Baddr=$007   ;Timer1 Output Compare B Interrupt Vector Address\r
+.equ   OVF1addr=$008   ;Overflow1 Interrupt Vector Address\r
+.equ   OVF0addr=$009   ;Overflow0 Interrupt Vector Address\r
+.equ   SPIaddr =$00A   ;SPI Interrupt Vector Address\r
+.equ   URXCaddr=$00B   ;UART Receive Complete Interrupt Vector Address\r
+.equ   UDREaddr=$00C   ;UART Data Register Empty Interrupt Vector Address\r
+.equ   UTXCaddr=$00D   ;UART Transmit Complete Interrupt Vector Address\r
+.equ   ADCCaddr=$00E   ;ADC Conversion Complete Interrupt Vector Address\r
+.equ   ERDYaddr=$00F   ;EEPROM Write Complete Interrupt Vector Address\r
+.equ   ACIaddr =$010   ;Analog Comparator Interrupt Vector Address
\ No newline at end of file
diff --git a/src/avr/7segv0.asm b/src/avr/7segv0.asm
new file mode 100644 (file)
index 0000000..5925c3c
--- /dev/null
@@ -0,0 +1,592 @@
+;      7SEGV0.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "8535DEF.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.DEF   SR              =R1             ; GLOBAL REGISTERS\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.DSEG\r
+FREQ1:         .BYTE   1\r
+TIME1:         .BYTE   1\r
+DIG5:          .BYTE   1\r
+DIG4:          .BYTE   1\r
+DIG3:          .BYTE   1\r
+DIG2:          .BYTE   1\r
+DIG1:          .BYTE   1\r
+BUF1:          .BYTE   1\r
+BUF2:          .BYTE   1\r
+BUF3:          .BYTE   1\r
+BUF4:          .BYTE   1\r
+BUF5:          .BYTE   1\r
+PNT:           .BYTE   1\r
+ZSW:           .BYTE   1\r
+LOW_BAT_LO:    .BYTE   1\r
+LOW_BAT_HI:    .BYTE   1\r
+ALERT:         .BYTE   1\r
+BSAV:          .BYTE   1\r
+\r
+;----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+       RJMP    RESET_ENTRY\r
+.ORG   OVF0addr\r
+       RJMP    BKPLN126\r
+.ORG   URXCaddr\r
+       RJMP    GETDAT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       LDI     A,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,A\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A\r
+\r
+       LDI     A,$80                   ; POWER DOWN ANALOG COMPARATOR\r
+       OUT     ACSR,A\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       LDI     A,20                    ; INITIALISE TONE TIMES\r
+       STS     FREQ1,A\r
+       LDI     A,115\r
+       STS     TIME1,A\r
+       LDI     A,0B01111110            ; PRELOAD HELLO ONTO DIGITS\r
+       STS     DIG5,A\r
+       LDI     A,0B01110000\r
+       STS     DIG4,A\r
+       LDI     A,0B01110000\r
+       STS     DIG3,A\r
+       LDI     A,0B11110010\r
+       STS     DIG2,A\r
+       LDI     A,0B11101100\r
+       STS     DIG1,A\r
+\r
+       CLR     A\r
+       STS     LOW_BAT_LO,A            ; CLR LOWBATT COUNTERS\r
+       STS     LOW_BAT_HI,A\r
+\r
+       LDI     A,$07\r
+       OUT     ADMUX,A                 ; SELECT VBAT\r
+       LDI     A,$D6\r
+       OUT     ADCSR,A                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       SBI     DDRA,0\r
+       SBI     DDRA,1\r
+       SBI     DDRA,2\r
+       SBI     DDRA,3\r
+       SBI     DDRA,4\r
+       SBI     DDRA,5\r
+       SBI     DDRA,6\r
+       CBI     DDRA,7\r
+       CBI     DDRD,2\r
+       SBI     PORTD,2\r
+       SBI     DDRD,4\r
+       SBI     DDRD,5\r
+       SBI     DDRD,6\r
+       SBI     DDRD,7\r
+       SBI     DDRC,0\r
+       SBI     DDRC,1\r
+       SBI     DDRC,2\r
+       SBI     DDRC,3\r
+       SBI     DDRC,4\r
+       SBI     DDRC,5\r
+       SBI     DDRB,0\r
+       SBI     DDRB,1\r
+       SBI     DDRB,2\r
+       SBI     DDRB,3\r
+       SBI     DDRB,4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       LDI     A,TER_RATE\r
+       OUT     UBRR,A                  ; SET BAUD RATE 9600\r
+       LDI     A,$98\r
+       OUT     UCR,A                   ; ENABLE TX, AND RX WITH INTERRUPTS\r
+\r
+       CLR     B\r
+       STS     BUF1,B\r
+       STS     BUF2,B\r
+       STS     BUF3,B\r
+       STS     BUF4,B\r
+       STS     BUF5,B\r
+       STS     BSAV,B                  ; CURSOR POSITION FOR DISPLAY DATA\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       LDI     A,$05\r
+       OUT     TCCR0,A                 ; 1024 PRESCALE EQU TO 93 US\r
+       LDI     A,-150\r
+       OUT     TCNT0,A                 ; 93 US * 150 = 14 MS\r
+       LDI     A,$01\r
+       OUT     TIMSK,A\r
+       SEI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       RCALL   TONE\r
+\r
+MAIN_LOOP:\r
+       LDS     A,ALERT                 ; CHECK LOW BATT STATUS\r
+       SBRC    A,0\r
+       RCALL   TONEL\r
+       CLR     A\r
+       STS     ALERT,A                 ; CLR LOW BATT STATUS\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+GETDAT:\r
+       IN      SR,SREG\r
+       PUSH    A\r
+       PUSH    B\r
+\r
+       LDS     B,BSAV                  ; CURSOR POSITION FOR DISPLAY DATA\r
+\r
+       IN      A,UDR                   ; READ UART DATA REGISTER\r
+       CPI     A,'0'                   ; FILTER FOR CORRECT ACII DIGIT\r
+       BREQ    DGSQ0\r
+       CPI     A,'1'\r
+       BREQ    DGSQ1\r
+       CPI     A,'2'\r
+       BREQ    DGSQ2\r
+       CPI     A,'3'\r
+       BREQ    DGSQ3\r
+       CPI     A,'4'\r
+       BREQ    DGSQ4\r
+       CPI     A,'5'\r
+       BREQ    DGSQ5\r
+       CPI     A,'6'\r
+       BREQ    DGSQ6\r
+       CPI     A,'7'\r
+       BREQ    DGSQ7\r
+       CPI     A,'8'\r
+       BREQ    DGSQ8\r
+       CPI     A,'9'\r
+       BREQ    DGSQ9\r
+       CPI     A,$2E\r
+       BREQ    DOT\r
+       CPI     A,'C'\r
+       BREQ    DGSQC\r
+       CPI     A,'E'\r
+       BREQ    DGSQE\r
+       CPI     A,'H'\r
+       BREQ    DGSQH\r
+       CPI     A,'L'\r
+       BREQ    DGSQL\r
+       CPI     A,'O'\r
+       BREQ    DGSQ0\r
+       CPI     A,'U'\r
+       BREQ    DGSQU\r
+       CPI     A,'o'\r
+       BREQ    DGSQo\r
+       CPI     A,'r'\r
+       BREQ    DGSQr\r
+       CPI     A,'-'\r
+       BREQ    DGSQY\r
+\r
+       CPI     A,$0D\r
+       BRNE    NOT_TERMINATOR\r
+       RJMP    TERMINATOR\r
+\r
+NOT_TERMINATOR:\r
+       SUBI    A,' '\r
+       BREQ    GO_L113                 ; SPACE CHARACTER\r
+       BRLO    CONTROL_CHAR            ; CONTROL CHARACTER\r
+       LDI     A,0B00010000            ; UNDERLINE CHARACTER\r
+GO_L113:\r
+       RJMP    L113\r
+\r
+DGSQ0: LDI     A,0B01111110            ; ASCII TO 7SEG TRANSLATION\r
+       RJMP    L113\r
+DGSQ1: LDI     A,0B00001100\r
+       RJMP    L113\r
+DGSQ2: LDI     A,0B10110110\r
+       RJMP    L113\r
+DGSQ3: LDI     A,0B10011110\r
+       RJMP    L113\r
+DGSQ4: LDI     A,0B11001100\r
+       RJMP    L113\r
+DGSQ5: LDI     A,0B11011010\r
+       RJMP    L113\r
+DGSQ6: LDI     A,0B11111010\r
+       RJMP    L113\r
+DGSQ7: LDI     A,0B00001110\r
+       RJMP    L113\r
+DGSQ8: LDI     A,0B11111110\r
+       RJMP    L113\r
+DGSQ9: LDI     A,0B11011110\r
+       RJMP    L113\r
+DGSQC: LDI     A,0B01110010\r
+       RJMP    L113\r
+DGSQE: LDI     A,0B11110010\r
+       RJMP    L113\r
+DGSQH: LDI     A,0B11101100\r
+       RJMP    L113\r
+DGSQL: LDI     A,0B01110000\r
+       RJMP    L113\r
+DGSQU: LDI     A,0B01111100\r
+       RJMP    L113\r
+DGSQo: LDI     A,0B10111000\r
+       RJMP    L113\r
+DGSQr: LDI     A,0B10100000\r
+       RJMP    L113\r
+DGSQY: LDI     A,0B10000000\r
+       RJMP    L113\r
+DOT:   LDS     A,PNT\r
+       ORI     A,$01\r
+       RJMP    L114\r
+\r
+L113:  STS     PNT,A                   ; STORE LAST DIGIT FOR DOT APPEND\r
+       INC     B\r
+L114:  CPI     B,1\r
+       BREQ    L191\r
+       CPI     B,2\r
+       BREQ    L192\r
+       CPI     B,3\r
+       BREQ    L193\r
+       CPI     B,4\r
+       BREQ    L194\r
+       CPI     B,5\r
+       BREQ    L195\r
+CONTROL_CHAR:\r
+       RJMP    GETDAT_DONE\r
+\r
+L191:  STS     BUF1,A\r
+       RJMP    GETDAT_SAVE\r
+L192:  STS     BUF2,A\r
+       RJMP    GETDAT_SAVE\r
+L193:  STS     BUF3,A\r
+       RJMP    GETDAT_SAVE\r
+L194:  STS     BUF4,A\r
+       RJMP    GETDAT_SAVE\r
+L195:  STS     BUF5,A\r
+       RJMP    GETDAT_SAVE\r
+\r
+TERMINATOR:\r
+       LDS     A,BUF1\r
+       STS     DIG1,A\r
+       LDS     A,BUF2\r
+       STS     DIG2,A\r
+       LDS     A,BUF3\r
+       STS     DIG3,A\r
+       LDS     A,BUF4\r
+       STS     DIG4,A\r
+       LDS     A,BUF5\r
+       STS     DIG5,A\r
+\r
+       CLR     B\r
+       STS     BUF1,B\r
+       STS     BUF2,B\r
+       STS     BUF3,B\r
+       STS     BUF4,B\r
+       STS     BUF5,B\r
+GETDAT_SAVE:\r
+       STS     BSAV,B                  ; CURSOR POSITION FOR DISPLAY DATA\r
+\r
+GETDAT_DONE:\r
+       POP     B\r
+       POP     A\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BKPLN126:                              ; BACKPLANE INTERUPT ROUTINE\r
+       IN      SR,SREG\r
+       PUSH    A                       ; SAVE VALUE\r
+       PUSH    B\r
+\r
+       LDI     A,-150\r
+       OUT     TCNT0,A                 ; 93 US * 150 = 14 MS\r
+\r
+       SBIS    PORTC,4                 ; BACKPLANE TOGGLE\r
+       RJMP    KEY_TEST\r
+\r
+       ; INVERT BACKPLANE\r
+       CBI     PORTC,4\r
+       RJMP    WLD\r
+\r
+KEY_TEST:\r
+       ; TEST KEY EVERY 2ND TIME ONLY, FOR EXTRA DEBOUNCE DELAY\r
+       IN      A,PIND\r
+       LDS     B,ZSW                   ; B.2 = PREVIOUS KEY HOLD STATUS\r
+       STS     ZSW,A                   ; A.2 = KEY HOLD STATUS (0 = HELD)\r
+       COM     B\r
+       OR      A,B                     ; A.2 = KEY MAKE STATUS (0 = MAKE)\r
+\r
+       SBRC    A,2\r
+       RJMP    KEY_DONE                ; NO VALID KEY MAKE DETECTED\r
+\r
+       LDI     A,$1B\r
+       OUT     UDR,A\r
+       LDI     A,'Z'\r
+       OUT     UDR,A\r
+\r
+KEY_DONE:\r
+       ; INVERT BACKPLANE\r
+       SBI     PORTC,4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WLD:   LDS     A,DIG5                  ; SET UP DIG5 ROUTINE\r
+       ANDI    A,$0E                   ; MASK ALL BUT B0,1,2\r
+       LSR     A\r
+       MOV     D,A\r
+       IN      F,PORTA\r
+       ANDI    F,$F8                   ; MASK PORTA B0,1,2\r
+       OR      D,F                     ; READ PORTA,CHANGE ONLY B0,1,2\r
+       SBIS    PORTC,4                 ; CHECK BACKPLANE POLARITY\r
+       RJMP    L126\r
+       LDI     A,$07\r
+       EOR     D,A                     ; INVERT D FOR OUTPUT\r
+L126:  OUT     PORTA,D\r
+\r
+       LDS     A,DIG5\r
+       ANDI    A,$F0\r
+       MOV     D,A\r
+       IN      F,PORTD\r
+       ANDI    F,$0F\r
+       OR      D,F\r
+       SBIS    PORTC,4\r
+       RJMP    L144\r
+       LDI     A,$F0\r
+       EOR     D,A\r
+L144:  OUT     PORTD,D\r
+\r
+       LDS     A,DIG5                  ; MASK FOR B0\r
+       LSL     A                       ; POSITION BIT TO C5 POSITION\r
+       ANDI    A,$02\r
+       SWAP    A\r
+       MOV     D,A\r
+       IN      F,PORTC\r
+       ANDI    F,$DF\r
+       OR      D,F\r
+       SBIS    PORTC,4\r
+       RJMP    L159\r
+       LDI     A,$20\r
+       EOR     D,A\r
+L159:  OUT     PORTC,D\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       LDS     A,DIG3                  ; DIG3 ROUTINE LOWER SEGS\r
+       ANDI    A,$0F                   ; MASK ALL BUT B0,1,2,3\r
+       MOV     D,A\r
+       IN      F,PORTC\r
+       ANDI    F,$F0                   ; MASK PORTC B0,1,2,3\r
+       OR      D,F                     ; READ PORTA,CHANGE ONLY B0,1,2,3\r
+       SBIS    PORTC,4\r
+       RJMP    L179\r
+       LDI     A,$0F\r
+       EOR     D,A                     ; INVERT REG D FOR OUTPUT\r
+L179:  SBI     PORTA,4\r
+       OUT     PORTC,D\r
+\r
+       LDI     A,$60\r
+       IN      F,PORTA\r
+       OR      A,F\r
+       LDS     A,DIG3                  ; DIG3 ROUTINE HIGHER SEGS\r
+       SWAP    A\r
+       ANDI    A,$0F                   ; READ TOP 4 BITS\r
+       MOV     D,A\r
+       IN      F,PORTB\r
+       ANDI    F,$F0\r
+       OR      D,F\r
+       SBIS    PORTC,4\r
+       RJMP    L199\r
+       LDI     A,$0F\r
+       EOR     D,A\r
+L199:  OUT     PORTB,D\r
+\r
+       CBI     PORTA,4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       LDS     A,DIG2                  ; DIG2 ROUTINE LOWER SEGS\r
+       ANDI    A,$0F                   ; MASK ALL BUT B0,1,2,3\r
+       MOV     D,A\r
+       IN      F,PORTC\r
+       ANDI    F,$F0                   ; MASK PORTC B0,1,2,3\r
+       OR      D,F                     ; READ PORTA,CHANGE ONLY B0,1,2,3\r
+       SBIS    PORTC,4\r
+       RJMP    L215\r
+       LDI     A,$0F\r
+       EOR     D,A                     ; COMP REG D FOR OUTPUT\r
+L215:  SBI     PORTA,5\r
+       OUT     PORTC,D\r
+\r
+       LDI     A,$60\r
+       IN      F,PORTA\r
+       OR      A,F\r
+       LDS     A,DIG2                  ; DIG2 ROUTINE HIGHER SEGS\r
+       SWAP    A\r
+       ANDI    A,$0F                   ; READ TOP 4 BITS\r
+       MOV     D,A\r
+       IN      F,PORTB\r
+       ANDI    F,$F0\r
+       OR      D,F\r
+       SBIS    PORTC,4\r
+       RJMP    L235\r
+       LDI     A,$0F\r
+       EOR     D,A\r
+\r
+L235:  OUT     PORTB,D\r
+       CBI     PORTA,5\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       LDS     A,DIG1                  ; DIG1 ROUTINE LOWER SEGS\r
+       ANDI    A,$0F                   ; MASK ALL BUT B0,1,2,3\r
+       MOV     D,A\r
+       IN      F,PORTC\r
+       ANDI    F,$F0                   ; MASK PORTC B0,1,2,3\r
+       OR      D,F                     ; READ PORTA,CHANGE ONLY B0,1,2,3\r
+       SBIS    PORTC,4\r
+       RJMP    L251\r
+       LDI     A,$0F\r
+       EOR     D,A                     ; COMP REG D FOR OUTPUT\r
+L251:  SBI     PORTA,6\r
+       OUT     PORTC,D\r
+\r
+       LDI     A,$60\r
+       IN      F,PORTA\r
+       OR      A,F\r
+       LDS     A,DIG1                  ; DIG1 ROUTINE HIGHER SEGS\r
+       SWAP    A\r
+       ANDI    A,$0F                   ; READ TOP 4 BITS\r
+       MOV     D,A\r
+       IN      F,PORTB\r
+       ANDI    F,$F0\r
+       OR      D,F\r
+       SBIS    PORTC,4\r
+       RJMP    L271\r
+       LDI     A,$0F\r
+       EOR     D,A\r
+\r
+L271:  OUT     PORTB,D\r
+       CBI     PORTA,6\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       LDS     A,DIG4                  ; DIG4 ROUTINE\r
+       ANDI    A,$0F                   ; MASK ALL BUT B0,1,2,3\r
+       MOV     D,A\r
+       IN      F,PORTC\r
+       ANDI    F,$F0                   ; MASK PORTC B0,1,2,3\r
+       OR      D,F                     ; READ PORTA,CHANGE ONLY B0,1,2,3\r
+       SBIS    PORTC,4\r
+       RJMP    L285\r
+       LDI     A,$0F\r
+       EOR     D,A                     ; COMP REG D FOR OUTPUT\r
+\r
+L285:  OUT     PORTC,D\r
+       LDS     A,DIG4\r
+       SWAP    A\r
+       ANDI    A,$0F                   ; READ TOP 4 BITS\r
+       MOV     D,A\r
+       IN      F,PORTB\r
+       ANDI    F,$F0\r
+       OR      D,F\r
+       SBIS    PORTC,4\r
+       RJMP    L298\r
+       LDI     A,$0F\r
+       EOR     D,A\r
+L298:  OUT     PORTB,D\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; FIX THIS !\r
+       ;RCALL  LOW_BAT_TEST            ; CHECK LOW CONDITION\r
+\r
+       POP     B\r
+       POP     A\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TONEL: LDI     A,115\r
+       STS     TIME1,A\r
+       LDI     A,20\r
+       STS     FREQ1,A\r
+TONE:\r
+       LDS     E,TIME1\r
+\r
+TGGL1: SBI     PORTA,3                 ; TOGGLE OUTPUT PORTS A&B\r
+       CBI     PORTB,4\r
+       RJMP    L51\r
+TGGL2: SBI     PORTB,4                 ; TOGGLE OUTPUT PORTS A&B\r
+       CBI     PORTA,3\r
+\r
+L51:   LDS     B,FREQ1                 ; 1ST FREQ MULTIP DELAY LOOP\r
+DELAY: LDI     A,255                   ; 1ST FREQ DELAY LOOP\r
+DLY:   DEC     A\r
+       BRNE    DLY\r
+       DEC     B\r
+       DEC     B\r
+       BRMI    ENDFQ\r
+       BRNE    DELAY\r
+       SBIC    PORTA,3\r
+       RJMP    TGGL2\r
+       DEC     E\r
+       BREQ    TME\r
+       RJMP    TGGL1\r
+\r
+TME:   LDS     B,FREQ1\r
+       SUBI    B,4\r
+       STS     FREQ1,B\r
+       RJMP    TONE\r
+\r
+ENDFQ: CBI     PORTA,3\r
+       CBI     PORTB,4\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOW_BAT_TEST:\r
+       ; DIAGNOSTIC ADC DATA OUTPUT\r
+       IN      B,ADCL\r
+       IN      A,ADCH\r
+       OUT     UDR,B\r
+       OUT     UDR,A\r
+\r
+       LDI     A,$D6\r
+       OUT     ADCSR,A                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       LDS     A,LOW_BAT_LO\r
+       INC     A\r
+       STS     LOW_BAT_LO,A\r
+       BRNE    POP\r
+       LDS     A,LOW_BAT_HI\r
+       INC     A\r
+       ANDI    A,3\r
+       STS     LOW_BAT_HI,A\r
+       BRNE    POP\r
+\r
+       LDI     A,1\r
+       STS     ALERT,A\r
+POP:   RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/8535def.inc b/src/avr/8535def.inc
new file mode 100644 (file)
index 0000000..56dbae5
--- /dev/null
@@ -0,0 +1,366 @@
+;***************************************************************************\r
+;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y\r
+;* \r
+;* Number              :AVR000\r
+;* File Name           :"8535def.inc"\r
+;* Title               :Register/Bit Definitions for the AT90S8535\r
+;* Date                 :98.05.22\r
+;* Version              :1.22\r
+;* Support telephone   :+47 72 88 43 88 (ATMEL Norway)\r
+;* Support fax         :+47 72 88 43 99 (ATMEL Norway)\r
+;* Support E-mail      :avr@atmel.com\r
+;* Target MCU          :AT90S8535\r
+;*\r
+;* DESCRIPTION\r
+;* When including this file in the assembly program file, all I/O register     \r
+;* names and I/O register bit names appearing in the data book can be used.\r
+;* In addition, the six registers forming the three data pointers X, Y and\r
+;* Z have been assigned names XL - ZH. Highest RAM address for Internal \r
+;* SRAM is also defined \r
+;*\r
+;* The Register names are represented by their hexadecimal address.\r
+;* \r
+;* The Register Bit names are represented by their bit number (0-7).\r
+;* \r
+;* Please observe the difference in using the bit names with instructions\r
+;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" \r
+;* (skip if bit in register set/cleared). The following example illustrates\r
+;* this:\r
+;* \r
+;* in  r16,PORTB               ;read PORTB latch\r
+;* sbr r16,(1<<PB6)+(1<<PB5)   ;set PB6 and PB5 (use masks, not bit#)\r
+;* out  PORTB,r16              ;output to PORTB\r
+;*\r
+;* in  r16,TIFR                ;read the Timer Interrupt Flag Register\r
+;* sbrc        r16,TOV0                ;test the overflow flag (use bit#)\r
+;* rjmp        TOV0_is_set             ;jump if set\r
+;* ...                         ;otherwise do something else\r
+;***************************************************************************\r
+\r
+;***** Specify Device\r
+.device AT90S8535\r
+\r
+;***** I/O Register Definitions\r
+.equ   SREG    =$3f\r
+.equ   SPH     =$3e\r
+.equ   SPL     =$3d\r
+.equ   GIMSK   =$3b\r
+.equ   GIFR    =$3a\r
+.equ   TIMSK   =$39\r
+.equ   TIFR    =$38\r
+\r
+.equ   MCUCR   =$35\r
+.equ   MCUSR   =$34\r
+\r
+.equ   TCCR0   =$33\r
+.equ   TCNT0   =$32\r
+\r
+.equ   TCCR1A  =$2f\r
+.equ   TCCR1B  =$2e\r
+.equ   TCNT1H  =$2d\r
+.equ   TCNT1L  =$2c\r
+.equ   OCR1AH  =$2b\r
+.equ   OCR1AL  =$2a\r
+.equ   OCR1BH  =$29\r
+.equ   OCR1BL  =$28\r
+.equ   ICR1H   =$27\r
+.equ   ICR1L   =$26\r
+\r
+.equ   TCCR2   =$25\r
+.equ   TCNT2   =$24\r
+.equ   OCR2    =$23\r
+.equ   ASSR    =$22\r
+\r
+.equ   WDTCR   =$21\r
+.equ   EEARH   =$1f\r
+.equ   EEARL   =$1e\r
+.equ   EEDR    =$1d\r
+.equ   EECR    =$1c\r
+.equ   PORTA   =$1b\r
+.equ   DDRA    =$1a\r
+.equ   PINA    =$19\r
+.equ   PORTB   =$18\r
+.equ   DDRB    =$17\r
+.equ   PINB    =$16\r
+.equ   PORTC   =$15\r
+.equ   DDRC    =$14\r
+.equ   PINC    =$13\r
+.equ   PORTD   =$12\r
+.equ   DDRD    =$11\r
+.equ   PIND    =$10\r
+.equ   SPDR    =$0f\r
+.equ   SPSR    =$0e\r
+.equ   SPCR    =$0d\r
+.equ   UDR     =$0c\r
+.equ   USR     =$0b\r
+.equ   UCR     =$0a\r
+.equ   UBRR    =$09\r
+.equ   ACSR    =$08\r
+.equ    ADMUX   =$07\r
+.equ    ADCSR   =$06\r
+.equ    ADCH    =$05\r
+.equ    ADCL    =$04\r
+\r
+\r
+;***** Bit Definitions\r
+\r
+.equ   EXTRF   =1\r
+.equ   PORF    =0\r
+\r
+.equ   INT1    =7\r
+.equ   INT0    =6\r
+\r
+.equ   INTF1   =7\r
+.equ   INTF0   =6\r
+\r
+.equ   OCIE2   =7\r
+.equ   TOIE2   =6\r
+.equ   TICIE1  =5\r
+.equ   OCIE1A  =4\r
+.equ   OCIE1B  =3\r
+.equ   TOIE1   =2\r
+.equ   TOIE0   =0\r
+\r
+.equ   OCF2    =7\r
+.equ   TOV2    =6\r
+.equ   ICF1    =5\r
+.equ   OCF1A   =4\r
+.equ   OCF1B   =3\r
+.equ   TOV1    =2\r
+.equ   TOV0    =0\r
+\r
+.equ   SE      =6\r
+.equ   SM1     =5\r
+.equ   SM0     =4\r
+.equ   ISC11   =3\r
+.equ   ISC10   =2\r
+.equ   ISC01   =1\r
+.equ   ISC00   =0\r
+\r
+.equ   CS02    =2\r
+.equ   CS01    =1\r
+.equ   CS00    =0\r
+\r
+.equ   COM1A1  =7\r
+.equ   COM1A0  =6\r
+.equ   COM1B1  =5\r
+.equ   COM1B0  =4\r
+.equ   PWM11   =1\r
+.equ   PWM10   =0\r
+\r
+.equ   ICNC1   =7\r
+.equ   ICES1   =6\r
+.equ   CTC1    =3\r
+.equ   CS12    =2\r
+.equ   CS11    =1\r
+.equ   CS10    =0\r
+\r
+.equ   PWM2    =6\r
+.equ   COM21   =5\r
+.equ   COM20   =4\r
+.equ   CTC2    =3\r
+.equ   CS22    =2\r
+.equ   CS21    =1\r
+.equ   CS20    =0\r
+\r
+.equ   AS2     =3\r
+.equ   TCN2UB  =2\r
+.equ   OCR2UB  =1\r
+.equ   TCR2UB  =0\r
+\r
+.equ   WDDE    =4\r
+.equ   WDE     =3\r
+.equ   WDP2    =2\r
+.equ   WDP1    =1\r
+.equ   WDP0    =0\r
+\r
+.equ   EERIE   =3\r
+.equ   EEMWE   =2\r
+.equ   EEWE    =1\r
+.equ   EERE    =0\r
+\r
+.equ   PA7     =7\r
+.equ   PA6     =6\r
+.equ   PA5     =5\r
+.equ   PA4     =4\r
+.equ   PA3     =3\r
+.equ   PA2     =2\r
+.equ   PA1     =1\r
+.equ   PA0     =0\r
+\r
+.equ   DDA7    =7\r
+.equ   DDA6    =6\r
+.equ   DDA5    =5\r
+.equ   DDA4    =4\r
+.equ   DDA3    =3\r
+.equ   DDA2    =2\r
+.equ   DDA1    =1\r
+.equ   DDA0    =0\r
+\r
+.equ   PINA7   =7\r
+.equ   PINA6   =6\r
+.equ   PINA5   =5\r
+.equ   PINA4   =4\r
+.equ   PINA3   =3\r
+.equ   PINA2   =2\r
+.equ   PINA1   =1\r
+.equ   PINA0   =0\r
+\r
+.equ   PB7     =7\r
+.equ   PB6     =6\r
+.equ   PB5     =5\r
+.equ   PB4     =4\r
+.equ   PB3     =3\r
+.equ   PB2     =2\r
+.equ   PB1     =1\r
+.equ   PB0     =0\r
+\r
+.equ   DDB7    =7\r
+.equ   DDB6    =6\r
+.equ   DDB5    =5\r
+.equ   DDB4    =4\r
+.equ   DDB3    =3\r
+.equ   DDB2    =2\r
+.equ   DDB1    =1\r
+.equ   DDB0    =0\r
+\r
+.equ   PINB7   =7\r
+.equ   PINB6   =6\r
+.equ   PINB5   =5\r
+.equ   PINB4   =4\r
+.equ   PINB3   =3\r
+.equ   PINB2   =2\r
+.equ   PINB1   =1\r
+.equ   PINB0   =0\r
+\r
+.equ   PC7     =7\r
+.equ   PC6     =6\r
+.equ   PC5     =5\r
+.equ   PC4     =4\r
+.equ   PC3     =3\r
+.equ   PC2     =2\r
+.equ   PC1     =1\r
+.equ   PC0     =0\r
+\r
+.equ   DDC7    =7\r
+.equ   DDC6    =6\r
+.equ   DDC5    =5\r
+.equ   DDC4    =4\r
+.equ   DDC3    =3\r
+.equ   DDC2    =2\r
+.equ   DDC1    =1\r
+.equ   DDC0    =0\r
+\r
+.equ   PINC7   =7\r
+.equ   PINC6   =6\r
+.equ   PINC5   =5\r
+.equ   PINC4   =4\r
+.equ   PINC3   =3\r
+.equ   PINC2   =2\r
+.equ   PINC1   =1\r
+.equ   PINC0   =0\r
+\r
+.equ   PD7     =7\r
+.equ   PD6     =6\r
+.equ   PD5     =5\r
+.equ   PD4     =4\r
+.equ   PD3     =3\r
+.equ   PD2     =2\r
+.equ   PD1     =1\r
+.equ   PD0     =0\r
+\r
+.equ   DDD7    =7\r
+.equ   DDD6    =6\r
+.equ   DDD5    =5\r
+.equ   DDD4    =4\r
+.equ   DDD3    =3\r
+.equ   DDD2    =2\r
+.equ   DDD1    =1\r
+.equ   DDD0    =0\r
+\r
+.equ   PIND7   =7\r
+.equ   PIND6   =6\r
+.equ   PIND5   =5\r
+.equ   PIND4   =4\r
+.equ   PIND3   =3\r
+.equ   PIND2   =2\r
+.equ   PIND1   =1\r
+.equ   PIND0   =0\r
+\r
+.equ   SPIE    =7\r
+.equ   SPE     =6\r
+.equ   DORD    =5\r
+.equ   MSTR    =4\r
+.equ   CPOL    =3\r
+.equ   CPHA    =2\r
+.equ   SPR1    =1\r
+.equ   SPR0    =0\r
+\r
+.equ   SPIF    =7\r
+.equ   WCOL    =6\r
+\r
+.equ   RXC     =7\r
+.equ   TXC     =6\r
+.equ   UDRE    =5\r
+.equ   FE      =4\r
+; removed for AVRA / TAVRASM:\r
+;.equ  OR      =3\r
+\r
+.equ   RXCIE   =7\r
+.equ   TXCIE   =6\r
+.equ   UDRIE   =5\r
+.equ   RXEN    =4\r
+.equ   TXEN    =3\r
+.equ   CHR9    =2\r
+.equ   RXB8    =1\r
+.equ   TXB8    =0\r
+\r
+.equ   ACD     =7\r
+.equ   ACO     =5\r
+.equ   ACI     =4\r
+.equ   ACIE    =3\r
+.equ   ACIC    =2\r
+.equ   ACIS1   =1\r
+.equ   ACIS0   =0\r
+\r
+.equ   MUX2    =2\r
+.equ   MUX1    =1\r
+.equ   MUX0    =0\r
+\r
+.equ   ADEN    =7\r
+.equ   ADSC    =6\r
+.equ   ADFR    =5\r
+.equ   ADIF    =4\r
+.equ   ADIE    =3\r
+.equ   ADPS2   =2\r
+.equ   ADPS1   =1\r
+.equ   ADPS0   =0\r
+\r
+.def   XL      =r26\r
+.def   XH      =r27\r
+.def   YL      =r28\r
+.def   YH      =r29\r
+.def   ZL      =r30\r
+.def   ZH      =r31\r
+\r
+.equ   RAMEND  =$25F   ;Last On-Chip SRAM location\r
+.equ   XRAMEND =$25F\r
+.equ   E2END   =$1FF\r
+.equ   FLASHEND=$FFF\r
+\r
+.equ   INT0addr=$001   ;External Interrupt0 Vector Address\r
+.equ   INT1addr=$002   ;External Interrupt1 Vector Address\r
+.equ   OC2addr =$003   ;Timer2 compare match Vector Address\r
+.equ   OVF2addr=$004   ;Timer2 overflow Vector Address\r
+.equ   ICP1addr=$005   ;Timer1 Input Capture Vector Address\r
+.equ   OC1Aaddr=$006   ;Timer1 Output Compare A Interrupt Vector Address\r
+.equ   OC1Baddr=$007   ;Timer1 Output Compare B Interrupt Vector Address\r
+.equ   OVF1addr=$008   ;Overflow1 Interrupt Vector Address\r
+.equ   OVF0addr=$009   ;Overflow0 Interrupt Vector Address\r
+.equ   SPIaddr =$00A   ;SPI Interrupt Vector Address\r
+.equ   URXCaddr=$00B   ;UART Receive Complete Interrupt Vector Address\r
+.equ   UDREaddr=$00C   ;UART Data Register Empty Interrupt Vector Address\r
+.equ   UTXCaddr=$00D   ;UART Transmit Complete Interrupt Vector Address\r
+.equ   ADCCaddr=$00E   ;ADC Conversion Complete Interrupt Vector Address\r
+.equ   ERDYaddr=$00F   ;EEPROM Write Complete Interrupt Vector Address\r
+.equ   ACIaddr =$010   ;Analog Comparator Interrupt Vector Address
\ No newline at end of file
diff --git a/src/avr/8x10.asm b/src/avr/8x10.asm
new file mode 100644 (file)
index 0000000..0322188
--- /dev/null
@@ -0,0 +1,98 @@
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; 20  \r
+       .DB     $00,$18,$18,$18,$18,$18,$00,$18,$00,$00 ; 21 !\r
+       .DB     $00,$E7,$63,$C6,$00,$00,$00,$00,$00,$00 ; 22 "\r
+       .DB     $00,$66,$66,$FF,$66,$FF,$66,$66,$00,$00 ; 23 #\r
+       .DB     $18,$7E,$DB,$D8,$7E,$1B,$DB,$7E,$18,$00 ; 24 $\r
+       .DB     $00,$E3,$E6,$0C,$18,$30,$67,$C7,$00,$00 ; 25 %\r
+       .DB     $00,$78,$CC,$D8,$73,$DE,$CC,$7B,$00,$00 ; 26 &\r
+       .DB     $00,$3C,$0C,$18,$00,$00,$00,$00,$00,$00 ; 27 '\r
+       .DB     $00,$0C,$18,$30,$30,$30,$18,$0C,$00,$00 ; 28 (\r
+       .DB     $00,$30,$18,$0C,$0C,$0C,$18,$30,$00,$00 ; 29 )\r
+       .DB     $00,$18,$DB,$7E,$3C,$7E,$DB,$18,$00,$00 ; 2A *\r
+       .DB     $00,$00,$18,$18,$FF,$18,$18,$00,$00,$00 ; 2B +\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$0C,$18,$00 ; 2C ,\r
+       .DB     $00,$00,$00,$00,$FF,$00,$00,$00,$00,$00 ; 2D -\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$3C,$00,$00 ; 2E .\r
+       .DB     $00,$03,$06,$0C,$18,$30,$60,$C0,$00,$00 ; 2F /\r
+       .DB     $00,$7E,$C7,$CF,$DB,$F3,$E3,$7E,$00,$00 ; 30 0\r
+       .DB     $00,$0C,$1C,$3C,$0C,$0C,$0C,$0C,$00,$00 ; 31 1\r
+       .DB     $00,$7E,$C3,$03,$0E,$38,$60,$FF,$00,$00 ; 32 2\r
+       .DB     $00,$7E,$C3,$03,$3E,$03,$C3,$7E,$00,$00 ; 33 3\r
+       .DB     $00,$1C,$3C,$6C,$CC,$FF,$0C,$0C,$00,$00 ; 34 4\r
+       .DB     $00,$FF,$C0,$FE,$03,$03,$C3,$7E,$00,$00 ; 35 5\r
+       .DB     $00,$3E,$60,$C0,$FE,$C3,$C3,$7E,$00,$00 ; 36 6\r
+       .DB     $00,$FF,$03,$06,$0C,$18,$18,$18,$00,$00 ; 37 7\r
+       .DB     $00,$7E,$C3,$C3,$7E,$C3,$C3,$7E,$00,$00 ; 38 8\r
+       .DB     $00,$7E,$C3,$C3,$7F,$03,$06,$7C,$00,$00 ; 39 9\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$3C,$00,$00,$00 ; 3A :\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$0C,$18,$00,$00 ; 3B ;\r
+       .DB     $00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00 ; 3C <\r
+       .DB     $00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00 ; 3D =\r
+       .DB     $00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00 ; 3E >\r
+       .DB     $00,$7E,$C3,$03,$0E,$18,$00,$18,$00,$00 ; 3F ?\r
+       .DB     $00,$7E,$C3,$DB,$DB,$DF,$C0,$7C,$00,$00 ; 40 @\r
+       .DB     $00,$3C,$66,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 41 A\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C3,$C3,$FE,$00,$00 ; 42 B\r
+       .DB     $00,$7E,$C3,$C0,$C0,$C0,$C3,$7E,$00,$00 ; 43 C\r
+       .DB     $00,$FC,$C6,$C3,$C3,$C3,$C6,$FC,$00,$00 ; 44 D\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$FF,$00,$00 ; 45 E\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$C0,$00,$00 ; 46 F\r
+       .DB     $00,$7E,$C3,$C0,$C0,$CF,$C3,$7F,$00,$00 ; 47 G\r
+       .DB     $00,$C3,$C3,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 48 H\r
+       .DB     $00,$18,$18,$18,$18,$18,$18,$18,$00,$00 ; 49 I\r
+       .DB     $00,$03,$03,$03,$03,$03,$C3,$7E,$00,$00 ; 4A J\r
+       .DB     $00,$C3,$C6,$CC,$F8,$CC,$C6,$C3,$00,$00 ; 4B K\r
+       .DB     $00,$C0,$C0,$C0,$C0,$C0,$C0,$FF,$00,$00 ; 4C L\r
+       .DB     $00,$C3,$E7,$FF,$DB,$C3,$C3,$C3,$00,$00 ; 4D M\r
+       .DB     $00,$C3,$E3,$F3,$DB,$CF,$C7,$C3,$00,$00 ; 4E N\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 4F O\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C0,$C0,$C0,$00,$00 ; 50 P\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$CF,$7E,$03,$00 ; 51 Q\r
+       .DB     $00,$FE,$C3,$C3,$FE,$CC,$C6,$C3,$00,$00 ; 52 R\r
+       .DB     $00,$7E,$C3,$C0,$7E,$03,$C3,$7E,$00,$00 ; 53 S\r
+       .DB     $00,$FF,$18,$18,$18,$18,$18,$18,$00,$00 ; 54 T\r
+       .DB     $00,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 55 U\r
+       .DB     $00,$C3,$C3,$C3,$C3,$66,$3C,$18,$00,$00 ; 56 V\r
+       .DB     $00,$C3,$C3,$C3,$C3,$DB,$FF,$66,$00,$00 ; 57 W\r
+       .DB     $00,$C3,$66,$3C,$18,$3C,$66,$C3,$00,$00 ; 58 X\r
+       .DB     $00,$C3,$C3,$66,$3C,$18,$18,$18,$00,$00 ; 59 Y\r
+       .DB     $00,$FF,$06,$0C,$18,$30,$60,$FF,$00,$00 ; 5A Z\r
+       .DB     $00,$3C,$30,$30,$30,$30,$30,$3C,$00,$00 ; 5B [\r
+       .DB     $00,$C0,$60,$30,$18,$0C,$06,$03,$00,$00 ; 5C \\r
+       .DB     $00,$3C,$0C,$0C,$0C,$0C,$0C,$3C,$00,$00 ; 5D ]\r
+       .DB     $18,$3C,$66,$C3,$00,$00,$00,$00,$00,$00 ; 5E ^\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00 ; 5F _\r
+       .DB     $0C,$18,$1E,$00,$00,$00,$00,$00,$00,$00 ; 60 `\r
+       .DB     $00,$00,$00,$7E,$03,$7F,$C3,$7F,$00,$00 ; 61 a\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$FE,$00,$00 ; 62 b\r
+       .DB     $00,$00,$00,$7E,$C3,$C0,$C3,$7E,$00,$00 ; 63 c\r
+       .DB     $00,$03,$03,$7F,$C3,$C3,$C3,$7F,$00,$00 ; 64 d\r
+       .DB     $00,$00,$00,$7E,$C3,$FF,$C0,$7E,$00,$00 ; 65 e\r
+       .DB     $00,$1E,$33,$30,$FC,$30,$30,$30,$00,$00 ; 66 f\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$7E ; 67 g\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 68 h\r
+       .DB     $00,$18,$00,$18,$18,$18,$18,$18,$00,$00 ; 69 i\r
+       .DB     $00,$06,$00,$06,$06,$06,$06,$06,$06,$7C ; 6A j\r
+       .DB     $00,$C0,$C0,$C6,$CC,$F8,$CC,$C6,$00,$00 ; 6B k\r
+       .DB     $00,$30,$30,$30,$30,$30,$30,$1C,$00,$00 ; 6C l\r
+       .DB     $00,$00,$00,$FE,$DB,$DB,$DB,$DB,$00,$00 ; 6D m\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 6E n\r
+       .DB     $00,$00,$00,$7E,$C3,$C3,$C3,$7E,$00,$00 ; 6F o\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$FE,$C0,$C0 ; 70 p\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$03 ; 71 q\r
+       .DB     $00,$00,$00,$FE,$C3,$C0,$C0,$C0,$00,$00 ; 72 r\r
+       .DB     $00,$00,$00,$7E,$C0,$7E,$03,$7E,$00,$00 ; 73 s\r
+       .DB     $00,$18,$18,$7E,$18,$18,$18,$0E,$00,$00 ; 74 t\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$00,$00 ; 75 u\r
+       .DB     $00,$00,$00,$C3,$C3,$66,$3C,$18,$00,$00 ; 76 v\r
+       .DB     $00,$00,$00,$C3,$C3,$DB,$FF,$66,$00,$00 ; 77 w\r
+       .DB     $00,$00,$00,$C3,$66,$3C,$66,$C3,$00,$00 ; 78 x\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$03,$7E ; 79 y\r
+       .DB     $00,$00,$00,$FF,$0C,$18,$30,$FF,$00,$00 ; 7A z\r
+       .DB     $00,$0E,$18,$18,$70,$18,$18,$0E,$00,$00 ; 7B {\r
+       .DB     $00,$18,$18,$18,$00,$18,$18,$18,$00,$00 ; 7C |\r
+       .DB     $00,$70,$18,$18,$0E,$18,$18,$70,$00,$00 ; 7D }\r
+       .DB     $00,$76,$DC,$00,$00,$00,$00,$00,$00,$00 ; 7E ~\r
+       .DB     $00,$00,$00,$18,$3C,$66,$C3,$FF,$00,$00 ; 7F \7f\r
+\r
diff --git a/src/avr/CFLASHV0.HEX b/src/avr/CFLASHV0.HEX
new file mode 100644 (file)
index 0000000..30751b3
--- /dev/null
@@ -0,0 +1,76 @@
+:020000020000FC\r
+:02000000C7C077\r
+:02000C0004C02E\r
+:1000100071C05BC0ACC0FFB67460FFBE1895A895F8\r
+:1000200072FF23C07B7FEE2019F0EA94F1F4DEC06A\r
+:10003000DA9409F4726017E0A5D107FF04C070FDDF\r
+:1000400072607E7F07C070FD05C082D18AD111F435\r
+:1000500093D1736071FF09C0042D003430F4DD24A6\r
+:100060007D7F072F017000631BD02220C1F2EE209C\r
+:1000700011F005E1E02ECF93DF93C12DC056DD27AF\r
+:100080000881F8942A941394CFE11C227894DF918C\r
+:10009000CF9108950F93A895042D0034E0F70F91A8\r
+:1000A000EE2021F00F9305E1E02E0F91CF93DF9327\r
+:1000B000DFB7F894C42DC30DDFBFCF73C05ADD275F\r
+:1000C00008834394DF91CF910895FFB64F934EEC90\r
+:1000D000742EEF93FF93E32DE05AFF274081FF91A9\r
+:1000E000EF914CB94A9433944FE334226A940AF066\r
+:1000F00046C04BC0FFB64F934EEC742E4CB15C998A\r
+:1001000038C057FC26C056FC08C0473029F445E0EB\r
+:1001100049B9539A40E4542A38C0642E40E2421947\r
+:100120000AF44FE7662012F4442D40684CB9461596\r
+:1001300008F4642E462D4F7739F040EC542A6A9427\r
+:1001400022F55798559A21C04FEB5422569A5E9A41\r
+:100150001CC0EF93FF93E22DE10DEF71E056FF27F6\r
+:100160004083FF91EF9123946A947AF40CC0FFB618\r
+:100170004F9353984FE849B94FEB54227724559841\r
+:100180005698579A4CB14FE754224F91FFBE18959D\r
+:100190000FED0DBF00E808B9A8950FE001BD929AD8\r
+:1001A0008A9A939A8B9AAC9AA49AAD9AA59AB89A7D\r
+:1001B000B99ABA9AA89AA99AAA9AAB9A949A959A2D\r
+:1001C000969A979A0FE809B900E90AB933244424AA\r
+:1001D00011242224552466247724772705E1D02E84\r
+:1001E00005E003BF22E028BF29BF78940FED0DBFC3\r
+:1001F000EE2415DF0B3109F0FBCF05E1E02E0FDF18\r
+:10020000093439F0043499F0023521F1073581F7CA\r
+:1002100045C09ED0A6D031F4AFD00BE13BDF09E45E\r
+:1002200039DFE6CF0BE136DF09E634DFE1CF00E06E\r
+:1002300016E0C7D00CEE17E0C4D093D031F40BE138\r
+:1002400029DF04E427DF2FEF14C00BE123DF04E6EE\r
+:1002500021DFCECF51D0E3DE0213CACF68D000E257\r
+:1002600017E0AFD07ED081F40BE114DF02E512DF9E\r
+:1002700051D0E0E0F2E010E085D0201B0BDF319799\r
+:10028000D1F7022F07DFB4CF0BE104DF02E702DF73\r
+:1002900041D000E0FFDE022FFDDEAACF2DD047D0F7\r
+:1002A00000E317E08ED05DD079F7EFEFF1E0B7DE35\r
+:1002B000201B10E086D03197D1F7B1DE201B102F24\r
+:1002C000AEDE02137E7F021391CF012F10E079D0B2\r
+:1002D00048D041F40BE1DEDE07E5DCDE1BD0022F67\r
+:1002E000D9DE86CF0BE1D6DE07E7D4DE13D000E0FF\r
+:1002F000D1DE022FCFDE7CCF2FEF91DE201BA02F8F\r
+:100300008EDE201BB02F8BDE201BC02F88DE201B33\r
+:10031000D02F08950A2F2FEF201BBCDE0B2F201BA0\r
+:10032000B9DE0C2F201BB6DE0D2F201BB3CE01E053\r
+:1003300012E047D00A2F13E044D00B2F14E041D035\r
+:100340000C2F15E03ED00D2F0F70006E16E039C057\r
+:100350000EE016E065D000E00A95F1F70AE016E03D\r
+:100360005FC0E0E0F0E017E00DD007FF02C031977A\r
+:10037000D1F7007C0034089501E011E022D00FEEA7\r
+:1003800017E01FC018BB1FE215BB000000000000F3\r
+:100390000000000000000000000014EF12BB00008D\r
+:1003A000000000000000000000000000000003B397\r
+:1003B00010B301270F7001271CEF12BB1FE315BB01\r
+:1003C000089518BB102F1F70106215BB1FE314BBDC\r
+:1003D000102F107F1C6012BB1CEF11BB000000002F\r
+:1003E00000000000000000000000000092980000E3\r
+:1003F0000000000000000000000000000000929AD1\r
+:1004000000000000000000000000000000000000EC\r
+:1004100012BB1CE011BB1FE315BB10E314BB089516\r
+:1004200018BB102F1F70106115BB1FE314BB102FDA\r
+:10043000107F1C6012BB1CEF11BB0000000000000D\r
+:100440000000000000000000000092980000000082\r
+:10045000000000000000000000000000929A000070\r
+:10046000000000000000000000000000000012BBBF\r
+:0E0470001CE011BB1FE315BB10E314BB089585\r
+:0620000006410742B2ACEC\r
+:00000001FF\r
diff --git a/src/avr/CFLASHV1.HEX b/src/avr/CFLASHV1.HEX
new file mode 100644 (file)
index 0000000..be960cc
--- /dev/null
@@ -0,0 +1,76 @@
+:020000020000FC\r
+:02000000C7C077\r
+:02000C0004C02E\r
+:1000100071C05BC0ACC0FFB67460FFBE1895A895F8\r
+:1000200072FF23C07B7FEE2019F0EA94F1F4DEC06A\r
+:10003000DA9409F4726017E0A5D107FF04C070FDDF\r
+:1000400072607E7F07C070FD05C082D18AD111F435\r
+:1000500093D1736071FF09C0042D003430F4DD24A6\r
+:100060007D7F072F017000631BD02220C1F2EE209C\r
+:1000700011F005E1E02ECF93DF93C12DC056DD27AF\r
+:100080000881F8942A941394CFE11C227894DF918C\r
+:10009000CF9108950F93A895042D0034E0F70F91A8\r
+:1000A000EE2021F00F9305E1E02E0F91CF93DF9327\r
+:1000B000DFB7F894C42DC30DDFBFCF73C05ADD275F\r
+:1000C00008834394DF91CF910895FFB64F934EEC90\r
+:1000D000742EEF93FF93E32DE05AFF274081FF91A9\r
+:1000E000EF914CB94A9433944FE334226A940AF066\r
+:1000F00046C04BC0FFB64F934EEC742E4CB15C998A\r
+:1001000038C057FC26C056FC08C0473029F445E0EB\r
+:1001100049B9539A40E4542A38C0642E40E2421947\r
+:100120000AF44FE7662012F4442D40684CB9461596\r
+:1001300008F4642E462D4F7739F040EC542A6A9427\r
+:1001400022F55798559A21C04FEB5422569A5E9A41\r
+:100150001CC0EF93FF93E22DE10DEF71E056FF27F6\r
+:100160004083FF91EF9123946A947AF40CC0FFB618\r
+:100170004F9353984FE849B94FEB54227724559841\r
+:100180005698579A4CB14FE754224F91FFBE18959D\r
+:100190000FED0DBF00E808B9A8950FE001BD929AD8\r
+:1001A0008A9A939A8B9AAC9AA49AAD9AA59AB89A7D\r
+:1001B000B99ABA9AA89AA99AAA9AAB9A949A959A2D\r
+:1001C000969A979A0FE809B900E90AB933244424AA\r
+:1001D00011242224552466247724772705E1D02E84\r
+:1001E00005E003BF22E028BF29BF78940FED0DBFC3\r
+:1001F000EE2415DF0B3109F0FBCF05E1E02E0FDF18\r
+:10020000093439F0043499F0023521F1073581F7CA\r
+:1002100045C09ED0A6D031F4AFD00BE13BDF09E45E\r
+:1002200039DFE6CF0BE136DF09E634DFE1CF00E06E\r
+:1002300016E0C7D00CEE17E0C4D093D031F40BE138\r
+:1002400029DF04E427DF2FEF14C00BE123DF04E6EE\r
+:1002500021DFCECF51D0E3DE0213CACF68D000E257\r
+:1002600017E0AFD07ED081F40BE114DF02E512DF9E\r
+:1002700051D0E0E0F2E010E085D0201B0BDF319799\r
+:10028000D1F7022F07DFB4CF0BE104DF02E702DF73\r
+:1002900041D000E0FFDE022FFDDEAACF2DD047D0F7\r
+:1002A00000E317E08ED05DD079F7EFEFF1E0B7DE35\r
+:1002B000201B10E086D03197D1F7B1DE201B102F24\r
+:1002C000AEDE02137E7F021391CF012F10E079D0B2\r
+:1002D00048D041F40BE1DEDE07E5DCDE1BD0022F67\r
+:1002E000D9DE86CF0BE1D6DE07E7D4DE13D000E0FF\r
+:1002F000D1DE022FCFDE7CCF2FEF91DE201BA02F8F\r
+:100300008EDE201BB02F8BDE201BC02F88DE201B33\r
+:10031000D02F08950A2F2FEF201BBCDE0B2F201BA0\r
+:10032000B9DE0C2F201BB6DE0D2F201BB3CE01E053\r
+:1003300012E047D00A2F13E044D00B2F14E041D035\r
+:100340000C2F15E03ED00D2F0F70006E16E039C057\r
+:100350000EE016E065D000E00A95F1F70AE016E03D\r
+:100360005FC0E0E0F0E017E00DD007FF02C031977A\r
+:10037000D1F7007C0034089501E011E022D00FEEA7\r
+:1003800017E01FC018BB1FE215BB000000000000F3\r
+:100390000000000000000000000014EF12BB00008D\r
+:1003A000000000000000000000000000000003B397\r
+:1003B00010B301270F7001271CEF12BB1FE315BB01\r
+:1003C000089518BB102F1F70106215BB1FE314BBDC\r
+:1003D000102F107F1C6012BB1CEF11BB000000002F\r
+:1003E00000000000000000000000000092980000E3\r
+:1003F0000000000000000000000000000000929AD1\r
+:1004000000000000000000000000000000000000EC\r
+:1004100012BB1CE011BB1FE315BB10E314BB089516\r
+:1004200018BB102F1F70106115BB1FE314BB102FDA\r
+:10043000107F1C6012BB1CEF11BB0000000000000D\r
+:100440000000000000000000000092980000000082\r
+:10045000000000000000000000000000929A000070\r
+:10046000000000000000000000000000000012BBBF\r
+:0E0470001CE011BB1FE315BB10E314BB089585\r
+:0620000006410742BAACE4\r
+:00000001FF\r
diff --git a/src/avr/CFLASHV2.HEX b/src/avr/CFLASHV2.HEX
new file mode 100644 (file)
index 0000000..a62f478
--- /dev/null
@@ -0,0 +1,76 @@
+:020000020000FC\r
+:02000000C7C077\r
+:02000C0004C02E\r
+:1000100071C05BC0ACC0FFB67460FFBE1895A895F8\r
+:1000200072FF23C07B7FEE2019F0EA94F1F4DEC06A\r
+:10003000DA9409F4726017E0A5D107FF04C070FDDF\r
+:1000400072607E7F07C070FD05C082D18AD111F435\r
+:1000500093D1736071FF09C0042D003430F4DD24A6\r
+:100060007D7F072F017000631BD02220C1F2EE209C\r
+:1000700011F005E1E02ECF93DF93C12DC056DD27AF\r
+:100080000881F8942A941394CFE11C227894DF918C\r
+:10009000CF9108950F93A895042D0034E0F70F91A8\r
+:1000A000EE2021F00F9305E1E02E0F91CF93DF9327\r
+:1000B000DFB7F894C42DC30DDFBFCF73C05ADD275F\r
+:1000C00008834394DF91CF910895FFB64F934EEC90\r
+:1000D000742EEF93FF93E32DE05AFF274081FF91A9\r
+:1000E000EF914CB94A9433944FE334226A940AF066\r
+:1000F00046C04BC0FFB64F934EEC742E4CB15C998A\r
+:1001000038C057FC26C056FC08C0473029F443E0ED\r
+:1001100049B9539A40E4542A38C0642E40E2421947\r
+:100120000AF44FE7662012F4442D40684CB9461596\r
+:1001300008F4642E462D4F7739F040EC542A6A9427\r
+:1001400022F55798559A21C04FEB5422569A5E9A41\r
+:100150001CC0EF93FF93E22DE10DEF71E056FF27F6\r
+:100160004083FF91EF9123946A947AF40CC0FFB618\r
+:100170004F9353984FE549B94FEB54227724559844\r
+:100180005698579A4CB14FE754224F91FFBE18959D\r
+:100190000FED0DBF00E808B9A8950FE001BD929AD8\r
+:1001A0008A9A939A8B9AAC9AA49AAD9AA59AB89A7D\r
+:1001B000B99ABA9AA89AA99AAA9AAB9A949A959A2D\r
+:1001C000969A979A0FE509B900E90AB933244424AD\r
+:1001D00011242224552466247724772705E1D02E84\r
+:1001E00005E003BF22E028BF29BF78940FED0DBFC3\r
+:1001F000EE2415DF0B3109F0FBCF05E1E02E0FDF18\r
+:10020000093439F0043499F0023521F1073581F7CA\r
+:1002100045C09ED0A6D031F4AFD00BE13BDF09E45E\r
+:1002200039DFE6CF0BE136DF09E634DFE1CF00E06E\r
+:1002300016E0C7D00CEE17E0C4D093D031F40BE138\r
+:1002400029DF04E427DF2FEF14C00BE123DF04E6EE\r
+:1002500021DFCECF51D0E3DE0213CACF68D000E257\r
+:1002600017E0AFD07ED081F40BE114DF02E512DF9E\r
+:1002700051D0E0E0F2E010E085D0201B0BDF319799\r
+:10028000D1F7022F07DFB4CF0BE104DF02E702DF73\r
+:1002900041D000E0FFDE022FFDDEAACF2DD047D0F7\r
+:1002A00000E317E08ED05DD079F7EFEFF1E0B7DE35\r
+:1002B000201B10E086D03197D1F7B1DE201B102F24\r
+:1002C000AEDE02137E7F021391CF012F10E079D0B2\r
+:1002D00048D041F40BE1DEDE07E5DCDE1BD0022F67\r
+:1002E000D9DE86CF0BE1D6DE07E7D4DE13D000E0FF\r
+:1002F000D1DE022FCFDE7CCF2FEF91DE201BA02F8F\r
+:100300008EDE201BB02F8BDE201BC02F88DE201B33\r
+:10031000D02F08950A2F2FEF201BBCDE0B2F201BA0\r
+:10032000B9DE0C2F201BB6DE0D2F201BB3CE01E053\r
+:1003300012E047D00A2F13E044D00B2F14E041D035\r
+:100340000C2F15E03ED00D2F0F70006E16E039C057\r
+:100350000EE016E065D000E00A95F1F70AE016E03D\r
+:100360005FC0E0E0F0E017E00DD007FF02C031977A\r
+:10037000D1F7007C0034089501E011E022D00FEEA7\r
+:1003800017E01FC018BB1FE215BB000000000000F3\r
+:100390000000000000000000000014EF12BB00008D\r
+:1003A000000000000000000000000000000003B397\r
+:1003B00010B301270F7001271CEF12BB1FE315BB01\r
+:1003C000089518BB102F1F70106215BB1FE314BBDC\r
+:1003D000102F107F1C6012BB1CEF11BB000000002F\r
+:1003E00000000000000000000000000092980000E3\r
+:1003F0000000000000000000000000000000929AD1\r
+:1004000000000000000000000000000000000000EC\r
+:1004100012BB1CE011BB1FE315BB10E314BB089516\r
+:1004200018BB102F1F70106115BB1FE314BB102FDA\r
+:10043000107F1C6012BB1CEF11BB0000000000000D\r
+:100440000000000000000000000092980000000082\r
+:10045000000000000000000000000000929A000070\r
+:10046000000000000000000000000000000012BBBF\r
+:0E0470001CE011BB1FE315BB10E314BB089585\r
+:0620000006410742B2ACEC\r
+:00000001FF\r
diff --git a/src/avr/CHSET00.WIN b/src/avr/CHSET00.WIN
new file mode 100644 (file)
index 0000000..2217627
Binary files /dev/null and b/src/avr/CHSET00.WIN differ
diff --git a/src/avr/CS64V4.HEX b/src/avr/CS64V4.HEX
new file mode 100644 (file)
index 0000000..e5b357b
--- /dev/null
@@ -0,0 +1,385 @@
+:020000020000FC\r
+:100000000DC087C387C3189518951895189518952E\r
+:1000100082C31895189527C711C762C702E00EBFA3\r
+:100020000FE50DBF10E818B9A8951FE011BD00E05D\r
+:1000300009BF0BBF08EF01BB08EB02BB0FE107BB19\r
+:100040000FEF0ABB04BB00270BBB03E008BB00E0BB\r
+:1000500005BB00E2B02E1FE519B910E91AB9442416\r
+:10006000552422243324EE246624CC24552750938F\r
+:100070000101509323015093430150934401509345\r
+:100080004501969AE0E0F0E0A8953197E9F7979856\r
+:1000900000E0B8D0B7D002E4B1D000E2B3D000E0C5\r
+:1000A000B1D003E4ABD000E8A9D000E9A7D000E0CC\r
+:1000B000A9D0A8D004E2A2D000EBA0D0E0E0F8E004\r
+:1000C00000E0A2D03197E1F702EB9AD008E996D090\r
+:1000D000979A789410E3B9D2CF93DF93C4D2BF91AB\r
+:1000E000AF911BD5212F1D2F12950DD31217B1F4EF\r
+:1000F000119613D5212F1D2F06D3121779F41196BF\r
+:100100000CD5212F1C2F1295FED2121739F41196FF\r
+:1001100004D5212F1C2FF7D2121749F1E6E7F2E19F\r
+:10012000A6E6B3E0D8E1D0930201C0D0D0E8C0E0A9\r
+:10013000DBBBC39AC398D0930101F89435B33C2735\r
+:1001400030783C27789435BBC8950BBAC29ABA98D8\r
+:10015000C1980000C19AC298BA9A119741F031969D\r
+:10016000C3951C2F1F7349F7C054D395E1CF20E1ED\r
+:100170002093F30020E22093F40028E12093F5007F\r
+:1001800021D6112710935101EE27FF271EEF109360\r
+:10019000FD001BEA1093FC0022E01BD21C7F109391\r
+:1001A000FE0023E016D21093FF001091FE00209174\r
+:1001B000FF001A380DEF200720F01B3A0FEF200741\r
+:1001C00030F01EEF1093FF0010E41093FE001EEFBE\r
+:1001D00019BD1BEA18BD1CEF1DBD1EEC1CBD10E5B2\r
+:1001E0001FBD11E01EBD00E003BF04E008BF09BF52\r
+:1001F0000AE005BF00EC0ABF0BBF92C219D006C0CF\r
+:1002000011D004C015D001C00DD0A8980BBB0000C0\r
+:1002100000000000F894C1980000000000007894ED\r
+:10022000C19A08950F930BD003FFFDCF0F9108954E\r
+:100230000F9305D000FD01FFFCCF0F910895A89A00\r
+:1002400000E00ABBF894C098000000000000000025\r
+:10025000C09A09B378940F930FEF0ABB0F910895DA\r
+:1002600002E00EBF0FE50DBF1FE7B122AF98C498A3\r
+:10027000409101014BBBC39AC39850E05FBD5EBD86\r
+:1002800094989598C298BA9A96989798C098C19859\r
+:100290005FEF5ABB50E05BBB50E059BF5BBF5FE113\r
+:1002A00051BD57E151BD5AE655BF889508957894E0\r
+:1002B0001FEDE12210E01EBB1FBB62D21B3129F1F2\r
+:1002C000B3FC0DC0103258F4183009F4FEC01D30D4\r
+:1002D00009F40DC11A3009F48BC0173041F7B2FC94\r
+:1002E00012C0103381F4C091F300D091F40020913A\r
+:1002F000F500CC5FDD4FF89435B320FB36F97894E8\r
+:1003000035BBF1D4102D72D2D2CF3AD21B3139F392\r
+:100310001E3209F475C11F3209F44FC01F3309F4AE\r
+:1003200084C1113409F4A6C0123409F427C213346D\r
+:1003300009F404C1133609F451C9143409F4EBC0AB\r
+:10034000153409F4D8C0163409F408C1163609F476\r
+:1003500051C9173409F49EC0183409F463C918361A\r
+:1003600009F454C91B3409F461C01C3409F4D4C124\r
+:100370001D3409F42BC01E3409F4FCC0103509F4F7\r
+:1003800097C0123509F4DCC0133509F4D2C0153515\r
+:1003900009F4F4C1163519F410E2E12AF7C0173553\r
+:1003A00009F4ECC1183509F4B8C11A3509F4E2C1F1\r
+:1003B000103310F01A3398F07ACFE2D110FF03C057\r
+:1003C00014E0B12A74CF1BEFB12271CFD9D1103311\r
+:1003D00021F4F89400E4B02A43CF69CFD1D135D1CC\r
+:1003E000C0E1C093F300D093F4002093F5005FCFF9\r
+:1003F00001D05DCF0F92C091F300D091F400209115\r
+:10040000F500DE5FC395F89435B320FB36F9789498\r
+:1004100035BB69D4182F100D100D1A95103418F033\r
+:10042000EED00F900895800D0F900895979800E0FA\r
+:10043000E9DEE8DE02E4E2DE00E2E4DE00E0E2DE45\r
+:1004400003E4DCDE00E8DADE00E9D8DE00E0DADE34\r
+:10045000D9DE04E2D3DE00EBD1DEE0E0F8E000E03C\r
+:10046000D3DE3197E1F702EBCBDE08E9C7DE979ADE\r
+:10047000A9D41DCF85D1117051F41FE7B122AF98D7\r
+:10048000C498409101014BBBC39AC39810CF10E8A8\r
+:10049000B12A0DCF75D1103309F404C0113309F41A\r
+:1004A00004C005CF07EFB02202CF08E0B02AFFCE8C\r
+:1004B00067D1103309F403C0113309F403C00FEE00\r
+:1004C000B022F5CE00E1B02AF2CEC091F300D09177\r
+:1004D000F4002091F500DE5FF89435B320FB36F987\r
+:1004E000789435BB00D470191FB712FFE0CE01D04D\r
+:1004F000DECE7727089544D111FD07C010FD03C05B\r
+:100500000FEDB022D4CE00E2B02A002700932301E1\r
+:1005100082D2F1F7CCCE34D1103309F404C01133B8\r
+:1005200009F404C0C4CE0EEFB022C1CE01E0B02A5F\r
+:10053000BECE26D1712F24D1812FB9CE02E0B02AB0\r
+:1005400070933401809335011BD11093360118D17B\r
+:1005500010933701E5D20DEFB022A9CE7093380188\r
+:10056000809339010DD110933A010AD110933B01C8\r
+:100570002CD39DCE709338018093390101D1109313\r
+:100580003A01FED010933B0145D391CEF9D010FF34\r
+:100590000BC01091FE002091FF001C5F2F4F1B3AF3\r
+:1005A0000FEF2007A8F40AC01091FE002091FF0071\r
+:1005B000145020401A380DEF200750F01093FE0021\r
+:1005C0002093FF0022E00DD01091FF0023E009D01E\r
+:1005D0006ECEE199FECF2EBB22272FBBE09A1DB332\r
+:1005E0000895E199FECFE5FEFFCF2EBB22272FBB5A\r
+:1005F0001DBBF894E5FEFFCFE29AE19A18951AC563\r
+:10060000BFD023D0BDD0A12FBBD0B12FB9D0F8948B\r
+:1006100035B320FB36F9789435BB80D221961197FB\r
+:100620001A2F1B2B09F0F2CF42CEAAD00ED01F9367\r
+:100630001AD01BE1C6D01FE3C4D01F91105DC1D0FA\r
+:100640001D2F5AD01C2F58D032CEC0E0D0E022E669\r
+:100650001F70163008F4210F2695D7952695D7954B\r
+:10066000D695D6950895A6E1B2E0AC0FBD1FF894DB\r
+:1006700035B320FB36F9789435BB4FD2E12F119674\r
+:100680004CD2F12FAC2FBD2F1496CFEFDFEF319767\r
+:10069000FF70349780F1319640D2119601E220E14B\r
+:1006A000D127CC0FDD1F10F4C027D227CC0FDD1FC0\r
+:1006B00010F4C027D227CC0FDD1F10F4C027D2279B\r
+:1006C000CC0FDD1F10F4C027D227CC0FDD1F10F494\r
+:1006D000C027D227CC0FDD1F10F4C027D227CC0FA4\r
+:1006E000DD1F10F4C027D227CC0FDD1F10F4C02768\r
+:1006F000D227319789F608951F93129504D061D0BF\r
+:100700001F9101D05EC01F7010631A3308F0195F8B\r
+:100710000895F7C3FFC307C4AAC432D010FD13C0A5\r
+:100720007093460180934701B09248011091F30005\r
+:10073000109349011091F40010934A011091F500B3\r
+:1007400010934B01B4CD709146018091470110EC9C\r
+:10075000B122109148011F73B12A109149011093E1\r
+:10076000F30010914A011093F40010914B01109383\r
+:10077000F5009DCD05D004D003D002D001D097CD97\r
+:1007800010EC10934401A89510E01EBB1FBB10ECA9\r
+:10079000809910934401B5FC3ED13320A1F310E0C1\r
+:1007A00010934401CF93DF93C22DC059DD271881E8\r
+:1007B000F8943A942394CFE72C227894DF91CF9148\r
+:1007C00008951F93A895152D1031E0F71F91CF9331\r
+:1007D000DF93DFB7F894C52DC40DDFBFCF70C05ACB\r
+:1007E000DD2718835394DF91CF91089578940027E3\r
+:1007F00000930001982E672F6AD26093F200A092B6\r
+:10080000F000C12FDD27CC0FDD1F1091F300C10FC9\r
+:100810001091F400D11F1091F50026D564D22196D5\r
+:10082000F02C61D2CF2DD02D1091F300C10F10917B\r
+:10083000F400D11F58D2802C1C2F2D2F219785FC1E\r
+:1008400007C0C091F300D091F400DE5F4CD21DC010\r
+:100850004AD2B4FC1AC0C091F300D091F400DE5F1C\r
+:10086000F02C41D20F1808F40024069400920001E5\r
+:10087000672F600D2CD26093F200A092F000C0911F\r
+:10088000F300D091F400DE5F2ED2B3FC1AC0072F24\r
+:10089000000D08F016C01F932F932BDEABDD0091E7\r
+:1008A0000001700F982E672F12D26093F200A09271\r
+:1008B000F00000910001701B1091F500D5D42F912C\r
+:1008C0001F91700D86FE05C0C12FD22F22970BD22B\r
+:1008D000900CC12FD22F219606D2702C0FEF0ABB9D\r
+:1008E000C09A0FE180228092F1000027801201C09F\r
+:1008F00087C0AA27B92DB695A795B695A795B05FDD\r
+:1009000007C09394A05CBF4F8090F100A090F000CE\r
+:10091000AA2A222721961091F500A6D4E4D1112706\r
+:100920006091F200662339F08894079417956A95D0\r
+:10093000E1F7022A212F08E1F89435B300FB36F9DC\r
+:10094000789435BBF89435B33A25307C3A257894C1\r
+:1009500035BB3B2F330F330FA7FA31F9A6FA30F925\r
+:100960003BBBF894C39AC398789430930101002755\r
+:100970000ABBF894C29ABA98C0980000C09A09B30A\r
+:100980000026B0FC002A0FEF0ABB0BBAC19800008A\r
+:10099000C19A7894C298BA9AA3948A9409F0BACF6B\r
+:1009A000222351F1F89435B33A25307C3A257894D6\r
+:1009B00035BB3B2F330F330FA7FA31F9A6FA30F9C5\r
+:1009C0003BBBF894C39AC3987894309301010027F5\r
+:1009D0000ABBF894C29ABA98C0980000C09A09B3AA\r
+:1009E0002027B0FC202B0FEF0ABB2BBBC1980000C7\r
+:1009F000C19A7894C298BA9A04D07A9409F081CFB7\r
+:100A00000895CF93DF93192D78D01881122B188376\r
+:100A1000DF91CF9108952F93CF93DF93109123010E\r
+:100A20006CD01881122309F45EC028812127288305\r
+:100A300010E010934401AF93BF93A3E0B1E0CC2743\r
+:100A4000D0912301D695C795D695C795D05F18E16B\r
+:100A50000BD42EE1F89435B33C27307C3C277894B6\r
+:100A600035BB3D2F330F330FC7FB31F9C6FB30F9D0\r
+:100A70003BBBF894C39AC398789430930101002744\r
+:100A80000ABBF894C29ABA98C0980000C09A19B3E9\r
+:100A90007894C298BA9A0FEF0ABB1D93C3952A9512\r
+:100AA00009F0D8CFBF91AF91CC27D0912301D69533\r
+:100AB000C795D695C795D695C79597980C2FA2DB65\r
+:100AC0000D2FA0DB04E29ADB00EB98DB2EE1C3E004\r
+:100AD000D1E0099199DB2A95E1F702EB91DB979A36\r
+:100AE00010EC109344011091230113951F73109380\r
+:100AF0002301DF91CF912F910895C4E2D1E0212FFE\r
+:100B0000269526952695C20F20E0D21F21E017706A\r
+:100B100019F0220F1A95E9F7089562C385C3C7CB70\r
+:100B200078949090350160913401D1D06093F200B7\r
+:100B3000A092F00070903701CC27D92DD695C7959B\r
+:100B4000D695C795D05F18E18FD307C0C05CDF4F43\r
+:100B500093946091F200A090F000AC2A1FEF809077\r
+:100B6000360100E0801641F008E08016B8F06623F8\r
+:100B700019F016956A95E9F7DAD008E01091F200BD\r
+:100B8000011B801AA3941FEF08E0801638F0B1F023\r
+:100B9000CED01FEF08E0801AA394F6CF882079F01A\r
+:100BA00016958A94E9F71095662341F02227169549\r
+:100BB00027956A95E1F7BBD0A394122FB8D021DF17\r
+:100BC0007A9400277012C2CF089500913A010A95D5\r
+:100BD0000230D0F300913B010330B0F300913801B3\r
+:100BE0000395009334010091390100933501809001\r
+:100BF0003A018A948A948092360101E00093370189\r
+:100C00008FDF009138010093340180903A01809287\r
+:100C100036013AC000913A010A950230A8F20091DB\r
+:100C20003B01033088F200913801039500933401B1\r
+:100C3000009139010093350180903A018A948A9499\r
+:100C40008092360101E0009337016ADF009138019C\r
+:100C500000933401009139010395009335017090A0\r
+:100C60003B017A947A947092370101E00093360147\r
+:100C700057DF80903A0100913801080D0A950093E2\r
+:100C8000340101E00093360100913901039500938E\r
+:100C9000350170903B017A947A947092370140DF6D\r
+:100CA0000091380103950093340180903A018A94B1\r
+:100CB0008A948092360170903B0100913901070DB2\r
+:100CC0000A950093350101E00093370129CFAA244A\r
+:100CD00000EFA01A67FFAA246F77685014F0A3945E\r
+:100CE000FCCF685F0895F89435B33C27307C3C27EF\r
+:100CF000789435BB3D2F330F330FC7FB31F9C6FB5B\r
+:100D000030F93BBBF894C39AC398789430930101AF\r
+:100D100000270ABBF894C29ABA98C0980000C09AFB\r
+:100D200009B27894C298BA9A0FEF0ABB0895F89462\r
+:100D300035B33A25307C3A25789435BB3D2F330FB7\r
+:100D4000330FA7FA31F9A6FA30F93BBBF894C39AEE\r
+:100D5000C39878943093010100270ABBF894C29A93\r
+:100D6000BA98C0980000C09AF9B27894C298BA9A1A\r
+:100D70000FEF0ABBB1FE03C01095F12203C0F126AC\r
+:100D8000B0FCF12AF89435B33A25307C3A257894B2\r
+:100D900035BB3D2F330F330FA7FA31F9A6FA30F9DF\r
+:100DA0003BBBF894C39AC398789430930101FBBA83\r
+:100DB000F894C29ABA98C1980000C19A7894C298DF\r
+:100DC000BA9A08959924C0E0D0E118E14DD2AA243E\r
+:100DD000A092F0001091F0001C2BF89435B331274D\r
+:100DE000307C3127789435BB3D2F330F330F17FB01\r
+:100DF00031F916FB30F93BBBF894C39AC398789449\r
+:100E00003093010100E00BBBF894C29ABA98C198E4\r
+:100E10000000C19A7894C298BA9AA39400E2A016EE\r
+:100E200019F0A092F000D6CFECDD9394C05CDF4FB8\r
+:100E3000D03209F0CCCF7727882708951FB60F93BB\r
+:100E40000FEDC02EEF93FF93E42DE05AFF270081B2\r
+:100E5000FF91EF910CB95A9443940FE040226A94A9\r
+:100E60000AF046C04BC01FB60F930FEDC02E0CB159\r
+:100E70005C9938C0E7FC26C0E6FC08C0033029F4C2\r
+:100E800003E009B9539A00E4E02A38C0602E00E874\r
+:100E900003190AF40FE7662012F4052D00680CB957\r
+:100EA000061508F4602E062D0F7739F000ECE02AC5\r
+:100EB0006A9422F55798559A21C00FEBE022569A72\r
+:100EC0005E9A1CC0EF93FF93E32DE20DEF77E0599C\r
+:100ED000FF270083FF91EF9133946A947AF40CC05A\r
+:100EE0001FB60F9353980FE509B90FEBE022CC24FE\r
+:100EF00055985698579A0CB10FE7E0220F911FBEF4\r
+:100F000018951FB68A9A4CB55DB55093FB00409377\r
+:100F1000FA008EC01FB68B9A4CB55DB55093F900A0\r
+:100F20004093F80085C01FB65AB35F935BB35F93DD\r
+:100F30005FEF5ABBB7FE14C0509151015395553223\r
+:100F400028F4523159F4AF98C49A03C0AF9AC498A8\r
+:100F500050E0409101014BBBC39AC398509351019B\r
+:100F600055B35F93509101015F9350914501505CDF\r
+:100F70005093450149F450914401539550934401D5\r
+:100F800019F45FEBB5226CC950EB5FBD4CB55DB594\r
+:100F9000485F5F4F5BBD4ABD59BD48BD8A9A929A72\r
+:100FA0008B9A939A8D9895985091FD004091FC00F2\r
+:100FB0008D9A859907C040389DEF59074AF04150F6\r
+:100FC000504006C0453D9FEF590712F44F5F5F4FF9\r
+:100FD0005093FD004093FC005BBD4ABD9091FE0024\r
+:100FE000491B9091FF00590B1AF445EF5FEF02C0C7\r
+:100FF00040E85DEF59BD48BD000000000000000062\r
+:10100000000000005DEF5DBD55E75CBD8A989298D9\r
+:101010008B98939850EE5FBD5F915BBBC39AC3986A\r
+:10102000509301015F9155BB5F915BBB5F915ABBD0\r
+:101030001FBE18959924C0E0D0E1A0E0B0E118E10E\r
+:1010400013D1A05CBF4F0A94E1F720E22F93C8D0E0\r
+:10105000EBD0A395C3952F912A9509F0F7CFD1DC5A\r
+:101060009394A0969096B03209F0EFCFB0CE88DB83\r
+:101070001F9386DB10934C0183DB1695169516950E\r
+:1010800009F410E210934F017BDB10935001172FEE\r
+:1010900016951695169510934D0180934E0118E103\r
+:1010A000E3D01F9110FD46C0CC27D0914E019D2E5C\r
+:1010B000D695C795D695C79510914D01C10FD05FB4\r
+:1010C0002091500110914C01121720F5211BAA27E5\r
+:1010D000B0914E01B10FB695A795B695A795109111\r
+:1010E0004D01A10FB05F2F93AF93BF93CF93DF93C9\r
+:1010F00020914F0168D085DCDF91CF91BF91AF91F6\r
+:101100002F919394A05CBF4FC05CDF4F2A9559F795\r
+:1011100020914C012F93CF93DF9320914F015AD010\r
+:1011200070DCDF91CF912F919394C05CDF4F2A95B3\r
+:1011300089F7F5CCCC27D0914E0100915001D00F0A\r
+:101140009D2ED695C795D695C79510914D01C10F87\r
+:10115000D05F202F10914C01121728F5211BAA27D0\r
+:10116000B0914E01B00FB11BB695A795B695A79556\r
+:1011700010914D01A10FB05F9A94A054B040C0549B\r
+:10118000D0402F93AF93BF93CF93DF9320914F0124\r
+:101190001AD037DCDF91CF91BF91AF912F912A9573\r
+:1011A00059F720914C019A94C054D0402F93CF937B\r
+:1011B000DF9320914F010ED024DCDF91CF912F914E\r
+:1011C0002A9589F7ACCC0CD011962ED021962A9571\r
+:1011D000D1F7089510E028D021962A95E1F70895D7\r
+:1011E000F89435B33A27307C3A27789435BB3B2FB7\r
+:1011F000330F330FA7FB31F9A6FB30F93BBBF89453\r
+:10120000C39AC39878943093010100270ABBF894DD\r
+:10121000C29ABA98C0980000C09A19B37894C2983C\r
+:10122000BA9A0FEF0ABB0895F89435B33C27307C87\r
+:101230003C27789435BB3D2F330F330FC7FB31F973\r
+:10124000C6FB30F93BBBF894C39AC39878943093AB\r
+:1012500001011BBBF894C29ABA98C1980000C19AC8\r
+:101260007894C298BA9A0895F89435B310FB36F979\r
+:10127000789435BB089546323444303331393033B5\r
+:101280003132313730394C034C034C034C034C039F\r
+:101290004C034C034C034C034C034C034C034C03D6\r
+:1012A0004C034C034C034C034C034C034C034C03C6\r
+:1012B0004C034C034C034C034C034C034C034C03B6\r
+:1012C0004C034C034C0300014C034C034C034C03F4\r
+:1012D0004C034C034C034C034C034C034C034C0396\r
+:1012E00003014C034C0306010F01180121012A01DF\r
+:1012F00033013C0145014E0157014C034C034C03A3\r
+:101300004C034C034C034C036001690172017B01E7\r
+:1013100084018D0196019F01A901B201BB01C401A5\r
+:10132000CD01D601DF01E801F101080211021A0224\r
+:1013300023022C0235023E02470250024C034C03AA\r
+:101340004C034C034C034C03590262026B027402BF\r
+:101350007D0286028F029902A302AD02B802C20288\r
+:10136000CB02D402DD02E602F002FC0203030C030E\r
+:1013700015031E0327033003390343034C034C03B7\r
+:101380004C034C034C030003066101F8010770880D\r
+:1013900098A8C888700107206020202020700107CD\r
+:1013A000708808102040F80107F810201008887095\r
+:1013B000010710305090F810100107F880F008086D\r
+:1013C00088700107304080F08888700107F80810A5\r
+:1013D000204040400107708888708888700107703D\r
+:1013E000888878081060010770888888F8888801E4\r
+:1013F00007F08888F08888F00107708880808088EE\r
+:10140000700107E09088888890E00107F88080F0FC\r
+:101410008080F80107F88080F08080800107708864\r
+:1014200080B88888780107888888F88888880221A9\r
+:10143000078080808080808001070808080808886D\r
+:101440007001078890A0C0A09088010780808080EC\r
+:101450008080F8010788D8A8A8888888010788882C\r
+:10146000C8A89888880107708888888888700107CC\r
+:10147000F08888F0808080010770888888A890684C\r
+:101480004C034C034C03060801014F0065030107A0\r
+:10149000F08888F0A09088010770888070088870B4\r
+:1014A0000107F820202020202001078888888888CC\r
+:1014B0008870010788888888885020010788888874\r
+:1014C000A8A8A8500107888850205088880107885C\r
+:1014D0008888502020200107F80810204080F8015B\r
+:1014E000070000700878887801078080F088888875\r
+:1014F000F00107000078808080780107080878886C\r
+:10150000888878010700007088F88070010718202B\r
+:10151000F8202020200108000078888878087001D1\r
+:10152000078080B0C888888802210780008080807A\r
+:101530008080052108100010101010906005210710\r
+:10154000808090A0C0A090032107C0404040404050\r
+:101550004001070000F0A8A8A8A801070000B0C833\r
+:10156000888888010700007088888870010800005A\r
+:10157000F08888F080800108000078888878080862\r
+:1015800002056105B0C0808080010700007880708E\r
+:1015900008F001072020F82020201801070000880B\r
+:1015A0008888986801070000888888502001070013\r
+:1015B000008888A8A85001070000885020508801A2\r
+:1015C00008000088888878087001070000F810205B\r
+:1015D00040F80107F8F8F8F8F8F8F80070933801C7\r
+:1015E00080933901CDD810933A01CAD810933B01AA\r
+:1015F00026D05DC67093380180933901C1D810930D\r
+:101600003A01BED810933B012FD051C670933401DC\r
+:1016100080933501B5D810933601B2D810933701B5\r
+:1016200078D045C67093340180933501A9D81093C2\r
+:101630003601A6D81093370171D039C608950091AC\r
+:101640003801009334010091390100933501009174\r
+:101650003A010093360100913B010093370102E00B\r
+:10166000B02A5EDA0DEFB02200913A010A950230FD\r
+:1016700028F300913B01033008F3009138010093F7\r
+:101680003401009139010093350100913A01009332\r
+:10169000360101E00093370143DA009138010093ED\r
+:1016A00034010091390103950093350100913B010C\r
+:1016B00002500093370101E00093360131DA809047\r
+:1016C0003A0100913801080D0A950093340101E0B8\r
+:1016D0000093360100913901039500933501009183\r
+:1016E0003B010250009337011BDA0091380100934F\r
+:1016F000340100913A010093360170903B01009152\r
+:101700003901070D0A950093350101E00093370177\r
+:1017100007CA02E0B02A04DA0DEFB0227894909064\r
+:10172000350160913401D3DA6093F200A092F000A9\r
+:1017300070903701CC27D92D15E5D0FF1AEA012E7C\r
+:10174000D695C795D695C795D05F18E18DDD07C0B2\r
+:10175000C05CDF4F93946091F200A090F000AC2A3F\r
+:101760001FEF8090360100E0801641F008E08016FF\r
+:10177000C8F0662319F016956A95E9F71021D7DAB3\r
+:1017800008E01091F200011B801AA3941FEF08E0FB\r
+:10179000801640F0C1F01021CADA1FEF08E0801A6D\r
+:1017A000A394F5CF882089F016958A94E9F71095CF\r
+:1017B000662349F02227169527956A95E1F71021AF\r
+:1017C000B6DAA394122F1021B2DA00941AD97A94BF\r
+:0817D00000277012BDCF08953F\r
+:0220000003419A\r
+:00000001FF\r
diff --git a/src/avr/CS64V5.ASM b/src/avr/CS64V5.ASM
new file mode 100644 (file)
index 0000000..813e935
--- /dev/null
@@ -0,0 +1,3077 @@
+;      CS64V5.ASM\r
+\r
+;      01FEB02 REVISE FOR 7.3728MHz XTAL\r
+;      22NOV01 REVISE FOR OPERATION FROM VCC INSTEAD OF VBAT\r
+;              INVERT SENSE OF SRAM CHIP SELECT\r
+;              STILL NEED TO REMOVE VCC COMPENSATION CODE\r
+\r
+;      22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;              TO WORK WITH REV E PARTS\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     XPAGE,YH\r
+       RCALL   ADRYP                   ; AND SET XPAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+; THIS WILL CORRUPT BACKLIGHT\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0\r
+       ANDI    R19,$80\r
+       EOR     R19,@0\r
+       SEI\r
+       OUT     PORTC,R19\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       SEI\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV          ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @0,1                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @0,0                    ; A14\r
+       BLD     R19,6 ;0\r
+       SEI\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV  ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @1,7                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,6 ;0\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =-818 ;$FB35\r
+.EQU   T1_FULL_SCALE   =-651 ;$FC2F\r
+\r
+.EQU   VEE_MIN         =-640 ;$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         = -43 ;$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =-341 ;$FE00\r
+\r
+.EQU   CONTRAST_LONG   =-640 ;$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  = -11 ;$FFF0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =-341 ;$FE00\r
+\r
+.EQU   VCC_NOMINAL     =-536 ;$FCDC\r
+\r
+; WITH VCC = $FCDC FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FD18 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FD78 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FD48\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+.EQU   CONTRAST_MIN    =-630 ;$FC80 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    = -85 ;$FF80 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =-448 ;$FD60\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$61000 ;$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$62000 ;$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$40\r
+.EQU   CHARACTER_SETS  =6\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$10\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+.EQU   API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$17 ;$5F       ; DIVISOR FOR 19200 BPS\r
+.EQU   API_RATE_FAST   =$00 ;$03       ; DIVISOR FOR 460800 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   PATTERN         =R0             ; FOR HALFTONE_RECT ROUTINE\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF    BOXSIZEX       =R7             ; ASSIGNED TWICE\r
+.DEF    BOXSIZEY       =R8             ; ASSIGNED TWICE\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   0=BACKLIGHT INVERSION OFF       1=BACKLIGHT INVERSION ON\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+LATCH11_SAV:   .BYTE   1\r
+XPAGE:         .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+; MUST CONVERT TO USE DRAW_CHAR_TTY ROUTINE\r
+;CHAR_X:       .BYTE   1\r
+;CHAR_Y:       .BYTE   1\r
+;CHAR_PTR:     .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   2\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+BACKLIGHT_COUNT: .BYTE 1\r
+\r
+AVECNT:                .BYTE   1\r
+AVEVCC:                .BYTE   1\r
+AVEVCCL:       .BYTE   1\r
+AVEVCCH:       .BYTE   1\r
+AVEVEE:                .BYTE   1\r
+AVEVEEL:       .BYTE   1\r
+AVEVEEH:       .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RETI                            ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_TIM1_OVF\r
+       RETI                            ; TIM0_OVF\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+RESTART_ENTRY:\r
+       LDI     F,$00\r
+       OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+       OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+\r
+       LDI     F,$F8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       LDI     F,$B8 ;$F8\r
+       OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+;      LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+       LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+       OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+\r
+       LDI     F,$00\r
+       OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+\r
+       LDI     F,$20 ;$A0 NO BACKLIGHT INVERSION INITIALLY\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ON\r
+\r
+       INIT_API_BUS\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT+1,D         ; KLUDGE FOR EXTRA 2 BITS OF RESOLUTION\r
+\r
+       ; INITIALISE T6963C DISPLAY CONTROLLER\r
+       SBI     PORTD,6                 ; COME OUT OF RESET\r
+\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+RESET_DELAY:\r
+       WDR                             ; 10OCT02 RESET WATCHDOG\r
+       SBIW    ZL,1\r
+       BRNE    RESET_DELAY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOP:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+;      LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((CHSET00)*2)     ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((CHSET00)*2)    ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+;      LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDI     XL,LOW((CHSET00_END-CHSET00)*2) ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((CHSET00_END-CHSET00)*2)        ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET XPAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+       ; ADRL MACRO WILL CORRUPT BACKLIGHT\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       CLR     A\r
+       STS     BACKLIGHT_COUNT,A       ; ENSURE BACKLIGHT COUNT IS IN RANGE\r
+\r
+       CLR     ZL\r
+       CLR     ZH                      ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$04 ;$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_COMMAND:\r
+       RCALL   WAIT_STATUS             ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+WRITE_COMMAND_AUTO:\r
+       RCALL   WAIT_AUTO               ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+\r
+WRITE_DATA:\r
+       RCALL   WAIT_STATUS\r
+       RJMP    WRITE_DATA_ENTRY\r
+WRITE_DATA_AUTO:\r
+       RCALL   WAIT_AUTO\r
+WRITE_DATA_ENTRY:\r
+       CBI     PORTC,0                 ; C/D = 0\r
+WRITE_ENTRY:\r
+       OUT     PORTA,F\r
+       NOP\r
+       NOP\r
+       NOP\r
+       CLI\r
+       CBI     PORTB,1                 ; WR = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SEI\r
+       SBI     PORTB,1                 ; WR = 1\r
+       RET\r
+\r
+WAIT_AUTO:\r
+       PUSH    F\r
+WAIT_AUTO_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRS    F,3\r
+       RJMP    WAIT_AUTO_LOOP\r
+       POP     F\r
+       RET\r
+\r
+WAIT_STATUS:\r
+       PUSH    F\r
+WAIT_STATUS_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRC    F,0\r
+       SBRS    F,1\r
+       RJMP    WAIT_STATUS_LOOP\r
+       POP     F\r
+       RET\r
+\r
+READ_STATUS:\r
+       SBI     PORTC,0                 ; C/D = 1\r
+       LDI     F,0\r
+       OUT     DDRA,F                  ; D0-D7 = INPUTS\r
+       CLI\r
+       CBI     PORTB,0                 ; RD = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SBI     PORTB,0                 ; RD = 1\r
+       IN      F,PINA                  ; READ DATA BEFORE RD COMES UP\r
+       SEI\r
+       PUSH    F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; D0-D7 = OUTPUTS\r
+       POP     F\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       CBI     PORTD,4                 ; TURN TRANSISTOR ON (PULL DOWN VSWT)\r
+       CBI     PORTD,5                 ; TURN OFF VEE MEASURING\r
+\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP (SRAM SELECT = 1)\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       CBI     PORTD,6                 ; T6963C RESET = 0\r
+       CBI     PORTD,7                 ; T6963C SELECT = 0\r
+       CBI     PORTB,0                 ; RD = 0\r
+       CBI     PORTB,1                 ; WR = 0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; D0-D7 = OUTPUTS\r
+       LDI     D,0\r
+       OUT     PORTA,D                 ; D0-D7 = 0\r
+\r
+       LDI     D,0 ;$40\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 0 / 1 INTERRUPTS\r
+\r
+       ;LDI    D,0\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+;      LDI     F,$18\r
+;      STS     TURNON_COUNT,F          ; .1 SECOND TO BREAK, .2 SECOND TO MAKE\r
+;\r
+;      SEI\r
+;\r
+;SLEEP_LOOP:\r
+;      SLEEP\r
+;\r
+;      LDS     F,TURNON_COUNT\r
+;      TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+;      BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+;\r
+;      CLI\r
+;      RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$6A\r
+       OUT     MCUCR,D                 ; SE=0 SM1:SM0=10 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP:\r
+;      LDS     YH,XPAGE                ; SET XPAGE ADDRESS FOR DSPRAM\r
+;      LDS     YL,LATCH10_SAV\r
+;      ANDI    YL,$E0\r
+;      OR      YH,YL\r
+;      OUT     PORTA,YH\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,XPAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     XPAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+       CPI     A,$0A\r
+       RJEQ    LF\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'A'\r
+       RJEQ    SET_BACKLIGHT\r
+       CPI     A,'B'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'c'\r
+       RJEQ    GET_CLEAR_FRAME_RECT_SIZE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'f'\r
+       RJEQ    GET_FRAME_RECT_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'H'\r
+       RJEQ    GET_HALFTONE_RECT_SIZE\r
+       CPI     A,'h'\r
+       RJEQ    GET_CLEAR_HALFTONE_RECT_SIZE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+;      OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+;\r
+;      LDI     F,$F8                   ; INIT_PORTS\r
+;      OUT     DDRD,F\r
+;      LDI     F,$B8 ;$F8\r
+;      OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+;      LDI     F,$1F\r
+;      OUT     DDRB,F\r
+;      LDI     F,$FF\r
+;      OUT     DDRA,F\r
+;      OUT     DDRC,F\r
+;\r
+;      CLR     F\r
+;      OUT     PORTA,F\r
+;\r
+;;     LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+;;     LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+; IN F,PORTB\r
+; ANDI F,$10 ; PRESERVE B4 FOR BACKLIGHT\r
+; ORI F,$03 ; CS, RD, WR HI, LEs ALL LO\r
+;      OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+;\r
+;;     LDI     F,$00\r
+; IN F,PORTC\r
+; ANDI F,$80 ; PRESERVE C7 FOR BACKLIGHT\r
+;      OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+; CBI PORTD,6 ; SEE OUT PORTD,F ABOVE\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYX:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYX\r
+;\r
+;      ; INITIALISE T6963C DISPLAY CONTROLLER\r
+;      SBI     PORTD,6                 ; COME OUT OF RESET\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYY:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOPZ:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOPZ\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     A,HIGH(CONTRAST_MID)\r
+;      OUT     OCR1BH,A\r
+;      LDI     A,LOW(CONTRAST_MID)\r
+;      OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+;\r
+;      LDI     A,HIGH(T1_INIT)\r
+;      OUT     TCNT1H,A\r
+;      LDI     A,LOW(T1_INIT)\r
+;      OUT     TCNT1L,A\r
+;\r
+;      LDI     A,$50\r
+;      OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+;      LDI     A,$01\r
+;      OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+;\r
+;      LDI     F,$04 ;$05\r
+;      OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+;      OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+;\r
+;      LDI     F,$0A\r
+;      OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+;      LDI     F,$C0\r
+;      OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+;      OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_BACKLIGHT:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,1\r
+       BRNE    SET_BACKLIGHT_ON\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+       RJMP    MAIN_LOOP\r
+SET_BACKLIGHT_ON:\r
+       LDI     A,1<<7\r
+       OR      FLAGS,A                 ; ENABLE INTERRUPT BACKLIGHT INVERSION\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    RCALL   CARRIAGE_RET\r
+       RJMP    MAIN_LOOP\r
+\r
+CARRIAGE_RET:\r
+       CLR     CURSORX\r
+       RET\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+; LDS A,CONTRASTL\r
+; RCALL TX_WAIT\r
+; LDS A,CONTRASTH\r
+; RCALL TX_WAIT\r
+; LDI A,$0D\r
+; RCALL TX_WAIT\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+GO_TIM1_OVF:\r
+       RJMP    TIM1_OVF\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+;NICK_REPORT:\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A\r
+;\r
+;      PUSH    B\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVCC\r
+;      LDS     B,VCCL\r
+;      ADD     A,B\r
+;      STS     AVEVCC,A\r
+;      LDS     A,AVEVCCL\r
+;      LDS     B,VCCH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVCCL,A\r
+;      LDS     A,AVEVCCH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVCCH,A\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVEE\r
+;      LDS     B,VEEL\r
+;      ADD     A,B\r
+;      STS     AVEVEE,A\r
+;       LDS     A,AVEVEEL\r
+;       LDS     B,VEEH\r
+;       SEI\r
+;       ADC     A,B\r
+;      STS     AVEVEEL,A\r
+;      LDS     A,AVEVEEH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVEEH,A\r
+;\r
+;      POP     B\r
+;\r
+;      LDS     A,AVECNT\r
+;      INC     A\r
+;      STS     AVECNT,A\r
+;      BRNE    NICK_REPORT_DONE\r
+;\r
+;      LDS     A,AVEVCCL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVCCH\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEH\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;\r
+;      CLR     A\r
+;      STS     AVEVCC,A\r
+;      STS     AVEVCCL,A\r
+;      STS     AVEVCCH,A\r
+;      STS     AVEVEE,A\r
+;      STS     AVEVEEL,A\r
+;      STS     AVEVEEH,A\r
+;NICK_REPORT_DONE:\r
+;      RET\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 1 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+;      SBRC    FLAGS,7\r
+;      RCALL   NICK_REPORT\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       SEI\r
+       CLR     F\r
+       STS     TEMP,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       MOV     A,YL\r
+       MOV     B,YH\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    PROP_WIDTH\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+       RJMP    PROP_MODE\r
+\r
+PROP_WIDTH:\r
+       RCALL   LPMS\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       SUB     R0,W\r
+       BRSH    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       MOV     XPIXEL,CURSORX\r
+       ADD     XPIXEL,R0\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE\r
+       MOV     F,CURSORX\r
+       ADD     F,R0\r
+       BRLO    CR_LF\r
+       RJMP    OK_LINE\r
+\r
+CR_LF: PUSH    A\r
+       PUSH    B\r
+       RCALL   CARRIAGE_RET\r
+       RCALL   LINE_FEED\r
+       LDS     F,TEMP\r
+       ADD     CURSORX,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       POP     B\r
+       POP     A\r
+OK_LINE:\r
+       ADD     CURSORX,R0\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+Y_OFFSET_DONE:\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       ADIW    YL,$01\r
+       RCALL   LPMS\r
+       MOV     Y_SIZE,R0\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0         ; REMOVE_CS WHY ??\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+       LDI     XL,LOW(ROWBUF)\r
+       LDI     XH,HIGH(ROWBUF)         ; X -> SINGLE LINE BUFFER IN AVR SRAM\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y -> SINGLE LINE FROM DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       LDI     B,30                    ; BYTES TO COPY\r
+DO_MORE:\r
+       A0_A13  YL,YH\r
+       RAMRD   A\r
+       ST      X+,A\r
+       INC     YL\r
+       DEC     B\r
+       RJNE    DO_MORE         ;BRNE   DO_MORE\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> SINGLE LINE IN T6963C BUFFER\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       MOV     F,YL\r
+       RCALL   WRITE_DATA\r
+       MOV     F,YH\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     B,30\r
+       LDI     YL,LOW(ROWBUF)\r
+       LDI     YH,HIGH(ROWBUF)         ; Y -> SINGLE LINE BUFFER IN AVR SRAM\r
+NICK_SUB2_LOOP:\r
+       LD      F,Y+\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       DEC     B\r
+       BRNE    NICK_SUB2_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+L0659: CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L0659\r
+;      BRNE    L0659\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       RET\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+EXT_INT0:\r
+       IN      SR,SREG                 ; MEASURE VCC\r
+       SBI     DDRD,2\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     VCCH,D\r
+       STS     VCCL,C\r
+       RJMP    END_EXT_INT\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    END_EXT_INT\r
+\r
+TIM1_OVF:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+; SBI DDRB,7\r
+; IN D,PORTB\r
+; SUBI D,$80\r
+; OUT PORTB,D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       SBRS    FLAGS,7\r
+       RJMP    BACKLIGHT_SKIP\r
+       LDS     D,BACKLIGHT_COUNT\r
+       INC     D\r
+; LDS C,CONTRASTL\r
+; LSL C\r
+; CP D,C\r
+       CPI     D,37 ;62 ;64                    ; 64 COUNTS = 150 HZ\r
+       BRSH    BACKLIGHT_EVEN\r
+; LSR C\r
+; CP D,C\r
+       CPI     D,18 ;31 ;32\r
+       BRNE    BACKLIGHT_SAVE\r
+;BACKLIGHT_ODD:\r
+       CBI     PORTC,7\r
+       SBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+       RJMP    BACKLIGHT_CONT\r
+BACKLIGHT_EVEN:\r
+       SBI     PORTC,7\r
+       CBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+; LDI D,1<<7\r
+; OR FLAGS,D ; FOR NICK_REPORT\r
+       LDI     D,0\r
+BACKLIGHT_CONT:\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+BACKLIGHT_SAVE:\r
+       STS     BACKLIGHT_COUNT,D\r
+BACKLIGHT_SKIP:\r
+\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+;      SBRC    FLAGS,6                 ; TURNOFF REQUESTED?\r
+;      RJMP    SLEEP_ENTRY             ; YES, SKIP CLOCKING AND SHUT DOWN\r
+\r
+       LDS     D,BREAK_COUNT+1         ; WORD IS STORED IN REVERSE ORDER\r
+       SUBI    D,-$40\r
+       STS     BREAK_COUNT+1,D         ; START OF 4 INTERRUPT BLOCK?\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+       LDI     D,$B0                   ; FORCE DUMMY COMPARE MATCH\r
+       OUT     TCCR1A,D                ; TO SET OC1B, CLR OC1A\r
+       IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+       IN      D,TCNT1H                ; READ CURRENT COUNT\r
+       SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+       SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+       OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+       OUT     OCR1AL,C\r
+       OUT     OCR1BH,D\r
+       OUT     OCR1BL,C\r
+\r
+       SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+       SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+; 10mar03 for better API bus performance (let the chips fall where they may)\r
+;      ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+;      ; REMAIN THE SAME ALTHOUGH THERE IS NOW NO CLOCKING PERIOD\r
+;      LDI     D,$0B+$AB               ; WAIT FOR 3uSEC\r
+;SETTLE_CL2:\r
+;      DEC     D\r
+;      BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+;      LDS     C,VCCL\r
+;      LDS     D,VCCH\r
+;      LDI     E,LOW(VCC_NOMINAL)\r
+;      SUB     C,E\r
+;      LDI     E,HIGH(VCC_NOMINAL)\r
+;      SBC     D,E\r
+;\r
+;      ROR     D\r
+;      ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;;     PUSH    D\r
+;;     PUSH    C\r
+;      ASR     D\r
+;      ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;;     POP     E\r
+;;     ADD     C,E\r
+;;     POP     E\r
+;;     ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+;\r
+;; CLR D\r
+;; CLR C\r
+;\r
+;      LDS     E,VEEL\r
+;      ADD     C,E\r
+;      LDS     E,VEEH\r
+;      ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH WE ARE NO LONGER SETTING TIMER 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,2                  ; START VCC AND\r
+       CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+       LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+       OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+;END_INT:\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+END_EXT_INT:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    L0659\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_XPAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+.INCLUDE "CHSET00.INC"\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+GET_CLEAR_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   CLEAR_FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_CLEAR_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   CLEAR_HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+NO_GOX:        RET\r
+\r
+CLEAR_FRAME_RECT:\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_YY\r
+       STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+FRAME_RECT:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GOX\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GOX\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CLEAR_HALFTONE_RECT:\r
+;      LDS     F,RECTNC_X\r
+;      STS     RECT_X,F\r
+;      LDS     F,RECTNC_Y\r
+;      STS     RECT_Y,F\r
+;      LDS     F,RECTNC_XX\r
+;      STS     RECT_XX,F\r
+;      LDS     F,RECTNC_YY\r
+;      STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+HALFTONE_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LDI     A,$55\r
+       SBRS    YH,0\r
+       LDI     A,$AA\r
+       MOV     PATTERN,A\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    X03A3\r
+X039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+X03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    X03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       TST     XPIXEL\r
+       BREQ    X03B0\r
+X03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    X03AD\r
+X03B0: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+X03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       BREQ    X03D2\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    X03B8\r
+X03C2: TST     X_SIZE\r
+       BREQ    X03D3\r
+X03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    X03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    X03D2\r
+       CLR     B\r
+X03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    X03CB\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+X03D2: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+X03D3: COM     PATTERN\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    X039A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/CS64V5.HEX b/src/avr/CS64V5.HEX
new file mode 100644 (file)
index 0000000..6b6abee
--- /dev/null
@@ -0,0 +1,385 @@
+:020000020000FC\r
+:100000000DC087C387C3189518951895189518952E\r
+:1000100082C31895189527C711C762C702E00EBFA3\r
+:100020000FE50DBF10E818B9A8951FE011BD00E05D\r
+:1000300009BF0BBF08EF01BB08EB02BB0FE107BB19\r
+:100040000FEF0ABB04BB00270BBB03E008BB00E0BB\r
+:1000500005BB00E2B02E17E119B910E91AB9442422\r
+:10006000552422243324EE246624CC24552750938F\r
+:100070000101509323015093430150934401509345\r
+:100080004501969AE0E0F0E0A8953197E9F7979856\r
+:1000900000E0B8D0B7D002E4B1D000E2B3D000E0C5\r
+:1000A000B1D003E4ABD000E8A9D000E9A7D000E0CC\r
+:1000B000A9D0A8D004E2A2D000EBA0D0E0E0F8E004\r
+:1000C00000E0A2D03197E1F702EB9AD008E996D090\r
+:1000D000979A789410E3B9D2CF93DF93C4D2BF91AB\r
+:1000E000AF911BD5212F1D2F12950DD31217B1F4EF\r
+:1000F000119613D5212F1D2F06D3121779F41196BF\r
+:100100000CD5212F1C2F1295FED2121739F41196FF\r
+:1001100004D5212F1C2FF7D2121749F1E6E7F2E19F\r
+:10012000A6E6B3E0D8E1D0930201C0D0D0E8C0E0A9\r
+:10013000DBBBC39AC398D0930101F89435B33C2735\r
+:1001400030783C27789435BBC8950BBAC29ABA98D8\r
+:10015000C1980000C19AC298BA9A119741F031969D\r
+:10016000C3951C2F1F7349F7C054D395E1CF20E1ED\r
+:100170002093F30020E22093F40028E12093F5007F\r
+:1001800021D6112710935101EE27FF271EEF109360\r
+:10019000FD001BEA1093FC0022E01BD21C7F109391\r
+:1001A000FE0023E016D21093FF001091FE00209174\r
+:1001B000FF001A380DEF200720F01B3A0FEF200741\r
+:1001C00030F01EEF1093FF0010E41093FE001EEFBE\r
+:1001D00019BD1BEA18BD1CEF1DBD1EEC1CBD10E5B2\r
+:1001E0001FBD11E01EBD00E003BF04E008BF09BF52\r
+:1001F0000AE005BF00EC0ABF0BBF92C219D006C0CF\r
+:1002000011D004C015D001C00DD0A8980BBB0000C0\r
+:1002100000000000F894C1980000000000007894ED\r
+:10022000C19A08950F930BD003FFFDCF0F9108954E\r
+:100230000F9305D000FD01FFFCCF0F910895A89A00\r
+:1002400000E00ABBF894C098000000000000000025\r
+:10025000C09A09B378940F930FEF0ABB0F910895DA\r
+:1002600002E00EBF0FE50DBF1FE7B122AF98C498A3\r
+:10027000409101014BBBC39AC39850E05FBD5EBD86\r
+:1002800094989598C298BA9A96989798C098C19859\r
+:100290005FEF5ABB50E05BBB50E059BF5BBF5FE113\r
+:1002A00051BD57E151BD5AE655BF889508957894E0\r
+:1002B0001FEDE12210E01EBB1FBB62D21B3129F1F2\r
+:1002C000B3FC0DC0103258F4183009F4FEC01D30D4\r
+:1002D00009F40DC11A3009F48BC0173041F7B2FC94\r
+:1002E00012C0103381F4C091F300D091F40020913A\r
+:1002F000F500CC5FDD4FF89435B320FB36F97894E8\r
+:1003000035BBF1D4102D72D2D2CF3AD21B3139F392\r
+:100310001E3209F475C11F3209F44FC01F3309F4AE\r
+:1003200084C1113409F4A6C0123409F427C213346D\r
+:1003300009F404C1133609F451C9143409F4EBC0AB\r
+:10034000153409F4D8C0163409F408C1163609F476\r
+:1003500051C9173409F49EC0183409F463C918361A\r
+:1003600009F454C91B3409F461C01C3409F4D4C124\r
+:100370001D3409F42BC01E3409F4FCC0103509F4F7\r
+:1003800097C0123509F4DCC0133509F4D2C0153515\r
+:1003900009F4F4C1163519F410E2E12AF7C0173553\r
+:1003A00009F4ECC1183509F4B8C11A3509F4E2C1F1\r
+:1003B000103310F01A3398F07ACFE2D110FF03C057\r
+:1003C00014E0B12A74CF1BEFB12271CFD9D1103311\r
+:1003D00021F4F89400E4B02A43CF69CFD1D135D1CC\r
+:1003E000C0E1C093F300D093F4002093F5005FCFF9\r
+:1003F00001D05DCF0F92C091F300D091F400209115\r
+:10040000F500DE5FC395F89435B320FB36F9789498\r
+:1004100035BB69D4182F100D100D1A95103418F033\r
+:10042000EED00F900895800D0F900895979800E0FA\r
+:10043000E9DEE8DE02E4E2DE00E2E4DE00E0E2DE45\r
+:1004400003E4DCDE00E8DADE00E9D8DE00E0DADE34\r
+:10045000D9DE04E2D3DE00EBD1DEE0E0F8E000E03C\r
+:10046000D3DE3197E1F702EBCBDE08E9C7DE979ADE\r
+:10047000A9D41DCF85D1117051F41FE7B122AF98D7\r
+:10048000C498409101014BBBC39AC39810CF10E8A8\r
+:10049000B12A0DCF75D1103309F404C0113309F41A\r
+:1004A00004C005CF07EFB02202CF08E0B02AFFCE8C\r
+:1004B00067D1103309F403C0113309F403C00FEE00\r
+:1004C000B022F5CE00E1B02AF2CEC091F300D09177\r
+:1004D000F4002091F500DE5FF89435B320FB36F987\r
+:1004E000789435BB00D470191FB712FFE0CE01D04D\r
+:1004F000DECE7727089544D111FD07C010FD03C05B\r
+:100500000FEDB022D4CE00E2B02A002700932301E1\r
+:1005100082D2F1F7CCCE34D1103309F404C01133B8\r
+:1005200009F404C0C4CE0EEFB022C1CE01E0B02A5F\r
+:10053000BECE26D1712F24D1812FB9CE02E0B02AB0\r
+:1005400070933401809335011BD11093360118D17B\r
+:1005500010933701E5D20DEFB022A9CE7093380188\r
+:10056000809339010DD110933A010AD110933B01C8\r
+:100570002CD39DCE709338018093390101D1109313\r
+:100580003A01FED010933B0145D391CEF9D010FF34\r
+:100590000BC01091FE002091FF001C5F2F4F1B3AF3\r
+:1005A0000FEF2007A8F40AC01091FE002091FF0071\r
+:1005B000145020401A380DEF200750F01093FE0021\r
+:1005C0002093FF0022E00DD01091FF0023E009D01E\r
+:1005D0006ECEE199FECF2EBB22272FBBE09A1DB332\r
+:1005E0000895E199FECFE5FEFFCF2EBB22272FBB5A\r
+:1005F0001DBBF894E5FEFFCFE29AE19A18951AC563\r
+:10060000BFD023D0BDD0A12FBBD0B12FB9D0F8948B\r
+:1006100035B320FB36F9789435BB80D221961197FB\r
+:100620001A2F1B2B09F0F2CF42CEAAD00ED01F9367\r
+:100630001AD01BE1C6D01FE3C4D01F91105DC1D0FA\r
+:100640001D2F5AD01C2F58D032CEC0E0D0E022E669\r
+:100650001F70163008F4210F2695D7952695D7954B\r
+:10066000D695D6950895A6E1B2E0AC0FBD1FF894DB\r
+:1006700035B320FB36F9789435BB4FD2E12F119674\r
+:100680004CD2F12FAC2FBD2F1496CFEFDFEF319767\r
+:10069000FF70349780F1319640D2119601E220E14B\r
+:1006A000D127CC0FDD1F10F4C027D227CC0FDD1FC0\r
+:1006B00010F4C027D227CC0FDD1F10F4C027D2279B\r
+:1006C000CC0FDD1F10F4C027D227CC0FDD1F10F494\r
+:1006D000C027D227CC0FDD1F10F4C027D227CC0FA4\r
+:1006E000DD1F10F4C027D227CC0FDD1F10F4C02768\r
+:1006F000D227319789F608951F93129504D061D0BF\r
+:100700001F9101D05EC01F7010631A3308F0195F8B\r
+:100710000895F7C3FFC307C4AAC432D010FD13C0A5\r
+:100720007093460180934701B09248011091F30005\r
+:10073000109349011091F40010934A011091F500B3\r
+:1007400010934B01B4CD709146018091470110EC9C\r
+:10075000B122109148011F73B12A109149011093E1\r
+:10076000F30010914A011093F40010914B01109383\r
+:10077000F5009DCD05D004D003D002D001D097CD97\r
+:1007800010EC10934401A89510E01EBB1FBB10ECA9\r
+:10079000809910934401B5FC3ED13320A1F310E0C1\r
+:1007A00010934401CF93DF93C22DC059DD271881E8\r
+:1007B000F8943A942394CFE72C227894DF91CF9148\r
+:1007C00008951F93A895152D1031E0F71F91CF9331\r
+:1007D000DF93DFB7F894C52DC40DDFBFCF70C05ACB\r
+:1007E000DD2718835394DF91CF91089578940027E3\r
+:1007F00000930001982E672F6AD26093F200A092B6\r
+:10080000F000C12FDD27CC0FDD1F1091F300C10FC9\r
+:100810001091F400D11F1091F50026D564D22196D5\r
+:10082000F02C61D2CF2DD02D1091F300C10F10917B\r
+:10083000F400D11F58D2802C1C2F2D2F219785FC1E\r
+:1008400007C0C091F300D091F400DE5F4CD21DC010\r
+:100850004AD2B4FC1AC0C091F300D091F400DE5F1C\r
+:10086000F02C41D20F1808F40024069400920001E5\r
+:10087000672F600D2CD26093F200A092F000C0911F\r
+:10088000F300D091F400DE5F2ED2B3FC1AC0072F24\r
+:10089000000D08F016C01F932F932BDEABDD0091E7\r
+:1008A0000001700F982E672F12D26093F200A09271\r
+:1008B000F00000910001701B1091F500D5D42F912C\r
+:1008C0001F91700D86FE05C0C12FD22F22970BD22B\r
+:1008D000900CC12FD22F219606D2702C0FEF0ABB9D\r
+:1008E000C09A0FE180228092F1000027801201C09F\r
+:1008F00087C0AA27B92DB695A795B695A795B05FDD\r
+:1009000007C09394A05CBF4F8090F100A090F000CE\r
+:10091000AA2A222721961091F500A6D4E4D1112706\r
+:100920006091F200662339F08894079417956A95D0\r
+:10093000E1F7022A212F08E1F89435B300FB36F9DC\r
+:10094000789435BBF89435B33A25307C3A257894C1\r
+:1009500035BB3B2F330F330FA7FA31F9A6FA30F925\r
+:100960003BBBF894C39AC398789430930101002755\r
+:100970000ABBF894C29ABA98C0980000C09A09B30A\r
+:100980000026B0FC002A0FEF0ABB0BBAC19800008A\r
+:10099000C19A7894C298BA9AA3948A9409F0BACF6B\r
+:1009A000222351F1F89435B33A25307C3A257894D6\r
+:1009B00035BB3B2F330F330FA7FA31F9A6FA30F9C5\r
+:1009C0003BBBF894C39AC3987894309301010027F5\r
+:1009D0000ABBF894C29ABA98C0980000C09A09B3AA\r
+:1009E0002027B0FC202B0FEF0ABB2BBBC1980000C7\r
+:1009F000C19A7894C298BA9A04D07A9409F081CFB7\r
+:100A00000895CF93DF93192D78D01881122B188376\r
+:100A1000DF91CF9108952F93CF93DF93109123010E\r
+:100A20006CD01881122309F45EC028812127288305\r
+:100A300010E010934401AF93BF93A3E0B1E0CC2743\r
+:100A4000D0912301D695C795D695C795D05F18E16B\r
+:100A50000BD42EE1F89435B33C27307C3C277894B6\r
+:100A600035BB3D2F330F330FC7FB31F9C6FB30F9D0\r
+:100A70003BBBF894C39AC398789430930101002744\r
+:100A80000ABBF894C29ABA98C0980000C09A19B3E9\r
+:100A90007894C298BA9A0FEF0ABB1D93C3952A9512\r
+:100AA00009F0D8CFBF91AF91CC27D0912301D69533\r
+:100AB000C795D695C795D695C79597980C2FA2DB65\r
+:100AC0000D2FA0DB04E29ADB00EB98DB2EE1C3E004\r
+:100AD000D1E0099199DB2A95E1F702EB91DB979A36\r
+:100AE00010EC109344011091230113951F73109380\r
+:100AF0002301DF91CF912F910895C4E2D1E0212FFE\r
+:100B0000269526952695C20F20E0D21F21E017706A\r
+:100B100019F0220F1A95E9F7089562C385C3C7CB70\r
+:100B200078949090350160913401D1D06093F200B7\r
+:100B3000A092F00070903701CC27D92DD695C7959B\r
+:100B4000D695C795D05F18E18FD307C0C05CDF4F43\r
+:100B500093946091F200A090F000AC2A1FEF809077\r
+:100B6000360100E0801641F008E08016B8F06623F8\r
+:100B700019F016956A95E9F7DAD008E01091F200BD\r
+:100B8000011B801AA3941FEF08E0801638F0B1F023\r
+:100B9000CED01FEF08E0801AA394F6CF882079F01A\r
+:100BA00016958A94E9F71095662341F02227169549\r
+:100BB00027956A95E1F7BBD0A394122FB8D021DF17\r
+:100BC0007A9400277012C2CF089500913A010A95D5\r
+:100BD0000230D0F300913B010330B0F300913801B3\r
+:100BE0000395009334010091390100933501809001\r
+:100BF0003A018A948A948092360101E00093370189\r
+:100C00008FDF009138010093340180903A01809287\r
+:100C100036013AC000913A010A950230A8F20091DB\r
+:100C20003B01033088F200913801039500933401B1\r
+:100C3000009139010093350180903A018A948A9499\r
+:100C40008092360101E0009337016ADF009138019C\r
+:100C500000933401009139010395009335017090A0\r
+:100C60003B017A947A947092370101E00093360147\r
+:100C700057DF80903A0100913801080D0A950093E2\r
+:100C8000340101E00093360100913901039500938E\r
+:100C9000350170903B017A947A947092370140DF6D\r
+:100CA0000091380103950093340180903A018A94B1\r
+:100CB0008A948092360170903B0100913901070DB2\r
+:100CC0000A950093350101E00093370129CFAA244A\r
+:100CD00000EFA01A67FFAA246F77685014F0A3945E\r
+:100CE000FCCF685F0895F89435B33C27307C3C27EF\r
+:100CF000789435BB3D2F330F330FC7FB31F9C6FB5B\r
+:100D000030F93BBBF894C39AC398789430930101AF\r
+:100D100000270ABBF894C29ABA98C0980000C09AFB\r
+:100D200009B27894C298BA9A0FEF0ABB0895F89462\r
+:100D300035B33A25307C3A25789435BB3D2F330FB7\r
+:100D4000330FA7FA31F9A6FA30F93BBBF894C39AEE\r
+:100D5000C39878943093010100270ABBF894C29A93\r
+:100D6000BA98C0980000C09AF9B27894C298BA9A1A\r
+:100D70000FEF0ABBB1FE03C01095F12203C0F126AC\r
+:100D8000B0FCF12AF89435B33A25307C3A257894B2\r
+:100D900035BB3D2F330F330FA7FA31F9A6FA30F9DF\r
+:100DA0003BBBF894C39AC398789430930101FBBA83\r
+:100DB000F894C29ABA98C1980000C19A7894C298DF\r
+:100DC000BA9A08959924C0E0D0E118E14DD2AA243E\r
+:100DD000A092F0001091F0001C2BF89435B331274D\r
+:100DE000307C3127789435BB3D2F330F330F17FB01\r
+:100DF00031F916FB30F93BBBF894C39AC398789449\r
+:100E00003093010100E00BBBF894C29ABA98C198E4\r
+:100E10000000C19A7894C298BA9AA39400E2A016EE\r
+:100E200019F0A092F000D6CFECDD9394C05CDF4FB8\r
+:100E3000D03209F0CCCF7727882708951FB60F93BB\r
+:100E40000FEDC02EEF93FF93E42DE05AFF270081B2\r
+:100E5000FF91EF910CB95A9443940FE040226A94A9\r
+:100E60000AF046C04BC01FB60F930FEDC02E0CB159\r
+:100E70005C9938C0E7FC26C0E6FC08C0033029F4C2\r
+:100E800000E009B9539A00E4E02A38C0602E00E877\r
+:100E900003190AF40FE7662012F4052D00680CB957\r
+:100EA000061508F4602E062D0F7739F000ECE02AC5\r
+:100EB0006A9422F55798559A21C00FEBE022569A72\r
+:100EC0005E9A1CC0EF93FF93E32DE20DEF77E0599C\r
+:100ED000FF270083FF91EF9133946A947AF40CC05A\r
+:100EE0001FB60F93539807E109B90FEBE022CC240A\r
+:100EF00055985698579A0CB10FE7E0220F911FBEF4\r
+:100F000018951FB68A9A4CB55DB55093FB00409377\r
+:100F1000FA008EC01FB68B9A4CB55DB55093F900A0\r
+:100F20004093F80085C01FB65AB35F935BB35F93DD\r
+:100F30005FEF5ABBB7FE14C0509151015395553223\r
+:100F400028F4523159F4AF98C49A03C0AF9AC498A8\r
+:100F500050E0409101014BBBC39AC398509351019B\r
+:100F600055B35F93509101015F9350914501505CDF\r
+:100F70005093450149F450914401539550934401D5\r
+:100F800019F45FEBB5226CC950EB5FBD4CB55DB594\r
+:100F9000485F5F4F5BBD4ABD59BD48BD8A9A929A72\r
+:100FA0008B9A939A8D9895985091FD004091FC00F2\r
+:100FB0008D9A859907C040389DEF59074AF04150F6\r
+:100FC000504006C0453D9FEF590712F44F5F5F4FF9\r
+:100FD0005093FD004093FC005BBD4ABD9091FE0024\r
+:100FE000491B9091FF00590B1AF445EF5FEF02C0C7\r
+:100FF00040E85DEF59BD48BD000000000000000062\r
+:10100000000000005DEF5DBD55E75CBD8A989298D9\r
+:101010008B98939850EE5FBD5F915BBBC39AC3986A\r
+:10102000509301015F9155BB5F915BBB5F915ABBD0\r
+:101030001FBE18959924C0E0D0E1A0E0B0E118E10E\r
+:1010400013D1A05CBF4F0A94E1F720E22F93C8D0E0\r
+:10105000EBD0A395C3952F912A9509F0F7CFD1DC5A\r
+:101060009394A0969096B03209F0EFCFB0CE88DB83\r
+:101070001F9386DB10934C0183DB1695169516950E\r
+:1010800009F410E210934F017BDB10935001172FEE\r
+:1010900016951695169510934D0180934E0118E103\r
+:1010A000E3D01F9110FD46C0CC27D0914E019D2E5C\r
+:1010B000D695C795D695C79510914D01C10FD05FB4\r
+:1010C0002091500110914C01121720F5211BAA27E5\r
+:1010D000B0914E01B10FB695A795B695A795109111\r
+:1010E0004D01A10FB05F2F93AF93BF93CF93DF93C9\r
+:1010F00020914F0168D085DCDF91CF91BF91AF91F6\r
+:101100002F919394A05CBF4FC05CDF4F2A9559F795\r
+:1011100020914C012F93CF93DF9320914F015AD010\r
+:1011200070DCDF91CF912F919394C05CDF4F2A95B3\r
+:1011300089F7F5CCCC27D0914E0100915001D00F0A\r
+:101140009D2ED695C795D695C79510914D01C10F87\r
+:10115000D05F202F10914C01121728F5211BAA27D0\r
+:10116000B0914E01B00FB11BB695A795B695A79556\r
+:1011700010914D01A10FB05F9A94A054B040C0549B\r
+:10118000D0402F93AF93BF93CF93DF9320914F0124\r
+:101190001AD037DCDF91CF91BF91AF912F912A9573\r
+:1011A00059F720914C019A94C054D0402F93CF937B\r
+:1011B000DF9320914F010ED024DCDF91CF912F914E\r
+:1011C0002A9589F7ACCC0CD011962ED021962A9571\r
+:1011D000D1F7089510E028D021962A95E1F70895D7\r
+:1011E000F89435B33A27307C3A27789435BB3B2FB7\r
+:1011F000330F330FA7FB31F9A6FB30F93BBBF89453\r
+:10120000C39AC39878943093010100270ABBF894DD\r
+:10121000C29ABA98C0980000C09A19B37894C2983C\r
+:10122000BA9A0FEF0ABB0895F89435B33C27307C87\r
+:101230003C27789435BB3D2F330F330FC7FB31F973\r
+:10124000C6FB30F93BBBF894C39AC39878943093AB\r
+:1012500001011BBBF894C29ABA98C1980000C19AC8\r
+:101260007894C298BA9A0895F89435B310FB36F979\r
+:10127000789435BB089546323444303331393033B5\r
+:101280003132313730394C034C034C034C034C039F\r
+:101290004C034C034C034C034C034C034C034C03D6\r
+:1012A0004C034C034C034C034C034C034C034C03C6\r
+:1012B0004C034C034C034C034C034C034C034C03B6\r
+:1012C0004C034C034C0300014C034C034C034C03F4\r
+:1012D0004C034C034C034C034C034C034C034C0396\r
+:1012E00003014C034C0306010F01180121012A01DF\r
+:1012F00033013C0145014E0157014C034C034C03A3\r
+:101300004C034C034C034C036001690172017B01E7\r
+:1013100084018D0196019F01A901B201BB01C401A5\r
+:10132000CD01D601DF01E801F101080211021A0224\r
+:1013300023022C0235023E02470250024C034C03AA\r
+:101340004C034C034C034C03590262026B027402BF\r
+:101350007D0286028F029902A302AD02B802C20288\r
+:10136000CB02D402DD02E602F002FC0203030C030E\r
+:1013700015031E0327033003390343034C034C03B7\r
+:101380004C034C034C030003066101F8010770880D\r
+:1013900098A8C888700107206020202020700107CD\r
+:1013A000708808102040F80107F810201008887095\r
+:1013B000010710305090F810100107F880F008086D\r
+:1013C00088700107304080F08888700107F80810A5\r
+:1013D000204040400107708888708888700107703D\r
+:1013E000888878081060010770888888F8888801E4\r
+:1013F00007F08888F08888F00107708880808088EE\r
+:10140000700107E09088888890E00107F88080F0FC\r
+:101410008080F80107F88080F08080800107708864\r
+:1014200080B88888780107888888F88888880221A9\r
+:10143000078080808080808001070808080808886D\r
+:101440007001078890A0C0A09088010780808080EC\r
+:101450008080F8010788D8A8A8888888010788882C\r
+:10146000C8A89888880107708888888888700107CC\r
+:10147000F08888F0808080010770888888A890684C\r
+:101480004C034C034C03060801014F0065030107A0\r
+:10149000F08888F0A09088010770888070088870B4\r
+:1014A0000107F820202020202001078888888888CC\r
+:1014B0008870010788888888885020010788888874\r
+:1014C000A8A8A8500107888850205088880107885C\r
+:1014D0008888502020200107F80810204080F8015B\r
+:1014E000070000700878887801078080F088888875\r
+:1014F000F00107000078808080780107080878886C\r
+:10150000888878010700007088F88070010718202B\r
+:10151000F8202020200108000078888878087001D1\r
+:10152000078080B0C888888802210780008080807A\r
+:101530008080052108100010101010906005210710\r
+:10154000808090A0C0A090032107C0404040404050\r
+:101550004001070000F0A8A8A8A801070000B0C833\r
+:10156000888888010700007088888870010800005A\r
+:10157000F08888F080800108000078888878080862\r
+:1015800002056105B0C0808080010700007880708E\r
+:1015900008F001072020F82020201801070000880B\r
+:1015A0008888986801070000888888502001070013\r
+:1015B000008888A8A85001070000885020508801A2\r
+:1015C00008000088888878087001070000F810205B\r
+:1015D00040F80107F8F8F8F8F8F8F80070933801C7\r
+:1015E00080933901CDD810933A01CAD810933B01AA\r
+:1015F00026D05DC67093380180933901C1D810930D\r
+:101600003A01BED810933B012FD051C670933401DC\r
+:1016100080933501B5D810933601B2D810933701B5\r
+:1016200078D045C67093340180933501A9D81093C2\r
+:101630003601A6D81093370171D039C608950091AC\r
+:101640003801009334010091390100933501009174\r
+:101650003A010093360100913B010093370102E00B\r
+:10166000B02A5EDA0DEFB02200913A010A950230FD\r
+:1016700028F300913B01033008F3009138010093F7\r
+:101680003401009139010093350100913A01009332\r
+:10169000360101E00093370143DA009138010093ED\r
+:1016A00034010091390103950093350100913B010C\r
+:1016B00002500093370101E00093360131DA809047\r
+:1016C0003A0100913801080D0A950093340101E0B8\r
+:1016D0000093360100913901039500933501009183\r
+:1016E0003B010250009337011BDA0091380100934F\r
+:1016F000340100913A010093360170903B01009152\r
+:101700003901070D0A950093350101E00093370177\r
+:1017100007CA02E0B02A04DA0DEFB0227894909064\r
+:10172000350160913401D3DA6093F200A092F000A9\r
+:1017300070903701CC27D92D15E5D0FF1AEA012E7C\r
+:10174000D695C795D695C795D05F18E18DDD07C0B2\r
+:10175000C05CDF4F93946091F200A090F000AC2A3F\r
+:101760001FEF8090360100E0801641F008E08016FF\r
+:10177000C8F0662319F016956A95E9F71021D7DAB3\r
+:1017800008E01091F200011B801AA3941FEF08E0FB\r
+:10179000801640F0C1F01021CADA1FEF08E0801A6D\r
+:1017A000A394F5CF882089F016958A94E9F71095CF\r
+:1017B000662349F02227169527956A95E1F71021AF\r
+:1017C000B6DAA394122F1021B2DA00941AD97A94BF\r
+:0817D00000277012BDCF08953F\r
+:0220000003419A\r
+:00000001FF\r
diff --git a/src/avr/ISPD.EXE b/src/avr/ISPD.EXE
new file mode 100644 (file)
index 0000000..747ba73
Binary files /dev/null and b/src/avr/ISPD.EXE differ
diff --git a/src/avr/ISPD.INI b/src/avr/ISPD.INI
new file mode 100644 (file)
index 0000000..f90fec4
--- /dev/null
@@ -0,0 +1,16 @@
+-1\r
+0\r
+0\r
+-1\r
+\r
+WPOV2.HEX\r
+\r
+\r
+00\r
+0\r
+9600\r
+-1\r
+0\r
+\r
+\r
+\r
diff --git a/src/avr/MAKCHR.LOG b/src/avr/MAKCHR.LOG
new file mode 100644 (file)
index 0000000..44dd8ad
--- /dev/null
@@ -0,0 +1,96 @@
+CHR=00 PTR=034C XB=   1 YB=   7\r
+CHR=01 PTR=034C XB=   1 YB=   7\r
+CHR=02 PTR=034C XB=   1 YB=   7\r
+CHR=03 PTR=034C XB=   1 YB=   7\r
+CHR=04 PTR=034C XB=   1 YB=   7\r
+CHR=05 PTR=034C XB=   1 YB=   7\r
+CHR=06 PTR=034C XB=   1 YB=   7\r
+CHR=07 PTR=034C XB=   1 YB=   7\r
+CHR=08 PTR=034C XB=   1 YB=   7\r
+CHR=09 PTR=034C XB=   1 YB=   7\r
+CHR=0A PTR=034C XB=   1 YB=   7\r
+CHR=0B PTR=034C XB=   1 YB=   7\r
+CHR=0C PTR=034C XB=   1 YB=   7\r
+CHR=0D PTR=034C XB=   1 YB=   7\r
+CHR=0E PTR=034C XB=   1 YB=   7\r
+CHR=0F PTR=034C XB=   1 YB=   7\r
+CHR=10 PTR=034C XB=   1 YB=   7\r
+CHR=11 PTR=034C XB=   1 YB=   7\r
+CHR=12 PTR=034C XB=   1 YB=   7\r
+CHR=13 PTR=034C XB=   1 YB=   7\r
+CHR=14 PTR=034C XB=   1 YB=   7\r
+CHR=15 PTR=034C XB=   1 YB=   7\r
+CHR=16 PTR=034C XB=   1 YB=   7\r
+CHR=17 PTR=034C XB=   1 YB=   7\r
+CHR=18 PTR=034C XB=   1 YB=   7\r
+CHR=19 PTR=034C XB=   1 YB=   7\r
+CHR=1A PTR=034C XB=   1 YB=   7\r
+CHR=1B PTR=034C XB=   1 YB=   7\r
+CHR=1C PTR=034C XB=   1 YB=   7\r
+CHR=1D PTR=034C XB=   1 YB=   7\r
+CHR=1E PTR=034C XB=   1 YB=   7\r
+CHR=1F PTR=034C XB=   1 YB=   7\r
+CHR=20 PTR=0100\r
+CHR=21 PTR=034C XB=   1 YB=   7\r
+CHR=22 PTR=034C XB=   1 YB=   7\r
+CHR=23 PTR=034C XB=   1 YB=   7\r
+CHR=24 PTR=034C XB=   1 YB=   7\r
+CHR=25 PTR=034C XB=   1 YB=   7\r
+CHR=26 PTR=034C XB=   1 YB=   7\r
+CHR=27 PTR=034C XB=   1 YB=   7\r
+CHR=28 PTR=034C XB=   1 YB=   7\r
+CHR=29 PTR=034C XB=   1 YB=   7\r
+CHR=2A PTR=034C XB=   1 YB=   7\r
+CHR=2B PTR=034C XB=   1 YB=   7\r
+CHR=2C PTR=034C XB=   1 YB=   7\r
+CHR=2D PTR=0103 XB=   1 YB=   1         YO=   3 PW=   6\r
+CHR=2E PTR=034C XB=   1 YB=   7\r
+CHR=2F PTR=034C XB=   1 YB=   7\r
+CHR=30 PTR=0106 XB=   1 YB=   7\r
+CHR=31 PTR=010F XB=   1 YB=   7\r
+CHR=32 PTR=0118 XB=   1 YB=   7\r
+CHR=33 PTR=0121 XB=   1 YB=   7\r
+CHR=34 PTR=012A XB=   1 YB=   7\r
+CHR=35 PTR=0133 XB=   1 YB=   7\r
+CHR=36 PTR=013C XB=   1 YB=   7\r
+CHR=37 PTR=0145 XB=   1 YB=   7\r
+CHR=38 PTR=014E XB=   1 YB=   7\r
+CHR=39 PTR=0157 XB=   1 YB=   7\r
+CHR=3A PTR=034C XB=   1 YB=   7\r
+CHR=3B PTR=034C XB=   1 YB=   7\r
+CHR=3C PTR=034C XB=   1 YB=   7\r
+CHR=3D PTR=034C XB=   1 YB=   7\r
+CHR=3E PTR=034C XB=   1 YB=   7\r
+CHR=3F PTR=034C XB=   1 YB=   7\r
+CHR=40 PTR=034C XB=   1 YB=   7\r
+CHR=41 PTR=0160 XB=   1 YB=   7\r
+CHR=42 PTR=0169 XB=   1 YB=   7\r
+CHR=43 PTR=0172 XB=   1 YB=   7\r
+CHR=44 PTR=017B XB=   1 YB=   7\r
+CHR=45 PTR=0184 XB=   1 YB=   7\r
+CHR=46 PTR=018D XB=   1 YB=   7\r
+CHR=47 PTR=0196 XB=   1 YB=   7\r
+CHR=48 PTR=019F XB=   1 YB=   7\r
+CHR=49 PTR=01A9 XB=   1 YB=   7                 PW=   2\r
+CHR=4A PTR=01B2 XB=   1 YB=   7\r
+CHR=4B PTR=01BB XB=   1 YB=   7\r
+CHR=4C PTR=01C4 XB=   1 YB=   7\r
+CHR=4D PTR=01CD XB=   1 YB=   7\r
+CHR=4E PTR=01D6 XB=   1 YB=   7\r
+CHR=4F PTR=01DF XB=   1 YB=   7\r
+CHR=50 PTR=01E8 XB=   1 YB=   7\r
+CHR=51 PTR=01F1 XB=   1 YB=   7\r
+CHR=52 PTR=0208 XB=   1 YB=   7\r
+CHR=53 PTR=0211 XB=   1 YB=   7\r
+CHR=54 PTR=021A XB=   1 YB=   7\r
+CHR=55 PTR=0223 XB=   1 YB=   7\r
+CHR=56 PTR=022C XB=   1 YB=   7\r
+CHR=57 PTR=0235 XB=   1 YB=   7\r
+CHR=58 PTR=023E XB=   1 YB=   7\r
+CHR=59 PTR=0247 XB=   1 YB=   7\r
+CHR=5A PTR=0250 XB=   1 YB=   7\r
+CHR=5B PTR=034C XB=   1 YB=   7\r
+CHR=5C PTR=034C XB=   1 YB=   7\r
+CHR=5D PTR=034C XB=   1 YB=   7\r
+CHR=5E PTR=034C XB=   1 YB=   7\r
+CHR=5F PTR=034C XB=   1 YB=   7\r
diff --git a/src/avr/MT102V0.HEX b/src/avr/MT102V0.HEX
new file mode 100644 (file)
index 0000000..6263fea
--- /dev/null
@@ -0,0 +1,191 @@
+:020000020000FC\r
+:0200000033C209\r
+:04000A007CC104C0F1\r
+:10001000DDC1C7C118C2FFB65F936F9358EB52BFE3\r
+:10002000A89508956F915F91FFBE1895BA9494D0EA\r
+:10003000F9DF90D0F7DFBB2019F4272F2C70B9F02F\r
+:10004000E1FC06C022E1E22A89D0A298AA9AEADF5E\r
+:10005000BB2061F773FF20C172FF82C0382D737F10\r
+:1000600079D0E0DF79D0DEDF3A95D1F7E4CFE1FE59\r
+:100070000BC0D8DF2DEFE22220E174FFE22A20E05E\r
+:1000800022BBAA98A29AD6CF74FD38C020E022BF26\r
+:1000900020E4E20E78F69298A398A298AA9A20E714\r
+:1000A000E0FE20E822BFBEDF2091D30023952093FD\r
+:1000B000D30011F420E1E22A33B3929AA39AAA98CA\r
+:1000C000A29A33FD06C020E1E0FCE22A2EEFE222F4\r
+:1000D00004C0E0FC02C021E1E22A32FD0AC0E3FED6\r
+:1000E000A9CF28E7E0FCB22E20E1E22A27EFE222A6\r
+:1000F000A1CFE3FC9FCF28E1E22A9CCF7F7E24E1C1\r
+:10010000E22AA998A0E2BEE438EE43E0119779F024\r
+:100110002CEF22BF87DF9899F7CF31504040B1F7DD\r
+:10012000119729F02CEF22BF7DDF989BF9CFA99A78\r
+:10013000A8EEB3E02CEF22BF75DF1197D9F72BEFB4\r
+:10014000E2222B2D222329F4272F2C7011F420E1F9\r
+:10015000E22A70CF20EA01C020E5A226A2BA0895C3\r
+:100160002FEF22BFDD0CDD0C20ECD22277FFD394E1\r
+:10017000A0E8B1E080E090E030E0EF93FF93E32F60\r
+:10018000E695E695E695E05A2081532F57705395F2\r
+:100190004091D1004F7026955A95E9F710F4440F1D\r
+:1001A0004F57E32FEA5920812032C8F0E22FFF2772\r
+:1001B000EE0FFF1FEE0FFF1FE20F20E0F21FEE0F0A\r
+:1001C000FF1F2D2D2F70E20F20E0F21F20EBE20F1A\r
+:1001D00026E0F21F602DC895202D062E0FC0E22FBD\r
+:1001E000EE0FEE0FE20FEE0FE20FE85F2D2D2F70F6\r
+:1001F000E20FE199FECFEEBBE09A2DB3FF91EF91B4\r
+:1002000011DF5FEF47FD5EEF52BF65D061E064D064\r
+:1002100009DF5FEF47FD5EEF52BF339547FD339532\r
+:100220003A3208F4AACF20E046E061E055D02D2D07\r
+:10023000203C20F42395203808F423952F70293092\r
+:1002400008F0777F4091D100939A9398EBDE84DF9A\r
+:1002500027E028BBE7DE382F292F269537952695EE\r
+:100260003795385E2A2D79DF5FEF52BFDBDE3A9596\r
+:10027000D1F7A22E20E028BB6DDF405138F72D2D9D\r
+:10028000203C20F42395203808F423952F70293042\r
+:1002900010F4D3946DCFCECE2FEF22BFA0E8B1E003\r
+:1002A00080E090E030E0EF93E32FE05A2081EF917F\r
+:1002B0004091D2004F70B6DE5FEF52BF0CD0B2DE7D\r
+:1002C0005FEF52BF3395303370F37B7F2FEFD22E29\r
+:1002D0004091D200B9CF68E0AA2311F4BB2381F08A\r
+:1002E000220F08F4AB9A542F5F77AD9AAB99019621\r
+:1002F0001197AD9829F05150C0F7AB986A9581F7E6\r
+:10030000AB9808952FE121BD27E121BD20E325BF52\r
+:1003100088950FEF0DBD00E00CBD00E808BF02E8B6\r
+:1003200009BF00E00EBB809B04C00FEF0DBD00E0D5\r
+:100330000CBDE4FE0FC0042D013060F400E000931A\r
+:10034000D3000FEEE0220E2D0F7000630A3308F089\r
+:10035000095F18D0222029F302E009BFCF93DF9371\r
+:10036000C12DCF56DD270881F8942A941394CFE34A\r
+:100370001C227894DF91CF9108950F93042D0130C2\r
+:10038000E8F70F91CF93DF93DFB7F894C42DC30D37\r
+:10039000DFBFC070C057DD2708834394DF91CF9142\r
+:1003A0000895FFB64F934EEC742EEF93FF93E32D19\r
+:1003B000E057FF274081FF91EF914CB94A94339465\r
+:1003C00040E034226A940AF046C04BC0FFB64F9317\r
+:1003D0004EEC742E4CB15C9938C057FC26C056FCCC\r
+:1003E00008C0453029F445E049B9539A40E4542AFD\r
+:1003F00038C0642E40E442190AF44FE7662012F434\r
+:10040000442D40684CB9461508F4642E462D4F77AC\r
+:1004100039F040EC542A6A9422F55798559A21C035\r
+:100420004FEB5422569A5E9A1CC0EF93FF93E22D35\r
+:10043000E10DEF73EF56FF274083FF91EF91239477\r
+:100440006A947AF40CC0FFB64F9353984FE849B9B9\r
+:100450004FEB5422772455985698579A4CB14FE752\r
+:1004600054224F91FFBE18950FED0DBF00E808B95B\r
+:10047000A8950FE001BD929A8A9A8C9A8D9A8E9ACD\r
+:100480008F9A8B9AA39AA59AB89AB99ABA9AA19A6E\r
+:1004900003E005BB00E002BB0FE809B900E90AB9B7\r
+:1004A000332444241124222455246624772471EC17\r
+:1004B00001E2E02E00E20093D10001E20093D200BD\r
+:1004C00003E0C02EBB2400E6A02E5AE160E004E069\r
+:1004D00003BF08EB02BF02E008BF09BF00E00FBD89\r
+:1004E00004E00EBD78942CD1E2E041D10C1729F440\r
+:1004F000E3953DD10D1771F0EA950CEA3FD1E395F4\r
+:100500000BEF3CD1E39501E039D1E39500E036D122\r
+:10051000E39534D10FEDE02200E00EBB809BFECFCF\r
+:100520008824726099240FEDE02200E00EBB082DB4\r
+:10053000003288F40B3119F1083191F3043149F09C\r
+:100540000E3029F00D30F9F0E4DE802EECCF7E7F06\r
+:10055000FBCF7160F9CF70FD07C0092D0932A8F4F7\r
+:10056000082D27D10068008300E208117D7F082D47\r
+:1005700020D100838824092D0A3278F4E5CF092D93\r
+:10058000013018F42FC08824716071FD24C000E28E\r
+:1005900010D10083092D0A32D0F371FD1CC00091E7\r
+:1005A00065000695069506950695069506950093B1\r
+:1005B00065000C2D043008F003E00295D02A786025\r
+:1005C00073FDFECF7F77CC2029F00C2D035008F06F\r
+:1005D000E6D07068A6CF07E077FF06E0E0D0DED077\r
+:1005E00070689FCF96DE0E3219F400E2E02A7FC0D9\r
+:1005F0000F3309F491C0013479F0023481F00334EF\r
+:1006000009F4C8C00A3419F10B34C9F1023579F084\r
+:10061000043549F17EDE84CF7CDEC02E81CF79DEC9\r
+:10062000002321F077FF0A95BAD0706879CF71DE88\r
+:10063000002349F01091D100802E7C6073FDFECF25\r
+:100640001051D0F777FD6CCF706801E0F3CF61DE19\r
+:100650000A950F70102F5DDE0A950F700295012B21\r
+:100660000093D2005DCF55DE0A950F70102F51DE3A\r
+:100670000A950F700295012B0093D10051CF49DEEE\r
+:10068000002E47DEC02F45DED02F0C2B002949F16C\r
+:1006900001E077FD84D0726099243BDE802E00E07B\r
+:1006A00008117D7F082D9FD0092D003348F40015D7\r
+:1006B000A0F371FD17C000E096D0092D0033D8F3E8\r
+:1006C00071FD10C0746072FDFECF21970C2F0D2BB1\r
+:1006D00011F77F77CC2029F00C2D015008F05FD066\r
+:1006E00070681ECF01E01091D2005BD0EECF11DE1A\r
+:1006F000E2E00FDE43D0E3950CDE40D0E39509DE67\r
+:10070000F02F3CD0E39505DE39D0E39502DE36D0FC\r
+:10071000E395FA95D9F704CFFCDD0BE12EDE0FE36C\r
+:100720002CDE00E32ADEE2E022D027DEE3951FD0B4\r
+:1007300024DEE3951CD021DEE39519D01EDEF0CE39\r
+:10074000E4E015D0F02FFE5FCFEFDFEF11E2012ED6\r
+:1007500010E10DD0D027E39508E0CC0FDD1F10F499\r
+:10076000C025D1270A95C9F7FA9599F70895E19917\r
+:10077000FECFF894EEBBE09A0DB31895E199FECF49\r
+:10078000F894E5FEFFCFEEBB0DBBE5FEFFCFE29A8E\r
+:10079000E19A1895706174FDFECFC2CE0C2D1091B8\r
+:1007A000D1000F930B0D0F91E0F3B00E1051C8F76D\r
+:1007B0000895C02FD0E0E6E0DADFF02FE395D7DF31\r
+:1007C0000C1729F0E55FD395FA95C9F7DC2FE92DD1\r
+:1007D000EA59D083E92DE695E695E695E05A93949B\r
+:1007E000008106950895E92DE05A008393940895B9\r
+:1007F0000000000000000000000000181818181881\r
+:100800000018000000E763C600000000000000665A\r
+:1008100066FF66FF66660000187EDBD87E1BDB7E07\r
+:10082000180000E3E60C183067C700000078CCD849\r
+:1008300073DECC7B0000003C0C18000000000000C0\r
+:10084000000C18303030180C00000030180C0C0C64\r
+:10085000183000000018DB7E3C7EDB180000000032\r
+:100860001818FF18180000000000000000003C0CE1\r
+:10087000180000000000FF00000000000000000061\r
+:1008800000003C3C00000003060C183060C0000073\r
+:10089000007EC7CFDBF3E37E0000000C1C3C0C0C99\r
+:1008A0000C0C0000007EC3030E3860FF0000007EC9\r
+:1008B000C3033E03C37E0000001C3C6CCCFF0C0C49\r
+:1008C000000000FFC0FE0303C37E0000003E60C0C6\r
+:1008D000FEC3C37E000000FF03060C1818180000BA\r
+:1008E000007EC3C37EC3C37E0000007EC3C37F03FC\r
+:1008F000067C000000003C3C003C3C000000000086\r
+:100900003C3C003C0C180000000C18306030180C07\r
+:100910000000000000FF00FF000000000030180C85\r
+:10092000060C18300000007EC3030E1800180000EB\r
+:10093000007EC3DBDBDFC07C0000003C66C3FFC37E\r
+:10094000C3C3000000FEC3C3FEC3C3FE0000007E9D\r
+:10095000C3C0C0C0C37E000000FCC6C3C3C3C6FC86\r
+:10096000000000FFC0C0FEC0C0FF000000FFC0C00C\r
+:10097000FEC0C0C00000007EC3C0C0CFC37F000067\r
+:1009800000C3C3C3FFC3C3C300000018181818185E\r
+:1009900018180000000303030303C37E000000C314\r
+:1009A000C6CCF8CCC6C3000000C0C0C0C0C0C0FFE9\r
+:1009B000000000C3E7FFDBC3C3C3000000C3E3F3D1\r
+:1009C000DBCFC7C30000007EC3C3C3C3C37E000028\r
+:1009D00000FEC3C3FEC0C0C00000007EC3C3C3C3CB\r
+:1009E000CF7E030000FEC3C3FECCC6C30000007E62\r
+:1009F000C3C07E03C37E000000FF18181818181823\r
+:100A0000000000C3C3C3C3C3C37E000000C3C3C38D\r
+:100A1000C3663C18000000C3C3C3C3DBFF6600000D\r
+:100A200000C3663C183C66C3000000C3C3663C18A4\r
+:100A30001818000000FF060C183060FF0000003C92\r
+:100A400030303030303C000000C06030180C0603FD\r
+:100A50000000003C0C0C0C0C0C3C0000183C66C365\r
+:100A600000000000000000000000000000FF000087\r
+:100A70000C181E000000000000000000007E037F34\r
+:100A8000C37F000000C0C0FEC3C3C3FE000000005F\r
+:100A9000007EC3C0C37E00000003037FC3C3C37FC7\r
+:100AA00000000000007EC3FFC07E0000001E333047\r
+:100AB000FC30303000000000007FC3C3C37F037EE2\r
+:100AC00000C0C0FEC3C3C3C300000018001818183C\r
+:100AD000181800000006000606060606067C00C080\r
+:100AE000C0C6CCF8CCC60000003030303030301CEE\r
+:100AF0000000000000FEDBDBDBDB0000000000FE8E\r
+:100B0000C3C3C3C300000000007EC3C3C37E000094\r
+:100B1000000000FEC3C3C3FEC0C00000007FC3C30B\r
+:100B2000C37F0303000000FEC3C0C0C0000000007C\r
+:100B3000007EC07E037E00000018187E1818180E74\r
+:100B40000000000000C3C3C3C37F0000000000C357\r
+:100B5000C3663C180000000000C3C3DBFF66000052\r
+:100B6000000000C3663C66C30000000000C3C3C3AE\r
+:100B7000C37F037E000000FF0C1830FF0000000E52\r
+:100B800018187018180E00000018181800181818F7\r
+:100B90000000007018180E18187000000076DC00B5\r
+:100BA000000000000000000000183C66C3FF0000C9\r
+:042000000541B2AC38\r
+:00000001FF\r
diff --git a/src/avr/MT102V1.HEX b/src/avr/MT102V1.HEX
new file mode 100644 (file)
index 0000000..1e074a5
--- /dev/null
@@ -0,0 +1,191 @@
+:020000020000FC\r
+:0200000033C209\r
+:04000A007CC104C0F1\r
+:10001000DDC1C7C118C2FFB65F936F9358EB52BFE3\r
+:10002000A89508956F915F91FFBE1895BA9494D0EA\r
+:10003000F9DF90D0F7DFBB2019F4272F2C70B9F02F\r
+:10004000E1FC06C022E1E22A89D0A298AA9AEADF5E\r
+:10005000BB2061F773FF20C172FF82C0382D737F10\r
+:1000600079D0E0DF79D0DEDF3A95D1F7E4CFE1FE59\r
+:100070000BC0D8DF2DEFE22220E174FFE22A20E05E\r
+:1000800022BBAA98A29AD6CF74FD38C020E022BF26\r
+:1000900020E4E20E78F69298A398A298AA9A20E714\r
+:1000A000E0FE20E822BFBEDF2091D30023952093FD\r
+:1000B000D30011F420E1E22A33B3929AA39AAA98CA\r
+:1000C000A29A33FD06C020E1E0FCE22A2EEFE222F4\r
+:1000D00004C0E0FC02C021E1E22A32FD0AC0E3FED6\r
+:1000E000A9CF28E7E0FCB22E20E1E22A27EFE222A6\r
+:1000F000A1CFE3FC9FCF28E1E22A9CCF7F7E24E1C1\r
+:10010000E22AA998A0E2BEE438EE43E0119779F024\r
+:100110002CEF22BF87DF9899F7CF31504040B1F7DD\r
+:10012000119729F02CEF22BF7DDF989BF9CFA99A78\r
+:10013000A8EEB3E02CEF22BF75DF1197D9F72BEFB4\r
+:10014000E2222B2D222329F4272F2C7011F420E1F9\r
+:10015000E22A70CF20EA01C020E5A226A2BA0895C3\r
+:100160002FEF22BFDD0CDD0C20ECD22277FFD394E1\r
+:10017000A0E8B1E080E090E030E0EF93FF93E32F60\r
+:10018000E695E695E695E05A2081532F57705395F2\r
+:100190004091D1004F7026955A95E9F710F4440F1D\r
+:1001A0004F57E32FEA5920812032C8F0E22FFF2772\r
+:1001B000EE0FFF1FEE0FFF1FE20F20E0F21FEE0F0A\r
+:1001C000FF1F2D2D2F70E20F20E0F21F20EBE20F1A\r
+:1001D00026E0F21F602DC895202D062E0FC0E22FBD\r
+:1001E000EE0FEE0FE20FEE0FE20FE85F2D2D2F70F6\r
+:1001F000E20FE199FECFEEBBE09A2DB3FF91EF91B4\r
+:1002000011DF5FEF47FD5EEF52BF65D061E064D064\r
+:1002100009DF5FEF47FD5EEF52BF339547FD339532\r
+:100220003A3208F4AACF20E046E061E055D02D2D07\r
+:10023000203C20F42395203808F423952F70293092\r
+:1002400008F0777F4091D100939A9398EBDE84DF9A\r
+:1002500027E028BBE7DE382F292F269537952695EE\r
+:100260003795385E2A2D79DF5FEF52BFDBDE3A9596\r
+:10027000D1F7A22E20E028BB6DDF405138F72D2D9D\r
+:10028000203C20F42395203808F423952F70293042\r
+:1002900010F4D3946DCFCECE2FEF22BFA0E8B1E003\r
+:1002A00080E090E030E0EF93E32FE05A2081EF917F\r
+:1002B0004091D2004F70B6DE5FEF52BF0CD0B2DE7D\r
+:1002C0005FEF52BF3395303370F37B7F2FEFD22E29\r
+:1002D0004091D200B9CF68E0AA2311F4BB2381F08A\r
+:1002E000220F08F4AB9A542F5F77AD9AAB99019621\r
+:1002F0001197AD9829F05150C0F7AB986A9581F7E6\r
+:10030000AB9808952FE121BD27E121BD20E325BF52\r
+:1003100088950FEF0DBD00E00CBD00E808BF02E8B6\r
+:1003200009BF00E00EBB809B04C00FEF0DBD00E0D5\r
+:100330000CBDE4FE0FC0042D013060F400E000931A\r
+:10034000D3000FEEE0220E2D0F7000630A3308F089\r
+:10035000095F18D0222029F302E009BFCF93DF9371\r
+:10036000C12DCF56DD270881F8942A941394CFE34A\r
+:100370001C227894DF91CF9108950F93042D0130C2\r
+:10038000E8F70F91CF93DF93DFB7F894C42DC30D37\r
+:10039000DFBFC070C057DD2708834394DF91CF9142\r
+:1003A0000895FFB64F934EEC742EEF93FF93E32D19\r
+:1003B000E057FF274081FF91EF914CB94A94339465\r
+:1003C00040E034226A940AF046C04BC0FFB64F9317\r
+:1003D0004EEC742E4CB15C9938C057FC26C056FCCC\r
+:1003E00008C0453029F445E049B9539A40E4542AFD\r
+:1003F00038C0642E40E442190AF44FE7662012F434\r
+:10040000442D40684CB9461508F4642E462D4F77AC\r
+:1004100039F040EC542A6A9422F55798559A21C035\r
+:100420004FEB5422569A5E9A1CC0EF93FF93E22D35\r
+:10043000E10DEF73EF56FF274083FF91EF91239477\r
+:100440006A947AF40CC0FFB64F9353984FE849B9B9\r
+:100450004FEB5422772455985698579A4CB14FE752\r
+:1004600054224F91FFBE18950FED0DBF00E808B95B\r
+:10047000A8950FE001BD929A8A9A8C9A8D9A8E9ACD\r
+:100480008F9A8B9AA39AA59AB89AB99ABA9AA19A6E\r
+:1004900003E005BB00E002BB0FE809B900E90AB9B7\r
+:1004A000332444241124222455246624772471EC17\r
+:1004B00001E2E02E00E20093D10001E20093D200BD\r
+:1004C00003E0C02EBB2400E6A02E5AE160E004E069\r
+:1004D00003BF08EB02BF02E008BF09BF00E00FBD89\r
+:1004E00004E00EBD78942CD1E2E041D10C1729F440\r
+:1004F000E3953DD10D1771F0EA950CEA3FD1E395F4\r
+:100500000BEF3CD1E39501E039D1E39500E036D122\r
+:10051000E39534D10FEDE02200E00EBB809BFECFCF\r
+:100520008824726099240FEDE02200E00EBB082DB4\r
+:10053000003288F40B3119F1083191F3043149F09C\r
+:100540000E3029F00D30F9F0E4DE802EECCF7E7F06\r
+:10055000FBCF7160F9CF70FD07C0092D0932A8F4F7\r
+:10056000082D27D10068008300E208117D7F082D47\r
+:1005700020D100838824092D0A3278F4E5CF092D93\r
+:10058000013018F42FC08824716071FD24C000E28E\r
+:1005900010D10083092D0A32D0F371FD1CC00091E7\r
+:1005A00065000695069506950695069506950093B1\r
+:1005B00065000C2D043008F003E00295D02A786025\r
+:1005C00073FDFECF7F77CC2029F00C2D035008F06F\r
+:1005D000E6D07068A6CF07E077FF06E0E0D0DED077\r
+:1005E00070689FCF96DE0E3219F400E2E02A7FC0D9\r
+:1005F0000F3309F491C0013479F0023481F00334EF\r
+:1006000009F4C8C00A3419F10B34C9F1023579F084\r
+:10061000043549F17EDE84CF7CDEC02E81CF79DEC9\r
+:10062000002321F077FF0A95BAD0706879CF71DE88\r
+:10063000002349F01091D100802E7C6073FDFECF25\r
+:100640001051D0F777FD6CCF706801E0F3CF61DE19\r
+:100650000A950F70102F5DDE0A950F700295012B21\r
+:100660000093D2005DCF55DE0A950F70102F51DE3A\r
+:100670000A950F700295012B0093D10051CF49DEEE\r
+:10068000002E47DEC02F45DED02F0C2B002949F16C\r
+:1006900001E077FD84D0726099243BDE802E00E07B\r
+:1006A00008117D7F082D9FD0092D003348F40015D7\r
+:1006B000A0F371FD17C000E096D0092D0033D8F3E8\r
+:1006C00071FD10C0746072FDFECF21970C2F0D2BB1\r
+:1006D00011F77F77CC2029F00C2D015008F05FD066\r
+:1006E00070681ECF01E01091D2005BD0EECF11DE1A\r
+:1006F000E2E00FDE43D0E3950CDE40D0E39509DE67\r
+:10070000F02F3CD0E39505DE39D0E39502DE36D0FC\r
+:10071000E395FA95D9F704CFFCDD0BE12EDE0FE36C\r
+:100720002CDE00E32ADEE2E022D027DEE3951FD0B4\r
+:1007300024DEE3951CD021DEE39519D01EDEF0CE39\r
+:10074000E4E015D0F02FFE5FCFEFDFEF11E2012ED6\r
+:1007500010E10DD0D027E39508E0CC0FDD1F10F499\r
+:10076000C025D1270A95C9F7FA9599F70895E19917\r
+:10077000FECFF894EEBBE09A0DB31895E199FECF49\r
+:10078000F894E5FEFFCFEEBB0DBBE5FEFFCFE29A8E\r
+:10079000E19A1895706174FDFECFC2CE0C2D1091B8\r
+:1007A000D1000F930B0D0F91E0F3B00E1051C8F76D\r
+:1007B0000895C02FD0E0E6E0DADFF02FE395D7DF31\r
+:1007C0000C1729F0E55FD395FA95C9F7DC2FE92DD1\r
+:1007D000EA59D083E92DE695E695E695E05A93949B\r
+:1007E000008106950895E92DE05A008393940895B9\r
+:1007F0000000000000000000000000181818181881\r
+:100800000018000000E763C600000000000000665A\r
+:1008100066FF66FF66660000187EDBD87E1BDB7E07\r
+:10082000180000E3E60C183067C700000078CCD849\r
+:1008300073DECC7B0000003C0C18000000000000C0\r
+:10084000000C18303030180C00000030180C0C0C64\r
+:10085000183000000018DB7E3C7EDB180000000032\r
+:100860001818FF18180000000000000000003C0CE1\r
+:10087000180000000000FF00000000000000000061\r
+:1008800000003C3C00000003060C183060C0000073\r
+:10089000007EC7CFDBF3E37E0000000C1C3C0C0C99\r
+:1008A0000C0C0000007EC3030E3860FF0000007EC9\r
+:1008B000C3033E03C37E0000001C3C6CCCFF0C0C49\r
+:1008C000000000FFC0FE0303C37E0000003E60C0C6\r
+:1008D000FEC3C37E000000FF03060C1818180000BA\r
+:1008E000007EC3C37EC3C37E0000007EC3C37F03FC\r
+:1008F000067C000000003C3C003C3C000000000086\r
+:100900003C3C003C0C180000000C18306030180C07\r
+:100910000000000000FF00FF000000000030180C85\r
+:10092000060C18300000007EC3030E1800180000EB\r
+:10093000007EC3DBDBDFC07C0000003C66C3FFC37E\r
+:10094000C3C3000000FEC3C3FEC3C3FE0000007E9D\r
+:10095000C3C0C0C0C37E000000FCC6C3C3C3C6FC86\r
+:10096000000000FFC0C0FEC0C0FF000000FFC0C00C\r
+:10097000FEC0C0C00000007EC3C0C0CFC37F000067\r
+:1009800000C3C3C3FFC3C3C300000018181818185E\r
+:1009900018180000000303030303C37E000000C314\r
+:1009A000C6CCF8CCC6C3000000C0C0C0C0C0C0FFE9\r
+:1009B000000000C3E7FFDBC3C3C3000000C3E3F3D1\r
+:1009C000DBCFC7C30000007EC3C3C3C3C37E000028\r
+:1009D00000FEC3C3FEC0C0C00000007EC3C3C3C3CB\r
+:1009E000CF7E030000FEC3C3FECCC6C30000007E62\r
+:1009F000C3C07E03C37E000000FF18181818181823\r
+:100A0000000000C3C3C3C3C3C37E000000C3C3C38D\r
+:100A1000C3663C18000000C3C3C3C3DBFF6600000D\r
+:100A200000C3663C183C66C3000000C3C3663C18A4\r
+:100A30001818000000FF060C183060FF0000003C92\r
+:100A400030303030303C000000C06030180C0603FD\r
+:100A50000000003C0C0C0C0C0C3C0000183C66C365\r
+:100A600000000000000000000000000000FF000087\r
+:100A70000C181E000000000000000000007E037F34\r
+:100A8000C37F000000C0C0FEC3C3C3FE000000005F\r
+:100A9000007EC3C0C37E00000003037FC3C3C37FC7\r
+:100AA00000000000007EC3FFC07E0000001E333047\r
+:100AB000FC30303000000000007FC3C3C37F037EE2\r
+:100AC00000C0C0FEC3C3C3C300000018001818183C\r
+:100AD000181800000006000606060606067C00C080\r
+:100AE000C0C6CCF8CCC60000003030303030301CEE\r
+:100AF0000000000000FEDBDBDBDB0000000000FE8E\r
+:100B0000C3C3C3C300000000007EC3C3C37E000094\r
+:100B1000000000FEC3C3C3FEC0C00000007FC3C30B\r
+:100B2000C37F0303000000FEC3C0C0C0000000007C\r
+:100B3000007EC07E037E00000018187E1818180E74\r
+:100B40000000000000C3C3C3C37F0000000000C357\r
+:100B5000C3663C180000000000C3C3DBFF66000052\r
+:100B6000000000C3663C66C30000000000C3C3C3AE\r
+:100B7000C37F037E000000FF0C1830FF0000000E52\r
+:100B800018187018180E00000018181800181818F7\r
+:100B90000000007018180E18187000000076DC00B5\r
+:100BA000000000000000000000183C66C3FF0000C9\r
+:042000000541BAAC30\r
+:00000001FF\r
diff --git a/src/avr/MT102V2.HEX b/src/avr/MT102V2.HEX
new file mode 100644 (file)
index 0000000..9d5f9c2
--- /dev/null
@@ -0,0 +1,191 @@
+:020000020000FC\r
+:0200000033C209\r
+:04000A007CC104C0F1\r
+:10001000DDC1C7C118C2FFB65F936F9358EB52BFE3\r
+:10002000A89508956F915F91FFBE1895BA9494D0EA\r
+:10003000F9DF90D0F7DFBB2019F4272F2C70B9F02F\r
+:10004000E1FC06C022E1E22A89D0A298AA9AEADF5E\r
+:10005000BB2061F773FF20C172FF82C0382D737F10\r
+:1000600079D0E0DF79D0DEDF3A95D1F7E4CFE1FE59\r
+:100070000BC0D8DF2DEFE22220E174FFE22A20E05E\r
+:1000800022BBAA98A29AD6CF74FD38C020E022BF26\r
+:1000900020E4E20E78F69298A398A298AA9A20E714\r
+:1000A000E0FE20E822BFBEDF2091D30023952093FD\r
+:1000B000D30011F420E1E22A33B3929AA39AAA98CA\r
+:1000C000A29A33FD06C020E1E0FCE22A2EEFE222F4\r
+:1000D00004C0E0FC02C021E1E22A32FD0AC0E3FED6\r
+:1000E000A9CF28E7E0FCB22E20E1E22A27EFE222A6\r
+:1000F000A1CFE3FC9FCF28E1E22A9CCF7F7E24E1C1\r
+:10010000E22AA998A0E2BEE438EE43E0119779F024\r
+:100110002CEF22BF87DF9899F7CF31504040B1F7DD\r
+:10012000119729F02CEF22BF7DDF989BF9CFA99A78\r
+:10013000A8EEB3E02CEF22BF75DF1197D9F72BEFB4\r
+:10014000E2222B2D222329F4272F2C7011F420E1F9\r
+:10015000E22A70CF20EA01C020E5A226A2BA0895C3\r
+:100160002FEF22BFDD0CDD0C20ECD22277FFD394E1\r
+:10017000A0E8B1E080E090E030E0EF93FF93E32F60\r
+:10018000E695E695E695E05A2081532F57705395F2\r
+:100190004091D1004F7026955A95E9F710F4440F1D\r
+:1001A0004F57E32FEA5920812032C8F0E22FFF2772\r
+:1001B000EE0FFF1FEE0FFF1FE20F20E0F21FEE0F0A\r
+:1001C000FF1F2D2D2F70E20F20E0F21F20EBE20F1A\r
+:1001D00026E0F21F602DC895202D062E0FC0E22FBD\r
+:1001E000EE0FEE0FE20FEE0FE20FE85F2D2D2F70F6\r
+:1001F000E20FE199FECFEEBBE09A2DB3FF91EF91B4\r
+:1002000011DF5FEF47FD5EEF52BF65D061E064D064\r
+:1002100009DF5FEF47FD5EEF52BF339547FD339532\r
+:100220003A3208F4AACF20E046E061E055D02D2D07\r
+:10023000203C20F42395203808F423952F70293092\r
+:1002400008F0777F4091D100939A9398EBDE84DF9A\r
+:1002500027E028BBE7DE382F292F269537952695EE\r
+:100260003795385E2A2D79DF5FEF52BFDBDE3A9596\r
+:10027000D1F7A22E20E028BB6DDF405138F72D2D9D\r
+:10028000203C20F42395203808F423952F70293042\r
+:1002900010F4D3946DCFCECE2FEF22BFA0E8B1E003\r
+:1002A00080E090E030E0EF93E32FE05A2081EF917F\r
+:1002B0004091D2004F70B6DE5FEF52BF0CD0B2DE7D\r
+:1002C0005FEF52BF3395303370F37B7F2FEFD22E29\r
+:1002D0004091D200B9CF68E0AA2311F4BB2381F08A\r
+:1002E000220F08F4AB9A542F5F77AD9AAB99019621\r
+:1002F0001197AD9829F05150C0F7AB986A9581F7E6\r
+:10030000AB9808952FE121BD27E121BD20E325BF52\r
+:1003100088950FEF0DBD00E00CBD00E808BF02E8B6\r
+:1003200009BF00E00EBB809B04C00FEF0DBD00E0D5\r
+:100330000CBDE4FE0FC0042D013060F400E000931A\r
+:10034000D3000FEEE0220E2D0F7000630A3308F089\r
+:10035000095F18D0222029F302E009BFCF93DF9371\r
+:10036000C12DCF56DD270881F8942A941394CFE34A\r
+:100370001C227894DF91CF9108950F93042D0130C2\r
+:10038000E8F70F91CF93DF93DFB7F894C42DC30D37\r
+:10039000DFBFC070C057DD2708834394DF91CF9142\r
+:1003A0000895FFB64F934EEC742EEF93FF93E32D19\r
+:1003B000E057FF274081FF91EF914CB94A94339465\r
+:1003C00040E034226A940AF046C04BC0FFB64F9317\r
+:1003D0004EEC742E4CB15C9938C057FC26C056FCCC\r
+:1003E00008C0453029F443E049B9539A40E4542AFF\r
+:1003F00038C0642E40E442190AF44FE7662012F434\r
+:10040000442D40684CB9461508F4642E462D4F77AC\r
+:1004100039F040EC542A6A9422F55798559A21C035\r
+:100420004FEB5422569A5E9A1CC0EF93FF93E22D35\r
+:10043000E10DEF73EF56FF274083FF91EF91239477\r
+:100440006A947AF40CC0FFB64F9353984FE549B9BC\r
+:100450004FEB5422772455985698579A4CB14FE752\r
+:1004600054224F91FFBE18950FED0DBF00E808B95B\r
+:10047000A8950FE001BD929A8A9A8C9A8D9A8E9ACD\r
+:100480008F9A8B9AA39AA59AB89AB99ABA9AA19A6E\r
+:1004900003E005BB00E002BB0FE509B900E90AB9BA\r
+:1004A000332444241124222455246624772471EC17\r
+:1004B00001E2E02E00E20093D10001E20093D200BD\r
+:1004C00003E0C02EBB2400E6A02E5AE160E004E069\r
+:1004D00003BF08EB02BF02E008BF09BF00E00FBD89\r
+:1004E00004E00EBD78942CD1E2E041D10C1729F440\r
+:1004F000E3953DD10D1771F0EA950CEA3FD1E395F4\r
+:100500000BEF3CD1E39501E039D1E39500E036D122\r
+:10051000E39534D10FEDE02200E00EBB809BFECFCF\r
+:100520008824726099240FEDE02200E00EBB082DB4\r
+:10053000003288F40B3119F1083191F3043149F09C\r
+:100540000E3029F00D30F9F0E4DE802EECCF7E7F06\r
+:10055000FBCF7160F9CF70FD07C0092D0932A8F4F7\r
+:10056000082D27D10068008300E208117D7F082D47\r
+:1005700020D100838824092D0A3278F4E5CF092D93\r
+:10058000013018F42FC08824716071FD24C000E28E\r
+:1005900010D10083092D0A32D0F371FD1CC00091E7\r
+:1005A00065000695069506950695069506950093B1\r
+:1005B00065000C2D043008F003E00295D02A786025\r
+:1005C00073FDFECF7F77CC2029F00C2D035008F06F\r
+:1005D000E6D07068A6CF07E077FF06E0E0D0DED077\r
+:1005E00070689FCF96DE0E3219F400E2E02A7FC0D9\r
+:1005F0000F3309F491C0013479F0023481F00334EF\r
+:1006000009F4C8C00A3419F10B34C9F1023579F084\r
+:10061000043549F17EDE84CF7CDEC02E81CF79DEC9\r
+:10062000002321F077FF0A95BAD0706879CF71DE88\r
+:10063000002349F01091D100802E7C6073FDFECF25\r
+:100640001051D0F777FD6CCF706801E0F3CF61DE19\r
+:100650000A950F70102F5DDE0A950F700295012B21\r
+:100660000093D2005DCF55DE0A950F70102F51DE3A\r
+:100670000A950F700295012B0093D10051CF49DEEE\r
+:10068000002E47DEC02F45DED02F0C2B002949F16C\r
+:1006900001E077FD84D0726099243BDE802E00E07B\r
+:1006A00008117D7F082D9FD0092D003348F40015D7\r
+:1006B000A0F371FD17C000E096D0092D0033D8F3E8\r
+:1006C00071FD10C0746072FDFECF21970C2F0D2BB1\r
+:1006D00011F77F77CC2029F00C2D015008F05FD066\r
+:1006E00070681ECF01E01091D2005BD0EECF11DE1A\r
+:1006F000E2E00FDE43D0E3950CDE40D0E39509DE67\r
+:10070000F02F3CD0E39505DE39D0E39502DE36D0FC\r
+:10071000E395FA95D9F704CFFCDD0BE12EDE0FE36C\r
+:100720002CDE00E32ADEE2E022D027DEE3951FD0B4\r
+:1007300024DEE3951CD021DEE39519D01EDEF0CE39\r
+:10074000E4E015D0F02FFE5FCFEFDFEF11E2012ED6\r
+:1007500010E10DD0D027E39508E0CC0FDD1F10F499\r
+:10076000C025D1270A95C9F7FA9599F70895E19917\r
+:10077000FECFF894EEBBE09A0DB31895E199FECF49\r
+:10078000F894E5FEFFCFEEBB0DBBE5FEFFCFE29A8E\r
+:10079000E19A1895706174FDFECFC2CE0C2D1091B8\r
+:1007A000D1000F930B0D0F91E0F3B00E1051C8F76D\r
+:1007B0000895C02FD0E0E6E0DADFF02FE395D7DF31\r
+:1007C0000C1729F0E55FD395FA95C9F7DC2FE92DD1\r
+:1007D000EA59D083E92DE695E695E695E05A93949B\r
+:1007E000008106950895E92DE05A008393940895B9\r
+:1007F0000000000000000000000000181818181881\r
+:100800000018000000E763C600000000000000665A\r
+:1008100066FF66FF66660000187EDBD87E1BDB7E07\r
+:10082000180000E3E60C183067C700000078CCD849\r
+:1008300073DECC7B0000003C0C18000000000000C0\r
+:10084000000C18303030180C00000030180C0C0C64\r
+:10085000183000000018DB7E3C7EDB180000000032\r
+:100860001818FF18180000000000000000003C0CE1\r
+:10087000180000000000FF00000000000000000061\r
+:1008800000003C3C00000003060C183060C0000073\r
+:10089000007EC7CFDBF3E37E0000000C1C3C0C0C99\r
+:1008A0000C0C0000007EC3030E3860FF0000007EC9\r
+:1008B000C3033E03C37E0000001C3C6CCCFF0C0C49\r
+:1008C000000000FFC0FE0303C37E0000003E60C0C6\r
+:1008D000FEC3C37E000000FF03060C1818180000BA\r
+:1008E000007EC3C37EC3C37E0000007EC3C37F03FC\r
+:1008F000067C000000003C3C003C3C000000000086\r
+:100900003C3C003C0C180000000C18306030180C07\r
+:100910000000000000FF00FF000000000030180C85\r
+:10092000060C18300000007EC3030E1800180000EB\r
+:10093000007EC3DBDBDFC07C0000003C66C3FFC37E\r
+:10094000C3C3000000FEC3C3FEC3C3FE0000007E9D\r
+:10095000C3C0C0C0C37E000000FCC6C3C3C3C6FC86\r
+:10096000000000FFC0C0FEC0C0FF000000FFC0C00C\r
+:10097000FEC0C0C00000007EC3C0C0CFC37F000067\r
+:1009800000C3C3C3FFC3C3C300000018181818185E\r
+:1009900018180000000303030303C37E000000C314\r
+:1009A000C6CCF8CCC6C3000000C0C0C0C0C0C0FFE9\r
+:1009B000000000C3E7FFDBC3C3C3000000C3E3F3D1\r
+:1009C000DBCFC7C30000007EC3C3C3C3C37E000028\r
+:1009D00000FEC3C3FEC0C0C00000007EC3C3C3C3CB\r
+:1009E000CF7E030000FEC3C3FECCC6C30000007E62\r
+:1009F000C3C07E03C37E000000FF18181818181823\r
+:100A0000000000C3C3C3C3C3C37E000000C3C3C38D\r
+:100A1000C3663C18000000C3C3C3C3DBFF6600000D\r
+:100A200000C3663C183C66C3000000C3C3663C18A4\r
+:100A30001818000000FF060C183060FF0000003C92\r
+:100A400030303030303C000000C06030180C0603FD\r
+:100A50000000003C0C0C0C0C0C3C0000183C66C365\r
+:100A600000000000000000000000000000FF000087\r
+:100A70000C181E000000000000000000007E037F34\r
+:100A8000C37F000000C0C0FEC3C3C3FE000000005F\r
+:100A9000007EC3C0C37E00000003037FC3C3C37FC7\r
+:100AA00000000000007EC3FFC07E0000001E333047\r
+:100AB000FC30303000000000007FC3C3C37F037EE2\r
+:100AC00000C0C0FEC3C3C3C300000018001818183C\r
+:100AD000181800000006000606060606067C00C080\r
+:100AE000C0C6CCF8CCC60000003030303030301CEE\r
+:100AF0000000000000FEDBDBDBDB0000000000FE8E\r
+:100B0000C3C3C3C300000000007EC3C3C37E000094\r
+:100B1000000000FEC3C3C3FEC0C00000007FC3C30B\r
+:100B2000C37F0303000000FEC3C0C0C0000000007C\r
+:100B3000007EC07E037E00000018187E1818180E74\r
+:100B40000000000000C3C3C3C37F0000000000C357\r
+:100B5000C3663C180000000000C3C3DBFF66000052\r
+:100B6000000000C3663C66C30000000000C3C3C3AE\r
+:100B7000C37F037E000000FF0C1830FF0000000E52\r
+:100B800018187018180E00000018181800181818F7\r
+:100B90000000007018180E18187000000076DC00B5\r
+:100BA000000000000000000000183C66C3FF0000C9\r
+:042000000541B2AC38\r
+:00000001FF\r
diff --git a/src/avr/TAVRASM.EXE b/src/avr/TAVRASM.EXE
new file mode 100644 (file)
index 0000000..dddb3ae
Binary files /dev/null and b/src/avr/TAVRASM.EXE differ
diff --git a/src/avr/TSV3.HEX b/src/avr/TSV3.HEX
new file mode 100644 (file)
index 0000000..0b6e310
--- /dev/null
@@ -0,0 +1,504 @@
+:020000020000FC\r
+:100000000DC006C606C6189505C61895189518950C\r
+:1000100002C602C61895EDC6D7C62EC702E00EBFAF\r
+:100020000FE50DBF10E818B9A8951FE011BD00E05D\r
+:1000300000935F01009360010093610100936201EE\r
+:10004000009363010093640101E000936501009354\r
+:10005000660104E10093670108E002BD03E005BD0D\r
+:1000600000E409BF00E00BBF08EB01BB02BB0FE1DE\r
+:1000700007BB0FEF0ABB04BB00270BBB03E008BBA9\r
+:1000800000E105BBC29AC2980093190100E2B02EAC\r
+:100090001FE519B910E91AB9442455242224332440\r
+:1000A000EE246624CC2458E15BBBC49AC4985093D8\r
+:1000B000170155275093180150933B0150936A0143\r
+:1000C00050936B0150931001DD24D0921401D09213\r
+:1000D0001501D092160154EF509369015BBB50910A\r
+:1000E000190155BBA89AC29AC298A898C29AC298F8\r
+:1000F0007894E2E0F9E1A2EEB0E0DBE1D0931A01FE\r
+:1001000008D1D0E8C0ECDBBBC39AC398D0931801E8\r
+:10011000C5BBC89500240BBAC198C0980000C09A0E\r
+:10012000C19AAA9541F03196C3951C2F1F7381F790\r
+:10013000C054D395E8CF10E3D9D2CF93DF93E4D264\r
+:10014000BF91AF915FD5212F1D2F129533D3121779\r
+:10015000B1F4119657D5212F1D2F2CD3121779F4F6\r
+:10016000119650D5212F1C2F129524D3121739F434\r
+:10017000119648D5212F1C2F1DD3121709F1E4EE3B\r
+:10018000F9E1A6E6B3E0D9E1D0931A01C2D0D0E0FC\r
+:10019000C0E4DBBBC39AC398D0931801C5BBC89514\r
+:1001A0000BBAC198C0980000C09AC19A119741F04B\r
+:1001B0003196C3951C2F1F7389F7C054D395E9CF8F\r
+:1001C00020E12093030120E42093040129E12093FE\r
+:1001D0000501C0E0D0E218E118D520E82F93CF93B5\r
+:1001E000DF9320E211D5269622E00ED5DF91CF9144\r
+:1001F0002F91C05CDF4F2A9589F7B4D610E0109399\r
+:10020000110116E31093100110E01093680110E043\r
+:1002100010934C0110934D011EEF10930D011CEA39\r
+:1002200010930C0122E020D21C7F10930E0123E0DA\r
+:100230001BD210930F0110910E0120910F011A3360\r
+:100240000DEF200720F01C3B0DEF200730F01DEFD5\r
+:1002500010930F0110E810930E011FEF19BD18E362\r
+:1002600018BD1CEF1DBD1EEC1CBD10E51FBD11E02F\r
+:100270001EBD00E003BF05E008BF05E409BF0AE0BA\r
+:1002800005BF00EC0ABF0BBF9EC202E00EBF0FE528\r
+:100290000DBF50E05FBD5EBD949A959850911701D7\r
+:1002A0005F7B5BBBC49AC4985093170154E7B6FEBA\r
+:1002B00054E3509369015BBB5091190155BBA89A57\r
+:1002C000C29AC298A898C29AC29851E459BF50E005\r
+:1002D00053BF5BBF04E000936A011FE519B910E941\r
+:1002E0001AB94424552422243324EE246624CC2431\r
+:1002F000F89403B700230AE411F4809B0AE705BFD2\r
+:1003000078948895A89500916A01002389F7F8945C\r
+:10031000A3CED0911A01C0911701C07EDC2BDBBBAC\r
+:10032000C49AC498D0931701089578941FEDE122E0\r
+:1003300010E01EBB1FBBE2D21B3159F1B3FC0DC054\r
+:10034000103258F4183009F407C11D3009F41CC1EB\r
+:100350001A3009F4C0C0173041F7B2FC18C010338E\r
+:10036000B1F4C0910301D091040120910501CC5F4B\r
+:10037000DD4FF894309117013227307E32273BBB96\r
+:10038000C49AC49878943093170193D5102DECD269\r
+:10039000CCCFB4D21B3109F31E3209F47CC11F3219\r
+:1003A00009F452C01F3309F491C1123409F45EC03C\r
+:1003B000123609F45FC0133409F40BC1133609F483\r
+:1003C000C4CC143409F4F2C0153409F4DFC0163477\r
+:1003D00009F40FC1163609F4C4CC173409F4A1C0CE\r
+:1003E000183409F4D6CC183609F4C7CC1B3409F4F8\r
+:1003F00096C01C3409F40AC41D3409F42EC01E34FE\r
+:1004000009F403C1103509F49AC0123509F4E3C0A8\r
+:10041000133509F4D9C0143509F440C0153509F471\r
+:100420006BC2163519F410E2E12AFBC0173509F446\r
+:1004300063C2183509F4C4C11A3509F4EEC110338A\r
+:1004400010F01A3310F171CF59D210FF03C014E02D\r
+:10045000B12A6BCF1BEFB12268CF50D2103329F4F1\r
+:10046000F89400E4B02A8A9A10CF5FCF47D21F9346\r
+:1004700010E004C043D21F9341D21F7010931101AA\r
+:100480001F911093100151CF39D230D1C0E1C093E8\r
+:100490000301D09304012093050147CF10E015BD5F\r
+:1004A00010935F01109360011093610127D21093A4\r
+:1004B000640124D21093630121D2109362011ED2F1\r
+:1004C000109366011BD21093650118D21093670137\r
+:1004D00013E015BD2ACF01D028CF0F92C0910301A0\r
+:1004E000D091040120910501DE5FC395F89430910D\r
+:1004F00017013227307E32273BBBC49AC4987894C8\r
+:1005000030931701D6D4182F100D100D1A951038EE\r
+:1005100018F0C0D00F900895800D0F90089522D547\r
+:1005200004CFECD1103309F404C0113309F404C032\r
+:10053000FCCE07EFB022F9CE08E0B02AF6CEDED12D\r
+:10054000103309F403C0113309F403C00FEEB022D5\r
+:10055000ECCE00E1B02AE9CEC0910301D0910401B4\r
+:1005600020910501DE5FF894309117013227307E2B\r
+:1005700032273BBBC49AC49878943093170199D41E\r
+:1005800070191FB712FFD1CE7727CFCEB7D111FD8B\r
+:1005900007C010FD03C00FEDB022C7CE00E2B02AA5\r
+:1005A000002700933B01EAD2F1F7BFCEA7D1103369\r
+:1005B00009F404C0113309F404C0B7CE0EEFB02221\r
+:1005C000B4CE01E0B02AB1CE99D1712F97D1812F4D\r
+:1005D000ACCE02E0B02A70935201809353018ED1C9\r
+:1005E000109354018BD11093550117D30DEFB02206\r
+:1005F0009CCE709356018093570180D1109358017F\r
+:100600007DD1109359015ED390CE709356018093A3\r
+:10061000570174D11093580171D11093590177D3B8\r
+:1006200084CE6CD110FF0BC010910E0120910F01F0\r
+:100630001C5F2F4F1C3B0DEF2007A8F40AC0109140\r
+:100640000E0120910F01145020401A330DEF2007A6\r
+:1006500050F010930E0120930F0122E00DD0109165\r
+:100660000F0123E009D061CEE199FECF2EBB2227F6\r
+:100670002FBBE09A1DB30895E199FECFE5FEFFCFB1\r
+:100680002EBB22272FBB1DBBF894E5FEFFCFE29ABD\r
+:10069000E19A189536C732D129D030D1A12F2ED169\r
+:1006A000B12F2CD1F894309117013227307E3227A8\r
+:1006B0003BBBC49AC498789430931701A4D2219676\r
+:1006C00011971A2F1B2B09F0ECCF2FCE17D10ED07C\r
+:1006D0001F931AD01BE133D11FE331D11F91105D5D\r
+:1006E0002ED11D2F60D01C2F5ED01FCEC0E0D0E0D9\r
+:1006F00024E61F701A3008F4210F2695D795269509\r
+:10070000D795D695D6950895A6E1B2E0AC0FBD1F5A\r
+:10071000F894309117013227307E32273BBBC49AC0\r
+:10072000C4987894309317016DD2E12F11966AD254\r
+:10073000F12FAC2FBD2F1496CFEFDFEF3197FF7065\r
+:10074000349780F131965ED2119601E220E1D127F3\r
+:10075000CC0FDD1F10F4C027D227CC0FDD1F10F403\r
+:10076000C027D227CC0FDD1F10F4C027D227CC0F13\r
+:10077000DD1F10F4C027D227CC0FDD1F10F4C027D7\r
+:10078000D227CC0FDD1F10F4C027D227CC0FDD1FDE\r
+:1007900010F4C027D227CC0FDD1F10F4C027D227BA\r
+:1007A000319789F608951F93129504D0C8D01F91F0\r
+:1007B00001D0C5C01F7010631A3308F0195F089587\r
+:1007C0009DD010FD13C070936C0180936D01B092A9\r
+:1007D0006E011091030110936F01109104011093A9\r
+:1007E000700110910501109371019FCD70916C0102\r
+:1007F00080916D0110ECB12210916E011F73B12A2E\r
+:1008000010916F0110930301109170011093040176\r
+:10081000109171011093050188CD70D010935A0189\r
+:100820006DD0C12F175F5DD020935B0167D0D12FB2\r
+:100830001C5F5CD020935C0161D01C0F1F5051D015\r
+:1008400020935D015BD01D0F115150D020935E01AC\r
+:10085000D0915C0110915E011D1B08F441C0C09154\r
+:100860005B011C2F1D0F2D2F220F220F220F120FA5\r
+:10087000220F120FA0E0B0EE20E0A10FB21F2BE17B\r
+:10088000F894309117013227307E32273BBBC49A4F\r
+:10089000C49878943093170110915D011C1BF0F0FF\r
+:1008A0003A2F3F7335BB3B2F330F330FA7FB31F983\r
+:1008B000A6FB30F93BBBF894C39AC3987894309365\r
+:1008C000180110915A011BBBF894C198C098000000\r
+:1008D000C09A7894C19A1196C395DECFD395BACFBA\r
+:1008E00024CD2FEF23951A50E8F708952FEF239585\r
+:1008F0001D50E8F7089502D001D017CD10EC1093E9\r
+:100900006B01A89510E01EBB1FBB10EC80991093E3\r
+:100910006B01B5FC33D13320A1F310E010936B01D0\r
+:10092000CF93DF93C22DC058DD271881F8943A94F5\r
+:100930002394CFE72C227894DF91CF9108951F93D1\r
+:10094000A895152D1032E0F71F91CF93DF93DFB7F5\r
+:10095000F894C52DC40DDFBFCF71C05ADD271883B1\r
+:100960005394DF91CF910895D2D0EFD00027009318\r
+:100970001201B4FC0FC0C0910301D0910401DE5FED\r
+:10098000F02C97D20F920F1808F4002406940092CE\r
+:1009900012010F90B3FC08C0072F000D28F4772731\r
+:1009A0009CDD10910501B9D600911201070F00934B\r
+:1009B0004E0180934F01700D60914E0190904F0158\r
+:1009C00086FE07C0C0915001D0915101229771D28B\r
+:1009D000900C87FE07C0C0915001D0915101239720\r
+:1009E00068D2600D5AD260930201A0920001C091BA\r
+:1009F0005001D091510121965CD2702C0FEF0ABBAF\r
+:100A0000C09A0FE18022809201010027801201C06C\r
+:100A10007DC0AA27B92DB695A795B695A795B05EC6\r
+:100A200007C09394A05CBF4F80900101A09000018B\r
+:100A3000AA2A22272196109105016FD63AD21127B2\r
+:100A400060910201662339F08894079417956A959E\r
+:100A5000E1F7022A212F08E1F8943091170130279D\r
+:100A6000307E30273BBBC49AC498789430931701EA\r
+:100A70003A2D3F7335BB3B2F330F330FA7FA31F9B4\r
+:100A8000A6FA30F93BBBF894C39AC3987894309394\r
+:100A9000180100270ABBF894C0980000C19809B358\r
+:100AA0000026B0FC002A0FEF0ABB0BBA0000C09A68\r
+:100AB0007894C19AA3948A9409F0BCCF222311F1AF\r
+:100AC0003A2D3F7335BB3B2F330F330FA7FA31F964\r
+:100AD000A6FA30F93BBBF894C39AC3987894309344\r
+:100AE000180100270ABBF894C0980000C19809B308\r
+:100AF0002027B0FC202B0FEF0ABB2BBB0000C09AB5\r
+:100B00007894C19A31D07A9409F08BCF0895C12F8F\r
+:100B1000DD27CC0FDD1F10910301C10F10910401DF\r
+:100B2000D11F10910501F9D5C4D12196F02CC1D166\r
+:100B3000CF2DD02D10910301C10F10910401D11FB1\r
+:100B4000C0935001D09351010895C0915001D091AC\r
+:100B50005101AFD1802C219785FCABC1C09103011D\r
+:100B6000D0910401DE5FA5C1CF93DF93192D39D059\r
+:100B70001881122B1883DF91CF9108952F93CF9373\r
+:100B8000DF9310913B012DD01881122309F41FC06F\r
+:100B900028812127288310E010936B01AF93BF9326\r
+:100BA000CC27D0913B01D695C795D695C795AC2F4C\r
+:100BB000BD2FB05E18E1B1D520E26CD51297269614\r
+:100BC00022E068D5BF91AF9110EC10936B011091AA\r
+:100BD0003B0113951F7710933B01DF91CF912F912C\r
+:100BE0000895CCE3D1E01F77212F269526952695F1\r
+:100BF000C20F20E0D21F21E0177019F0220F1A95C2\r
+:100C0000E9F7089554C56FC54CC587C597C48DCB0A\r
+:100C1000DFC1DFC18FC5E6C1C6C278949090530191\r
+:100C2000609152013AD160930201A092000170904C\r
+:100C30005501CC27D92DD695C795D695C795D05EA9\r
+:100C400018E16BD507C0C05CDF4F9394609102013F\r
+:100C5000A0900001AC2A1FEF8090540100E08016A4\r
+:100C600041F008E08016B8F0662319F016956A95F1\r
+:100C7000E9F73BD108E010910201011B801AA3940F\r
+:100C80001FEF08E0801638F0B1F02FD11FEF08E019\r
+:100C9000801AA394F6CF882079F016958A94E9F704\r
+:100CA0001095662341F02227169527956A95E1F75E\r
+:100CB0001CD1A394122F19D157DF7A9400277012F8\r
+:100CC000C2CF0895009158010A950230D0F30091E7\r
+:100CD00059010330B0F3009156010395009352017E\r
+:100CE0000091570100935301809058018A948A948F\r
+:100CF0008092540101E0009355018FDF009156016D\r
+:100D00000093520180905801809254013AC00091A2\r
+:100D100058010A950230A8F200915901033088F277\r
+:100D200000915601039500935201009157010093E1\r
+:100D30005301809058018A948A948092540101E072\r
+:100D4000009355016ADF0091560100935201009112\r
+:100D50005701039500935301709059017A947A9446\r
+:100D60007092550101E00093540157DF80905801C3\r
+:100D700000915601080D0A950093520101E000937D\r
+:100D8000540100915701039500935301709059014C\r
+:100D90007A947A947092550140DF00915601039540\r
+:100DA00000935201809058018A948A948092540151\r
+:100DB0007090590100915701070D0A950093530156\r
+:100DC00001E00093550129CF1FB60F930FEDC02E00\r
+:100DD000EF93FF93E42DE05AFF270081FF91EF91FD\r
+:100DE0000CB95A9443940FE140226A940AF04CC023\r
+:100DF00051C01FB60F930FEDC02E0CB15C993EC0D1\r
+:100E0000E7FC2CC0E6FC0EC0023031F403E009B967\r
+:100E1000539A00E4E02A3EC00A3A19F400E0009335\r
+:100E20006A0138C0602E00E803190AF40FE7662053\r
+:100E300012F4052D00680CB9061508F4602E062D75\r
+:100E40000F7739F000ECE02A6A9422F55798559A0A\r
+:100E500021C00FEBE022569A5E9A1CC0EF93FF93DD\r
+:100E6000E32DE20DEF77E058FF270083FF91EF912C\r
+:100E700033946A947AF40CC01FB60F9353980FE51D\r
+:100E800009B90FEBE022CC2455985698579A0CB12B\r
+:100E90000FE7E0220F911FBE1895AA2400EFA01AB9\r
+:100EA00067FFAA246F77685014F0A394FCCF685FA3\r
+:100EB00008953C2F3F7335BB3D2F330F330FC7FBD6\r
+:100EC00031F9C6FB30F93BBBF894C39AC3987894C8\r
+:100ED0003093180100270ABBF894C0980000C09A0C\r
+:100EE00009B278940FEF0ABB08953A2D3F7335BBD2\r
+:100EF0003D2F330F330FA7FA31F9A6FA30F93BBB78\r
+:100F0000F894C39AC39878943093180100270ABBC9\r
+:100F1000F894C0980000C09AF9B278940FEF0ABB19\r
+:100F2000B1FE03C01095F12203C0F126B0FCF12AF6\r
+:100F30003A2D3F7335BB3D2F330F330FA7FA31F9ED\r
+:100F4000A6FA30F93BBBF894C39AC39878943093CF\r
+:100F50001801FBBAF894C198C0980000C09A789420\r
+:100F6000C19A0895772788279924C0E0D0E218E134\r
+:100F7000D4D3AA24A0920001109100011C2B312F80\r
+:100F80003F7335BB3D2F330F330F17FB31F916FB82\r
+:100F900030F93BBBF894C39AC39878943093180106\r
+:100FA00000E00BBBF894C198C0980000C09A7894F8\r
+:100FB000C19AA39400E2A01619F0A0920001DCCF20\r
+:100FC000D3DD9394C05CDF4FD03409F0D2CF0895C5\r
+:100FD00018951FB68B9A4CB55DB550930901409397\r
+:100FE000080114C11FB65AB35F935BB35F9355B347\r
+:100FF0005F93509118015F935FEF5ABB50E75FBD5D\r
+:101000004CB55DB5485F5F4F5BBD4ABD59BD48BD3E\r
+:1010100040914C0150914D015170452B49F4509134\r
+:101020006B01539550936B0151F45FEBB5222DC9C1\r
+:1010300000000000000000000000000000008B9A8B\r
+:10104000939A55275EBD5DBD5CBD50914D01542BFB\r
+:1010500071F0509117015BBBC49ADD9ADD98C4987A\r
+:101060000000000000000000000000000EC05091D1\r
+:101070001701506850625BBBC49A40E654275BBBC3\r
+:101080005F775BBBC49850931701509117015F9332\r
+:10109000EF93FF93E0914C01F0914D01E05CFF4F25\r
+:1010A000FF713F933E2F3F7335BB3F2F330F330FFD\r
+:1010B000E7FB31F9E6FB30F93BBBC39AC398F093E9\r
+:1010C000180130911701F7FB31F9F6FB30F93BBB02\r
+:1010D000C49AC498309317013F91C198C19A9798C8\r
+:1010E00044274ABB40EC44BBC09855275BBD5ABD62\r
+:1010F00059E05EBDE0934C01F0934D01FF91EF91FB\r
+:101100005CE35A95F1F7C09A5FEF5ABB979A54BBCC\r
+:101110008D98959851E000005EBD5BE05A95F1F71F\r
+:1011200050910D0140910C018D9A859907C04A3369\r
+:101130009DEF590752F0415050400BC0453D9FEF85\r
+:1011400059071AF44F5F5F4F04C000000000000011\r
+:10115000000050930D0140930C015BBD4ABD4091CE\r
+:101160000C0150910D0190910E01491B90910F01BE\r
+:10117000590B1AF445ED5FEF04C04CEA5EEF000036\r
+:10118000000059BD48BD52E053BF5DEE52BF51E073\r
+:10119000509368015DEF5DBD54E35CBD8B989398FF\r
+:1011A00050EE5FBD21C01FB65AB35F935BB35F9330\r
+:1011B00055B35F93509118015F93509117015F935E\r
+:1011C000FF93EF930F925FEF5ABB509168015395D5\r
+:1011D000509368015A95E1F05A9511F15A9509F426\r
+:1011E00089C00F90EF91FF915F915BBBC49AC49847\r
+:1011F000509317015F915BBBC39AC398509318013A\r
+:101200005F9155BB5F915BBB5F915ABB1FBE189549\r
+:1012100053E053BF50EF52BF51E05093680153C1A8\r
+:1012200050911001552399F150911101505118F02E\r
+:10123000509311012CC0452F429554235093110116\r
+:101240004091190143FF10C0509110015A955093DD\r
+:101250001001A1F050911901577F546055BBC29AFB\r
+:10126000C2985093190113C05091190158605B7FC7\r
+:1012700055BBC29AC2985093190109C050911901E7\r
+:10128000577F5B7F55BBC29AC2985093190150910A\r
+:10129000690157FF06C050E8B5261AF4552753BF19\r
+:1012A000A0CF52E053BF52EF52BFEAE3F8E1552717\r
+:1012B000ED0DF51FC89554E3D51648F4509119016A\r
+:1012C0005F7E55BBC29AC2985093190108C05091D5\r
+:1012D0001901506155BBC29AC298509319010BBABB\r
+:1012E0000090190105BAA99AC29AC298A998C29AFF\r
+:1012F000C29877CF50B340EE4BBB4091190145BB2C\r
+:10130000A99AC29AC298A998C29AC298889456FD7E\r
+:1013100008C050911301552319F054E05093130164\r
+:1013200008944FB754E3D51660F44FBFE091150110\r
+:10133000F0911601EE1FFF1FE0931501F0931601C7\r
+:101340007BC04FBF08F078C050911301552321F0A6\r
+:1013500054E05093130170C0F0911601E091150113\r
+:1013600050911401552329F0452FF795E7954450E6\r
+:10137000E1F75C5FF795E79518F05433D0F35CC064\r
+:101380005093140144E3451BECE3F8E15527E40FC7\r
+:10139000F51FC895402D000C000C000C400D000CF2\r
+:1013A000400DECE3F8E15527ED0DF51FC895400D14\r
+:1013B000E0E0F0EE5527E40FF51F3F933E2F3F731B\r
+:1013C00035BB3F2F330F330FE7FB31F9E6FB30F925\r
+:1013D0003BBBC39AC398F093180130911701F7FBF8\r
+:1013E00031F9F6FB30F93BBBC49AC498309317012E\r
+:1013F0003F910F9300270ABBC0980000C09A09B222\r
+:101400000FEF0ABB0F91002029F4509114015433BF\r
+:1014100098F45EC054E0509313010092070156E324\r
+:1014200050931001552D5F3138F41F93102D8DDA34\r
+:101430001B3109F48ADA1F9154E0D50E50916901ED\r
+:1014400057FD27C053E053BF50EF52BF51E05093B8\r
+:10145000680144E3D416E8F250E053BF50911601FE\r
+:1014600040911501452B50916A01543018F45130C8\r
+:1014700028F4B7CE442329F055E003C0442309F4EF\r
+:1014800054E05A9550936A01A1F75FEBB5228A9810\r
+:10149000CECD50E053BF5093140148ECD416C0F0A9\r
+:1014A00050911301552379F05A955093130159F433\r
+:1014B00050910701552339F0552D503220F41F93D8\r
+:1014C00010E043DA1F91DD24D0921501D09216016D\r
+:1014D000EAE3F8E131965527ED0DF51FC8955091D7\r
+:1014E0006901507850645029509369015BBB509159\r
+:1014F000190155BBA89AC29AC298A898C29AC298D4\r
+:1015000070CE9924C0E0D0E2A0E0B0E218E105D1AD\r
+:10151000A05CBF4F0A94E1F720E22F93C8D0E3D03C\r
+:10152000A395C3952F912A9509F0F7CF1DDB9394CE\r
+:10153000A0969096B03409F0EFCF1BCDDFD91F9362\r
+:10154000DDD910937201DAD916951695169509F41E\r
+:1015500010E210937501D2D910937601172F1695CA\r
+:1015600016951695109373018093740118E1D5D0E8\r
+:101570001F9110FD46C0CC27D09174019D2ED695A9\r
+:10158000C795D695C79510917301C10FD05E209174\r
+:10159000760110917201121720F5211BAA27B09134\r
+:1015A0007401B10FB695A795B695A79510917301E3\r
+:1015B000A10FB05E2F93AF93BF93CF93DF93209192\r
+:1015C000750168D0D1DADF91CF91BF91AF912F91A2\r
+:1015D0009394A05CBF4FC05CDF4F2A9559F72091D0\r
+:1015E00072012F93CF93DF93209175015AD0BCDA0B\r
+:1015F000DF91CF912F919394C05CDF4F2A9589F7AB\r
+:1016000006CBCC27D091740100917601D00F9D2E8E\r
+:10161000D695C795D695C79510917301C10FD05E29\r
+:10162000202F10917201121728F5211BAA27B091C3\r
+:101630007401B00FB11BB695A795B695A7951091FB\r
+:101640007301A10FB05E9A94A054B040C054D04032\r
+:101650002F93AF93BF93CF93DF93209175011AD04F\r
+:1016600083DADF91CF91BF91AF912F912A9559F7EE\r
+:10167000209172019A94C054D0402F93CF93DF935E\r
+:10168000209175010ED070DADF91CF912F912A95BC\r
+:1016900089F7BDCA0CD0119626D021962A95D1F78C\r
+:1016A000089510E020D021962A95E1F708953A2F69\r
+:1016B0003F7335BB3B2F330F330FA7FB31F9A6FB2D\r
+:1016C00030F93BBBF894C39AC398789430931801CF\r
+:1016D00000270ABBF894C0980000C09A19B3789408\r
+:1016E0000FEF0ABB08953C2F3F7335BB3D2F330FDF\r
+:1016F000330FC7FB31F9C6FB30F93BBBF894C39AF3\r
+:10170000C3987894309318011BBBF894C198C09883\r
+:101710000000C09A7894C19A0895F8943091170106\r
+:101720003127307E31273BBBC49AC49878943093DC\r
+:10173000170108951FB650915F015C5550935F01EA\r
+:10174000509160015F4F5093600150916101564E7E\r
+:10175000543650F4509361011FBEB6FE189550E008\r
+:101760005093680120CDF1C850E050936101509131\r
+:10177000620153955C33E8F15091630153955C33FA\r
+:10178000A8F1509164015395583168F1EF93FF939C\r
+:101790000F92EDE2F8E190916601E90F90E0F91FF8\r
+:1017A000C895902D9C3131F49091670193709CE124\r
+:1017B00009F49DE10F90FF91EF9150916501591748\r
+:1017C00070F0509166015C3030F050916701539594\r
+:1017D00050936701552753955093660155275395AC\r
+:1017E0005093650155275093640155275093630129\r
+:1017F000552750936201552D5931C0F41F931BE1B9\r
+:10180000A4D814E5A2D810916401ADDF1091630152\r
+:10181000AADF10916201A7DF10916601A4DF109189\r
+:101820006501A1DF109167019EDF1F9195CF1F1CFD\r
+:101830001F1E1F1E1F1F1E1F1E1FF0340000E83436\r
+:101840000100F0330100E8330200E4330300E83222\r
+:101850000300E4320400E2320500E4310500E23125\r
+:101860000600E1310700E2300700E1300800C12A3C\r
+:101870000000C22A0100C12B0100C22B0200C42BB0\r
+:101880000300C22C0300C42C0400C82C0500C4189B\r
+:101890000500C8180600D0180700C8190700D0199D\r
+:1018A0000800A1190900D01A0900A11A0A00A21AF9\r
+:1018B0000B00A11B0B00A21B0C00A41B0D00A21C03\r
+:1018C0000D00A41C0E00A81C0F00A41D0F00A81DD5\r
+:1018D0001000B01D1100A81E1100B01E1200611EE4\r
+:1018E0001300B01F1300611F1400621F1500612850\r
+:1018F0001500622816006428170062291700642961\r
+:1019000018000000000000000000000000000000BF\r
+:1019100000000000000000000808080000000000AF\r
+:1019200000000000000000000000000000000000B7\r
+:10193000000000007E00310032003300340035002A\r
+:10194000360037003800390030002D003D0000001F\r
+:101950000000000000000000000000000000000087\r
+:1019600000000000000051005700450052005400E4\r
+:101970005900550049004F0050005B005D005C00BD\r
+:101980000000000000000000000000000000000057\r
+:101990000000000000000000410053004400460029\r
+:1019A000470048004A004B004C003B0027000D0D4B\r
+:1019B0000D0000000000000000000000000000001A\r
+:1019C0000000000000000000000000005A00580065\r
+:1019D0004300560042004E004D002C002E002F0008\r
+:1019E0000000000046323444303331393033313274\r
+:1019F000313730394C034C034C034C034C034C033C\r
+:101A00004C034C034C034C034C034C034C034C035E\r
+:101A10004C034C034C034C034C034C034C034C034E\r
+:101A20004C034C034C034C034C034C034C034C033E\r
+:101A30004C034C0300014C034C034C034C034C037C\r
+:101A40004C034C034C034C034C034C034C03030169\r
+:101A50004C034C0306010F01180121012A01330137\r
+:101A60003C0145014E0157014C034C034C034C0310\r
+:101A70004C034C034C036001690172017B0184013A\r
+:101A80008D0196019F01A901B201BB01C401CD01E5\r
+:101A9000D601DF01E801F101080211021A02230256\r
+:101AA0002C0235023E02470250024C034C034C0309\r
+:101AB0004C034C034C03590262026B0274027D0218\r
+:101AC00086028F029902A302AD02B802C202CB02C3\r
+:101AD000D402DD02E602F002FC0203030C0315034C\r
+:101AE0001E0327033003390343034C034C034C0309\r
+:101AF0004C034C030003066101F80107708898A8A5\r
+:101B0000C88870010720602020202070010770889D\r
+:101B100008102040F80107F810201008887001070D\r
+:101B200010305090F810100107F880F00808887005\r
+:101B30000107304080F08888700107F808102040C5\r
+:101B40004040010770888870888870010770888815\r
+:101B500078081060010770888888F888880107F085\r
+:101B60008888F08888F001077088808080887001FC\r
+:101B700007E09088888890E00107F88080F08080F6\r
+:101B8000F80107F88080F08080800107708880B8B5\r
+:101B90008888780107888888F888888802210780E3\r
+:101BA000808080808080010708080808088870010C\r
+:101BB000078890A0C0A090880107808080808080E6\r
+:101BC000F8010788D8A8A888888801078888C8A845\r
+:101BD0009888880107708888888888700107F0884D\r
+:101BE00088F0808080010770888888A890684C03FE\r
+:101BF0004C034C03060801014F0065030107F08800\r
+:101C000088F0A090880107708880700888700107AC\r
+:101C1000F820202020202001078888888888887064\r
+:101C20000107888888888850200107888888A8A8A4\r
+:101C3000A850010788885020508888010788888824\r
+:101C4000502020200107F80810204080F8010700EC\r
+:101C500000700878887801078080F0888888F00113\r
+:101C600007000078808080780107080878888888D5\r
+:101C700078010700007088F8807001071820F820AC\r
+:101C800020202001080000788888780870010780EB\r
+:101C900080B0C8888888022107800080808080808A\r
+:101CA0000521081000101010109060052107808099\r
+:101CB00090A0C0A090032107C04040404040400198\r
+:101CC000070000F0A8A8A8A801070000B0C88888ED\r
+:101CD0008801070000708888887001080000F0887B\r
+:101CE00088F080800108000078888878080802055C\r
+:101CF0006105B0C08080800107000078807008F026\r
+:101D000001072020F820202018010700008888887B\r
+:101D10009868010700008888885020010700008823\r
+:101D200088A8A850010700008850205088010800AA\r
+:101D30000088888878087001070000F8102040F8B3\r
+:101D40000107F8F8F8F8F8F8F80070935601809356\r
+:101D50005701D4D510935801D1D51093590126D0ED\r
+:101D6000E4C27093560180935701C8D5109358016F\r
+:101D7000C5D5109359012FD0D8C2709352018093CA\r
+:101D80005301BCD510935401B9D51093550178D0A7\r
+:101D9000CCC27093520180935301B0D5109354017B\r
+:101DA000ADD51093550171D0C0C208950091560170\r
+:101DB0000093520100915701009353010091580183\r
+:101DC00000935401009159010093550102E0B02A9B\r
+:101DD00024D70DEFB022009158010A95023028F364\r
+:101DE00000915901033008F300915601009352010C\r
+:101DF0000091570100935301009158010093540141\r
+:101E000001E00093550109D700915601009352015A\r
+:101E1000009157010395009353010091590102501D\r
+:101E20000093550101E000935401F7D680905801CA\r
+:101E300000915601080D0A950093520101E00093AC\r
+:101E400054010091570103950093530100915901EA\r
+:101E5000025000935501E1D60091560100935201C2\r
+:101E6000009158010093540170905901009157015D\r
+:101E7000070D0A950093530101E000935501CDC66B\r
+:101E800002E0B02ACAD60DEFB022789490905301A8\r
+:101E90006091520102D860930201A09200017090FB\r
+:101EA0005501CC27D92D15E5D0FF1AEA012ED6957C\r
+:101EB000C795D695C795D05E18E12FDC07C0C05CEA\r
+:101EC000DF4F939460910201A0900001AC2A1FEFB4\r
+:101ED0008090540100E0801641F008E08016C8F0C0\r
+:101EE000662319F016956A95E9F71021FED708E0E8\r
+:101EF00010910201011B801AA3941FEF08E08016C5\r
+:101F000040F0C1F01021F1D71FEF08E0801AA39430\r
+:101F1000F5CF882089F016958A94E9F71095662305\r
+:101F200049F02227169527956A95E1F71021DDD70C\r
+:101F3000A394122F1021D9D7009416D67A94002793\r
+:061F40007012BDCF0895F0\r
+:0220000002419B\r
+:00000001FF\r
diff --git a/src/avr/TSV4.ASM b/src/avr/TSV4.ASM
new file mode 100644 (file)
index 0000000..5e6b38d
--- /dev/null
@@ -0,0 +1,3708 @@
+;      TSV4.ASM\r
+\r
+;      19FEB02 REVISE FOR GREATER CONTRAST VOLTAGE FOR ALBERT'S 2ND BATCH -15V\r
+;      01FEB02 REVISE FOR 7.3728MHz XTAL (SEE !!!)\r
+\r
+;       22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;               TO WORK WITH REV E PARTS\r
+;              ;!! INDICATES CHANGES\r
+\r
+;**    INDICATES CHANGES FOR LOW VCC AVR MOD\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APITS.INC" ; NOT API.INC BECAUSE APITS.INC ALSO HAS TURNON COMMAND\r
+;.INCLUDE "TERTS.INC" ; NOT TER.INC BECAUSE FLAGS IN LOWER HALF OF REGISTER SET\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     XPAGE,YH\r
+       RCALL   ADRYP                   ; AND SET XPAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+       OUT     PORTC,@0                ; SET L ADDRESS FOR DSPRAM\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       MOV     R19,@1\r
+       LSL     R19\r
+       LSL     R19\r
+       BST     @0,7                    ; A7\r
+       BLD     R19,1\r
+       BST     @0,6                    ; A6\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       EOR     R19,@0\r
+       ANDI    R19,$E0\r
+       EOR     R19,@0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       SEI\r
+       STS     LATCH10_SAV,R19         ; MUST BE ATOMIC DUE TO TOGGLING M\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       MOV     R19,@1\r
+       LSL     R19\r
+       LSL     R19\r
+       BST     @0,7                    ; A7\r
+       BLD     R19,1\r
+       BST     @0,6                    ; A6\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@1\r
+\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       BST     @1,7                    ; A15\r
+       BLD     R19,1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,0\r
+       NOP\r
+       CBI     PORTB,1\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+       OUT     PORTA,@0                ; SELECT PHOTODIODE CHANNEL\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+       OUT     PORTA,@0                ; MAIN LED DRIVE PORT\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON LO\r
+       CBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON HI\r
+       SBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER HI\r
+       SBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER LO\r
+       CBR     D,1<<3\r
+       SBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER OFF\r
+       CBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =-818 ;$FB35\r
+.EQU   T1_FULL_SCALE   =-716 ;50.0HZ   ; SETS LCD FRAME RATE TEMPORARY TO STOP FLIKER\r
+;.EQU  T1_FULL_SCALE   =-651 ;53.5HZ   ; SETS LCD FRAME RATE\r
+;.EQU  T1_FULL_SCALE   =-600 ;54.8HZ   ; SETS LCD FRAME RATE\r
+\r
+.EQU   CONTRAST_LONG   =-340           ; ALL LONG PULSES IS FULLY DARK (DON'T SATURATE)\r
+;.EQU  CONTRAST_LONG   =-250           ; ALL LONG PULSES IS FULLY DARK (DON'T SATURATE)\r
+.EQU   CONTRAST_MID    =-200\r
+.EQU   CONTRAST_SHORT  = -43           ; ALL SHORT PULSES IS FULLY LIGHT\r
+\r
+.EQU   VCC_NOMINAL     =-552 ;$FCC4\r
+\r
+.EQU   VEE_MIN         =-710           ; MIN IS FULLY DARK\r
+.EQU   VEE_INIT        =-340\r
+.EQU   VEE_MAX         = -43           ; MAX IS FULLY LIGHT\r
+\r
+; WHEN VCC = $FCC4 FOR 6.0V:\r
+.EQU   CONTRAST_MIN    =-710           ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_INIT   =-640\r
+.EQU   CONTRAST_MAX    =-580           ; MAX IS FULLY LIGHT\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+;.EQU  CONTRAST_MIN    =$FC80          ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FF80          ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FE10\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$80\r
+.EQU   CHARACTER_SETS  =10\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$20\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   TK_LED_PULSE    =14             ; 18US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_0      =19             ; ??US DELAY TILL START OF LED PULSE (/8)\r
+;.EQU  TK_DELAY_0      =$20 ;$38       ; ??US DELAY TILL START OF LED PULSE\r
+;.EQU  TK_DELAY_0      =$25 ;$38       ; 54US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_1      =$10 ;$28       ; CLOCKS OF /64, CHANNEL SELECT DELAY\r
+.EQU   TK_DELAY_2      =$00            ; CLOCKS OF /1024, VDD POWER ON DELAY\r
+                                       ; $D0 IS TOO SHORT, $E0 SEEMS TO WORK\r
+\r
+.EQU   API_ADDRESS     =$02            ; TOUCHSCREEN ADDRESS\r
+.EQU   API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$17 ;$5F       ; DIVISOR FOR 19200 BPS\r
+.EQU   API_RATE_FAST   =$00 ;$03       ; DIVISOR FOR 460800 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   PATTERN         =R0             ; FOR HALFTONE_RECT ROUTINE\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   USED TO CONTROL LED PULSING FOR TOUCHSCREEN EVERY 2ND CYCLE\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+; for AVRA / TAVRASM:\r
+;.def  XL              =R26\r
+;.def  XH              =R27\r
+;.def  YL              =R28\r
+;.def  YH              =R29\r
+;.def  ZL              =R30\r
+;.def  ZH              =R31\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+BUZZ_TIME:     .BYTE   1       ; 10B\r
+BUZZ_PERIOD:   .BYTE   1\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+DEBOUNCE:      .BYTE   1\r
+ROW_INDEX:     .BYTE   1\r
+ROW_BITMAP:    .BYTE   2\r
+LATCH10_SAV:   .BYTE   1\r
+LATCH11_SAV:   .BYTE   1\r
+LATCH12_SAV:   .BYTE   1\r
+XPAGE:         .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+CLOCKING_PTR:  .BYTE   2\r
+\r
+CHAR_X:                .BYTE   1\r
+CHAR_Y:                .BYTE   1\r
+CHAR_PTR:      .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TOUCH_KEY:     .BYTE   1\r
+TOUCH_X:       .BYTE   1\r
+TOUCH_Y:       .BYTE   1\r
+TOUCH_XX:      .BYTE   1\r
+TOUCH_YY:      .BYTE   1\r
+\r
+TIME_HSEC_64K: .BYTE   1\r
+TIME_HSEC_256: .BYTE   1\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+SCAN_STATE:    .BYTE   1\r
+LATCH5_SAV:    .BYTE   1\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   1\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RJMP    GO_TIM2_OVF             ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_T1_OVERFLOW\r
+       RJMP    GO_T0_OVERFLOW\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       LDI     F,0\r
+       STS     TIME_HSEC_64K,F\r
+       STS     TIME_HSEC_256,F\r
+       STS     TIME_HSEC,F\r
+       STS     TIME_SECOND,F\r
+       STS     TIME_MINUTE,F\r
+       STS     TIME_HOUR,F\r
+       LDI     F,1\r
+       STS     DATE_DAY,F\r
+       STS     DATE_MONTH,F\r
+       LDI     F,20\r
+       STS     DATE_YEAR,F\r
+\r
+RESTART_ENTRY:\r
+;**:\r
+       LDI     F,8                     ; TIMER 2 CLOCKED BY 32 KHZ\r
+;**    LDI     F,0                     ; TIMER 2 CLOCKED BY 11 MHZ\r
+       OUT     ASSR,F\r
+;**:\r
+       ; MUST MATCH SET_TIME ROUTINE %\r
+       LDI     F,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;!!    LDI     F,$11                   ; DIVIDE BY 2, TOGGLE OC2 (PIN 21)\r
+                                       ; (RTC DIAGNOSTIC)\r
+;**    LDI     F,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,F\r
+       ; %\r
+       LDI     F,$40\r
+       OUT     TIMSK,F                 ; TIMER 2 OVERFLOW INTERRUPTS ENABLED\r
+       LDI     F,$00\r
+       OUT     GIMSK,F\r
+\r
+       LDI     F,$B8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       OUT     PORTD,F                 ; D2 = TRI-STATE, VSWT ON\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$03                   ; CS, WE HI, LEs ALL LO\r
+       OUT     PORTB,F\r
+\r
+       LDI     F,$10                   ; LED COMMON OFF, SPEAKER OFF\r
+       OUT     PORTC,F\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,F\r
+\r
+       LDI     F,$20\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ENABLED\r
+\r
+       INIT_API_BUS\r
+\r
+       LDI     D,$18                   ; A18|A17|A16|A15|A14=11000\r
+       OUT     PORTA,D                 ; CL1=M=FLM=0\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BUZZ_TIME,D             ; NOT BUZZING (SHORT BEEP COMES LATER)\r
+\r
+       CLR     SCAN\r
+       STS     ROW_INDEX,SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+       LDI     D,$F4                   ; BIT 6 = 1 VDD ON, BIT 7 = 1 LCD ON\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       ; INITIALISE ACTIVE KEYS\r
+RTNCDE:        ;LDIZ   RTN_CODE                ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((RTN_CODE)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((RTN_CODE)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ;LDIX   RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+       LDI     XL,LOW((RTN_CODE_END-RTN_CODE)*2)       ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((RTN_CODE_END-RTN_CODE)*2)      ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET XPAGE\r
+CDE0:  ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CDE1:  ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+ CLR R0 ; TEMPORARY CLEAR KB\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       DEC     XL\r
+       BREQ    RTNCDE_END              ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CDE1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CDE0\r
+RTNCDE_END:\r
+\r
+       ; INITIALISE DEFAULT CHARACTER SET\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       ;LDIZ   CHSET00                 ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((CHSET00)*2)     ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((CHSET00)*2)    ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ;LDIX   CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDI     XL,LOW((CHSET00_END-CHSET00)*2) ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((CHSET00_END-CHSET00)*2)        ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET XPAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       ; CLEAR REFRESH BUFFER TO AVOID A BRIEF FLICKER\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   GO_SELECT_XPAGE\r
+\r
+       LDI     B,DISPLAY_LINES         ; B = LINES TO CLEAR\r
+\r
+CLEAR_REFRESH:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDI     B,32\r
+       RCALL   GO_CLEAR_BYTES          ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   GO_CLEAR_BYTES          ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    CLEAR_REFRESH\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       LDI     A,0\r
+       STS     BUZZ_PERIOD,A           ; HIGHEST FREQUENCY\r
+       LDI     A,54 ;$40\r
+       STS     BUZZ_TIME,A             ; SHORT BEEP ON STARTUP\r
+\r
+       LDI     A,0\r
+       STS     SCAN_STATE,A            ; START ON FIRST LED / PHOTODIODE PAIR\r
+\r
+       LDI     A,0\r
+       STS     CLOCKING_PTR,A\r
+       STS     CLOCKING_PTR+1,A        ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       LDI     F,$45\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1, 2 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  HELLO_DISPLAY           ; SHOW EXAMPLE DISPLAY\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       SBI     PORTD,4                 ; TURN TRANSISTOR OFF\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,LATCH10_SAV\r
+       ANDI    D,$BF                   ; DROP M\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       LDI     D,$74                   ; BIT 6 = 1 VDD ON, BIT 7 = 0 LCD OFF\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       LDI     D,$34                   ; BIT 6 = 0 VDD OFF, BIT 7 = 0 LCD OFF\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       LDI     D,$41\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 INTERRUPTS\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; DISABLE TIMER 0 TEMPORARILY ONLY\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+       LDI     F,4\r
+       STS     TURNON_COUNT,F          ; .25 SEC TO BREAK, .75 SEC TO MAKE\r
+\r
+       INIT_API_BUS                    ; RESET UART TO RECEIVE TURNON COMMAND\r
+\r
+SLEEP_LOOP:\r
+       CLI\r
+       IN      F,TCCR0\r
+       TST     F\r
+       LDI     F,$4A                   ; SE=1 SM1:SM0=00 FOR IDLE MODE\r
+       BRNE    SLEEP_SETUP             ; TIMER 0 RUNNING, STAY IN IDLE MODE\r
+       SBIS    PIND,0                  ; BREAK OFF, UART ACTIVE, STAY IN IDLE\r
+       LDI     F,$7A                   ; SE=1 SM1:SM0=11 FOR POWER SAVE MODE\r
+SLEEP_SETUP:\r
+       OUT     MCUCR,F\r
+       SEI\r
+       SLEEP\r
+\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDS     F,TURNON_COUNT\r
+       TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       ;SBIS   PIND,0                  ; AND BREAK HAS DISAPPEARED, WAKE UP\r
+       BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+\r
+       CLI\r
+       RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP: LDS     YH,XPAGE                        ; SET XPAGE ADDRESS FOR DSPRAM\r
+       LDS     YL,LATCH10_SAV\r
+       ANDI    YL,$E0\r
+       OR      YH,YL\r
+       OUT     PORTA,YH\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,XPAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     XPAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;HELLO_DISPLAY:\r
+;      LDI     A,0\r
+;      STS     RECTNC_X,A\r
+;      STS     RECTNC_Y,A\r
+;      STS     RECTNC_XX,A\r
+;      LDI     A,$80\r
+;      STS     RECTNC_YY,A\r
+;      RCALL   DRAW_RECTNC\r
+;\r
+;      LDI     A,16\r
+;      STS     CHAR_X,A\r
+;      STS     CHAR_Y,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;      RCALL   STRING_DRAW\r
+;\r
+;      LDI     A,240\r
+;      STS     CHAR_X,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;\r
+;STRING_RIGHT_JUST:\r
+;      PUSH    B\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   STRING_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     B\r
+;      LDS     A,CHAR_X\r
+;      SUB     A,R0\r
+;      STS     CHAR_X,A\r
+;\r
+;STRING_DRAW:\r
+;      PUSH    B\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      PUSH    R0\r
+;      RCALL   DRAW_CHAR\r
+;      POP     R0\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      LDS     A,CHAR_X\r
+;      ADD     A,R0\r
+;      STS     CHAR_X,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_DRAW\r
+;      RET\r
+;\r
+;STRING_WIDTH:\r
+;      CLR     R0\r
+;STRING_WIDTH_LOOP:\r
+;      PUSH    B\r
+;      PUSH    R0\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     A\r
+;      ADD     R0,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_WIDTH_LOOP\r
+;      RET\r
+;\r
+;HELLO_MESSAGE:        .DB     'H','E','L','L','O',0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+;L0132:\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+;L0135:\r
+       CPI     A,$0A\r
+       BRNE    TEST_BELL\r
+       RJMP    LF\r
+TEST_BELL:\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'B'\r
+       RJEQ    BUZZER\r
+       CPI     A,'b'\r
+       RJEQ    BUZZ_AT_FREQ\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'c'\r
+       RJEQ    GET_CLEAR_FRAME_RECT_SIZE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'f'\r
+       RJEQ    GET_FRAME_RECT_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'H'\r
+       RJEQ    GET_HALFTONE_RECT_SIZE\r
+       CPI     A,'h'\r
+       RJEQ    GET_CLEAR_HALFTONE_RECT_SIZE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'T'\r
+       RJEQ    SET_TIME\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       SBI     DDRD,2                  ; D2 = LOW, VSWT OFF\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+BUZZER:        RCALL   RX_WAIT\r
+       PUSH    A\r
+       LDI     A,0                     ; HIGHEST FREQUENCY\r
+       RJMP    BUZZ_AT_FREQ_A\r
+\r
+BUZZ_AT_FREQ:\r
+       RCALL   RX_WAIT\r
+       PUSH    A\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$0F\r
+BUZZ_AT_FREQ_A:\r
+       STS     BUZZ_PERIOD,A           ; SAVE REQUESTED PERIOD\r
+       POP     A\r
+       STS     BUZZ_TIME,A             ; SAVE REQUESTED DURATION\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_TIME:\r
+       LDI     A,0\r
+       OUT     TCCR2,A                 ; STOP COUNTING WHILE SETTING CLOCK\r
+       STS     TIME_HSEC_64K,A\r
+       STS     TIME_HSEC_256,A\r
+       STS     TIME_HSEC,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_HOUR,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_MINUTE,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_SECOND,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_MONTH,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_DAY,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_YEAR,A\r
+       LDI     A,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;**    LDI     A,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+;L01A3:\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    CLR     CURSORX\r
+       RJMP    MAIN_LOOP\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       STS     TOUCH_KEY,A\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       SUBI    A,-9\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_X,B\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A\r
+       SUBI    A,-4\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_Y,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YL\r
+       SUBI    A,15\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_XX,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YH\r
+       SUBI    A,17\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_YY,B\r
+\r
+       LDS     YH,TOUCH_Y\r
+TOUCH_ZONE_Y:\r
+       LDS     A,TOUCH_YY\r
+       SUB     A,YH\r
+       BRSH    TOUCH_ZONE_Y_CONT\r
+       RJMP    TOUCH_ZONE_Y_END\r
+TOUCH_ZONE_Y_CONT:\r
+\r
+       LDS     YL,TOUCH_X\r
+       MOV     A,YL\r
+       ADD     A,YH\r
+       MOV     B,YH\r
+       LSL     B\r
+       LSL     B\r
+       LSL     B\r
+       ADD     A,B\r
+       LSL     B\r
+       ADD     A,B\r
+\r
+       LDI     XL,LOW(RTN_DSPRAM)\r
+       LDI     XH,HIGH(RTN_DSPRAM) ;<<2\r
+       LDI     B,0\r
+       ADD     XL,A\r
+       ADC     XH,B\r
+\r
+       LDI     B,HIGH(RTN_DSPRAM>>6)   ; B:X -> RETURN CODE TABLE\r
+       A14_A18 B\r
+\r
+TOUCH_ZONE_X:\r
+       LDS     A,TOUCH_XX\r
+       SUB     A,YL\r
+       BRLO    TOUCH_ZONE_X_END\r
+\r
+       A0_A13  XL,XH\r
+       LDS     A,TOUCH_KEY\r
+       RAMWR   A                       ; WRITE DATA TO DSPRAM\r
+\r
+       ADIW    XL,1\r
+       INC     YL\r
+       RJMP    TOUCH_ZONE_X\r
+\r
+TOUCH_ZONE_X_END:\r
+       INC     YH\r
+       RJMP    TOUCH_ZONE_Y\r
+\r
+TOUCH_ZONE_Y_END:\r
+       RJMP    MAIN_LOOP\r
+\r
+DIVIDE_10:\r
+       LDI     B,-1\r
+DIVIDE_10_LOOP:\r
+       INC     B\r
+       SUBI    A,10\r
+       BRCC    DIVIDE_10_LOOP\r
+       RET\r
+\r
+DIVIDE_13:\r
+       LDI     B,-1\r
+DIVIDE_13_LOOP:\r
+       INC     B\r
+       SUBI    A,13\r
+       BRCC    DIVIDE_13_LOOP\r
+       RET\r
+\r
+NULLSUB2:\r
+       RCALL   RX_WAIT\r
+\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       RCALL   FIND_CHAR               ; SET UP CHAR_PTR FROM A = CHAR\r
+       RCALL   CHAR_WIDTH              ; SET UP R0 = PROP WIDTH FROM CHAR PTR\r
+\r
+       CLR     F\r
+       STS     TEMP,F                  ; NUDGE FOR FIXED SPACING MODE\r
+\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE               ; FORCED TO FIXED SPACING MODE?\r
+\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS                    ; GET R0 = CELL WIDTH FOR CHARACTER SET\r
+       PUSH    R0\r
+       SUB     R0,W\r
+       BRCC    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       POP     R0                      ; RESTORE R0 = FIXED CELL WIDTH\r
+\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE                 ; FORCED TO GRAPHICS MODE?\r
+\r
+       MOV     F,CURSORX\r
+       ADD     F,R0                    ; CHECK IF CHAR WILL FIT ON THIS LINE\r
+       BRCC    OK_LINE\r
+\r
+       CLR     CURSORX\r
+       RCALL   LINE_FEED               ; NO, WRAP CURSOR PRIOR TO DRAWING CHAR\r
+\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE            ; IN CASE WE SCROLLED THE DISPLAY\r
+\r
+OK_LINE:\r
+       LDS     F,TEMP\r
+       ADD     F,CURSORX\r
+       STS     CHAR_X,F\r
+       STS     CHAR_Y,CURSORY          ; SET UP TOP LEFT COORDINATES\r
+\r
+       ADD     CURSORX,R0              ; ADVANCE CURSOR\r
+\r
+DRAW_CHAR:\r
+       LDS     XPIXEL,CHAR_X\r
+       LDS     LINE_CNT,CHAR_Y\r
+\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE           ; Y OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+\r
+Y_OFFSET_DONE:\r
+       SBRS    X_SIZE,7\r
+       RJMP    X_OFFSET_DONE           ; X OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$03\r
+       RCALL   LPMS\r
+       ADD     XPIXEL,R0\r
+\r
+X_OFFSET_DONE:\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       ADIW    YL,$01\r
+       RCALL   LPMS                    ; GET R0 = Y LINES FOR CHARACTER\r
+       MOV     Y_SIZE,R0\r
+\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0                 ; REMOVE_CS\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+FIND_CHAR:\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       STS     CHAR_PTR,YL\r
+       STS     CHAR_PTR+1,YH\r
+       RET\r
+\r
+CHAR_WIDTH:\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    LPMS                    ; PROPORTIONAL WIDTH IS PRESENT\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RJMP    LPMS                    ; NO PROPORTIONAL WIDTH, USE CELL WIDTH\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> DISPLAY BUFFER\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       LDI     B,32\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       SBIW    XL,2\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   COPY_BYTES              ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+ ; LET'S BE SAFE\r
+ ANDI A,$7F\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_CLEAR_BYTES:\r
+       RJMP    CLEAR_BYTES\r
+\r
+GO_SELECT_XPAGE:\r
+       RJMP    SELECT_XPAGE\r
+\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+\r
+GO_TIM2_OVF:\r
+       RJMP    TIM2_OVF\r
+\r
+GO_T1_OVERFLOW:\r
+       RJMP    T1_OVERFLOW\r
+\r
+GO_T0_OVERFLOW:\r
+       RJMP    T0_OVERFLOW\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+CLEAR_DISPLAY_LOOP:\r
+       CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    CLEAR_DISPLAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXT_INT0:\r
+;**:\r
+RETI\r
+;**    IN      SR,SREG                 ; MEASURE VCC\r
+;**    SBI     DDRD,2\r
+;**    IN      C,TCNT1L\r
+;**    IN      D,TCNT1H\r
+;**    STS     VCCH,D\r
+;**    STS     VCCL,C\r
+;**    RJMP    EXT_INT_RET\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    EXT_INT_RET\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+        LDI     D,$70                  ; FORCE DUMMY COMPARE MATCH\r
+        OUT     TCCR1A,D                ; TO SET OC1B, TOGGLE OC1A\r
+        IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+        IN      D,TCNT1H                ; READ CURRENT COUNT\r
+        SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+        SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+        OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+        OUT     OCR1AL,C\r
+        OUT     OCR1BH,D\r
+        OUT     OCR1BL,C\r
+\r
+       LDS     C,CLOCKING_PTR\r
+;      TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
+ lds d,CLOCKING_PTR+1\r
+ andi d,1\r
+ or c,d ; checks for start of an 8 line block\r
+; rjmp BREAK0 ; temporary (prevents switching off via power switch)\r
+       BRNE    BREAK0                  ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK1                  ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+GO_SLEEP_ENTRY:\r
+       RJMP    SLEEP_ENTRY\r
+\r
+BREAK0:        NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+BREAK1:        SBI     DDRD,3                  ; PRECHARGE TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CLR     D\r
+       OUT     TCCR1B,D                ; STOP TIMER1\r
+       OUT     TCNT1H,D                ; AND CLEAR COUNT\r
+       OUT     TCNT1L,D\r
+\r
+       LDS     D,CLOCKING_PTR+1\r
+       OR      D,C                     ; START OF FRAME?  (REALLY LINE 1)\r
+       BREQ    L04E6                   ; YES, GO AND TOGGLE M ETC\r
+\r
+       LDS     D,LATCH10_SAV\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       SBI     PORTA,5                 ; PULSE CL1\r
+       CBI     PORTA,5\r
+       CBI     PORTB,4\r
+       NOP                             ; EQUALIZE DELAY\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       RJMP    L04F9\r
+\r
+L04E6: LDS     D,LATCH10_SAV\r
+       ORI     D,$80                   ; RAISE FLM\r
+       ORI     D,$20                   ; RAISE CL1\r
+       OUT     PORTA,D\r
+\r
+       SBI     PORTB,4\r
+       LDI     C,$60                   ; TOGGLE M AND CL1\r
+       EOR     D,C\r
+       OUT     PORTA,D\r
+       ANDI    D,$7F                   ; DROP FLM\r
+       OUT     PORTA,D\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+L04F9: LDS     D,LATCH10_SAV           ; SAVE STATE\r
+       PUSH    D\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDS     ZL,CLOCKING_PTR\r
+       LDS     ZH,CLOCKING_PTR+1\r
+\r
+       SUBI    ZL,LOW(-$40)\r
+       SBCI    ZH,HIGH(-$40)\r
+       ANDI    ZH,HIGH(DISPLAY_LINES*$40-1)\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       CBI     PORTB,1                 ; CLR HC590\r
+       SBI     PORTB,1\r
+       CBI     PORTD,7                 ; DROP OE FOR HC590\r
+       CLR     C\r
+       OUT     DDRA,C                  ; PORTA HI Z\r
+       LDI     C,$C0\r
+       OUT     DDRC,C                  ; PORTC HI Z\r
+       CBI     PORTB,0                 ; DROP CS FOR DSPRAM\r
+\r
+       CLR     D\r
+       OUT     OCR1AH,D\r
+\r
+;      LDI     D,1                     ; TO CLOCK AT 5.5/2 MHZ\r
+       OUT     OCR1AL,D                ; TO CLOCK AT 7.3/2 MHZ\r
+       LDI     D,$09\r
+       OUT     TCCR1B,D                ; START CL2 CLOCKING WITH CLR ON MATCH\r
+\r
+       STS     CLOCKING_PTR,ZL\r
+       STS     CLOCKING_PTR+1,ZH\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;!!!   LDI     D,$7A                   ; WAIT FOR 32uSEC\r
+;      LDI     D,58 ;$7A                       ; WAIT FOR 32uSEC GOOD\r
+       LDI     D,60                    ; WAIT FOR 32uSEC\r
+;      LDI     D,61 ;$7A                       ; WAIT FOR 32uSEC\r
+;      LDI     D,62 ;$7A                       ; WAIT FOR 32uSEC GOOD\r
+\r
+L050E: DEC     D\r
+       BRNE    L050E\r
+\r
+       SBI     PORTB,0                 ; RAISE CS FOR DSPRAM\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+       SBI     PORTD,7                 ; RAISE OE FOR HC590\r
+       OUT     DDRC,D                  ; PORTC OUTPUT\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       LDI     D,$01                   ; KILL CLR ON COMPARE MATCH\r
+       NOP                             ; !WITH OC1A LEFT IN LOW STATE\r
+       OUT     TCCR1B,D\r
+\r
+       LDI     D,$0B                   ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0536\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+       RJMP    L0536\r
+\r
+L0535: NOP                             ; EQUALIZE DELAYS\r
+       NOP\r
+       NOP\r
+       NOP\r
+L0536: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VEEL\r
+       LDS     D,VEEH\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+       NOP\r
+       NOP\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       LDI     D,2                     ; SET TIME FOR START OF LED PULSE\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_DELAY_0           ; 54uSEC\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,3                  ; START TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+        LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+        OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+       RJMP    T1_OVERFLOW_RET\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; LED/PHOTODIODE SCANNING\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+       LDS     D,LATCH10_SAV\r
+       PUSH    D\r
+\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       LDS     D,SCAN_STATE\r
+       INC     D\r
+       STS     SCAN_STATE,D\r
+       DEC     D\r
+       BREQ    SCAN_START              ; IF SCAN_STATE WAS = 0\r
+       DEC     D\r
+       BREQ    SCAN_BEEPER             ; IF SCAN_STATE WAS = 1\r
+ ; IMPLEMENT ENTRY POINT FOR SCAN_PULSE_LED HERE\r
+       DEC     D\r
+       RJEQ    SCAN_PHOTO              ; IF SCAN_STATE WAS = 2\r
+\r
+T0_OVERFLOW_RET:\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+\r
+T1_OVERFLOW_RET:\r
+       POP     D                       ; RESTORE STATE OF THE WORLD\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+EXT_INT_RET:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCAN_START:\r
+       LDI     D,3 ;5\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/1024\r
+       LDI     D,-TK_DELAY_1 ;TK_DELAY_2\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+       RJMP    L0617_RESET\r
+\r
+SCAN_BEEPER:\r
+       LDS     D,BUZZ_TIME\r
+       TST     D\r
+       BREQ    SCAN_PULSE_LED\r
+       LDS     D,BUZZ_PERIOD\r
+       SUBI    D,$10\r
+       BRLO    BUZZ_TOGGLE\r
+       STS     BUZZ_PERIOD,D\r
+       RJMP    SCAN_PULSE_LED\r
+BUZZ_TOGGLE:                           ; ASSUME D = $F0 + PERIOD-1\r
+       MOV     C,D                     ; EG. C = $F3 FOR PERIOD = 4\r
+       SWAP    C                       ; EG. C = $3F FOR PERIOD = 4\r
+       AND     D,C                     ; EG. D = $33 FOR PERIOD = 4\r
+       STS     BUZZ_PERIOD,D\r
+       LDS     C,LATCH12_SAV\r
+       SBRS    C,3                     ; TEST PREVIOUS SPEAKER STATE\r
+       RJMP    BEEPER_SPKHI\r
+       LDS     D,BUZZ_TIME\r
+       DEC     D\r
+       STS     BUZZ_TIME,D\r
+       BREQ    BEEPER_SPKOFF\r
+;BEEPER_SPKLO:\r
+       SPKLO\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKHI:\r
+       SPKHI\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKOFF:\r
+       SPKOFF\r
+\r
+SCAN_PULSE_LED:\r
+       LDS     D,LATCH5_SAV\r
+;**:\r
+       SBRS    D,7                     ; ARE WE INSIDE SLEEP_LOOP?\r
+;**    SBRC    D,7\r
+       RJMP    SCAN_PULSE_LED_OK       ; YES, KEEP TIMER 0 TO RETAIN CONTROL\r
+\r
+       LDI     D,1<<7\r
+       EOR     FLAGS,D\r
+       BRPL    SCAN_PULSE_LED_OK       ; PULSE LED EVERY 2ND CYCLE\r
+\r
+       CLR     D\r
+       OUT     TCCR0,D                 ; STOP TIMER\r
+       RJMP    T0_OVERFLOW_RET         ; AND WASTE EVERY REMAINING CYCLE\r
+\r
+SCAN_PULSE_LED_OK:\r
+       LDI     D,2\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_LED_PULSE         ; 22uSEC\r
+       OUT     TCNT0,D\r
+\r
+       ;LDIZ   SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM                             ; R0 = LED DRIVE VALUE\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L0570\r
+       LEDLO                           ; ENABLE HORIZ LED DRIVE\r
+       RJMP    L0574\r
+L0570: LEDHI                           ; DISABLE HORIZ LED DRIVE\r
+L0574: LED     R0\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCAN_PHOTO:\r
+       IN      D,PIND                  ; PHOTODIODE STATUS IN BIT 6,D\r
+       LDI     C,$E0\r
+       LED     C                       ; TURN OFF LED ??\r
+\r
+       CLC\r
+       SBRC    D,6\r
+       RJMP    L0593                   ; ROW/COLUMN IS INACTIVE\r
+\r
+       ; ROW/COLUMN IS ACTIVE\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0591\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+L0591: SEC\r
+\r
+L0593: ; WE HAVE A ROW/COLUMN STATUS IN CF\r
+       IN      C,SREG\r
+\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L05A8\r
+\r
+       ; WE HAVE A ROW STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       LDS     ZL,ROW_BITMAP\r
+       LDS     ZH,ROW_BITMAP+1\r
+       ROL     ZL\r
+       ROL     ZH\r
+       STS     ROW_BITMAP,ZL\r
+       STS     ROW_BITMAP+1,ZH\r
+       RJMP    L05F9\r
+\r
+L05A8: ; WE HAVE A COLUMN STATUS\r
+;      LDS     D,LATCH5_SAV\r
+;;**:\r
+;      SBRS    D,7                     ; TURNED OFF?\r
+;;**   SBRC    D,7\r
+;      RJMP    L05F9                   ; YES, NO FURTHER PROCESSING\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       BRCS    L05AB\r
+       RJMP    L05F9\r
+\r
+L05AB: ; WE HAVE AN ACTIVE COLUMN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L05B3\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       RJMP    L05F9\r
+\r
+L05B3: ; LOOK FOR ANY ACTIVE ROW\r
+       LDS     ZH,ROW_BITMAP+1\r
+       LDS     ZL,ROW_BITMAP\r
+\r
+       LDS     D,ROW_INDEX\r
+       TST     D\r
+       BREQ    ROW_BITMAP_LOOP\r
+\r
+       MOV     C,D\r
+ROW_BITMAP_SKIP:\r
+       ROR     ZH\r
+       ROR     ZL\r
+       SUBI    C,4\r
+       BRNE    ROW_BITMAP_SKIP\r
+\r
+ROW_BITMAP_LOOP:\r
+       SUBI    D,-4\r
+       ROR     ZH\r
+       ROR     ZL\r
+       BRCS    FOUND_INTERSECTION\r
+ROW_BITMAP_LOOPE:\r
+       CPI     D,13*4\r
+       BRLO    ROW_BITMAP_LOOP\r
+\r
+       ; NO FURTHER INTERSECTING ROWS FOUND\r
+       RJMP    L05F9\r
+\r
+FOUND_INTERSECTION:\r
+       ; FOUND AN INTERSECTING ROW FOR COLUMN\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,$34                   ; BECAUSE ROW_BITMAP IS BEING TESTED\r
+       SUB     C,D                     ; IN THE REVERSE ORDER TO ITS CREATION\r
+\r
+       ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+       LPM\r
+       MOV     C,R0\r
+       LSL     R0\r
+       LSL     R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+\r
+       ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       ADD     C,R0\r
+       LDI     ZL,LOW(RTN_DSPRAM)      ; RETURN CODE TABLE\r
+       LDI     ZH,HIGH(RTN_DSPRAM)\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       PUSH    F\r
+       RAMRDX  R0\r
+       POP     F\r
+\r
+       TST     R0\r
+       BRNE    VALID_INTERSECTION\r
+\r
+       ; INTERSECTION IS NULL, GO ON TO NEXT\r
+       LDS     D,ROW_INDEX\r
+       CPI     D,13*4\r
+       BRSH    L05F9                   ; DONE LAST ROW, GO ON TO NEXT COLUMN\r
+GO_L0617:\r
+       RJMP    L0617                   ; GO ON TO NEXT ROW, SAME COLUMN\r
+\r
+VALID_INTERSECTION:\r
+       ; INTERSECTION IS VALID, WE HAVE KEY MAKE\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       STS     ACTIVE_ZONE,R0\r
+       LDI     D,54 ;43\r
+       STS     BUZZ_TIME,D             ; SHORT BEEP ON MAKE\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-1\r
+       BRSH    L05F9\r
+\r
+       PUSH    A\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       CPI     A,$1B\r
+       BRNE    TX_CONT\r
+       RCALL   TX_CHAR\r
+TX_CONT:\r
+       POP     A\r
+\r
+L05F9:\r
+       LDI     D,4                     ; SCAN TO NEXT LED / PHOTODIODE PAIR\r
+       ADD     SCAN,D\r
+\r
+       LDS     D,LATCH5_SAV\r
+       SBRC    D,7\r
+       RJMP    TURNED_ON\r
+\r
+       LDI     D,3\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/64\r
+       LDI     D,-TK_DELAY_1\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     C,13*4\r
+       CP      SCAN,C\r
+       BRLO    GO_L0617\r
+\r
+       ; KEEP VDD ON, TO AVOID THE LONG TK_DELAY_2\r
+       ;LDS    D,LATCH5_SAV\r
+       ;ANDI   D,$BF                   ; BIT 6 = 0 VDD OFF\r
+       ;STS    LATCH5_SAV,D\r
+       ;PHOTO  D                       ; READY TO SLEEP FOR ANOTHER 0.25 SEC\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; STOP TIMER SINCE COMPLETE SCAN DONE\r
+ ;RJMP T0_OVERFLOW_RET\r
+\r
+ ;LDI D,$05\r
+ ;OUT UBRR,D\r
+ ;LDI D,$18\r
+ ;OUT UCR,D\r
+       LDS     D,ROW_BITMAP+1\r
+       LDS     C,ROW_BITMAP\r
+ ;OUT UDR,C\r
+ ;OUT UDR,D\r
+       OR      C,D                     ; HAVE WE SOME ACTIVITY?\r
+\r
+       LDS     D,TURNON_COUNT\r
+       CPI     D,4\r
+       BRSH    TURNON_BREAK            ; WAITING FOR BREAK\r
+       CPI     D,1\r
+       BRSH    TURNON_MAKE             ; WAITING FOR MAKE\r
+GO_T0_OVERFLOW_RET:\r
+       RJMP    T0_OVERFLOW_RET         ; ALREADY HAD MAKE, NOT TURNED ON YET\r
+\r
+TURNON_BREAK:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BREQ    TURNON_SAVE             ; NO, COUNT DOWN TO BREAK\r
+       LDI     D,4+1                   ; YES, RESTART COUNTDOWN TO BREAK\r
+       RJMP    TURNON_SAVE\r
+TURNON_MAKE:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BRNE    TURNON_SAVE             ; YES, COUNT DOWN TO MAKE\r
+       LDI     D,3+1                   ; NO, RESTART COUNTDOWN TO MAKE\r
+TURNON_SAVE:\r
+       DEC     D                       ; COUNT DOWN TO MAKE OR BREAK\r
+       STS     TURNON_COUNT,D\r
+       BRNE    GO_T0_OVERFLOW_RET      ; NOT READY TO TRY TURNON YET\r
+\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       CBI     DDRD,2                  ; D2 = TRI-STATE, VSWT ON\r
+       RJMP    GO_SLEEP_ENTRY          ; WE WILL NOW WAIT FOR TURNON COMMAND\r
+\r
+TURNED_ON:\r
+       LDI     D,0                     ; STOP TIMER, WE WILL REGAIN\r
+       OUT     TCCR0,D                 ; CONTROL VIA NEXT CLOCKING INTERRUPT\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,50*4\r
+       CP      SCAN,C\r
+       BRLO    L0617\r
+\r
+       LDS     D,DEBOUNCE              ; COMPLETED ENTIRE SCAN, START NEW SCAN\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+       DEC     D\r
+       STS     DEBOUNCE,D\r
+       BRNE    L0617_RESET\r
+\r
+       LDS     D,ACTIVE_ZONE\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE\r
+       BRSH    L0617_RESET\r
+\r
+       PUSH    A\r
+       LDI     A,0\r
+       RCALL   TX_CHAR\r
+       POP     A\r
+\r
+L0617_RESET:\r
+       CLR     SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+L0617: ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+       ;LDIZ   SCAN_TBL\r
+       LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDS     D,LATCH5_SAV\r
+       ANDI    D,$80                   ; BIT 7 = PRESERVED, LCD ON/OFF STATUS\r
+       ORI     D,$40                   ; BIT 6 = 1 VDD ON\r
+       OR      D,R0\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    CLEAR_DISPLAY_LOOP\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_XPAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; HOW MANY SECS/6553600 PER 4HZ INTERRUPT ?\r
+; EACH TIME THROUGH ADD 1638400 SECS/6553600 = 1/4 SEC\r
+; OSCILLATOR IS SLOW SO WE WILL ADD 1 PART IN 10000\r
+; HENCE EACH TIME THROUGH ADD 1638400+164 = 1638564 UNITS TO COUNT\r
+\r
+TIM2_OVF:\r
+       IN      SR,SREG\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+;!!    LDI     A,$10                   ; DIAGNOSTIC\r
+;!!    STS     BUZZ_TIME,A             ; SHORT BEEP\r
+\r
+       LDS     D,TIME_HSEC_64K\r
+       SUBI    D,LOW(-1638564)\r
+       STS     TIME_HSEC_64K,D\r
+\r
+       LDS     D,TIME_HSEC_256\r
+       SBCI    D,HIGH(-1638564)\r
+       STS     TIME_HSEC_256,D\r
+\r
+       LDS     D,TIME_HSEC\r
+       SBCI    D,HIGH(-1638564>>8)\r
+       CPI     D,100\r
+       BRSH    TIM2_CARRY\r
+       STS     TIME_HSEC,D\r
+\r
+TIM2_END:\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA COMMAND,\r
+       RETI                            ; START A NEW SCAN, OTHERWISE DONE\r
+\r
+       LDI     D,0\r
+       STS     SCAN_STATE,D            ; WE WILL EXECUTE SCAN_START ROUTINE\r
+       RJMP    T0_OVERFLOW             ; GO AND TURN VDD ON\r
+\r
+GO_TX_CHAR:\r
+       RJMP    TX_CHAR\r
+\r
+TIM2_CARRY:\r
+       LDI     D,0\r
+       STS     TIME_HSEC,D\r
+\r
+       LDS     D,TIME_SECOND\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_SECOND\r
+\r
+       LDS     D,TIME_MINUTE\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_MINUTE\r
+\r
+       LDS     D,TIME_HOUR\r
+       INC     D\r
+       CPI     D,24\r
+       BRLO    TIM2_HOUR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+       LDI     ZL,LOW(MONTH_TABLE*2-1)\r
+       LDI     ZH,HIGH(MONTH_TABLE*2-1)\r
+       LDS     E,DATE_MONTH\r
+       ADD     ZL,E\r
+       LDI     E,0\r
+       ADC     ZH,E\r
+       LPM\r
+       MOV     E,R0\r
+       CPI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDS     E,DATE_YEAR\r
+       ANDI    E,3\r
+       LDI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDI     E,29\r
+FEBRUARY_OK:\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDS     D,DATE_DAY\r
+       CP      D,E\r
+       BRLO    TIM2_DAY\r
+\r
+       LDS     D,DATE_MONTH\r
+       CPI     D,12\r
+       BRLO    TIM2_MONTH\r
+\r
+       LDS     D,DATE_YEAR\r
+       INC     D\r
+       STS     DATE_YEAR,D\r
+       CLR     D\r
+TIM2_MONTH:\r
+       INC     D\r
+       STS     DATE_MONTH,D\r
+       CLR     D\r
+TIM2_DAY:\r
+       INC     D\r
+       STS     DATE_DAY,D\r
+       CLR     D\r
+TIM2_HOUR:\r
+       STS     TIME_HOUR,D\r
+       CLR     D\r
+TIM2_MINUTE:\r
+       STS     TIME_MINUTE,D\r
+       CLR     D\r
+TIM2_SECOND:\r
+       STS     TIME_SECOND,D\r
+\r
+TIM2_SEND:\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-7\r
+       BRSH    TIM2_SEND_SKIP\r
+\r
+       PUSH    A\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'T'\r
+       RCALL   TX_CHAR\r
+; LDS A,VCCL\r
+; RCALL TX_CHAR\r
+; LDS A,VCCH\r
+; RCALL TX_CHAR\r
+; LDS A,VEEL\r
+; RCALL TX_CHAR\r
+; LDS A,VEEH\r
+; RCALL TX_CHAR\r
+; LDI A,$0D\r
+; RCALL TX_CHAR\r
+       LDS     A,TIME_HOUR\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_MINUTE\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_SECOND\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_MONTH\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_DAY\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_YEAR\r
+       RCALL   GO_TX_CHAR\r
+       POP     A\r
+\r
+TIM2_SEND_SKIP:\r
+       RJMP    TIM2_END\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MONTH_TABLE:\r
+       .DB     31,28,31,30,31,30,31,31,30,31,30,31\r
+\r
+; 1ST BYTE = LED\r
+; 2ND BYTE = PHOTO\r
+; 3RD BYTE = TOUCH CHANNEL\r
+\r
+SCAN_TBL:\r
+       .DB     $F0,$34,$00,$00,$E8,$34,$01,$00,$F0,$33,$01,$00,$E8,$33,$02,$00\r
+       .DB     $E4,$33,$03,$00,$E8,$32,$03,$00,$E4,$32,$04,$00,$E2,$32,$05,$00\r
+       .DB     $E4,$31,$05,$00,$E2,$31,$06,$00,$E1,$31,$07,$00,$E2,$30,$07,$00\r
+       .DB     $E1,$30,$08,$00,$C1,$2A,$00,$00,$C2,$2A,$01,$00,$C1,$2B,$01,$00\r
+       .DB     $C2,$2B,$02,$00,$C4,$2B,$03,$00,$C2,$2C,$03,$00,$C4,$2C,$04,$00\r
+       .DB     $C8,$2C,$05,$00,$C4,$18,$05,$00,$C8,$18,$06,$00,$D0,$18,$07,$00\r
+       .DB     $C8,$19,$07,$00,$D0,$19,$08,$00,$A1,$19,$09,$00,$D0,$1A,$09,$00\r
+       .DB     $A1,$1A,$0A,$00,$A2,$1A,$0B,$00,$A1,$1B,$0B,$00,$A2,$1B,$0C,$00\r
+       .DB     $A4,$1B,$0D,$00,$A2,$1C,$0D,$00,$A4,$1C,$0E,$00,$A8,$1C,$0F,$00\r
+       .DB     $A4,$1D,$0F,$00,$A8,$1D,$10,$00,$B0,$1D,$11,$00,$A8,$1E,$11,$00\r
+       .DB     $B0,$1E,$12,$00,$61,$1E,$13,$00,$B0,$1F,$13,$00,$61,$1F,$14,$00\r
+       .DB     $62,$1F,$15,$00,$61,$28,$15,$00,$62,$28,$16,$00,$64,$28,$17,$00\r
+       .DB     $62,$29,$17,$00,$64,$29,$18,$00\r
+\r
+RTN_CODE:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$08,$08,$08,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$7E,$00,$31,$00,$32,$00,$33,$00,$34,$00,$35,$00,$36,$00\r
+       .DB     $37,$00,$38,$00,$39,$00,$30,$00,$2D,$00,$3D,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$51,$00,$57,$00,$45,$00,$52,$00,$54,$00,$59,$00\r
+       .DB     $55,$00,$49,$00,$4F,$00,$50,$00,$5B,$00,$5D,$00,$5C,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$41,$00,$53,$00,$44,$00,$46,$00,$47,$00\r
+       .DB     $48,$00,$4A,$00,$4B,$00,$4C,$00,$3B,$00,$27,$00,$0D,$0D,$0D,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5A,$00,$58,$00,$43,$00\r
+       .DB     $56,$00,$42,$00,$4E,$00,$4D,$00,$2C,$00,$2E,$00,$2F,$00,$00,$00\r
+       .DB     $00,$00\r
+RTN_CODE_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+.INCLUDE "CHSET00.INC"\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+GET_CLEAR_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   CLEAR_FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_CLEAR_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   CLEAR_HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+NO_GOX:        RET\r
+\r
+CLEAR_FRAME_RECT:\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_YY\r
+       STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+FRAME_RECT:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GOX\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GOX\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CLEAR_HALFTONE_RECT:\r
+;      LDS     F,RECTNC_X\r
+;      STS     RECT_X,F\r
+;      LDS     F,RECTNC_Y\r
+;      STS     RECT_Y,F\r
+;      LDS     F,RECTNC_XX\r
+;      STS     RECT_XX,F\r
+;      LDS     F,RECTNC_YY\r
+;      STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+HALFTONE_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LDI     A,$55\r
+       SBRS    YH,0\r
+       LDI     A,$AA\r
+       MOV     PATTERN,A\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    X03A3\r
+X039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+X03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    X03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       TST     XPIXEL\r
+       BREQ    X03B0\r
+X03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    X03AD\r
+X03B0: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+X03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       BREQ    X03D2\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    X03B8\r
+X03C2: TST     X_SIZE\r
+       BREQ    X03D3\r
+X03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    X03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    X03D2\r
+       CLR     B\r
+X03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    X03CB\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+X03D2: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+X03D3: COM     PATTERN\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    X039A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4102                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/TSV4.HEX b/src/avr/TSV4.HEX
new file mode 100644 (file)
index 0000000..4107a0d
--- /dev/null
@@ -0,0 +1,504 @@
+:020000020000FC\r
+:100000000DC006C606C6189505C61895189518950C\r
+:1000100002C602C61895EDC6D7C62EC702E00EBFAF\r
+:100020000FE50DBF10E818B9A8951FE011BD00E05D\r
+:1000300000935F01009360010093610100936201EE\r
+:10004000009363010093640101E000936501009354\r
+:10005000660104E10093670108E002BD03E005BD0D\r
+:1000600000E409BF00E00BBF08EB01BB02BB0FE1DE\r
+:1000700007BB0FEF0ABB04BB00270BBB03E008BBA9\r
+:1000800000E105BBC29AC2980093190100E2B02EAC\r
+:1000900017E119B910E91AB944245524222433244C\r
+:1000A000EE246624CC2458E15BBBC49AC4985093D8\r
+:1000B000170155275093180150933B0150936A0143\r
+:1000C00050936B0150931001DD24D0921401D09213\r
+:1000D0001501D092160154EF509369015BBB50910A\r
+:1000E000190155BBA89AC29AC298A898C29AC298F8\r
+:1000F0007894E2E0F9E1A2EEB0E0DBE1D0931A01FE\r
+:1001000008D1D0E8C0ECDBBBC39AC398D0931801E8\r
+:10011000C5BBC89500240BBAC198C0980000C09A0E\r
+:10012000C19AAA9541F03196C3951C2F1F7381F790\r
+:10013000C054D395E8CF10E3D9D2CF93DF93E4D264\r
+:10014000BF91AF915FD5212F1D2F129533D3121779\r
+:10015000B1F4119657D5212F1D2F2CD3121779F4F6\r
+:10016000119650D5212F1C2F129524D3121739F434\r
+:10017000119648D5212F1C2F1DD3121709F1E4EE3B\r
+:10018000F9E1A6E6B3E0D9E1D0931A01C2D0D0E0FC\r
+:10019000C0E4DBBBC39AC398D0931801C5BBC89514\r
+:1001A0000BBAC198C0980000C09AC19A119741F04B\r
+:1001B0003196C3951C2F1F7389F7C054D395E9CF8F\r
+:1001C00020E12093030120E42093040129E12093FE\r
+:1001D0000501C0E0D0E218E118D520E82F93CF93B5\r
+:1001E000DF9320E211D5269622E00ED5DF91CF9144\r
+:1001F0002F91C05CDF4F2A9589F7B4D610E0109399\r
+:10020000110116E31093100110E01093680110E043\r
+:1002100010934C0110934D011EEF10930D011CEA39\r
+:1002200010930C0122E020D21C7F10930E0123E0DA\r
+:100230001BD210930F0110910E0120910F011A3360\r
+:100240000DEF200720F01C3B0DEF200730F01DEFD5\r
+:1002500010930F0110E810930E011FEF19BD18E362\r
+:1002600018BD1CEF1DBD1EEC1CBD10E51FBD11E02F\r
+:100270001EBD00E003BF05E008BF05E409BF0AE0BA\r
+:1002800005BF00EC0ABF0BBF9EC202E00EBF0FE528\r
+:100290000DBF50E05FBD5EBD949A959850911701D7\r
+:1002A0005F7B5BBBC49AC4985093170154E7B6FEBA\r
+:1002B00054E3509369015BBB5091190155BBA89A57\r
+:1002C000C29AC298A898C29AC29851E459BF50E005\r
+:1002D00053BF5BBF04E000936A0117E119B910E94D\r
+:1002E0001AB94424552422243324EE246624CC2431\r
+:1002F000F89403B700230AE411F4809B0AE705BFD2\r
+:1003000078948895A89500916A01002389F7F8945C\r
+:10031000A3CED0911A01C0911701C07EDC2BDBBBAC\r
+:10032000C49AC498D0931701089578941FEDE122E0\r
+:1003300010E01EBB1FBBE2D21B3159F1B3FC0DC054\r
+:10034000103258F4183009F407C11D3009F41CC1EB\r
+:100350001A3009F4C0C0173041F7B2FC18C010338E\r
+:10036000B1F4C0910301D091040120910501CC5F4B\r
+:10037000DD4FF894309117013227307E32273BBB96\r
+:10038000C49AC49878943093170193D5102DECD269\r
+:10039000CCCFB4D21B3109F31E3209F47CC11F3219\r
+:1003A00009F452C01F3309F491C1123409F45EC03C\r
+:1003B000123609F45FC0133409F40BC1133609F483\r
+:1003C000C4CC143409F4F2C0153409F4DFC0163477\r
+:1003D00009F40FC1163609F4C4CC173409F4A1C0CE\r
+:1003E000183409F4D6CC183609F4C7CC1B3409F4F8\r
+:1003F00096C01C3409F40AC41D3409F42EC01E34FE\r
+:1004000009F403C1103509F49AC0123509F4E3C0A8\r
+:10041000133509F4D9C0143509F440C0153509F471\r
+:100420006BC2163519F410E2E12AFBC0173509F446\r
+:1004300063C2183509F4C4C11A3509F4EEC110338A\r
+:1004400010F01A3310F171CF59D210FF03C014E02D\r
+:10045000B12A6BCF1BEFB12268CF50D2103329F4F1\r
+:10046000F89400E4B02A8A9A10CF5FCF47D21F9346\r
+:1004700010E004C043D21F9341D21F7010931101AA\r
+:100480001F911093100151CF39D230D1C0E1C093E8\r
+:100490000301D09304012093050147CF10E015BD5F\r
+:1004A00010935F01109360011093610127D21093A4\r
+:1004B000640124D21093630121D2109362011ED2F1\r
+:1004C000109366011BD21093650118D21093670137\r
+:1004D00013E015BD2ACF01D028CF0F92C0910301A0\r
+:1004E000D091040120910501DE5FC395F89430910D\r
+:1004F00017013227307E32273BBBC49AC4987894C8\r
+:1005000030931701D6D4182F100D100D1A951038EE\r
+:1005100018F0C0D00F900895800D0F90089522D547\r
+:1005200004CFECD1103309F404C0113309F404C032\r
+:10053000FCCE07EFB022F9CE08E0B02AF6CEDED12D\r
+:10054000103309F403C0113309F403C00FEEB022D5\r
+:10055000ECCE00E1B02AE9CEC0910301D0910401B4\r
+:1005600020910501DE5FF894309117013227307E2B\r
+:1005700032273BBBC49AC49878943093170199D41E\r
+:1005800070191FB712FFD1CE7727CFCEB7D111FD8B\r
+:1005900007C010FD03C00FEDB022C7CE00E2B02AA5\r
+:1005A000002700933B01EAD2F1F7BFCEA7D1103369\r
+:1005B00009F404C0113309F404C0B7CE0EEFB02221\r
+:1005C000B4CE01E0B02AB1CE99D1712F97D1812F4D\r
+:1005D000ACCE02E0B02A70935201809353018ED1C9\r
+:1005E000109354018BD11093550117D30DEFB02206\r
+:1005F0009CCE709356018093570180D1109358017F\r
+:100600007DD1109359015ED390CE709356018093A3\r
+:10061000570174D11093580171D11093590177D3B8\r
+:1006200084CE6CD110FF0BC010910E0120910F01F0\r
+:100630001C5F2F4F1C3B0DEF2007A8F40AC0109140\r
+:100640000E0120910F01145020401A330DEF2007A6\r
+:1006500050F010930E0120930F0122E00DD0109165\r
+:100660000F0123E009D061CEE199FECF2EBB2227F6\r
+:100670002FBBE09A1DB30895E199FECFE5FEFFCFB1\r
+:100680002EBB22272FBB1DBBF894E5FEFFCFE29ABD\r
+:10069000E19A189536C732D129D030D1A12F2ED169\r
+:1006A000B12F2CD1F894309117013227307E3227A8\r
+:1006B0003BBBC49AC498789430931701A4D2219676\r
+:1006C00011971A2F1B2B09F0ECCF2FCE17D10ED07C\r
+:1006D0001F931AD01BE133D11FE331D11F91105D5D\r
+:1006E0002ED11D2F60D01C2F5ED01FCEC0E0D0E0D9\r
+:1006F00024E61F701A3008F4210F2695D795269509\r
+:10070000D795D695D6950895A6E1B2E0AC0FBD1F5A\r
+:10071000F894309117013227307E32273BBBC49AC0\r
+:10072000C4987894309317016DD2E12F11966AD254\r
+:10073000F12FAC2FBD2F1496CFEFDFEF3197FF7065\r
+:10074000349780F131965ED2119601E220E1D127F3\r
+:10075000CC0FDD1F10F4C027D227CC0FDD1F10F403\r
+:10076000C027D227CC0FDD1F10F4C027D227CC0F13\r
+:10077000DD1F10F4C027D227CC0FDD1F10F4C027D7\r
+:10078000D227CC0FDD1F10F4C027D227CC0FDD1FDE\r
+:1007900010F4C027D227CC0FDD1F10F4C027D227BA\r
+:1007A000319789F608951F93129504D0C8D01F91F0\r
+:1007B00001D0C5C01F7010631A3308F0195F089587\r
+:1007C0009DD010FD13C070936C0180936D01B092A9\r
+:1007D0006E011091030110936F01109104011093A9\r
+:1007E000700110910501109371019FCD70916C0102\r
+:1007F00080916D0110ECB12210916E011F73B12A2E\r
+:1008000010916F0110930301109170011093040176\r
+:10081000109171011093050188CD70D010935A0189\r
+:100820006DD0C12F175F5DD020935B0167D0D12FB2\r
+:100830001C5F5CD020935C0161D01C0F1F5051D015\r
+:1008400020935D015BD01D0F115150D020935E01AC\r
+:10085000D0915C0110915E011D1B08F441C0C09154\r
+:100860005B011C2F1D0F2D2F220F220F220F120FA5\r
+:10087000220F120FA0E0B0EE20E0A10FB21F2BE17B\r
+:10088000F894309117013227307E32273BBBC49A4F\r
+:10089000C49878943093170110915D011C1BF0F0FF\r
+:1008A0003A2F3F7335BB3B2F330F330FA7FB31F983\r
+:1008B000A6FB30F93BBBF894C39AC3987894309365\r
+:1008C000180110915A011BBBF894C198C098000000\r
+:1008D000C09A7894C19A1196C395DECFD395BACFBA\r
+:1008E00024CD2FEF23951A50E8F708952FEF239585\r
+:1008F0001D50E8F7089502D001D017CD10EC1093E9\r
+:100900006B01A89510E01EBB1FBB10EC80991093E3\r
+:100910006B01B5FC33D13320A1F310E010936B01D0\r
+:10092000CF93DF93C22DC058DD271881F8943A94F5\r
+:100930002394CFE72C227894DF91CF9108951F93D1\r
+:10094000A895152D1032E0F71F91CF93DF93DFB7F5\r
+:10095000F894C52DC40DDFBFCF71C05ADD271883B1\r
+:100960005394DF91CF910895D2D0EFD00027009318\r
+:100970001201B4FC0FC0C0910301D0910401DE5FED\r
+:10098000F02C97D20F920F1808F4002406940092CE\r
+:1009900012010F90B3FC08C0072F000D28F4772731\r
+:1009A0009CDD10910501B9D600911201070F00934B\r
+:1009B0004E0180934F01700D60914E0190904F0158\r
+:1009C00086FE07C0C0915001D0915101229771D28B\r
+:1009D000900C87FE07C0C0915001D0915101239720\r
+:1009E00068D2600D5AD260930201A0920001C091BA\r
+:1009F0005001D091510121965CD2702C0FEF0ABBAF\r
+:100A0000C09A0FE18022809201010027801201C06C\r
+:100A10007DC0AA27B92DB695A795B695A795B05EC6\r
+:100A200007C09394A05CBF4F80900101A09000018B\r
+:100A3000AA2A22272196109105016FD63AD21127B2\r
+:100A400060910201662339F08894079417956A959E\r
+:100A5000E1F7022A212F08E1F8943091170130279D\r
+:100A6000307E30273BBBC49AC498789430931701EA\r
+:100A70003A2D3F7335BB3B2F330F330FA7FA31F9B4\r
+:100A8000A6FA30F93BBBF894C39AC3987894309394\r
+:100A9000180100270ABBF894C0980000C19809B358\r
+:100AA0000026B0FC002A0FEF0ABB0BBA0000C09A68\r
+:100AB0007894C19AA3948A9409F0BCCF222311F1AF\r
+:100AC0003A2D3F7335BB3B2F330F330FA7FA31F964\r
+:100AD000A6FA30F93BBBF894C39AC3987894309344\r
+:100AE000180100270ABBF894C0980000C19809B308\r
+:100AF0002027B0FC202B0FEF0ABB2BBB0000C09AB5\r
+:100B00007894C19A31D07A9409F08BCF0895C12F8F\r
+:100B1000DD27CC0FDD1F10910301C10F10910401DF\r
+:100B2000D11F10910501F9D5C4D12196F02CC1D166\r
+:100B3000CF2DD02D10910301C10F10910401D11FB1\r
+:100B4000C0935001D09351010895C0915001D091AC\r
+:100B50005101AFD1802C219785FCABC1C09103011D\r
+:100B6000D0910401DE5FA5C1CF93DF93192D39D059\r
+:100B70001881122B1883DF91CF9108952F93CF9373\r
+:100B8000DF9310913B012DD01881122309F41FC06F\r
+:100B900028812127288310E010936B01AF93BF9326\r
+:100BA000CC27D0913B01D695C795D695C795AC2F4C\r
+:100BB000BD2FB05E18E1B1D520E26CD51297269614\r
+:100BC00022E068D5BF91AF9110EC10936B011091AA\r
+:100BD0003B0113951F7710933B01DF91CF912F912C\r
+:100BE0000895CCE3D1E01F77212F269526952695F1\r
+:100BF000C20F20E0D21F21E0177019F0220F1A95C2\r
+:100C0000E9F7089554C56FC54CC587C597C48DCB0A\r
+:100C1000DFC1DFC18FC5E6C1C6C278949090530191\r
+:100C2000609152013AD160930201A092000170904C\r
+:100C30005501CC27D92DD695C795D695C795D05EA9\r
+:100C400018E16BD507C0C05CDF4F9394609102013F\r
+:100C5000A0900001AC2A1FEF8090540100E08016A4\r
+:100C600041F008E08016B8F0662319F016956A95F1\r
+:100C7000E9F73BD108E010910201011B801AA3940F\r
+:100C80001FEF08E0801638F0B1F02FD11FEF08E019\r
+:100C9000801AA394F6CF882079F016958A94E9F704\r
+:100CA0001095662341F02227169527956A95E1F75E\r
+:100CB0001CD1A394122F19D157DF7A9400277012F8\r
+:100CC000C2CF0895009158010A950230D0F30091E7\r
+:100CD00059010330B0F3009156010395009352017E\r
+:100CE0000091570100935301809058018A948A948F\r
+:100CF0008092540101E0009355018FDF009156016D\r
+:100D00000093520180905801809254013AC00091A2\r
+:100D100058010A950230A8F200915901033088F277\r
+:100D200000915601039500935201009157010093E1\r
+:100D30005301809058018A948A948092540101E072\r
+:100D4000009355016ADF0091560100935201009112\r
+:100D50005701039500935301709059017A947A9446\r
+:100D60007092550101E00093540157DF80905801C3\r
+:100D700000915601080D0A950093520101E000937D\r
+:100D8000540100915701039500935301709059014C\r
+:100D90007A947A947092550140DF00915601039540\r
+:100DA00000935201809058018A948A948092540151\r
+:100DB0007090590100915701070D0A950093530156\r
+:100DC00001E00093550129CF1FB60F930FEDC02E00\r
+:100DD000EF93FF93E42DE05AFF270081FF91EF91FD\r
+:100DE0000CB95A9443940FE140226A940AF04CC023\r
+:100DF00051C01FB60F930FEDC02E0CB15C993EC0D1\r
+:100E0000E7FC2CC0E6FC0EC0023031F400E009B96A\r
+:100E1000539A00E4E02A3EC00A3A19F400E0009335\r
+:100E20006A0138C0602E00E803190AF40FE7662053\r
+:100E300012F4052D00680CB9061508F4602E062D75\r
+:100E40000F7739F000ECE02A6A9422F55798559A0A\r
+:100E500021C00FEBE022569A5E9A1CC0EF93FF93DD\r
+:100E6000E32DE20DEF77E058FF270083FF91EF912C\r
+:100E700033946A947AF40CC01FB60F93539807E129\r
+:100E800009B90FEBE022CC2455985698579A0CB12B\r
+:100E90000FE7E0220F911FBE1895AA2400EFA01AB9\r
+:100EA00067FFAA246F77685014F0A394FCCF685FA3\r
+:100EB00008953C2F3F7335BB3D2F330F330FC7FBD6\r
+:100EC00031F9C6FB30F93BBBF894C39AC3987894C8\r
+:100ED0003093180100270ABBF894C0980000C09A0C\r
+:100EE00009B278940FEF0ABB08953A2D3F7335BBD2\r
+:100EF0003D2F330F330FA7FA31F9A6FA30F93BBB78\r
+:100F0000F894C39AC39878943093180100270ABBC9\r
+:100F1000F894C0980000C09AF9B278940FEF0ABB19\r
+:100F2000B1FE03C01095F12203C0F126B0FCF12AF6\r
+:100F30003A2D3F7335BB3D2F330F330FA7FA31F9ED\r
+:100F4000A6FA30F93BBBF894C39AC39878943093CF\r
+:100F50001801FBBAF894C198C0980000C09A789420\r
+:100F6000C19A0895772788279924C0E0D0E218E134\r
+:100F7000D4D3AA24A0920001109100011C2B312F80\r
+:100F80003F7335BB3D2F330F330F17FB31F916FB82\r
+:100F900030F93BBBF894C39AC39878943093180106\r
+:100FA00000E00BBBF894C198C0980000C09A7894F8\r
+:100FB000C19AA39400E2A01619F0A0920001DCCF20\r
+:100FC000D3DD9394C05CDF4FD03409F0D2CF0895C5\r
+:100FD00018951FB68B9A4CB55DB550930901409397\r
+:100FE000080114C11FB65AB35F935BB35F9355B347\r
+:100FF0005F93509118015F935FEF5ABB50E75FBD5D\r
+:101000004CB55DB5485F5F4F5BBD4ABD59BD48BD3E\r
+:1010100040914C0150914D015170452B49F4509134\r
+:101020006B01539550936B0151F45FEBB5222DC9C1\r
+:1010300000000000000000000000000000008B9A8B\r
+:10104000939A55275EBD5DBD5CBD50914D01542BFB\r
+:1010500071F0509117015BBBC49ADD9ADD98C4987A\r
+:101060000000000000000000000000000EC05091D1\r
+:101070001701506850625BBBC49A40E654275BBBC3\r
+:101080005F775BBBC49850931701509117015F9332\r
+:10109000EF93FF93E0914C01F0914D01E05CFF4F25\r
+:1010A000FF713F933E2F3F7335BB3F2F330F330FFD\r
+:1010B000E7FB31F9E6FB30F93BBBC39AC398F093E9\r
+:1010C000180130911701F7FB31F9F6FB30F93BBB02\r
+:1010D000C49AC498309317013F91C198C19A9798C8\r
+:1010E00044274ABB40EC44BBC09855275BBD5ABD62\r
+:1010F00059E05EBDE0934C01F0934D01FF91EF91FB\r
+:101100005CE35A95F1F7C09A5FEF5ABB979A54BBCC\r
+:101110008D98959851E000005EBD5BE05A95F1F71F\r
+:1011200050910D0140910C018D9A859907C04A3369\r
+:101130009DEF590752F0415050400BC0453D9FEF85\r
+:1011400059071AF44F5F5F4F04C000000000000011\r
+:10115000000050930D0140930C015BBD4ABD4091CE\r
+:101160000C0150910D0190910E01491B90910F01BE\r
+:10117000590B1AF445ED5FEF04C04CEA5EEF000036\r
+:10118000000059BD48BD52E053BF5DEE52BF51E073\r
+:10119000509368015DEF5DBD54E35CBD8B989398FF\r
+:1011A00050EE5FBD21C01FB65AB35F935BB35F9330\r
+:1011B00055B35F93509118015F93509117015F935E\r
+:1011C000FF93EF930F925FEF5ABB509168015395D5\r
+:1011D000509368015A95E1F05A9511F15A9509F426\r
+:1011E00089C00F90EF91FF915F915BBBC49AC49847\r
+:1011F000509317015F915BBBC39AC398509318013A\r
+:101200005F9155BB5F915BBB5F915ABB1FBE189549\r
+:1012100053E053BF50EF52BF51E05093680153C1A8\r
+:1012200050911001552399F150911101505118F02E\r
+:10123000509311012CC0452F429554235093110116\r
+:101240004091190143FF10C0509110015A955093DD\r
+:101250001001A1F050911901577F546055BBC29AFB\r
+:10126000C2985093190113C05091190158605B7FC7\r
+:1012700055BBC29AC2985093190109C050911901E7\r
+:10128000577F5B7F55BBC29AC2985093190150910A\r
+:10129000690157FF06C050E8B5261AF4552753BF19\r
+:1012A000A0CF52E053BF52EF52BFEAE3F8E1552717\r
+:1012B000ED0DF51FC89554E3D51648F4509119016A\r
+:1012C0005F7E55BBC29AC2985093190108C05091D5\r
+:1012D0001901506155BBC29AC298509319010BBABB\r
+:1012E0000090190105BAA99AC29AC298A998C29AFF\r
+:1012F000C29877CF50B340EE4BBB4091190145BB2C\r
+:10130000A99AC29AC298A998C29AC298889456FD7E\r
+:1013100008C050911301552319F054E05093130164\r
+:1013200008944FB754E3D51660F44FBFE091150110\r
+:10133000F0911601EE1FFF1FE0931501F0931601C7\r
+:101340007BC04FBF08F078C050911301552321F0A6\r
+:1013500054E05093130170C0F0911601E091150113\r
+:1013600050911401552329F0452FF795E7954450E6\r
+:10137000E1F75C5FF795E79518F05433D0F35CC064\r
+:101380005093140144E3451BECE3F8E15527E40FC7\r
+:10139000F51FC895402D000C000C000C400D000CF2\r
+:1013A000400DECE3F8E15527ED0DF51FC895400D14\r
+:1013B000E0E0F0EE5527E40FF51F3F933E2F3F731B\r
+:1013C00035BB3F2F330F330FE7FB31F9E6FB30F925\r
+:1013D0003BBBC39AC398F093180130911701F7FBF8\r
+:1013E00031F9F6FB30F93BBBC49AC498309317012E\r
+:1013F0003F910F9300270ABBC0980000C09A09B222\r
+:101400000FEF0ABB0F91002029F4509114015433BF\r
+:1014100098F45EC054E0509313010092070156E324\r
+:1014200050931001552D5F3138F41F93102D8DDA34\r
+:101430001B3109F48ADA1F9154E0D50E50916901ED\r
+:1014400057FD27C053E053BF50EF52BF51E05093B8\r
+:10145000680144E3D416E8F250E053BF50911601FE\r
+:1014600040911501452B50916A01543018F45130C8\r
+:1014700028F4B7CE442329F055E003C0442309F4EF\r
+:1014800054E05A9550936A01A1F75FEBB5228A9810\r
+:10149000CECD50E053BF5093140148ECD416C0F0A9\r
+:1014A00050911301552379F05A955093130159F433\r
+:1014B00050910701552339F0552D503220F41F93D8\r
+:1014C00010E043DA1F91DD24D0921501D09216016D\r
+:1014D000EAE3F8E131965527ED0DF51FC8955091D7\r
+:1014E0006901507850645029509369015BBB509159\r
+:1014F000190155BBA89AC29AC298A898C29AC298D4\r
+:1015000070CE9924C0E0D0E2A0E0B0E218E105D1AD\r
+:10151000A05CBF4F0A94E1F720E22F93C8D0E3D03C\r
+:10152000A395C3952F912A9509F0F7CF1DDB9394CE\r
+:10153000A0969096B03409F0EFCF1BCDDFD91F9362\r
+:10154000DDD910937201DAD916951695169509F41E\r
+:1015500010E210937501D2D910937601172F1695CA\r
+:1015600016951695109373018093740118E1D5D0E8\r
+:101570001F9110FD46C0CC27D09174019D2ED695A9\r
+:10158000C795D695C79510917301C10FD05E209174\r
+:10159000760110917201121720F5211BAA27B09134\r
+:1015A0007401B10FB695A795B695A79510917301E3\r
+:1015B000A10FB05E2F93AF93BF93CF93DF93209192\r
+:1015C000750168D0D1DADF91CF91BF91AF912F91A2\r
+:1015D0009394A05CBF4FC05CDF4F2A9559F72091D0\r
+:1015E00072012F93CF93DF93209175015AD0BCDA0B\r
+:1015F000DF91CF912F919394C05CDF4F2A9589F7AB\r
+:1016000006CBCC27D091740100917601D00F9D2E8E\r
+:10161000D695C795D695C79510917301C10FD05E29\r
+:10162000202F10917201121728F5211BAA27B091C3\r
+:101630007401B00FB11BB695A795B695A7951091FB\r
+:101640007301A10FB05E9A94A054B040C054D04032\r
+:101650002F93AF93BF93CF93DF93209175011AD04F\r
+:1016600083DADF91CF91BF91AF912F912A9559F7EE\r
+:10167000209172019A94C054D0402F93CF93DF935E\r
+:10168000209175010ED070DADF91CF912F912A95BC\r
+:1016900089F7BDCA0CD0119626D021962A95D1F78C\r
+:1016A000089510E020D021962A95E1F708953A2F69\r
+:1016B0003F7335BB3B2F330F330FA7FB31F9A6FB2D\r
+:1016C00030F93BBBF894C39AC398789430931801CF\r
+:1016D00000270ABBF894C0980000C09A19B3789408\r
+:1016E0000FEF0ABB08953C2F3F7335BB3D2F330FDF\r
+:1016F000330FC7FB31F9C6FB30F93BBBF894C39AF3\r
+:10170000C3987894309318011BBBF894C198C09883\r
+:101710000000C09A7894C19A0895F8943091170106\r
+:101720003127307E31273BBBC49AC49878943093DC\r
+:10173000170108951FB650915F015C5550935F01EA\r
+:10174000509160015F4F5093600150916101564E7E\r
+:10175000543650F4509361011FBEB6FE189550E008\r
+:101760005093680120CDF1C850E050936101509131\r
+:10177000620153955C33E8F15091630153955C33FA\r
+:10178000A8F1509164015395583168F1EF93FF939C\r
+:101790000F92EDE2F8E190916601E90F90E0F91FF8\r
+:1017A000C895902D9C3131F49091670193709CE124\r
+:1017B00009F49DE10F90FF91EF9150916501591748\r
+:1017C00070F0509166015C3030F050916701539594\r
+:1017D00050936701552753955093660155275395AC\r
+:1017E0005093650155275093640155275093630129\r
+:1017F000552750936201552D5931C0F41F931BE1B9\r
+:10180000A4D814E5A2D810916401ADDF1091630152\r
+:10181000AADF10916201A7DF10916601A4DF109189\r
+:101820006501A1DF109167019EDF1F9195CF1F1CFD\r
+:101830001F1E1F1E1F1F1E1F1E1FF0340000E83436\r
+:101840000100F0330100E8330200E4330300E83222\r
+:101850000300E4320400E2320500E4310500E23125\r
+:101860000600E1310700E2300700E1300800C12A3C\r
+:101870000000C22A0100C12B0100C22B0200C42BB0\r
+:101880000300C22C0300C42C0400C82C0500C4189B\r
+:101890000500C8180600D0180700C8190700D0199D\r
+:1018A0000800A1190900D01A0900A11A0A00A21AF9\r
+:1018B0000B00A11B0B00A21B0C00A41B0D00A21C03\r
+:1018C0000D00A41C0E00A81C0F00A41D0F00A81DD5\r
+:1018D0001000B01D1100A81E1100B01E1200611EE4\r
+:1018E0001300B01F1300611F1400621F1500612850\r
+:1018F0001500622816006428170062291700642961\r
+:1019000018000000000000000000000000000000BF\r
+:1019100000000000000000000808080000000000AF\r
+:1019200000000000000000000000000000000000B7\r
+:10193000000000007E00310032003300340035002A\r
+:10194000360037003800390030002D003D0000001F\r
+:101950000000000000000000000000000000000087\r
+:1019600000000000000051005700450052005400E4\r
+:101970005900550049004F0050005B005D005C00BD\r
+:101980000000000000000000000000000000000057\r
+:101990000000000000000000410053004400460029\r
+:1019A000470048004A004B004C003B0027000D0D4B\r
+:1019B0000D0000000000000000000000000000001A\r
+:1019C0000000000000000000000000005A00580065\r
+:1019D0004300560042004E004D002C002E002F0008\r
+:1019E0000000000046323444303331393033313274\r
+:1019F000313730394C034C034C034C034C034C033C\r
+:101A00004C034C034C034C034C034C034C034C035E\r
+:101A10004C034C034C034C034C034C034C034C034E\r
+:101A20004C034C034C034C034C034C034C034C033E\r
+:101A30004C034C0300014C034C034C034C034C037C\r
+:101A40004C034C034C034C034C034C034C03030169\r
+:101A50004C034C0306010F01180121012A01330137\r
+:101A60003C0145014E0157014C034C034C034C0310\r
+:101A70004C034C034C036001690172017B0184013A\r
+:101A80008D0196019F01A901B201BB01C401CD01E5\r
+:101A9000D601DF01E801F101080211021A02230256\r
+:101AA0002C0235023E02470250024C034C034C0309\r
+:101AB0004C034C034C03590262026B0274027D0218\r
+:101AC00086028F029902A302AD02B802C202CB02C3\r
+:101AD000D402DD02E602F002FC0203030C0315034C\r
+:101AE0001E0327033003390343034C034C034C0309\r
+:101AF0004C034C030003066101F80107708898A8A5\r
+:101B0000C88870010720602020202070010770889D\r
+:101B100008102040F80107F810201008887001070D\r
+:101B200010305090F810100107F880F00808887005\r
+:101B30000107304080F08888700107F808102040C5\r
+:101B40004040010770888870888870010770888815\r
+:101B500078081060010770888888F888880107F085\r
+:101B60008888F08888F001077088808080887001FC\r
+:101B700007E09088888890E00107F88080F08080F6\r
+:101B8000F80107F88080F08080800107708880B8B5\r
+:101B90008888780107888888F888888802210780E3\r
+:101BA000808080808080010708080808088870010C\r
+:101BB000078890A0C0A090880107808080808080E6\r
+:101BC000F8010788D8A8A888888801078888C8A845\r
+:101BD0009888880107708888888888700107F0884D\r
+:101BE00088F0808080010770888888A890684C03FE\r
+:101BF0004C034C03060801014F0065030107F08800\r
+:101C000088F0A090880107708880700888700107AC\r
+:101C1000F820202020202001078888888888887064\r
+:101C20000107888888888850200107888888A8A8A4\r
+:101C3000A850010788885020508888010788888824\r
+:101C4000502020200107F80810204080F8010700EC\r
+:101C500000700878887801078080F0888888F00113\r
+:101C600007000078808080780107080878888888D5\r
+:101C700078010700007088F8807001071820F820AC\r
+:101C800020202001080000788888780870010780EB\r
+:101C900080B0C8888888022107800080808080808A\r
+:101CA0000521081000101010109060052107808099\r
+:101CB00090A0C0A090032107C04040404040400198\r
+:101CC000070000F0A8A8A8A801070000B0C88888ED\r
+:101CD0008801070000708888887001080000F0887B\r
+:101CE00088F080800108000078888878080802055C\r
+:101CF0006105B0C08080800107000078807008F026\r
+:101D000001072020F820202018010700008888887B\r
+:101D10009868010700008888885020010700008823\r
+:101D200088A8A850010700008850205088010800AA\r
+:101D30000088888878087001070000F8102040F8B3\r
+:101D40000107F8F8F8F8F8F8F80070935601809356\r
+:101D50005701D4D510935801D1D51093590126D0ED\r
+:101D6000E4C27093560180935701C8D5109358016F\r
+:101D7000C5D5109359012FD0D8C2709352018093CA\r
+:101D80005301BCD510935401B9D51093550178D0A7\r
+:101D9000CCC27093520180935301B0D5109354017B\r
+:101DA000ADD51093550171D0C0C208950091560170\r
+:101DB0000093520100915701009353010091580183\r
+:101DC00000935401009159010093550102E0B02A9B\r
+:101DD00024D70DEFB022009158010A95023028F364\r
+:101DE00000915901033008F300915601009352010C\r
+:101DF0000091570100935301009158010093540141\r
+:101E000001E00093550109D700915601009352015A\r
+:101E1000009157010395009353010091590102501D\r
+:101E20000093550101E000935401F7D680905801CA\r
+:101E300000915601080D0A950093520101E00093AC\r
+:101E400054010091570103950093530100915901EA\r
+:101E5000025000935501E1D60091560100935201C2\r
+:101E6000009158010093540170905901009157015D\r
+:101E7000070D0A950093530101E000935501CDC66B\r
+:101E800002E0B02ACAD60DEFB022789490905301A8\r
+:101E90006091520102D860930201A09200017090FB\r
+:101EA0005501CC27D92D15E5D0FF1AEA012ED6957C\r
+:101EB000C795D695C795D05E18E12FDC07C0C05CEA\r
+:101EC000DF4F939460910201A0900001AC2A1FEFB4\r
+:101ED0008090540100E0801641F008E08016C8F0C0\r
+:101EE000662319F016956A95E9F71021FED708E0E8\r
+:101EF00010910201011B801AA3941FEF08E08016C5\r
+:101F000040F0C1F01021F1D71FEF08E0801AA39430\r
+:101F1000F5CF882089F016958A94E9F71095662305\r
+:101F200049F02227169527956A95E1F71021DDD70C\r
+:101F3000A394122F1021D9D7009416D67A94002793\r
+:061F40007012BDCF0895F0\r
+:0220000002419B\r
+:00000001FF\r
diff --git a/src/avr/WPO15V1.HEX b/src/avr/WPO15V1.HEX
new file mode 100644 (file)
index 0000000..4f579fb
--- /dev/null
@@ -0,0 +1,132 @@
+:020000020000FC\r
+:020000000EC030\r
+:06001200DCC1A3C270C1B5\r
+:10001C0064C302E00EBF0FE50DBF00E808B9A89558\r
+:10002C000FE001BD0AE50093CC0000E00DB90AB960\r
+:10003C000FEF04BBC79ABE9AD79A8E9A929A939A4C\r
+:10004C00959A8D9ADE98D69897988F9A94988C9AC0\r
+:10005C00C398BB9A9198899A07E00DD106E00BD111\r
+:10006C0005E009D104E007D101E005D100E003D19E\r
+:10007C000FE509B908E10AB92AD10AEA0CB90CB999\r
+:10008C0029D1949A27D1949825D1949A0027E0E607\r
+:10009C00FF27019301930193EFEB019301930193DC\r
+:1000AC00019301930193019301930093BC0000937E\r
+:1000BC00CA000093BD000093BE0000E4008300E082\r
+:1000CC000093C80004E00093C9004427662711245C\r
+:1000DC0088249924AA2455246624772402E00093CA\r
+:1000EC00B70001E00093B3000093B4000093B50097\r
+:1000FC000093B6000093B8000093B9000093CB00B6\r
+:10010C0000E00093BA000093BB0000EF202E00EF3C\r
+:10011C00402E02E003BF01E009BF0EB10FB108EEA3\r
+:10012C000DB900E00DBD0CBD0BBD0ABD01EC0FBD42\r
+:10013C0001E00EBD05E007B90EED06B9789402E0BA\r
+:10014C001EE1E2E6F7E0A8D00091CC000A3509F0F8\r
+:10015C0066C041FD6FC043FD7AC040FFF5CF0091F2\r
+:10016C00CB00033041F0023091F002E01FE0EEE9E9\r
+:10017C00F7E092D006C002E01FE0EEEDF7E08CD085\r
+:10018C0000C003E01EE1E0E8F7E086D00FC002E01B\r
+:10019C001CE0EEEAF7E080D003E01EE1E2E6F7E0D7\r
+:1001AC007BD003E01CE0EEEAF7E076D01CD00B31FC\r
+:1001BC0009F0FCCF18D0043409F0F8CF14D0037038\r
+:1001CC0039F0013039F0023039F0033039F0EECF2C\r
+:1001DC00969A05C0969803C0DF9A01C0DF9810E389\r
+:1001EC00100FE4CF78940091CC000A35C1F441FD96\r
+:1001FC0021C043FD2CC0F8949920A1F30091B300C9\r
+:10020C00093081F7EF93FF93E82DED59FF2700811B\r
+:10021C009A948394EFE38E22FF91EF91189502E06C\r
+:10022C001EE1E2E6F7E038D002E01FE0EEEEF7E088\r
+:10023C0033D00AC002E01EE1E2E6F7E02DD002E086\r
+:10024C001FE0EAEBF7E028D043FD01C0FDCF02E050\r
+:10025C001EE1E2E6F7E020D002E01FE0EAECF7E076\r
+:10026C001BD00AEF37D00A95E9F702E013E0EAED6C\r
+:10027C00F7E012D0F6CFC39802FF919802FD919A45\r
+:10028C0029D001FF919801FD919A26D000FF9198F9\r
+:10029C0000FD919AC39A22C078940000F894AA2089\r
+:1002AC00D9F70093B400C895002D04D031961A9557\r
+:1002BC00D1F71895EF93FF93E92DEA0DE80DEF7345\r
+:1002CC00ED59FF270083FF91EF91A3940895E0EF80\r
+:1002DC00FAE006C0E8EC03C0E4E101C0E2E0F0E0C3\r
+:1002EC0020E02A95F1F73197E1F70895FFB666FD06\r
+:1002FC0022C03CB13125F2F0312552F0EF93FF933F\r
+:10030C00EEEBF091B300EF0FFF273083FF91EF91ED\r
+:10031C00131608F0132E6F7E6064312D3F7741F079\r
+:10032C0011202AF157986F7D3FEF232E606146C054\r
+:10033C0038EF40C03EC03091B600313019F031E09A\r
+:10034C003093BB003CB1EF93FF93E62DE70DE50D29\r
+:10035C00EF70ED55FF273083E091B500F091B600BA\r
+:10036C00EF1711F4639401C07394FF91EF913FEF79\r
+:10037C00232E1A940AF530EF232E60611FC0EF93E1\r
+:10038C00FF93EEEBF091B300EF0FFF2730813A951E\r
+:10039C003083E82DED59FF273081FF91EF913CB967\r
+:1003AC003FEF232E9A9483943FE383221A9431F4E3\r
+:1003BC0003C030EF232E6F7E57986F79FFBE1895D0\r
+:1003CC00FFB63091BD007091BE00732B49F03150D7\r
+:1003DC003093BD003091BE0030403093BE0091F0A0\r
+:1003EC00442051F0439441F430E03DB93EB13FB16B\r
+:1003FC0038EE3DB9D69A687F222011F02394B9F0DB\r
+:10040C00FFBE189506CE67FD18C0890C3FE383220A\r
+:10041C0099249092BA00EF93FF93EEEBF091B30016\r
+:10042C00EF0FFF2730E43083FF91EF9106C065FD9D\r
+:10043C00EACF66FDA4CF64FD7AC038EF232E30914D\r
+:10044C00BC00332359F03A953093BC0031F0C3987B\r
+:10045C009198899A30E03AB9B1CFDBCD57983FE506\r
+:10046C0039B93091BA0039293A2939F43091B800A8\r
+:10047C003A9549F03093B80037C03091B9003A95AD\r
+:10048C0091F03093B90030E13093B800992030915D\r
+:10049C00B30041F4AA2041F09A2CAA243091B40064\r
+:1004AC003093B300393001F16F779920B9F4AA2059\r
+:1004BC0059F43091BA003A9542F43091B300339527\r
+:1004CC00393048F031E007C031E03093BA009A2C53\r
+:1004DC00AA243091B4003093B30025C031E030939E\r
+:1004EC00BA003091B3001FC030E13093B90060689E\r
+:1004FC003091BB00332331F03A953093BB003091EF\r
+:10050C00B60011C03091B600772069F47091B70035\r
+:10051C003093B700372F313021F03395393008F054\r
+:10052C0032E03093B6003CB960616F7947CF30EF61\r
+:10053C00232E33E039B9392D67FF04C030E1361969\r
+:10054C00371930683CB9132E579A3CB1606236CFDC\r
+:10055C00FFB6D6983FB162FD8EC060FD5EC061FDF6\r
+:10056C0057C03A3090F1303899F0313899F0313930\r
+:10057C00A1F0323991F0333981F0353A99F03A3AA9\r
+:10058C00E1F0353CD9F030E03DB944244260A3C0E1\r
+:10059C0097989FC04160979A9CC030593093CB007C\r
+:1005AC00416097C03FEF3093BC0030E03DB9949868\r
+:1005BC003FEF70E07BBD3ABD8CC02BCD38EE309355\r
+:1005CC00BD0033E03093BE0084C0332379F46860FF\r
+:1005DC00662049F47720C1F0672C77243090B60060\r
+:1005EC003092B50012C03090B5000FC0677F332E2B\r
+:1005FC00AA2021F03091B400331531F431E030935E\r
+:10060C00BA003092B40001C033243FB8626061C0BC\r
+:10061C006D7F332009F061605CC0332E6E7F332018\r
+:10062C0063FF05C05AF5362D30681FC051C0F2F378\r
+:10063C00EF93FF93EEEBF091B400EF0FFF273081B7\r
+:10064C00E091B300F091B400EF1731F0E0E4E91958\r
+:10065C003E1730F03E2F04C0303408F030E4391926\r
+:10066C003A19FF91EF910AF43FE7331508F4332E52\r
+:10067C003FB964602EC033208AF43A944AF5616025\r
+:10068C00EF93FF93E52DED55FF2730813FB9FF9197\r
+:10069C00EF916A9453943FE053221BC060FF14C047\r
+:1006AC00EF93FF93E92DEA0DE80DEF73ED59FF275A\r
+:1006BC003083E091B300F091B400EF1711F49394F0\r
+:1006CC0001C0A394FF91EF913A9412F0616001C0C4\r
+:1006DC006B7F30EF432EFFBE1895FFB6A89534B153\r
+:1006EC00532F35B1379557953795579544FD12C013\r
+:1006FC0040613091BC00332331F530E070E05C5147\r
+:10070C0000F130E670E05038E0F45695352F5695F0\r
+:10071C00350F17C04F7E5093CA00583A30E074E042\r
+:10072C0058F43091C8007091C9003150704021F4D8\r
+:10073C0030E03DB9442448603093C8007093C90040\r
+:10074C0002C07BBD3ABD34E044FF35E037B93EED25\r
+:10075C0036B9FFBE18951B44301B47301B50311B5C\r
+:10076C0045301B4B1B301B2F301B5300001B4E0006\r
+:10077C00801B45311B44301B47301B50311B45300F\r
+:10078C001B4B1B301B2F301B5300001B4EF0401B10\r
+:10079C0045311B53100D48595445434820313030D6\r
+:1007AC0030001B53100D57504F33302056351B5310\r
+:1007BC00100D42414420434F4D4D414E44001B53BC\r
+:1007CC00100D42415454455259204C4F57001B4D6B\r
+:1007DC0030001B53100D48595445434820313530D7\r
+:1007EC0030001B53100D535441434B204F56455270\r
+:0407FC00464C4F57C1\r
+:042000000041BFAC30\r
+:00000001FF\r
diff --git a/src/avr/WPOV0.HEX b/src/avr/WPOV0.HEX
new file mode 100644 (file)
index 0000000..ef6e47f
--- /dev/null
@@ -0,0 +1,135 @@
+:020000020000FC\r
+:020000000BC033\r
+:06000C00DBC1A2C26DC1C0\r
+:1000160063C30FED0DBF00E808B9A8950FE001BD59\r
+:100026000AE50093CD0000E00DB90AB9C59ABC9A5D\r
+:100036008D9A8E9AAC9A929A939AC19AB99AC098C6\r
+:10004600B89897988F9A94988C9AAA98A29A919809\r
+:10005600899A07E00CD106E00AD105E008D104E050\r
+:1000660006D101E004D100E002D10FE809B908E1A8\r
+:100076000AB929D10AEA0CB90CB928D1949A0027F1\r
+:10008600E0E6FF27019301930193EFEB01930193C0\r
+:100096000193019301930193019301930093BC0093\r
+:1000A6000093CB000093BD000093BE0000E40083E4\r
+:1000B60000E00093C80004E00093C90000E100934B\r
+:1000C600CA0044276627112488249924AA24552483\r
+:1000D6006624772402E00093B70001E00093B300A2\r
+:1000E6000093B4000093B5000093B6000093B800E7\r
+:1000F6000093B9000093CC0000E00093BA0000938F\r
+:10010600BB0007EE202E07EE402E02E003BF02E002\r
+:1001160009BF0EB10FB108EE0DB900E00DBD0CBD63\r
+:100126000BBD0ABD01EC0FBD01E00EBD05E007B930\r
+:100136000EED06B9789402E01EE1EEE8F7E0A8D0ED\r
+:100146000091CD000A3509F066C041FD6FC043FD40\r
+:100156007AC040FFF5CF0091CC00033041F0023069\r
+:1001660091F002E01FE0EAECF7E092D006C002E070\r
+:100176001FE0EAE0F8E08CD000C003E01EE1ECEA04\r
+:10018600F7E086D00FC002E01CE0EAEDF7E080D091\r
+:1001960003E01EE1EEE8F7E07BD003E01CE0EAEDC9\r
+:1001A600F7E076D01CD00B3109F0FCCF18D0043420\r
+:1001B60009F0F8CF14D0037039F0013039F002306D\r
+:1001C60039F0033039F0EECF969A05C0969803C001\r
+:1001D600959A01C0959810E3100FE4CF789400919A\r
+:1001E600CD000A35C1F441FD21C043FD2CC0F89471\r
+:1001F6009920A1F30091B300093081F7EF93FF93A3\r
+:10020600E82DED59FF2700819A948394EFE38E221F\r
+:10021600FF91EF91189502E01EE1EEE8F7E038D085\r
+:1002260002E01FE0EAE1F8E033D00AC002E01EE196\r
+:10023600EEE8F7E02DD002E01FE0E6EEF7E028D08A\r
+:1002460043FD01C0FDCF02E01EE1EEE8F7E020D05D\r
+:1002560002E01FE0E6EFF7E01BD00AEF37D00A9581\r
+:10026600E9F702E013E0E6E0F8E012D0F6CFAA984C\r
+:1002760002FF919802FD919A29D001FF919801FD04\r
+:10028600919A27D000FF919800FD919AAA9A23C0CF\r
+:1002960078940000F894AA20D9F70093B400C89582\r
+:1002A600002D04D031961A95D1F71895EF93FF9348\r
+:1002B600E92DEA0DE80DEF73ED59FF270083FF9155\r
+:1002C600EF91A3940895ECEDFFE007C0E2E2F1E0C0\r
+:1002D60004C0EDE101C0E3E0F0E020E02A95F1F78B\r
+:1002E6003197E1F70895FFB666FD22C03CB131258E\r
+:1002F600F2F0312552F0EF93FF93EEEBF091B3005D\r
+:10030600EF0FFF273083FF91EF91131608F0132E9E\r
+:100316006F7E6064312D3F7741F011202AF15798A6\r
+:100326006F7D3FEF232E606148C033EF42C040C06F\r
+:100336003091B600313019F031E03093BB003CB15A\r
+:10034600EF93FF93E62DE70DE50DEF70ED55FF27D3\r
+:100356003083E091B500F091B600EF1711F4639485\r
+:1003660001C07394FF91EF913EEF232E1A941AF574\r
+:1003760037EE232E606121C0EF93FF93EEEBF091F1\r
+:10038600B300EF0FFF2730813A953083E82DED5902\r
+:10039600FF273081FF91EF913CB93695330B3A95A3\r
+:1003A600232E9A9483943FE383221A9431F403C054\r
+:1003B60037EE232E6F7E57986F79FFBE1895FFB6DE\r
+:1003C6003091BD007091BE00732B49F031503093CF\r
+:1003D600BD003091BE0030403093BE0091F0442005\r
+:1003E60051F0439441F430E03DB93EB13FB138EEAF\r
+:1003F6003DB9B89A687F222011F02394B9F0FFBE68\r
+:10040600189507CE67FD18C0890C3FE3832299240F\r
+:100416009092BA00EF93FF93EEEBF091B300EF0FDB\r
+:10042600FF2730E43083FF91EF9106C065FDEACFE8\r
+:1004360066FDA2CF64FD7AC033EF232E3091BC0057\r
+:10044600332359F03A953093BC0031F0AA9891982D\r
+:10045600899A30E03AB9B1CFDCCD57983FE839B93F\r
+:100466003091BA0039293A2939F43091B8003A95D1\r
+:1004760049F03093B80037C03091B9003A9591F001\r
+:100486003093B90030E13093B80099203091B30031\r
+:1004960041F4AA2041F09A2CAA243091B40030935A\r
+:1004A600B300393001F16F779920B9F4AA2059F4D5\r
+:1004B6003091BA003A9542F43091B3003395393011\r
+:1004C60048F031E007C031E03093BA009A2CAA24F4\r
+:1004D6003091B4003093B30025C031E03093BA00B8\r
+:1004E6003091B3001FC030E13093B900606830919D\r
+:1004F600BB00332331F03A953093BB003091B60000\r
+:1005060011C03091B600772069F47091B70030932E\r
+:10051600B700372F313021F03395393008F032E00B\r
+:100526003093B6003CB960616F7947CF37EE232E22\r
+:1005360035E039B9392D67FF04C030E1361937196E\r
+:1005460030683CB9132E579A3CB1606236CFFFB67D\r
+:10055600B8983FB162FD8EC060FD5EC061FD57C0B8\r
+:100566003A3090F1303899F0313899F03139A1F0BC\r
+:10057600323991F0333981F0353A99F03A3AE1F06F\r
+:10058600353CD9F030E03DB944244260A3C0979889\r
+:100596009FC04160979A9CC030593093CC0041600F\r
+:1005A60097C03FEF3093BC0030E03DB994983FEFE1\r
+:1005B60070E07BBD3ABD8CC02CCD38EE3093BD00CB\r
+:1005C60033E03093BE0084C0332379F4686066203C\r
+:1005D60049F47720C1F0672C77243090B60030922A\r
+:1005E600B50012C03090B5000FC0677F332EAA2029\r
+:1005F60021F03091B400331531F431E03093BA0074\r
+:100606003092B40001C033243FB8626061C06D7F90\r
+:10061600332009F061605CC0332E6E7F332063FFA8\r
+:1006260005C05AF5362D30681FC051C0F2F3EF935E\r
+:10063600FF93EEEBF091B400EF0FFF273081E091CE\r
+:10064600B300F091B400EF1731F0E0E4E9193E177A\r
+:1006560030F03E2F04C0303408F030E439193A192E\r
+:10066600FF91EF910AF43FE7331508F4332E3FB9B3\r
+:1006760064602EC033208AF43A944AF56160EF93A1\r
+:10068600FF93E52DED55FF2730813FB9FF91EF919F\r
+:100696006A9453943FE053221BC060FF14C0EF934B\r
+:1006A600FF93E92DEA0DE80DEF73ED59FF2730832F\r
+:1006B600E091B300F091B400EF1711F4939401C0E8\r
+:1006C600A394FF91EF913A9412F0616001C06B7FA1\r
+:1006D60037EE432EFFBE1895FFB6A89534B1532FBB\r
+:1006E60035B1379557953795579544FD12C04061FA\r
+:1006F6003091BC003323C9F430E070E05C51C0F1A6\r
+:1007060030E670E05038A0F55695352F5695350FE2\r
+:100716002FC04F7E45FD0DC0583F40F03091CA00B6\r
+:100726003A953093CA0031F5406224C030E13093E7\r
+:10073600CA005093CB00593330E074E058F0309142\r
+:10074600C8007091C9003150704021F430E03DB9C5\r
+:10075600442448603093C8007093C900563450F062\r
+:100766003FEF3093BC0030E03DB994983FEF70E026\r
+:100776007BBD3ABD35E445FF34E044FF35E037B98B\r
+:100786003EED36B9FFBE18951B44301B47301B5053\r
+:10079600311B45301B4B1B301B2F301B5300001BDE\r
+:1007A6004E00801B45311B44301B47301B50311B0C\r
+:1007B60045301B4B1B301B2F301B5300001B4EF0CC\r
+:1007C600401B45311B53100D4859544543482031B1\r
+:1007D600303030001B53100D57504F3330205635F4\r
+:1007E6001B53100D42414420434F4D4D414E440092\r
+:1007F6001B53100D42415454455259204C4F57003B\r
+:100806001B4D30001B53100D4859544543482031A9\r
+:10081600353030001B53100D535441434B204F5677\r
+:060826004552464C4F57FD\r
+:042000000041B4AC3B\r
+:00000001FF\r
diff --git a/src/avr/WPOV1.HEX b/src/avr/WPOV1.HEX
new file mode 100644 (file)
index 0000000..52ed13d
--- /dev/null
@@ -0,0 +1,135 @@
+:020000020000FC\r
+:020000000BC033\r
+:06000C00DBC1A2C26DC1C0\r
+:1000160063C30FED0DBF00E808B9A8950FE001BD59\r
+:100026000AE50093CD0000E00DB90AB9C59ABC9A5D\r
+:100036008D9A8E9AAC9A929A939AC19AB99AC098C6\r
+:10004600B89897988F9A94988C9AAA98A29A919809\r
+:10005600899A07E00CD106E00AD105E008D104E050\r
+:1000660006D101E004D100E002D10FE809B908E1A8\r
+:100076000AB929D10AEA0CB90CB928D1949A0027F1\r
+:10008600E0E6FF27019301930193EFEB01930193C0\r
+:100096000193019301930193019301930093BC0093\r
+:1000A6000093CB000093BD000093BE0000E40083E4\r
+:1000B60000E00093C80004E00093C90000E100934B\r
+:1000C600CA0044276627112488249924AA24552483\r
+:1000D6006624772402E00093B70001E00093B300A2\r
+:1000E6000093B4000093B5000093B6000093B800E7\r
+:1000F6000093B9000093CC0000E00093BA0000938F\r
+:10010600BB0007EE202E07EE402E02E003BF02E002\r
+:1001160009BF0EB10FB108EE0DB900E00DBD0CBD63\r
+:100126000BBD0ABD01EC0FBD01E00EBD05E007B930\r
+:100136000EED06B9789402E01EE1EEE8F7E0A8D0ED\r
+:100146000091CD000A3509F066C041FD6FC043FD40\r
+:100156007AC040FFF5CF0091CC00033041F0023069\r
+:1001660091F002E01FE0EAECF7E092D006C002E070\r
+:100176001FE0EAE0F8E08CD000C003E01EE1ECEA04\r
+:10018600F7E086D00FC002E01CE0EAEDF7E080D091\r
+:1001960003E01EE1EEE8F7E07BD003E01CE0EAEDC9\r
+:1001A600F7E076D01CD00B3109F0FCCF18D0043420\r
+:1001B60009F0F8CF14D0037039F0013039F002306D\r
+:1001C60039F0033039F0EECF969A05C0969803C001\r
+:1001D600959A01C0959810E3100FE4CF789400919A\r
+:1001E600CD000A35C1F441FD21C043FD2CC0F89471\r
+:1001F6009920A1F30091B300093081F7EF93FF93A3\r
+:10020600E82DED59FF2700819A948394EFE38E221F\r
+:10021600FF91EF91189502E01EE1EEE8F7E038D085\r
+:1002260002E01FE0EAE1F8E033D00AC002E01EE196\r
+:10023600EEE8F7E02DD002E01FE0E6EEF7E028D08A\r
+:1002460043FD01C0FDCF02E01EE1EEE8F7E020D05D\r
+:1002560002E01FE0E6EFF7E01BD00AEF37D00A9581\r
+:10026600E9F702E013E0E6E0F8E012D0F6CFAA984C\r
+:1002760002FF919802FD919A29D001FF919801FD04\r
+:10028600919A27D000FF919800FD919AAA9A23C0CF\r
+:1002960078940000F894AA20D9F70093B400C89582\r
+:1002A600002D04D031961A95D1F71895EF93FF9348\r
+:1002B600E92DEA0DE80DEF73ED59FF270083FF9155\r
+:1002C600EF91A3940895ECEDFFE007C0E2E2F1E0C0\r
+:1002D60004C0EDE101C0E3E0F0E020E02A95F1F78B\r
+:1002E6003197E1F70895FFB666FD22C03CB131258E\r
+:1002F600F2F0312552F0EF93FF93EEEBF091B3005D\r
+:10030600EF0FFF273083FF91EF91131608F0132E9E\r
+:100316006F7E6064312D3F7741F011202AF15798A6\r
+:100326006F7D3FEF232E606148C033EF42C040C06F\r
+:100336003091B600313019F031E03093BB003CB15A\r
+:10034600EF93FF93E62DE70DE50DEF70ED55FF27D3\r
+:100356003083E091B500F091B600EF1711F4639485\r
+:1003660001C07394FF91EF913EEF232E1A941AF574\r
+:1003760037EE232E606121C0EF93FF93EEEBF091F1\r
+:10038600B300EF0FFF2730813A953083E82DED5902\r
+:10039600FF273081FF91EF913CB93695330B3A95A3\r
+:1003A600232E9A9483943FE383221A9431F403C054\r
+:1003B60037EE232E6F7E57986F79FFBE1895FFB6DE\r
+:1003C6003091BD007091BE00732B49F031503093CF\r
+:1003D600BD003091BE0030403093BE0091F0442005\r
+:1003E60051F0439441F430E03DB93EB13FB138EEAF\r
+:1003F6003DB9B89A687F222011F02394B9F0FFBE68\r
+:10040600189507CE67FD18C0890C3FE3832299240F\r
+:100416009092BA00EF93FF93EEEBF091B300EF0FDB\r
+:10042600FF2730E43083FF91EF9106C065FDEACFE8\r
+:1004360066FDA2CF64FD7AC033EF232E3091BC0057\r
+:10044600332359F03A953093BC0031F0AA9891982D\r
+:10045600899A30E03AB9B1CFDCCD57983FE839B93F\r
+:100466003091BA0039293A2939F43091B8003A95D1\r
+:1004760049F03093B80037C03091B9003A9591F001\r
+:100486003093B90030E13093B80099203091B30031\r
+:1004960041F4AA2041F09A2CAA243091B40030935A\r
+:1004A600B300393001F16F779920B9F4AA2059F4D5\r
+:1004B6003091BA003A9542F43091B3003395393011\r
+:1004C60048F031E007C031E03093BA009A2CAA24F4\r
+:1004D6003091B4003093B30025C031E03093BA00B8\r
+:1004E6003091B3001FC030E13093B900606830919D\r
+:1004F600BB00332331F03A953093BB003091B60000\r
+:1005060011C03091B600772069F47091B70030932E\r
+:10051600B700372F313021F03395393008F032E00B\r
+:100526003093B6003CB960616F7947CF37EE232E22\r
+:1005360035E039B9392D67FF04C030E1361937196E\r
+:1005460030683CB9132E579A3CB1606236CFFFB67D\r
+:10055600B8983FB162FD8EC060FD5EC061FD57C0B8\r
+:100566003A3090F1303899F0313899F03139A1F0BC\r
+:10057600323991F0333981F0353A99F03A3AE1F06F\r
+:10058600353CD9F030E03DB944244260A3C0979889\r
+:100596009FC04160979A9CC030593093CC0041600F\r
+:1005A60097C03FEF3093BC0030E03DB994983FEFE1\r
+:1005B60070E07BBD3ABD8CC02CCD38EE3093BD00CB\r
+:1005C60033E03093BE0084C0332379F4686066203C\r
+:1005D60049F47720C1F0672C77243090B60030922A\r
+:1005E600B50012C03090B5000FC0677F332EAA2029\r
+:1005F60021F03091B400331531F431E03093BA0074\r
+:100606003092B40001C033243FB8626061C06D7F90\r
+:10061600332009F061605CC0332E6E7F332063FFA8\r
+:1006260005C05AF5362D30681FC051C0F2F3EF935E\r
+:10063600FF93EEEBF091B400EF0FFF273081E091CE\r
+:10064600B300F091B400EF1731F0E0E4E9193E177A\r
+:1006560030F03E2F04C0303408F030E439193A192E\r
+:10066600FF91EF910AF43FE7331508F4332E3FB9B3\r
+:1006760064602EC033208AF43A944AF56160EF93A1\r
+:10068600FF93E52DED55FF2730813FB9FF91EF919F\r
+:100696006A9453943FE053221BC060FF14C0EF934B\r
+:1006A600FF93E92DEA0DE80DEF73ED59FF2730832F\r
+:1006B600E091B300F091B400EF1711F4939401C0E8\r
+:1006C600A394FF91EF913A9412F0616001C06B7FA1\r
+:1006D60037EE432EFFBE1895FFB6A89534B1532FBB\r
+:1006E60035B1379557953795579544FD12C04061FA\r
+:1006F6003091BC003323C9F430E070E05C51C0F1A6\r
+:1007060030E670E05038A0F55695352F5695350FE2\r
+:100716002FC04F7E45FD0DC0583F40F03091CA00B6\r
+:100726003A953093CA0031F5406224C030E13093E7\r
+:10073600CA005093CB00593330E074E058F0309142\r
+:10074600C8007091C9003150704021F430E03DB9C5\r
+:10075600442448603093C8007093C900563450F062\r
+:100766003FEF3093BC0030E03DB994983FEF70E026\r
+:100776007BBD3ABD35E445FF34E044FF35E037B98B\r
+:100786003EED36B9FFBE18951B44301B47301B5053\r
+:10079600311B45301B4B1B301B2F301B5300001BDE\r
+:1007A6004E00801B45311B44301B47301B50311B0C\r
+:1007B60045301B4B1B301B2F301B5300001B4EF0CC\r
+:1007C600401B45311B53100D4859544543482031B1\r
+:1007D600303030001B53100D57504F3330205635F4\r
+:1007E6001B53100D42414420434F4D4D414E440092\r
+:1007F6001B53100D42415454455259204C4F57003B\r
+:100806001B4D30001B53100D4859544543482031A9\r
+:10081600353030001B53100D535441434B204F5677\r
+:060826004552464C4F57FD\r
+:042000000041BCAC33\r
+:00000001FF\r
diff --git a/src/avr/WPOV2.HEX b/src/avr/WPOV2.HEX
new file mode 100644 (file)
index 0000000..3a2161e
--- /dev/null
@@ -0,0 +1,131 @@
+:020000020000FC\r
+:020000000BC033\r
+:06000C00D8C19FC26CC1C7\r
+:1000160060C30FED0DBF00E808B9A8950FE001BD5C\r
+:100026000AE50093CC0000E00DB90AB9C59ABC9A5E\r
+:100036008D9A8E9A929A939AC19AB99AC098B898BC\r
+:1000460097988F9A94988C9AAA98A29A9198899A36\r
+:1000560007E00DD106E00BD105E009D104E007D198\r
+:1000660001E005D100E003D10FE509B908E10AB9BD\r
+:100076002AD10AEA0CB90CB929D1949A27D19498B5\r
+:1000860025D1949A0027E0E6FF2701930193019377\r
+:10009600EFEB019301930193019301930193019374\r
+:1000A60001930093BC000093CA000093BD00009327\r
+:1000B600BE0000E4008300E00093C80004E0009363\r
+:1000C600C90044276627112488249924AA24552484\r
+:1000D6006624772402E00093B70001E00093B300A2\r
+:1000E6000093B4000093B5000093B6000093B800E7\r
+:1000F6000093B9000093CB0000E00093BA00009390\r
+:10010600BB0000EF202E00EF402E02E003BF02E00E\r
+:1001160009BF0EB10FB108EE0DB900E00DBD0CBD63\r
+:100126000BBD0ABD01EC0FBD01E00EBD05E007B930\r
+:100136000EED06B9789402E01EE1E4E5F7E0A8D0FA\r
+:100146000091CC000A3509F066C041FD6FC043FD41\r
+:100156007AC040FFF5CF0091CB00033041F002306A\r
+:1001660091F002E01FE0E0E9F7E092D006C002E07D\r
+:100176001FE0E0EDF7E08CD000C003E01EE1E2E70F\r
+:10018600F7E086D00FC002E01CE0E0EAF7E080D09E\r
+:1001960003E01EE1E4E5F7E07BD003E01CE0E0EAE3\r
+:1001A600F7E076D01CD00B3109F0FCCF18D0043420\r
+:1001B60009F0F8CF14D0037039F0013039F002306D\r
+:1001C60039F0033039F0EECF969A05C0969803C001\r
+:1001D600959A01C0959810E3100FE4CF789400919A\r
+:1001E600CC000A35C1F441FD21C043FD2CC0F89472\r
+:1001F6009920A1F30091B300093081F7EF93FF93A3\r
+:10020600E82DED59FF2700819A948394EFE38E221F\r
+:10021600FF91EF91189502E01EE1E4E5F7E038D092\r
+:1002260002E01FE0E0EEF7E033D00AC002E01EE194\r
+:10023600E4E5F7E02DD002E01FE0ECEAF7E028D095\r
+:1002460043FD01C0FDCF02E01EE1E4E5F7E020D06A\r
+:1002560002E01FE0ECEBF7E01BD00AEF37D00A957F\r
+:10026600E9F702E013E0ECECF7E012D0F6CFAA983B\r
+:1002760002FF919802FD919A29D001FF919801FD04\r
+:10028600919A26D000FF919800FD919AAA9A22C0D1\r
+:1002960078940000F894AA20D9F70093B400C89582\r
+:1002A600002D04D031961A95D1F71895EF93FF9348\r
+:1002B600E92DEA0DE80DEF73ED59FF270083FF9155\r
+:1002C600EF91A3940895E0EFFAE006C0E8EC03C0CE\r
+:1002D600E4E101C0E2E0F0E020E02A95F1F7319791\r
+:1002E600E1F70895FFB666FD22C03CB13125F2F074\r
+:1002F600312552F0EF93FF93EEEBF091B300EF0F41\r
+:10030600FF273083FF91EF91131608F0132E6F7EAF\r
+:100316006064312D3F7741F011202AF157986F7DA7\r
+:100326003FEF232E606146C038EF40C03EC030919B\r
+:10033600B600313019F031E03093BB003CB1EF9399\r
+:10034600FF93E62DE70DE50DEF70ED55FF273083A2\r
+:10035600E091B500F091B600EF1711F4639401C077\r
+:100366007394FF91EF913FEF232E1A940AF530EF25\r
+:10037600232E60611FC0EF93FF93EEEBF091B30065\r
+:10038600EF0FFF2730813A953083E82DED59FF278F\r
+:100396003081FF91EF913CB93FEF232E9A948394DD\r
+:1003A6003FE383221A9431F403C030EF232E6F7E8D\r
+:1003B60057986F79FFBE1895FFB63091BD007091C2\r
+:1003C600BE00732B49F031503093BD003091BE0012\r
+:1003D60030403093BE0091F0442051F0439441F4F4\r
+:1003E60030E03DB93EB13FB138EE3DB9B89A687FCD\r
+:1003F600222011F02394B9F0FFBE18950ACE67FDAE\r
+:1004060018C0890C3FE3832299249092BA00EF9397\r
+:10041600FF93EEEBF091B300EF0FFF2730E430834C\r
+:10042600FF91EF9106C065FDEACF66FDA4CF64FD9E\r
+:100436007AC038EF232E3091BC00332359F03A9519\r
+:100446003093BC0031F0AA989198899A30E03AB975\r
+:10045600B1CFDFCD57983FE539B93091BA00392988\r
+:100466003A2939F43091B8003A9549F03093B800FA\r
+:1004760037C03091B9003A9591F03093B90030E128\r
+:100486003093B80099203091B30041F4AA2041F08E\r
+:100496009A2CAA243091B4003093B300393001F17C\r
+:1004A6006F779920B9F4AA2059F43091BA003A9599\r
+:1004B60042F43091B3003395393048F031E007C04B\r
+:1004C60031E03093BA009A2CAA243091B4003093CC\r
+:1004D600B30025C031E03093BA003091B3001FC09D\r
+:1004E60030E13093B90060683091BB00332331F0BE\r
+:1004F6003A953093BB003091B60011C03091B600EA\r
+:10050600772069F47091B7003093B700372F3130F8\r
+:1005160021F03395393008F032E03093B6003CB91B\r
+:1005260060616F7947CF30EF232E33E039B9392D2B\r
+:1005360067FF04C030E13619371930683CB9132E0D\r
+:10054600579A3CB1606236CFFFB6B8983FB162FDAC\r
+:100556008EC060FD5EC061FD57C03A3090F1303804\r
+:1005660099F0313899F03139A1F0323991F03339B7\r
+:1005760081F0353A99F03A3AE1F0353CD9F030E07D\r
+:100586003DB944244260A3C097989FC04160979AA2\r
+:100596009CC030593093CB00416097C03FEF3093F9\r
+:1005A600BC0030E03DB994983FEF70E07BBD3ABDAA\r
+:1005B6008CC02FCD38EE3093BD0033E03093BE00B3\r
+:1005C60084C0332379F46860662049F47720C1F04B\r
+:1005D600672C77243090B6003092B50012C0309068\r
+:1005E600B5000FC0677F332EAA2021F03091B400EA\r
+:1005F600331531F431E03093BA003092B40001C0C3\r
+:1006060033243FB8626061C06D7F332009F06160BA\r
+:100616005CC0332E6E7F332063FF05C05AF5362D3E\r
+:1006260030681FC051C0F2F3EF93FF93EEEBF091E9\r
+:10063600B400EF0FFF273081E091B300F091B400D2\r
+:10064600EF1731F0E0E4E9193E1730F03E2F04C011\r
+:10065600303408F030E439193A19FF91EF910AF471\r
+:100666003FE7331508F4332E3FB964602EC03320BC\r
+:100676008AF43A944AF56160EF93FF93E52DED55C0\r
+:10068600FF2730813FB9FF91EF916A9453943FE081\r
+:1006960053221BC060FF14C0EF93FF93E92DEA0DB0\r
+:1006A600E80DEF73ED59FF273083E091B300F09129\r
+:1006B600B400EF1711F4939401C0A394FF91EF9146\r
+:1006C6003A9412F0616001C06B7F30EF432EFFBE9B\r
+:1006D6001895FFB6A89534B1532F35B13795579570\r
+:1006E6003795579544FD12C040613091BC003323C5\r
+:1006F60031F530E070E05C5100F130E670E05038E2\r
+:10070600E0F45695352F5695350F17C04F7E50930A\r
+:10071600CA00583A30E074E058F43091C80070913D\r
+:10072600C9003150704021F430E03DB9442448609E\r
+:100736003093C8007093C90002C07BBD3ABD34E057\r
+:1007460044FF35E037B93EED36B9FFBE18951B4478\r
+:10075600301B47301B50311B45301B4B1B301B2FAA\r
+:10076600301B5300001B4E00801B45311B44301BC1\r
+:1007760047301B50311B45301B4B1B301B2F301B8A\r
+:100786005300001B4EF0401B45311B53100D4859BA\r
+:10079600544543482031303030001B53100D57501C\r
+:1007A6004F33302056351B53100D42414420434FE2\r
+:1007B6004D4D414E44001B53100D42415454455279\r
+:1007C60059204C4F57001B4D30001B53100D4859F4\r
+:1007D600544543482031353030001B53100D5354D7\r
+:0C07E60041434B204F564552464C4F57A4\r
+:042000000041BCAC33\r
+:00000001FF\r
diff --git a/src/avr/WPOV3.ASM b/src/avr/WPOV3.ASM
new file mode 100644 (file)
index 0000000..0db9f33
--- /dev/null
@@ -0,0 +1,2502 @@
+;      WPOV2.ASM\r
+;      COPIED FROM WPO15V1.ASM ON 20JUN02\r
+\r
+;      LOOK FOR BIGBODGE TO SEE CEC'S CHANGES TO FIX STARTUP PROBLEM\r
+;      AND TO SKIP VOLTAGE MEASURING\r
+\r
+;      REVISED 17DEC01 TO SUPPORT NEW HARDWARE TYPE 3 FOR HYT1500\r
+\r
+;      REVISED 18DEC01 TO TRY A CONSERVATIVE 4.5 VOLT SHUTDOWN, LOW BATTERY\r
+;      THIS DOESN'T PROTECT AGAINST REBOOTING WHILE PRINTING, TOO BAD\r
+\r
+;      REVISED 18DEC01 TO TRY AN AGGRESSIVE 5.5 VOLT SHUTDOWN, LOW BATTERY\r
+;      ALSO ENABLED THE 4.5 VOLT IMMEDIATE RESET, DUE TO UNRELIABLE OPERATION\r
+;      NOW TRYING 5.0 VOLT IMMEDIATE RESET, CEC SAYS IT WAS MARGINAL ANYWAY\r
+\r
+;      NOW DISABLED THE IMMEDIATE RESET DUE TO TESTING RESULTS OF 08JAN02\r
+;      NOT SURE IF THAT WAS REALLY THE PROBLEM - BUT WISH TO BE CONSERVATIVE\r
+\r
+;      REVISED 01FEB02 FOR NEW 7.3728 MHZ XTAL, PREVIOUSLY 11.0592 MHZ, 2/3\r
+;      LOOK FOR ;! TO SEE CHANGES FOR 7.3728 MHZ XTAL, ADDED COMMENTS ALSO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   LARGE           =0\r
+\r
+;IF LARGE\r
+;.INCLUDE "8535DEF.INC"\r
+;ELSE\r
+.INCLUDE "4433DEF.INC"\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMING CALCULATIONS:\r
+\r
+; 115200 BITS/SEC = 11520 BYTES/SEC = 86.8 US/BYTE\r
+; 460800 BITS/SEC = 46080 BYTES/SEC = 21.7 US/BYTE\r
+\r
+; FOR MASTER API BUS TX, SEND 1 BYTE PER 9+12 BIT-TIMES, 24 TO BE SAFE\r
+; SO THE CORRECT TX RATE = 86.8 * 2.4 = 208.3 US/BYTE =  4800 BYTES/SEC\r
+; SO THE CORRECT TX RATE = 21.7 * 2.4 =  52.1 US/BYTE = 19200 BYTES/SEC\r
+\r
+; A SUBTLE OPTIMISATION IS POSSIBLE WHEN THE PREVIOUS TRANSMITTED LSB IS 0,\r
+; AS WE CAN THEN GUARANTEE THE 4800 BPS RECEIVERS WILL SEE FALSE START BIT:\r
+\r
+; FOR MASTER API BUS TX EVEN, SEND 1 BYTE PER 2+12 BIT-TIMES, 16 TO BE SAFE\r
+; SO THE CORRECT TX RATE EVEN = 86.8 * 1.6 = 138.9 US/BYTE =  7200 BYTES/SEC\r
+; SO THE CORRECT TX RATE EVEN = 21.7 * 1.6 =  34.7 US/BYTE = 28800 BYTES/SEC\r
+\r
+; OLD: TCK0 ROLLOVER = 256 * 8 /  7.3728 MHZ = APPROX 278   US\r
+; NEW: TCK0 ROLLOVER = 256     /  7.3728 MHZ = APPROX  34.7 US\r
+; THUS ALL THE TIMEOUT VALUES BELOW HAVE BEEN INCREASED TO 2* ORIGINAL\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+; note: these are in 34.7us units:\r
+.EQU   API_TIMEOUT     =6 ; 5 doesn't work\r
+.EQU   API_TIMEOUT_TS  =16 ;8 ; 7 doesn't work\r
+.EQU   API_TIME_IDLE   =4 ; 3 doesn't work\r
+.EQU   API_TIME_SLOW   =18 ; 16 doesn't work (16 is theoretically correct)\r
+.EQU   API_TIME_FIRST  =1 ; should always be 1 to synchronise with timer\r
+;.EQU  API_TIME_FAST   =2 ; not used if doing the tx even/odd optimisation\r
+.EQU   API_TIME_FAST_TS=16 ;4 ; overrides the tx optimisation for touchscreen\r
+\r
+.EQU   API_RATE_SLOW   =$17 ;$5F       ; DIVISOR FOR 19200 BPS\r
+.EQU   API_RATE_FAST   =$00 ;$03       ; DIVISOR FOR 460800 BPS\r
+\r
+; note: this is in 278us units:\r
+.EQU   SPI_TIMEOUT     =1 ; 24mar03 16 ; 12 doesn't work\r
+\r
+;.def  drem16uL        =R0             ; remainder low\r
+;.def  drem16uH        =R1             ; remainder high\r
+;.def  dres16uL        =R2             ; result low    DON'T use as general purpose\r
+;.def  dres16uH        =R3             ; result high   DON'T use as general purpose\r
+;.def  dd16uL          =R2             ; dividend low\r
+;.def  dd16uH          =R3             ; dividend high\r
+;.def  dv16uL          =R4             ; divisor low\r
+;.def  dv16uH          =R5             ; divisor high\r
+;\r
+;.DEF  SPI_REMAIN      =R6\r
+;\r
+;.def  mc16uL          =R7             ;multiplicand low byte\r
+;.def  mc16uH          =R8             ;multiplicand high byte\r
+;.def  mp16uL          =R9             ;multiplier low byte\r
+;.def  mp16uH          =R10            ;multiplier high byte\r
+;.def  m16u0           =R9             ;result byte 0 (LSB)\r
+;.def  m16u1           =R10            ;result byte 1\r
+;.def  m16u2           =R11            ;result byte 2\r
+;.def  m16u3           =R12            ;result byte 3 (MSB)\r
+;\r
+;.DEF  RX_PTR          =R13\r
+;.DEF  RX_COUNT0       =R14\r
+\r
+.DEF   API_REMAIN      =R1\r
+.DEF   API_WATCHDOG    =R2\r
+.DEF   SPI_REMAIN      =R3\r
+.DEF   SPI_WATCHDOG    =R4\r
+.DEF   RX_PTR          =R5\r
+.DEF   RX_COUNT0       =R6\r
+.DEF   RX_COUNT1       =R7\r
+.DEF   TX_PTR          =R8\r
+.DEF   TX_COUNT0       =R9\r
+.DEF   TX_COUNT1       =R10\r
+.DEF   TCK0_DIVIDE_8   =R11\r
+\r
+.DEF   SR              =R15\r
+.DEF    A              =R16            ; GLOBAL REGISTERS\r
+.DEF    B              =R17\r
+.DEF    D              =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R23\r
+.DEF   G               =R24\r
+\r
+.DEF   FLAGS           =R20\r
+;.def  counter         =R20            ;loop counter\r
+\r
+.DEF   ATOD            =R21            ; SO YOU CAN USE SBCI, SUBI, CPI ETC\r
+\r
+.DEF   API_STATE       =R22\r
+\r
+;.DEF  TX_PTR          =R25\r
+;.DEF  API_WATCHDOG    =R26\r
+;.DEF  API_REMAIN      =R27\r
+;.DEF  SPI_WATCHDOG    =R28\r
+;.DEF  TX_COUNT0       =R29\r
+\r
+.EQU   TX_SIZE         =$20 ; 09mar03 $40\r
+.EQU   RX_SIZE         =$20 ; 09mar03 $10\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+VSWTS:         .BYTE   1               ; RETAIN ORDERING %\r
+VCHGS:         .BYTE   1\r
+NEGVS:         .BYTE   1\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+TX_ADDRESS0:   .BYTE   1               ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+TX_ADDRESS1:   .BYTE   1               ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS0:   .BYTE   1               ; SOURCE FOR RX_COUNT0 BYTES AT HEAD\r
+RX_ADDRESS1:   .BYTE   1               ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+; 09mar03 now done by RX_MODULUS and RX_PRIORITY $\r
+;RX_ADDRESS2:  .BYTE   1               ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+;                                      ; SCAN IS 1,2,1,3,1,4,1,5,1,6,1,7,1,8\r
+; $\r
+\r
+TX_OVERRIDE:   .BYTE   1               ; COUNTER TO TRANSMIT 1 TIME IN 16\r
+RX_OVERRIDE:   .BYTE   1               ; COUNTER TO RECEIVE 1 TIME IN 16\r
+\r
+TX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME TX DEVICE\r
+RX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME RX DEVICE\r
+\r
+;ABSENT_COUNT: .BYTE   1\r
+\r
+TURNOFF_COUNT: .BYTE   1\r
+WATCHDOG_COUNT:        .BYTE   2\r
+\r
+TX_LIMIT:      .BYTE   9               ; MAX Z180 BYTES TO ACCEPT, PER DEVICE\r
+; 09mar03 now got individual priorities per device $\r
+RX_MODULUS:    .BYTE   8               ; 09mar03 cumulative value per device\r
+RX_PRIORITY:   .BYTE   8               ; 09mar03 separate increment per device\r
+; $\r
+\r
+BATTERY_COUNT: .BYTE   2               ; COUNT 1024 ADC READINGS TO POWER DOWN\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;LM385_COUNT:  .BYTE   1               ; COUNT $10 ADC READINGS TO MISSING REF\r
+VOLTAGE_VSWT:  .BYTE   1               ; MOST RECENT ADC READING FROM REF\r
+\r
+HARDWARE_TYPE: .BYTE   1               ; COMES SOMEWHAT BEFORE RSEL HI COMMAND\r
+\r
+STACK_GUARD:   .BYTE   1               ; DETECTS IF STACK COMES DOWN TO HERE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; API_STATE DEFINITIONS\r
+.EQU   SPISIZE         =0              ; SET IF EXPECTING SPI DATA SIZE CMD\r
+.EQU   SPIWAIT         =1              ; SET IF SENDING SPI ADDRESS RESPONSE\r
+.EQU   SPIDATA         =2              ; SET IF TRANSFERRING SPI DATA TX/RX\r
+.EQU   SPIDIRN         =3              ; SET IF TX, BASED ON ADDRESS COMMAND\r
+.EQU   APISIZE         =4              ; SET IF NEED TO SEND API DATA SIZE CMD\r
+.EQU   APIWAIT         =5              ; SET IF WAITING FOR API DATA SIZE RESP\r
+.EQU   APIDATA         =6              ; SET IF TRANSFERRING API DATA TX/RX\r
+.EQU   APIDIRN         =7              ; SET IF TX, TOGGLED ON NULL TRANSFER\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IF LARGE\r
+;\r
+;.EQU  IRQ             =6\r
+;.EQU  IRQ_PORT        =PORTA\r
+;.EQU  IRQ_DDR         =DDRA\r
+;\r
+;.EQU  PRG             =3\r
+;.EQU  PRG_PORT        =PORTB\r
+;.EQU  PRG_DDR         =DDRB\r
+;\r
+;.EQU  OC1             =5\r
+;.EQU  OC1_PORT        =PORTD\r
+;.EQU  OC1_DDR         =DDRD\r
+;\r
+;.EQU  OCR1H           =OCR1AH\r
+;.EQU  OCR1L           =OCR1AL\r
+;\r
+;.EQU  COM10           =COM1A0\r
+;.EQU  COM11           =COM1A1\r
+;\r
+;ELSE\r
+\r
+.EQU   IRQ             =0\r
+.EQU   IRQ_PORT        =PORTB\r
+.EQU   IRQ_DDR         =DDRB\r
+\r
+.EQU   PRG             =2\r
+.EQU   PRG_PORT        =PORTC\r
+.EQU   PRG_DDR         =DDRC\r
+\r
+.EQU   OC1             =1\r
+.EQU   OC1_PORT        =PORTB\r
+.EQU   OC1_DDR         =DDRB\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER 0 OVERFLOW HANDLER\r
+\r
+       .ORG    SPIADDR\r
+       RJMP    SPI_COMPLETE            ; SPI TRANSFER COMPLETE HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+\r
+       .ORG    ADCCaddr\r
+       RJMP    ADC_COMPLETE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+;IF LARGE\r
+;      LDI     A,HIGH(RAMEND)\r
+;      OUT     SPH,A\r
+;ENDIF\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE STACK GUARD\r
+       LDI     A,$5A\r
+       STS     STACK_GUARD,A\r
+\r
+       ; INITIALISE PORTS\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       LDI     A,0\r
+       OUT     SPCR,A                  ; DISABLE SPI WHILE RESETTING Z180\r
+       OUT     UCR,A                   ; DISABLE UART WHILE RESETTING SLAVES\r
+\r
+;IF LARGE\r
+;      LDI     A,$FF\r
+;      OUT     DDRC,A                  ; PORTC CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     PORTB,7                 ; PB7/SCK CONFIGURED AS PULLED UP INPUT\r
+;      SBI     DDRB,6                  ; PB6/MISO CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     DDRA,7                  ; A7 CONFIGURED AS OUTPUT FOR DTR1\r
+;      SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+;\r
+;; 18DEC01 NOT PULLED UP, DON'T WANT TO CORRUPT 100K/100K DIVIDER\r
+;;     SBI     PORTA,4                 ; A4 PULLED UP TO DETECT MISSING LM385\r
+;ELSE\r
+       SBI     PORTB,5                 ; PB5/SCK CONFIGURED AS PULLED UP INPUT\r
+       SBI     DDRB,4                  ; PB4/MISO CONFIGURED AS OUTPUT\r
+\r
+       SBI     DDRD,5                  ; D5 CONFIGURED AS OUTPUT FOR DTR1\r
+       SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+\r
+; 20JUN02 NOT PULLED UP, DON'T WANT TO CORRUPT 100K/100K DIVIDER\r
+;      SBI     PORTC,4                 ; C4 PULLED UP TO DETECT MISSING LM385\r
+;ENDIF\r
+\r
+       SBI     PORTD,2                 ; D2 CONFIGURED AS PULL UP FOR IBM CLK\r
+       SBI     PORTD,3                 ; D3 CONFIGURED AS PULL UP FOR IBM DATA\r
+\r
+       SBI     OC1_PORT,OC1\r
+       SBI     OC1_DDR,OC1             ; OUTPUT OC1 = 1, PWM TRANSISTOR OFF\r
+\r
+       CBI     IRQ_PORT,IRQ\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       CBI     PORTD,7\r
+       SBI     DDRD,7                  ; OUTPUT RSEL = 0\r
+\r
+       CBI     PORTD,4\r
+       SBI     DDRD,4                  ; OUTPUT RES = 0\r
+\r
+       ; HARD RESET API BUS DEVICES\r
+       CBI     PRG_PORT,PRG\r
+       SBI     PRG_DDR,PRG             ; OUTPUT PRG = 0\r
+\r
+       CBI     PORTD,1\r
+       SBI     DDRD,1                  ; OUTPUT TXD = 0\r
+\r
+       LDI     A,7\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET SPARE\r
+\r
+       LDI     A,6\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 RECEIPT PRINTER\r
+\r
+       LDI     A,5\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 LABEL PRINTER\r
+\r
+       LDI     A,4\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET MT102 RECEIPT PRINTER\r
+\r
+       ;LDI    A,3\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET SPARE\r
+       ; THE ABOVE SHOULD BE OK - WHY NOT ??  16FEB01\r
+\r
+       ;LDI    A,2\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET TOUCHSCREEN\r
+\r
+       LDI     A,1\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET CUSTOMER DISPLAY\r
+\r
+       LDI     A,0\r
+       RCALL   PRG_RESET               ; REMOVE RESET PULSE\r
+\r
+       ; LOADCELL HAS BEEN IN RESET UNTIL NOW, AND WILL START IN 10 MS\r
+\r
+       ;SBI    PORTD,1                 ; OUTPUT TXD = 1\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BAUD\r
+       OUT     UBRR,A                  ; SET BAUD RATE\r
+       LDI     A,$18\r
+       OUT     UCR,A                   ; ENABLE TX AND RX (OUTPUTS TXD = 1)\r
+\r
+       RCALL   PRG_DELAY_280_MS        ; DELAY FOR TOUCHSCREEN TO REENTER IDLE\r
+\r
+       LDI     A,$AA\r
+       OUT     UDR,A                   ; SEND SLOW TURNON COMMAND\r
+       OUT     UDR,A                   ; AND AGAIN FOR EXTRA SAFETY\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO ALLOW DEVICES TO INITIALISE\r
+\r
+       ; ALLOW Z180 TO START\r
+       SBI     PORTD,4                 ; OUTPUT RES = 1\r
+       ;CBI    DDRD,4                  ; OUTPUT RES = TRI-STATE\r
+\r
+; BIGBODGE FOR ANOTHER RESET PULSE!!!!\r
+RCALL   PRG_DELAY_20_MS\r
+CBI     PORTD,4                 ; RES=0\r
+RCALL   PRG_DELAY_20_MS\r
+SBI     PORTD,4                 ; OUTPUT RES = 1\r
+\r
+       ; INITIALISE VARIABLES\r
+       CLR     A\r
+       LDI     ZL,VSWTS\r
+       CLR     ZH\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       LDI     ZL,TX_LIMIT\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A                    ; CAREFUL - Z WILL BE USED AGAIN BELOW\r
+       STS     TURNOFF_COUNT,A\r
+       STS     VOLTAGE_VSWT,A\r
+\r
+       ;LDI    A,LOW(1000)\r
+       STS     WATCHDOG_COUNT,A\r
+       ;LDI    A,HIGH(1000)            ; 100 MS\r
+       STS     WATCHDOG_COUNT+1,A\r
+\r
+       LDI     A,TX_SIZE\r
+       ST      Z+,A ; 09mar03 Z        ; RX_LIMIT FOR 9TH (INTERNAL) DEVICE\r
+\r
+; 09mar03 initialise RX_MODULUS and RX_PRIORITY $\r
+       clr     a                       ; modulus value doesn't matter!\r
+       st      z+,a                    ; RX_MODULUS, array of 8 values\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       ldi     a,15                    ; priority value can't be zero\r
+       st      z+,a                    ; RX_PRIORITY, array of 8 values\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z+,a\r
+       st      z,a\r
+; $\r
+\r
+       LDI     A,LOW(1024)\r
+       STS     BATTERY_COUNT,A\r
+       LDI     A,HIGH(1024)\r
+       STS     BATTERY_COUNT+1,A\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      LDI     A,$10                   ; START COUNTDOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,A\r
+\r
+       CLR     FLAGS\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT0\r
+       CLR     TX_COUNT1\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT0\r
+       CLR     RX_COUNT1\r
+\r
+;      LDI     A,4\r
+;      STS     ABSENT_COUNT,A          ; TOP UP ABSENT COUNTER FOR TX_ADDRESS\r
+\r
+       ; START COMMUNICATIONS TASK\r
+; 09mar03 now done by RX_MODULUS and RX_PRIORITY $\r
+;      LDI     A,2\r
+;      STS     RX_ADDRESS2,A           ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+; $\r
+\r
+       LDI     A,1\r
+       STS     TX_ADDRESS0,A\r
+       STS     TX_ADDRESS1,A\r
+       STS     RX_ADDRESS0,A\r
+       STS     RX_ADDRESS1,A\r
+       STS     TX_OVERRIDE,A\r
+       STS     RX_OVERRIDE,A\r
+       STS     HARDWARE_TYPE,A         ; AS FOR OLD ALGORITHM WITH FLAGS,2 = 0\r
+\r
+       LDI     A,0\r
+       STS     TX_STICKY,A\r
+       STS     RX_STICKY,A\r
+\r
+       LDI     A,-API_TIME_IDLE ; 10mar03 -API_TIMEOUT\r
+       MOV     API_WATCHDOG,A          ; SET UP TIME TO FIRST API BUS POLL\r
+       LDI     A,-SPI_TIMEOUT\r
+       MOV     SPI_WATCHDOG,A          ; SET UP TIME TO FIRST SPI BUS POLL\r
+\r
+; 10mar03 we now have a faster interrupt and finer control over timing $\r
+       ldi     a,$01                   ; TCK0 = CK\r
+       mov     TCK0_DIVIDE_8,a\r
+; else\r
+;      LDI     A,$02                   ; TCK0 = CK/8\r
+; $\r
+       OUT     TCCR0,A                 ; TCK0 ROLLOVER = 256 * 8 / 7.3728 MHZ\r
+                                       ;               = APPROX 278 US\r
+                                       ;!TCK0 ROLLOVER = 256 * 8 / 11.0592 MHZ\r
+                                       ;!              = APPROX 185 US\r
+;IF LARGE\r
+;      LDI     A,$01\r
+;ELSE\r
+       LDI     A,$02\r
+;ENDIF\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       IN      A,SPSR\r
+       IN      A,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     A,$E8\r
+       OUT     SPCR,A                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       ; START -5V GENERATOR TASK\r
+       LDI     A,0\r
+       OUT     TCNT1H,A\r
+       OUT     TCNT1L,A\r
+       OUT     OCR1H,A\r
+       OUT     OCR1L,A                 ; ASSUME NO LOAD TO BEGIN WITH\r
+\r
+       LDI     A,1<<COM11 | 1<<COM10 | 1<<PWM10 ;1<<PWM11 | 1<<PWM10\r
+       OUT     TCCR1A,A                ; 8 BIT PWM ENABLE, INVERTING PWM\r
+       LDI     A,1<<CS10\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 US\r
+\r
+       LDI     A,$05\r
+       OUT     ADMUX,A                 ; USE CHANNEL 5 FOR A/D (A5 OR C5)\r
+       LDI     A,$DE\r
+       OUT     ADCSR,A                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;VOLTAGE_SHOW:\r
+; LDI A,2\r
+; LDS B,VOLTAGE_VSWT\r
+; RCALL TX_HEX\r
+; RJMP VOLTAGE_SHOW\r
+\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+ACTIVITY_LOOP:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BREQ    NO_ERROR_STACK_OVERFLOW\r
+       RJMP    ERROR_STACK_OVERFLOW\r
+NO_ERROR_STACK_OVERFLOW:\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       SBRS    FLAGS,0                 ; READY TO SHOW HARDWARE TYPE MESSAGE ?\r
+       RJMP    ACTIVITY_LOOP\r
+\r
+       ;SBRC   FLAGS,2\r
+       ;RJMP   HARDWARE_TYPE_WPO30\r
+       LDS     A,HARDWARE_TYPE\r
+       CPI     A,3\r
+       BREQ    HARDWARE_TYPE_HYT1500\r
+       CPI     A,2\r
+       BREQ    HARDWARE_TYPE_WPO30\r
+\r
+;HARDWARE_TYPE_HYT1000:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_2*2)\r
+       LDI     ZH,HIGH(MESSAGE_2*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_HYT1500:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_7*2)\r
+       LDI     ZH,HIGH(MESSAGE_7*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_CUSTOMER_64:\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_1*2)\r
+       LDI     ZH,HIGH(MESSAGE_1*2)    ; 240 X 64 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+       RJMP    MAIN_LOOP\r
+\r
+HARDWARE_TYPE_WPO30:\r
+       LDI     A,2\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON CUSTOMER SIDE\r
+\r
+MAIN_LOOP:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+       RJMP    MAIN_LOOP\r
+\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,'D'\r
+       BREQ    DTR_COMMAND\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR_COMMAND:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$03\r
+       BREQ    DTR0_LO\r
+       CPI     A,1\r
+       BREQ    DTR0_HI\r
+       CPI     A,2\r
+       BREQ    DTR1_LO\r
+       CPI     A,3\r
+       BREQ    DTR1_HI\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR0_LO:\r
+       SBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR0_HI:\r
+       CBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_LO:\r
+;IF LARGE\r
+;      SBI     PORTA,7\r
+;ELSE\r
+       SBI     PORTD,5\r
+;ENDIF\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_HI:\r
+;IF LARGE\r
+;      CBI     PORTA,7\r
+;ELSE\r
+       CBI     PORTD,5\r
+;ENDIF\r
+       ;RJMP   DTR_DONE ;MAIN_LOOP\r
+DTR_DONE:\r
+       LDI     B,$30\r
+       ADD     B,A\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'D'\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,B\r
+;      RCALL   TX_WAIT\r
+; %\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RX_WAIT_LOOP:\r
+       SEI\r
+\r
+RX_WAIT:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BRNE    ERROR_STACK_OVERFLOW\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       CLI\r
+\r
+       TST     TX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+       BREQ    RX_WAIT_LOOP\r
+;      BRNE    RX_WAIT_CONT            ; YES, GO AND TEST ADDRESS\r
+;\r
+;      TST     TX_COUNT1               ; ANY DATA WAITING AT TAIL ?\r
+;      BREQ    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE RECEIVED\r
+;\r
+;RX_WAIT_ADOPT:\r
+;      MOV     TX_COUNT0,TX_COUNT1\r
+;      CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;\r
+;      LDS     A,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+;      STS     TX_ADDRESS0,A           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+\r
+RX_WAIT_CONT:\r
+       LDS     A,TX_ADDRESS0\r
+       CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+       BRNE    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+\r
+RX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     ZL,TX_SIZE-1\r
+       AND     TX_PTR,ZL\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;TX_WAIT_LOOP:\r
+;      SEI\r
+;\r
+;TX_WAIT:\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      CLI\r
+;\r
+;      PUSH    A\r
+;      MOV     A,RX_COUNT0\r
+;      ADD     A,RX_COUNT1\r
+;      CPI     A,RX_SIZE-1             ; ROOM TO INSERT 1 BYTE ?\r
+;      POP     A\r
+;      BRSH    TX_WAIT_LOOP\r
+;\r
+;      PUSH    A\r
+;      LDI     A,9\r
+;      STS     RX_ADDRESS1,A\r
+;      POP     A\r
+;      RJMP    TX_CHAR\r
+;\r
+;;     TST     RX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+;;     BREQ    TX_WAIT_LOOP            ; NO, BUT THIS WOULD BE AN OPTIMISATION\r
+;;\r
+;;TX_WAIT_ADOPT:\r
+;;     MOV     RX_COUNT0,RX_COUNT1\r
+;;     CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;;\r
+;;     LDS     A,RX_ADDRESS1           ; DEST FOR RX_COUNT1 BYTES AT HEAD\r
+;;     STS     RX_ADDRESS0,A           ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+;\r
+;TX_WAIT_CONT:\r
+;      PUSH    A\r
+;      LDS     A,RX_ADDRESS1\r
+;      CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+;      POP     A\r
+;      BRNE    TX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+;\r
+;;TX_CHAR: ; DON'T USE THE OTHER TX_CHAR AS IT DOESN'T FINISH WITH RETI\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RETI\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_STACK_OVERFLOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_8*2)\r
+       LDI     ZH,HIGH(MESSAGE_8*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+ERROR_BAD_COMMAND:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_4*2)\r
+       LDI     ZH,HIGH(MESSAGE_4*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BAD_COMMAND_LOOP:\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_BATTERY_LOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_5*2)\r
+       LDI     ZH,HIGH(MESSAGE_5*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BATTERY_LOW_LOOP:\r
+       LDI     A,250\r
+\r
+ERROR_BATTERY_LOW_DELAY:\r
+       RCALL   PRG_DELAY_20_MS         ; 20 MS * 250 = 5 SECONDS\r
+       DEC     A\r
+       BRNE    ERROR_BATTERY_LOW_DELAY\r
+\r
+       LDI     A,2\r
+       LDI     B,3\r
+       LDI     ZL,LOW(MESSAGE_6*2)\r
+       LDI     ZH,HIGH(MESSAGE_6*2)\r
+       RCALL   TX_MESSAGE              ; TURN VSWT OFF VIA TOUCHSCREEN COMMAND\r
+\r
+       RJMP    ERROR_BATTERY_LOW_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PRG_RESET:\r
+       CBI     PRG_PORT,PRG            ; OUTPUT PRG = 0\r
+\r
+       SBRS    A,2\r
+       CBI     PORTD,1\r
+       SBRC    A,2\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 2\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO GENERATE C INPUT TO HC137\r
+\r
+       SBRS    A,1\r
+       CBI     PORTD,1\r
+       SBRC    A,1\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 1\r
+\r
+       RCALL   PRG_DELAY_2_MS          ; DELAY TO GENERATE B INPUT TO HC137\r
+\r
+       SBRS    A,0\r
+       CBI     PORTD,1\r
+       SBRC    A,0\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 0\r
+\r
+       SBI     PRG_PORT,PRG            ; OUTPUT PRG = 1\r
+\r
+       RJMP    PRG_DELAY_200_US        ; WIDTH OF RESET PULSE TO AVR\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR SPI BUS\r
+\r
+;TX_HEX:\r
+;      SEI\r
+;      NOP\r
+;      CLI\r
+;\r
+;      TST     TX_COUNT1\r
+;      BRNE    TX_HEX\r
+;\r
+;      STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+;\r
+;      MOV     A,B\r
+;      SWAP    A\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_HI_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_HI_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      MOV     A,B\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_LO_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_LO_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      LDI     A,' '\r
+;      RCALL   TX_CHAR\r
+;\r
+;      RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_MESSAGE:\r
+       SEI\r
+       NOP\r
+       CLI\r
+\r
+; 09mar03 now got smaller buffers due to priority scheduling values $\r
+       tst     TX_COUNT0\r
+       brne    TX_MESSAGE\r
+; $\r
+       TST     TX_COUNT1\r
+       BRNE    TX_MESSAGE\r
+\r
+       STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+TX_MESSAGE_LOOP:\r
+       LPM\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       ADIW    ZL,1\r
+       DEC     B\r
+       BRNE    TX_MESSAGE_LOOP\r
+\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     TX_COUNT1\r
+       RET\r
+\r
+;RX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,TX_PTR\r
+;      SUBI    ZL,-TX_BUF\r
+;      CLR     ZH\r
+;      LD      A,Z\r
+;\r
+;      DEC     TX_COUNT0\r
+;      INC     TX_PTR\r
+;      LDI     ZL,TX_SIZE-1\r
+;      AND     TX_PTR,ZL\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      RET\r
+\r
+;TX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;! THESE ROUTINES ARE UPDATED FOR 7.3728 MHZ XTAL, TO AVOID A POTENTIAL\r
+;! ISSUE WITH A/B/C ADDRESS SELECT INPUTS TO HC137, THE PREVIOUS TIMINGS\r
+;! INCLUDED A 2* MARGIN SO THE NEW XTAL WOULD GIVE A 3* MARGIN, THIS IS\r
+;! A LITTLE TOO CLOSE, AS THE TIME CONSTANTS FOR A/B/C ARE ONLY 10* APART\r
+\r
+PRG_DELAY_280_MS:\r
+       LDI     ZL,LOW(140*20) ;! LOW(140*29) ; WHY 140 ??  SOME BIGBODGE ?\r
+       LDI     ZH,HIGH(140*20) ;! HIGH(140*29) ; 125 * 29 * 69.4 US = 281 MS\r
+       RJMP    PRG_DELAY_ENTRY\r
+PRG_DELAY_20_MS:\r
+       ;!LDI   ZL,LOW(10*29)\r
+       ;!LDI   ZH,HIGH(10*29)          ; 10 * 29 * 69.4 US = 20.1 MS\r
+       ;!RJMP  PRG_DELAY_ENTRY\r
+       LDI     ZL,200 ;!\r
+       RJMP    PRG_DELAY_ENTRY_ZL ;!\r
+PRG_DELAY_2_MS:\r
+       LDI     ZL,20 ;!29              ; 29 * 69.4 US = 2.01 MS\r
+       RJMP    PRG_DELAY_ENTRY_ZL\r
+PRG_DELAY_200_US:\r
+       LDI     ZL,2 ;!3                ; 3 * 69.4 US = 208 US\r
+PRG_DELAY_ENTRY_ZL:\r
+       LDI     ZH,0\r
+PRG_DELAY_ENTRY:\r
+       LDI     D,0                     ; 256 * 3 = 768 T-STATES = 69.4 US\r
+PRG_DELAY_LOOP:\r
+       DEC     D\r
+       BRNE    PRG_DELAY_LOOP\r
+       SBIW    ZL,1\r
+       BRNE    PRG_DELAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; UART RX COMPLETE INTERRUPT HANDLER FOR API BUS\r
+\r
+RX_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       SBRC    API_STATE,APIDATA       ; TRANSFER ALREADY IN PROGRESS?\r
+       RJMP    API_RX_DATA             ; YES, SAVE CHARACTER\r
+\r
+;      ; RECEIVED DATA SIZE RESPONSE\r
+;      SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+;      RJMP    API_RX_RESPONSE         ; NO, PRESERVE ABSENT COUNT\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNT FOR TX_ADDRESS\r
+;\r
+;API_RX_RESPONSE:\r
+       IN      E,UDR\r
+\r
+       EOR     E,API_REMAIN            ; TEST FOR WRONG DIRECTION OF RESPONSE\r
+       BRMI    GO_API_ERROR\r
+\r
+       EOR     E,API_REMAIN            ; RESTORE ORIGINAL DATA SIZE RESPONSE\r
+       BRMI    API_RESPONSE_RX         ; DIRECTION IS TX?\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+API_RESPONSE_RX:\r
+       CP      API_REMAIN,E\r
+       BRLO    API_RESPONSE_OK\r
+       MOV     API_REMAIN,E            ; API_REMAIN = LESSER OUR / SLAVE MAX\r
+\r
+API_RESPONSE_OK:\r
+       CBR     API_STATE,1<<APISIZE    ; IN CASE NO DATA TRANSFERRED\r
+       SBR     API_STATE,1<<APIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       MOV     E,API_REMAIN\r
+       ANDI    E,$7F\r
+       BREQ    API_NULL\r
+\r
+       TST     API_REMAIN              ; ABOUT TO RECEIVE?\r
+       BRMI    API_RX_SETUP            ; YES, AWAIT FURTHER RX INTERRUPTS\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIWAIT    ; ENSURE TIMER INT DOES NOT CAUSE ABORT\r
+\r
+       ; WE CAN'T GO STRAIGHT INTO API_TX_DATA BECAUSE WE DON'T KNOW THE\r
+       ; STATUS OF THE TIMER PRESCALER THAT CONTROLS TRANSMISSION.  HERE,\r
+       ; WE WILL NOW WAIT FOR THE NEXT TIMER INTERRUPT TO GET SYNCHRONISED.\r
+\r
+; 10mar03 addition $\r
+;      lds     f,TX_ADDRESS0\r
+;      cpi     f,2                     ; touchscreen?\r
+;      breq    start_next_tick         ; yes, need to synchronise with timer\r
+;                                      ; no, go faster by resetting timer\r
+;      ldi     e,0\r
+;      out     TCNT0,e                 ; make interrut latency cumulative\r
+;;if LARGE\r
+;;     ldi     e,$01\r
+;;else\r
+;      ldi     e,$02\r
+;;endif\r
+;      out     TIFR,e                  ; kill any freaky interrupt pending\r
+; $\r
+\r
+; 10mar03 reinstated $\r
+;      rjmp    API_TX_DATA             ; transmit first character immediately\r
+; $\r
+\r
+; 10mar03 addition $\r
+;start_next_tick:\r
+; $\r
+\r
+; 10mar03 original $\r
+       LDI     E,-API_TIME_FIRST ; 10mar03 -1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+; $\r
+\r
+API_NULL:\r
+       LDI     E,-API_TIME_IDLE\r
+       RJMP    API_ERROR_ENTRY\r
+\r
+GO_API_ERROR:\r
+       RJMP    API_ERROR\r
+\r
+API_RX_DATA:\r
+\r
+ LDS E,RX_ADDRESS1\r
+ CPI E,1 ; DON'T GO STICKY ON THE LOADCELL, BECAUSE IT ALWAYS HAS SOME DATA\r
+ BREQ API_RX_DATA_NONSTICK\r
+ LDI E,3 ; 09mar03 1\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+API_RX_DATA_NONSTICK:\r
+\r
+       ; RECEIVING, SAVE CHARACTER\r
+       IN      E,UDR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT0\r
+       ADD     ZL,RX_COUNT1\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,RX_ADDRESS0\r
+       LDS     ZH,RX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    API_RX_COUNT1\r
+       INC     RX_COUNT0\r
+       RJMP    API_RX_COUNT2\r
+API_RX_COUNT1:\r
+       INC     RX_COUNT1\r
+API_RX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ;LDI    E,-API_TIMEOUT\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+API_RX_SETUP:\r
+       LDI     E,-API_TIME_FIRST ; 10mar03 -API_TIME_FAST ;FORMERLY -1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     API_REMAIN              ; STILL RECEIVING?\r
+       BRPL    API_REVERT              ; NO, RECEIVED ENTIRE PACKET\r
+\r
+; 10mar03 addition $\r
+       lds     e,RX_ADDRESS1\r
+       cpi     e,2                     ; touchscreen?\r
+       ldi     e,-API_TIMEOUT_TS       ; yes, wait a bit longer for response\r
+       breq    api_timeout_e\r
+; $\r
+\r
+; 10mar03 original $\r
+       ldi     e,-API_TIMEOUT\r
+; $\r
+\r
+; 10mar03 addition $\r
+api_timeout_e:\r
+; $\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA:\r
+\r
+; 09mar03 probably not necessary but it's nice to be symmetrical $\r
+       ldi     e,3 ; 09mar03 1\r
+       sts     TX_STICKY,e             ; top up sticky count\r
+; $\r
+\r
+       ; SENDING DATA, READY FOR NEW BYTE\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+; 10mar03 addition $\r
+       lds     f,TX_ADDRESS0\r
+       add     zl,f                    ; f will be used again below!!\r
+; else\r
+;      LDS     ZH,TX_ADDRESS0\r
+;      ADD     ZL,ZH\r
+; endif\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET MAX BYTES TO ACCEPT, PER DEVICE\r
+       DEC     E                       ; DECREASE\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,E\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;MOV E,TX_PTR\r
+ ;ORI E,$80\r
+ ;RCALL TWAT\r
+\r
+; 10mar03 reinstated $\r
+       ; for even characters, bit 0 + start bit makes a double bit, delay -1\r
+       ; for odd characters, start bit may be missed, so delay -2 to be safe\r
+       lsr     e                       ; cf = 0 even, 1 odd\r
+       sbc     e,e                     ; e = $00 even, $FF odd\r
+       dec     e                       ; E = $FF even, $FE odd\r
+; else\r
+;      ldi     e,-API_TIME_FAST        ; yes, send slightly slower (odd rate)\r
+; $\r
+\r
+; 10mar03 addition $\r
+       ;lds    f,TX_ADDRESS0           ; already done above\r
+       cpi     f,2                     ; touchscreen?\r
+       brne    setup_time_e            ; no, use the tx even/odd optimisation\r
+       ldi     e,-API_TIME_FAST_TS     ; yes, send slightly slower (odd rate)\r
+; $\r
+\r
+; 10mar03 addition $\r
+setup_time_e:\r
+; $\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       ; NOW DONE EARLIER, BEFORE CLOBBERING THE TRANSMITTED CHAR IN E\r
+       ;LDI    E,-API_TIME_FAST\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       ; THIS IS NOW DONE EARLIER WHEN WE SYNCHRONISE TO THE TIMER\r
+       ;SBR    API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       DEC     API_REMAIN              ; SAY WE TRANSMITTED 1 BYTE\r
+       BRNE    API_DONE                ; IF THERE IS MORE TO SEND\r
+       RJMP    API_REVERT\r
+\r
+API_ERROR: ; 09mar03 we should never get here (only in case of bus corruption)\r
+       LDI     E,-API_TIMEOUT\r
+API_ERROR_ENTRY:\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT ADDRESS COMMAND\r
+\r
+       CBR     API_STATE,1<<APISIZE    ; WE WILL SEND ADDRESS COMMAND\r
+\r
+API_REVERT:\r
+       CBI     UCR,RXCIE               ; DISABLE RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; WE WILL SEND ADDR OR DATA SIZE\r
+\r
+API_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 INTERRUPT HANDLER FOR API/SPI BUS\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+; 10mar03 we now have a faster interrupt and finer control over timing $\r
+       ldi     e,0\r
+       out     TCNT0,e                 ; make interrut latency cumulative\r
+;if LARGE\r
+;      ldi     e,$01\r
+;else\r
+       ldi     e,$02\r
+;endif\r
+       out     TIFR,e                  ; kill any freaky interrupt pending\r
+\r
+       dec     TCK0_DIVIDE_8           ; is it the 8th interrupt?\r
+       brne    SPI_TIMER_OK            ; no, just process the API bus timer\r
+\r
+       ldi     e,8                     ; yes, do the usual timer processing\r
+       mov     TCK0_DIVIDE_8,e         ; reloading the divisor for next time\r
+; $\r
+\r
+       LDS     E,WATCHDOG_COUNT\r
+       LDS     F,WATCHDOG_COUNT+1\r
+       OR      F,E\r
+       BREQ    WATCHDOG_SKIP\r
+       SUBI    E,LOW(1)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDS     E,WATCHDOG_COUNT+1\r
+       SBCI    E,HIGH(1)\r
+       STS     WATCHDOG_COUNT+1,E\r
+       BREQ    WATCHDOG_RESET\r
+WATCHDOG_SKIP:\r
+\r
+       TST     SPI_WATCHDOG\r
+       BREQ    SPI_TIMER_OK\r
+       INC     SPI_WATCHDOG\r
+       BRNE    SPI_TIMER_OK\r
+\r
+; removed 24mar03 as an experiment to allow kernel to disable ints for longer $\r
+;      LDI     E,0\r
+;      OUT     SPCR,E                  ; DISABLE SPI\r
+;      IN      E,SPSR\r
+;      IN      E,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+;      LDI     E,$E8\r
+;      OUT     SPCR,E                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+; $\r
+\r
+       SBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = 0\r
+\r
+; removed 24mar03 as an experiment to allow kernel to disable ints for longer $\r
+;      CBR     API_STATE,1<<SPIDATA | 1<<SPISIZE | 1<<SPIWAIT\r
+; $\r
+SPI_TIMER_OK:\r
+\r
+       TST     API_WATCHDOG\r
+       BREQ    API_TIMER_OK\r
+       INC     API_WATCHDOG\r
+       BREQ    API_TIMED_OUT\r
+API_TIMER_OK:\r
+\r
+T0_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+WATCHDOG_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_RX_TIMEOUT:\r
+       SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+; 09mar03 now got individual priorities per device $\r
+       rjmp    api_kill_device         ; no, it's rx, set rx priority to 15!\r
+; else\r
+;      RJMP    API_TX_ADDRESS          ; NO, PRESERVE ABSENT COUNT\r
+; $\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      DEC     E\r
+; brne api_device_present\r
+       ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+       STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+ LDI E,TX_SIZE\r
+ ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;      LDI     E,4\r
+;api_device_present:\r
+;      STS     ABSENT_COUNT,E          ; DECREMENT ABSENT COUNT FOR TX_ADDRESS\r
+       RJMP    API_TX_ADDRESS\r
+\r
+; 09mar03 now got individual priorities per device $\r
+api_kill_device:\r
+       push    zl\r
+       push    zh\r
+       ldi     zl,RX_PRIORITY-1\r
+       lds     zh,RX_ADDRESS1\r
+       add     zl,zh\r
+       clr     zh\r
+       ldi     e,15                    ; no, it's rx, set rx priority to 15!\r
+       st      z,e                     ; so that we will give away rx slots\r
+       pop     zh\r
+       pop     zl\r
+       rjmp    API_TX_ADDRESS\r
+; $\r
+\r
+API_TIMED_OUT:\r
+       SBRC    API_STATE,APIWAIT\r
+       RJMP    API_RX_TIMEOUT\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_TX_DATA\r
+\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_TX_DATA_SIZE\r
+\r
+API_TX_ADDRESS:\r
+       ; SEND ADDRESS COMMAND\r
+       LDI     E,-API_TIME_SLOW\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO DATA SIZE COMMAND\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E                       ; TURNOFF REQUESTED?\r
+       BREQ    API_TURNOFF_OK\r
+       DEC     E                       ; STILL WAITING FOR TURNOFF?\r
+       STS     TURNOFF_COUNT,E\r
+       BREQ    API_TURNOFF_RESET       ; GAVE UP WAITING FOR TURNOFF\r
+\r
+       CBI     PRG_PORT,PRG            ; PRG LOW\r
+       CBI     PORTD,1                 ; TXD LOW\r
+       SBI     DDRD,1                  ; TXD OUTPUT\r
+       LDI     E,0\r
+       OUT     UCR,E                   ; DISABLE UART\r
+       RJMP    API_DONE\r
+\r
+API_TURNOFF_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_TURNOFF_OK:\r
+       CBI     UCR,RXCIE               ; DISABLE RX INTS, FOR APIWAIT ENTRY\r
+\r
+       LDI     E,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+; 09mar03 so that reception can temporarily take priority over transmission $\r
+ lds e,RX_STICKY\r
+ tst e\r
+ brne API_TRY_RX ; try to receive, the counter will be decremented later\r
+ ; counter is zero, transmission has priority as usual\r
+; $\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       OR      E,TX_COUNT0\r
+       OR      E,TX_COUNT1\r
+       BRNE    API_TRY_TX\r
+\r
+API_TRY_RX: ; 09mar03\r
+       LDS     E,TX_OVERRIDE\r
+       DEC     E\r
+       BREQ    API_DIRECTION_TX        ; FORCED TRANSMIT EVERY SO OFTEN\r
+       STS     TX_OVERRIDE,E\r
+       RJMP    API_DIRECTION_RX\r
+\r
+API_TRY_TX:\r
+       LDS     E,RX_OVERRIDE\r
+       DEC     E\r
+       BREQ    BREQ_API_DIRECTION_RX   ; FORCED RECEIVE EVERY SO OFTEN\r
+       STS     RX_OVERRIDE,E\r
+\r
+API_DIRECTION_TX:\r
+       LDI     E,$10\r
+       STS     TX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       ; SUSPEND TX OPERATIONS WHEN 9TH (INTERNAL) DEVICE ADDRESSED %\r
+       TST     TX_COUNT0               ; ANY BYTES AT HEAD ?\r
+       LDS     E,TX_ADDRESS0\r
+       BRNE    API_SUSPEND_TX0         ; YES, GO AND CHECK HEAD DEVICE\r
+\r
+       TST     TX_COUNT1               ; ANY BYTES AT TAIL ?\r
+       BREQ    API_SUSPEND_TX1         ; NO, GO AND PERFORM TX OPERATION\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE TX_COUNT1 BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1\r
+       STS     TX_ADDRESS0,E           ; ADOPT TAIL DEVICE FOR BYTES AT HEAD\r
+\r
+API_SUSPEND_TX0:\r
+       CPI     E,9\r
+BREQ_API_DIRECTION_RX:\r
+       BREQ    API_DIRECTION_RX\r
+\r
+API_SUSPEND_TX1:\r
+       ; %\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      TST     E\r
+;      BRNE    API_DEVICE_PRESENT\r
+;\r
+;;API_DEVICE_ABSENT:\r
+;      ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+;      LDI     E,TX_SIZE-1\r
+;      AND     TX_PTR,E\r
+;\r
+;      CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+;      STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+;\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      LDI     ZL,TX_LIMIT-1\r
+;      LDS     ZH,TX_ADDRESS0\r
+;      ADD     ZL,ZH\r
+;      CLR     ZH\r
+;      ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+; LDI E,TX_SIZE\r
+; ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNTER FOR NEXT DEVICE\r
+;\r
+;API_DEVICE_PRESENT:\r
+       CBR     API_STATE,1<<APIDIRN    ; SAY WE WILL TRANSMIT\r
+\r
+       TST     TX_COUNT0\r
+       BRNE    API_TX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       ; THIS ROUTINE WILL MOVE BYTES AT TAIL TO HEAD,\r
+       ; REDUNDANTLY, BECAUSE WE HAVE NOW DONE IT EARLIER\r
+       TST     TX_COUNT1\r
+       BRNE    API_TX_ADDRESS_ADOPT    ; BYTES AT TAIL, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       DEC     E\r
+       BRPL    API_TX_ADDRESS_STICKY   ; STAYING STICKY, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_ADDRESS0\r
+       INC     E                       ; BUMP TX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_TX_ADDRESS_SAVE\r
+       LDI     E,1\r
+       RJMP    API_TX_ADDRESS_SAVE\r
+\r
+API_TX_ADDRESS_ADOPT:\r
+       LDI     E,3 ; 09mar03 1\r
+API_TX_ADDRESS_STICKY:\r
+       STS     TX_STICKY,E             ; DECREMENT, OR TOP UP, STICKY COUNT\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+API_TX_ADDRESS_SAVE:\r
+       STS     TX_ADDRESS0,E           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_TX_ADDRESS_SAME:\r
+       LDI     E,3 ; 09mar03 1\r
+       STS     TX_STICKY,E             ; TOP UP STICKY COUNT\r
+\r
+       LDS     E,TX_ADDRESS0           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_DIRECTION_RX:\r
+       LDI     E,$10\r
+       STS     RX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       SBR     API_STATE,1<<APIDIRN    ; SAY WE WILL RECEIVE\r
+\r
+; 09mar03 this is now done later $\r
+; LDS E,RX_STICKY\r
+; TST E\r
+; BREQ API_DIRECTION_RX_NEW\r
+; DEC E\r
+; STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+; LDS E,RX_ADDRESS1\r
+; RJMP API_ADDRESS_SEND\r
+;API_DIRECTION_RX_NEW:\r
+; $\r
+\r
+       LDS     E,RX_ADDRESS1           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+       TST     RX_COUNT1\r
+       BRNE    API_ADDRESS_SEND        ; BYTES AT TAIL, PRESERVE DEVICE\r
+\r
+; 09mar03 decrement the counter (it was earlier tested before API_TRY_RX)\r
+ lds f,RX_STICKY\r
+ tst f\r
+ breq rx_not_sticky ; counter is zero, perform the usual priority scheduling\r
+\r
+ dec f\r
+ sts RX_STICKY,f ; count down after the activity dies\r
+ rjmp API_ADDRESS_SEND ; with e = RX_ADDRESS1 from above\r
+\r
+rx_not_sticky:\r
+; $\r
+\r
+; 09mar03 now got individual priorities per device $\r
+       push    zl\r
+       push    zh\r
+       ldi     zl,RX_MODULUS\r
+       clr     zh\r
+\r
+       ld      e,z+                    ; first value (minimum found so far)\r
+       sts     RX_ADDRESS1,zl          ; very temporary borrowing of variable!\r
+modulus_loop:\r
+       ld      f,z+                    ; get modulus value for a device\r
+       cp      f,e                     ; less than minimum found so far?\r
+       brpl    modulus_loope\r
+       mov     e,f                     ; yes, adopt it\r
+       sts     RX_ADDRESS1,zl          ; very temporary borrowing of variable!\r
+modulus_loope:\r
+       ldi     f,RX_MODULUS+8\r
+       cpse    zl,f                    ; process 8 values (including first)\r
+       rjmp    modulus_loop\r
+\r
+       lds     zl,RX_ADDRESS1\r
+       adiw    zl,8-1                  ; -1 corrects for the use of z+ above\r
+       ld      f,z                     ; get priority value for device\r
+       sbiw    zl,8\r
+       add     e,f                     ; add to (minimum) modulus value found\r
+       st      z,e                     ; save bumped modulus value for device\r
+\r
+       mov     e,zl\r
+       subi    e,RX_MODULUS-1          ; convert modulus ptr to device no+1\r
+       pop     zh\r
+       pop     zl\r
+; else\r
+;      ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+;      LDS     F,RX_ADDRESS2\r
+;      STS     RX_ADDRESS2,E\r
+;      MOV     E,F\r
+;      CPI     E,1\r
+;      BREQ    API_RX_ADDRESS_SAVE\r
+;      ; %\r
+;\r
+;      INC     E                       ; BUMP RX_ADDRESS BEFORE USING IT\r
+;      CPI     E,9\r
+;      BRLO    API_RX_ADDRESS_SAVE\r
+;      ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+;      LDI     E,2\r
+;      ; ELSE\r
+;      ;LDI    E,1\r
+;      ; %\r
+; $\r
+\r
+API_RX_ADDRESS_SAVE:\r
+       STS     RX_ADDRESS1,E           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+API_ADDRESS_SEND:\r
+       OUT     UDR,E                   ; SEND ADDRESS COMMAND\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE WILL SEND DATA SIZE COMMAND\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; RESET, FOR APIWAIT ENTRY\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA_SIZE:\r
+       ; SEND DATA SIZE COMMAND\r
+\r
+; 10mar03 removed, but now reinstated (see API_TIMEOUT_TS below) $\r
+;      LDI     E,-API_TIMEOUT\r
+;      MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+; $\r
+\r
+       LDI     E,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+; 10mar03 optimisation $\r
+       sbrc    API_STATE,APIDIRN       ; test direction\r
+       rjmp    calc_max_receive        ; direction is rx, ask to receive\r
+; $\r
+\r
+; 10mar03 addition $\r
+       lds     f,TX_ADDRESS0\r
+       cpi     f,2                     ; touchscreen?\r
+       ldi     e,-API_TIMEOUT_TS       ; yes, wait a bit longer for response\r
+       breq    api_timeout_tx\r
+       ldi     e,-API_TIMEOUT\r
+api_timeout_tx:\r
+       mov     API_WATCHDOG,e          ; set up time to abort if no response\r
+; $\r
+\r
+       MOV     E,TX_COUNT0             ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+; 09mar03 addition $\r
+; lds f,TX_ADDRESS0 ; remove this if reinstating the above 10mar03 addition\r
+ cpi f,2 ; touchscreen?\r
+ breq tx_x\r
+ cpi f,7 ; compactflash?\r
+ brne tx_e ; no, don't do any special character pacing\r
+tx_x:\r
+ tst e\r
+ breq tx_e ; can't receive anything\r
+ subi e,TX_SIZE/2\r
+ brsh tx_e_p1 ; got a lot to transmit, but pretend we have a lesser amount\r
+ ldi e,0 ; not much to transmit, so start sending one character at a time\r
+tx_e_p1:\r
+ inc e ; so that we transmit at least one byte\r
+tx_e:\r
+; $\r
+\r
+; 10mar03 removed $\r
+;      SBRS    API_STATE,APIDIRN       ; TEST DIRECTION\r
+; $\r
+       RJMP    API_COMMAND_OK          ; DIRECTION IS TX, ASK TO TRANSMIT\r
+\r
+; 10mar03 optimisation $\r
+calc_max_receive:\r
+; $\r
+\r
+; 10mar03 addition $\r
+       lds     f,RX_ADDRESS1\r
+       cpi     f,2                     ; touchscreen?\r
+       ldi     e,-API_TIMEOUT_TS       ; yes, wait a bit longer for response\r
+       breq    api_timeout_rx\r
+       ldi     e,-API_TIMEOUT\r
+api_timeout_rx:\r
+       mov     API_WATCHDOG,e          ; set up time to abort if no response\r
+; $\r
+\r
+       LDI     E,RX_SIZE\r
+       SUB     E,RX_COUNT0\r
+       SUB     E,RX_COUNT1             ; E = MAXIMUM AMOUNT WE CAN RECEIVE\r
+; 09mar03 addition $\r
+; lds f,RX_ADDRESS1 ; remove this if reinstating the above 10mar03 addition\r
+ cpi f,7 ; compactflash?\r
+ brne rx_e ; no, don't do any special character pacing\r
+ tst e\r
+ breq rx_e ; can't receive anything\r
+ subi e,RX_SIZE/2\r
+ brsh rx_e_p1 ; got a lot of capacity, but pretend we have a lesser amount\r
+ ldi e,0 ; not much capacity, so start accepting one character at a time\r
+rx_e_p1:\r
+ inc e ; so that we receive at least one byte\r
+rx_e:\r
+; $\r
+       ORI     E,$80                   ; ASK TO RECEIVE\r
+\r
+API_COMMAND_OK:\r
+       OUT     UDR,E                   ; SEND DATA SIZE COMMAND\r
+       MOV     API_REMAIN,E            ; SAVE COMMAND FOR MINIMUM CALCULATION\r
+\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      E,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+\r
+       SBR     API_STATE,1<<APIWAIT    ; SAY WE ARE WAITING FOR DATA SIZE RESP\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+; SPI TRANSFER COMPLETE HANDLER FOR Z180 BUS\r
+\r
+; 09mar03 now got individual priorities per device $\r
+spi_priority:\r
+       mov     f,e\r
+\r
+       andi    e,$0f\r
+       breq    spi_bad_command         ; device needs to be > 0th\r
+       cpi     e,9\r
+       brsh    spi_bad_command         ; device needs to be < 9th (internal)\r
+\r
+       swap    f\r
+       andi    f,$07                   ; priority must be valid (from 1 to 7)\r
+       cpi     f,4\r
+       brlo    spi_priority_save       ; values 1,2,3 saved without change\r
+       inc     f\r
+       cpi     f,6\r
+       brlo    spi_priority_save       ; value 4 translated to 5\r
+       inc     f\r
+       cpi     f,8\r
+       brlo    spi_priority_save       ; value 5 translated to 7\r
+       subi    f,-3\r
+       cpi     f,12\r
+       brlo    spi_priority_save       ; value 6 translated to 11\r
+       ldi     f,15                    ; value 7 translated to 15\r
+\r
+spi_priority_save:\r
+       push    zl\r
+       push    zh\r
+       ldi     zl,RX_PRIORITY-1\r
+       add     zl,e                    ; find device entry in priority array\r
+       clr     zh\r
+       st      z,f                     ; save priority for device\r
+       pop     zh\r
+       pop     zl\r
+\r
+       rjmp    SPI_DONE                ; await a new command (timeout???)\r
+; $\r
+\r
+SPI_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       IN      E,SPDR\r
+\r
+       SBRC    API_STATE,SPIDATA\r
+       RJMP    SPI_DATA\r
+\r
+       SBRC    API_STATE,SPISIZE\r
+       RJMP    SPI_RESPOND\r
+\r
+       SBRC    API_STATE,SPIWAIT\r
+       RJMP    SPI_WAIT\r
+\r
+;SPI_ADDRESS:\r
+       CPI     E,10                    ; VALID ADDRESSES ARE 1-9\r
+       BRLO    SPI_SELECT\r
+       CPI     E,$80\r
+; 09mar03 now got individual priorities per device $\r
+       brlo    spi_priority            ; accept command to set device priority\r
+; $\r
+       BREQ    SPI_RSEL_LO\r
+       CPI     E,$81\r
+       BREQ    SPI_RSEL_HI\r
+       CPI     E,$91\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1000\r
+       CPI     E,$92\r
+       BREQ    SPI_HARDWARE            ; WPO30 V5\r
+       CPI     E,$93\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1500\r
+       CPI     E,$A5\r
+       BREQ    SPI_TURNOFF\r
+       CPI     E,$AA\r
+       BREQ    SPI_RESET\r
+       CPI     E,$C5\r
+       BREQ    SPI_WATCHDOG_RESET\r
+\r
+; 09mar03 now got individual priorities per device $\r
+spi_bad_command:\r
+; $\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<1              ; HAD WRONG COMMAND\r
+       RJMP    SPI_DONE_ENTRY          ; RETURN LEAVING SPI_WATCHDOG = 0\r
+\r
+SPI_RSEL_LO:\r
+       CBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RSEL_HI:\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE - FOR COMPATIBILITY\r
+       SBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_HARDWARE: ;_HYT1000\r
+       SUBI    E,$90                   ; THE MAGIC CRACKER\r
+       STS     HARDWARE_TYPE,E         ; IT WAS PREVIOUSLY 1 FOR COMPATIBILITY\r
+\r
+       ;CBR    FLAGS,1<<2              ; HARDWARE TYPE IS HYTECH 1000\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE\r
+       RJMP    SPI_DONE\r
+\r
+;SPI_HARDWARE_WPO30:\r
+;      SBR     FLAGS,1<<2 | 1<<0       ; HARDWARE TYPE IS WPO30, SHOW MESSAGE\r
+;      RJMP    SPI_DONE\r
+\r
+SPI_TURNOFF:\r
+       LDI     E,$FF\r
+       STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+\r
+       CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+\r
+       LDI     E,$FF\r
+       LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+SPI_WATCHDOG_RESET:\r
+       LDI     E,LOW(1000)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDI     E,HIGH(1000)            ; 0.1 SECOND\r
+       STS     WATCHDOG_COUNT+1,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_SELECT:\r
+       ; RECEIVED ADDRESS COMMAND\r
+       TST     E                       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       BRNE    SPI_SELECT_TX\r
+\r
+;SPI_SELECT_RX:\r
+       ; HAD ENQUIRY, SEND ACTIVE DEVICE\r
+       SBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS RX\r
+\r
+       TST     RX_COUNT0\r
+       BRNE    SPI_RX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       TST     RX_COUNT1\r
+       BREQ    SPI_SELECT_NULL         ; NO BYTES AT TAIL, REPORT NULL DEVICE\r
+\r
+;SPI_RX_ADDRESS_ADOPT:\r
+       MOV     RX_COUNT0,RX_COUNT1\r
+       CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     SPI_REMAIN,RX_ADDRESS1  ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+       STS     RX_ADDRESS0,SPI_REMAIN  ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_RX_ADDRESS_SAME:\r
+       LDS     SPI_REMAIN,RX_ADDRESS0  ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_TX:\r
+       ; HAD SELECT, SAVE NEW ACTIVE DEVICE\r
+       CBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS TX\r
+       MOV     SPI_REMAIN,E\r
+\r
+       TST     TX_COUNT1\r
+       BREQ    SPI_TX_ADDRESS_CONT     ; QUEUE IS EMPTY, ALLOW ANY DEVICE\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       CP      E,SPI_REMAIN\r
+       BRNE    SPI_SELECT_NULL         ; ALLOW CURRENTLY SELECTED DEVICE ONLY\r
+\r
+SPI_TX_ADDRESS_CONT:\r
+       LDI     E,3 ; 09mar03 1\r
+       STS     TX_STICKY,E             ; FORCE TX_ADDRESS1 TO BE POLLED FOR TX\r
+\r
+       STS     TX_ADDRESS1,SPI_REMAIN  ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_NULL:\r
+       CLR     SPI_REMAIN              ; TX BUSY, REPORT NULL DEVICE\r
+SPI_SELECT_SEND:\r
+       OUT     SPDR,SPI_REMAIN         ; ADDRESS RESPONSE\r
+\r
+       SBR     API_STATE,1<<SPIWAIT    ; SAY WE ARE SENDING ADDRESS RESPONSE\r
+       RJMP    SPI_DONE\r
+\r
+SPI_WAIT:\r
+       CBR     API_STATE,1<<SPIWAIT\r
+\r
+       TST     SPI_REMAIN              ; DID WE SEND NULL ADDRESS RESPONSE?\r
+       BREQ    GO_SPI_DONE             ; YES, ABORT TRANSFER\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE ARE RECEIVING DATA SIZE CMD\r
+GO_SPI_DONE:\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESPOND:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     SPI_REMAIN,E            ; SAVE DATA SIZE COMMAND FOR MIN CALC\r
+\r
+       CBR     API_STATE,1<<SPISIZE    ; IN CASE ERROR, OR NO DATA TRANSFERRED\r
+\r
+       TST     SPI_REMAIN              ; TEST DIRECTION FROM DATA SIZE COMMAND\r
+       SBRS    API_STATE,SPIDIRN       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       RJMP    SPI_RESPOND_RX\r
+\r
+;SPI_RESPOND_TX:\r
+       ; WE HAD ADDRESS ENQUIRY EARLIER\r
+       BRPL    BRPL_SPI_REVERT         ; ENSURE DATA SIZE DIRECTION IS TX\r
+\r
+       MOV     E,RX_COUNT0\r
+       ORI     E,$80                   ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+       RJMP    SPI_RESPOND_CONT\r
+\r
+GO_SPI_REVERT:\r
+       RJMP    SPI_REVERT\r
+\r
+SPI_RESPOND_RX:\r
+       ; WE HAD ADDRESS SELECT EARLIER\r
+       BRMI    GO_SPI_REVERT           ; ENSURE DATA SIZE DIRECTION IS RX\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS1\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = MAX BYTES TO ACCEPT, PER DEVICE\r
+\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BREQ    SPI_DEVICE_SAME\r
+\r
+;SPI_DEVICE_DELTA:\r
+       LDI     ZL,TX_SIZE\r
+       SUB     ZL,TX_COUNT0\r
+       CP      E,ZL\r
+       BRLO    SPI_DEVICE_DELTA_CONT\r
+       MOV     E,ZL\r
+       RJMP    SPI_DEVICE_DELTA_CONT\r
+\r
+SPI_DEVICE_SAME:\r
+       CPI     E,TX_SIZE\r
+       BRLO    SPI_DEVICE_SAME_CONT\r
+       LDI     E,TX_SIZE\r
+SPI_DEVICE_SAME_CONT:\r
+       SUB     E,TX_COUNT0\r
+SPI_DEVICE_DELTA_CONT:\r
+       SUB     E,TX_COUNT1\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       BRPL    SPI_RESPOND_CONT\r
+       LDI     E,$7F                   ; E = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+SPI_RESPOND_CONT:\r
+       ; START SENDING DATA SIZE RESPONSE\r
+       ; SPI_REMAIN = HOST MAX, E = OUR MAX\r
+       CP      E,SPI_REMAIN\r
+       BRSH    SPI_RESPOND_SEND\r
+       MOV     SPI_REMAIN,E            ; SPI_REMAIN = LOWER OF HOST / OUR MAX\r
+SPI_RESPOND_SEND:\r
+       OUT     SPDR,E\r
+\r
+       SBR     API_STATE,1<<SPIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_DATA:\r
+       TST     SPI_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    SPI_RX_DATA             ; GO AND SEND OR RECEIVE 1 BYTE\r
+\r
+;SPI_TX_DATA:\r
+       DEC     SPI_REMAIN\r
+BRPL_SPI_REVERT:\r
+       BRPL    SPI_REVERT              ; SKIP ONE INTERRUPT AT COMPLETION\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_PTR\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       OUT     SPDR,E\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       DEC     RX_COUNT0\r
+       INC     RX_PTR\r
+       LDI     E,RX_SIZE-1\r
+       AND     RX_PTR,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RX_DATA:\r
+       SBRS    API_STATE,SPISIZE\r
+       RJMP    SPI_RX_SKIP             ; SKIP ONE INTERRUPT AT START\r
+\r
+ ; EAT DATA FOR UNCORRUPTED HEX DUMP OUTPUT\r
+ ;RJMP SPI_RX_SKIP\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;RCALL TWAT\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    SPI_TX_COUNT1\r
+       INC     TX_COUNT0\r
+       RJMP    SPI_TX_COUNT2\r
+SPI_TX_COUNT1:\r
+       INC     TX_COUNT1\r
+SPI_TX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+SPI_RX_SKIP:\r
+       DEC     SPI_REMAIN              ; SENT OR RECEIVED 1 CHARACTER\r
+       BRMI    SPI_REVERT\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_REVERT:\r
+       CBR     API_STATE,1<<SPIDATA    ; EXPECTING ADDRESS OR DATA SIZE COMMAND\r
+\r
+       ;LDI    E,0                     ; NO TIMEOUT IF API BUS IS NOW IDLE\r
+       ;SBRC   API_STATE,1<<SPISIZE    ; TRANSACTION STILL OPEN?\r
+SPI_DONE:\r
+       LDI     E,-SPI_TIMEOUT          ; TIMEOUT TO RESET SPI BUS\r
+       MOV     SPI_WATCHDOG,E\r
+\r
+SPI_DONE_ENTRY:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;TWAT:\r
+ ;PUSH ZL\r
+ ;PUSH ZH\r
+ ;LDS ZL,TX_ADDRESS0 ;TX_ADDRESS1\r
+ ;CPI ZL,1\r
+ ;BRNE SKIP_LOOPBACK\r
+ ;MOV ZL,RX_COUNT0\r
+ ;ADD ZL,RX_PTR\r
+ ;ANDI ZL,RX_SIZE-1\r
+ ;SUBI ZL,-RX_BUF\r
+ ;CLR ZH\r
+ ;ST Z,E\r
+ ;INC RX_COUNT0\r
+ ;SKIP_LOOPBACK:\r
+ ;POP ZH\r
+ ;POP ZL\r
+ ;RET\r
+\r
+;---------------- ANALOG TO DIGITAL INTERRUPT ROUTINE ----------------------\r
+\r
+ADC_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       WDR\r
+\r
+       IN      E,ADCL\r
+       MOV     ATOD,E\r
+       IN      E,ADCH\r
+\r
+       ROR     E\r
+       ROR     ATOD\r
+       ROR     E\r
+       ROR     ATOD                    ; CONTAINS THE 8 MSB OF CONVERTER VALUE\r
+\r
+       SBRC    FLAGS,4                 ; CURRENT RESULT IS FROM REFERENCE ?\r
+       RJMP    ADC_REFERENCE\r
+\r
+       ; CURRENT RESULT IS FROM -5V GENERATOR\r
+       SBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE REFERENCE\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E\r
+       ; REVISED 18DEC01 FOR HYT1500\r
+       ;BRNE   GO_ADC_DONE             ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+       BRNE    ADC_DONE                ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+\r
+       LDI     E,$00\r
+       LDI     F,$00\r
+       SUBI    ATOD,92-$40 ;1          ; 256-512*47/147 = ABOUT 33% FULL SCALE\r
+       BRLO    ADC_PULSE               ; FAR TOO NEGATIVE, APPLY MINIMUM PULSE\r
+\r
+       LDI     E,$60\r
+       LDI     F,$00\r
+       CPI     ATOD,$80 ;2\r
+       BRSH    ADC_PULSE               ; FAR TOO POSITIVE, APPLY MAXIMUM PULSE\r
+\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $10\r
+       ;MOV    E,ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $20\r
+       ;ADD    E,ATOD                  ; $01 HALF SCALE -> $30 HALF WIDTH\r
+\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $20\r
+       MOV     E,ATOD\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $10\r
+       ADD     E,ATOD                  ; $40 HALF SCALE -> $30 HALF WIDTH\r
+       RJMP    ADC_PULSE\r
+\r
+ADC_REFERENCE:\r
+       CBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE -5V GENERATOR\r
+\r
+ ;STS VOLTAGE_VSWT,ATOD\r
+ ;RJMP ADC_DONE\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      SBRC    FLAGS,5                 ; CURRENT REFERENCE IS BANDGAP ?\r
+;      RJMP    ADC_BANDGAP\r
+;\r
+;      ; CURRENT REFERENCE IS LM385 (18DEC01 IT'S NOW A 100K/100K DIVIDER)\r
+;      CPI     ATOD,$F8                ; IF =>$F8 ASSUME WE HAVE PULLUP ONLY\r
+;      BRLO    ADC_LM385\r
+;\r
+;      LDS     E,LM385_COUNT\r
+;      DEC     E                       ; COUNT DOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,E\r
+;      BRNE    ADC_DONE                ; KEEP TRYING LM385\r
+;\r
+;      SBR     FLAGS,1<<5              ; SAY WE HAVE SWITCHED TO BANDGAP\r
+;GO_ADC_DONE:\r
+;      RJMP    ADC_DONE\r
+;\r
+;ADC_LM385:\r
+;      LDI     E,$10                   ; TOP UP COUNTDOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,E\r
+;\r
+;;     LSR     ATOD                    ; LM385 VOLTAGE = APPROX 2*BANDGAP\r
+;                                      ; USE LM385Z-1.2\r
+;\r
+;ADC_BANDGAP:\r
+       STS     VOLTAGE_VSWT,ATOD\r
+\r
+       ; 18DEC01 USE 5.5 VOLTS AS FOR THE ORIGINAL HYTECH 1000 SYSTEM\r
+       ; IT MUST BE A BIT > 4.2 VOLTS BECAUSE OTHERWISE AVR VCC = Z180 VCC\r
+       ;CPI    ATOD,137                ; 256*0.5*4.5/4.2\r
+       ;CPI    ATOD,152                ; 256*0.5*5.0/4.2\r
+       CPI     ATOD,168                ; 256*0.5*5.5/4.2\r
+\r
+;      ;CPI    ATOD,70                 ; 256*1.22/4.5\r
+;      ;CPI    ATOD,63                 ; 256*1.22/5.0\r
+;      CPI     ATOD,57                 ; 256*1.22/5.5\r
+\r
+       LDI     E,LOW(1024)\r
+       LDI     F,HIGH(1024)\r
+       ; 18DEC01 FOR HYT1500 REVERSED THE SENSE DUE TO NEW 100K/100K DIVIDER\r
+       ;BRLO   ADC_BATTERY_SAVE\r
+       BRSH    ADC_BATTERY_SAVE\r
+\r
+; BIGBODGE TO SKIP SHUT DOWN DUE TO VOLTAGE MEASURING\r
+; 17DEC01 THIS IS NOW DONE FURTHER DOWN, AFTER LOW BATTERY TEST\r
+;RJMP  ADC_DONE                ; SKIP VOLTAGE TEST FOR NOW\r
+\r
+       ; VSWT < 5.5 VOLTS, STABILISE READING FOR BATTERY LOW\r
+       LDS     E,BATTERY_COUNT\r
+       LDS     F,BATTERY_COUNT+1\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    ADC_BATTERY_SAVE        ; COUNT 1024 LOW BATTERY READINGS\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<3              ; SHOW BATTERY MESSAGE AND POWER DOWN\r
+\r
+ADC_BATTERY_SAVE:\r
+       STS     BATTERY_COUNT,E\r
+       STS     BATTERY_COUNT+1,F\r
+\r
+; BIGBODGE TO SKIP SHUT DOWN DUE TO VOLTAGE MEASURING\r
+; 17DEC01 WE'LL ALSO COMMENT THE WHOLE THING OUT FOR NEATNESS\r
+RJMP   ADC_DONE                ; SKIP VOLTAGE TEST FOR NOW\r
+\r
+;      ; 18DEC01 USE 5.0 VOLTS, MORE AGGRESSIVE THAN HYTECH 1000 SYSTEM\r
+;      ; IT MUST BE A BIT > 4.2 VOLTS BECAUSE OTHERWISE AVR VCC = Z180 VCC\r
+;      ;CPI    ATOD,137                ; 256*0.5*4.5/4.2\r
+;      CPI     ATOD,152                ; 256*0.5*5.0/4.2\r
+;      ;CPI    ATOD,168                ; 256*0.5*5.5/4.2\r
+;      BRSH    ADC_DONE\r
+;\r
+;;     ;CPI    ATOD,90                 ; 256*1.22/3.5\r
+;;     ;CPI    ATOD,79                 ; 256*1.22/4.0\r
+;;     CPI     ATOD,70                 ; 256*1.22/4.5\r
+;;     BRLO    ADC_DONE\r
+;\r
+;      ; 18DEC01 VSWT < 5.0 VOLTS, RESET MAIN PROCESSOR IMMEDIATELY\r
+;      LDI     E,$FF\r
+;      STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+;\r
+;      LDI     E,0\r
+;      OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+;\r
+;      CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+;\r
+;      LDI     E,$FF\r
+;      LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+\r
+ADC_PULSE:\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+\r
+ADC_DONE:\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      LDI     E,$45                   ; START MEASURING BANDGAP\r
+;      SBRS    FLAGS,5\r
+       LDI     E,$04                   ; START MEASURING LM385\r
+       SBRS    FLAGS,4\r
+       LDI     E,$05                   ; START MEASURING -5V GENERATOR\r
+       OUT     ADMUX,E\r
+       LDI     E,$DE\r
+       OUT     ADCSR,E                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 5\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLTS_AT_A5:\r
+;      ;OUT    PORTC,M16U1     ; res in byte 2(ignore ls,byte),volts pin 5\r
+;      MOV     A,B             ; get saved VSWT\r
+;      SUB     A,M16U1         ; voltage 47K = VSWT-Voltage at pin 35\r
+;      MOV     D,A             ; which is 1/3 of total supply ie +V+(-V)\r
+;      ADD     A,D\r
+;      ADD     A,D             ; TOTAL SUPPLY\r
+;      SUB     A,B             ; TOTAL SUPPLY-VSWT=NEG SUPPLY\r
+;DIAG_NEG:\r
+;      ;OUT    PORTC,A\r
+;\r
+;      LDI     A,4\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;ADC_DONE:\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+\r
+;VSWT: ;OUT    PORTC,ATOD      ; count value for 2.5 V ref\r
+;      LDI     A,$FF\r
+;      MOV     DD16UH,A        ; divide by full scale ie VSWT\r
+;      SUB     DD16UL,DD16UL   ; clear low reg\r
+;      SUB     DV16UH,DV16UH   ; clear high reg divisor\r
+;      MOV     DV16UL,ATOD     ; use ATOD value as divisor\r
+;      ;OUT    PORTC,ATOD\r
+;      RCALL   DIVIDE          ; ***** NOTE AN FF RESULT IS NO INPUT *******\r
+;      MOV     MC16UH,DRES16UH ; load multiplicand high from result high\r
+;      MOV     MC16UL,DRES16UL ; load multiplicand low from result low\r
+;      SUB     MP16UH,MP16UH   ; clear high byte in multiplier reg\r
+;       LDI     A,25\r
+;       MOV     MP16UL,A        ; mult by zener ref voltage (2.5V)\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLT_VSWT:\r
+;xi:\r
+;      LDS     A,VSWTS         ; previous value of VSWT\r
+;      MOV     B,MP16UL        ; new value of VSWT\r
+;      ;RCALL  SMOOTH\r
+;      STS     VSWTS,B\r
+;      LDS     B,VSWTS\r
+;\r
+;      ;OUT    PORTC,B;M16U1   ; VSWT IN 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;\r
+;      ;STS    VSWTS,B         ; SAVE NEW SMOOTHED VALUE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      MOV     B,M16U1         ; save copy of VSWT for neg 5V routine\r
+;      MOV     DD16UH,M16U1\r
+;      SUB     DD16UL,DD16UL\r
+;      LDI     A,255           ; calculate the atod volts per division\r
+;      MOV     DV16UL,A\r
+;      SUB     DV16UH,DV16UH\r
+;      RCALL   DIVIDE          ; result to be found in dres high & low\r
+;\r
+;      LDI     A,3\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;VCHG:\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 37 (1/3 VCHG)\r
+;      RCALL   MULTIPLY\r
+;      MOV     A,M16U1\r
+;      ADD     M16U1,A         ; B\C A3 IS 1/3 VCHG\r
+;      ADD     M16U1,A\r
+;DIAG_VOLT_VHG:\r
+;      ;OUT    PORTC,M16U1     ; REUSULT 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      LDI     A,5\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VSWT\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;;***************************************************************************\r
+;;*\r
+;;* "div16u" - 16/16 Bit Unsigned Division\r
+;;*\r
+;;* This subroutine divides the two 16-bit numbers\r
+;;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).\r
+;;* The result is placed in "dres16uH:dres16uL" and the remainder in\r
+;;* "drem16uH:drem16uL".\r
+;;*\r
+;;* Number of words    :19\r
+;;* Number of cycles   :235/251 (Min/Max)\r
+;;* Low registers used :2 (drem16uL,drem16uH)\r
+;;* High registers used  :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,\r
+;;*                        dcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;divide:\r
+;div16u:       clr     drem16uL        ;clear remainder Low byte\r
+;      sub     drem16uH,drem16uH       ;clear remainder High byte and carry\r
+;      ldi     counter,17      ;init loop counter\r
+;d16u_1:       rol     dd16uL          ;shift left dividend\r
+;      rol     dd16uH\r
+;      dec     counter         ;decrement counter\r
+;      brne    d16u_2          ;if done\r
+;      ret                     ;    return\r
+;d16u_2:       rol     drem16uL        ;shift dividend into remainder\r
+;      rol     drem16uH\r
+;      sub     drem16uL,dv16uL ;remainder = remainder - divisor\r
+;      sbc     drem16uH,dv16uH ;\r
+;      brcc    d16u_3          ;if result negative\r
+;      add     drem16uL,dv16uL ;    restore remainder\r
+;      adc     drem16uH,dv16uH\r
+;      clc                     ;    clear carry to be shifted into result\r
+;      rjmp    d16u_1          ;else\r
+;d16u_3:       sec                     ;    set carry to be shifted into result\r
+;      rjmp    d16u_1\r
+;\r
+;;********* 16 X 16 multiplication routine from app note avr200 *************\r
+;;*\r
+;;* "mpy16u" - 16x16 Bit Unsigned Multiplication\r
+;;*\r
+;;* This subroutine multiplies the two 16-bit register variables\r
+;;* mp16uH:mp16uL and mc16uH:mc16uL.\r
+;;* The result is placed in m16u3:m16u2:m16u1:m16u0.\r
+;;*\r
+;;* Number of words    :14 + return\r
+;;* Number of cycles   :153 + return\r
+;;* Low registers used :None\r
+;;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,\r
+;;*                          m16u3,mcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;multiply:\r
+;mpy16u:       clr     m16u3           ;clear high byte of result\r
+;      sub     m16u2,m16u2     ;clear result byte 2 and carry\r
+;      clr     m16u2\r
+;      ldi     counter,16      ;init loop counter\r
+;      lsr     mp16uH\r
+;      ror     mp16uL\r
+;\r
+;m16u_1:       brcc    noad8           ;if bit 0 of multiplier set\r
+;      add     m16u2,mc16uL    ;add multiplicand Low to byte 2 of res\r
+;      adc     m16u3,mc16uH    ;add multiplicand high to byte 3 of res\r
+;noad8:        ror     m16u3           ;shift right result byte 3\r
+;      ror     m16u2           ;rotate right result byte 2\r
+;      ror     m16u1           ;rotate result byte 1 and multiplier High\r
+;      ror     m16u0           ;rotate result byte 0 and multiplier Low\r
+;      dec     counter         ;decrement loop counter\r
+;      brne    m16u_1          ;if not done, loop more\r
+;      ret\r
+;;************************* Exponential smoothing routine ********************\r
+;;Receives : Previous value in A\r
+;;       : New value in B\r
+;;Passes   : Smoothed result back in B reg\r
+;;Uses   : d reg\r
+;\r
+;Smooth:\r
+;      mov     d,a             ; save a copy of previous value\r
+;      lsr     a\r
+;      lsr     a\r
+;      lsr     b\r
+;      lsr     b               ; prev.ave  -  prev.ave  +  new.data\r
+;      sub     d,a             ;              --------     --------\r
+;      add     b,d             ;                  n            n\r
+;      ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MESSAGE_0:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',0,128,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_1:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',240,64,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_2:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','0','0','0',0\r
+\r
+MESSAGE_3:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'W','P','O','3','0',' ','V','5'\r
+\r
+MESSAGE_4:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','D',' ','C','O','M','M','A','N','D',0\r
+\r
+MESSAGE_5:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','T','T','E','R','Y',' ','L','O','W',0\r
+\r
+MESSAGE_6:\r
+       .DB     $1B,'M','0',0\r
+\r
+MESSAGE_7:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','5','0','0',0\r
+\r
+MESSAGE_8:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'S','T','A','C','K',' ','O','V','E','R','F','L','O','W'\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+;IF LARGE (THE ORIGINAL WPO15V1.HEX SETTINGS)\r
+;      .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+;      ; FSTRT = 0 FOR 1.1 MS R/C STARTUP DELAY\r
+;      ;.DW    $ACBE                   ; WRITE FUSE BITS COMMAND\r
+;; BIGBODGE (NOT REALLY - JUST IN CASE TYPE OF CHANGE)\r
+;;       FSTRT = 1 FOR 16 MS R/C STARTUP DELAY\r
+;        .DW     $ACBF                   ; WRITE FUSE BITS COMMAND\r
+;ELSE\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 100 FOR 16K * 11MHZ STARTUP DELAY (NO R/C STARTUP DELAY)\r
+\r
+       .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACBC                   ; WRITE FUSE BITS COMMAND\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/WPOV3.HEX b/src/avr/WPOV3.HEX
new file mode 100644 (file)
index 0000000..81259fa
--- /dev/null
@@ -0,0 +1,146 @@
+:020000020000FC\r
+:020000000BC033\r
+:06000C00F7C118C37EC11C\r
+:10001600DAC30FED0DBF00E808B9A8950FE001BDE2\r
+:100026000AE50093CB0000E00DB90AB9C59ABC9A5F\r
+:100036008D9A8E9A929A939AC19AB99AC098B898BC\r
+:1000460097988F9A94988C9AAA98A29A9198899A36\r
+:1000560007E01DD106E01BD105E019D104E017D158\r
+:1000660001E015D100E013D107E109B908E10AB9A9\r
+:100076003CD10AEA0CB90CB93BD1949A39D194987F\r
+:1000860037D1949A0027E0E6FF2701930193019365\r
+:10009600EEEA019301930193019301930193019376\r
+:1000A60001930093AB000093C9000093AC0000934A\r
+:1000B600AD0000E2019300270193019301930193A0\r
+:1000C60001930193019301930FE00193019301932F\r
+:1000D6000193019301930193008300E00093C7000D\r
+:1000E60004E00093C8004427662711248824992435\r
+:1000F600AA2455246624772401E00093A3000093E4\r
+:10010600A4000093A5000093A6000093A700009307\r
+:10011600A8000093CA0000E00093A9000093AA007B\r
+:100126000CEF202E0FEF402E01E0B02E03BF02E0B1\r
+:1001360009BF0EB10FB108EE0DB900E00DBD0CBD43\r
+:100146000BBD0ABD01EC0FBD01E00EBD05E007B910\r
+:100156000EED06B9789402E01EE1E8E4F8E0A8D0D6\r
+:100166000091CB000A3509F066C041FD6FC043FD22\r
+:100176007AC040FFF5CF0091CA00033041F002304B\r
+:1001860091F002E01FE0E4E8F8E092D006C002E059\r
+:100196001FE0E4ECF8E08CD000C003E01EE1E6E6E8\r
+:1001A600F8E086D00FC002E01CE0E4E9F8E080D079\r
+:1001B60003E01EE1E8E4F8E07BD003E01CE0E4E9BC\r
+:1001C600F8E076D01CD00B3109F0FCCF18D00434FF\r
+:1001D60009F0F8CF14D0037039F0013039F002304D\r
+:1001E60039F0033039F0EECF969A05C0969803C0E1\r
+:1001F600959A01C0959810E3100FE4CF789400917A\r
+:10020600CB000A35C1F441FD21C043FD2CC0F89452\r
+:100216009920A1F30091A300093081F7EF93FF9392\r
+:10022600E82DED59FF2700819A948394EFE18E2201\r
+:10023600FF91EF91189502E01EE1E8E4F8E038D06E\r
+:1002460002E01FE0E4EDF8E033D00AC002E01EE170\r
+:10025600E8E4F8E02DD002E01FE0E0EAF8E028D07C\r
+:1002660043FD01C0FDCF02E01EE1E8E4F8E020D046\r
+:1002760002E01FE0E0EBF8E01BD00AEF39D00A9568\r
+:10028600E9F702E013E0E0ECF8E012D0F6CFAA9826\r
+:1002960002FF919802FD919A2BD001FF919801FDE2\r
+:1002A600919A28D000FF919800FD919AAA9A24C0AD\r
+:1002B60078940000F8949920D9F7AA20C9F70093FA\r
+:1002C600A400C895002D04D031961A95D1F718953B\r
+:1002D600EF93FF93E92DEA0DE80DEF71ED59FF2736\r
+:1002E6000083FF91EF91A3940895E0EFFAE006C032\r
+:1002F600E8EC03C0E4E101C0E2E0F0E020E02A958A\r
+:10030600F1F73197E1F70895FFB666FD22C03CB1DB\r
+:100316003125F2F0312552F0EF93FF93EDEAF0919B\r
+:10032600A300EF0FFF273083FF91EF91131608F01C\r
+:10033600132E6F7E6064312D3F7741F011202AF134\r
+:1003460057986F7D3FEF232E606153C03CEF4DC041\r
+:100356004BC03091A600313019F033E03093AA003B\r
+:100366003CB1EF93FF93E62DE70DE50DEF71ED57E9\r
+:10037600FF273083E091A500F091A600EF1711F456\r
+:10038600639401C07394FF91EF913FEF232E1A946B\r
+:1003960072F53091A600323030EF09F03AEF232E95\r
+:1003A600606127C033E03093A900EF93FF93EDEA35\r
+:1003B6007091A300E70FFF2730813A953083E82D2F\r
+:1003C600ED59FF273081FF91EF913CB93695330BFC\r
+:1003D6003A95723009F430EF232E9A9483943FE1D4\r
+:1003E60083221A9431F403C03AEF232E6F7E579876\r
+:1003F6006F79FFBE1895FFB630E032BF32E038BFE6\r
+:10040600BA94B1F438E0B32E3091AC007091AD00DF\r
+:10041600732B49F031503093AC003091AD00304031\r
+:100426003093AD0059F0442019F0439409F4B89A7A\r
+:10043600222011F0239419F1FFBE1895EACD67FD2D\r
+:1004460012C0890C3FE1832299249092A900EF9370\r
+:10045600FF93EDEAF091A300EF0FFF2730E2308320\r
+:10046600FF91EF9112C0EF93FF93EEEBF091A60090\r
+:10047600EF0FFF273FE03083FF91EF9106C065FD48\r
+:10048600DECF66FD8FCF64FD8CC03EEE232E30910D\r
+:10049600AB00332359F03A953093AB0031F0AA986C\r
+:1004A6009198899A30E03AB9A4CFB3CD579837E1FD\r
+:1004B60039B93091AA00332329F43091A90039299A\r
+:1004C6003A2939F43091A7003A9549F03093A700BC\r
+:1004D60037C03091A8003A9591F03093A80030E1EA\r
+:1004E6003093A70099203091A30041F4AA2041F04F\r
+:1004F6009A2CAA243091A4003093A300393001F13C\r
+:100506006F779920B9F4AA2059F43091A9003A9549\r
+:1005160042F43091A3003395393048F031E007C0FA\r
+:1005260033E03093A9009A2CAA243091A40030938A\r
+:10053600A30033C033E03093A9003091A3002DC04F\r
+:1005460030E13093A80060683091A600772029F545\r
+:100556007091AA00772321F07A957093AA001DC0A6\r
+:10056600EF93FF93E7EBFF273191E093A60071919C\r
+:1005760073171AF4372FE093A6007FEBE713F7CF34\r
+:10058600E091A600379670813897370F30833E2F5B\r
+:10059600365BFF91EF913093A6003CB960616F79AD\r
+:1005A60028CF30E039B967FD13C07091A3007230CF\r
+:1005B60030EF09F03AEF232E392D723011F07730F3\r
+:1005C60031F4332321F0305108F430E0339513C071\r
+:1005D6007091A600723030EF09F03AEF232E30E228\r
+:1005E60036193719773031F4332321F0305108F4B6\r
+:1005F60030E0339530683CB9132E579A3CB16062AF\r
+:10060600F8CE732F3F70A9F1393098F5729577704F\r
+:10061600743050F07395763038F07395783020F05A\r
+:100626007D5F7C3008F07FE0EF93FF93EEEBE30F06\r
+:10063600FF277083FF91EF91C2C0FFB6B8983FB114\r
+:1006460062FD8FC060FD5FC061FD58C03A3098F111\r
+:100656003038B8F299F0313899F03139A1F03239A1\r
+:1006660091F0333981F0353A99F03A3AE1F0353C78\r
+:10067600D9F030E03DB944244260A3C097989FC0AA\r
+:100686004160979A9CC030593093CA00416097C028\r
+:100696003FEF3093AB0030E03DB994983FEF70E008\r
+:1006A6007BBD3ABD8CC0B5CC38EE3093AC0033E0A0\r
+:1006B6003093AD0084C0332379F46860662049F432\r
+:1006C6007720C1F0672C77243090A6003092A500E1\r
+:1006D60012C03090A5000FC0677F332EAA2021F0EC\r
+:1006E6003091A400331531F433E03093A9003092F1\r
+:1006F600A40001C033243FB8626061C06D7F33201F\r
+:1007060009F061605CC0332E6E7F332063FF05C045\r
+:100716005AF5362D30681FC051C0F2F3EF93FF93A0\r
+:10072600EDEAF091A400EF0FFF273081E091A300DE\r
+:10073600F091A400EF1731F0E0E2E9193E1730F02E\r
+:100746003E2F04C0303208F030E239193A19FF91D1\r
+:10075600EF910AF43FE7331508F4332E3FB964608E\r
+:100766002EC033208AF43A944AF56160EF93FF93E2\r
+:10077600E52DED57FF2730813FB9FF91EF916A9440\r
+:1007860053943FE153221BC060FF14C0EF93FF93C5\r
+:10079600E92DEA0DE80DEF71ED59FF273083E09161\r
+:1007A600A300F091A400EF1711F4939401C0A39451\r
+:1007B600FF91EF913A9412F0616001C06B7F3FEFB9\r
+:1007C600432EFFBE1895FFB6A89534B1532F35B109\r
+:1007D600379557953795579544FD12C0406130912E\r
+:1007E600AB00332331F530E070E05C5100F130E6C8\r
+:1007F60070E05038E0F45695352F5695350F17C0F2\r
+:100806004F7E5093C900583A30E074E058F4309166\r
+:10081600C7007091C8003150704021F430E03DB9F6\r
+:10082600442448603093C7007093C80002C07BBD63\r
+:100836003ABD34E044FF35E037B93EED36B9FFBE88\r
+:1008460018951B44301B47301B50311B45301B4B42\r
+:100856001B301B2F301B5300001B4E00801B4531E5\r
+:100866001B44301B47301B50311B45301B4B1B3084\r
+:100876001B2F301B5300001B4EF0401B45311B53F2\r
+:10088600100D4859544543482031303030001B5331\r
+:10089600100D57504F33302056351B53100D424123\r
+:1008A6004420434F4D4D414E44001B53100D4241D1\r
+:1008B6005454455259204C4F57001B4D30001B5382\r
+:1008C600100D4859544543482031353030001B53EC\r
+:1008D600100D535441434B204F564552464C4F57EB\r
+:042000000041BCAC33\r
+:00000001FF\r
diff --git a/src/avr/a.bat b/src/avr/a.bat
new file mode 100644 (file)
index 0000000..b19434e
--- /dev/null
@@ -0,0 +1 @@
+tavrasm -a %1.asm -e %1.lst\r
diff --git a/src/avr/a_avra.bat b/src/avr/a_avra.bat
new file mode 100644 (file)
index 0000000..ab516ae
--- /dev/null
@@ -0,0 +1 @@
+avra -fI %1.asm\r
diff --git a/src/avr/a_orig.bat b/src/avr/a_orig.bat
new file mode 100644 (file)
index 0000000..479cc0e
--- /dev/null
@@ -0,0 +1 @@
+AVRASM %1.ASM %1.LST %1.HEX\r
diff --git a/src/avr/aa.bat b/src/avr/aa.bat
new file mode 100644 (file)
index 0000000..24781e5
--- /dev/null
@@ -0,0 +1 @@
+c:\bin\diff --ignore-case --ignore-file-name-case --ignore-tab-expansion --ignore-space-change --ignore-blank-lines --text --unified --minimal --new-file --speed-large-files %1.asm %2.asm > %1-%2.diff
\ No newline at end of file
diff --git a/src/avr/api.inc b/src/avr/api.inc
new file mode 100644 (file)
index 0000000..92a8af6
--- /dev/null
@@ -0,0 +1,270 @@
+; API.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND TASK\r
+\r
+.MACRO INT_HANDLERS\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+.ENDMACRO\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$90                   ; ENABLE RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+       ;SBI    UCR,TXEN                ; TX ENABLE\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+       CLR     API_WATCHDOG\r
+.ENDMACRO\r
+\r
+.MACRO MRX_WAIT\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       DEC     RX_COUNT\r
+       INC     RX_PTR\r
+       LDI     YL,RX_SIZE-1\r
+       AND     RX_PTR,YL\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       PUSH    A\r
+TX_WAIT_LOOP:\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       BRSH    TX_WAIT_LOOP\r
+       POP     A\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+ IN YH,SREG\r
+       CLI\r
+       MOV     YL,TX_COUNT\r
+       ADD     YL,TX_PTR\r
+ OUT SREG,YH   ;SEI\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       INC     TX_COUNT\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND TASK\r
+\r
+.MACRO MTX_EMPTY\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      F,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,F\r
+\r
+       DEC     TX_COUNT\r
+       INC     TX_PTR\r
+       LDI     F,TX_SIZE-1\r
+       AND     TX_PTR,F\r
+\r
+       DEC     API_REMAIN              ; MORE TO SEND?\r
+       BRMI    GO_API_DONE1            ; YES, AWAIT NEXT TX EMPTY INTERRUPT\r
+       RJMP    API_REINIT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+GO_API_DONE1:\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       IN      F,UDR\r
+       SBIC    USR,FE                  ; BREAK DETECTED?\r
+       RJMP    API_FRAMING_ERROR\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_RX_DATA             ; WITH F = CHARACTER\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_DATA_SIZE           ; WITH F = CHARACTER\r
+\r
+       ; RECEIVED 4800 BPS ADDRESS COMMAND\r
+       CPI     F,API_ADDRESS           ; CHARACTER = MY ADDRESS?\r
+       BRNE    API_ADDRESS_DONE\r
+\r
+       LDI     F,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       SBI     UCR,TXEN                ; ENABLE UART TX AND TXD PIN\r
+\r
+       LDI     F,1<<APISIZE\r
+       OR      API_STATE,F             ; SAY WE ARE EXPECTING DATA SIZE CMD\r
+\r
+API_ADDRESS_DONE:\r
+       RJMP    API_DONE\r
+\r
+API_DATA_SIZE:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     API_REMAIN,F\r
+\r
+       LDI     F,RX_SIZE\r
+       SUB     F,RX_COUNT              ; F = AVAILABLE RX BUFFER\r
+       BRPL    RX_RESPOND_F\r
+       LDI     F,$7F                   ; F = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+RX_RESPOND_F:\r
+       TST     API_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    RX_RESPOND              ; USE F IF WE NEED TO RECEIVE\r
+\r
+       MOV     F,TX_COUNT\r
+       ORI     F,$80                   ; F = QUEUED TX CHARACTERS\r
+\r
+RX_RESPOND:\r
+       ; SEND DATA SIZE RESPONSE\r
+       ; API_REMAIN = HOST MAX, F = OUR MAX\r
+       OUT     UDR,F                   ; SEND DATA SIZE RESPONSE\r
+\r
+       CP      F,API_REMAIN\r
+       BRSH    RX_RESPOND_OK\r
+       MOV     API_REMAIN,F            ; API_REMAIN = LESSER OUR / HOST MAX\r
+\r
+RX_RESPOND_OK:\r
+       MOV     F,API_REMAIN\r
+       ANDI    F,$7F                   ; NULL REQUEST?\r
+       BREQ    API_NULL                ; YES, REVERT TO 4800 WHEN TX COMPLETE\r
+                                       ; NO, AWAIT RX COMPLETE / TX EMPTY INT\r
+       LDI     F,1<<APIDATA | 1<<APISIZE\r
+       OR      API_STATE,F             ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       DEC     API_REMAIN              ; NUDGE FOR BRPL / BRMI ALGORITHM\r
+       BRPL    API_DONE                ; WE WILL RECEIVE, NO FURTHER ACTION\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; IN CASE NO DATA TRANSFERRED\r
+\r
+       SBI     UCR,TXCIE               ; ENABLE UART TX COMPLETE INTERRUPT\r
+       SBI     USR,TXC                 ; CLEAR UART TX COMPLETE PENDING BIT\r
+       RJMP    API_DONE\r
+\r
+API_RX_DATA:\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+; OUT UDR,API_REMAIN\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     RX_COUNT\r
+\r
+       DEC     API_REMAIN              ; MORE TO RECEIVE?\r
+       BRPL    API_DONE                ; YES, AWAIT NEXT RX COMPLETE INTERRUPT\r
+       RJMP    API_REVERT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       IN      SR,SREG\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_TIMEOUT_ERROR\r
+       PUSH    F\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_FRAMING_ERROR\r
+       CBI     UCR,TXEN                ; DISABLE UART TX AND TXD PIN\r
+       LDI     F,API_RATE_SLOW         ; 4800 BPS IF EXPECTING ADDRESS COMMAND\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS COMMAND\r
+       CLR     API_WATCHDOG            ; NO ACTION, JUST WAIT TO RECEIVE ADDR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REINIT\r
+       CBI     UCR,UDRIE               ; DISABLE UART TX EMPTY INTERRUPT\r
+       CBI     UCR,TXCIE               ; DISABLE UART TX COMPLETE INTERRRUPT\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      F,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+       LDI     F,~(1<<APIDATA)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS / DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     F\r
+       OUT     SREG,SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMER INTERRUPT\r
+\r
+.MACRO MAPI_TIMER\r
+       TST     API_WATCHDOG\r
+       BREQ    API_OKAY\r
+       INC     API_WATCHDOG            ; SEE IF API BUS WAS LEFT HANGING\r
+       BRNE    API_OKAY\r
+       RJMP    API_TIMEOUT_ERROR       ; IF SO THEN RESET TO GET NEXT COMMAND\r
+API_OKAY:                              ; OTHERWISE RETURN FROM INTERRUPT\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/apicf.inc b/src/avr/apicf.inc
new file mode 100644 (file)
index 0000000..9c3e7a8
--- /dev/null
@@ -0,0 +1,281 @@
+; APICF.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND TASK\r
+\r
+.MACRO INT_HANDLERS\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+.ENDMACRO\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$90                   ; ENABLE RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+       ;SBI    UCR,TXEN                ; TX ENABLE\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+       CLR     API_WATCHDOG\r
+.ENDMACRO\r
+\r
+.MACRO MRX_WAIT\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       DEC     RX_COUNT\r
+       INC     RX_PTR\r
+       LDI     YL,RX_SIZE-1\r
+       AND     RX_PTR,YL\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       PUSH    A\r
+TX_WAIT_LOOP:\r
+       WDR ; 10OCT02 IT'S THE ONLY DIFFERENCE BETWEEN APICS.INC AND API.INC\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       BRSH    TX_WAIT_LOOP\r
+       POP     A\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+ IN YH,SREG\r
+       CLI\r
+       MOV     YL,TX_COUNT\r
+       ADD     YL,TX_PTR\r
+ OUT SREG,YH   ;SEI\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       INC     TX_COUNT\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND TASK\r
+\r
+.MACRO MTX_EMPTY\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      F,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,F\r
+\r
+       DEC     TX_COUNT\r
+       INC     TX_PTR\r
+       LDI     F,TX_SIZE-1\r
+       AND     TX_PTR,F\r
+\r
+       DEC     API_REMAIN              ; MORE TO SEND?\r
+       BRMI    GO_API_DONE1            ; YES, AWAIT NEXT TX EMPTY INTERRUPT\r
+       RJMP    API_REINIT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+GO_API_DONE1:\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       IN      F,UDR\r
+       SBIC    USR,FE                  ; BREAK DETECTED?\r
+       RJMP    API_FRAMING_ERROR\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_RX_DATA             ; WITH F = CHARACTER\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_DATA_SIZE           ; WITH F = CHARACTER\r
+\r
+       ; RECEIVED 4800 BPS ADDRESS COMMAND\r
+       CPI     F,API_ADDRESS           ; CHARACTER = MY ADDRESS?\r
+       BRNE    API_ADDRESS_DONE\r
+\r
+       LDI     F,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       SBI     UCR,TXEN                ; ENABLE UART TX AND TXD PIN\r
+\r
+       LDI     F,1<<APISIZE\r
+       OR      API_STATE,F             ; SAY WE ARE EXPECTING DATA SIZE CMD\r
+\r
+API_ADDRESS_DONE:\r
+       RJMP    API_DONE\r
+\r
+API_DATA_SIZE:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     API_REMAIN,F\r
+\r
+       LDI     F,RX_SIZE\r
+       SUB     F,RX_COUNT              ; F = AVAILABLE RX BUFFER\r
+; breq RX_RESPOND_F\r
+; ldi f,1 ; always report only one character capacity, to keep transaction open\r
+       BRPL    RX_RESPOND_F\r
+       LDI     F,$7F                   ; F = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+RX_RESPOND_F:\r
+       TST     API_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    RX_RESPOND              ; USE F IF WE NEED TO RECEIVE\r
+\r
+       MOV     F,TX_COUNT\r
+ tst f\r
+ breq tx_f ; can't transmit anything\r
+ subi f,TX_SIZE/2\r
+ brsh tx_f_p1 ; got a lot to transmit, but pretend we have a lesser amount\r
+ ldi f,0 ; not much to transmit, so start sending one character at a time\r
+tx_f_p1:\r
+ inc f ; so that we transmit at least one byte\r
+tx_f:\r
+       ORI     F,$80                   ; F = QUEUED TX CHARACTERS\r
+\r
+RX_RESPOND:\r
+       ; SEND DATA SIZE RESPONSE\r
+       ; API_REMAIN = HOST MAX, F = OUR MAX\r
+       OUT     UDR,F                   ; SEND DATA SIZE RESPONSE\r
+\r
+       CP      F,API_REMAIN\r
+       BRSH    RX_RESPOND_OK\r
+       MOV     API_REMAIN,F            ; API_REMAIN = LESSER OUR / HOST MAX\r
+\r
+RX_RESPOND_OK:\r
+       MOV     F,API_REMAIN\r
+       ANDI    F,$7F                   ; NULL REQUEST?\r
+       BREQ    API_NULL                ; YES, REVERT TO 4800 WHEN TX COMPLETE\r
+                                       ; NO, AWAIT RX COMPLETE / TX EMPTY INT\r
+       LDI     F,1<<APIDATA | 1<<APISIZE\r
+       OR      API_STATE,F             ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       DEC     API_REMAIN              ; NUDGE FOR BRPL / BRMI ALGORITHM\r
+       BRPL    API_DONE                ; WE WILL RECEIVE, NO FURTHER ACTION\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; IN CASE NO DATA TRANSFERRED\r
+\r
+       SBI     UCR,TXCIE               ; ENABLE UART TX COMPLETE INTERRUPT\r
+       SBI     USR,TXC                 ; CLEAR UART TX COMPLETE PENDING BIT\r
+       RJMP    API_DONE\r
+\r
+API_RX_DATA:\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+; OUT UDR,API_REMAIN\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     RX_COUNT\r
+\r
+       DEC     API_REMAIN              ; MORE TO RECEIVE?\r
+       BRPL    API_DONE                ; YES, AWAIT NEXT RX COMPLETE INTERRUPT\r
+       RJMP    API_REVERT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       IN      SR,SREG\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_TIMEOUT_ERROR\r
+       PUSH    F\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_FRAMING_ERROR\r
+       CBI     UCR,TXEN                ; DISABLE UART TX AND TXD PIN\r
+       LDI     F,API_RATE_SLOW         ; 4800 BPS IF EXPECTING ADDRESS COMMAND\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS COMMAND\r
+       CLR     API_WATCHDOG            ; NO ACTION, JUST WAIT TO RECEIVE ADDR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REINIT\r
+       CBI     UCR,UDRIE               ; DISABLE UART TX EMPTY INTERRUPT\r
+       CBI     UCR,TXCIE               ; DISABLE UART TX COMPLETE INTERRRUPT\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      F,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+       LDI     F,~(1<<APIDATA)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS / DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     F\r
+       OUT     SREG,SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMER INTERRUPT\r
+\r
+.MACRO MAPI_TIMER\r
+       TST     API_WATCHDOG\r
+       BREQ    API_OKAY\r
+       INC     API_WATCHDOG            ; SEE IF API BUS WAS LEFT HANGING\r
+       BRNE    API_OKAY\r
+       RJMP    API_TIMEOUT_ERROR       ; IF SO THEN RESET TO GET NEXT COMMAND\r
+API_OKAY:                              ; OTHERWISE RETURN FROM INTERRUPT\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/apics.inc b/src/avr/apics.inc
new file mode 100644 (file)
index 0000000..72e1d49
--- /dev/null
@@ -0,0 +1,271 @@
+; APICS.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND TASK\r
+\r
+.MACRO INT_HANDLERS\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+.ENDMACRO\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$90                   ; ENABLE RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+       ;SBI    UCR,TXEN                ; TX ENABLE\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+       CLR     API_WATCHDOG\r
+.ENDMACRO\r
+\r
+.MACRO MRX_WAIT\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       DEC     RX_COUNT\r
+       INC     RX_PTR\r
+       LDI     YL,RX_SIZE-1\r
+       AND     RX_PTR,YL\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       PUSH    A\r
+TX_WAIT_LOOP:\r
+       WDR ; 10OCT02 IT'S THE ONLY DIFFERENCE BETWEEN APICS.INC AND API.INC\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       BRSH    TX_WAIT_LOOP\r
+       POP     A\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+ IN YH,SREG\r
+       CLI\r
+       MOV     YL,TX_COUNT\r
+       ADD     YL,TX_PTR\r
+ OUT SREG,YH   ;SEI\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       INC     TX_COUNT\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND TASK\r
+\r
+.MACRO MTX_EMPTY\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      F,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,F\r
+\r
+       DEC     TX_COUNT\r
+       INC     TX_PTR\r
+       LDI     F,TX_SIZE-1\r
+       AND     TX_PTR,F\r
+\r
+       DEC     API_REMAIN              ; MORE TO SEND?\r
+       BRMI    GO_API_DONE1            ; YES, AWAIT NEXT TX EMPTY INTERRUPT\r
+       RJMP    API_REINIT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+GO_API_DONE1:\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       IN      F,UDR\r
+       SBIC    USR,FE                  ; BREAK DETECTED?\r
+       RJMP    API_FRAMING_ERROR\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_RX_DATA             ; WITH F = CHARACTER\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_DATA_SIZE           ; WITH F = CHARACTER\r
+\r
+       ; RECEIVED 4800 BPS ADDRESS COMMAND\r
+       CPI     F,API_ADDRESS           ; CHARACTER = MY ADDRESS?\r
+       BRNE    API_ADDRESS_DONE\r
+\r
+       LDI     F,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       SBI     UCR,TXEN                ; ENABLE UART TX AND TXD PIN\r
+\r
+       LDI     F,1<<APISIZE\r
+       OR      API_STATE,F             ; SAY WE ARE EXPECTING DATA SIZE CMD\r
+\r
+API_ADDRESS_DONE:\r
+       RJMP    API_DONE\r
+\r
+API_DATA_SIZE:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     API_REMAIN,F\r
+\r
+       LDI     F,RX_SIZE\r
+       SUB     F,RX_COUNT              ; F = AVAILABLE RX BUFFER\r
+       BRPL    RX_RESPOND_F\r
+       LDI     F,$7F                   ; F = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+RX_RESPOND_F:\r
+       TST     API_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    RX_RESPOND              ; USE F IF WE NEED TO RECEIVE\r
+\r
+       MOV     F,TX_COUNT\r
+       ORI     F,$80                   ; F = QUEUED TX CHARACTERS\r
+\r
+RX_RESPOND:\r
+       ; SEND DATA SIZE RESPONSE\r
+       ; API_REMAIN = HOST MAX, F = OUR MAX\r
+       OUT     UDR,F                   ; SEND DATA SIZE RESPONSE\r
+\r
+       CP      F,API_REMAIN\r
+       BRSH    RX_RESPOND_OK\r
+       MOV     API_REMAIN,F            ; API_REMAIN = LESSER OUR / HOST MAX\r
+\r
+RX_RESPOND_OK:\r
+       MOV     F,API_REMAIN\r
+       ANDI    F,$7F                   ; NULL REQUEST?\r
+       BREQ    API_NULL                ; YES, REVERT TO 4800 WHEN TX COMPLETE\r
+                                       ; NO, AWAIT RX COMPLETE / TX EMPTY INT\r
+       LDI     F,1<<APIDATA | 1<<APISIZE\r
+       OR      API_STATE,F             ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       DEC     API_REMAIN              ; NUDGE FOR BRPL / BRMI ALGORITHM\r
+       BRPL    API_DONE                ; WE WILL RECEIVE, NO FURTHER ACTION\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; IN CASE NO DATA TRANSFERRED\r
+\r
+       SBI     UCR,TXCIE               ; ENABLE UART TX COMPLETE INTERRUPT\r
+       SBI     USR,TXC                 ; CLEAR UART TX COMPLETE PENDING BIT\r
+       RJMP    API_DONE\r
+\r
+API_RX_DATA:\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+; OUT UDR,API_REMAIN\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     RX_COUNT\r
+\r
+       DEC     API_REMAIN              ; MORE TO RECEIVE?\r
+       BRPL    API_DONE                ; YES, AWAIT NEXT RX COMPLETE INTERRUPT\r
+       RJMP    API_REVERT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       IN      SR,SREG\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_TIMEOUT_ERROR\r
+       PUSH    F\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_FRAMING_ERROR\r
+       CBI     UCR,TXEN                ; DISABLE UART TX AND TXD PIN\r
+       LDI     F,API_RATE_SLOW         ; 4800 BPS IF EXPECTING ADDRESS COMMAND\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS COMMAND\r
+       CLR     API_WATCHDOG            ; NO ACTION, JUST WAIT TO RECEIVE ADDR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REINIT\r
+       CBI     UCR,UDRIE               ; DISABLE UART TX EMPTY INTERRUPT\r
+       CBI     UCR,TXCIE               ; DISABLE UART TX COMPLETE INTERRRUPT\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      F,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+       LDI     F,~(1<<APIDATA)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS / DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     F\r
+       OUT     SREG,SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMER INTERRUPT\r
+\r
+.MACRO MAPI_TIMER\r
+       TST     API_WATCHDOG\r
+       BREQ    API_OKAY\r
+       INC     API_WATCHDOG            ; SEE IF API BUS WAS LEFT HANGING\r
+       BRNE    API_OKAY\r
+       RJMP    API_TIMEOUT_ERROR       ; IF SO THEN RESET TO GET NEXT COMMAND\r
+API_OKAY:                              ; OTHERWISE RETURN FROM INTERRUPT\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/apilc.inc b/src/avr/apilc.inc
new file mode 100644 (file)
index 0000000..1d9c271
--- /dev/null
@@ -0,0 +1,295 @@
+; APILC.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS INITIALISATION ROUTINES\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,$05\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 0.1 MS\r
+       LDI     A,$02\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$90                   ; ENABLE RX WITH INTERRUPTS\r
+       ;LDI    A,$98\r
+       OUT     UCR,A\r
+\r
+       CLR     FLAGS\r
+\r
+       CLR     A\r
+       STS     TX_PTR,A\r
+       STS     TX_COUNT,A\r
+       STS     RX_PTR,A\r
+       STS     RX_COUNT,A\r
+       STS     API_REMAIN,A\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+.MACRO MRX_WAIT\r
+       ; REMOVED TO SAVE FLASH %\r
+       ;LDS    A,RX_COUNT\r
+       ;TST    A\r
+       ;BREQ   RX_WAIT\r
+       ; %\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       LDS     YL,RX_COUNT\r
+       DEC     YL\r
+       STS     RX_COUNT,YL\r
+       LDS     YL,RX_PTR\r
+       INC     YL\r
+       ANDI    YL,RX_SIZE-1\r
+       STS     RX_PTR,YL\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       ; REMOVED TO SAVE FLASH %\r
+       ;CP     CYC_1,E\r
+       ;BRSH   TX_CHAR_RET\r
+\r
+       ;PUSH   A\r
+       ;LDS    A,TX_COUNT\r
+       ;CPI    A,TX_SIZE\r
+       ;POP    A\r
+       ;BRSH   TX_WAIT\r
+       ; %\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       CLI\r
+       LDS     YL,TX_COUNT\r
+       LDS     YH,TX_PTR\r
+       ADD     YL,YH\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       LDS     A,TX_COUNT\r
+       INC     A\r
+       STS     TX_COUNT,A\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR_RET\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+.MACRO MTX_EMPTY\r
+       PUSH    SR\r
+       IN      SR,SREG\r
+       PUSH    A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       OUT     TCNT0,A                 ; FEED TX/RX WATCHDOG\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR T0 PENDING\r
+\r
+       PUSH    ZL\r
+       ;PUSH   ZH\r
+       LDS     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       ;CLR    ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       ;POP    ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,A\r
+\r
+       LDS     A,TX_COUNT\r
+       DEC     A\r
+       STS     TX_COUNT,A\r
+       LDS     A,TX_PTR\r
+       INC     A\r
+       ANDI    A,TX_SIZE-1\r
+       STS     TX_PTR,A\r
+\r
+       LDS     A,API_REMAIN\r
+       DEC     A                       ; MORE TO SEND?\r
+       STS     API_REMAIN,A\r
+       BRMI    GO_API_DONE             ; YES, AWAIT NEXT TX EMPTY INTERRUPT\r
+       RJMP    API_REVERT              ; NO, AWAIT NEXT ADDRESS / DATA SIZE\r
+GO_API_DONE:\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       PUSH    SR\r
+       IN      SR,SREG\r
+       PUSH    A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       OUT     TCNT0,A                 ; FEED TX/RX WATCHDOG\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR T0 PENDING\r
+\r
+       SBRC    FLAGS,APIDATA\r
+       RJMP    API_RX_DATA             ; WITH A = CHARACTER\r
+\r
+       IN      A,UDR\r
+\r
+       SBRC    FLAGS,APISIZE\r
+       RJMP    API_DATA_SIZE           ; WITH A = CHARACTER\r
+\r
+       ; RECEIVED 4800 BPS ADDRESS COMMAND\r
+       CPI     A,API_ADDRESS           ; CHARACTER = MY ADDRESS?\r
+       BRNE    GO_API_DONE\r
+\r
+       LDI     A,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       SBI     UCR,TXEN                ; ENABLE UART TX AND TXD PIN\r
+\r
+       LDI     A,1<<APISIZE\r
+       OR      FLAGS,A                 ; SAY WE ARE EXPECTING DATA SIZE CMD\r
+GO_API_DONE:\r
+       RJMP    API_DONE\r
+\r
+API_DATA_SIZE:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       STS     API_REMAIN,A\r
+       TST     A                       ; TEST TRANSFER DIRECTION\r
+       BRPL    API_RESPOND_RX\r
+\r
+;API_RESPOND_TX:\r
+       LDS     A,TX_COUNT\r
+       ORI     A,$80                   ; A = QUEUED TX CHARACTERS\r
+       RJMP    API_RESPOND\r
+\r
+API_RESPOND_RX:\r
+       LDS     A,RX_COUNT\r
+       NEG     A\r
+       SUBI    A,-RX_SIZE              ; A = AVAILABLE RX BUFFER\r
+       ; REMOVED TO SAVE FLASH %\r
+       ;BRPL   API_RESPOND\r
+       ;LDI    A,$7F                   ; A = MAXIMUM POSSIBLE TRANSFER COUNT\r
+       ; %\r
+\r
+API_RESPOND:\r
+       ; SEND DATA SIZE RESPONSE\r
+       ; API_REMAIN = HOST MAX, A = OUR MAX\r
+       OUT     UDR,A                   ; SEND DATA SIZE RESPONSE\r
+\r
+       PUSH    B\r
+       LDS     B,API_REMAIN\r
+       CP      A,B\r
+       BRSH    API_RESPOND_OK\r
+       STS     API_REMAIN,A            ; API_REMAIN = LESSER OUR / HOST MAX\r
+API_RESPOND_OK:\r
+       POP     B\r
+\r
+       LDS     A,API_REMAIN\r
+       ANDI    A,$7F                   ; NULL REQUEST?\r
+       BREQ    API_NULL                ; YES, REVERT TO 4800 WHEN TX COMPLETE\r
+                                       ; NO, AWAIT RX COMPLETE / TX EMPTY INT\r
+       LDI     A,1<<APIDATA | 1<<APISIZE\r
+       OR      FLAGS,A                 ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       LDS     A,API_REMAIN\r
+       DEC     A                       ; NUDGE FOR BRPL / BRMI ALGORITHM\r
+       STS     API_REMAIN,A\r
+       BRPL    API_DONE                ; WE WILL RECEIVE, NO FURTHER ACTION\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     A,~(1<<APISIZE)\r
+       AND     FLAGS,A                 ; IN CASE NO DATA TRANSFERRED\r
+\r
+       SBI     UCR,TXCIE               ; ENABLE UART TX COMPLETE INTERRUPT\r
+       SBI     USR,TXC                 ; CLEAR UART TX COMPLETE PENDING BIT\r
+       RJMP    API_DONE\r
+\r
+API_RX_DATA:\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+       PUSH    ZL\r
+       ;PUSH   ZH\r
+       LDS     ZL,RX_COUNT\r
+       LDS     A,RX_PTR ;ZH,RX_PTR\r
+       ADD     ZL,A ;ZL,ZH\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       ;CLR    ZH\r
+       IN      A,UDR\r
+       ST      Z,A                     ; SAVE CHARACTER IN RX BUFFER\r
+       ;POP    ZH\r
+       POP     ZL\r
+\r
+       LDS     A,RX_COUNT\r
+       INC     A\r
+       STS     RX_COUNT,A\r
+\r
+       LDS     A,API_REMAIN\r
+       DEC     A\r
+       STS     API_REMAIN,A\r
+       BRMI    API_REVERT\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       PUSH    SR\r
+       IN      SR,SREG\r
+       PUSH    A\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_ERROR\r
+       LDI     A,~(1<<APISIZE)\r
+       AND     FLAGS,A                 ; EXPECTING ADDRESS COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+       CBI     UCR,UDRIE               ; DISABLE UART TX EMPTY INTERRUPT\r
+       CBI     UCR,TXCIE               ; DISABLE UART TX COMPLETE INTERRRUPT\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       SBRS    FLAGS,APISIZE\r
+       CBI     UCR,TXEN                ; DISABLE UART TX AND TXD PIN\r
+       IN      A,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS IF EXPECTING ADDRESS COMMAND\r
+       SBRS    FLAGS,APISIZE\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,~(1<<APIDATA)\r
+       AND     FLAGS,A                 ; EXPECTING ADDRESS / DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     A\r
+       OUT     SREG,SR\r
+       POP     SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/apilc8.inc b/src/avr/apilc8.inc
new file mode 100644 (file)
index 0000000..c8315df
--- /dev/null
@@ -0,0 +1,331 @@
+;      APILC.INC\r
+\r
+;      15JUN02\r
+;      ATmega8 VERSION\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS INITIALISATION ROUTINES\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,$05\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 0.1 MS\r
+;      ATmega8:\r
+       LDI     A,1<<TOIE0\r
+;      LDI     A,$02\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS\r
+;      ATmega8:\r
+       OUT     UBRRL,A\r
+;      OUT     UBRR,A                  ; SET UART RATE\r
+\r
+;      ATmega8:\r
+       LDI     A,1<<RXCIE | 1<<RXEN    ; ENABLE RX WITH INTERRUPTS\r
+       OUT     UCSRB,A\r
+;      LDI     A,$90                   ; ENABLE RX WITH INTERRUPTS\r
+;      OUT     UCR,A\r
+\r
+       CLR     FLAGS\r
+\r
+       CLR     A\r
+       STS     TX_PTR,A\r
+       STS     TX_COUNT,A\r
+       STS     RX_PTR,A\r
+       STS     RX_COUNT,A\r
+       STS     API_REMAIN,A\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+.MACRO MRX_WAIT\r
+       ; REMOVED TO SAVE FLASH %\r
+       ;LDS    A,RX_COUNT\r
+       ;TST    A\r
+       ;BREQ   RX_WAIT\r
+       ; %\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       LDS     YL,RX_COUNT\r
+       DEC     YL\r
+       STS     RX_COUNT,YL\r
+       LDS     YL,RX_PTR\r
+       INC     YL\r
+       ANDI    YL,RX_SIZE-1\r
+       STS     RX_PTR,YL\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       ; REMOVED TO SAVE FLASH %\r
+       ;CP     CYC_1,E\r
+       ;BRSH   TX_CHAR_RET\r
+\r
+       ;PUSH   A\r
+       ;LDS    A,TX_COUNT\r
+       ;CPI    A,TX_SIZE\r
+       ;POP    A\r
+       ;BRSH   TX_WAIT\r
+       ; %\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       CLI\r
+       LDS     YL,TX_COUNT\r
+       LDS     YH,TX_PTR\r
+       ADD     YL,YH\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       LDS     A,TX_COUNT\r
+       INC     A\r
+       STS     TX_COUNT,A\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR_RET\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+.MACRO MTX_EMPTY\r
+       PUSH    SR\r
+       IN      SR,SREG\r
+       PUSH    A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       OUT     TCNT0,A                 ; FEED TX/RX WATCHDOG\r
+;      ATmega8:\r
+       LDI     A,1<<TOV0\r
+;      LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR T0 PENDING\r
+\r
+       PUSH    ZL\r
+;      ATmega8:\r
+       PUSH    ZH\r
+       LDS     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+;      ATmega8:\r
+       CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+;      ATmega8:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,A\r
+\r
+       LDS     A,TX_COUNT\r
+       DEC     A\r
+       STS     TX_COUNT,A\r
+       LDS     A,TX_PTR\r
+       INC     A\r
+       ANDI    A,TX_SIZE-1\r
+       STS     TX_PTR,A\r
+\r
+       LDS     A,API_REMAIN\r
+       DEC     A                       ; MORE TO SEND?\r
+       STS     API_REMAIN,A\r
+       BRMI    GO_API_DONE             ; YES, AWAIT NEXT TX EMPTY INTERRUPT\r
+       RJMP    API_REVERT              ; NO, AWAIT NEXT ADDRESS / DATA SIZE\r
+GO_API_DONE:\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       PUSH    SR\r
+       IN      SR,SREG\r
+       PUSH    A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       OUT     TCNT0,A                 ; FEED TX/RX WATCHDOG\r
+;      ATmega8:\r
+       LDI     A,1<<TOV0\r
+;      LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR T0 PENDING\r
+\r
+       SBRC    FLAGS,APIDATA\r
+       RJMP    API_RX_DATA             ; WITH A = CHARACTER\r
+\r
+       IN      A,UDR\r
+\r
+       SBRC    FLAGS,APISIZE\r
+       RJMP    API_DATA_SIZE           ; WITH A = CHARACTER\r
+\r
+       ; RECEIVED 4800 BPS ADDRESS COMMAND\r
+       CPI     A,API_ADDRESS           ; CHARACTER = MY ADDRESS?\r
+       BRNE    GO_API_DONE\r
+\r
+       LDI     A,API_RATE_FAST         ; 115200 BPS\r
+;      ATmega8:\r
+       OUT     UBRRL,A                 ; SET UART RATE\r
+;      OUT     UBRR,A                  ; SET UART RATE\r
+\r
+;      ATmega8:\r
+       SBI     UCSRB,TXEN\r
+;      SBI     UCR,TXEN                ; ENABLE UART TX AND TXD PIN\r
+\r
+       LDI     A,1<<APISIZE\r
+       OR      FLAGS,A                 ; SAY WE ARE EXPECTING DATA SIZE CMD\r
+GO_API_DONE:\r
+       RJMP    API_DONE\r
+\r
+API_DATA_SIZE:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       STS     API_REMAIN,A\r
+       TST     A                       ; TEST TRANSFER DIRECTION\r
+       BRPL    API_RESPOND_RX\r
+\r
+;API_RESPOND_TX:\r
+       LDS     A,TX_COUNT\r
+       ORI     A,$80                   ; A = QUEUED TX CHARACTERS\r
+       RJMP    API_RESPOND\r
+\r
+API_RESPOND_RX:\r
+       LDS     A,RX_COUNT\r
+       NEG     A\r
+       SUBI    A,-RX_SIZE              ; A = AVAILABLE RX BUFFER\r
+       ; REMOVED TO SAVE FLASH %\r
+       ;BRPL   API_RESPOND\r
+       ;LDI    A,$7F                   ; A = MAXIMUM POSSIBLE TRANSFER COUNT\r
+       ; %\r
+\r
+API_RESPOND:\r
+       ; SEND DATA SIZE RESPONSE\r
+       ; API_REMAIN = HOST MAX, A = OUR MAX\r
+       OUT     UDR,A                   ; SEND DATA SIZE RESPONSE\r
+\r
+       PUSH    B\r
+       LDS     B,API_REMAIN\r
+       CP      A,B\r
+       BRSH    API_RESPOND_OK\r
+       STS     API_REMAIN,A            ; API_REMAIN = LESSER OUR / HOST MAX\r
+API_RESPOND_OK:\r
+       POP     B\r
+\r
+       LDS     A,API_REMAIN\r
+       ANDI    A,$7F                   ; NULL REQUEST?\r
+       BREQ    API_NULL                ; YES, REVERT TO 4800 WHEN TX COMPLETE\r
+                                       ; NO, AWAIT RX COMPLETE / TX EMPTY INT\r
+       LDI     A,1<<APIDATA | 1<<APISIZE\r
+       OR      FLAGS,A                 ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       LDS     A,API_REMAIN\r
+       DEC     A                       ; NUDGE FOR BRPL / BRMI ALGORITHM\r
+       STS     API_REMAIN,A\r
+       BRPL    API_DONE                ; WE WILL RECEIVE, NO FURTHER ACTION\r
+\r
+;      ATmega8:\r
+       CBI     UCSRB,RXCIE             ; DISABLE UART RX COMPLETE INTERRUPT\r
+       SBI     UCSRB,UDRIE             ; ENABLE UART DATA REGISTER EMPTY INT\r
+;      CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+;      SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     A,~(1<<APISIZE)\r
+       AND     FLAGS,A                 ; IN CASE NO DATA TRANSFERRED\r
+\r
+;      ATmega8:\r
+       SBI     UCSRB,TXCIE             ; ENABLE UART TX COMPLETE INTERRUPT\r
+       SBI     UCSRA,TXC               ; CLEAR UART TX COMPLETE PENDING BIT\r
+;      SBI     UCR,TXCIE               ; ENABLE UART TX COMPLETE INTERRUPT\r
+;      SBI     USR,TXC                 ; CLEAR UART TX COMPLETE PENDING BIT\r
+       RJMP    API_DONE\r
+\r
+API_RX_DATA:\r
+       PUSH    ZL                      ; RECEIVED DATA BYTE, SAVE IT\r
+;      ATmega8:\r
+       PUSH    ZH\r
+       LDS     ZL,RX_COUNT\r
+       LDS     A,RX_PTR ;ZH,RX_PTR\r
+       ADD     ZL,A ;ZL,ZH\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+;      ATmega8:\r
+       CLR     ZH\r
+       IN      A,UDR\r
+       ST      Z,A                     ; SAVE CHARACTER IN RX BUFFER\r
+;      ATmega8:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDS     A,RX_COUNT\r
+       INC     A\r
+       STS     RX_COUNT,A\r
+\r
+       LDS     A,API_REMAIN\r
+       DEC     A\r
+       STS     API_REMAIN,A\r
+       BRMI    API_REVERT\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       PUSH    SR\r
+       IN      SR,SREG\r
+       PUSH    A\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_ERROR\r
+       LDI     A,~(1<<APISIZE)\r
+       AND     FLAGS,A                 ; EXPECTING ADDRESS COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+;      ATmega8:\r
+       CBI     UCSRB,UDRIE             ; DISABLE UART TX EMPTY INTERRUPT\r
+       CBI     UCSRB,TXCIE             ; DISABLE UART TX COMPLETE INTERRRUPT\r
+       SBI     UCSRB,RXCIE             ; ENABLE UART RX COMPLETE INTERRUPT\r
+;      CBI     UCR,UDRIE               ; DISABLE UART TX EMPTY INTERRUPT\r
+;      CBI     UCR,TXCIE               ; DISABLE UART TX COMPLETE INTERRRUPT\r
+;      SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       SBRS    FLAGS,APISIZE\r
+;      ATmega8:\r
+       CBI     UCSRB,TXEN              ; DISABLE UART TX AND TXD PIN\r
+;      CBI     UCR,TXEN                ; DISABLE UART TX AND TXD PIN\r
+       IN      A,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS IF EXPECTING ADDRESS COMMAND\r
+       SBRS    FLAGS,APISIZE\r
+;      ATmega8:\r
+       OUT     UBRRL,A                 ; SET UART RATE\r
+;      OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,~(1<<APIDATA)\r
+       AND     FLAGS,A                 ; EXPECTING ADDRESS / DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     A\r
+       OUT     SREG,SR\r
+       POP     SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/apits.inc b/src/avr/apits.inc
new file mode 100644 (file)
index 0000000..f2b7a4b
--- /dev/null
@@ -0,0 +1,296 @@
+; APITS.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND TASK\r
+\r
+.MACRO INT_HANDLERS\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+.ENDMACRO\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$90                   ; ENABLE RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+       ;SBI    UCR,TXEN                ; TX ENABLE\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+       CLR     API_WATCHDOG\r
+.ENDMACRO\r
+\r
+.MACRO MRX_WAIT\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       DEC     RX_COUNT\r
+       INC     RX_PTR\r
+       LDI     YL,RX_SIZE-1\r
+       AND     RX_PTR,YL\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       PUSH    A\r
+TX_WAIT_LOOP:\r
+       WDR ; 10OCT02 ALTHOUGH IT USUALLY DOESN'T MATTER (HANDY FOR LOOPBACK)\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       BRSH    TX_WAIT_LOOP\r
+       POP     A\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+ IN YH,SREG\r
+       CLI\r
+       MOV     YL,TX_COUNT\r
+       ADD     YL,TX_PTR\r
+ OUT SREG,YH   ;SEI\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       INC     TX_COUNT\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND TASK\r
+\r
+.MACRO MTX_EMPTY\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      F,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,F\r
+\r
+       DEC     TX_COUNT\r
+       INC     TX_PTR\r
+       LDI     F,TX_SIZE-1\r
+       AND     TX_PTR,F\r
+\r
+       DEC     API_REMAIN              ; MORE TO SEND?\r
+       BRMI    GO_API_DONE1            ; YES, AWAIT NEXT TX EMPTY INTERRUPT\r
+       RJMP    API_REINIT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+GO_API_DONE1:\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       IN      F,UDR\r
+       SBIC    USR,FE                  ; BREAK DETECTED?\r
+       RJMP    API_FRAMING_ERROR\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_RX_DATA             ; WITH F = CHARACTER\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_DATA_SIZE           ; WITH F = CHARACTER\r
+\r
+       ; RECEIVED 4800 BPS ADDRESS COMMAND\r
+       CPI     F,API_ADDRESS           ; CHARACTER = MY ADDRESS?\r
+       BRNE    API_ADDRESS_DONE\r
+\r
+       LDI     F,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       SBI     UCR,TXEN                ; ENABLE UART TX AND TXD PIN\r
+\r
+       LDI     F,1<<APISIZE\r
+       OR      API_STATE,F             ; SAY WE ARE EXPECTING DATA SIZE CMD\r
+       RJMP    API_DONE\r
+\r
+API_ADDRESS_DONE:\r
+       CPI     F,$AA                   ; CHARACTER = TURNON COMMAND?\r
+       BRNE    API_TURNON_DONE\r
+       LDI     F,0\r
+       STS     TURNON_COUNT,F          ; REQUEST IMMEDIATE TURNON\r
+API_TURNON_DONE:\r
+; 18DEC01 RESTORED IT TO NORMAL FOR HYT1500 RELEASE\r
+;      CPI     F,9                     ; REALLY A VALID ADDRESS COMMAND?\r
+;      BRLO    API_BAD_DONE            ; YES, ALL IS OK (IT WAS SOMEONE ELSE)\r
+;      PUSH    ZL                      ; NO, WARN THAT THE BUS HAS ERRORS\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT\r
+;      CPI     ZL,RX_SIZE\r
+;      BRSH    API_BAD_SKIP\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      LDI     F,'*'                   ; DIAGNOSTIC INDICATOR FOR BAD COMMAND\r
+;      ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+;      INC     RX_COUNT\r
+;API_BAD_SKIP:\r
+;      POP     ZH\r
+;      POP     ZL\r
+;API_BAD_DONE:\r
+       RJMP    API_DONE\r
+\r
+API_DATA_SIZE:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     API_REMAIN,F\r
+\r
+       LDI     F,RX_SIZE\r
+       SUB     F,RX_COUNT              ; F = AVAILABLE RX BUFFER\r
+       BRPL    RX_RESPOND_F\r
+       LDI     F,$7F                   ; F = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+RX_RESPOND_F:\r
+       TST     API_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    RX_RESPOND              ; USE F IF WE NEED TO RECEIVE\r
+\r
+       MOV     F,TX_COUNT\r
+       ORI     F,$80                   ; F = QUEUED TX CHARACTERS\r
+\r
+RX_RESPOND:\r
+       ; SEND DATA SIZE RESPONSE\r
+       ; API_REMAIN = HOST MAX, F = OUR MAX\r
+       OUT     UDR,F                   ; SEND DATA SIZE RESPONSE\r
+\r
+       CP      F,API_REMAIN\r
+       BRSH    RX_RESPOND_OK\r
+       MOV     API_REMAIN,F            ; API_REMAIN = LESSER OUR / HOST MAX\r
+\r
+RX_RESPOND_OK:\r
+       MOV     F,API_REMAIN\r
+       ANDI    F,$7F                   ; NULL REQUEST?\r
+       BREQ    API_NULL                ; YES, REVERT TO 4800 WHEN TX COMPLETE\r
+                                       ; NO, AWAIT RX COMPLETE / TX EMPTY INT\r
+       LDI     F,1<<APIDATA | 1<<APISIZE\r
+       OR      API_STATE,F             ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       DEC     API_REMAIN              ; NUDGE FOR BRPL / BRMI ALGORITHM\r
+       BRPL    API_DONE                ; WE WILL RECEIVE, NO FURTHER ACTION\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; IN CASE NO DATA TRANSFERRED\r
+\r
+       SBI     UCR,TXCIE               ; ENABLE UART TX COMPLETE INTERRUPT\r
+       SBI     USR,TXC                 ; CLEAR UART TX COMPLETE PENDING BIT\r
+       RJMP    API_DONE\r
+\r
+API_RX_DATA:\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+; OUT UDR,API_REMAIN\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     RX_COUNT\r
+\r
+       DEC     API_REMAIN              ; MORE TO RECEIVE?\r
+       BRPL    API_DONE                ; YES, AWAIT NEXT RX COMPLETE INTERRUPT\r
+       RJMP    API_REVERT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       IN      SR,SREG\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_TIMEOUT_ERROR\r
+       PUSH    F\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_FRAMING_ERROR\r
+       CBI     UCR,TXEN                ; DISABLE UART TX AND TXD PIN\r
+       LDI     F,API_RATE_SLOW         ; 4800 BPS IF EXPECTING ADDRESS COMMAND\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS COMMAND\r
+       CLR     API_WATCHDOG            ; NO ACTION, JUST WAIT TO RECEIVE ADDR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REINIT\r
+       CBI     UCR,UDRIE               ; DISABLE UART TX EMPTY INTERRUPT\r
+       CBI     UCR,TXCIE               ; DISABLE UART TX COMPLETE INTERRRUPT\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      F,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+       LDI     F,~(1<<APIDATA)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS / DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     F\r
+       OUT     SREG,SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMER INTERRUPT\r
+\r
+.MACRO MAPI_TIMER\r
+       TST     API_WATCHDOG\r
+       BREQ    API_OKAY\r
+       INC     API_WATCHDOG            ; SEE IF API BUS WAS LEFT HANGING\r
+       BRNE    API_OKAY\r
+       RJMP    API_TIMEOUT_ERROR       ; IF SO THEN RESET TO GET NEXT COMMAND\r
+API_OKAY:                              ; OTHERWISE RETURN FROM INTERRUPT\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/avrasm.exe b/src/avr/avrasm.exe
new file mode 100644 (file)
index 0000000..d5e1198
Binary files /dev/null and b/src/avr/avrasm.exe differ
diff --git a/src/avr/cflashv0.asm b/src/avr/cflashv0.asm
new file mode 100644 (file)
index 0000000..260cb98
--- /dev/null
@@ -0,0 +1,826 @@
+;      CFLASHV0.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =7              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+;.DEF  CARD_COUNT      =R12            ; COUNTER TO TEST CARD EVERY X ?\r
+.DEF   NOTIFY_COUNT    =R13            ; COUNTER TO SEND EVERY 6.5536 SECONDS\r
+.DEF   ABORT_COUNT     =R14            ; COUNTER TO ABORT ESC AFTER 0.1 SECS\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.EQU   TX_SIZE         =$40\r
+.EQU   RX_SIZE         =$20\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   CARD            =0              ; CARD IN/OUT STATUS MAINTAINED BY FG\r
+.EQU   NOTIFY          =1              ; SET BY FG FOR FG TO REPORT STATUS\r
+.EQU   TIMER           =2              ; SET BY BG FOR FG TO PROCESS ONE TICK\r
+; TER MODE ONLY %\r
+;.EQU  RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+;.EQU  RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+       ;MAPI_TIMER\r
+\r
+       SBR     FLAGS,1<<TIMER          ; TELL FOREGROUND TO TEST CARD STATUS\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+       WDR                             ; RESET WATCHDOG\r
+\r
+       SBRS    FLAGS,TIMER             ; READY TO PERFORM TIMER PROCESSING ?\r
+       RJMP    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       CBR     FLAGS,1<<TIMER          ; READY RECEIVE NEXT TIMER INDICATION\r
+\r
+       TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+       BREQ    TIMER_CARD              ; NO, GO AND TEST CARD\r
+\r
+       DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+       BRNE    TIMER_DONE              ; NO, DO NOT CORRUPT CARD BUS\r
+       RJMP    BOMB_RESET              ; YES, ABORT THE FOREGROUND TASK\r
+\r
+TIMER_CARD:\r
+;      INC     CARD_COUNT              ; HAD 256 TIMER TICKS ?\r
+;      BRNE    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       DEC     NOTIFY_COUNT\r
+       BRNE    TIMER_CARD_CONT         ; TESTED CARD STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       SBR     FLAGS,1<<NOTIFY         ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+TIMER_CARD_CONT:\r
+       LDI     B,7\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SBRS    A,7                     ; TEST BSY STATUS\r
+       RJMP    TIMER_CARD_IN           ; BSY = 0, CARD IN\r
+       ;RJMP   TIMER_CARD_OUT          ; BSY = 1, CARD OUT\r
+\r
+TIMER_CARD_OUT:\r
+       ;SBRS   FLAGS,CARD\r
+       ;RJMP   TIMER_NOTIFY\r
+\r
+       SBRC    FLAGS,CARD\r
+       SBR     FLAGS,1<<NOTIFY         ; SAY WE MUST SEND CARD STATUS TO HOST\r
+       CBR     FLAGS,1<<CARD           ; SAY CARD IS OUT\r
+       RJMP    TIMER_NOTIFY\r
+\r
+TIMER_CARD_IN:\r
+       SBRC    FLAGS,CARD\r
+       RJMP    TIMER_NOTIFY\r
+\r
+       ; RESET COMPACTFLASH CARD\r
+       RCALL   RESET_CARD\r
+\r
+       ; WAIT FOR BSY TO GO LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    TIMER_NOTIFY\r
+\r
+       ; CONFIGURE COMPACTFLASH CARD\r
+       RCALL   CONFIGURE_CARD\r
+\r
+       ;SBRS   FLAGS,CARD\r
+       SBR     FLAGS,(1<<CARD) | (1<<NOTIFY) ; SAY CARD IS IN, MUST SEND\r
+\r
+TIMER_NOTIFY:\r
+       SBRS    FLAGS,NOTIFY            ; READY TO SEND STATUS NOTIFICATION ?\r
+       RJMP    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE               ; ENOUGH BUFFER SPACE TO SEND STATUS ?\r
+       BRSH    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       CLR     NOTIFY_COUNT            ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+       CBR     FLAGS,1<<NOTIFY         ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       MOV     A,FLAGS\r
+       ANDI    A,$01\r
+       ORI     A,$30\r
+;      CPI     A,$3A\r
+;      BRLO    NOTIFY_SEND\r
+;      SUBI    A,-7\r
+;NOTIFY_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+TIMER_DONE:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    RX_CHAR_CONT\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+\r
+TX_WAIT:\r
+       MTX_WAIT\r
+\r
+TX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    TX_CHAR_CONT\r
+\r
+       PUSH    A\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+       POP     A\r
+\r
+TX_CHAR_CONT:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2\r
+       SBI     DDRD,2                  ; D2 = HIGH OUTPUT FOR CARD IOWR\r
+       SBI     PORTD,3\r
+       SBI     DDRD,3                  ; D3 = HIGH OUTPUT FOR CARD IORD\r
+\r
+       SBI     PORTC,4\r
+       SBI     DDRC,4                  ; C4 = HIGH OUTPUT FOR CARD CS0\r
+       SBI     PORTC,5\r
+       SBI     DDRC,5                  ; C5 = HIGH OUTPUT FOR CARD CS1\r
+\r
+       SBI     DDRB,0                  ; B0 = LOW OUTPUT FOR CARD A0\r
+       SBI     DDRB,1                  ; B1 = LOW OUTPUT FOR CARD A1\r
+       SBI     DDRB,2                  ; B2 = LOW OUTPUT FOR CARD A2\r
+\r
+       SBI     PORTC,0                 ; C0 = PULLUP FOR CARD D0 WHILE NO CARD\r
+       SBI     PORTC,1                 ; C0 = PULLUP FOR CARD D1 WHILE NO CARD\r
+       SBI     PORTC,2                 ; C0 = PULLUP FOR CARD D2 WHILE NO CARD\r
+       SBI     PORTC,3                 ; C0 = PULLUP FOR CARD D3 WHILE NO CARD\r
+       SBI     PORTD,4                 ; D4 = PULLUP FOR CARD D4 WHILE NO CARD\r
+       SBI     PORTD,5                 ; D5 = PULLUP FOR CARD D5 WHILE NO CARD\r
+       SBI     PORTD,6                 ; D6 = PULLUP FOR CARD D6 WHILE NO CARD\r
+       SBI     PORTD,7                 ; D7 = PULLUP FOR CARD D7 WHILE NO CARD\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       CLR     FLAGS\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     NOTIFY_COUNT,A          ; SEND FIRST NOTIFICATION QUITE SOON\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,5                     ; TIMER0 TICK = APPROX 0.1 MS\r
+       OUT     TCCR0,A\r
+\r
+       LDI     D,1<<TOIE0\r
+       OUT     TIFR,D                  ; CLEAR ANY PENDING TIMER 0 OVERFLOW\r
+       OUT     TIMSK,D                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+BOMB_RESET:\r
+       ; ENTRY POINT FROM RX_WAIT\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+MAIN_LOOP:\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,'I'\r
+       BREQ    ESC_I\r
+       CPI     A,'D'\r
+       BREQ    ESC_D\r
+       CPI     A,'R'\r
+       BREQ    ESC_R\r
+       CPI     A,'W'\r
+       BRNE    MAIN_LOOP\r
+       RJMP    ESC_W\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_I:\r
+       ; RESET COMPACTFLASH CARD\r
+       RCALL   RESET_CARD\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_I_FAILURE\r
+\r
+       ; CONFIGURE COMPACTFLASH CARD\r
+       RCALL   CONFIGURE_CARD\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'I'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_I_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'i'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_D:\r
+       ; LOAD TASK FILE FOR IDENTIFY DRIVE COMMAND\r
+       LDI     A,0\r
+       LDI     B,6\r
+       RCALL   WRITE_VIA_CS0           ; SET DRIVE = 0\r
+\r
+       LDI     A,$EC\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE IDENTIFY DRIVE COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_D_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'D'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     D,$FF                   ; INITIALISE CHECKSUM BYTE\r
+       RJMP    ESC_D_ENTRY\r
+\r
+ESC_D_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'d'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_R:\r
+       ; RECEIVE LBA ADDRESS AND SEQUENCE FROM HOST\r
+       RCALL   RECEIVE_LBA\r
+\r
+       RCALL   RX_WAIT                 ; RECEIVE CHECKSUM BYTE\r
+       CPSE    A,D\r
+       RJMP    MAIN_LOOP               ; BAD CHECKSUM, IGNORE REQUEST\r
+\r
+       ; LOAD TASK FILE FOR READ COMMAND\r
+       RCALL   LOAD_TASK_FILE\r
+\r
+       LDI     A,$20\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE READ SECTORS COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_R_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'R'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+ESC_D_ENTRY:\r
+       ; READ AND SEND THE REQUESTED DATA SECTOR\r
+       LDI     ZL,LOW($200)\r
+       LDI     ZH,HIGH($200)\r
+\r
+ESC_R_LOOP:\r
+       LDI     B,0\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+\r
+       SBIW    ZL,1\r
+       BRNE    ESC_R_LOOP\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_R_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'r'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND ERROR CODE TO HOST\r
+       LDI     A,0\r
+       ;SUB    D,A\r
+       RCALL   TX_WAIT\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_W:\r
+       ; RECEIVE LBA ADDRESS AND SEQUENCE FROM HOST\r
+       RCALL   RECEIVE_LBA             ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; LOAD TASK FILE FOR WRITE COMMAND\r
+       RCALL   LOAD_TASK_FILE\r
+\r
+       LDI     A,$30\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE WRITE SECTORS COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_R_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; RECEIVE AND WRITE THE REQUESTED DATA SECTOR, LESS 1 BYTE\r
+       LDI     ZL,LOW($1FF)\r
+       LDI     ZH,HIGH($1FF)\r
+\r
+ESC_W_LOOP:\r
+       RCALL   RX_WAIT\r
+       SUB     D,A\r
+\r
+       LDI     B,0\r
+       RCALL   WRITE_VIA_CS0\r
+\r
+       SBIW    ZL,1\r
+       BRNE    ESC_W_LOOP\r
+\r
+       ; RECEIVE THE LAST BYTE AND CHECKSUM, THEN TEST\r
+       RCALL   RX_WAIT\r
+       SUB     D,A\r
+       MOV     B,A\r
+\r
+       RCALL   RX_WAIT\r
+       CPSE    A,D\r
+       CBR     FLAGS,1<<CARD           ; PRETEND CARD IS GONE - WE WILL RESET\r
+       CPSE    A,D\r
+       RJMP    BOMB_RESET              ; BAD CHECKSUM, IGNORE REQUEST\r
+\r
+       MOV     A,B\r
+       LDI     B,0\r
+       RCALL   WRITE_VIA_CS0           ; WRITE LAST BYTE, BSY WILL GO HIGH\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_W_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'W'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_W_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'w'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND ERROR CODE TO HOST\r
+       LDI     A,0\r
+       ;SUB    D,A\r
+       RCALL   TX_WAIT\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RECEIVE_LBA:\r
+       LDI     D,$FF\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 0-7\r
+       SUB     D,A\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 8-15\r
+       SUB     D,A\r
+       MOV     XH,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 16-23\r
+       SUB     D,A\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 24-27 AND SEQUENCE 0-3\r
+       SUB     D,A\r
+       MOV     YH,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ECHO_LBA:\r
+       MOV     A,XL\r
+       LDI     D,$FF\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,XH\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,YL\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,YH\r
+       SUB     D,A\r
+       RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOAD_TASK_FILE:\r
+       LDI     A,1\r
+       LDI     B,2\r
+       RCALL   WRITE_VIA_CS0           ; SET SECTOR COUNT = 1\r
+\r
+       MOV     A,XL\r
+       LDI     B,3\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 0-7\r
+\r
+       MOV     A,XH\r
+       LDI     B,4\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 8-15\r
+\r
+       MOV     A,YL\r
+       LDI     B,5\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 16-23\r
+\r
+       MOV     A,YH\r
+       ANDI    A,$0F\r
+       ORI     A,$E0\r
+       LDI     B,6\r
+       RJMP    WRITE_VIA_CS0           ; SET LBA 24-27, DRIVE = 0, LBA = 1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_CARD:\r
+       LDI     A,$0E\r
+       LDI     B,6\r
+       RCALL   WRITE_VIA_CS1\r
+\r
+       LDI     A,0\r
+RESET_DELAY:\r
+       DEC     A\r
+       BRNE    RESET_DELAY\r
+\r
+       LDI     A,$0A\r
+       LDI     B,6\r
+       RJMP    WRITE_VIA_CS1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUSY_WAIT:\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+\r
+BUSY_WAIT_LOOP:\r
+       LDI     B,7\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SBRS    A,7                     ; WAIT UNTIL BSY = 0\r
+       RJMP    BUSY_WAIT_DONE\r
+\r
+       SBIW    ZL,1\r
+       BRNE    BUSY_WAIT_LOOP\r
+\r
+BUSY_WAIT_DONE:\r
+       ANDI    A,$C0\r
+       CPI     A,$40\r
+       RET                             ; RETURNS Z IF BSY = 0, RDY = 1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CONFIGURE_CARD:\r
+       LDI     A,$01\r
+       LDI     B,1\r
+       RCALL   WRITE_VIA_CS0           ; SET FEATURE REGISTER = $01\r
+\r
+       LDI     A,$EF\r
+       LDI     B,7\r
+       RJMP    WRITE_VIA_CS0           ; ISSUE SET FEATURE COMMAND (8 BITS)\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+READ_VIA_CS0:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       LDI     B,$2F\r
+       OUT     PORTC,B                 ; CS0 = 0, PULLUPS ON FOR CARD D0-D3\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     B,$F4\r
+       OUT     PORTD,B                 ; IORD = 0, PULLUPS ON FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       IN      A,PINC\r
+       IN      B,PIND\r
+       EOR     A,B\r
+       ANDI    A,$0F\r
+       EOR     A,B\r
+\r
+       LDI     B,$FC\r
+       OUT     PORTD,B                 ; IORD = 1, PULLUPS ON FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS0 = 1, PULLUPS ON FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_VIA_CS0:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       MOV     B,A\r
+       ANDI    B,$0F\r
+       ORI     B,$20\r
+       OUT     PORTC,B                 ; CS0 = 0, DATA SET UP FOR CARD D0-D3\r
+       LDI     B,$3F\r
+       OUT     DDRC,B                  ; SET C0-C3 TO OUTPUTS FOR CARD D0-D3\r
+\r
+       MOV     B,A\r
+       ANDI    B,$F0\r
+       ORI     B,$0C\r
+       OUT     PORTD,B                 ; IOWR = 1, DATA SET UP FOR CARD D4-D7\r
+       LDI     B,$FC\r
+       OUT     DDRD,B                  ; SET D4-D7 TO OUTPUTS FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       CBI     PORTD,2                 ; IOWR = 0\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       SBI     PORTD,2                 ; IOWR = 1\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       ;LDI    B,$FC\r
+       OUT     PORTD,B                 ; IOWR = 1, PULL UPS FOR CARD D4-D7\r
+       LDI     B,$0C\r
+       OUT     DDRD,B                  ; SET D4-D7 TO INPUTS FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS0 = 1, PULL UPS FOR CARD D0-D3\r
+       LDI     B,$30\r
+       OUT     DDRC,B                  ; SET C0-C3 TO INPUTS FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_VIA_CS1:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       MOV     B,A\r
+       ANDI    B,$0F\r
+       ORI     B,$10\r
+       OUT     PORTC,B                 ; CS1 = 0, DATA SET UP FOR CARD D0-D3\r
+       LDI     B,$3F\r
+       OUT     DDRC,B                  ; SET C0-C3 TO OUTPUTS FOR CARD D0-D3\r
+\r
+       MOV     B,A\r
+       ANDI    B,$F0\r
+       ORI     B,$0C\r
+       OUT     PORTD,B                 ; IOWR = 1, DATA SET UP FOR CARD D4-D7\r
+       LDI     B,$FC\r
+       OUT     DDRD,B                  ; SET D4-D7 TO OUTPUTS FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       CBI     PORTD,2                 ; IOWR = 0\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       SBI     PORTD,2                 ; IOWR = 1\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       ;LDI    B,$FC\r
+       OUT     PORTD,B                 ; IOWR = 1, PULL UPS FOR CARD D4-D7\r
+       LDI     B,$0C\r
+       OUT     DDRD,B                  ; SET D4-D7 TO INPUTS FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS1 = 1, PULL UPS FOR CARD D0-D3\r
+       LDI     B,$30\r
+       OUT     DDRC,B                  ; SET C0-C3 TO INPUTS FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4106                   ; HARDWARE ADDRESS COMMAND\r
+       .DW     $4207                   ; SOFTWARE ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cflashv1.asm b/src/avr/cflashv1.asm
new file mode 100644 (file)
index 0000000..64abd06
--- /dev/null
@@ -0,0 +1,826 @@
+;      CFLASHV1.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =7              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+;.DEF  CARD_COUNT      =R12            ; COUNTER TO TEST CARD EVERY X ?\r
+.DEF   NOTIFY_COUNT    =R13            ; COUNTER TO SEND EVERY 6.5536 SECONDS\r
+.DEF   ABORT_COUNT     =R14            ; COUNTER TO ABORT ESC AFTER 0.1 SECS\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.EQU   TX_SIZE         =$40\r
+.EQU   RX_SIZE         =$20\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   CARD            =0              ; CARD IN/OUT STATUS MAINTAINED BY FG\r
+.EQU   NOTIFY          =1              ; SET BY FG FOR FG TO REPORT STATUS\r
+.EQU   TIMER           =2              ; SET BY BG FOR FG TO PROCESS ONE TICK\r
+; TER MODE ONLY %\r
+;.EQU  RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+;.EQU  RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+       ;MAPI_TIMER\r
+\r
+       SBR     FLAGS,1<<TIMER          ; TELL FOREGROUND TO TEST CARD STATUS\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+       WDR                             ; RESET WATCHDOG\r
+\r
+       SBRS    FLAGS,TIMER             ; READY TO PERFORM TIMER PROCESSING ?\r
+       RJMP    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       CBR     FLAGS,1<<TIMER          ; READY RECEIVE NEXT TIMER INDICATION\r
+\r
+       TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+       BREQ    TIMER_CARD              ; NO, GO AND TEST CARD\r
+\r
+       DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+       BRNE    TIMER_DONE              ; NO, DO NOT CORRUPT CARD BUS\r
+       RJMP    BOMB_RESET              ; YES, ABORT THE FOREGROUND TASK\r
+\r
+TIMER_CARD:\r
+;      INC     CARD_COUNT              ; HAD 256 TIMER TICKS ?\r
+;      BRNE    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       DEC     NOTIFY_COUNT\r
+       BRNE    TIMER_CARD_CONT         ; TESTED CARD STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       SBR     FLAGS,1<<NOTIFY         ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+TIMER_CARD_CONT:\r
+       LDI     B,7\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SBRS    A,7                     ; TEST BSY STATUS\r
+       RJMP    TIMER_CARD_IN           ; BSY = 0, CARD IN\r
+       ;RJMP   TIMER_CARD_OUT          ; BSY = 1, CARD OUT\r
+\r
+TIMER_CARD_OUT:\r
+       ;SBRS   FLAGS,CARD\r
+       ;RJMP   TIMER_NOTIFY\r
+\r
+       SBRC    FLAGS,CARD\r
+       SBR     FLAGS,1<<NOTIFY         ; SAY WE MUST SEND CARD STATUS TO HOST\r
+       CBR     FLAGS,1<<CARD           ; SAY CARD IS OUT\r
+       RJMP    TIMER_NOTIFY\r
+\r
+TIMER_CARD_IN:\r
+       SBRC    FLAGS,CARD\r
+       RJMP    TIMER_NOTIFY\r
+\r
+       ; RESET COMPACTFLASH CARD\r
+       RCALL   RESET_CARD\r
+\r
+       ; WAIT FOR BSY TO GO LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    TIMER_NOTIFY\r
+\r
+       ; CONFIGURE COMPACTFLASH CARD\r
+       RCALL   CONFIGURE_CARD\r
+\r
+       ;SBRS   FLAGS,CARD\r
+       SBR     FLAGS,(1<<CARD) | (1<<NOTIFY) ; SAY CARD IS IN, MUST SEND\r
+\r
+TIMER_NOTIFY:\r
+       SBRS    FLAGS,NOTIFY            ; READY TO SEND STATUS NOTIFICATION ?\r
+       RJMP    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE               ; ENOUGH BUFFER SPACE TO SEND STATUS ?\r
+       BRSH    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       CLR     NOTIFY_COUNT            ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+       CBR     FLAGS,1<<NOTIFY         ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       MOV     A,FLAGS\r
+       ANDI    A,$01\r
+       ORI     A,$30\r
+;      CPI     A,$3A\r
+;      BRLO    NOTIFY_SEND\r
+;      SUBI    A,-7\r
+;NOTIFY_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+TIMER_DONE:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    RX_CHAR_CONT\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+\r
+TX_WAIT:\r
+       MTX_WAIT\r
+\r
+TX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    TX_CHAR_CONT\r
+\r
+       PUSH    A\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+       POP     A\r
+\r
+TX_CHAR_CONT:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2\r
+       SBI     DDRD,2                  ; D2 = HIGH OUTPUT FOR CARD IOWR\r
+       SBI     PORTD,3\r
+       SBI     DDRD,3                  ; D3 = HIGH OUTPUT FOR CARD IORD\r
+\r
+       SBI     PORTC,4\r
+       SBI     DDRC,4                  ; C4 = HIGH OUTPUT FOR CARD CS0\r
+       SBI     PORTC,5\r
+       SBI     DDRC,5                  ; C5 = HIGH OUTPUT FOR CARD CS1\r
+\r
+       SBI     DDRB,0                  ; B0 = LOW OUTPUT FOR CARD A0\r
+       SBI     DDRB,1                  ; B1 = LOW OUTPUT FOR CARD A1\r
+       SBI     DDRB,2                  ; B2 = LOW OUTPUT FOR CARD A2\r
+\r
+       SBI     PORTC,0                 ; C0 = PULLUP FOR CARD D0 WHILE NO CARD\r
+       SBI     PORTC,1                 ; C0 = PULLUP FOR CARD D1 WHILE NO CARD\r
+       SBI     PORTC,2                 ; C0 = PULLUP FOR CARD D2 WHILE NO CARD\r
+       SBI     PORTC,3                 ; C0 = PULLUP FOR CARD D3 WHILE NO CARD\r
+       SBI     PORTD,4                 ; D4 = PULLUP FOR CARD D4 WHILE NO CARD\r
+       SBI     PORTD,5                 ; D5 = PULLUP FOR CARD D5 WHILE NO CARD\r
+       SBI     PORTD,6                 ; D6 = PULLUP FOR CARD D6 WHILE NO CARD\r
+       SBI     PORTD,7                 ; D7 = PULLUP FOR CARD D7 WHILE NO CARD\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       CLR     FLAGS\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     NOTIFY_COUNT,A          ; SEND FIRST NOTIFICATION QUITE SOON\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,5                     ; TIMER0 TICK = APPROX 0.1 MS\r
+       OUT     TCCR0,A\r
+\r
+       LDI     D,1<<TOIE0\r
+       OUT     TIFR,D                  ; CLEAR ANY PENDING TIMER 0 OVERFLOW\r
+       OUT     TIMSK,D                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+BOMB_RESET:\r
+       ; ENTRY POINT FROM RX_WAIT\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+MAIN_LOOP:\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,'I'\r
+       BREQ    ESC_I\r
+       CPI     A,'D'\r
+       BREQ    ESC_D\r
+       CPI     A,'R'\r
+       BREQ    ESC_R\r
+       CPI     A,'W'\r
+       BRNE    MAIN_LOOP\r
+       RJMP    ESC_W\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_I:\r
+       ; RESET COMPACTFLASH CARD\r
+       RCALL   RESET_CARD\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_I_FAILURE\r
+\r
+       ; CONFIGURE COMPACTFLASH CARD\r
+       RCALL   CONFIGURE_CARD\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'I'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_I_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'i'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_D:\r
+       ; LOAD TASK FILE FOR IDENTIFY DRIVE COMMAND\r
+       LDI     A,0\r
+       LDI     B,6\r
+       RCALL   WRITE_VIA_CS0           ; SET DRIVE = 0\r
+\r
+       LDI     A,$EC\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE IDENTIFY DRIVE COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_D_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'D'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     D,$FF                   ; INITIALISE CHECKSUM BYTE\r
+       RJMP    ESC_D_ENTRY\r
+\r
+ESC_D_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'d'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_R:\r
+       ; RECEIVE LBA ADDRESS AND SEQUENCE FROM HOST\r
+       RCALL   RECEIVE_LBA\r
+\r
+       RCALL   RX_WAIT                 ; RECEIVE CHECKSUM BYTE\r
+       CPSE    A,D\r
+       RJMP    MAIN_LOOP               ; BAD CHECKSUM, IGNORE REQUEST\r
+\r
+       ; LOAD TASK FILE FOR READ COMMAND\r
+       RCALL   LOAD_TASK_FILE\r
+\r
+       LDI     A,$20\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE READ SECTORS COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_R_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'R'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+ESC_D_ENTRY:\r
+       ; READ AND SEND THE REQUESTED DATA SECTOR\r
+       LDI     ZL,LOW($200)\r
+       LDI     ZH,HIGH($200)\r
+\r
+ESC_R_LOOP:\r
+       LDI     B,0\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+\r
+       SBIW    ZL,1\r
+       BRNE    ESC_R_LOOP\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_R_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'r'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND ERROR CODE TO HOST\r
+       LDI     A,0\r
+       ;SUB    D,A\r
+       RCALL   TX_WAIT\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_W:\r
+       ; RECEIVE LBA ADDRESS AND SEQUENCE FROM HOST\r
+       RCALL   RECEIVE_LBA             ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; LOAD TASK FILE FOR WRITE COMMAND\r
+       RCALL   LOAD_TASK_FILE\r
+\r
+       LDI     A,$30\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE WRITE SECTORS COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_R_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; RECEIVE AND WRITE THE REQUESTED DATA SECTOR, LESS 1 BYTE\r
+       LDI     ZL,LOW($1FF)\r
+       LDI     ZH,HIGH($1FF)\r
+\r
+ESC_W_LOOP:\r
+       RCALL   RX_WAIT\r
+       SUB     D,A\r
+\r
+       LDI     B,0\r
+       RCALL   WRITE_VIA_CS0\r
+\r
+       SBIW    ZL,1\r
+       BRNE    ESC_W_LOOP\r
+\r
+       ; RECEIVE THE LAST BYTE AND CHECKSUM, THEN TEST\r
+       RCALL   RX_WAIT\r
+       SUB     D,A\r
+       MOV     B,A\r
+\r
+       RCALL   RX_WAIT\r
+       CPSE    A,D\r
+       CBR     FLAGS,1<<CARD           ; PRETEND CARD IS GONE - WE WILL RESET\r
+       CPSE    A,D\r
+       RJMP    BOMB_RESET              ; BAD CHECKSUM, IGNORE REQUEST\r
+\r
+       MOV     A,B\r
+       LDI     B,0\r
+       RCALL   WRITE_VIA_CS0           ; WRITE LAST BYTE, BSY WILL GO HIGH\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_W_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'W'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_W_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'w'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND ERROR CODE TO HOST\r
+       LDI     A,0\r
+       ;SUB    D,A\r
+       RCALL   TX_WAIT\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RECEIVE_LBA:\r
+       LDI     D,$FF\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 0-7\r
+       SUB     D,A\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 8-15\r
+       SUB     D,A\r
+       MOV     XH,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 16-23\r
+       SUB     D,A\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 24-27 AND SEQUENCE 0-3\r
+       SUB     D,A\r
+       MOV     YH,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ECHO_LBA:\r
+       MOV     A,XL\r
+       LDI     D,$FF\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,XH\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,YL\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,YH\r
+       SUB     D,A\r
+       RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOAD_TASK_FILE:\r
+       LDI     A,1\r
+       LDI     B,2\r
+       RCALL   WRITE_VIA_CS0           ; SET SECTOR COUNT = 1\r
+\r
+       MOV     A,XL\r
+       LDI     B,3\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 0-7\r
+\r
+       MOV     A,XH\r
+       LDI     B,4\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 8-15\r
+\r
+       MOV     A,YL\r
+       LDI     B,5\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 16-23\r
+\r
+       MOV     A,YH\r
+       ANDI    A,$0F\r
+       ORI     A,$E0\r
+       LDI     B,6\r
+       RJMP    WRITE_VIA_CS0           ; SET LBA 24-27, DRIVE = 0, LBA = 1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_CARD:\r
+       LDI     A,$0E\r
+       LDI     B,6\r
+       RCALL   WRITE_VIA_CS1\r
+\r
+       LDI     A,0\r
+RESET_DELAY:\r
+       DEC     A\r
+       BRNE    RESET_DELAY\r
+\r
+       LDI     A,$0A\r
+       LDI     B,6\r
+       RJMP    WRITE_VIA_CS1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUSY_WAIT:\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+\r
+BUSY_WAIT_LOOP:\r
+       LDI     B,7\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SBRS    A,7                     ; WAIT UNTIL BSY = 0\r
+       RJMP    BUSY_WAIT_DONE\r
+\r
+       SBIW    ZL,1\r
+       BRNE    BUSY_WAIT_LOOP\r
+\r
+BUSY_WAIT_DONE:\r
+       ANDI    A,$C0\r
+       CPI     A,$40\r
+       RET                             ; RETURNS Z IF BSY = 0, RDY = 1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CONFIGURE_CARD:\r
+       LDI     A,$01\r
+       LDI     B,1\r
+       RCALL   WRITE_VIA_CS0           ; SET FEATURE REGISTER = $01\r
+\r
+       LDI     A,$EF\r
+       LDI     B,7\r
+       RJMP    WRITE_VIA_CS0           ; ISSUE SET FEATURE COMMAND (8 BITS)\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+READ_VIA_CS0:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       LDI     B,$2F\r
+       OUT     PORTC,B                 ; CS0 = 0, PULLUPS ON FOR CARD D0-D3\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     B,$F4\r
+       OUT     PORTD,B                 ; IORD = 0, PULLUPS ON FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       IN      A,PINC\r
+       IN      B,PIND\r
+       EOR     A,B\r
+       ANDI    A,$0F\r
+       EOR     A,B\r
+\r
+       LDI     B,$FC\r
+       OUT     PORTD,B                 ; IORD = 1, PULLUPS ON FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS0 = 1, PULLUPS ON FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_VIA_CS0:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       MOV     B,A\r
+       ANDI    B,$0F\r
+       ORI     B,$20\r
+       OUT     PORTC,B                 ; CS0 = 0, DATA SET UP FOR CARD D0-D3\r
+       LDI     B,$3F\r
+       OUT     DDRC,B                  ; SET C0-C3 TO OUTPUTS FOR CARD D0-D3\r
+\r
+       MOV     B,A\r
+       ANDI    B,$F0\r
+       ORI     B,$0C\r
+       OUT     PORTD,B                 ; IOWR = 1, DATA SET UP FOR CARD D4-D7\r
+       LDI     B,$FC\r
+       OUT     DDRD,B                  ; SET D4-D7 TO OUTPUTS FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       CBI     PORTD,2                 ; IOWR = 0\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       SBI     PORTD,2                 ; IOWR = 1\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       ;LDI    B,$FC\r
+       OUT     PORTD,B                 ; IOWR = 1, PULL UPS FOR CARD D4-D7\r
+       LDI     B,$0C\r
+       OUT     DDRD,B                  ; SET D4-D7 TO INPUTS FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS0 = 1, PULL UPS FOR CARD D0-D3\r
+       LDI     B,$30\r
+       OUT     DDRC,B                  ; SET C0-C3 TO INPUTS FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_VIA_CS1:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       MOV     B,A\r
+       ANDI    B,$0F\r
+       ORI     B,$10\r
+       OUT     PORTC,B                 ; CS1 = 0, DATA SET UP FOR CARD D0-D3\r
+       LDI     B,$3F\r
+       OUT     DDRC,B                  ; SET C0-C3 TO OUTPUTS FOR CARD D0-D3\r
+\r
+       MOV     B,A\r
+       ANDI    B,$F0\r
+       ORI     B,$0C\r
+       OUT     PORTD,B                 ; IOWR = 1, DATA SET UP FOR CARD D4-D7\r
+       LDI     B,$FC\r
+       OUT     DDRD,B                  ; SET D4-D7 TO OUTPUTS FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       CBI     PORTD,2                 ; IOWR = 0\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       SBI     PORTD,2                 ; IOWR = 1\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       ;LDI    B,$FC\r
+       OUT     PORTD,B                 ; IOWR = 1, PULL UPS FOR CARD D4-D7\r
+       LDI     B,$0C\r
+       OUT     DDRD,B                  ; SET D4-D7 TO INPUTS FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS1 = 1, PULL UPS FOR CARD D0-D3\r
+       LDI     B,$30\r
+       OUT     DDRC,B                  ; SET C0-C3 TO INPUTS FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4106                   ; HARDWARE ADDRESS COMMAND\r
+       .DW     $4207                   ; SOFTWARE ADDRESS COMMAND\r
+       .DW     $ACBA                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cflashv2.asm b/src/avr/cflashv2.asm
new file mode 100644 (file)
index 0000000..80b3f71
--- /dev/null
@@ -0,0 +1,827 @@
+;      CFLASHV2.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+;.INCLUDE "APICF.INC" ; temporarily removed, experimental api bus modifcation\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =7              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$5F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$03            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$2F            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$17            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$0B            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$03            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+;.DEF  CARD_COUNT      =R12            ; COUNTER TO TEST CARD EVERY X ?\r
+.DEF   NOTIFY_COUNT    =R13            ; COUNTER TO SEND EVERY 6.5536 SECONDS\r
+.DEF   ABORT_COUNT     =R14            ; COUNTER TO ABORT ESC AFTER 0.1 SECS\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.EQU   TX_SIZE         =$40\r
+.EQU   RX_SIZE         =$20\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   CARD            =0              ; CARD IN/OUT STATUS MAINTAINED BY FG\r
+.EQU   NOTIFY          =1              ; SET BY FG FOR FG TO REPORT STATUS\r
+.EQU   TIMER           =2              ; SET BY BG FOR FG TO PROCESS ONE TICK\r
+; TER MODE ONLY %\r
+;.EQU  RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+;.EQU  RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+       ;MAPI_TIMER\r
+\r
+       SBR     FLAGS,1<<TIMER          ; TELL FOREGROUND TO TEST CARD STATUS\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+       WDR                             ; RESET WATCHDOG\r
+\r
+       SBRS    FLAGS,TIMER             ; READY TO PERFORM TIMER PROCESSING ?\r
+       RJMP    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       CBR     FLAGS,1<<TIMER          ; READY RECEIVE NEXT TIMER INDICATION\r
+\r
+       TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+       BREQ    TIMER_CARD              ; NO, GO AND TEST CARD\r
+\r
+       DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+       BRNE    TIMER_DONE              ; NO, DO NOT CORRUPT CARD BUS\r
+       RJMP    BOMB_RESET              ; YES, ABORT THE FOREGROUND TASK\r
+\r
+TIMER_CARD:\r
+;      INC     CARD_COUNT              ; HAD 256 TIMER TICKS ?\r
+;      BRNE    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       DEC     NOTIFY_COUNT\r
+       BRNE    TIMER_CARD_CONT         ; TESTED CARD STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       SBR     FLAGS,1<<NOTIFY         ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+TIMER_CARD_CONT:\r
+       LDI     B,7\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SBRS    A,7                     ; TEST BSY STATUS\r
+       RJMP    TIMER_CARD_IN           ; BSY = 0, CARD IN\r
+       ;RJMP   TIMER_CARD_OUT          ; BSY = 1, CARD OUT\r
+\r
+TIMER_CARD_OUT:\r
+       ;SBRS   FLAGS,CARD\r
+       ;RJMP   TIMER_NOTIFY\r
+\r
+       SBRC    FLAGS,CARD\r
+       SBR     FLAGS,1<<NOTIFY         ; SAY WE MUST SEND CARD STATUS TO HOST\r
+       CBR     FLAGS,1<<CARD           ; SAY CARD IS OUT\r
+       RJMP    TIMER_NOTIFY\r
+\r
+TIMER_CARD_IN:\r
+       SBRC    FLAGS,CARD\r
+       RJMP    TIMER_NOTIFY\r
+\r
+       ; RESET COMPACTFLASH CARD\r
+       RCALL   RESET_CARD\r
+\r
+       ; WAIT FOR BSY TO GO LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    TIMER_NOTIFY\r
+\r
+       ; CONFIGURE COMPACTFLASH CARD\r
+       RCALL   CONFIGURE_CARD\r
+\r
+       ;SBRS   FLAGS,CARD\r
+       SBR     FLAGS,(1<<CARD) | (1<<NOTIFY) ; SAY CARD IS IN, MUST SEND\r
+\r
+TIMER_NOTIFY:\r
+       SBRS    FLAGS,NOTIFY            ; READY TO SEND STATUS NOTIFICATION ?\r
+       RJMP    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE               ; ENOUGH BUFFER SPACE TO SEND STATUS ?\r
+       BRSH    TIMER_DONE              ; NO, GO AND TEST FOR CHARACTER\r
+\r
+       CLR     NOTIFY_COUNT            ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+       CBR     FLAGS,1<<NOTIFY         ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       MOV     A,FLAGS\r
+       ANDI    A,$01\r
+       ORI     A,$30\r
+;      CPI     A,$3A\r
+;      BRLO    NOTIFY_SEND\r
+;      SUBI    A,-7\r
+;NOTIFY_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+TIMER_DONE:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    RX_CHAR_CONT\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+\r
+TX_WAIT:\r
+       MTX_WAIT\r
+\r
+TX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    TX_CHAR_CONT\r
+\r
+       PUSH    A\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+       POP     A\r
+\r
+TX_CHAR_CONT:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2\r
+       SBI     DDRD,2                  ; D2 = HIGH OUTPUT FOR CARD IOWR\r
+       SBI     PORTD,3\r
+       SBI     DDRD,3                  ; D3 = HIGH OUTPUT FOR CARD IORD\r
+\r
+       SBI     PORTC,4\r
+       SBI     DDRC,4                  ; C4 = HIGH OUTPUT FOR CARD CS0\r
+       SBI     PORTC,5\r
+       SBI     DDRC,5                  ; C5 = HIGH OUTPUT FOR CARD CS1\r
+\r
+       SBI     DDRB,0                  ; B0 = LOW OUTPUT FOR CARD A0\r
+       SBI     DDRB,1                  ; B1 = LOW OUTPUT FOR CARD A1\r
+       SBI     DDRB,2                  ; B2 = LOW OUTPUT FOR CARD A2\r
+\r
+       SBI     PORTC,0                 ; C0 = PULLUP FOR CARD D0 WHILE NO CARD\r
+       SBI     PORTC,1                 ; C0 = PULLUP FOR CARD D1 WHILE NO CARD\r
+       SBI     PORTC,2                 ; C0 = PULLUP FOR CARD D2 WHILE NO CARD\r
+       SBI     PORTC,3                 ; C0 = PULLUP FOR CARD D3 WHILE NO CARD\r
+       SBI     PORTD,4                 ; D4 = PULLUP FOR CARD D4 WHILE NO CARD\r
+       SBI     PORTD,5                 ; D5 = PULLUP FOR CARD D5 WHILE NO CARD\r
+       SBI     PORTD,6                 ; D6 = PULLUP FOR CARD D6 WHILE NO CARD\r
+       SBI     PORTD,7                 ; D7 = PULLUP FOR CARD D7 WHILE NO CARD\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       CLR     FLAGS\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     NOTIFY_COUNT,A          ; SEND FIRST NOTIFICATION QUITE SOON\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,5                     ; TIMER0 TICK = APPROX 0.1 MS\r
+       OUT     TCCR0,A\r
+\r
+       LDI     D,1<<TOIE0\r
+       OUT     TIFR,D                  ; CLEAR ANY PENDING TIMER 0 OVERFLOW\r
+       OUT     TIMSK,D                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+BOMB_RESET:\r
+       ; ENTRY POINT FROM RX_WAIT\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+MAIN_LOOP:\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,'I'\r
+       BREQ    ESC_I\r
+       CPI     A,'D'\r
+       BREQ    ESC_D\r
+       CPI     A,'R'\r
+       BREQ    ESC_R\r
+       CPI     A,'W'\r
+       BRNE    MAIN_LOOP\r
+       RJMP    ESC_W\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_I:\r
+       ; RESET COMPACTFLASH CARD\r
+       RCALL   RESET_CARD\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_I_FAILURE\r
+\r
+       ; CONFIGURE COMPACTFLASH CARD\r
+       RCALL   CONFIGURE_CARD\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'I'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_I_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'i'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_D:\r
+       ; LOAD TASK FILE FOR IDENTIFY DRIVE COMMAND\r
+       LDI     A,0\r
+       LDI     B,6\r
+       RCALL   WRITE_VIA_CS0           ; SET DRIVE = 0\r
+\r
+       LDI     A,$EC\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE IDENTIFY DRIVE COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_D_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'D'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     D,$FF                   ; INITIALISE CHECKSUM BYTE\r
+       RJMP    ESC_D_ENTRY\r
+\r
+ESC_D_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'d'\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_R:\r
+       ; RECEIVE LBA ADDRESS AND SEQUENCE FROM HOST\r
+       RCALL   RECEIVE_LBA\r
+\r
+       RCALL   RX_WAIT                 ; RECEIVE CHECKSUM BYTE\r
+       CPSE    A,D\r
+       RJMP    MAIN_LOOP               ; BAD CHECKSUM, IGNORE REQUEST\r
+\r
+       ; LOAD TASK FILE FOR READ COMMAND\r
+       RCALL   LOAD_TASK_FILE\r
+\r
+       LDI     A,$20\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE READ SECTORS COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_R_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'R'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+ESC_D_ENTRY:\r
+       ; READ AND SEND THE REQUESTED DATA SECTOR\r
+       LDI     ZL,LOW($200)\r
+       LDI     ZH,HIGH($200)\r
+\r
+ESC_R_LOOP:\r
+       LDI     B,0\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+\r
+       SBIW    ZL,1\r
+       BRNE    ESC_R_LOOP\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_R_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'r'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND ERROR CODE TO HOST\r
+       LDI     A,0\r
+       ;SUB    D,A\r
+       RCALL   TX_WAIT\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_W:\r
+       ; RECEIVE LBA ADDRESS AND SEQUENCE FROM HOST\r
+       RCALL   RECEIVE_LBA             ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; LOAD TASK FILE FOR WRITE COMMAND\r
+       RCALL   LOAD_TASK_FILE\r
+\r
+       LDI     A,$30\r
+       LDI     B,7\r
+       RCALL   WRITE_VIA_CS0           ; ISSUE WRITE SECTORS COMMAND\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_R_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; RECEIVE AND WRITE THE REQUESTED DATA SECTOR, LESS 1 BYTE\r
+       LDI     ZL,LOW($1FF)\r
+       LDI     ZH,HIGH($1FF)\r
+\r
+ESC_W_LOOP:\r
+       RCALL   RX_WAIT\r
+       SUB     D,A\r
+\r
+       LDI     B,0\r
+       RCALL   WRITE_VIA_CS0\r
+\r
+       SBIW    ZL,1\r
+       BRNE    ESC_W_LOOP\r
+\r
+       ; RECEIVE THE LAST BYTE AND CHECKSUM, THEN TEST\r
+       RCALL   RX_WAIT\r
+       SUB     D,A\r
+       MOV     B,A\r
+\r
+       RCALL   RX_WAIT\r
+       CPSE    A,D\r
+       CBR     FLAGS,1<<CARD           ; PRETEND CARD IS GONE - WE WILL RESET\r
+       CPSE    A,D\r
+       RJMP    BOMB_RESET              ; BAD CHECKSUM, IGNORE REQUEST\r
+\r
+       MOV     A,B\r
+       LDI     B,0\r
+       RCALL   WRITE_VIA_CS0           ; WRITE LAST BYTE, BSY WILL GO HIGH\r
+\r
+       ; WAIT UNTIL BSY GOES LOW\r
+       RCALL   BUSY_WAIT\r
+       BRNE    ESC_W_FAILURE           ; UNLESS BSY = 0, RDY = 1\r
+\r
+       ; SUCCESS, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'W'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_W_FAILURE:\r
+       ; FAILURE, SEND ESC SEQUENCE TO HOST\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'w'\r
+       RCALL   TX_WAIT\r
+\r
+       RCALL   ECHO_LBA                ; RETURNS D = CHECKSUM TO HERE\r
+\r
+       ; SEND ERROR CODE TO HOST\r
+       LDI     A,0\r
+       ;SUB    D,A\r
+       RCALL   TX_WAIT\r
+\r
+       ; SEND CHECKSUM BYTE AND DONE\r
+       MOV     A,D\r
+       RCALL   TX_WAIT\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RECEIVE_LBA:\r
+       LDI     D,$FF\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 0-7\r
+       SUB     D,A\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 8-15\r
+       SUB     D,A\r
+       MOV     XH,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 16-23\r
+       SUB     D,A\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT                 ; RECEIVE LBA 24-27 AND SEQUENCE 0-3\r
+       SUB     D,A\r
+       MOV     YH,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ECHO_LBA:\r
+       MOV     A,XL\r
+       LDI     D,$FF\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,XH\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,YL\r
+       SUB     D,A\r
+       RCALL   TX_WAIT\r
+       MOV     A,YH\r
+       SUB     D,A\r
+       RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOAD_TASK_FILE:\r
+       LDI     A,1\r
+       LDI     B,2\r
+       RCALL   WRITE_VIA_CS0           ; SET SECTOR COUNT = 1\r
+\r
+       MOV     A,XL\r
+       LDI     B,3\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 0-7\r
+\r
+       MOV     A,XH\r
+       LDI     B,4\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 8-15\r
+\r
+       MOV     A,YL\r
+       LDI     B,5\r
+       RCALL   WRITE_VIA_CS0           ; SET LBA 16-23\r
+\r
+       MOV     A,YH\r
+       ANDI    A,$0F\r
+       ORI     A,$E0\r
+       LDI     B,6\r
+       RJMP    WRITE_VIA_CS0           ; SET LBA 24-27, DRIVE = 0, LBA = 1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_CARD:\r
+       LDI     A,$0E\r
+       LDI     B,6\r
+       RCALL   WRITE_VIA_CS1\r
+\r
+       LDI     A,0\r
+RESET_DELAY:\r
+       DEC     A\r
+       BRNE    RESET_DELAY\r
+\r
+       LDI     A,$0A\r
+       LDI     B,6\r
+       RJMP    WRITE_VIA_CS1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUSY_WAIT:\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+\r
+BUSY_WAIT_LOOP:\r
+       LDI     B,7\r
+       RCALL   READ_VIA_CS0\r
+\r
+       SBRS    A,7                     ; WAIT UNTIL BSY = 0\r
+       RJMP    BUSY_WAIT_DONE\r
+\r
+       SBIW    ZL,1\r
+       BRNE    BUSY_WAIT_LOOP\r
+\r
+BUSY_WAIT_DONE:\r
+       ANDI    A,$C0\r
+       CPI     A,$40\r
+       RET                             ; RETURNS Z IF BSY = 0, RDY = 1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CONFIGURE_CARD:\r
+       LDI     A,$01\r
+       LDI     B,1\r
+       RCALL   WRITE_VIA_CS0           ; SET FEATURE REGISTER = $01\r
+\r
+       LDI     A,$EF\r
+       LDI     B,7\r
+       RJMP    WRITE_VIA_CS0           ; ISSUE SET FEATURE COMMAND (8 BITS)\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+READ_VIA_CS0:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       LDI     B,$2F\r
+       OUT     PORTC,B                 ; CS0 = 0, PULLUPS ON FOR CARD D0-D3\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     B,$F4\r
+       OUT     PORTD,B                 ; IORD = 0, PULLUPS ON FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       IN      A,PINC\r
+       IN      B,PIND\r
+       EOR     A,B\r
+       ANDI    A,$0F\r
+       EOR     A,B\r
+\r
+       LDI     B,$FC\r
+       OUT     PORTD,B                 ; IORD = 1, PULLUPS ON FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS0 = 1, PULLUPS ON FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_VIA_CS0:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       MOV     B,A\r
+       ANDI    B,$0F\r
+       ORI     B,$20\r
+       OUT     PORTC,B                 ; CS0 = 0, DATA SET UP FOR CARD D0-D3\r
+       LDI     B,$3F\r
+       OUT     DDRC,B                  ; SET C0-C3 TO OUTPUTS FOR CARD D0-D3\r
+\r
+       MOV     B,A\r
+       ANDI    B,$F0\r
+       ORI     B,$0C\r
+       OUT     PORTD,B                 ; IOWR = 1, DATA SET UP FOR CARD D4-D7\r
+       LDI     B,$FC\r
+       OUT     DDRD,B                  ; SET D4-D7 TO OUTPUTS FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       CBI     PORTD,2                 ; IOWR = 0\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       SBI     PORTD,2                 ; IOWR = 1\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       ;LDI    B,$FC\r
+       OUT     PORTD,B                 ; IOWR = 1, PULL UPS FOR CARD D4-D7\r
+       LDI     B,$0C\r
+       OUT     DDRD,B                  ; SET D4-D7 TO INPUTS FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS0 = 1, PULL UPS FOR CARD D0-D3\r
+       LDI     B,$30\r
+       OUT     DDRC,B                  ; SET C0-C3 TO INPUTS FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_VIA_CS1:\r
+       OUT     PORTB,B                 ; SELECT ADDRESS\r
+\r
+       MOV     B,A\r
+       ANDI    B,$0F\r
+       ORI     B,$10\r
+       OUT     PORTC,B                 ; CS1 = 0, DATA SET UP FOR CARD D0-D3\r
+       LDI     B,$3F\r
+       OUT     DDRC,B                  ; SET C0-C3 TO OUTPUTS FOR CARD D0-D3\r
+\r
+       MOV     B,A\r
+       ANDI    B,$F0\r
+       ORI     B,$0C\r
+       OUT     PORTD,B                 ; IOWR = 1, DATA SET UP FOR CARD D4-D7\r
+       LDI     B,$FC\r
+       OUT     DDRD,B                  ; SET D4-D7 TO OUTPUTS FOR CARD D4-D7\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       CBI     PORTD,2                 ; IOWR = 0\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       SBI     PORTD,2                 ; IOWR = 1\r
+\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       ;LDI    B,$FC\r
+       OUT     PORTD,B                 ; IOWR = 1, PULL UPS FOR CARD D4-D7\r
+       LDI     B,$0C\r
+       OUT     DDRD,B                  ; SET D4-D7 TO INPUTS FOR CARD D4-D7\r
+\r
+       LDI     B,$3F\r
+       OUT     PORTC,B                 ; CS1 = 1, PULL UPS FOR CARD D0-D3\r
+       LDI     B,$30\r
+       OUT     DDRC,B                  ; SET C0-C3 TO INPUTS FOR CARD D0-D3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4106                   ; HARDWARE ADDRESS COMMAND\r
+       .DW     $4207                   ; SOFTWARE ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/charav0.asm b/src/avr/charav0.asm
new file mode 100644 (file)
index 0000000..7e5c7af
--- /dev/null
@@ -0,0 +1,2433 @@
+;      CHARAV0.ASM\r
+;      CHARACTERIZE MODE\r
+\r
+;      17MAY01\r
+;      FOUND SOME UNITS WITH FAST WGT FREQ (50KHZ) ABORTING TILT MEASUREMENT\r
+;      AT LOW TEMPERATURES DUE TO INSUFFICIENT TIME => INCR TO 18 CYCLES PER\r
+\r
+;      ALSO FOUND EXCESSIVE JITTER IN TEMP MEASUREMENT PARTLY DUE TO SERVO\r
+;      ONTO SIGNAL EDGE AND PARTLY TO 33MHZ NOISE ON THERMISTOR => FIX TIMING,\r
+;      AND PACE DATA OUTPUT (SOME PROBLEM STILL REMAINS)\r
+\r
+;      ALSO HAD STACK OVERFLOW => REORDER SRAM VARIABLES\r
+\r
+\r
+.INCLUDE "4433DEF.INC" ; FOR AVR ASSEMBLER\r
+;.INCLUDE "4433DEFX.INC" ; FOR NICK ASSEMBLER\r
+.INCLUDE "MACLC.INC"\r
+;.INCLUDE "APILC.INC"\r
+.INCLUDE "TERLC.INC"\r
+\r
+; WE SHOULD CHANGE THE CODE TO USE UCSRA AND UCSRB\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   CR              =$0D\r
+.EQU   LF              =$0A\r
+.EQU   RX_SIZE         =1\r
+.EQU   TX_SIZE         =8              ; LEAVES 10 BYTES FREE\r
+.EQU   API_ADDRESS     =$01            ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   CYC_MAX         =256            ; MAXIMUM WEIGHING CYCLE TIME\r
+.EQU   CYC_MIN         =160            ; MINIMUM WEIGHING CYCLE TIME > 6\r
+                                       ; < 210 ELSE OVERFLOW FOR FREQ < 27KHZ\r
+\r
+.EQU   CYC_ZERO        =16             ; INITIAL ZEROING COUNT\r
+.EQU   CYC_START       =32             ; INITIAL SMOOTHING COUNT\r
+\r
+                                       ; BITS IN RANGE\r
+.EQU   RNG             =$0F            ; RANGE BITS 0-3\r
+.EQU   RND             =6              ; ROUND UP (FOR HYSTERESIS)\r
+.EQU   SGN             =7              ; SIGN (FOR HYSTERESIS)\r
+                                       ; SGN MUST BE BIT 7 FOR EOR INSTRUCTION\r
+\r
+                                       ; BITS IN STATUS\r
+.EQU   OUCHFLG         =0              ; OVERLOAD\r
+.EQU   LOWFLG          =1              ; UNDERLOAD\r
+.EQU   UNSTBL          =2              ; UNSTABLE\r
+.EQU   VSTBL           =3              ; VERY STABLE\r
+.EQU   ZROFLG          =4              ; DISPLAY SHOWS ZERO\r
+.EQU   TRYZRO          =5              ; TRYING TO SET ZERO\r
+.EQU   SEND_SN         =6              ; TRYING TO SEND S/N MESSAGE\r
+.EQU   SEND_SPAN       =7              ; TRYING TO SEND SPAN MESSAGE\r
+\r
+                                       ; BITS IN FLAGS\r
+.EQU   SNDDAT          =0              ; SEND CHARACTERIZE DATA\r
+.EQU   ESC             =1              ; SET AFTER RECEIVING ESC\r
+.EQU   ESCM            =2              ; SET AFTER RECEIVING ESC M\r
+.EQU   BOMB            =3              ; SET DURING TILT MEASUREMENT\r
+.EQU   NEWDAT          =4              ; NEW SCALE DATA AVAILABLE\r
+.EQU   DIR             =5              ; DIRECTION OF CHANGE IN WGT\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+                                       ; BITS IN MODE\r
+.EQU   ABSGMS_FLG      =0              ; ABSOLUTE WEIGHT IN FP FORMAT\r
+.EQU   ZROGMS_FLG      =1              ; ZERO REGISTER IN FP FORMAT\r
+.EQU   TMPDEG_FLG      =2              ; TEMPERATURE (DEGREES) IN FP FORMAT\r
+.EQU   TLTBUB_FLG      =3              ; TILT BUBBLE POSITION IN INT FORMAT\r
+.EQU   WGTFRQ_FLG      =4              ; WEIGHT FREQUENCY IN FP FORMAT\r
+.EQU   TMPFRQ_FLG      =5              ; TEMPERATURE FREQUENCY IN FP FORMAT\r
+.EQU   TLRFRQ_FLG      =6              ; TILT LEFT/RIGHT IN FP FORMAT\r
+.EQU   TFBFRQ_FLG      =7              ; TILT FRONT/BACK IN FP FORMAT\r
+\r
+.DEF   FC0             =R0             ; AUXILLIARY FP ACCUMULATOR\r
+.DEF   FC1             =R1\r
+.DEF   FC2             =R2\r
+\r
+.EQU   FB              =$03\r
+.DEF   FB0             =R3             ; ARGUMENT FP ACCUMULATOR\r
+.DEF   FB1             =R4\r
+.DEF   FB2             =R5\r
+.DEF   FB3             =R6\r
+\r
+.EQU   FA              =$07\r
+.DEF   FA0             =R7             ; PRINCIPAL FP ACCUMULATOR\r
+.DEF   FA1             =R8\r
+.DEF   FA2             =R9\r
+.DEF   FA3             =R10\r
+\r
+.DEF   CYC_0           =R11\r
+.DEF   CYC_1           =R12\r
+\r
+.DEF   WT_0            =R13            ; RUNNING COUNT FOR 16 WEIGHT CYCLES\r
+.DEF   WT_1            =R14            ; TIMER1 INPUT CAPTURE LOW\r
+.DEF   WT_2            =R15            ; TIMER1 INPUT CAPTURE HIGH\r
+\r
+.DEF    A              =R17            ; GLOBAL REGISTERS\r
+.DEF    B              =R18\r
+.DEF   D               =R19\r
+.DEF   E               =R20\r
+.DEF   F               =R21\r
+\r
+.DEF   SR              =R22            ; SECONDARY REGISTER SET\r
+.DEF   G               =R23\r
+.DEF   H               =R24\r
+.DEF   I               =R25\r
+.DEF   J               =R27            ; XH\r
+.DEF   K               =R29            ; YH\r
+\r
+.DEF   FLAGS           =R16            ; MUST BE REGISTER, FOR ATOMIC ACCESS\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+STARTUP:       .BYTE   1               ; SMOOTHING COUNT FOR INITIAL STARTUP\r
+F3:\r
+TLTL_BUF:      .BYTE   2               ; DATA OUTPUT BUFFERS\r
+TLTR_BUF:      .BYTE   2\r
+F4:\r
+TLTF_BUF:      .BYTE   2\r
+TLTB_BUF:      .BYTE   2\r
+WGT:           .BYTE   3               ; ACCUMULATOR FOR 64 GROUPS OF 16\r
+TMP:           .BYTE   3               ; ACCUMULATOR FOR 256 TEMPERATURE\r
+TLTL:          .BYTE   2               ; ACCUMULATOR FOR 64 TILT CYCLES (TLT0)\r
+TLTR:          .BYTE   2\r
+TLTF:          .BYTE   2               ;                                (TLT1)\r
+TLTB:          .BYTE   2\r
+DTMP:          .BYTE   2               ; DIFFERENCE COUNT FOR CURRENT TEMP CYC\r
+WGTLST:                .BYTE   3               ; VALUE OF ADDITION TO WGT ON LAST CYC\r
+TL:            .BYTE   4               ; AVERAGED TLTLR\r
+TF:            .BYTE   4               ; AVERAGED TLTFB\r
+TMPFRQ:                .BYTE   4               ; TEMPERATURE FREQUENCY CYCLES/30MHZ\r
+GMS:           .BYTE   4\r
+INTGMS:                .BYTE   4\r
+COUNT:         .BYTE   4\r
+\r
+F0:            .BYTE   4               ; FLOATING POINT REGISTERS\r
+F1:            .BYTE   4\r
+F2:            .BYTE   4\r
+RANGE:         .BYTE   1\r
+STATUS:                .BYTE   1\r
+MODE:          .BYTE   1\r
+;MODE_CYCLE:   .BYTE   1               ; WEIGHING ONLY\r
+WGTFRQ:                .BYTE   4               ; CHARACTERIZE ONLY\r
+REF_30MHZ:     .BYTE   4               ; CHARACTERIZE ONLY\r
+TMP_PHASE:     .BYTE   1\r
+DSPRES:                .BYTE   4\r
+ZROGMS:                .BYTE   4\r
+\r
+API_REMAIN:    .BYTE   1\r
+RX_PTR:                .BYTE   1\r
+RX_COUNT:      .BYTE   1\r
+RX_BUF:                .BYTE   RX_SIZE\r
+TX_PTR:                .BYTE   1\r
+TX_COUNT:      .BYTE   1\r
+TX_BUF:                .BYTE   TX_SIZE         ; CAREFUL - COULD BE CLOBBERED BY STACK\r
+\r
+DSPGMS:                .BYTE   4               ; MOVED 02JUL01\r
+LSTGMS:                .BYTE   4               ; MOVED 17MAY01\r
+LSTDEV:                .BYTE   4               ; MOVED 17MAY01\r
+AVESTD:                .BYTE   4               ; MOVED 17MAY01\r
+AVEGMS:                .BYTE   4               ; MOVED 17MAY01\r
+\r
+.ESEG\r
+.ORG   $000                            ; ALL CONSTANTS IN IEEE754 FORMAT\r
+VOID:  .DB     $00,$00                 ; DON'T USE ADDR $000\r
+;EEMODE:       .DB     $00,$00         ; SEND ASCII WEIGHT DATA ONLY\r
+\r
+;SPAN: .DB     $00,$00,$80,$3F         ; 1.0000000E+00 DEFAULT TO 1\r
+SPAN:  .DB     $1B,$BA,$7F,$3F         ; 0.9989335E+00 SPAN FOR JSY/NLD\r
+\r
+RANGES: .DB    $04,$00                 ;  OIML APO30\r
+RANGE1: .DB    $00,$40,$1C,$45         ;  2500\r
+       .DB     $00,$00,$80,$3F         ;     1\r
+       .DB     $00,$40,$9C,$45         ;  5000\r
+       .DB     $00,$00,$A0,$40         ;     5\r
+       .DB     $00,$40,$1C,$46         ; 10000\r
+       .DB     $00,$00,$20,$41         ;    10\r
+RNGMAX: .DB    $00,$D8,$EA,$46         ; 30060\r
+       .DB     $00,$00,$A0,$41         ;    20\r
+\r
+.CSEG\r
+\r
+       .ORG    0\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT0ADDR\r
+       RJMP    TMP_INT                 ; INT0 HANDLER FOR TEMPERATURE MEASUREMENT\r
+\r
+       .ORG    ICP1ADDR\r
+       RJMP    WGT_INT                 ; TIMER1 CAPTURE HANDLER\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+\r
+.INCLUDE  "PRM.INC"                    ; LOAD CELL CHARACTERIZE PARAMETERS\r
+\r
+TLT2:  .DB     $C7,$75,$41,$AF ;-1.759509E-10  TILT LINEARISATION PARAMETERS\r
+TLT1:  .DB     $25,$7E,$0B,$35 ; 5.196510E-07\r
+TLT0:  .DB     $04,$31,$E3,$39 ; 4.333333E-04\r
+\r
+TICKS: .DB     $AE,$11,$8D,$45 ; 4.514210E+03 = 4096*33.06306M/30M\r
+\r
+HSTRSL:        .DB     $33,$33,$B3,$3E ; 3.500000E-01 = (0.5-0.15)\r
+HSTRSH:        .DB     $66,$66,$26,$3F ; 6.500000E-01 = (0.5+0.15)\r
+QUANT: .DB     $CD,$CC,$4C,$3E ; 2.000000E-01\r
+\r
+;K0:   .DB     $00,$00         ; 0.000000E+00\r
+;K_1:  .DB     $00,$00,$80,$BF ;-1.000000E+00 DON'T MOVE!\r
+;K_R5: .DB     $00,$00,$00,$BF ;-5.000000E-01\r
+KR0001:        .DB     $17,$B7,$D1,$38 ; 1.000000E-04\r
+KR005: .DB     $0A,$D7,$A3,$3B ; 5.000000E-03\r
+HYSCNF:        ;.DB    $CD,$CC,$CC,$3D ; 1.000000E-01 = .3/3\r
+KR1:   .DB     $CD,$CC,$CC,$3D ; 1.000000E-01\r
+KR3:   .DB     $9A,$99,$99,$3E ; 3.000000E-01\r
+KR5:   .DB     $00,$00,$00,$3F ; 5.000000E-01\r
+K1:    .DB     $00,$00,$80,$3F ; 1.000000E+00\r
+;K2:   .DB     $00,$00,$00,$40 ; 2.000000E+00\r
+K3:    .DB     $00,$00,$40,$40 ; 3.000000E+00\r
+K4:    .DB     $00,$00,$80,$40 ; 4.000000E+00\r
+K10:   .DB     $00,$00,$20,$41 ; 1.000000E+01\r
+K16:   .DB     $00,$00,$80,$41 ; 1.600000E+01\r
+CNFHYS:        ;.DB    $00,$00,$A0,$41 ; 2.000000E+01 = 3/.15\r
+K20:   .DB     $00,$00,$A0,$41 ; 2.000000E+01\r
+K30:   .DB     $00,$00,$F0,$41 ; 3.000000E+01\r
+K64:   .DB     $00,$00,$80,$42 ; 6.400000E+01\r
+;K100: .DB     $00,$00,$C8,$42 ; 1.000000E+02\r
+;K256: .DB     $00,$00,$80,$43 ; 2.560000E+02\r
+K228:  .DB     $39,$8E,$63,$43 ; 2.275556E+02 = 256*16/18 REVISED 17MAY01\r
+K400:  .DB     $00,$00,$C8,$43 ; 4.000000E+02\r
+K450:  .DB     $00,$00,$E1,$43 ; 4.500000E+02\r
+;K1450:        .DB     $00,$40,$B5,$44 ; 1.450000E+03\r
+;K10K: .DB     $00,$40,$1C,$46 ; 1.000000E+04\r
+; CHARACTERIZE ONLY %\r
+K100K: .DB     $00,$50,$C3,$47 ; 1.000000E+05\r
+K30M:  .DB     $C0,$E1,$E4,$4B ; 3.000000E+07\r
+K33M:  .DB     $00,$20,$FD,$4B ; 3.317760E+07\r
+; %\r
+\r
+; PUT THIS IN EEPROM:\r
+;SIGNON: .DB   3,0                     ; MUST HAVE EVEN NUMBER OF CHARS\r
+;      .DB     "LC"\r
+;      .DB     $0D,$0A\r
+FMAT0: .DB     6,0\r
+       .DB     " 0.000"\r
+FMAT1: .DB     6,0\r
+       .DB     "-OUCH "\r
+FMAT2: .DB     6,0\r
+       .DB     " -LO- "\r
+FMAT3: .DB     6,0\r
+       .DB     "HELLO "\r
+;FMAT4:        .DB     6,0\r
+;      .DB     "Error "\r
+FMAT5: .DB     6,0\r
+       .DB     "      "\r
+FMAT6: .DB     2,0\r
+       .DB     $0D,$0A\r
+;FMAT6:        .DB     3,0\r
+;      .DB     $20,$0D,$0A,0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       OUTI    SPL,RAMEND              ; INIT STACK POINTER\r
+       OUTI    ACSR,$80                ; POWER DOWN ANALOG COMPARATOR\r
+\r
+;      SBI     DDRB,5                  ; SET SK TO OUTPUT FOR DIAGNOSTICS\r
+\r
+       SBI     DDRD,2                  ; SET BIT 2 TO OUTPUT FOR TEMP SENSOR\r
+       SBI     DDRD,3                  ; SET BIT 3 TO OUTPUT FOR TILT SENSOR\r
+\r
+       OUTI    TCCR1B,1                ; SET COUNTER1 TO CLOCK AT 11.0592 MHZ\r
+                                       ; AND INPUT CAPTURE ON FALLING EDGE\r
+;      OUTI    MCUCR,2                 ; SET INT0 FALLING EDGE FOR TEMP SENSOR\r
+       OUTI    MCUCR,0                 ; SET INT0 LOW SENSE FOR TEMP SENSOR\r
+                                       ; 17MAY01 BOMBS GRACEFULLY AT EACH EXTREME\r
+\r
+       CLR     CYC_0\r
+       CLR     CYC_1\r
+\r
+       CLR     A\r
+       STS     RANGE,A\r
+       RCALL   STS_STATUS_A\r
+       STS     STARTUP,A\r
+       STS     TMP_PHASE,A\r
+\r
+       ;LDER   A,EEMODE\r
+; CHARACTERIZE ONLY %\r
+       LDI     A,$F0\r
+; %\r
+       STS     MODE,A\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     A,1\r
+;      STS     MODE_CYCLE,A\r
+; %\r
+\r
+       FLDF    K1\r
+       FST     DSPRES\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     LSTGMS\r
+       FST     LSTDEV\r
+       FST     AVEGMS\r
+       FST     AVESTD\r
+       FST     INTGMS\r
+; CHARACTERIZE ONLY %\r
+       FST     WGTFRQ                  ; MAY NOT BE NECESSARY\r
+       FST     REF_30MHZ               ; NECESSARY\r
+; %\r
+\r
+       INIT_API_BUS                    ; SET UART RATE AND CLEAR FLAGS/PTRS\r
+\r
+       IN      A,TIMSK\r
+       ORI     A,8                     ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+       OUT     TIMSK,A\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       OUTI    WDTCR,1<<WDE | 1<<WDTOE ; ENABLE CHANGE OF TIMEOUT VALUE\r
+       OUTI    WDTCR,1<<WDE | $07      ; ENABLE WATCHDOG WITH 2 SEC TIMEOUT\r
+;      LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+;      OUT     WDTCR,A\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;      LDFL    D,SIGNON                ; SEND SIGNON MESSAGE\r
+;      LDI     E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+\r
+LOOP:                                  ; MAIN PROGRAM\r
+       ; IF THE INTERRUPT ALREADY CAME,\r
+       ; THROW AWAY THE DATA AND WAIT FOR A NEW ONE\r
+       CBR     FLAGS,1<<NEWDAT\r
+WAIT_LOOP:\r
+       ; TEST FOR WAITING COMMANDS OR DATA\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    WAIT_LOOPE\r
+       RCALL   RX_CHAR\r
+ ; LOOPBACK TEST\r
+ ;RCALL TX_CHAR\r
+       SBRC    FLAGS,ESC\r
+       RJMP    PROCESS_ESC\r
+       CPI     A,$1B\r
+       BRNE    WAIT_LOOPE\r
+       SBR     FLAGS,1<<ESC\r
+WAIT_LOOPE:\r
+       ; TEST FOR NEW DATA LEFT BY THE INTERRUPT\r
+       SBRS    FLAGS,NEWDAT\r
+       RJMP    WAIT_LOOP\r
+\r
+       WDR                     ; FEED WATCHDOG\r
+\r
+       ; SAY WE ARE TAKING THE NEW DATA\r
+       ;CBR    FLAGS,1<<NEWDAT\r
+\r
+       ; PROVIDE SQUARE WAVE DIAGNOSTIC ON B5\r
+       ;IN     A,PORTB\r
+       ;LDI    B,1<<5\r
+       ;EOR    A,B\r
+       ;OUT    PORTB,A\r
+\r
+       ;FLD DSPRES                     ; STACK TEST\r
+       ;RCALL SHOW_FA\r
+       ;LDI A,' '\r
+       ;RCALL TX_WAIT\r
+\r
+       FLD2    F2                      ; CONVERT CYCLE COUNT TO FP FORMAT\r
+       FST     F2\r
+       ;LDI    A,1<<WGTFRQ_FLG\r
+       ;LDI    F,'0'+WGTFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+GRAMS: FLD3    GMS                     ; CONVERT WEIGHT COUNT TO FP FORMAT\r
+; CHARACTERIZE ONLY %\r
+       FST     GMS\r
+       FAD     REF_30MHZ\r
+       FST     REF_30MHZ\r
+       FLD     GMS\r
+; %\r
+       ;LDI    A,1<<TMPFRQ_FLG\r
+       ;LDI    F,'0'+TMPFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FDV     F2\r
+;      FMLF    K256\r
+       FMLF    K228                    ; 17MAY01 256*16/18=227.55556\r
+;FDVF  K18\r
+;FMLF  K16\r
+       FST     GMS\r
+       FLDF    TICKS                   ; CONVERSION FACTOR\r
+       FDV     GMS\r
+       FST     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;      30usec\r
+\r
+       FLD3    F0                      ; CONVERT TEMPERATURE COUNT TO FP\r
+       FDV     F2                      ;   (THIS ROUTINE FREES UP F0)\r
+       FMLF    K64\r
+       FST     F0\r
+       FLDF    KR3\r
+       FDV     F0                      ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;LDI A,$0D\r
+;RCALL SNDEXP\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TMPFRQ\r
+       RCALL   SMOOTH\r
+;      270usec\r
+\r
+       ;LDS    A,STARTUP\r
+       ;SUBI   A,-$30\r
+       ;RCALL  TX_WAIT\r
+\r
+       FLD     GMS\r
+; CHARACTERIZE ONLY %\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,WGTFRQ\r
+       RCALL   SMOOTH\r
+; %\r
+       LDI     A,1<<WGTFRQ_FLG\r
+       LDI     F,'0'+WGTFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+       FLD     TMPFRQ\r
+       LDI     A,1<<TMPFRQ_FLG\r
+       LDI     F,'0'+TMPFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTL_BUF             ; CONVERT TILT TO FP (FREE UP F2, F3)\r
+       RCALL   LIN_TLT                 ; RETURNS CYCLES/30MHZ CLOCK TICK\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TL\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TLRFRQ_FLG\r
+       LDI     F,'0'+TLRFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TLRFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTF_BUF             ; (FREE UP F4)\r
+       RCALL   LIN_TLT\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TF\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TFBFRQ_FLG\r
+       LDI     F,'0'+TFBFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TFBFRQ IF DIAGNOSTIC MODE\r
+;2msec\r
+\r
+       RCALL   NRMTMP                  ; CONVERT TO NORMALIZED TEMP (-1<T<+1)\r
+       FST     F4                      ; AND SAVE NOW THAT F4 AVAILABLE\r
+       LDI     F,6                     ; DEGREE\r
+       LDIZ    A11                     ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; ZERO COMP A11*T^6+A10*T^5+A9*T^4+...\r
+       FST     F1\r
+;      1.1msec\r
+\r
+       FLD     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+       FADE    _WREF                   ; SHIFT ORIGIN TO IMPROVE PRECISION\r
+       LDFL    E,SEGS1                 ; GET SEGMENT COUNT\r
+       LDIZ    SEG1                    ; POINT TO FIRST SEGMENT BOUNDARY\r
+SEGN:  RCALL   CPF_FA                  ; COMPARE FA WITH SEGn\r
+       BRCC    GOTSEG\r
+       ADIW    ZL,12                   ; POINT TO NEXT SEGn\r
+       DEC     E\r
+       BRNE    SEGN\r
+GOTSEG:                                        ; CONVERT TO GMS = D2*W^2 + D1*W + D0\r
+       LDI     F,2                     ; DEGREE\r
+       RCALL   POLY                    ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FAD     F1                      ; GMS=GMS+(THERMAL ZERO CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; NOW, BACK TO GRAMS\r
+       LDFH    F,DEGS                  ; DEGREE\r
+       LDI     E,3                     ; RANGE COUNT\r
+       LDIZ    K500                    ; POINT TO 1ST RANGE BOUNDARY\r
+       RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCC    NEXT_SPNRNG\r
+\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CASE GMS<500\r
+       FDVE    K500\r
+       FML     GMS\r
+       RJMP    THERM_SPAN\r
+\r
+SPNRNG:        RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCS    GOT_SPNRNG\r
+NEXT_SPNRNG:\r
+       ADIW    ZL,32                   ; POINT TO NEXT RANGE BOUNDARY\r
+       DEC     E\r
+       BRNE    SPNRNG\r
+       ADIW    ZL,4\r
+GOT_SPNRNG:\r
+       SBIW    ZL,40                   ; POINT TO PREVIOUS BOUNDARY\r
+       RCALL   SUBE_FA\r
+       FST     F2                      ; F2=GMS-LOWER BOUNDARY\r
+       MOV     E,F                     ; SAVE DEGREE FOR LATER\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FST     F3                      ; CORR.LOW\r
+       MOV     F,E                     ; F=DEGREE, ZL POINTS TO DELTA LOAD\r
+       ADIW    ZL,8                    ; POINT TO NEXT HIGH ORDER COEFFICIENT\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CALCULATE CORR.HIGH\r
+       FSB     F3                      ; CORR.HIGH-CORR.LOW\r
+       SBIW    ZL,8+4+(6*4)            ; POINT TO EARLIER DELTA LOAD (DEGREE=6)\r
+       RCALL   DIVE_FA\r
+       FML     F2\r
+       FAD     F3                      ; THERMAL SPAN CORRECTION\r
+THERM_SPAN:\r
+       FST     F2\r
+\r
+       ;LDI    A,1<<ZROGMS_FLG\r
+       ;LDI    F,'0'+ZROGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FAD     GMS                     ; GMS=GMS+(THERMAL SPAN CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_10\r
+       MOV     F,FA0\r
+\r
+       FLD     F4                      ; NORMALISED TEMPERATURE\r
+       FMLF    K30\r
+       FADF    K20                     ; CONVERT TO DEGREES CELSIUS\r
+       RCALL   FIX_10                  ; TEMPERATURE (10TH DEGREES)\r
+       MOV     FA2,F                   ; THERMAL ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,E                   ; THERMAL SPAN CORRECTION (10TH GMS)\r
+\r
+       LDI     A,1<<TMPDEG_FLG\r
+       LDI     F,'0'+TMPDEG_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+; TILT CORRECTION\r
+; TLTP1=TLTA31*TLTFR0 + TLTA21*TLTFR1^2+TLTA11*TLTFR1+TLTA01\r
+       LDIZ    TLTA21                  ; TILT FB BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TF\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA31\r
+       FML     TL\r
+       FAD     F0\r
+       FST     F1\r
+\r
+; TLTP0=TLTA30*TLTFR1 + TLTA20*TLTFR0^2+TLTA10*TLTFR0+TLTA00\r
+       LDIZ    TLTA20                  ; TILT LR BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TL\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA30\r
+       FML     TF\r
+       FAD     F0\r
+       FST     F0\r
+\r
+; TLTSPN1 = (TLTC21*TLTP1+TLTC11)*TLTP1\r
+       RCALL   LDF_FA                  ; TLTC21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTC11\r
+       FML     F1\r
+       FST     F3\r
+\r
+; TLTSPN0 = (TLTC20*TLTP0+TLTC10)*TLTP0\r
+       RCALL   LDF_FA                  ; TLTC20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTC10\r
+       FML     F0\r
+\r
+; WEIGHT = WEIGHT + WEIGHT*(TLTSPN0+TLTSPN1)\r
+       FAD     F3\r
+       FST     F3                      ; TLTSPN\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FML     GMS\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+; WEIGHT=WEIGHT + TLTB21*TLTP1^2+TLTB11*TLTP1\r
+       RCALL   LDF_FA                  ; TLTB21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTB11\r
+       FML     F1\r
+       FST     F2\r
+\r
+; WEIGHT=WEIGHT + TLTB20*TLTP0^2+TLTB10*TLTP0\r
+       RCALL   LDF_FA                  ; TLTB20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTB10\r
+       FML     F0\r
+       FAD     F2\r
+       FST     F2                      ; TLTZRO\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+       FLD     F3\r
+       FMLE    K10K\r
+       RCALL   FIX_ENTRY\r
+       MOV     D,FA0\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_400\r
+       MOV     F,FA0\r
+\r
+       FLD     F0\r
+       RCALL   FIX_400                 ; TILT X POSITION\r
+       MOV     FA1,F                   ; TILT Y POSITION\r
+       MOV     FA2,E                   ; TILT ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,D                   ; TILT SPAN CORRECTION (10TH GMS/KG)\r
+\r
+       LDI     A,1<<TLTBUB_FLG\r
+       LDI     F,'0'+TLTBUB_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+;SKIP_TILT:\r
+       ;FLD    GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLDE    SPAN\r
+       FML     GMS\r
+       FST     GMS\r
+\r
+; RECALIBRATION\r
+       LDI     F,3                     ; DEGREE\r
+       LDI     ZL,LOW(CAL3*2)          ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; CAL3*GMS^3+CAL2*GMS^2+CAL1*GMS+CAL0\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; AVERAGING ALGORITHM\r
+                                       ; MEASURE DEVIATION\r
+       FSB     LSTGMS                  ; DEV=GMS-LSTGMS\r
+       LDS     A,LSTDEV+2              ; IF SGN(DEV)=SGN(LSTDEV) (SAME DIR)\r
+       EOR     A,FA2\r
+       BRMI    AV0\r
+       FAD     LSTDEV                  ; THEN DEV=DEV+LSTDEV (ACCUMULATE DEV)\r
+AV0:\r
+; WEIGHING ONLY %\r
+; %    FST     LSTDEV\r
+       LDI     A,$7F                   ; IF ABS(DEV) < QUANT\r
+       AND     FA2,A\r
+       FST     F0\r
+       FCPF    QUANT\r
+       BRCC    AV1\r
+       FLDF    QUANT                   ; THEN STD=QUANT (STD DEV > QUANT)\r
+       FST     F0                      ; ELSE STD=ABS(DEV) (APPROX STD DEV)\r
+\r
+                                       ; SET AVERAGING PERIOD\r
+AV1:   FLD     COUNT                   ; IF STD/AVESTD > CNT/(CNT+1)\r
+       FML     AVESTD                  ; (STILL TOO NOISY)\r
+       FST     F1\r
+       FLD     COUNT\r
+       FADF    K1\r
+       FST     F2\r
+       FML     F0\r
+       FCP     F1\r
+       BRCS    AV2\r
+       FLD     F2                      ; THEN INCR CNT (EXTEND AVERAGE)\r
+       FST     COUNT\r
+AV2:   FLD     AVESTD                  ; MAXCNT=(AVESTD/DSPRES)*(CONF/HYST)\r
+       FDV     DSPRES\r
+       FMLF    CNFHYS\r
+       FST     F1\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV3                     ; (UNTIL STD DEV < HYST)\r
+       RCALL   LDS_A_STATUS            ; THEN VERY STABLE=1\r
+       SBR     A,1<<VSTBL\r
+       RCALL   STS_STATUS_A\r
+AV3:   FLD     F1                      ; MAXCNT=MAXCNT+30\r
+       FADF    K30\r
+       FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV4\r
+       FLD     F1                      ; THEN CNT=MAXCNT\r
+       FST     COUNT\r
+\r
+                                       ; AVERAGE THE DEVIATION\r
+AV4:   FLD     COUNT                   ; NN=CNT (WEIGHTING FOR AVESTD)\r
+       FST     F1\r
+       FLD     F0                      ; IF STD*3 < AVESTD (VERY QUIET)\r
+       FMLF    K3\r
+       FCP     AVESTD\r
+       BRCC    AV5\r
+       FLD     F1                      ; THEN IF NN>10 THEN NN=10\r
+       FCPF    K10                     ; (ADAPT LOWER QUICKLY)\r
+       BRCS    AV5\r
+       FLDF    K10\r
+       FST     F1                      ; NN\r
+AV5:   FLD     F0                      ; STD\r
+; WEIGHING ONLY %\r
+;      LDI     F,AVESTD\r
+; %    RCALL   SMOOTH_FP               ; AVESTD=(STD+AVESTD*(NN-1))/NN\r
+       FLD     COUNT                   ; IF AVESTD < CNT*DSPRES*HYST\r
+       FML     DSPRES                  ;    (NO DISPLAY FLICKER)\r
+       FMLF    HYSCNF\r
+       FCP     AVESTD\r
+       BRCS    AV6\r
+       RCALL   LDS_A_STATUS            ; THEN UNSTABLE=0 (STABLE)\r
+       CBR     A,1<<UNSTBL\r
+       RCALL   STS_STATUS_A\r
+                                       ; AVERAGE THE DATA\r
+AV6:   FLD     GMS\r
+; WEIGHING ONLY %\r
+; %    FST     LSTGMS                  ; READY FOR NEXT CYCLE\r
+       FSB     AVEGMS\r
+       FST     F2                      ; ERRGMS=GMS-AVEGMS\r
+       FMLF    K4\r
+       FST     F1                      ; ERRGMS*4\r
+       RCALL   LDS_A_STATUS            ; NOW SET WEIGHTING FOR AVEGMS\r
+       SBRS    A,VSTBL                 ; IF VERY STABLE\r
+       RJMP    AV7\r
+       FLD     F1                      ; THEN NN=CNT+(ERRGMS*4/DSPRES)^2\r
+       FDV     DSPRES                  ;      (EXCLUDE NOISY DATA)\r
+       FST     F3                      ;       ERRGMS*4/DSPRES\r
+       FML     F3                      ;      (ERRGMS*4/DSPRES)^2\r
+       FAD     COUNT\r
+       RJMP    AV8\r
+AV7:   FLD     COUNT                   ; ELSE NN=CNT (EXCEPT AFTER JUMP)\r
+AV8:   FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     GMS\r
+; WEIGHING ONLY %\r
+;      LDI     F,AVEGMS\r
+; %    RCALL   SMOOTH_FP               ; AVEGMS=(GMS+AVEGMS*(NN-1))/NN\r
+       LDI     A,1<<ABSGMS_FLG\r
+       LDI     F,'0'+ABSGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+                                       ; ALLOW INTGMS TO DECAY\r
+       FLD     F2                      ; ERRGMS\r
+       FMLF    K4\r
+       FST     F3                      ; ERRGMS*4\r
+       FML     F3\r
+       FADF    K10\r
+       FST     F1                      ; NN=10+(ERRGMS*4)^2 (TIME CONSTANT)\r
+       FLD     INTGMS                  ; INTGMS=INTGMS-INTGMS/NN (DECAY)\r
+       FDV     F1\r
+       FSB     INTGMS\r
+       FST     INTGMS                  ; ACTUALLY -INTGMS\r
+\r
+                                       ; INTEGRATE ERROR BETWEEN DATA AND AVE\r
+       FLD     DSPRES                  ; MINERR=DSPRES-AVESTD*2\r
+       FSB     AVESTD\r
+       FSB     AVESTD\r
+       FST     F3\r
+       TST     FA2                     ; IF MINERR < 0\r
+       BRPL    AV9\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     F3                      ; THEN MINERR=0\r
+AV9:   FLD     F2                      ; ERRGMS\r
+       BST     FA2,7                   ; SAVE SIGN\r
+       LDI     A,$7F\r
+       AND     FA2,A\r
+       FST     F1                      ; ABS(ERRGMS)\r
+       FCP     F3                      ; IF ABS(ERRGMS) < MINERR\r
+       BRCC    AV10\r
+       FLD     INTGMS                  ; THEN ERRGMS=0 (INTGMS UNCHANGED)\r
+       RJMP    AV12\r
+AV10:  FLD     F1                      ; WIND TO HAVE NO ADVANTAGE OVER GMS<20\r
+       FCPF    K20                     ; IF ABS(ERRGMS) < 20\r
+       BRCC    AV11\r
+       FLDF    K1                      ; THEN ERRGMS=SGN(ERRGMS)\r
+       BLD     FA2,7                   ;      (RESTORE SIGN)\r
+       FST     F2\r
+AV11:  FLDF    K4                      ; INTGMS=INTGMS+ERRGMS*4/STD\r
+       FML     F2\r
+       FDV     F0\r
+       FSB     INTGMS                  ; INTEGRATE THE ERROR\r
+       FST     INTGMS\r
+AV12:                                  ; RESTART AVERAGE IF ERROR SIGNIFICANT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; IF ABS(INTGMS)>64 (JUMP CONDITION)\r
+       FCPF    K64\r
+       BRCS    AV13\r
+       FLDF    K1                      ; THEN CNT=1\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     INTGMS                  ;      INTGMS=0\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<VSTBL              ;      VERY STABLE=0\r
+       SBR     A,1<<UNSTBL             ;      UNSTABLE=1\r
+       RCALL   STS_STATUS_A\r
+\r
+; TO IMPROVE WIND PERFORMANCE I NEED TO VARY THE JUMP THRESHOLD\r
+; HAVING REGARD TO THE LONGER TERM EXCURSIONS ABOUT AVEGMS\r
+\r
+AV13:  FLD     AVEGMS                  ; AUTOZERO ROUTINE\r
+       FSB     ZROGMS\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+       FCPF    KR5                     ; IF ABS(AVEGMS-ZROGMS)<0.5\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<ZROFLG\r
+       BRCC    AZ0\r
+       SBR     A,1<<ZROFLG             ; THEN SET ZROFLG\r
+AZ0:   RCALL   STS_STATUS_A\r
+       SBRS    A,ZROFLG                ; IF NOT SHOWING ZERO\r
+       RJMP    AZ1                     ; THEN SKIP AUTOZERO\r
+       FLD     AVEGMS                  ; ELSE AVERAGE INTO ZERO POINT\r
+       LDI     F,ZROGMS\r
+       LDI     A,17                    ;      IF AVEOK=0 USE N=17 ELSE N=2\r
+       RCALL   SMOOTH\r
+\r
+AZ1:   RCALL   LDS_A_STATUS            ; IF NOT SET ZERO COMMAND\r
+       SBRS    A,TRYZRO\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING\r
+       ;RCALL  LDS_A_STATUS            ; IF UNSTABLE\r
+       SBRC    A,UNSTBL\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING, RETAIN RQ\r
+       FLD     AVEGMS                  ; ELSE IF OUTSIDE RANGE\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ;         ABS\r
+       FCPF    K450 ;K1450 FOR EXTENDED ZERO RANGE - SHIPPED WITH S/N 5637\r
+       BRCC    AZ2                     ;      THEN SKIP ZERO SETTING, CLEAR RQ\r
+       FLD     AVEGMS                  ; ADDED 18DEC00 - ALLOW NEGATIVE AVEGMS\r
+       FST     ZROGMS                  ;      ELSE ZROGMS=AVEGMS\r
+AZ2:   RCALL   LDS_A_STATUS            ; ADDED 24FEB99 - MISSING ALL ALONG?\r
+       CBR     A,1<<TRYZRO\r
+       RCALL   STS_STATUS_A\r
+AZ3:   FLD     ZROGMS\r
+       LDI     A,1<<ZROGMS_FLG\r
+       LDI     F,'0'+ZROGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+; FIND RANGE AND DISPLAY RESOLUTION\r
+; WE ALSO CALCULATE F0=AVEGMS-ZROGMS IN THE PROCESS\r
+       FLD     AVEGMS\r
+       FSB     ZROGMS\r
+       FST     F0\r
+\r
+       LDER    E,RANGES                ; GET RANGE COUNT\r
+       LDI     ZL,RANGE1*2             ; POINT TO FIRST RANGE BOUNDARY\r
+RNGE:  RCALL   CPE_FA                  ; COMPARE FA WITH BOUNDARY\r
+       BRCS    GOTRNG\r
+       ADIW    ZL,4                    ; POINT TO NEXT RNG\r
+       DEC     E\r
+       BRNE    RNGE\r
+       SBIW    ZL,4                    ; POINT BACK TO PREVIOUS RESOLUTION\r
+GOTRNG:        RCALL   LDE_FA                  ; GET DISPLAY RESOLUTION FOR THIS RANGE\r
+       FST     DSPRES\r
+\r
+; STABILIZE DISPLAYED WEIGHT USING HYSTERESIS\r
+STAB:  FLD     F0\r
+       MOV     F,FA2                   ; SAVE SIGN BIT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     F2\r
+       RCALL   FIX_FA                  ; TRUNCATE TO 3 BYTE INTEGER\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       FST     F0                      ; INTEGER PART\r
+       FLD     F2\r
+       FSB     F0                      ; FA = FRACTIONAL PART\r
+       FCPF    HSTRSL\r
+       BRCS    STB2                    ; FRACTION < HSTRSL, ROUND DOWN\r
+       FCPF    HSTRSH\r
+       BRCC    STB1                    ; FRACTION >= HSTRSH, ROUND UP\r
+\r
+       LDS     A,RANGE                 ; PREVIOUS RANGE, RND, SGN\r
+       MOV     B,A\r
+       EOR     B,F                     ; COMPARE WITH CURRENT SIGN (BIT 7)\r
+       BRMI    STB2                    ; JUST CHANGED SIGN, ROUND DOWN\r
+       ANDI    A,RNG                   ; PREVIOUS RANGE\r
+       CP      A,E                     ; COMPARE WITH CURRENT RANGE\r
+       BRCS    STB1                    ; JUST GONE TO LOWER RANGE, ROUND UP\r
+       BRNE    STB2                    ; JUST GONE TO HIGHER RANGE, ROUND DOWN\r
+\r
+       FLD     DSPGMS                  ; RECALCULATE VALUE FROM LAST TIME\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       LDS     A,RANGE                 ; PREVIOUS STATE\r
+       SBRS    A,RND                   ; IF ROUNDED UP LAST TIME\r
+       RJMP    STB0\r
+       FSBF    K1                      ; THEN DECREMENT\r
+STB0:  FST     F2                      ; CORRESPONDING VALUE FROM LAST TIME\r
+       FCP     F0\r
+       BRCS    STB2                    ; GONE TO HIGHER VALUE, ROUND DOWN\r
+       FLD     F0\r
+       FCP     F2\r
+       BRCS    STB1                    ; GONE TO LOWER VALUE, ROUND UP\r
+       RJMP    STB5                    ; ELSE RETAIN EXISTING DSPGMS\r
+\r
+STB1:  FLD     F0                      ; ROUND UPWARDS\r
+       FADF    K1\r
+       SBR     E,1<<RND                ; SUPERIMPOSE UPWARDS FLAG ON RANGE\r
+       RJMP    STB3\r
+\r
+STB2:  FLD     F0                      ; ROUND DOWNWARDS\r
+       ;CBR    E,1<<RND                ; SUPERIMPOSE DOWNWARDS FLAG ON RANGE\r
+STB3:  BST     F,7                     ; GET CURRENT SIGN\r
+       TST     FA3                     ; IF DSPGMS<>0\r
+       BREQ    STB4\r
+       BLD     FA2,7                   ; THEN RESTORE SIGN\r
+STB4:  BLD     E,SGN                   ; SUPERIMPOSE ON CURRENT RANGE\r
+       STS     RANGE,E                 ; SAVE CURRENT RANGE, RND, SGN\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FMLF KR1\r
+ ; ELSE\r
+       FML     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+; WEIGHING ONLY %\r
+;      FST     DSPGMS\r
+\r
+STB5:\r
+;      ;LDS    A,MODE                  ; IF NOT WEIGHING MODE\r
+;      ;SBRS   A,DSPGMS_FLG\r
+;      ;RJMP   DSP9                    ; THEN SKIP OUTPUT IN GRAMS\r
+;\r
+;      LDI     E,CYC_MIN*2/3\r
+;      RCALL   TX_WAIT_EMPTY\r
+;      BRCS    FMT\r
+;      RJMP    DSP9                    ; NO TX_BUFFER TO SEND ITEM THIS CYCLE\r
+;\r
+;FMT:  RCALL   LDS_A_STATUS\r
+;      SBRS    A,SEND_SN               ; NEED TO SEND S/N MESSAGE ?\r
+;      RJMP    SKIP_SN\r
+;\r
+;      CBR     A,1<<SEND_SN\r
+;      RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;\r
+;      LDFL    D,SN\r
+;      RCALL   SNDSTR                  ; SEND S/N MESSAGE\r
+;      RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+;\r
+;SKIP_SN:\r
+;;     RCALL   LDS_A_STATUS\r
+;;     SBRS    A,SEND_SPAN             ; NEED TO SEND S/N MESSAGE ?\r
+;;     RJMP    SKIP_SPAN\r
+;;\r
+;;     CBR     A,1<<SEND_SPAN\r
+;;     RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;;\r
+;;     FLDE    SPAN\r
+;;     LDI     A,0                     ; ITEM MUST ALWAYS BE SENT\r
+;;     LDI     F,'S'\r
+;;     RCALL   SNDFP                   ; SEND SPAN MESSAGE\r
+;;     RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+;\r
+;SKIP_SPAN:\r
+;      LDS     A,STARTUP               ; IF STARTUP<CYC_ZERO\r
+;      CPI     A,CYC_ZERO\r
+;      BRCC    FMT0\r
+;      RCALL   SET_TRYZRO              ; THEN SET ZERO\r
+;      LDFL    D,FMAT3                 ;      SHOW " HELLO"\r
+;      RJMP    DSP7\r
+;\r
+;FMT0: FLD     DSPGMS                  ; FORMAT OUTPUT DATA PACKET\r
+;      LDFL    D,FMAT5                 ; IF SETTING ZERO\r
+;      LDS     F,STATUS\r
+;      SBRC    F,TRYZRO                ; THEN SHOW "     "\r
+;      RJMP    DSP7\r
+;      LDS     E,STARTUP               ; USED FOR DELAY BEFORE SHOWING " -LO-"\r
+;      TST     FA2                     ; IF DSPGMS>=0\r
+;      BRPL    FMT2                    ; THEN CONTINUE\r
+;;     FSBF    KR005                   ; ELIMINATE TRUNCATION ERROR (- VALUES)\r
+;      INC     E                       ; INC " -LO-" COUNTER (STARTUP)\r
+;      CPI     E,CYC_START+8           ; IF STARTUP<CYC_START+8\r
+;      BRCC    FMT1\r
+;      STS     STARTUP,E\r
+;      LDFL    D,FMAT0                 ; THEN SHOW " 0.000"\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;LDI E,CYC_MIN-10    ; TIMEOUT IS WHEN CYC_1 => E\r
+; ;RCALL SNDSTR\r
+; ;LDI A,'0'\r
+; ;RCALL TX_WAIT\r
+; ;RJMP DSP8\r
+; ; %\r
+;      RJMP    DSP7\r
+;FMT1: SBR     F,1<<LOWFLG             ; ELSE SET LOWFLG\r
+;      STS     STATUS,F\r
+;      LDFL    D,FMAT2                 ;      SHOW " -LO-"\r
+;      RJMP    DSP7\r
+;FMT2: CBR     F,1<<LOWFLG             ; CLEAR LOWFLG\r
+;      CPI     E,CYC_START             ; IF STARTUP>CYC_START  ' CLEAR " -LO-"\r
+;      BRCS    FMT3\r
+;      LDI     E,CYC_START             ; THEN STARTUP=CYC_START\r
+;      STS     STARTUP,E\r
+;FMT3: FCPE    RNGMAX                  ; IF DSPGMS>RNGMAX\r
+;      BRCS    FMT4\r
+;      SBR     F,1<<OUCHFLG            ; SET OUCHFLG\r
+;      STS     STATUS,F\r
+;      LDFL    D,FMAT1\r
+;      RJMP    DSP7                    ; THEN SHOW "-OUCH"\r
+;FMT4: CBR     F,1<<OUCHFLG            ; CLEAR OUCHFLG\r
+;      STS     STATUS,F\r
+;\r
+;DSP:  FADF    KR005                   ; ELIMINATE TRUNCATION ERROR (+ VALUES)\r
+;      RCALL   DIGN                    ; ADJUST EXPONENT FOR 1<N<10\r
+;      ADDI    F,2                     ; NUMBER OF DIGITS TO SEND +1\r
+;      ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      LDFL    D,FMAT0                 ; " 0.000"\r
+;      ADIW    ZL,2\r
+;DSP2: CP      F,D\r
+;      BRCC    DSP4\r
+;DSP3: RCALL   STR1                    ; GET NEXT CHARACTER FROM FMAT0\r
+;      BREQ    DSP8                    ; WHEN ALL DONE\r
+;      CPI     D,4\r
+;      BRNE    DSP2\r
+;      DEC     F                       ; TO COMPENSATE FOR EXTRA DEC C\r
+;      RJMP    DSP3                    ; DO DECIMAL PT\r
+;DSP4:\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;INC F\r
+; ; %\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND FIRST DIGIT\r
+;DSP5: DEC     F\r
+;      BREQ    DSP8\r
+;      CPI     F,4\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;CPI F,5\r
+; ; %\r
+;      BRNE    DSP6\r
+;      LDI     A,'.'\r
+;      RCALL   TX_WAIT\r
+;      DEC     F\r
+;DSP6: RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    DSP5\r
+;DSP7: ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+;DSP8:\r
+;; ASCII STABILITY INDICATION FOR TESTING %\r
+;;     LDI     A,' '\r
+;;     RCALL   TX_WAIT\r
+;;     RCALL   LDS_A_STATUS\r
+;;     ANDI    A,1<<UNSTBL\r
+;;     LDI     A,' '\r
+;;     BREQ    DSP8X\r
+;;     LDI     A,'*'\r
+;;DSP8X:       RCALL   TX_WAIT\r
+;;     LDI     A,$0D\r
+;;     RCALL   TX_WAIT\r
+;;     LDI     A,$0A\r
+;;     RCALL   TX_WAIT\r
+;; %\r
+;      LDFL    D,FMAT6                 ; NOW SEND TRAILER\r
+;      RCALL   SNDSTR\r
+;DSP9:\r
+; %\r
+\r
+       ; END OF MAIN WEIGHING LOOP\r
+\r
+; WEIGHING ONLY %\r
+;      LDS     A,MODE_CYCLE\r
+;      CPI     A,$10\r
+;      BRLO    MODE_CYCLE_SWAP\r
+;      LSL     A\r
+;      BRNE    MODE_CYCLE_SWAP\r
+;      LDI     A,$10\r
+;MODE_CYCLE_SWAP:\r
+;      SWAP    A\r
+;      STS     MODE_CYCLE,A\r
+;\r
+;      LDS     A,STARTUP\r
+;      INC     A\r
+;      CPI     A,CYC_START+1           ; INC UP TO 32\r
+;      BRCC    LOOP_END\r
+;      STS     STARTUP,A\r
+; %\r
+\r
+; CHARACTERIZE ONLY %\r
+       LDS     A,STARTUP\r
+       SBRC    FLAGS,SNDDAT\r
+       LDI     A,0                     ; RESTART INTEGRATION IF WE SENT DATA\r
+       INC     A\r
+       STS     STARTUP,A               ; INCREASE COUNT FOR TRUE AVERAGE\r
+\r
+       CBR     FLAGS,1<<SNDDAT         ; SAY WE MUST NOT SEND DATA OUT\r
+\r
+       FLD     REF_30MHZ               ; ELAPSED INTEGRATION TIME, 33MHZ TICKS\r
+       FCPF    K33M                    ; => 1 SECOND ?\r
+       BRLO    LOOP_END                ; NO, CONTINUE CURRENT INTEGRATION\r
+\r
+       FSBF    K33M\r
+       FST     REF_30MHZ               ; WRAP ELAPSED TIME FOR NEW CYCLE\r
+\r
+       SBR     FLAGS,1<<SNDDAT         ; SAY WE MUST SEND DATA OUT\r
+; %\r
+\r
+LOOP_END:\r
+       RJMP    LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FIX_400:\r
+       FMLF    K400                    ; FOR +/- 20 FROM +/- 0.05\r
+       RJMP    FIX_ENTRY\r
+FIX_10:\r
+       FMLF    K10                     ; FOR 10TH GRAMS FROM GRAMS\r
+FIX_ENTRY:\r
+       ; THIS WILL CLOBBER D REGISTER,\r
+       ; AND DOES NOT CORRECTLY HANDLE NEGATIVE NUMBERS %\r
+       ;FADF   KR5                     ; FOR ROUNDING\r
+       ; %\r
+       RCALL   FIX_FA\r
+       BRTC    FIX_POSITIVE\r
+       COM     FA0\r
+       COM     FA1\r
+       INC     FA0\r
+       BRNE    FIX_POSITIVE\r
+       INC     FA1\r
+FIX_POSITIVE:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_WAIT_EMPTY:\r
+       LDS     A,TX_COUNT\r
+       CPI     A,1\r
+       BRLO    TX_WAIT_EMPTY_RET\r
+\r
+       CP      CYC_1,E\r
+       BRLO    TX_WAIT_EMPTY\r
+\r
+;      LDS     A,TX_COUNT\r
+;      CPI     A,1\r
+\r
+TX_WAIT_EMPTY_RET:\r
+       RET                             ; CF SET = READY, CF CLEAR = NOT READY\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+POLY:  FST     F0                      ; POLYNOMIAL CALCULATION, FLASH CONST\r
+                                       ; ENTER WITH FA = INDEPENDENT VAR\r
+       RCALL   LDF_FA                  ;            Z <= HIGHEST ORDER COEFF\r
+POLY0: FML     F0\r
+       RCALL   ADDF_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLY0\r
+       RET\r
+\r
+NRMTMP:        FLD     TMPFRQ                  ; NORMALIZE TEMP C3*T^3+C2*T^2+C1*T+C0\r
+       LDI     F,3                     ; DEGREE\r
+       LDIZ    C3                      ; HIGH ORDER COEFFICIENT\r
+;      RJMP    POLYE                   ; RETURN -1=-10 DEG, 0=20 DEG, 1=50 DEG\r
+\r
+POLYE: FST     F0                      ; POLYNOMIAL CALCULATION, EEPROM CONST\r
+       RCALL   LDE_FA                  ; ENTER WITH F0 = INDEPENDENT VARIABLE\r
+POLYE0:        FML     F0                      ;            Z <= HIGHEST ORDER COEFF\r
+       RCALL   ADDE_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLYE0\r
+       RET\r
+\r
+SMOOTH:                                        ; EXPONENTIAL SMOOTHING A=N E=>AVERAGE\r
+       TST     A                       ; IF N=0        NOTE: CLOBBERS F0, F1\r
+       BREQ    SMTH0                   ; THEN DO NOTHING\r
+       FST     F0                      ; SAVE CURRENT DATA\r
+       MOV     FA0,A                   ; CONVERT N\r
+       CLR     FA1\r
+       CLR     FA2\r
+       RCALL   LD3_FA                  ; TO FP FORMAT\r
+       FST     F1                      ; AND SAVE\r
+       FLD     F0                      ; RETRIEVE CURRENT DATA\r
+SMOOTH_FP:                             ; ENTRY POINT WITH F1=N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   SUB_FA\r
+       FDV     F1                      ; N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   ADD_FA\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   STS_FA                  ; AND SAVE\r
+SMTH0: RET\r
+\r
+LIN_TLT:\r
+       RCALL   LDS2_FA                 ; CONVERT 2 BYTE TILT COUNT TO FP\r
+       MOV     F,YL                    ; TEMP SAVE\r
+       FST     F0                      ; TLTL\r
+       MOV     YL,F\r
+       RCALL   LDS2_FA                 ; CONVERT OPPOSING TILT COUNT TO FP\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F1                      ; TLTR\r
+       FML     F1                      ; TLTR^2\r
+       FST     F3\r
+       FLD     F0\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F0                      ; TLTL\r
+       FML     F0                      ; TLTL^2\r
+       FSB     F3                      ; TLTL^2-TLTR^2\r
+       FMLF    TLT2\r
+       FST     F3\r
+       FLD     F1\r
+       FSB     F0                      ; TLTR-TLTL\r
+       FMLF    TLT1\r
+       FSB     F3\r
+       FADF    TLT0\r
+SNDFP2:        RET\r
+\r
+SNDFP:\r
+; WEIGHING ONLY %\r
+;      INC     FA3                     ; CHECK FOR NAN\r
+;      BRNE    SND0\r
+;      DEC     FA3                     ; TO COMPLY WITH IEEE754\r
+;SND0: DEC     FA3\r
+;      ROL     FA2                     ; CONVERT TO IEEE754\r
+;      ROR     FA3\r
+;      ROR     FA2\r
+; %\r
+\r
+       TST     A\r
+       BREQ    SNDFPX                  ; ITEM MUST ALWAYS BE SENT\r
+\r
+SNDFPE:        LDS     B,MODE                  ; SEND DIAGNOSTIC DATA\r
+       AND     A,B                     ; MODE BIT FOR THIS DATA ITEM SET?\r
+; WEIGHING ONLY %\r
+;      LDS     B,MODE_CYCLE\r
+;      AND     A,B                     ; ROUND ROBIN UP TO THIS DATA ITEM YET?\r
+; %\r
+       BREQ    SNDFP2                  ; DO NOT SEND THIS DATA ITEM THIS CYCLE\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     E,0                     ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   TX_WAIT_EMPTY\r
+;      BRCC    SNDFP2                  ; NO TX_BUFFER SPACE TO SEND ITEM\r
+; %\r
+\r
+SNDFPX:\r
+; CHARACTERIZE ONLY %\r
+       SBRS    FLAGS,SNDDAT\r
+       RET\r
+       CPI     A,$80\r
+       LDI     A,$0A\r
+       BRNE    SEPOK\r
+       LDI     A,$0D\r
+SEPOK: RJMP    SNDEXP\r
+; %\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,F                     ; INDICATE WHICH DATA IS BEING SENT\r
+;      RCALL   TX_WAIT\r
+;;SND_FA:\r
+;      LDI     XL,FA                   ; LOAD TX BUFFER\r
+;      LDI     D,4\r
+;SND1: LD      A,X+\r
+;      RCALL   TX_WAIT                 ; LS BYTE FIRST\r
+;      DEC     D\r
+;      BRNE    SND1\r
+;      RET\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PROCESS_ESC:\r
+       SBRC    FLAGS,ESCM\r
+       RJMP    PROCESS_ESC_M1\r
+\r
+       CPI     A,'#'\r
+       BREQ    PROCESS_ESC_HASH\r
+       CPI     A,'M'\r
+       BREQ    PROCESS_ESC_M0\r
+;      CPI     A,'S'\r
+;      BREQ    PROCESS_ESC_S\r
+       CPI     A,'Z'\r
+       BREQ    PROCESS_ESC_Z\r
+\r
+PROCESS_ESC_DONE:\r
+       CBR     FLAGS,1<<ESC            ; NEED ANOTHER ESC TO GET BACK HERE\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_HASH:\r
+       RCALL   LDS_A_STATUS\r
+       SBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SEND S/N INSTEAD OF WEIGHT OUTPUT\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_M0:\r
+       SBR     FLAGS,1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_M1:\r
+       STS     MODE,A\r
+       CBR     FLAGS,1<<ESC | 1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+;PROCESS_ESC_S:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SEND SPAN INSTEAD OF WEIGHT OUTPUT\r
+;      RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_Z:\r
+       RCALL   SET_TRYZRO              ; SET ZERO\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+WGT_INT:\r
+       IN      SR,SREG\r
+       INC     CYC_0                   ; INCREMENT WEIGHT CYCLE COUNTER\r
+        OUT     SREG,SR\r
+        SBRS    CYC_0,4\r
+       RETI                            ; CYC_0<16\r
+        SBRS    CYC_0,0\r
+       RETI                            ; CYC_0=16\r
+       CBI     UCR,UDRIE               ; CYC_0=17 DISABLE UART INTERRUPT\r
+        SBRS    CYC_0,1                        ;          TO REDUCE JITTER FOR TEMP\r
+       RETI                            ;          MEASUREMENT, AND RETURN\r
+\r
+       PUSH    SR                      ; CYC_0=18 DO TEMP AND TILT\r
+       LDI     SR,$10+16-18            ; 17MAY01 NEED MORE TIME FOR FAST XTALS\r
+       ADD     CYC_0,SR                ; CLEAR BIT 4, CARRYING INTO BITS 5-7\r
+       IN      G,PIND\r
+       IN      H,PINC                  ; READ DATA\r
+       SEI                             ; ALLOW RECURSIVE WGT_INT\r
+\r
+;RCALL TOG_B5\r
+       ANDI    G,$F0                   ; ASSEMBLE DATA\r
+       ANDI    H,$0F\r
+       OR      G,H                     ; INTO G\r
+       SUB     G,WT_0                  ; CALC DIFFERENCE FROM LAST CYCLE\r
+       ADD     WT_0,G                  ; AND SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       PUSH    G                       ; PUT HC590 DIFFERENCE COUNT ON STACK\r
+\r
+       IN      G,ICR1L                 ; READ TIMER1 INPUT CAPTURE REGISTER\r
+       MOV     H,G\r
+       SUB     H,WT_1                  ; AND CALC DIFFERENCE FROM LAST CYCLE\r
+       MOV     WT_1,G                  ; SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       IN      G,ICR1H                 ; NOW HIGH BYTE\r
+       MOV     I,G\r
+       SBC     I,WT_2\r
+       MOV     WT_2,G\r
+\r
+;      USE 11MHZ COUNT TO DETERMINE HOW MANY TIMES HC590 HAS ROLLED OVER\r
+\r
+       MOV     G,H                     ; DIFFERENCE COUNT IN H|I\r
+       MOV     K,I\r
+       CLR     J\r
+       ADD     H,H                     ; H|I * 3 => H|I|J\r
+       ADC     I,I\r
+       ADC     J,J\r
+       ADD     H,G\r
+       ADC     I,K\r
+       CLR     G\r
+       ADC     J,G\r
+\r
+       MOV     G,I\r
+       MOV     K,J\r
+       LSR     K\r
+       ROR     G\r
+\r
+       ; ALLOW +/-128 COUNTS OF ERROR DUE TO XTAL TOLERANCES (-60 TYP)\r
+\r
+       POP     G                       ; RETRIEVE HC590 DIFFERENCE COUNT\r
+       SUB     G,H                     ; CALCULATE AMOUNT TO ADJUST H|I|J\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_COUNT\r
+; MOV A,G\r
+; RCALL TX_CHAR\r
+;SKIP_COUNT:\r
+; POP A\r
+       LDS     K,STARTUP               ; CHANGED 26MAR01 TO ALLOW FOR\r
+       TST     K                       ; NEW BATCH OF 11MHZ XTALS\r
+       BREQ    CORRECTION_OK\r
+       CPI     G,-48                   ; ASSUME NORMAL CORRECTION > -48\r
+       BRSH    CORRECTION_OK\r
+       CPI     G,16                    ; OR            CORRECTION < +16\r
+       BRLO    CORRECTION_OK\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_DOLLAR\r
+ LDI A,'$'\r
+ RCALL TX_CHAR\r
+SKIP_DOLLAR:\r
+ POP A\r
+       SUB     WT_0,G\r
+       LDI     G,-12                   ; BUT TYPICALLY -12\r
+       ADD     WT_0,G\r
+CORRECTION_OK:\r
+       LDI     K,0\r
+       TST     G\r
+       BRPL    SIGN_EXTEND\r
+       LDI     K,$FF                   ; IF NEG\r
+SIGN_EXTEND:\r
+       ADD     H,G\r
+       ADC     I,K\r
+       ADC     J,K                     ; ADD INTO H|I|J\r
+\r
+       LDS     G,WGTLST                ; TEST DIRECTION OF CHANGE\r
+       CP      H,G                     ; DIFFERENCE NOW IN H|I|J\r
+       LDS     G,WGTLST+1\r
+       CPC     I,G\r
+       LDS     G,WGTLST+2\r
+       CPC     J,G\r
+\r
+       STS     WGTLST,H                ; AND SAVE SAMPLE FOR NEXT CYCLE\r
+       STS     WGTLST+1,I\r
+       STS     WGTLST+2,J\r
+\r
+       CLI                             ; 17MAY01\r
+       LDS     G,TMP_PHASE             ; START TEMPERATURE MEASUREMENT %\r
+       INC     G\r
+TMP0:  RJMP    TMP1\r
+TMP1:  DEC     G                       ; WAIT TO SYNCHRONISE SUBSEQUENT INT0\r
+       BRNE    TMP0\r
+\r
+;      CLI\r
+       SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+       SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+       IN      G,GIMSK                 ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+       SBRC    G,INT0\r
+       RCALL   TMP_INT00               ; THEN WE MUST PROCESS ANYWAY\r
+                                       ; 17MAY01 MOVED:\r
+;      SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+;      SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+;      LDI     G,$40                   ;  SHIFTED TO LATER\r
+;      OUT     GIFR,G                  ;  CLEAR PENDING INT0 RESULTING FROM\r
+;      OUT     GIMSK,G                 ;  ACTIVITY ON PIN, AND ENABLE INT0\r
+       CBI     DDRD,2                  ; SET BIT 2 TO INPUT TO START DISCHARGE\r
+       CBI     PORTD,2                 ; AND REMOVE PULLUP\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET STARTING COUNT FROM TIMER1\r
+       STS     DTMP,G\r
+       IN      G,TCNT1H                ; NOW HIGH BYTE\r
+       STS     DTMP+1,G\r
+       SEI\r
+\r
+       MOV     G,CYC_1                 ; CYCLE COUNT, NOT INCLUDING CURRENT\r
+       INC     CYC_1                   ; INCLUDE CURRENT CYCLE\r
+       BRCS    DEC0                    ; NOW LOOK AT CHANGE\r
+       CBR     FLAGS,1<<DIR            ; IF INCREASING\r
+       RJMP    CONT\r
+DEC0:  SBRC    FLAGS,DIR               ; IF DECREASING\r
+       RJMP    DEC1\r
+       SBR     FLAGS,1<<DIR            ;    BUT INCREASING LAST TIME\r
+       RJMP    PEAK                    ; THEN PROCESS PEAK\r
+DEC1:  SBR     FLAGS,1<<DIR\r
+CONT:  CPI     G,CYC_MAX-1\r
+       BRLO    NOPEAK                  ; LIMIT TO CYC_MAX GROUPS OF 16 CYCLES\r
+PEAK:  CPI     G,CYC_MIN-1             ; NEVER DETECT PEAKS CLOSER THAN CYC_MIN\r
+       BRLO    NOPEAK\r
+\r
+       LDI     H,0\r
+       SUBI    G,LOW(-1)\r
+       SBCI    H,HIGH(-1)              ; ALLOW H:G TO INCREMENT UP TO $100\r
+       STS     F2,G                    ; TRANSFER CYCLE COUNT TO FOREGROUND F2\r
+       STS     F2+1,H\r
+\r
+       CLR     CYC_1                   ; INITIALISE CYCLE COUNT\r
+\r
+       LDI     XL,LOW(WGT)             ; TRANSFER DATA TO OUTPUT BUFFER\r
+       CLR     G\r
+\r
+       LDI     YL,LOW(GMS)             ; WGHT DATA\r
+       LDI     H,3\r
+TRANSFER_0:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_0\r
+\r
+       LDI     YL,LOW(F0)              ; TEMP DATA\r
+       LDI     H,3\r
+TRANSFER_1:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_1\r
+\r
+       LDI     YL,LOW(F3)              ; TILT DATA\r
+       LDI     H,8\r
+TRANSFER_2:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_2\r
+\r
+       SBR     FLAGS,1<<NEWDAT         ; FLAG NEW DATA TO FOREGROUND\r
+\r
+NOPEAK:        LDS     G,WGT                   ; DIFFERENCE NOW IN WGTLST, ADD TO WGT\r
+       LDS     H,WGTLST\r
+       ADD     G,H\r
+       STS     WGT,G\r
+       LDS     G,WGT+1\r
+       LDS     H,WGTLST+1\r
+       ADC     G,H\r
+       STS     WGT+1,G\r
+       LDS     G,WGT+2\r
+       LDS     H,WGTLST+2\r
+       ADC     G,H\r
+       STS     WGT+2,G\r
+\r
+       CLI\r
+       LDI     G,$40                   ; 17MAY01 ENABLE TEMPERATURE INTERRUPT\r
+       OUT     GIFR,G                  ; CLEAR PENDING INT0 RESULTING FROM\r
+       OUT     GIMSK,G                 ; ACTIVITY ON PIN, AND ENABLE INT0\r
+\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,BOMB              ; TILT MEASUREMENT STILL IN PROGRESS?\r
+       RETI\r
+\r
+       POP     G                       ; YES, TILT SENSOR MUST HAVE FAILED\r
+       POP     G                       ;      SO FIX STACK\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_ASTERISK\r
+ LDI A,'*'\r
+ RCALL TX_CHAR\r
+SKIP_ASTERISK:\r
+ POP A\r
+       RJMP    ABORT_TLT               ;      AND ABORT TILT MEASUREMENT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+TMP_INT:\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      SR,SREG\r
+       RCALL   TMP_INT0                ; PROCESS TEMPERATURE DATA\r
+       PUSH    SR\r
+\r
+       CLR     I\r
+       OUT     GIMSK,I                 ; DISABLE INT0 INTERRUPTS\r
+\r
+                                       ; START TILT\r
+       SBR     FLAGS,1<<BOMB           ; BOMB OUT ON 18TH WEIGHT INTERRUPT\r
+       SEI\r
+\r
+       LDI     G,-110                  ; LIMIT TO 50uSEC (FULL PERIOD 20KHZ)\r
+       LDI     H,-55                   ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0:   INC     G                       ; WAIT FOR LOW ON WGT TO SYNCHRONISE\r
+       BREQ    TL2\r
+       SBIC    PINB,0\r
+       RJMP    TL0\r
+TL1:   INC     G                       ; WAIT FOR HIGH ON WGT,\r
+       BREQ    TL2                     ; TO MEASURE TIME TO EDGE\r
+       SBIS    PINB,0\r
+       RJMP    TL1\r
+TL2:   INC     H                       ; WAIT FOR LOW ON WGT,\r
+       BREQ    TL3                     ; TO MEASURE PERIOD/2\r
+       SBIC    PINB,0\r
+       RJMP    TL2\r
+TL3:                                   ; 17MAY01\r
+       SUBI    G,-110+5                ; +5 TO MAKE SURE WE HIT WITH WGT LOW\r
+       SUBI    H,-55                   ; WHICH SAVES A FULL WGT CYCLE IN TIME\r
+                                       ; BUT ALSO NOT TOO CLOSE TO HC590\r
+                                       ; CLOCKING WHICH CAUSES PREMATURE INT0\r
+; OUT UDR,G\r
+; OUT UDR,H\r
+       LDS     I,TMP_PHASE\r
+       SUB     G,H                     ; H = PERIOD/2\r
+       BRLO    PHASE_INCREASE          ; SERVO TOWARDS G = 0\r
+;PHASE_DECREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,1\r
+       BRSH    PHASE_SAVE\r
+       ADD     I,H\r
+       RJMP    PHASE_SAVE\r
+PHASE_INCREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,-1\r
+       CP      I,H\r
+       BRLO    PHASE_SAVE\r
+       SUB     I,H\r
+PHASE_SAVE:\r
+       STS     TMP_PHASE,I\r
+\r
+       LDI     G,132                   ; DESIRED PULSE LENGTH, 60 uSEC\r
+MOD_LOOP:\r
+       SUB     G,H                     ; H = AT LEAST 1 BY ALGORITHM ABOVE\r
+       BRSH    MOD_LOOP\r
+\r
+PULSE_DELAY_0:\r
+       RJMP    PULSE_DELAY_1\r
+PULSE_DELAY_1:\r
+       INC     G\r
+       BRNE    PULSE_DELAY_0           ; DELAY H - (132 MOD H) BEFORE TURN ON\r
+\r
+       SBI     PORTD,3                 ; TURN ON PULSE\r
+\r
+       LDI     G,110*5/3               ; SLIGHTLY LESS THAN PULSE, 50 uSEC\r
+PULSE_DELAY_3:\r
+       DEC     G\r
+       BRNE    PULSE_DELAY_3\r
+\r
+       LDI     G,55                    ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0X:  DEC     G                       ; AND WAIT FOR LOW ON WGT TO ENSURE AT\r
+       BREQ    TOO_LONG                ; LEAST 1/2 CYCLE OF WGT HIGH, TO\r
+       SBIC    PINB,0                  ; PERFORM TILT MEASUREMENT BEFORE NEXT\r
+       RJMP    TL0X                    ; WGT INTERRUPT\r
+TOO_LONG:\r
+\r
+       CBI     PORTD,3                 ; TURN PULSE OFF AGAIN\r
+       MOV     G,CYC_0                 ; WHICH DIRECTION ? (WHILE WAITING)\r
+       IN      H,TCNT1L                ; SAVE STARTING COUNT\r
+       SWAP    G\r
+       LSR     G\r
+       ANDI    G,$03                   ; 2 LOW ORDER BITS INDICATE TILT AXIS\r
+;      MOV     K,ZL                    ; 17MAY01 TEMPORARY SAVE\r
+\r
+;      LDI     ZL,TLTL                 ; 17MAY01 PREVENTS ZL CORRUPTION\r
+       LDI     K,TLTL                  ; IN CASE OF BOMB OUT\r
+       BREQ    LEFT                    ; =0\r
+       DEC     G\r
+;      LDI     ZL,TLTR\r
+       LDI     K,TLTR\r
+       BREQ    RIGHT                   ; =1\r
+       DEC     G\r
+;      LDI     ZL,TLTB\r
+       LDI     K,TLTB\r
+       BREQ    BACK                    ; =2\r
+;      LDI     ZL,TLTF\r
+       LDI     K,TLTF\r
+FRONT: SBIS    PINB,2                  ; WAIT FOR EDGE\r
+       RJMP    FRONT\r
+       RJMP    TLT_AD\r
+BACK:  SBIS    PINC,5                  ; WAIT FOR EDGE\r
+       RJMP    BACK\r
+       RJMP    TLT_AD\r
+LEFT:  SBIS    PINC,4                  ; WAIT FOR EDGE\r
+       RJMP    LEFT\r
+       RJMP    TLT_AD\r
+RIGHT: SBIS    PINB,1                  ; WAIT FOR EDGE\r
+       RJMP    RIGHT\r
+       RJMP    TLT_AD                  ; EQUALISE TIME DELAY\r
+TLT_AD:        IN      G,TCNT1L                ; GET ENDING COUNT\r
+       SUB     G,H                     ; CALCULATE INCREASE IN COUNT\r
+\r
+       MOV     H,ZL                    ; TEMPORARY SAVE ADDED 17MAY01\r
+       MOV     ZL,K\r
+\r
+;PUSH G\r
+       LD      I,Z                     ; GET CURRENT ACCUMULATION\r
+       ADD     I,G                     ; ADD NEW READING\r
+       ST      Z+,I                    ; AND SAVE\r
+       LDI     G,0\r
+       LD      I,Z                     ; NOW HIGH BYTE\r
+       ADC     I,G                     ; G=0 FROM ABOVE\r
+       ST      Z+,I\r
+;POP G\r
+;CPI   ZL,TLTF\r
+;BRNE  ABORT_TLT\r
+;PUSH  A\r
+;PUSH  D\r
+;MOV   A,G\r
+;RCALL CONV_TO_HEX\r
+;LDI   A,$20\r
+;RCALL TX_CHAR\r
+;POP   D\r
+;POP   A\r
+\r
+       MOV     ZL,H                    ; 17MAY01\r
+       CLI\r
+\r
+ABORT_TLT:                             ; ENTER HERE WITH INTERRUPTS DISABLED\r
+       CBI     PORTD,3                 ; TURN TILT PULSE OFF IN CASE BOMBED\r
+       CBR     FLAGS,1<<BOMB           ; WE WILL NOT BOMB OUT ON WEIGHT INT\r
+;      MOV     ZL,K                    ; 17MAY01 RESTORE ZL\r
+\r
+                                       ; 17MAY01 ALLOW DATA AFTER TEMP INT0\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+TMP_INT00:\r
+                               ; 17MAY01 TO PREVENT DATA LOCKUP\r
+ SBI   UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_HASH\r
+ LDI A,'#'\r
+ RCALL TX_CHAR\r
+SKIP_HASH:\r
+ POP A\r
+\r
+TMP_INT0:\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET ENDING COUNT\r
+       LDS     I,DTMP                  ; RETRIEVE STARTING COUNT\r
+       SUB     G,I                     ; CALCULATE END-START DIFFERENCE\r
+       IN      H,TCNT1H                ; NOW HIGH BYTE\r
+       LDS     I,DTMP+1\r
+       SBC     H,I                     ; G|H NOW HAS DIFFERENCE COUNT\r
+\r
+       LDS     I,TMP                   ; ACCUMULATE DIFFERENCE COUNT\r
+       ADD     I,G\r
+       STS     TMP,I\r
+       LDS     I,TMP+1\r
+       ADC     I,H\r
+       STS     TMP+1,I\r
+       BRCC    DONE_TMP\r
+       LDS     I,TMP+2                 ; ADJUST HIGH ORDER BYTE IF CARRY\r
+       INC     I\r
+       STS     TMP+2,I\r
+DONE_TMP:\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SHOW_FA:\r
+;      MOV     A,FA3\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA2\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA1\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA0\r
+;      RCALL   CONV_TO_HEX\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RET\r
+;\r
+;CONV_TO_HEX:                          ; ENTER WITH BYTE IN A\r
+;      MOV     D,A\r
+;      SWAP    A\r
+;      RCALL   NIBL\r
+;      MOV     A,D\r
+;NIBL: ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,':'\r
+;      BRMI    NIBL0\r
+;      SUBI    A,-$07\r
+;NIBL0:\r
+;      RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+RX_WAIT:\r
+       MRX_WAIT                        ; FALLS OUT INTO RX_CHAR\r
+RX_CHAR:\r
+       MRX_CHAR                        ; FOR DIAGS, FALLS OUT INTO TX_WAIT\r
+TX_WAIT:\r
+       MTX_WAIT                        ; FALLS OUT INTO TX_CHAR\r
+TX_CHAR:\r
+       MTX_CHAR                        ; FALLS OUT INTO TX_CHAR_RET\r
+TX_CHAR_RET:\r
+       MTX_CHAR_RET                    ; DOES NOT FALL OUT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY                       ; DOES NOT FALL OUT\r
+\r
+RX_COMPLETE:\r
+       MRX_COMPLETE                    ; DOES NOT FALL OUT\r
+\r
+TX_COMPLETE:\r
+T0_OVERFLOW:\r
+       MTX_COMPLETE                    ; FALLS OUT INTO API_ERROR\r
+API_ERROR:\r
+       MAPI_ERROR                      ; FALLS OUT INTO API_REVERT\r
+API_REVERT:\r
+       MAPI_REVERT                     ; FALLS OUT INTO API_DONE\r
+API_DONE:\r
+       MAPI_DONE                       ; DOES NOT FALL OUT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      FLOATING POINT MATHS\r
+\r
+;      MS BYTE                     LS BYTE\r
+;      seeeeeee emmmmmmm mmmmmmmm mmmmmmmm IEEE754 FORMAT (FLASH/EEPROM)\r
+;      eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm INTERNAL FORMAT (SRAM/REGISTERS)\r
+;      VALUE =+1.mmmmmmm mmmmmmmm mmmmmmmm * 2^eeeeeeee\r
+\r
+;      WHERE:  s = SIGN BIT (OVERLAYING THE IMPLICIT 1 IN INTERNAL FORMAT)\r
+;              e = EXPONENT BITS WITH BIAS OF 127\r
+;              m = MANTISSA BITS\r
+\r
+;      NOTE:   IEEE754 FORMAT USED FOR FLASH/EEPROM CONSTANTS & SERIAL I/O\r
+;              INTERNAL FORMAT USED FOR SRAM ARGUMENTS & FA, FB\r
+;              FLDF & FLDE MACROS CONVERT FROM IEEE754 TO INTERNAL FORMAT\r
+\r
+;      MANTISSA:       $000000 TO $FFFFFF      REPRESENTING 1 =< MANTISSA < 2\r
+;      EXPONENT:       $00 TO $FF              REPRESENTING 2^-126 TO 2^128\r
+;                      $7F                     REPRESENTING 2^0\r
+\r
+;      NOTATION:       F0, F1, F2, F3          FP ARGUMENTS IN SRAM\r
+;                      FA3 FA2 FA1 FA0         FP REGISTER A (PRINCIPAL)\r
+;                      FB3 FB2 FB1 FB0         FP REGISTER B (ARGUMENT)\r
+;                          FC2 FC1 FC0         FP REGISTER C (AUXILIARY)\r
+\r
+;      IN GENERAL:     X IS USED TO INDEX FA, FB, ETC (FP REGISTERS)\r
+;                      Y IS USED TO INDEX F0, F1, ETC (FP SRAM ARGUMENTS)\r
+;                      Z IS USED TO INDEX K0, K1, ETC (FP FLASH/EEPROM CONSTANTS)\r
+\r
+;      REGISTER USAGE: GENERAL PURPOSE REGISTERS A,B,D\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      MISCELLANEOUS SUBROUTINES\r
+\r
+.EQU   BIAS    =$7F                    ; EXPONENT BIAS = 127\r
+\r
+LDS_FA:        LD      FA0,Y+                  ; LOAD FA FROM SRAM ARGUMENT\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+       LD      FA3,Y+\r
+       RET\r
+\r
+LDS_FB:        LD      FB0,Y+                  ; LOAD FB FROM SRAM ARGUMENT\r
+       LD      FB1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FB2,Y+\r
+       LD      FB3,Y+\r
+       RET\r
+\r
+LDF_FA:        LDI     XL,FA                   ; LOAD FA FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FA:        ROL     FA2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FA3\r
+       ROR     FA2\r
+       RET\r
+\r
+LDF_FB:        LDI     XL,FB                   ; LOAD FB FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FB:        ROL     FB2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FB3\r
+       ROR     FB2\r
+       RET\r
+\r
+LDF:   LDI     A,4                     ; LOAD FP REGISTER INDEXED BY XL\r
+LDF0:  LPM                             ; FROM FLASH CONSTANT\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDF0\r
+       RET\r
+\r
+LDE_FB:        LDI     XL,FB                   ; LOAD FB FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FB                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE_FA:        LDI     XL,FA                   ; LOAD FA FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FA                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE:   LDI     A,4\r
+LDE0:\r
+;      RCALL   LDE1                    ; 17MAY01 WAIT FOR WRITE IN PROGRESS\r
+       OUT     EEAR,ZL                 ; SET UP ADDRESS\r
+       SBI     EECR,EERE               ; ASSERT READ STROBE\r
+       IN      R0,EEDR\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDE0\r
+       RET\r
+\r
+;LDE1: SBIS    EECR,EEWE               ; 17MAY01 IF WRITE IN PROGRESS\r
+;      RET\r
+;      RJMP    LDE1                    ; THEN WAIT\r
+\r
+STS_FA:        ST      Y+,FA0                  ; STORE FA REGISTER TO SRAM ARGUMENT\r
+       ST      Y+,FA1                  ; Y POINTS TO DESTINATION\r
+       ST      Y+,FA2\r
+       ST      Y+,FA3\r
+       RET\r
+\r
+COM_FA:        COM     FA2                     ; ONES COMPLEMENT FA\r
+       COM     FA1\r
+       COM     FA0\r
+       RET\r
+\r
+ROR_FA:        ROR     FA2                     ; ROTATE RIGHT FA,1\r
+       ROR     FA1\r
+       ROR     FA0\r
+       RET\r
+\r
+LSL_FA:        LSL     FA0                     ; SHIFT LEFT FA,1\r
+       ROL     FA1\r
+       ROL     FA2\r
+       RET\r
+\r
+SUB_FB:        SUB     FA0,FB0                 ; FA=FA-FB\r
+       SBC     FA1,FB1\r
+       SBC     FA2,FB2\r
+       RET\r
+\r
+ADD_FB:        ADD     FA0,FB0                 ; FA=FA+FB\r
+       ADC     FA1,FB1\r
+       ADC     FA2,FB2\r
+       RET\r
+\r
+SGN_FA:        BST     FA2,7                   ; SAVE SIGN BIT\r
+       LDI     B,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,B\r
+       RET\r
+\r
+SGNS:  MOV     A,FB2                   ; COMPUTE SIGN OF RESULT\r
+       EOR     A,FA2\r
+       BST     A,7                     ; SAVE FOR LATER\r
+       LDI     A,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,A\r
+       OR      FB2,A\r
+       LDI     A,BIAS                  ; SUBTRACT BIAS\r
+       SUB     FA3,A\r
+       SUB     FB3,A\r
+       RET\r
+\r
+FIX_FA:        LDI     A,23+BIAS               ; TRUNCATE FA AND RETURN INTEGER PART\r
+       SUB     A,FA3\r
+       BRCS    FIX0                    ; IF EXPONENT>=24 THEN RETURN\r
+       CPI     A,24                    ; IF EXPONENT<0\r
+       BRCC    GO_MIN_FA               ; THEN FA=0\r
+       RCALL   SGN_FA                  ; SAVE SIGN & INSERT IMPLICIT BIT\r
+FIX2:  LSR     FA2                     ; SHIFT MANTISSA RIGHT\r
+       ROR     FA1\r
+       ROR     FA0\r
+       DEC     A                       ; (24-EXPONENT) BITS\r
+       BRNE    FIX2\r
+FIX0:  RET\r
+\r
+GO_MIN_FA:\r
+       RJMP    MIN_FA\r
+\r
+; REMOVED TO SAVE FLASH %\r
+;CHSS: LDD     B,Y+2                   ; CHANGE SIGN OF SRAM ARGUMENT\r
+;      LDI     A,$80\r
+;      EOR     B,A                     ; TOGGLE SIGN BIT\r
+;      STD     Y+2,B                   ; AND SAVE\r
+;      RET\r
+; %\r
+\r
+LDS2_FA:LD     FA0,Y+                  ; LOAD FA WITH 2 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       CLR     FA2\r
+       RJMP    LD3_FA\r
+LDS3_FA:LD     FA0,Y+                  ; LOAD FA WITH 3 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+LD3_FA:        CLT                             ; SET SIGN POSITIVE\r
+LD3:   LDI     A,23+BIAS               ; SET EXPONENT AND FALL INTO NORMALIZE\r
+       MOV     FA3,A\r
+\r
+NRM_FA:        MOV     A,FA0                   ; NORMALIZE FA REGISTER\r
+       OR      A,FA1\r
+       OR      A,FA2\r
+       BREQ    NRM3                    ; IF ZERO THEN CLEAR EXPONENT & EXIT\r
+NRM0:  TST     FA2\r
+NRM1:  BRMI    NRM2                    ; IF MANTISSA DENORMALIZED\r
+       DEC     FA3                     ; THEN ADJUST EXPONENT\r
+       BREQ    MIN_FA                  ;      IF UNDERFLOW THEN RETURN MIN\r
+       RCALL   LSL_FA                  ;      ELSE SHIFT MANTISSA LEFT\r
+       RJMP    NRM1\r
+NRM2:  BLD     FA2,7                   ; ELSE OVERLAY WITH SIGN BIT\r
+       RET\r
+NRM3:  CLR     FA3\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+ADD_FA:        RCALL   LDS_FB                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+ADD0:  TST     FB3                     ; IF FB=0\r
+       BREQ    RET0                    ; THEN DO NOTHING\r
+       TST     FA3                     ; IF FA=0\r
+       BREQ    SWP_FA                  ; THEN SWAP FA,FB AND EXIT\r
+       MOV     D,FB2                   ; GET SIGN OF ARGUMENT\r
+       EOR     D,FA2                   ; BIT 7 SET IF SIGNS DIFFERENT\r
+       MOV     A,FA3\r
+       SUB     A,FB3                   ; IF FA EXPONENT < ARG EXPONENT\r
+       BRCC    ADD1\r
+       NEG     A                       ; THEN (EXP DIFF)=-(EXP DIFF)\r
+       RCALL   SWP_FA                  ;      SWAP FA,FB\r
+ADD1:  CPI     A,24                    ; IF EXP DIFFERENCE >= 24\r
+       BRCC    RET0                    ; THEN DO NOTHING\r
+       RCALL   SGN_FA                  ; ELSE SAVE SIGN & INSERT IMPLICIT BIT\r
+       OR      FB2,B                   ;      INSERT IMPLICIT BIT IN FB ALSO\r
+       TST     A\r
+ADD2:  BREQ    ADD3\r
+       LSR     FB2                     ;      SHIFT FB RIGHT TO ALIGN\r
+       ROR     FB1\r
+       ROR     FB0\r
+       DEC     A\r
+       RJMP    ADD2\r
+ADD3:  TST     D                       ; IF SIGNS SAME\r
+       BRMI    ADD5\r
+       RCALL   ADD_FB                  ; THEN FA=FA+FB\r
+       BRCC    ADD4                    ;      IF CARRY\r
+       RCALL   ROR_FA                  ;      THEN RIGHT SHIFT\r
+       INC     FA3                     ;           INC EXPONENT\r
+       BREQ    MAX_FA                  ;           IF OVERFLOW RETURN MAX\r
+ADD4:  BLD     FA2,7                   ;           ELSE OVERLAY WITH SIGN BIT\r
+RET0:  RET\r
+ADD5:  RCALL   SUB_FB                  ; ELSE FA=FA-FB\r
+       BREQ    NRM3                    ;      IF ZERO THEN CLEAR EXP & EXIT\r
+       BRCC    NRM0                    ;      IF CARRY\r
+       RCALL   COM_FA                  ;      THEN FA=-FA\r
+       LDI     A,-1\r
+       SUB     FA0,A\r
+       SBC     FA1,A\r
+       SBC     FA2,A\r
+       BLD     A,7                     ;      TOGGLE SIGN BIT\r
+       COM     A\r
+       BST     A,7\r
+       RJMP    NRM0                    ;      NORMALIZE\r
+\r
+ADDE_FA:RCALL  LDE_FB                  ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+ADDF_FA:RCALL  LDF_FB                  ; ADD FLASH CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+SUB_FA:        RCALL   LDS_FB                  ; SUBTRACT SRAM ARGUMENT FROM FA REG\r
+SUB0:  LDI     A,$80\r
+       EOR     FB2,A                   ; TOGGLE SIGN\r
+       RJMP    ADD0\r
+\r
+SUBE_FA:RCALL  LDE_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+SUBF_FA:RCALL  LDF_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+; VARIOUS SUBROUTINES\r
+\r
+MIN_FA:        CLR     FA3                     ; FA=0\r
+CLR_FA:        CLR     FA2                     ; CLEAR FA\r
+       CLR     FA1\r
+       CLR     FA0\r
+       RET\r
+\r
+SWP_FA:        RCALL   SWP0                    ; SWAP CONTENTS OF FA & FB\r
+       RCALL   SWP1\r
+SWP0:  EOR     FA0,FB0\r
+       EOR     FA1,FB1\r
+       EOR     FA2,FB2\r
+       EOR     FA3,FB3\r
+       RET\r
+SWP1:  EOR     FB0,FA0\r
+       EOR     FB1,FA1\r
+       EOR     FB2,FA2\r
+       EOR     FB3,FA3\r
+       RET\r
+\r
+OUTRNG:        BRPL    MIN_FA                  ; UNDERFLOW\r
+;      RJMP    MAX_FA                  ; OVERFLOW\r
+\r
+;      UNDERFLOW BY A LITTLE:    $80 + $FF =   $7F     POSITIVE\r
+;                               -128 -   1 =  -129\r
+;      UNDERFLOW BY A LOT:       $80 + $80 =   $00     POSITIVE\r
+;                               -128 - 128 =  -256\r
+;      OVERFLOW BY A LITTLE:     $7F + $0F =   $80     NEGATIVE\r
+;                                127 +   1 =   128\r
+;      OVERFLOW BY A LOT:        $7F + $7F =   $FE     NEGATIVE\r
+;                                127 + 127 =   254\r
+\r
+MAX_FA:        CLR     FA3                     ; FA=MAX\r
+       COM     FA3\r
+       MOV     FA2,FA3\r
+       MOV     FA1,FA3\r
+       MOV     FA0,FA3\r
+       BLD     FA2,7                   ; SET SIGN\r
+       RET\r
+\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+MUL_FA:        RCALL   LDS_FB                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+MUL0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MIN_FA                  ; THEN FA=0\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT & REMOVE BIAS\r
+       ADD     FA3,FB3                 ; ADD EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; ELSE RESTORE BIAS\r
+       MOV     FC0,FA0                 ; FC=FA\r
+       MOV     FC1,FA1\r
+       MOV     FC2,FA2\r
+       RCALL   CLR_FA                  ; FA=0\r
+       CLC\r
+       LDI     A,24                    ; LOOP COUNTER\r
+MUL1:  RCALL   ROR_FA                  ; RIGHT SHIFT\r
+       LSR     FC2\r
+       ROR     FC1\r
+       ROR     FC0\r
+       BRCC    MUL2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+MUL2:  DEC     A\r
+       BRNE    MUL1\r
+       BRCC    MUL3                    ; IF CARRY\r
+       RCALL   ROR_FA                  ; THEN NORMALIZE BY 1 BIT\r
+       INC     FA3                     ;      ADJUST EXPONENT\r
+       BREQ    MAX_FA                  ;      IF OVERFLOW RETURN MAX\r
+MUL3:  BLD     FA2,7                   ; ELSE RESTORE SIGN\r
+RET1:  RET\r
+\r
+MULE_FA:RCALL  LDE_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+MULF_FA:RCALL  LDF_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+DIV_FA:        RCALL   LDS_FB                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+DIV0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       BST     FA2,7                   ; GET SIGN OF FA\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MAX_FA                  ; THEN RETURN MAX\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT\r
+       SUB     FA3,FB3                 ; SUBTRACT EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; RESTORE BIAS\r
+       LSR     FA2                     ; DENORMALIZE SO THAT CARRY IS NOT LOST\r
+       ROR     FA1                     ; DURING SUBTRACTION AND SUBSEQUENT ADD\r
+       ROR     FA0\r
+       LSR     FB2\r
+       ROR     FB1\r
+       ROR     FB0\r
+       LDI     A,24                    ; LOOP COUNTER\r
+DIV1:  RCALL   SUB_FB                  ; FA=FA-FB\r
+       BRCC    DIV2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+DIV2:  ROL     FC0                     ; SHIFT CARRY INTO LSB\r
+       ROL     FC1\r
+       ROL     FC2\r
+       RCALL   LSL_FA\r
+       DEC     A\r
+       BRNE    DIV1\r
+       MOV     FA0,FC0                 ; FA=FC\r
+       MOV     FA1,FC1\r
+       MOV     FA2,FC2\r
+       RCALL   COM_FA                  ; SINCE CARRY WAS WRONG SENSE\r
+       RJMP    NRM0                    ; NORMALIZE & RESTORE SIGN\r
+\r
+DIVE_FA:RCALL  LDE_FB                  ; DIVIDE FA REGISTER BY EEPROM CONSTANT\r
+       RJMP    DIV0\r
+\r
+DIVF_FA:RCALL  LDF_FB                  ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       RJMP    DIV0\r
+\r
+CP_FA: RCALL   LDS_FB                  ; COMPARE FA WITH SRAM ARGUMENT\r
+CP0:   MOV     A,FA3                   ; FIRST CHECK FOR SPECIAL ZERO CASE\r
+       OR      A,FB3\r
+       BREQ    CP6                     ; FA=0, FB=0\r
+       MOV     A,FA2                   ; NOW, IF SIGNS DIFFERENT\r
+       EOR     A,FB2\r
+       BRMI    CP3                     ; THEN ANSWER DETERMINED BY THE SIGNS\r
+       BST     FA2,7                   ; ELSE SAVE SIGN FOR LATER\r
+       SUB     FB3,FA3                 ; TEST EXPONENT WITHOUT CORRUPTING FA\r
+       BRCS    CP2                     ; IF EXP FA > EXP FB\r
+       BRNE    CP1                     ; IF EXP FA < EXP FB\r
+       SUB     FB0,FA0                 ; IF EXPS EQUAL, MUST TEST MANTISSA\r
+       SBC     FB1,FA1\r
+       SBC     FB2,FA2\r
+       BRCS    CP2\r
+       BREQ    CP6\r
+CP1:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP4                     ; THEN CLEAR CARRY\r
+       RJMP    CP5                     ; ELSE SET CARRY\r
+CP2:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP5                     ; THEN SET CARRY\r
+       RJMP    CP4                     ; ELSE CLEAR CARRY\r
+CP3:   TST     FA2                     ; CHECK SIGN\r
+       BRMI    CP5\r
+CP4:   CLC                             ; FA > FB\r
+       CLZ\r
+       RET\r
+CP5:   SEC                             ; FA < FB\r
+       CLZ\r
+CP6:   RET                             ; FA = FB\r
+\r
+CPF_FA:        RCALL   LDF_FB                  ; COMPARE FA WITH FLASH CONSTANT\r
+       RJMP    CP0\r
+\r
+CPE_FA:        RCALL   LDE_FB                  ; COMPARE FA WITH EEPROM CONSTANT\r
+       RJMP    CP0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+SNDSTR:        ADIW    ZL,2                    ; OUTPUT STRING FROM FLASH\r
+STR0:  RCALL   STR1                    ; RETRIEVE MESSAGE\r
+       BRNE    STR0\r
+       RET\r
+STR1:  LPM                             ; GET NEXT CHARACTER\r
+       MOV     A,R0\r
+       RCALL   TX_WAIT\r
+       ADIW    ZL,1\r
+       DEC     D\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SNDASC:\r
+;      RCALL   EXP0                    ; SEND IN ASCII FORMAT\r
+;      INC     F                       ; DIGITS TO LEFT OF DECIMAL POINT\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;ASC0: DEC     F\r
+;      BREQ    EXP11\r
+;      RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    ASC0\r
+\r
+; CHARACTERIZE ONLY %\r
+SNDEXP:\r
+       PUSH    A                       ; SEPARATOR\r
+       FMLF    K30M                    ; CONVERT TO HERTZ\r
+       RCALL   EXP0                    ; SEND EXPONENTIAL FORMAT +N.NNNNNNE+^^\r
+EXP5:  FCPF    KR0001                  ; IF N<.0001\r
+       BRCC    EXP6\r
+       FMLF    K100K                   ; THEN N=N*100K\r
+       SUBI    F,5                     ;      E=E-5\r
+       RJMP    EXP5\r
+EXP6:  FCPF    K1                      ; IF N<1\r
+       BRCC    EXP7\r
+       FMLF    K10                     ; THEN N=N*10\r
+       SUBI    F,1                     ;      E=E-1\r
+       RJMP    EXP6\r
+EXP7:  FADF    TLT1                    ; BY MEREST COINCIDENCE CLOSE TO 5.0E-7\r
+       RCALL   EXP3                    ; IN CASE WE JUMPED UP TO 10.000000\r
+       RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+       LDI     A,'.'\r
+       RCALL   TX_WAIT\r
+       LDI     E,6                     ; 7 SIGNIFICANT DIGITS IN ALL\r
+EXP8:  RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+       DEC     E\r
+       BRNE    EXP8\r
+       LDI     A,'0'                   ; 2 TRAILING ZEROS FOR COMPATIBILITY\r
+       RCALL   TX_WAIT                 ; WITH PREVIOUS CHARACTERIZE VERSION\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'E'                   ; NOW FOR THE EXPONENT\r
+       RCALL   TX_WAIT\r
+       LDI     A,'+'                   ; SEND SIGN\r
+       TST     F\r
+       BRPL    EXP9\r
+       LDI     A,'-'\r
+       NEG     F                       ; ABS(E)\r
+EXP9:  RCALL   TX_WAIT\r
+       LDI     A,'0'-1                 ; CONVERT MS DIGIT TO ASCII\r
+EXP10: INC     A\r
+       SUBI    F,10\r
+       BRPL    EXP10\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'+10                ; NOW LS DIGIT\r
+       ADD     A,F\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   TX_WAIT                 ; SEPARATOR\r
+EXP11: FLD     F0                      ; AND RESTORE FA\r
+       RET\r
+\r
+EXP0:  FST     F0                      ; ADJUST EXPONENT FOR ABS(N)>1\r
+       LDI     A,' '                   ; SEND SIGN (SPACE FOR +)\r
+       TST     FA2\r
+       BRPL    EXP1\r
+       LDI     A,'-'\r
+EXP1:  RCALL   TX_WAIT\r
+; %\r
+\r
+DIGN:  LDI     A,$7F\r
+       AND     FA2,A                   ; ABS(N)\r
+       CLR     F                       ; HOLDS ADJUSTED EXPONENT FOR 1<N<10\r
+EXP2:  FCPE    K10K ;FCPF K10K         ; IF N>10K\r
+       BRCS    EXP3\r
+       FMLF    KR0001                  ; THEN N=N/10K\r
+       ADDI    F,4                     ;      E=E+4\r
+       RJMP    EXP2\r
+EXP3:  FCPF    K10                     ; IF N>10\r
+       BRCS    EXP4\r
+       FMLF    KR1                     ; THEN N=N/10\r
+       SUBI    F,-1                    ;      E=E+1\r
+       RJMP    EXP3\r
+EXP4:  RET\r
+\r
+DGTN:  FSB     F1                      ; N=(N-I)*10\r
+       FMLF    K10                     ; REALLY N=(I-N)*10, SIGN UNIMPORTANT\r
+; FMLF K_1 ; LET'S BE SAFE KILLED 17MAY01\r
+DGT0:  FST     F1                      ; N (ADJUSTED)\r
+       RCALL   FIX_FA                  ; I=INT(N)\r
+       MOV     B,FA0                   ; SAVE LS DIGIT\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       LDI     A,'0'\r
+       ADD     A,B                     ; A = LS DIGIT IN ASCII\r
+       RJMP    TX_WAIT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+LDS_A_STATUS:\r
+       LDS     A,STATUS\r
+       RET\r
+\r
+SET_TRYZRO:\r
+       LDS     A,STATUS                ; THEN SET ZERO\r
+       SBR     A,1<<TRYZRO\r
+STS_STATUS_A:\r
+       STS     STATUS,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;\r
+;TOG_B4:\r
+;      RET\r
+;      SBIS    PORTB,4\r
+;      RJMP    TOG0\r
+;      CBI     PORTB,4                 ; FOR TESTING ONLY\r
+;      RET\r
+;TOG0: SBI     PORTB,4                 ; FOR TESTING ONLY\r
+\r
+\r
+; FOR LOCKUP TEST\r
+;      POP     G                       ; HIGH BYTE\r
+;      POP     H                       ; LOW BYTE\r
+;      PUSH    H\r
+;      PUSH    G\r
+\r
+;      LDI     H,'2'\r
+;      OUT     UDR,H\r
+;      LDI     G,'1'\r
+;      OUT     UDR,G\r
+\r
+;      MOV     G,H\r
+\r
+;      MOV     I,G\r
+;      SWAP    G\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL0\r
+;      SUBI    G,-$07\r
+;NIBLL0:       OUT     UDR,G\r
+;      MOV     G,I\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL1\r
+;      SUBI    G,-$07\r
+;NIBLL1:       OUT     UDR,G\r
+\r
+;      RET\r
+\r
+;      LDS     A,TEST_BUF              ; TESTING ONLY\r
+;      RCALL   CONV_TO_HEX\r
+\r
+;STACK_TEST:\r
+;      LDI     XL,RAMEND+1             ; STACK TEST\r
+;TST1:\r
+;      LD      A,-X\r
+;      RCALL   CONV_TO_HEX\r
+;      RCALL   SND_BUF\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   SND_BUF\r
+;      CPI     XL,$C8\r
+;      BRNE    TST1\r
+\r
+;STACK_TST:\r
+;      LDI     A,$55\r
+;      LDI     B,50\r
+;      LDI     YL,RAMEND-2\r
+;TST0: ST      -Y,A\r
+;      DEC     B\r
+;      BRNE    TST0\r
+\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4101                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/charav1.asm b/src/avr/charav1.asm
new file mode 100644 (file)
index 0000000..4e7c5ac
--- /dev/null
@@ -0,0 +1,2479 @@
+;      CHARAV1.ASM\r
+;      CHARACTERIZE MODE\r
+\r
+;      15JUN02\r
+;      ATmega8 VERSION HARDWARE/SOFTWARE CHANGES REQUIRED:\r
+;      1. REDUCE R8 FROM 100k TO 10k TO REDUCE RESET PIN IMPEDANCE\r
+;      2. CHANGE D2 FROM 1N4148 TO BAT46 FOR REDUCED TILT SIGNAL THRESHOLD\r
+;      3. IN ISPD.EXE KEEP DUTY CYCLE FOR SK BELOW 10% DURING PROGRAMMING\r
+;      4. PUSH/POP XH, YH, ZH TO PREVENT CORRUPTION DURING INTERRUPTS\r
+;      5. REVISE SOME REGISTER BIT POSITIONS FOR TIMER1\r
+\r
+;      17MAY01\r
+;      FOUND SOME UNITS WITH FAST WGT FREQ (50KHZ) ABORTING TILT MEASUREMENT\r
+;      AT LOW TEMPERATURES DUE TO INSUFFICIENT TIME => INCR TO 18 CYCLES PER\r
+\r
+;      ALSO FOUND EXCESSIVE JITTER IN TEMP MEASUREMENT PARTLY DUE TO SERVO\r
+;      ONTO SIGNAL EDGE AND PARTLY TO 33MHZ NOISE ON THERMISTOR => FIX TIMING,\r
+;      AND PACE DATA OUTPUT (SOME PROBLEM STILL REMAINS)\r
+\r
+;      ALSO HAD STACK OVERFLOW => REORDER SRAM VARIABLES\r
+\r
+;      ATmega8:\r
+.INCLUDE "MEGA8DEF.INC"                        ; FOR AVR ASSEMBLER\r
+;.INCLUDE "4433DEFX.INC"               ; FOR NICK ASSEMBLER\r
+.INCLUDE "MACLC.INC"\r
+;.INCLUDE "APILC.INC"\r
+;      ATmega8:\r
+.INCLUDE "TERLC8.INC"\r
+\r
+; WE SHOULD CHANGE THE CODE TO USE UCSRA AND UCSRB\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   CR              =$0D\r
+.EQU   LF              =$0A\r
+.EQU   RX_SIZE         =1\r
+.EQU   TX_SIZE         =8              ; LEAVES 10 BYTES FREE\r
+.EQU   API_ADDRESS     =$01            ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   CYC_MAX         =256            ; MAXIMUM WEIGHING CYCLE TIME\r
+.EQU   CYC_MIN         =160            ; MINIMUM WEIGHING CYCLE TIME > 6\r
+                                       ; < 210 ELSE OVERFLOW FOR FREQ < 27KHZ\r
+\r
+.EQU   CYC_ZERO        =16             ; INITIAL ZEROING COUNT\r
+.EQU   CYC_START       =32             ; INITIAL SMOOTHING COUNT\r
+\r
+                                       ; BITS IN RANGE\r
+.EQU   RNG             =$0F            ; RANGE BITS 0-3\r
+.EQU   RND             =6              ; ROUND UP (FOR HYSTERESIS)\r
+.EQU   SGN             =7              ; SIGN (FOR HYSTERESIS)\r
+                                       ; SGN MUST BE BIT 7 FOR EOR INSTRUCTION\r
+\r
+                                       ; BITS IN STATUS\r
+.EQU   OUCHFLG         =0              ; OVERLOAD\r
+.EQU   LOWFLG          =1              ; UNDERLOAD\r
+.EQU   UNSTBL          =2              ; UNSTABLE\r
+.EQU   VSTBL           =3              ; VERY STABLE\r
+.EQU   ZROFLG          =4              ; DISPLAY SHOWS ZERO\r
+.EQU   TRYZRO          =5              ; TRYING TO SET ZERO\r
+.EQU   SEND_SN         =6              ; TRYING TO SEND S/N MESSAGE\r
+.EQU   SEND_SPAN       =7              ; TRYING TO SEND SPAN MESSAGE\r
+\r
+                                       ; BITS IN FLAGS\r
+.EQU   SNDDAT          =0              ; SEND CHARACTERIZE DATA\r
+.EQU   ESC             =1              ; SET AFTER RECEIVING ESC\r
+.EQU   ESCM            =2              ; SET AFTER RECEIVING ESC M\r
+.EQU   BOMB            =3              ; SET DURING TILT MEASUREMENT\r
+.EQU   NEWDAT          =4              ; NEW SCALE DATA AVAILABLE\r
+.EQU   DIR             =5              ; DIRECTION OF CHANGE IN WGT\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+                                       ; BITS IN MODE\r
+.EQU   ABSGMS_FLG      =0              ; ABSOLUTE WEIGHT IN FP FORMAT\r
+.EQU   ZROGMS_FLG      =1              ; ZERO REGISTER IN FP FORMAT\r
+.EQU   TMPDEG_FLG      =2              ; TEMPERATURE (DEGREES) IN FP FORMAT\r
+.EQU   TLTBUB_FLG      =3              ; TILT BUBBLE POSITION IN INT FORMAT\r
+.EQU   WGTFRQ_FLG      =4              ; WEIGHT FREQUENCY IN FP FORMAT\r
+.EQU   TMPFRQ_FLG      =5              ; TEMPERATURE FREQUENCY IN FP FORMAT\r
+.EQU   TLRFRQ_FLG      =6              ; TILT LEFT/RIGHT IN FP FORMAT\r
+.EQU   TFBFRQ_FLG      =7              ; TILT FRONT/BACK IN FP FORMAT\r
+\r
+.DEF   FC0             =R0             ; AUXILLIARY FP ACCUMULATOR\r
+.DEF   FC1             =R1\r
+.DEF   FC2             =R2\r
+\r
+.EQU   FB              =$03\r
+.DEF   FB0             =R3             ; ARGUMENT FP ACCUMULATOR\r
+.DEF   FB1             =R4\r
+.DEF   FB2             =R5\r
+.DEF   FB3             =R6\r
+\r
+.EQU   FA              =$07\r
+.DEF   FA0             =R7             ; PRINCIPAL FP ACCUMULATOR\r
+.DEF   FA1             =R8\r
+.DEF   FA2             =R9\r
+.DEF   FA3             =R10\r
+\r
+.DEF   CYC_0           =R11\r
+.DEF   CYC_1           =R12\r
+\r
+.DEF   WT_0            =R13            ; RUNNING COUNT FOR 16 WEIGHT CYCLES\r
+.DEF   WT_1            =R14            ; TIMER1 INPUT CAPTURE LOW\r
+.DEF   WT_2            =R15            ; TIMER1 INPUT CAPTURE HIGH\r
+\r
+.DEF    A              =R17            ; GLOBAL REGISTERS\r
+.DEF    B              =R18\r
+.DEF   D               =R19\r
+.DEF   E               =R20\r
+.DEF   F               =R21\r
+\r
+.DEF   SR              =R22            ; SECONDARY REGISTER SET\r
+.DEF   G               =R23\r
+.DEF   H               =R24\r
+.DEF   I               =R25\r
+.DEF   J               =R27            ; XH\r
+.DEF   K               =R29            ; YH\r
+\r
+.DEF   FLAGS           =R16            ; MUST BE REGISTER, FOR ATOMIC ACCESS\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+STARTUP:       .BYTE   1               ; SMOOTHING COUNT FOR INITIAL STARTUP\r
+F3:\r
+TLTL_BUF:      .BYTE   2               ; DATA OUTPUT BUFFERS\r
+TLTR_BUF:      .BYTE   2\r
+F4:\r
+TLTF_BUF:      .BYTE   2\r
+TLTB_BUF:      .BYTE   2\r
+WGT:           .BYTE   3               ; ACCUMULATOR FOR 64 GROUPS OF 16\r
+TMP:           .BYTE   3               ; ACCUMULATOR FOR 256 TEMPERATURE\r
+TLTL:          .BYTE   2               ; ACCUMULATOR FOR 64 TILT CYCLES (TLT0)\r
+TLTR:          .BYTE   2\r
+TLTF:          .BYTE   2               ;                                (TLT1)\r
+TLTB:          .BYTE   2\r
+DTMP:          .BYTE   2               ; DIFFERENCE COUNT FOR CURRENT TEMP CYC\r
+WGTLST:                .BYTE   3               ; VALUE OF ADDITION TO WGT ON LAST CYC\r
+TL:            .BYTE   4               ; AVERAGED TLTLR\r
+TF:            .BYTE   4               ; AVERAGED TLTFB\r
+TMPFRQ:                .BYTE   4               ; TEMPERATURE FREQUENCY CYCLES/30MHZ\r
+GMS:           .BYTE   4\r
+INTGMS:                .BYTE   4\r
+COUNT:         .BYTE   4\r
+\r
+F0:            .BYTE   4               ; FLOATING POINT REGISTERS\r
+F1:            .BYTE   4\r
+F2:            .BYTE   4\r
+RANGE:         .BYTE   1\r
+STATUS:                .BYTE   1\r
+MODE:          .BYTE   1\r
+;MODE_CYCLE:   .BYTE   1               ; WEIGHING ONLY\r
+WGTFRQ:                .BYTE   4               ; CHARACTERIZE ONLY\r
+REF_30MHZ:     .BYTE   4               ; CHARACTERIZE ONLY\r
+TMP_PHASE:     .BYTE   1\r
+DSPRES:                .BYTE   4\r
+ZROGMS:                .BYTE   4\r
+\r
+API_REMAIN:    .BYTE   1\r
+RX_PTR:                .BYTE   1\r
+RX_COUNT:      .BYTE   1\r
+RX_BUF:                .BYTE   RX_SIZE\r
+TX_PTR:                .BYTE   1\r
+TX_COUNT:      .BYTE   1\r
+TX_BUF:                .BYTE   TX_SIZE         ; CAREFUL - COULD BE CLOBBERED BY STACK\r
+\r
+DSPGMS:                .BYTE   4               ; MOVED 02JUL01\r
+LSTGMS:                .BYTE   4               ; MOVED 17MAY01\r
+LSTDEV:                .BYTE   4               ; MOVED 17MAY01\r
+AVESTD:                .BYTE   4               ; MOVED 17MAY01\r
+AVEGMS:                .BYTE   4               ; MOVED 17MAY01\r
+\r
+.ESEG\r
+.ORG   $000                            ; ALL CONSTANTS IN IEEE754 FORMAT\r
+VOID:  .DB     $00,$00                 ; DON'T USE ADDR $000\r
+;EEMODE:       .DB     $00,$00         ; SEND ASCII WEIGHT DATA ONLY\r
+\r
+;SPAN: .DB     $00,$00,$80,$3F         ; 1.0000000E+00 DEFAULT TO 1\r
+SPAN:  .DB     $1B,$BA,$7F,$3F         ; 0.9989335E+00 SPAN FOR JSY/NLD\r
+\r
+RANGES: .DB    $04,$00                 ;  OIML APO30\r
+RANGE1: .DB    $00,$40,$1C,$45         ;  2500\r
+       .DB     $00,$00,$80,$3F         ;     1\r
+       .DB     $00,$40,$9C,$45         ;  5000\r
+       .DB     $00,$00,$A0,$40         ;     5\r
+       .DB     $00,$40,$1C,$46         ; 10000\r
+       .DB     $00,$00,$20,$41         ;    10\r
+RNGMAX: .DB    $00,$D8,$EA,$46         ; 30060\r
+       .DB     $00,$00,$A0,$41         ;    20\r
+\r
+.CSEG\r
+\r
+       .ORG    0\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT0ADDR\r
+       RJMP    TMP_INT                 ; INT0 HANDLER FOR TEMPERATURE MEASUREMENT\r
+\r
+       .ORG    ICP1ADDR\r
+       RJMP    WGT_INT                 ; TIMER1 CAPTURE HANDLER\r
+\r
+       .ORG    OVF0ADDR                ; NOT USED IN CHARACTERIZE MODE\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+\r
+.INCLUDE  "PRM.INC"                    ; LOAD CELL CHARACTERIZE PARAMETERS\r
+\r
+TLT2:  .DB     $C7,$75,$41,$AF ;-1.759509E-10  TILT LINEARISATION PARAMETERS\r
+TLT1:  .DB     $25,$7E,$0B,$35 ; 5.196510E-07\r
+TLT0:  .DB     $04,$31,$E3,$39 ; 4.333333E-04\r
+\r
+TICKS: .DB     $AE,$11,$8D,$45 ; 4.514210E+03 = 4096*33.06306M/30M\r
+\r
+HSTRSL:        .DB     $33,$33,$B3,$3E ; 3.500000E-01 = (0.5-0.15)\r
+HSTRSH:        .DB     $66,$66,$26,$3F ; 6.500000E-01 = (0.5+0.15)\r
+QUANT: .DB     $CD,$CC,$4C,$3E ; 2.000000E-01\r
+\r
+;K0:   .DB     $00,$00         ; 0.000000E+00\r
+;K_1:  .DB     $00,$00,$80,$BF ;-1.000000E+00 DON'T MOVE!\r
+;K_R5: .DB     $00,$00,$00,$BF ;-5.000000E-01\r
+KR0001:        .DB     $17,$B7,$D1,$38 ; 1.000000E-04\r
+KR005: .DB     $0A,$D7,$A3,$3B ; 5.000000E-03\r
+HYSCNF:        ;.DB    $CD,$CC,$CC,$3D ; 1.000000E-01 = .3/3\r
+KR1:   .DB     $CD,$CC,$CC,$3D ; 1.000000E-01\r
+KR3:   .DB     $9A,$99,$99,$3E ; 3.000000E-01\r
+KR5:   .DB     $00,$00,$00,$3F ; 5.000000E-01\r
+K1:    .DB     $00,$00,$80,$3F ; 1.000000E+00\r
+;K2:   .DB     $00,$00,$00,$40 ; 2.000000E+00\r
+K3:    .DB     $00,$00,$40,$40 ; 3.000000E+00\r
+K4:    .DB     $00,$00,$80,$40 ; 4.000000E+00\r
+K10:   .DB     $00,$00,$20,$41 ; 1.000000E+01\r
+K16:   .DB     $00,$00,$80,$41 ; 1.600000E+01\r
+CNFHYS:        ;.DB    $00,$00,$A0,$41 ; 2.000000E+01 = 3/.15\r
+K20:   .DB     $00,$00,$A0,$41 ; 2.000000E+01\r
+K30:   .DB     $00,$00,$F0,$41 ; 3.000000E+01\r
+K64:   .DB     $00,$00,$80,$42 ; 6.400000E+01\r
+;K100: .DB     $00,$00,$C8,$42 ; 1.000000E+02\r
+;K256: .DB     $00,$00,$80,$43 ; 2.560000E+02\r
+K228:  .DB     $39,$8E,$63,$43 ; 2.275556E+02 = 256*16/18 REVISED 17MAY01\r
+K400:  .DB     $00,$00,$C8,$43 ; 4.000000E+02\r
+K450:  .DB     $00,$00,$E1,$43 ; 4.500000E+02\r
+;K1450:        .DB     $00,$40,$B5,$44 ; 1.450000E+03\r
+;K10K: .DB     $00,$40,$1C,$46 ; 1.000000E+04\r
+; CHARACTERIZE ONLY %\r
+K100K: .DB     $00,$50,$C3,$47 ; 1.000000E+05\r
+K30M:  .DB     $C0,$E1,$E4,$4B ; 3.000000E+07\r
+K33M:  .DB     $00,$20,$FD,$4B ; 3.317760E+07\r
+; %\r
+\r
+; PUT THIS IN EEPROM:\r
+;SIGNON: .DB   3,0                     ; MUST HAVE EVEN NUMBER OF CHARS\r
+;      .DB     "LC"\r
+;      .DB     $0D,$0A\r
+FMAT0: .DB     6,0\r
+       .DB     " 0.000"\r
+FMAT1: .DB     6,0\r
+       .DB     "-OUCH "\r
+FMAT2: .DB     6,0\r
+       .DB     " -LO- "\r
+FMAT3: .DB     6,0\r
+       .DB     "HELLO "\r
+;FMAT4:        .DB     6,0\r
+;      .DB     "Error "\r
+FMAT5: .DB     6,0\r
+       .DB     "      "\r
+FMAT6: .DB     2,0\r
+       .DB     $0D,$0A\r
+;FMAT6:        .DB     3,0\r
+;      .DB     $20,$0D,$0A,0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+;      ATmega8:\r
+       OUTI    SPL,LOW(RAMEND)         ; INIT STACK POINTER\r
+       OUTI    SPH,HIGH(RAMEND)\r
+       OUTI    ACSR,$80                ; POWER DOWN ANALOG COMPARATOR\r
+\r
+;      SBI     DDRB,5                  ; SET SK TO OUTPUT FOR DIAGNOSTICS\r
+\r
+       SBI     DDRD,2                  ; SET BIT 2 TO OUTPUT FOR TEMP SENSOR\r
+       SBI     DDRD,3                  ; SET BIT 3 TO OUTPUT FOR TILT SENSOR\r
+\r
+       OUTI    TCCR1B,1                ; SET COUNTER1 TO CLOCK AT 11.0592 MHZ\r
+                                       ; AND INPUT CAPTURE ON FALLING EDGE\r
+       OUTI    MCUCR,0                 ; SET INT0 LOW SENSE FOR TEMP SENSOR\r
+                                       ; 17MAY01 BOMBS GRACEFULLY AT EACH EXTREME\r
+\r
+       CLR     CYC_0\r
+       CLR     CYC_1\r
+\r
+       CLR     A\r
+       STS     RANGE,A\r
+       RCALL   STS_STATUS_A\r
+       STS     STARTUP,A\r
+       STS     TMP_PHASE,A\r
+\r
+       ;LDER   A,EEMODE\r
+; CHARACTERIZE ONLY %\r
+       LDI     A,$F0\r
+; %\r
+       STS     MODE,A\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     A,1\r
+;      STS     MODE_CYCLE,A\r
+; %\r
+\r
+       FLDF    K1\r
+       FST     DSPRES\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     LSTGMS\r
+       FST     LSTDEV\r
+       FST     AVEGMS\r
+       FST     AVESTD\r
+       FST     INTGMS\r
+; CHARACTERIZE ONLY %\r
+       FST     WGTFRQ                  ; MAY NOT BE NECESSARY\r
+       FST     REF_30MHZ               ; NECESSARY\r
+; %\r
+\r
+       INIT_API_BUS                    ; SET UART RATE AND CLEAR FLAGS/PTRS\r
+\r
+       IN      A,TIMSK\r
+;      ATmega8:\r
+;      ORI     A,8                     ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+       SBR     A,1<<TICIE1             ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+       OUT     TIMSK,A\r
+\r
+;      ATmega8:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      OUTI    WDTCR,$18               ; ENABLE CHANGE OF TIMEOUT VALUE\r
+;      OUTI    WDTCR,$0F               ; ENABLE WATCHDOG WITH 2 SEC TIMEOUT\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+LOOP:                                  ; MAIN PROGRAM\r
+       ; IF THE INTERRUPT ALREADY CAME,\r
+       ; THROW AWAY THE DATA AND WAIT FOR A NEW ONE\r
+       CBR     FLAGS,1<<NEWDAT\r
+WAIT_LOOP:\r
+\r
+       ; TEST FOR WAITING COMMANDS OR DATA\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    WAIT_LOOPE\r
+       RCALL   RX_CHAR\r
+ ;     RCALL TX_CHAR                           ; LOOPBACK TEST\r
+\r
+       SBRC    FLAGS,ESC\r
+       RJMP    PROCESS_ESC\r
+       CPI     A,$1B\r
+       BRNE    WAIT_LOOPE\r
+       SBR     FLAGS,1<<ESC\r
+WAIT_LOOPE:\r
+       ; TEST FOR NEW DATA LEFT BY THE INTERRUPT\r
+       SBRS    FLAGS,NEWDAT\r
+       RJMP    WAIT_LOOP\r
+\r
+       WDR                     ; FEED WATCHDOG\r
+\r
+       ; SAY WE ARE TAKING THE NEW DATA\r
+       ;CBR    FLAGS,1<<NEWDAT\r
+\r
+       ; PROVIDE SQUARE WAVE DIAGNOSTIC ON B5\r
+       ;IN     A,PORTB\r
+       ;LDI    B,1<<5\r
+       ;EOR    A,B\r
+       ;OUT    PORTB,A\r
+\r
+       ;FLD DSPRES                     ; STACK TEST\r
+       ;RCALL SHOW_FA\r
+       ;LDI A,' '\r
+       ;RCALL TX_WAIT\r
+\r
+       FLD2    F2                      ; CONVERT CYCLE COUNT TO FP FORMAT\r
+       FST     F2\r
+       ;LDI    A,1<<WGTFRQ_FLG\r
+       ;LDI    F,'0'+WGTFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+GRAMS: FLD3    GMS                     ; CONVERT WEIGHT COUNT TO FP FORMAT\r
+; CHARACTERIZE ONLY %\r
+       FST     GMS\r
+       FAD     REF_30MHZ\r
+       FST     REF_30MHZ\r
+       FLD     GMS\r
+; %\r
+       ;LDI    A,1<<TMPFRQ_FLG\r
+       ;LDI    F,'0'+TMPFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FDV     F2\r
+;      FMLF    K256\r
+       FMLF    K228                    ; 17MAY01 256*16/18=227.55556\r
+;FDVF  K18\r
+;FMLF  K16\r
+       FST     GMS\r
+       FLDF    TICKS                   ; CONVERSION FACTOR\r
+       FDV     GMS\r
+       FST     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;      30usec\r
+\r
+       FLD3    F0                      ; CONVERT TEMPERATURE COUNT TO FP\r
+       FDV     F2                      ;   (THIS ROUTINE FREES UP F0)\r
+       FMLF    K64\r
+       FST     F0\r
+       FLDF    KR3\r
+       FDV     F0                      ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;LDI A,$0D\r
+;RCALL SNDEXP\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TMPFRQ\r
+       RCALL   SMOOTH\r
+;      270usec\r
+\r
+       ;LDS    A,STARTUP\r
+       ;SUBI   A,-$30\r
+       ;RCALL  TX_WAIT\r
+\r
+       FLD     GMS\r
+; CHARACTERIZE ONLY %\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,WGTFRQ\r
+       RCALL   SMOOTH\r
+; %\r
+       LDI     A,1<<WGTFRQ_FLG\r
+       LDI     F,'0'+WGTFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+       FLD     TMPFRQ\r
+       LDI     A,1<<TMPFRQ_FLG\r
+       LDI     F,'0'+TMPFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTL_BUF             ; CONVERT TILT TO FP (FREE UP F2, F3)\r
+       RCALL   LIN_TLT                 ; RETURNS CYCLES/30MHZ CLOCK TICK\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TL\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TLRFRQ_FLG\r
+       LDI     F,'0'+TLRFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TLRFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTF_BUF             ; (FREE UP F4)\r
+       RCALL   LIN_TLT\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TF\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TFBFRQ_FLG\r
+       LDI     F,'0'+TFBFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TFBFRQ IF DIAGNOSTIC MODE\r
+;2msec\r
+\r
+       RCALL   NRMTMP                  ; CONVERT TO NORMALIZED TEMP (-1<T<+1)\r
+       FST     F4                      ; AND SAVE NOW THAT F4 AVAILABLE\r
+       LDI     F,6                     ; DEGREE\r
+       LDIZ    A11                     ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; ZERO COMP A11*T^6+A10*T^5+A9*T^4+...\r
+       FST     F1\r
+;      1.1msec\r
+\r
+       FLD     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+       FADE    _WREF                   ; SHIFT ORIGIN TO IMPROVE PRECISION\r
+       LDFL    E,SEGS1                 ; GET SEGMENT COUNT\r
+       LDIZ    SEG1                    ; POINT TO FIRST SEGMENT BOUNDARY\r
+SEGN:  RCALL   CPF_FA                  ; COMPARE FA WITH SEGn\r
+       BRCC    GOTSEG\r
+       ADIW    ZL,12                   ; POINT TO NEXT SEGn\r
+       DEC     E\r
+       BRNE    SEGN\r
+GOTSEG:                                        ; CONVERT TO GMS = D2*W^2 + D1*W + D0\r
+       LDI     F,2                     ; DEGREE\r
+       RCALL   POLY                    ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FAD     F1                      ; GMS=GMS+(THERMAL ZERO CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; NOW, BACK TO GRAMS\r
+       LDFH    F,DEGS                  ; DEGREE\r
+       LDI     E,3                     ; RANGE COUNT\r
+       LDIZ    K500                    ; POINT TO 1ST RANGE BOUNDARY\r
+       RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCC    NEXT_SPNRNG\r
+\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CASE GMS<500\r
+       FDVE    K500\r
+       FML     GMS\r
+       RJMP    THERM_SPAN\r
+\r
+SPNRNG:        RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCS    GOT_SPNRNG\r
+NEXT_SPNRNG:\r
+       ADIW    ZL,32                   ; POINT TO NEXT RANGE BOUNDARY\r
+       DEC     E\r
+       BRNE    SPNRNG\r
+       ADIW    ZL,4\r
+GOT_SPNRNG:\r
+       SBIW    ZL,40                   ; POINT TO PREVIOUS BOUNDARY\r
+       RCALL   SUBE_FA\r
+       FST     F2                      ; F2=GMS-LOWER BOUNDARY\r
+       MOV     E,F                     ; SAVE DEGREE FOR LATER\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FST     F3                      ; CORR.LOW\r
+       MOV     F,E                     ; F=DEGREE, ZL POINTS TO DELTA LOAD\r
+       ADIW    ZL,8                    ; POINT TO NEXT HIGH ORDER COEFFICIENT\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CALCULATE CORR.HIGH\r
+       FSB     F3                      ; CORR.HIGH-CORR.LOW\r
+       SBIW    ZL,8+4+(6*4)            ; POINT TO EARLIER DELTA LOAD (DEGREE=6)\r
+       RCALL   DIVE_FA\r
+       FML     F2\r
+       FAD     F3                      ; THERMAL SPAN CORRECTION\r
+THERM_SPAN:\r
+       FST     F2\r
+\r
+       ;LDI    A,1<<ZROGMS_FLG\r
+       ;LDI    F,'0'+ZROGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FAD     GMS                     ; GMS=GMS+(THERMAL SPAN CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_10\r
+       MOV     F,FA0\r
+\r
+       FLD     F4                      ; NORMALISED TEMPERATURE\r
+       FMLF    K30\r
+       FADF    K20                     ; CONVERT TO DEGREES CELSIUS\r
+       RCALL   FIX_10                  ; TEMPERATURE (10TH DEGREES)\r
+       MOV     FA2,F                   ; THERMAL ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,E                   ; THERMAL SPAN CORRECTION (10TH GMS)\r
+\r
+       LDI     A,1<<TMPDEG_FLG\r
+       LDI     F,'0'+TMPDEG_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+; TILT CORRECTION\r
+; TLTP1=TLTA31*TLTFR0 + TLTA21*TLTFR1^2+TLTA11*TLTFR1+TLTA01\r
+       LDIZ    TLTA21                  ; TILT FB BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TF\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA31\r
+       FML     TL\r
+       FAD     F0\r
+       FST     F1\r
+\r
+; TLTP0=TLTA30*TLTFR1 + TLTA20*TLTFR0^2+TLTA10*TLTFR0+TLTA00\r
+       LDIZ    TLTA20                  ; TILT LR BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TL\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA30\r
+       FML     TF\r
+       FAD     F0\r
+       FST     F0\r
+\r
+; TLTSPN1 = (TLTC21*TLTP1+TLTC11)*TLTP1\r
+       RCALL   LDF_FA                  ; TLTC21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTC11\r
+       FML     F1\r
+       FST     F3\r
+\r
+; TLTSPN0 = (TLTC20*TLTP0+TLTC10)*TLTP0\r
+       RCALL   LDF_FA                  ; TLTC20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTC10\r
+       FML     F0\r
+\r
+; WEIGHT = WEIGHT + WEIGHT*(TLTSPN0+TLTSPN1)\r
+       FAD     F3\r
+       FST     F3                      ; TLTSPN\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FML     GMS\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+; WEIGHT=WEIGHT + TLTB21*TLTP1^2+TLTB11*TLTP1\r
+       RCALL   LDF_FA                  ; TLTB21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTB11\r
+       FML     F1\r
+       FST     F2\r
+\r
+; WEIGHT=WEIGHT + TLTB20*TLTP0^2+TLTB10*TLTP0\r
+       RCALL   LDF_FA                  ; TLTB20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTB10\r
+       FML     F0\r
+       FAD     F2\r
+       FST     F2                      ; TLTZRO\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+       FLD     F3\r
+       FMLE    K10K\r
+       RCALL   FIX_ENTRY\r
+       MOV     D,FA0\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_400\r
+       MOV     F,FA0\r
+\r
+       FLD     F0\r
+       RCALL   FIX_400                 ; TILT X POSITION\r
+       MOV     FA1,F                   ; TILT Y POSITION\r
+       MOV     FA2,E                   ; TILT ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,D                   ; TILT SPAN CORRECTION (10TH GMS/KG)\r
+\r
+       LDI     A,1<<TLTBUB_FLG\r
+       LDI     F,'0'+TLTBUB_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+;SKIP_TILT:\r
+       ;FLD    GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLDE    SPAN\r
+       FML     GMS\r
+       FST     GMS\r
+\r
+; RECALIBRATION\r
+       LDI     F,3                     ; DEGREE\r
+       LDI     ZL,LOW(CAL3*2)          ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; CAL3*GMS^3+CAL2*GMS^2+CAL1*GMS+CAL0\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; AVERAGING ALGORITHM\r
+                                       ; MEASURE DEVIATION\r
+       FSB     LSTGMS                  ; DEV=GMS-LSTGMS\r
+       LDS     A,LSTDEV+2              ; IF SGN(DEV)=SGN(LSTDEV) (SAME DIR)\r
+       EOR     A,FA2\r
+       BRMI    AV0\r
+       FAD     LSTDEV                  ; THEN DEV=DEV+LSTDEV (ACCUMULATE DEV)\r
+AV0:\r
+; WEIGHING ONLY %\r
+; %    FST     LSTDEV\r
+       LDI     A,$7F                   ; IF ABS(DEV) < QUANT\r
+       AND     FA2,A\r
+       FST     F0\r
+       FCPF    QUANT\r
+       BRCC    AV1\r
+       FLDF    QUANT                   ; THEN STD=QUANT (STD DEV > QUANT)\r
+       FST     F0                      ; ELSE STD=ABS(DEV) (APPROX STD DEV)\r
+\r
+                                       ; SET AVERAGING PERIOD\r
+AV1:   FLD     COUNT                   ; IF STD/AVESTD > CNT/(CNT+1)\r
+       FML     AVESTD                  ; (STILL TOO NOISY)\r
+       FST     F1\r
+       FLD     COUNT\r
+       FADF    K1\r
+       FST     F2\r
+       FML     F0\r
+       FCP     F1\r
+       BRCS    AV2\r
+       FLD     F2                      ; THEN INCR CNT (EXTEND AVERAGE)\r
+       FST     COUNT\r
+AV2:   FLD     AVESTD                  ; MAXCNT=(AVESTD/DSPRES)*(CONF/HYST)\r
+       FDV     DSPRES\r
+       FMLF    CNFHYS\r
+       FST     F1\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV3                     ; (UNTIL STD DEV < HYST)\r
+       RCALL   LDS_A_STATUS            ; THEN VERY STABLE=1\r
+       SBR     A,1<<VSTBL\r
+       RCALL   STS_STATUS_A\r
+AV3:   FLD     F1                      ; MAXCNT=MAXCNT+30\r
+       FADF    K30\r
+       FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV4\r
+       FLD     F1                      ; THEN CNT=MAXCNT\r
+       FST     COUNT\r
+\r
+                                       ; AVERAGE THE DEVIATION\r
+AV4:   FLD     COUNT                   ; NN=CNT (WEIGHTING FOR AVESTD)\r
+       FST     F1\r
+       FLD     F0                      ; IF STD*3 < AVESTD (VERY QUIET)\r
+       FMLF    K3\r
+       FCP     AVESTD\r
+       BRCC    AV5\r
+       FLD     F1                      ; THEN IF NN>10 THEN NN=10\r
+       FCPF    K10                     ; (ADAPT LOWER QUICKLY)\r
+       BRCS    AV5\r
+       FLDF    K10\r
+       FST     F1                      ; NN\r
+AV5:   FLD     F0                      ; STD\r
+; WEIGHING ONLY %\r
+;      LDI     F,AVESTD\r
+; %    RCALL   SMOOTH_FP               ; AVESTD=(STD+AVESTD*(NN-1))/NN\r
+       FLD     COUNT                   ; IF AVESTD < CNT*DSPRES*HYST\r
+       FML     DSPRES                  ;    (NO DISPLAY FLICKER)\r
+       FMLF    HYSCNF\r
+       FCP     AVESTD\r
+       BRCS    AV6\r
+       RCALL   LDS_A_STATUS            ; THEN UNSTABLE=0 (STABLE)\r
+       CBR     A,1<<UNSTBL\r
+       RCALL   STS_STATUS_A\r
+                                       ; AVERAGE THE DATA\r
+AV6:   FLD     GMS\r
+; WEIGHING ONLY %\r
+; %    FST     LSTGMS                  ; READY FOR NEXT CYCLE\r
+       FSB     AVEGMS\r
+       FST     F2                      ; ERRGMS=GMS-AVEGMS\r
+       FMLF    K4\r
+       FST     F1                      ; ERRGMS*4\r
+       RCALL   LDS_A_STATUS            ; NOW SET WEIGHTING FOR AVEGMS\r
+       SBRS    A,VSTBL                 ; IF VERY STABLE\r
+       RJMP    AV7\r
+       FLD     F1                      ; THEN NN=CNT+(ERRGMS*4/DSPRES)^2\r
+       FDV     DSPRES                  ;      (EXCLUDE NOISY DATA)\r
+       FST     F3                      ;       ERRGMS*4/DSPRES\r
+       FML     F3                      ;      (ERRGMS*4/DSPRES)^2\r
+       FAD     COUNT\r
+       RJMP    AV8\r
+AV7:   FLD     COUNT                   ; ELSE NN=CNT (EXCEPT AFTER JUMP)\r
+AV8:   FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     GMS\r
+; WEIGHING ONLY %\r
+;      LDI     F,AVEGMS\r
+; %    RCALL   SMOOTH_FP               ; AVEGMS=(GMS+AVEGMS*(NN-1))/NN\r
+       LDI     A,1<<ABSGMS_FLG\r
+       LDI     F,'0'+ABSGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+                                       ; ALLOW INTGMS TO DECAY\r
+       FLD     F2                      ; ERRGMS\r
+       FMLF    K4\r
+       FST     F3                      ; ERRGMS*4\r
+       FML     F3\r
+       FADF    K10\r
+       FST     F1                      ; NN=10+(ERRGMS*4)^2 (TIME CONSTANT)\r
+       FLD     INTGMS                  ; INTGMS=INTGMS-INTGMS/NN (DECAY)\r
+       FDV     F1\r
+       FSB     INTGMS\r
+       FST     INTGMS                  ; ACTUALLY -INTGMS\r
+\r
+                                       ; INTEGRATE ERROR BETWEEN DATA AND AVE\r
+       FLD     DSPRES                  ; MINERR=DSPRES-AVESTD*2\r
+       FSB     AVESTD\r
+       FSB     AVESTD\r
+       FST     F3\r
+       TST     FA2                     ; IF MINERR < 0\r
+       BRPL    AV9\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     F3                      ; THEN MINERR=0\r
+AV9:   FLD     F2                      ; ERRGMS\r
+       BST     FA2,7                   ; SAVE SIGN\r
+       LDI     A,$7F\r
+       AND     FA2,A\r
+       FST     F1                      ; ABS(ERRGMS)\r
+       FCP     F3                      ; IF ABS(ERRGMS) < MINERR\r
+       BRCC    AV10\r
+       FLD     INTGMS                  ; THEN ERRGMS=0 (INTGMS UNCHANGED)\r
+       RJMP    AV12\r
+AV10:  FLD     F1                      ; WIND TO HAVE NO ADVANTAGE OVER GMS<20\r
+       FCPF    K20                     ; IF ABS(ERRGMS) < 20\r
+       BRCC    AV11\r
+       FLDF    K1                      ; THEN ERRGMS=SGN(ERRGMS)\r
+       BLD     FA2,7                   ;      (RESTORE SIGN)\r
+       FST     F2\r
+AV11:  FLDF    K4                      ; INTGMS=INTGMS+ERRGMS*4/STD\r
+       FML     F2\r
+       FDV     F0\r
+       FSB     INTGMS                  ; INTEGRATE THE ERROR\r
+       FST     INTGMS\r
+AV12:                                  ; RESTART AVERAGE IF ERROR SIGNIFICANT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; IF ABS(INTGMS)>64 (JUMP CONDITION)\r
+       FCPF    K64\r
+       BRCS    AV13\r
+       FLDF    K1                      ; THEN CNT=1\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     INTGMS                  ;      INTGMS=0\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<VSTBL              ;      VERY STABLE=0\r
+       SBR     A,1<<UNSTBL             ;      UNSTABLE=1\r
+       RCALL   STS_STATUS_A\r
+\r
+; TO IMPROVE WIND PERFORMANCE I NEED TO VARY THE JUMP THRESHOLD\r
+; HAVING REGARD TO THE LONGER TERM EXCURSIONS ABOUT AVEGMS\r
+\r
+AV13:  FLD     AVEGMS                  ; AUTOZERO ROUTINE\r
+       FSB     ZROGMS\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+       FCPF    KR5                     ; IF ABS(AVEGMS-ZROGMS)<0.5\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<ZROFLG\r
+       BRCC    AZ0\r
+       SBR     A,1<<ZROFLG             ; THEN SET ZROFLG\r
+AZ0:   RCALL   STS_STATUS_A\r
+       SBRS    A,ZROFLG                ; IF NOT SHOWING ZERO\r
+       RJMP    AZ1                     ; THEN SKIP AUTOZERO\r
+       FLD     AVEGMS                  ; ELSE AVERAGE INTO ZERO POINT\r
+       LDI     F,ZROGMS\r
+       LDI     A,17                    ;      IF AVEOK=0 USE N=17 ELSE N=2\r
+       RCALL   SMOOTH\r
+\r
+AZ1:   RCALL   LDS_A_STATUS            ; IF NOT SET ZERO COMMAND\r
+       SBRS    A,TRYZRO\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING\r
+       ;RCALL  LDS_A_STATUS            ; IF UNSTABLE\r
+       SBRC    A,UNSTBL\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING, RETAIN RQ\r
+       FLD     AVEGMS                  ; ELSE IF OUTSIDE RANGE\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ;         ABS\r
+       FCPF    K450 ;K1450 FOR EXTENDED ZERO RANGE - SHIPPED WITH S/N 5637\r
+       BRCC    AZ2                     ;      THEN SKIP ZERO SETTING, CLEAR RQ\r
+       FLD     AVEGMS                  ; ADDED 18DEC00 - ALLOW NEGATIVE AVEGMS\r
+       FST     ZROGMS                  ;      ELSE ZROGMS=AVEGMS\r
+AZ2:   RCALL   LDS_A_STATUS            ; ADDED 24FEB99 - MISSING ALL ALONG?\r
+       CBR     A,1<<TRYZRO\r
+       RCALL   STS_STATUS_A\r
+AZ3:   FLD     ZROGMS\r
+       LDI     A,1<<ZROGMS_FLG\r
+       LDI     F,'0'+ZROGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+; FIND RANGE AND DISPLAY RESOLUTION\r
+; WE ALSO CALCULATE F0=AVEGMS-ZROGMS IN THE PROCESS\r
+       FLD     AVEGMS\r
+       FSB     ZROGMS\r
+       FST     F0\r
+\r
+       LDER    E,RANGES                ; GET RANGE COUNT\r
+       LDI     ZL,RANGE1*2             ; POINT TO FIRST RANGE BOUNDARY\r
+RNGE:  RCALL   CPE_FA                  ; COMPARE FA WITH BOUNDARY\r
+       BRCS    GOTRNG\r
+       ADIW    ZL,4                    ; POINT TO NEXT RNG\r
+       DEC     E\r
+       BRNE    RNGE\r
+       SBIW    ZL,4                    ; POINT BACK TO PREVIOUS RESOLUTION\r
+GOTRNG:        RCALL   LDE_FA                  ; GET DISPLAY RESOLUTION FOR THIS RANGE\r
+       FST     DSPRES\r
+\r
+; STABILIZE DISPLAYED WEIGHT USING HYSTERESIS\r
+STAB:  FLD     F0\r
+       MOV     F,FA2                   ; SAVE SIGN BIT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     F2\r
+       RCALL   FIX_FA                  ; TRUNCATE TO 3 BYTE INTEGER\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       FST     F0                      ; INTEGER PART\r
+       FLD     F2\r
+       FSB     F0                      ; FA = FRACTIONAL PART\r
+       FCPF    HSTRSL\r
+       BRCS    STB2                    ; FRACTION < HSTRSL, ROUND DOWN\r
+       FCPF    HSTRSH\r
+       BRCC    STB1                    ; FRACTION >= HSTRSH, ROUND UP\r
+\r
+       LDS     A,RANGE                 ; PREVIOUS RANGE, RND, SGN\r
+       MOV     B,A\r
+       EOR     B,F                     ; COMPARE WITH CURRENT SIGN (BIT 7)\r
+       BRMI    STB2                    ; JUST CHANGED SIGN, ROUND DOWN\r
+       ANDI    A,RNG                   ; PREVIOUS RANGE\r
+       CP      A,E                     ; COMPARE WITH CURRENT RANGE\r
+       BRCS    STB1                    ; JUST GONE TO LOWER RANGE, ROUND UP\r
+       BRNE    STB2                    ; JUST GONE TO HIGHER RANGE, ROUND DOWN\r
+\r
+       FLD     DSPGMS                  ; RECALCULATE VALUE FROM LAST TIME\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       LDS     A,RANGE                 ; PREVIOUS STATE\r
+       SBRS    A,RND                   ; IF ROUNDED UP LAST TIME\r
+       RJMP    STB0\r
+       FSBF    K1                      ; THEN DECREMENT\r
+STB0:  FST     F2                      ; CORRESPONDING VALUE FROM LAST TIME\r
+       FCP     F0\r
+       BRCS    STB2                    ; GONE TO HIGHER VALUE, ROUND DOWN\r
+       FLD     F0\r
+       FCP     F2\r
+       BRCS    STB1                    ; GONE TO LOWER VALUE, ROUND UP\r
+       RJMP    STB5                    ; ELSE RETAIN EXISTING DSPGMS\r
+\r
+STB1:  FLD     F0                      ; ROUND UPWARDS\r
+       FADF    K1\r
+       SBR     E,1<<RND                ; SUPERIMPOSE UPWARDS FLAG ON RANGE\r
+       RJMP    STB3\r
+\r
+STB2:  FLD     F0                      ; ROUND DOWNWARDS\r
+       ;CBR    E,1<<RND                ; SUPERIMPOSE DOWNWARDS FLAG ON RANGE\r
+STB3:  BST     F,7                     ; GET CURRENT SIGN\r
+       TST     FA3                     ; IF DSPGMS<>0\r
+       BREQ    STB4\r
+       BLD     FA2,7                   ; THEN RESTORE SIGN\r
+STB4:  BLD     E,SGN                   ; SUPERIMPOSE ON CURRENT RANGE\r
+       STS     RANGE,E                 ; SAVE CURRENT RANGE, RND, SGN\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FMLF KR1\r
+ ; ELSE\r
+       FML     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+; WEIGHING ONLY %\r
+;      FST     DSPGMS\r
+\r
+STB5:\r
+;      ;LDS    A,MODE                  ; IF NOT WEIGHING MODE\r
+;      ;SBRS   A,DSPGMS_FLG\r
+;      ;RJMP   DSP9                    ; THEN SKIP OUTPUT IN GRAMS\r
+;\r
+;      LDI     E,CYC_MIN*2/3\r
+;      RCALL   TX_WAIT_EMPTY\r
+;      BRCS    FMT\r
+;      RJMP    DSP9                    ; NO TX_BUFFER TO SEND ITEM THIS CYCLE\r
+;\r
+;FMT:  RCALL   LDS_A_STATUS\r
+;      SBRS    A,SEND_SN               ; NEED TO SEND S/N MESSAGE ?\r
+;      RJMP    SKIP_SN\r
+;\r
+;      CBR     A,1<<SEND_SN\r
+;      RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;\r
+;      LDFL    D,SN\r
+;      RCALL   SNDSTR                  ; SEND S/N MESSAGE\r
+;      RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+;\r
+;SKIP_SN:\r
+;;     RCALL   LDS_A_STATUS\r
+;;     SBRS    A,SEND_SPAN             ; NEED TO SEND S/N MESSAGE ?\r
+;;     RJMP    SKIP_SPAN\r
+;;\r
+;;     CBR     A,1<<SEND_SPAN\r
+;;     RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;;\r
+;;     FLDE    SPAN\r
+;;     LDI     A,0                     ; ITEM MUST ALWAYS BE SENT\r
+;;     LDI     F,'S'\r
+;;     RCALL   SNDFP                   ; SEND SPAN MESSAGE\r
+;;     RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+;\r
+;SKIP_SPAN:\r
+;      LDS     A,STARTUP               ; IF STARTUP<CYC_ZERO\r
+;      CPI     A,CYC_ZERO\r
+;      BRCC    FMT0\r
+;      RCALL   SET_TRYZRO              ; THEN SET ZERO\r
+;      LDFL    D,FMAT3                 ;      SHOW " HELLO"\r
+;      RJMP    DSP7\r
+;\r
+;FMT0: FLD     DSPGMS                  ; FORMAT OUTPUT DATA PACKET\r
+;      LDFL    D,FMAT5                 ; IF SETTING ZERO\r
+;      LDS     F,STATUS\r
+;      SBRC    F,TRYZRO                ; THEN SHOW "     "\r
+;      RJMP    DSP7\r
+;      LDS     E,STARTUP               ; USED FOR DELAY BEFORE SHOWING " -LO-"\r
+;      TST     FA2                     ; IF DSPGMS>=0\r
+;      BRPL    FMT2                    ; THEN CONTINUE\r
+;;     FSBF    KR005                   ; ELIMINATE TRUNCATION ERROR (- VALUES)\r
+;      INC     E                       ; INC " -LO-" COUNTER (STARTUP)\r
+;      CPI     E,CYC_START+8           ; IF STARTUP<CYC_START+8\r
+;      BRCC    FMT1\r
+;      STS     STARTUP,E\r
+;      LDFL    D,FMAT0                 ; THEN SHOW " 0.000"\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;LDI E,CYC_MIN-10    ; TIMEOUT IS WHEN CYC_1 => E\r
+; ;RCALL SNDSTR\r
+; ;LDI A,'0'\r
+; ;RCALL TX_WAIT\r
+; ;RJMP DSP8\r
+; ; %\r
+;      RJMP    DSP7\r
+;FMT1: SBR     F,1<<LOWFLG             ; ELSE SET LOWFLG\r
+;      STS     STATUS,F\r
+;      LDFL    D,FMAT2                 ;      SHOW " -LO-"\r
+;      RJMP    DSP7\r
+;FMT2: CBR     F,1<<LOWFLG             ; CLEAR LOWFLG\r
+;      CPI     E,CYC_START             ; IF STARTUP>CYC_START  ' CLEAR " -LO-"\r
+;      BRCS    FMT3\r
+;      LDI     E,CYC_START             ; THEN STARTUP=CYC_START\r
+;      STS     STARTUP,E\r
+;FMT3: FCPE    RNGMAX                  ; IF DSPGMS>RNGMAX\r
+;      BRCS    FMT4\r
+;      SBR     F,1<<OUCHFLG            ; SET OUCHFLG\r
+;      STS     STATUS,F\r
+;      LDFL    D,FMAT1\r
+;      RJMP    DSP7                    ; THEN SHOW "-OUCH"\r
+;FMT4: CBR     F,1<<OUCHFLG            ; CLEAR OUCHFLG\r
+;      STS     STATUS,F\r
+;\r
+;DSP:  FADF    KR005                   ; ELIMINATE TRUNCATION ERROR (+ VALUES)\r
+;      RCALL   DIGN                    ; ADJUST EXPONENT FOR 1<N<10\r
+;      ADDI    F,2                     ; NUMBER OF DIGITS TO SEND +1\r
+;      ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      LDFL    D,FMAT0                 ; " 0.000"\r
+;      ADIW    ZL,2\r
+;DSP2: CP      F,D\r
+;      BRCC    DSP4\r
+;DSP3: RCALL   STR1                    ; GET NEXT CHARACTER FROM FMAT0\r
+;      BREQ    DSP8                    ; WHEN ALL DONE\r
+;      CPI     D,4\r
+;      BRNE    DSP2\r
+;      DEC     F                       ; TO COMPENSATE FOR EXTRA DEC C\r
+;      RJMP    DSP3                    ; DO DECIMAL PT\r
+;DSP4:\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;INC F\r
+; ; %\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND FIRST DIGIT\r
+;DSP5: DEC     F\r
+;      BREQ    DSP8\r
+;      CPI     F,4\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;CPI F,5\r
+; ; %\r
+;      BRNE    DSP6\r
+;      LDI     A,'.'\r
+;      RCALL   TX_WAIT\r
+;      DEC     F\r
+;DSP6: RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    DSP5\r
+;DSP7: ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+;DSP8:\r
+;; ASCII STABILITY INDICATION FOR TESTING %\r
+;;     LDI     A,' '\r
+;;     RCALL   TX_WAIT\r
+;;     RCALL   LDS_A_STATUS\r
+;;     ANDI    A,1<<UNSTBL\r
+;;     LDI     A,' '\r
+;;     BREQ    DSP8X\r
+;;     LDI     A,'*'\r
+;;DSP8X:       RCALL   TX_WAIT\r
+;;     LDI     A,$0D\r
+;;     RCALL   TX_WAIT\r
+;;     LDI     A,$0A\r
+;;     RCALL   TX_WAIT\r
+;; %\r
+;      LDFL    D,FMAT6                 ; NOW SEND TRAILER\r
+;      RCALL   SNDSTR\r
+;DSP9:\r
+; %\r
+\r
+       ; END OF MAIN WEIGHING LOOP\r
+\r
+; WEIGHING ONLY %\r
+;      LDS     A,MODE_CYCLE\r
+;      CPI     A,$10\r
+;      BRLO    MODE_CYCLE_SWAP\r
+;      LSL     A\r
+;      BRNE    MODE_CYCLE_SWAP\r
+;      LDI     A,$10\r
+;MODE_CYCLE_SWAP:\r
+;      SWAP    A\r
+;      STS     MODE_CYCLE,A\r
+;\r
+;      LDS     A,STARTUP\r
+;      INC     A\r
+;      CPI     A,CYC_START+1           ; INC UP TO 32\r
+;      BRCC    LOOP_END\r
+;      STS     STARTUP,A\r
+; %\r
+\r
+; CHARACTERIZE ONLY %\r
+       LDS     A,STARTUP\r
+       SBRC    FLAGS,SNDDAT\r
+       LDI     A,0                     ; RESTART INTEGRATION IF WE SENT DATA\r
+       INC     A\r
+       STS     STARTUP,A               ; INCREASE COUNT FOR TRUE AVERAGE\r
+\r
+       CBR     FLAGS,1<<SNDDAT         ; SAY WE MUST NOT SEND DATA OUT\r
+\r
+       FLD     REF_30MHZ               ; ELAPSED INTEGRATION TIME, 33MHZ TICKS\r
+       FCPF    K33M                    ; => 1 SECOND ?\r
+       BRLO    LOOP_END                ; NO, CONTINUE CURRENT INTEGRATION\r
+\r
+       FSBF    K33M\r
+       FST     REF_30MHZ               ; WRAP ELAPSED TIME FOR NEW CYCLE\r
+\r
+       SBR     FLAGS,1<<SNDDAT         ; SAY WE MUST SEND DATA OUT\r
+; %\r
+\r
+LOOP_END:\r
+       RJMP    LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FIX_400:\r
+       FMLF    K400                    ; FOR +/- 20 FROM +/- 0.05\r
+       RJMP    FIX_ENTRY\r
+FIX_10:\r
+       FMLF    K10                     ; FOR 10TH GRAMS FROM GRAMS\r
+FIX_ENTRY:\r
+       ; THIS WILL CLOBBER D REGISTER,\r
+       ; AND DOES NOT CORRECTLY HANDLE NEGATIVE NUMBERS %\r
+       ;FADF   KR5                     ; FOR ROUNDING\r
+       ; %\r
+       RCALL   FIX_FA\r
+       BRTC    FIX_POSITIVE\r
+       COM     FA0\r
+       COM     FA1\r
+       INC     FA0\r
+       BRNE    FIX_POSITIVE\r
+       INC     FA1\r
+FIX_POSITIVE:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_WAIT_EMPTY:\r
+       LDS     A,TX_COUNT\r
+       CPI     A,1\r
+       BRLO    TX_WAIT_EMPTY_RET\r
+\r
+       CP      CYC_1,E\r
+       BRLO    TX_WAIT_EMPTY\r
+\r
+;      LDS     A,TX_COUNT\r
+;      CPI     A,1\r
+\r
+TX_WAIT_EMPTY_RET:\r
+       RET                             ; CF SET = READY, CF CLEAR = NOT READY\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+POLY:  FST     F0                      ; POLYNOMIAL CALCULATION, FLASH CONST\r
+                                       ; ENTER WITH FA = INDEPENDENT VAR\r
+       RCALL   LDF_FA                  ;            Z <= HIGHEST ORDER COEFF\r
+POLY0: FML     F0\r
+       RCALL   ADDF_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLY0\r
+       RET\r
+\r
+NRMTMP:        FLD     TMPFRQ                  ; NORMALIZE TEMP C3*T^3+C2*T^2+C1*T+C0\r
+       LDI     F,3                     ; DEGREE\r
+       LDIZ    C3                      ; HIGH ORDER COEFFICIENT\r
+;      RJMP    POLYE                   ; RETURN -1=-10 DEG, 0=20 DEG, 1=50 DEG\r
+\r
+POLYE: FST     F0                      ; POLYNOMIAL CALCULATION, EEPROM CONST\r
+       RCALL   LDE_FA                  ; ENTER WITH F0 = INDEPENDENT VARIABLE\r
+POLYE0:        FML     F0                      ;            Z <= HIGHEST ORDER COEFF\r
+       RCALL   ADDE_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLYE0\r
+       RET\r
+\r
+SMOOTH:                                        ; EXPONENTIAL SMOOTHING A=N E=>AVERAGE\r
+       TST     A                       ; IF N=0        NOTE: CLOBBERS F0, F1\r
+       BREQ    SMTH0                   ; THEN DO NOTHING\r
+       FST     F0                      ; SAVE CURRENT DATA\r
+       MOV     FA0,A                   ; CONVERT N\r
+       CLR     FA1\r
+       CLR     FA2\r
+       RCALL   LD3_FA                  ; TO FP FORMAT\r
+       FST     F1                      ; AND SAVE\r
+       FLD     F0                      ; RETRIEVE CURRENT DATA\r
+SMOOTH_FP:                             ; ENTRY POINT WITH F1=N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   SUB_FA\r
+       FDV     F1                      ; N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   ADD_FA\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   STS_FA                  ; AND SAVE\r
+SMTH0: RET\r
+\r
+LIN_TLT:\r
+       RCALL   LDS2_FA                 ; CONVERT 2 BYTE TILT COUNT TO FP\r
+       MOV     F,YL                    ; TEMP SAVE\r
+       FST     F0                      ; TLTL\r
+       MOV     YL,F\r
+       RCALL   LDS2_FA                 ; CONVERT OPPOSING TILT COUNT TO FP\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F1                      ; TLTR\r
+       FML     F1                      ; TLTR^2\r
+       FST     F3\r
+       FLD     F0\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F0                      ; TLTL\r
+       FML     F0                      ; TLTL^2\r
+       FSB     F3                      ; TLTL^2-TLTR^2\r
+       FMLF    TLT2\r
+       FST     F3\r
+       FLD     F1\r
+       FSB     F0                      ; TLTR-TLTL\r
+       FMLF    TLT1\r
+       FSB     F3\r
+       FADF    TLT0\r
+SNDFP2:        RET\r
+\r
+SNDFP:\r
+; WEIGHING ONLY %\r
+;      INC     FA3                     ; CHECK FOR NAN\r
+;      BRNE    SND0\r
+;      DEC     FA3                     ; TO COMPLY WITH IEEE754\r
+;SND0: DEC     FA3\r
+;      ROL     FA2                     ; CONVERT TO IEEE754\r
+;      ROR     FA3\r
+;      ROR     FA2\r
+; %\r
+\r
+       TST     A\r
+       BREQ    SNDFPX                  ; ITEM MUST ALWAYS BE SENT\r
+\r
+SNDFPE:        LDS     B,MODE                  ; SEND DIAGNOSTIC DATA\r
+       AND     A,B                     ; MODE BIT FOR THIS DATA ITEM SET?\r
+; WEIGHING ONLY %\r
+;      LDS     B,MODE_CYCLE\r
+;      AND     A,B                     ; ROUND ROBIN UP TO THIS DATA ITEM YET?\r
+; %\r
+       BREQ    SNDFP2                  ; DO NOT SEND THIS DATA ITEM THIS CYCLE\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     E,0                     ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   TX_WAIT_EMPTY\r
+;      BRCC    SNDFP2                  ; NO TX_BUFFER SPACE TO SEND ITEM\r
+; %\r
+\r
+SNDFPX:\r
+; CHARACTERIZE ONLY %\r
+       SBRS    FLAGS,SNDDAT\r
+       RET\r
+       CPI     A,$80\r
+       LDI     A,$0A\r
+       BRNE    SEPOK\r
+       LDI     A,$0D\r
+SEPOK: RJMP    SNDEXP\r
+; %\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,F                     ; INDICATE WHICH DATA IS BEING SENT\r
+;      RCALL   TX_WAIT\r
+;;SND_FA:\r
+;      LDI     XL,FA                   ; LOAD TX BUFFER\r
+;      LDI     D,4\r
+;SND1: LD      A,X+\r
+;      RCALL   TX_WAIT                 ; LS BYTE FIRST\r
+;      DEC     D\r
+;      BRNE    SND1\r
+;      RET\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PROCESS_ESC:\r
+       SBRC    FLAGS,ESCM\r
+       RJMP    PROCESS_ESC_M1\r
+\r
+       CPI     A,'#'\r
+       BREQ    PROCESS_ESC_HASH\r
+       CPI     A,'M'\r
+       BREQ    PROCESS_ESC_M0\r
+;      CPI     A,'S'\r
+;      BREQ    PROCESS_ESC_S\r
+       CPI     A,'Z'\r
+       BREQ    PROCESS_ESC_Z\r
+\r
+PROCESS_ESC_DONE:\r
+       CBR     FLAGS,1<<ESC            ; NEED ANOTHER ESC TO GET BACK HERE\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_HASH:\r
+       RCALL   LDS_A_STATUS\r
+       SBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SEND S/N INSTEAD OF WEIGHT OUTPUT\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_M0:\r
+       SBR     FLAGS,1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_M1:\r
+       STS     MODE,A\r
+       CBR     FLAGS,1<<ESC | 1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+;PROCESS_ESC_S:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SEND SPAN INSTEAD OF WEIGHT OUTPUT\r
+;      RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_Z:\r
+       RCALL   SET_TRYZRO              ; SET ZERO\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+WGT_INT:\r
+       IN      SR,SREG\r
+       INC     CYC_0                   ; INCREMENT WEIGHT CYCLE COUNTER\r
+        OUT     SREG,SR\r
+        SBRS    CYC_0,4\r
+       RETI                            ; CYC_0<16\r
+        SBRS    CYC_0,0\r
+       RETI                            ; CYC_0=16\r
+       CBI     UCR,UDRIE               ; CYC_0=17 DISABLE UART INTERRUPT\r
+        SBRS    CYC_0,1                        ;          TO REDUCE JITTER FOR TEMP\r
+       RETI                            ;          MEASUREMENT, AND RETURN\r
+\r
+       PUSH    SR                      ; CYC_0=18 DO TEMP AND TILT\r
+       LDI     SR,$10+16-18            ; 17MAY01 NEED MORE TIME FOR FAST XTALS\r
+       ADD     CYC_0,SR                ; CLEAR BIT 4, CARRYING INTO BITS 5-7\r
+       IN      G,PIND\r
+       IN      H,PINC                  ; READ DATA\r
+       SEI                             ; ALLOW RECURSIVE WGT_INT\r
+\r
+;      ATmega8:\r
+       PUSH    K                       ; MEGA8: J,K USED BY FOREGROUND\r
+       PUSH    J\r
+\r
+;RCALL TOG_B5\r
+       ANDI    G,$F0                   ; ASSEMBLE DATA\r
+       ANDI    H,$0F\r
+       OR      G,H                     ; INTO G\r
+       SUB     G,WT_0                  ; CALC DIFFERENCE FROM LAST CYCLE\r
+       ADD     WT_0,G                  ; AND SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       PUSH    G                       ; PUT HC590 DIFFERENCE COUNT ON STACK\r
+\r
+       IN      G,ICR1L                 ; READ TIMER1 INPUT CAPTURE REGISTER\r
+       MOV     H,G\r
+       SUB     H,WT_1                  ; AND CALC DIFFERENCE FROM LAST CYCLE\r
+       MOV     WT_1,G                  ; SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       IN      G,ICR1H                 ; NOW HIGH BYTE\r
+       MOV     I,G\r
+       SBC     I,WT_2\r
+       MOV     WT_2,G\r
+\r
+;      USE 11MHZ COUNT TO DETERMINE HOW MANY TIMES HC590 HAS ROLLED OVER\r
+\r
+       MOV     G,H                     ; DIFFERENCE COUNT IN H|I\r
+       MOV     K,I\r
+       CLR     J\r
+       ADD     H,H                     ; H|I * 3 => H|I|J\r
+       ADC     I,I\r
+       ADC     J,J\r
+       ADD     H,G\r
+       ADC     I,K\r
+       CLR     G\r
+       ADC     J,G\r
+\r
+       MOV     G,I\r
+       MOV     K,J\r
+       LSR     K\r
+       ROR     G\r
+\r
+       ; ALLOW +/-128 COUNTS OF ERROR DUE TO XTAL TOLERANCES (-60 TYP)\r
+\r
+       POP     G                       ; RETRIEVE HC590 DIFFERENCE COUNT\r
+       SUB     G,H                     ; CALCULATE AMOUNT TO ADJUST H|I|J\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_COUNT\r
+; MOV A,G\r
+; RCALL TX_CHAR\r
+;SKIP_COUNT:\r
+; POP A\r
+       LDS     K,STARTUP               ; CHANGED 26MAR01 TO ALLOW FOR\r
+       TST     K                       ; NEW BATCH OF 11MHZ XTALS\r
+       BREQ    CORRECTION_OK\r
+       CPI     G,-48                   ; ASSUME NORMAL CORRECTION > -16\r
+       BRSH    CORRECTION_OK\r
+       CPI     G,16                    ; OR            CORRECTION > +5\r
+       BRLO    CORRECTION_OK\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_DOLLAR\r
+ LDI A,'$'\r
+ RCALL TX_CHAR\r
+SKIP_DOLLAR:\r
+ POP A\r
+       SUB     WT_0,G\r
+       LDI     G,-12                   ; BUT TYPICALLY -12\r
+       ADD     WT_0,G\r
+CORRECTION_OK:\r
+       LDI     K,0\r
+       TST     G\r
+       BRPL    SIGN_EXTEND\r
+       LDI     K,$FF                   ; IF NEG\r
+SIGN_EXTEND:\r
+       ADD     H,G\r
+       ADC     I,K\r
+       ADC     J,K                     ; ADD INTO H|I|J\r
+\r
+       LDS     G,WGTLST                ; TEST DIRECTION OF CHANGE\r
+       CP      H,G                     ; DIFFERENCE NOW IN H|I|J\r
+       LDS     G,WGTLST+1\r
+       CPC     I,G\r
+       LDS     G,WGTLST+2\r
+       CPC     J,G\r
+\r
+       STS     WGTLST,H                ; AND SAVE SAMPLE FOR NEXT CYCLE\r
+       STS     WGTLST+1,I\r
+       STS     WGTLST+2,J\r
+\r
+;      ATmega8:\r
+       POP     J\r
+       POP     K\r
+\r
+       CLI                             ; 17MAY01\r
+       LDS     G,TMP_PHASE             ; START TEMPERATURE MEASUREMENT %\r
+       INC     G\r
+TMP0:  RJMP    TMP1\r
+TMP1:  DEC     G                       ; WAIT TO SYNCHRONISE SUBSEQUENT INT0\r
+       BRNE    TMP0\r
+\r
+;      CLI\r
+       SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+       SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+;      ATmega8:\r
+;      IN      G,GIMSK                 ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+       IN      G,GICR                  ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+       SBRC    G,INT0\r
+       RCALL   TMP_INT00               ; THEN WE MUST PROCESS ANYWAY\r
+                                       ; 17MAY01 MOVED:\r
+;      SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+;      SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+;      LDI     G,$40                   ;  SHIFTED TO LATER\r
+;      OUT     GIFR,G                  ;  CLEAR PENDING INT0 RESULTING FROM\r
+;      OUT     GIMSK,G                 ;  ACTIVITY ON PIN, AND ENABLE INT0\r
+       CBI     DDRD,2                  ; SET BIT 2 TO INPUT TO START DISCHARGE\r
+       CBI     PORTD,2                 ; AND REMOVE PULLUP\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET STARTING COUNT FROM TIMER1\r
+       STS     DTMP,G\r
+       IN      G,TCNT1H                ; NOW HIGH BYTE\r
+       STS     DTMP+1,G\r
+       SEI\r
+\r
+       MOV     G,CYC_1                 ; CYCLE COUNT, NOT INCLUDING CURRENT\r
+       INC     CYC_1                   ; INCLUDE CURRENT CYCLE\r
+       BRCS    DEC0                    ; NOW LOOK AT CHANGE\r
+       CBR     FLAGS,1<<DIR            ; IF INCREASING\r
+       RJMP    CONT\r
+DEC0:  SBRC    FLAGS,DIR               ; IF DECREASING\r
+       RJMP    DEC1\r
+       SBR     FLAGS,1<<DIR            ;    BUT INCREASING LAST TIME\r
+       RJMP    PEAK                    ; THEN PROCESS PEAK\r
+DEC1:  SBR     FLAGS,1<<DIR\r
+CONT:  CPI     G,CYC_MAX-1\r
+       BRLO    NOPEAK                  ; LIMIT TO CYC_MAX GROUPS OF 16 CYCLES\r
+PEAK:  CPI     G,CYC_MIN-1             ; NEVER DETECT PEAKS CLOSER THAN CYC_MIN\r
+       BRLO    NOPEAK\r
+\r
+       LDI     H,0\r
+       SUBI    G,LOW(-1)\r
+       SBCI    H,HIGH(-1)              ; ALLOW H:G TO INCREMENT UP TO $100\r
+       STS     F2,G                    ; TRANSFER CYCLE COUNT TO FOREGROUND F2\r
+       STS     F2+1,H\r
+\r
+       CLR     CYC_1                   ; INITIALISE CYCLE COUNT\r
+\r
+       LDI     XL,LOW(WGT)             ; TRANSFER DATA TO OUTPUT BUFFER\r
+       CLR     XH\r
+       CLR     G\r
+\r
+       LDI     YL,LOW(GMS)             ; WGHT DATA\r
+       CLR     YH\r
+       LDI     H,3\r
+TRANSFER_0:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_0\r
+\r
+       LDI     YL,LOW(F0)              ; TEMP DATA\r
+       LDI     H,3\r
+TRANSFER_1:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_1\r
+\r
+       LDI     YL,LOW(F3)              ; TILT DATA\r
+       LDI     H,8\r
+TRANSFER_2:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_2\r
+\r
+       SBR     FLAGS,1<<NEWDAT         ; FLAG NEW DATA TO FOREGROUND\r
+\r
+NOPEAK:        LDS     G,WGT                   ; DIFFERENCE NOW IN WGTLST, ADD TO WGT\r
+       LDS     H,WGTLST\r
+       ADD     G,H\r
+       STS     WGT,G\r
+       LDS     G,WGT+1\r
+       LDS     H,WGTLST+1\r
+       ADC     G,H\r
+       STS     WGT+1,G\r
+       LDS     G,WGT+2\r
+       LDS     H,WGTLST+2\r
+       ADC     G,H\r
+       STS     WGT+2,G\r
+\r
+       CLI\r
+       LDI     G,$40                   ; 17MAY01 ENABLE TEMPERATURE INTERRUPT\r
+       OUT     GIFR,G                  ; CLEAR PENDING INT0 RESULTING FROM\r
+;      ATmega8:\r
+;      OUT     GIMSK,G                 ; ACTIVITY ON PIN, AND ENABLE INT0\r
+       OUT     GICR,G                  ; ACTIVITY ON PIN, AND ENABLE INT0\r
+\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,BOMB              ; TILT MEASUREMENT STILL IN PROGRESS?\r
+       RETI\r
+\r
+       POP     G                       ; YES, TILT SENSOR MUST HAVE FAILED\r
+       POP     G                       ;      SO FIX STACK\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_ASTERISK\r
+ LDI A,'*'\r
+ RCALL TX_CHAR\r
+SKIP_ASTERISK:\r
+ POP A\r
+       RJMP    ABORT_TLT               ;      AND ABORT TILT MEASUREMENT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+TMP_INT:\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      SR,SREG\r
+       RCALL   TMP_INT0                ; PROCESS TEMPERATURE DATA\r
+       PUSH    SR\r
+\r
+       CLR     I\r
+;      ATmega8:\r
+;      OUT     GIMSK,I                 ; DISABLE INT0 INTERRUPTS\r
+       OUT     GICR,I                  ; DISABLE INT0 INTERRUPTS\r
+\r
+                                       ; START TILT\r
+       SBR     FLAGS,1<<BOMB           ; BOMB OUT ON 18TH WEIGHT INTERRUPT\r
+       SEI\r
+\r
+       LDI     G,-110                  ; LIMIT TO 50uSEC (FULL PERIOD 20KHZ)\r
+       LDI     H,-55                   ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0:   INC     G                       ; WAIT FOR LOW ON WGT TO SYNCHRONISE\r
+       BREQ    TL2\r
+       SBIC    PINB,0\r
+       RJMP    TL0\r
+TL1:   INC     G                       ; WAIT FOR HIGH ON WGT,\r
+       BREQ    TL2                     ; TO MEASURE TIME TO EDGE\r
+       SBIS    PINB,0\r
+       RJMP    TL1\r
+TL2:   INC     H                       ; WAIT FOR LOW ON WGT,\r
+       BREQ    TL3                     ; TO MEASURE PERIOD/2\r
+       SBIC    PINB,0\r
+       RJMP    TL2\r
+TL3:                                   ; 17MAY01\r
+       SUBI    G,-110+5                ; +5 TO MAKE SURE WE HIT WITH WGT LOW\r
+       SUBI    H,-55                   ; WHICH SAVES A FULL WGT CYCLE IN TIME\r
+                                       ; BUT ALSO NOT TOO CLOSE TO HC590\r
+                                       ; CLOCKING WHICH CAUSES PREMATURE INT0\r
+; OUT UDR,G\r
+; OUT UDR,H\r
+       LDS     I,TMP_PHASE\r
+       SUB     G,H                     ; H = PERIOD/2\r
+       BRLO    PHASE_INCREASE          ; SERVO TOWARDS G = 0\r
+;PHASE_DECREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,1\r
+       BRSH    PHASE_SAVE\r
+       ADD     I,H\r
+       RJMP    PHASE_SAVE\r
+PHASE_INCREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,-1\r
+       CP      I,H\r
+       BRLO    PHASE_SAVE\r
+       SUB     I,H\r
+PHASE_SAVE:\r
+       STS     TMP_PHASE,I\r
+\r
+       LDI     G,132                   ; DESIRED PULSE LENGTH, 60 uSEC\r
+MOD_LOOP:\r
+       SUB     G,H                     ; H = AT LEAST 1 BY ALGORITHM ABOVE\r
+       BRSH    MOD_LOOP\r
+\r
+PULSE_DELAY_0:\r
+       RJMP    PULSE_DELAY_1\r
+PULSE_DELAY_1:\r
+       INC     G\r
+       BRNE    PULSE_DELAY_0           ; DELAY H - (132 MOD H) BEFORE TURN ON\r
+\r
+       SBI     PORTD,3                 ; TURN ON PULSE\r
+\r
+       LDI     G,110*5/3               ; SLIGHTLY LESS THAN PULSE, 50 uSEC\r
+PULSE_DELAY_3:\r
+       DEC     G\r
+       BRNE    PULSE_DELAY_3\r
+\r
+       LDI     G,55                    ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0X:  DEC     G                       ; AND WAIT FOR LOW ON WGT TO ENSURE AT\r
+       BREQ    TOO_LONG                ; LEAST 1/2 CYCLE OF WGT HIGH, TO\r
+       SBIC    PINB,0                  ; PERFORM TILT MEASUREMENT BEFORE NEXT\r
+       RJMP    TL0X                    ; WGT INTERRUPT\r
+TOO_LONG:\r
+\r
+       CBI     PORTD,3                 ; TURN PULSE OFF AGAIN\r
+       MOV     G,CYC_0                 ; WHICH DIRECTION ? (WHILE WAITING)\r
+       IN      H,TCNT1L                ; SAVE STARTING COUNT\r
+       SWAP    G\r
+       LSR     G\r
+       ANDI    G,$03                   ; 2 LOW ORDER BITS INDICATE TILT AXIS\r
+\r
+       LDI     I,TLTL                  ; DON'T USE Z IN CASE OF BOMB OUT\r
+       BREQ    LEFT                    ; =0\r
+       DEC     G\r
+       LDI     I,TLTR\r
+       BREQ    RIGHT                   ; =1\r
+       DEC     G\r
+       LDI     I,TLTB\r
+       BREQ    BACK                    ; =2\r
+       LDI     I,TLTF\r
+FRONT: SBIS    PINB,2                  ; WAIT FOR EDGE\r
+       RJMP    FRONT\r
+       RJMP    TLT_AD\r
+BACK:  SBIS    PINC,5                  ; WAIT FOR EDGE\r
+       RJMP    BACK\r
+       RJMP    TLT_AD\r
+LEFT:  SBIS    PINC,4                  ; WAIT FOR EDGE\r
+       RJMP    LEFT\r
+       RJMP    TLT_AD\r
+RIGHT: SBIS    PINB,1                  ; WAIT FOR EDGE\r
+       RJMP    RIGHT\r
+       RJMP    TLT_AD                  ; EQUALISE TIME DELAY\r
+TLT_AD:        IN      G,TCNT1L                ; GET ENDING COUNT\r
+       SUB     G,H                     ; CALCULATE INCREASE IN COUNT\r
+\r
+;      ATmega8:\r
+       PUSH    ZH                      ; FOREGROUND USES Z\r
+       PUSH    ZL\r
+       CLR     ZH\r
+       MOV     ZL,I\r
+\r
+;PUSH G\r
+       LD      I,Z                     ; GET CURRENT ACCUMULATION\r
+       ADD     I,G                     ; ADD NEW READING\r
+       ST      Z+,I                    ; AND SAVE\r
+       LDI     G,0\r
+       LD      I,Z                     ; NOW HIGH BYTE\r
+       ADC     I,G                     ; G=0 FROM ABOVE\r
+       ST      Z+,I\r
+;POP G\r
+;CPI   ZL,TLTF\r
+;BRNE  ABORT_TLT\r
+;PUSH  A\r
+;PUSH  D\r
+;MOV   A,G\r
+;RCALL CONV_TO_HEX\r
+;LDI   A,$20\r
+;RCALL TX_CHAR\r
+;POP   D\r
+;POP   A\r
+\r
+;      ATmega8:\r
+       POP     ZL                      ; RESTORE Z\r
+       POP     ZH\r
+       CLI\r
+\r
+ABORT_TLT:                             ; ENTER HERE WITH INTERRUPTS DISABLED\r
+; WHY IS THIS STILL HERE:\r
+;      CBI     PORTD,3                 ; TURN TILT PULSE OFF IN CASE BOMBED\r
+       CBR     FLAGS,1<<BOMB           ; WE WILL NOT BOMB OUT ON WEIGHT INT\r
+\r
+                                       ; 17MAY01 ALLOW DATA AFTER TEMP INT0\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+TMP_INT00:\r
+                               ; 17MAY01 TO PREVENT DATA LOCKUP\r
+ SBI   UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_HASH\r
+ LDI A,'#'\r
+ RCALL TX_CHAR\r
+SKIP_HASH:\r
+ POP A\r
+\r
+TMP_INT0:\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET ENDING COUNT\r
+       LDS     I,DTMP                  ; RETRIEVE STARTING COUNT\r
+       SUB     G,I                     ; CALCULATE END-START DIFFERENCE\r
+       IN      H,TCNT1H                ; NOW HIGH BYTE\r
+       LDS     I,DTMP+1\r
+       SBC     H,I                     ; G|H NOW HAS DIFFERENCE COUNT\r
+\r
+       LDS     I,TMP                   ; ACCUMULATE DIFFERENCE COUNT\r
+       ADD     I,G\r
+       STS     TMP,I\r
+       LDS     I,TMP+1\r
+       ADC     I,H\r
+       STS     TMP+1,I\r
+       BRCC    DONE_TMP\r
+       LDS     I,TMP+2                 ; ADJUST HIGH ORDER BYTE IF CARRY\r
+       INC     I\r
+       STS     TMP+2,I\r
+DONE_TMP:\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SHOW_FA:\r
+;      MOV     A,FA3\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA2\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA1\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA0\r
+;      RCALL   CONV_TO_HEX\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RET\r
+;\r
+;CONV_TO_HEX:                          ; ENTER WITH BYTE IN A\r
+;      MOV     D,A\r
+;      SWAP    A\r
+;      RCALL   NIBL\r
+;      MOV     A,D\r
+;NIBL: ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,':'\r
+;      BRMI    NIBL0\r
+;      SUBI    A,-$07\r
+;NIBL0:\r
+;      RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+RX_WAIT:\r
+       MRX_WAIT                        ; FALLS OUT INTO RX_CHAR\r
+RX_CHAR:\r
+       MRX_CHAR                        ; FOR DIAGS, FALLS OUT INTO TX_WAIT\r
+TX_WAIT:\r
+       MTX_WAIT                        ; FALLS OUT INTO TX_CHAR\r
+TX_CHAR:\r
+       MTX_CHAR                        ; FALLS OUT INTO TX_CHAR_RET\r
+TX_CHAR_RET:\r
+       MTX_CHAR_RET                    ; DOES NOT FALL OUT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY                       ; DOES NOT FALL OUT\r
+\r
+RX_COMPLETE:\r
+       MRX_COMPLETE                    ; DOES NOT FALL OUT\r
+\r
+TX_COMPLETE:\r
+T0_OVERFLOW:\r
+       MTX_COMPLETE                    ; FALLS OUT INTO API_ERROR\r
+API_ERROR:\r
+       MAPI_ERROR                      ; FALLS OUT INTO API_REVERT\r
+API_REVERT:\r
+       MAPI_REVERT                     ; FALLS OUT INTO API_DONE\r
+API_DONE:\r
+       MAPI_DONE                       ; DOES NOT FALL OUT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      FLOATING POINT MATHS\r
+\r
+;      MS BYTE                     LS BYTE\r
+;      seeeeeee emmmmmmm mmmmmmmm mmmmmmmm IEEE754 FORMAT (FLASH/EEPROM)\r
+;      eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm INTERNAL FORMAT (SRAM/REGISTERS)\r
+;      VALUE =+1.mmmmmmm mmmmmmmm mmmmmmmm * 2^eeeeeeee\r
+\r
+;      WHERE:  s = SIGN BIT (OVERLAYING THE IMPLICIT 1 IN INTERNAL FORMAT)\r
+;              e = EXPONENT BITS WITH BIAS OF 127\r
+;              m = MANTISSA BITS\r
+\r
+;      NOTE:   IEEE754 FORMAT USED FOR FLASH/EEPROM CONSTANTS & SERIAL I/O\r
+;              INTERNAL FORMAT USED FOR SRAM ARGUMENTS & FA, FB\r
+;              FLDF & FLDE MACROS CONVERT FROM IEEE754 TO INTERNAL FORMAT\r
+\r
+;      MANTISSA:       $000000 TO $FFFFFF      REPRESENTING 1 =< MANTISSA < 2\r
+;      EXPONENT:       $00 TO $FF              REPRESENTING 2^-126 TO 2^128\r
+;                      $7F                     REPRESENTING 2^0\r
+\r
+;      NOTATION:       F0, F1, F2, F3          FP ARGUMENTS IN SRAM\r
+;                      FA3 FA2 FA1 FA0         FP REGISTER A (PRINCIPAL)\r
+;                      FB3 FB2 FB1 FB0         FP REGISTER B (ARGUMENT)\r
+;                          FC2 FC1 FC0         FP REGISTER C (AUXILIARY)\r
+\r
+;      IN GENERAL:     X IS USED TO INDEX FA, FB, ETC (FP REGISTERS)\r
+;                      Y IS USED TO INDEX F0, F1, ETC (FP SRAM ARGUMENTS)\r
+;                      Z IS USED TO INDEX K0, K1, ETC (FP FLASH/EEPROM CONSTANTS)\r
+\r
+;      REGISTER USAGE: GENERAL PURPOSE REGISTERS A,B,D\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      MISCELLANEOUS SUBROUTINES\r
+\r
+.EQU   BIAS    =$7F                    ; EXPONENT BIAS = 127\r
+\r
+LDS_FA:\r
+       CLR     YH\r
+       LD      FA0,Y+                  ; LOAD FA FROM SRAM ARGUMENT\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+       LD      FA3,Y+\r
+       RET\r
+\r
+LDS_FB:\r
+       CLR     YH\r
+       LD      FB0,Y+                  ; LOAD FB FROM SRAM ARGUMENT\r
+       LD      FB1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FB2,Y+\r
+       LD      FB3,Y+\r
+       RET\r
+\r
+LDF_FA:        LDI     XL,FA                   ; LOAD FA FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FA:        ROL     FA2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FA3\r
+       ROR     FA2\r
+       RET\r
+\r
+LDF_FB:        LDI     XL,FB                   ; LOAD FB FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FB:        ROL     FB2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FB3\r
+       ROR     FB2\r
+       RET\r
+\r
+LDF:   LDI     A,4                     ; LOAD FP REGISTER INDEXED BY XL\r
+LDF0:  LPM                             ; FROM FLASH CONSTANT\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDF0\r
+       RET\r
+\r
+LDE_FB:        LDI     XL,FB                   ; LOAD FB FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FB                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE_FA:        LDI     XL,FA                   ; LOAD FA FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FA                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE:   LDI     A,4\r
+LDE0:\r
+;      RCALL   LDE1                    ; 17MAY01 WAIT FOR WRITE IN PROGRESS\r
+       CLR     ZH\r
+       OUT     EEARH,ZH                ; SET UP ADDRESS\r
+       OUT     EEARL,ZL\r
+       SBI     EECR,EERE               ; ASSERT READ STROBE\r
+       IN      R0,EEDR\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDE0\r
+       RET\r
+\r
+;LDE1: SBIS    EECR,EEWE               ; 17MAY01 IF WRITE IN PROGRESS\r
+;      RET\r
+;      RJMP    LDE1                    ; THEN WAIT\r
+\r
+STS_FA:\r
+       CLR     YH\r
+       ST      Y+,FA0                  ; STORE FA REGISTER TO SRAM ARGUMENT\r
+       ST      Y+,FA1                  ; Y POINTS TO DESTINATION\r
+       ST      Y+,FA2\r
+       ST      Y+,FA3\r
+       RET\r
+\r
+COM_FA:        COM     FA2                     ; ONES COMPLEMENT FA\r
+       COM     FA1\r
+       COM     FA0\r
+       RET\r
+\r
+ROR_FA:        ROR     FA2                     ; ROTATE RIGHT FA,1\r
+       ROR     FA1\r
+       ROR     FA0\r
+       RET\r
+\r
+LSL_FA:        LSL     FA0                     ; SHIFT LEFT FA,1\r
+       ROL     FA1\r
+       ROL     FA2\r
+       RET\r
+\r
+SUB_FB:        SUB     FA0,FB0                 ; FA=FA-FB\r
+       SBC     FA1,FB1\r
+       SBC     FA2,FB2\r
+       RET\r
+\r
+ADD_FB:        ADD     FA0,FB0                 ; FA=FA+FB\r
+       ADC     FA1,FB1\r
+       ADC     FA2,FB2\r
+       RET\r
+\r
+SGN_FA:        BST     FA2,7                   ; SAVE SIGN BIT\r
+       LDI     B,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,B\r
+       RET\r
+\r
+SGNS:  MOV     A,FB2                   ; COMPUTE SIGN OF RESULT\r
+       EOR     A,FA2\r
+       BST     A,7                     ; SAVE FOR LATER\r
+       LDI     A,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,A\r
+       OR      FB2,A\r
+       LDI     A,BIAS                  ; SUBTRACT BIAS\r
+       SUB     FA3,A\r
+       SUB     FB3,A\r
+       RET\r
+\r
+FIX_FA:        LDI     A,23+BIAS               ; TRUNCATE FA AND RETURN INTEGER PART\r
+       SUB     A,FA3\r
+       BRCS    FIX0                    ; IF EXPONENT>=24 THEN RETURN\r
+       CPI     A,24                    ; IF EXPONENT<0\r
+       BRCC    GO_MIN_FA               ; THEN FA=0\r
+       RCALL   SGN_FA                  ; SAVE SIGN & INSERT IMPLICIT BIT\r
+FIX2:  LSR     FA2                     ; SHIFT MANTISSA RIGHT\r
+       ROR     FA1\r
+       ROR     FA0\r
+       DEC     A                       ; (24-EXPONENT) BITS\r
+       BRNE    FIX2\r
+FIX0:  RET\r
+\r
+GO_MIN_FA:\r
+       RJMP    MIN_FA\r
+\r
+; REMOVED TO SAVE FLASH %\r
+;CHSS: LDD     B,Y+2                   ; CHANGE SIGN OF SRAM ARGUMENT\r
+;      LDI     A,$80\r
+;      EOR     B,A                     ; TOGGLE SIGN BIT\r
+;      STD     Y+2,B                   ; AND SAVE\r
+;      RET\r
+; %\r
+\r
+LDS2_FA:\r
+       CLR     YH\r
+       LD      FA0,Y+                  ; LOAD FA WITH 2 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       CLR     FA2\r
+       RJMP    LD3_FA\r
+LDS3_FA:\r
+       CLR     YH\r
+       LD      FA0,Y+                  ; LOAD FA WITH 3 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+LD3_FA:        CLT                             ; SET SIGN POSITIVE\r
+LD3:   LDI     A,23+BIAS               ; SET EXPONENT AND FALL INTO NORMALIZE\r
+       MOV     FA3,A\r
+\r
+NRM_FA:        MOV     A,FA0                   ; NORMALIZE FA REGISTER\r
+       OR      A,FA1\r
+       OR      A,FA2\r
+       BREQ    NRM3                    ; IF ZERO THEN CLEAR EXPONENT & EXIT\r
+NRM0:  TST     FA2\r
+NRM1:  BRMI    NRM2                    ; IF MANTISSA DENORMALIZED\r
+       DEC     FA3                     ; THEN ADJUST EXPONENT\r
+       BREQ    MIN_FA                  ;      IF UNDERFLOW THEN RETURN MIN\r
+       RCALL   LSL_FA                  ;      ELSE SHIFT MANTISSA LEFT\r
+       RJMP    NRM1\r
+NRM2:  BLD     FA2,7                   ; ELSE OVERLAY WITH SIGN BIT\r
+       RET\r
+NRM3:  CLR     FA3\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+ADD_FA:        RCALL   LDS_FB                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+ADD0:  TST     FB3                     ; IF FB=0\r
+       BREQ    RET0                    ; THEN DO NOTHING\r
+       TST     FA3                     ; IF FA=0\r
+       BREQ    SWP_FA                  ; THEN SWAP FA,FB AND EXIT\r
+       MOV     D,FB2                   ; GET SIGN OF ARGUMENT\r
+       EOR     D,FA2                   ; BIT 7 SET IF SIGNS DIFFERENT\r
+       MOV     A,FA3\r
+       SUB     A,FB3                   ; IF FA EXPONENT < ARG EXPONENT\r
+       BRCC    ADD1\r
+       NEG     A                       ; THEN (EXP DIFF)=-(EXP DIFF)\r
+       RCALL   SWP_FA                  ;      SWAP FA,FB\r
+ADD1:  CPI     A,24                    ; IF EXP DIFFERENCE >= 24\r
+       BRCC    RET0                    ; THEN DO NOTHING\r
+       RCALL   SGN_FA                  ; ELSE SAVE SIGN & INSERT IMPLICIT BIT\r
+       OR      FB2,B                   ;      INSERT IMPLICIT BIT IN FB ALSO\r
+       TST     A\r
+ADD2:  BREQ    ADD3\r
+       LSR     FB2                     ;      SHIFT FB RIGHT TO ALIGN\r
+       ROR     FB1\r
+       ROR     FB0\r
+       DEC     A\r
+       RJMP    ADD2\r
+ADD3:  TST     D                       ; IF SIGNS SAME\r
+       BRMI    ADD5\r
+       RCALL   ADD_FB                  ; THEN FA=FA+FB\r
+       BRCC    ADD4                    ;      IF CARRY\r
+       RCALL   ROR_FA                  ;      THEN RIGHT SHIFT\r
+       INC     FA3                     ;           INC EXPONENT\r
+       BREQ    MAX_FA                  ;           IF OVERFLOW RETURN MAX\r
+ADD4:  BLD     FA2,7                   ;           ELSE OVERLAY WITH SIGN BIT\r
+RET0:  RET\r
+ADD5:  RCALL   SUB_FB                  ; ELSE FA=FA-FB\r
+       BREQ    NRM3                    ;      IF ZERO THEN CLEAR EXP & EXIT\r
+       BRCC    NRM0                    ;      IF CARRY\r
+       RCALL   COM_FA                  ;      THEN FA=-FA\r
+       LDI     A,-1\r
+       SUB     FA0,A\r
+       SBC     FA1,A\r
+       SBC     FA2,A\r
+       BLD     A,7                     ;      TOGGLE SIGN BIT\r
+       COM     A\r
+       BST     A,7\r
+       RJMP    NRM0                    ;      NORMALIZE\r
+\r
+ADDE_FA:RCALL  LDE_FB                  ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+ADDF_FA:RCALL  LDF_FB                  ; ADD FLASH CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+SUB_FA:        RCALL   LDS_FB                  ; SUBTRACT SRAM ARGUMENT FROM FA REG\r
+SUB0:  LDI     A,$80\r
+       EOR     FB2,A                   ; TOGGLE SIGN\r
+       RJMP    ADD0\r
+\r
+SUBE_FA:RCALL  LDE_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+SUBF_FA:RCALL  LDF_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+; VARIOUS SUBROUTINES\r
+\r
+MIN_FA:        CLR     FA3                     ; FA=0\r
+CLR_FA:        CLR     FA2                     ; CLEAR FA\r
+       CLR     FA1\r
+       CLR     FA0\r
+       RET\r
+\r
+SWP_FA:        RCALL   SWP0                    ; SWAP CONTENTS OF FA & FB\r
+       RCALL   SWP1\r
+SWP0:  EOR     FA0,FB0\r
+       EOR     FA1,FB1\r
+       EOR     FA2,FB2\r
+       EOR     FA3,FB3\r
+       RET\r
+SWP1:  EOR     FB0,FA0\r
+       EOR     FB1,FA1\r
+       EOR     FB2,FA2\r
+       EOR     FB3,FA3\r
+       RET\r
+\r
+OUTRNG:        BRPL    MIN_FA                  ; UNDERFLOW\r
+;      RJMP    MAX_FA                  ; OVERFLOW\r
+\r
+;      UNDERFLOW BY A LITTLE:    $80 + $FF =   $7F     POSITIVE\r
+;                               -128 -   1 =  -129\r
+;      UNDERFLOW BY A LOT:       $80 + $80 =   $00     POSITIVE\r
+;                               -128 - 128 =  -256\r
+;      OVERFLOW BY A LITTLE:     $7F + $0F =   $80     NEGATIVE\r
+;                                127 +   1 =   128\r
+;      OVERFLOW BY A LOT:        $7F + $7F =   $FE     NEGATIVE\r
+;                                127 + 127 =   254\r
+\r
+MAX_FA:        CLR     FA3                     ; FA=MAX\r
+       COM     FA3\r
+       MOV     FA2,FA3\r
+       MOV     FA1,FA3\r
+       MOV     FA0,FA3\r
+       BLD     FA2,7                   ; SET SIGN\r
+       RET\r
+\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+MUL_FA:        RCALL   LDS_FB                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+MUL0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MIN_FA                  ; THEN FA=0\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT & REMOVE BIAS\r
+       ADD     FA3,FB3                 ; ADD EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; ELSE RESTORE BIAS\r
+       MOV     FC0,FA0                 ; FC=FA\r
+       MOV     FC1,FA1\r
+       MOV     FC2,FA2\r
+       RCALL   CLR_FA                  ; FA=0\r
+       CLC\r
+       LDI     A,24                    ; LOOP COUNTER\r
+MUL1:  RCALL   ROR_FA                  ; RIGHT SHIFT\r
+       LSR     FC2\r
+       ROR     FC1\r
+       ROR     FC0\r
+       BRCC    MUL2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+MUL2:  DEC     A\r
+       BRNE    MUL1\r
+       BRCC    MUL3                    ; IF CARRY\r
+       RCALL   ROR_FA                  ; THEN NORMALIZE BY 1 BIT\r
+       INC     FA3                     ;      ADJUST EXPONENT\r
+       BREQ    MAX_FA                  ;      IF OVERFLOW RETURN MAX\r
+MUL3:  BLD     FA2,7                   ; ELSE RESTORE SIGN\r
+RET1:  RET\r
+\r
+MULE_FA:RCALL  LDE_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+MULF_FA:RCALL  LDF_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+DIV_FA:        RCALL   LDS_FB                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+DIV0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       BST     FA2,7                   ; GET SIGN OF FA\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MAX_FA                  ; THEN RETURN MAX\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT\r
+       SUB     FA3,FB3                 ; SUBTRACT EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; RESTORE BIAS\r
+       LSR     FA2                     ; DENORMALIZE SO THAT CARRY IS NOT LOST\r
+       ROR     FA1                     ; DURING SUBTRACTION AND SUBSEQUENT ADD\r
+       ROR     FA0\r
+       LSR     FB2\r
+       ROR     FB1\r
+       ROR     FB0\r
+       LDI     A,24                    ; LOOP COUNTER\r
+DIV1:  RCALL   SUB_FB                  ; FA=FA-FB\r
+       BRCC    DIV2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+DIV2:  ROL     FC0                     ; SHIFT CARRY INTO LSB\r
+       ROL     FC1\r
+       ROL     FC2\r
+       RCALL   LSL_FA\r
+       DEC     A\r
+       BRNE    DIV1\r
+       MOV     FA0,FC0                 ; FA=FC\r
+       MOV     FA1,FC1\r
+       MOV     FA2,FC2\r
+       RCALL   COM_FA                  ; SINCE CARRY WAS WRONG SENSE\r
+       RJMP    NRM0                    ; NORMALIZE & RESTORE SIGN\r
+\r
+DIVE_FA:RCALL  LDE_FB                  ; DIVIDE FA REGISTER BY EEPROM CONSTANT\r
+       RJMP    DIV0\r
+\r
+DIVF_FA:RCALL  LDF_FB                  ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       RJMP    DIV0\r
+\r
+CP_FA: RCALL   LDS_FB                  ; COMPARE FA WITH SRAM ARGUMENT\r
+CP0:   MOV     A,FA3                   ; FIRST CHECK FOR SPECIAL ZERO CASE\r
+       OR      A,FB3\r
+       BREQ    CP6                     ; FA=0, FB=0\r
+       MOV     A,FA2                   ; NOW, IF SIGNS DIFFERENT\r
+       EOR     A,FB2\r
+       BRMI    CP3                     ; THEN ANSWER DETERMINED BY THE SIGNS\r
+       BST     FA2,7                   ; ELSE SAVE SIGN FOR LATER\r
+       SUB     FB3,FA3                 ; TEST EXPONENT WITHOUT CORRUPTING FA\r
+       BRCS    CP2                     ; IF EXP FA > EXP FB\r
+       BRNE    CP1                     ; IF EXP FA < EXP FB\r
+       SUB     FB0,FA0                 ; IF EXPS EQUAL, MUST TEST MANTISSA\r
+       SBC     FB1,FA1\r
+       SBC     FB2,FA2\r
+       BRCS    CP2\r
+       BREQ    CP6\r
+CP1:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP4                     ; THEN CLEAR CARRY\r
+       RJMP    CP5                     ; ELSE SET CARRY\r
+CP2:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP5                     ; THEN SET CARRY\r
+       RJMP    CP4                     ; ELSE CLEAR CARRY\r
+CP3:   TST     FA2                     ; CHECK SIGN\r
+       BRMI    CP5\r
+CP4:   CLC                             ; FA > FB\r
+       CLZ\r
+       RET\r
+CP5:   SEC                             ; FA < FB\r
+       CLZ\r
+CP6:   RET                             ; FA = FB\r
+\r
+CPF_FA:        RCALL   LDF_FB                  ; COMPARE FA WITH FLASH CONSTANT\r
+       RJMP    CP0\r
+\r
+CPE_FA:        RCALL   LDE_FB                  ; COMPARE FA WITH EEPROM CONSTANT\r
+       RJMP    CP0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+SNDSTR:        ADIW    ZL,2                    ; OUTPUT STRING FROM FLASH\r
+STR0:  RCALL   STR1                    ; RETRIEVE MESSAGE\r
+       BRNE    STR0\r
+       RET\r
+STR1:  LPM                             ; GET NEXT CHARACTER\r
+       MOV     A,R0\r
+       RCALL   TX_WAIT\r
+       ADIW    ZL,1\r
+       DEC     D\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SNDASC:\r
+;      RCALL   EXP0                    ; SEND IN ASCII FORMAT\r
+;      INC     F                       ; DIGITS TO LEFT OF DECIMAL POINT\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;ASC0: DEC     F\r
+;      BREQ    EXP11\r
+;      RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    ASC0\r
+\r
+; CHARACTERIZE ONLY %\r
+SNDEXP:\r
+       PUSH    A                       ; SEPARATOR\r
+       FMLF    K30M                    ; CONVERT TO HERTZ\r
+       RCALL   EXP0                    ; SEND EXPONENTIAL FORMAT +N.NNNNNNE+^^\r
+EXP5:  FCPF    KR0001                  ; IF N<.0001\r
+       BRCC    EXP6\r
+       FMLF    K100K                   ; THEN N=N*100K\r
+       SUBI    F,5                     ;      E=E-5\r
+       RJMP    EXP5\r
+EXP6:  FCPF    K1                      ; IF N<1\r
+       BRCC    EXP7\r
+       FMLF    K10                     ; THEN N=N*10\r
+       SUBI    F,1                     ;      E=E-1\r
+       RJMP    EXP6\r
+EXP7:  FADF    TLT1                    ; BY MEREST COINCIDENCE CLOSE TO 5.0E-7\r
+       RCALL   EXP3                    ; IN CASE WE JUMPED UP TO 10.000000\r
+       RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+       LDI     A,'.'\r
+       RCALL   TX_WAIT\r
+       LDI     E,6                     ; 7 SIGNIFICANT DIGITS IN ALL\r
+EXP8:  RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+       DEC     E\r
+       BRNE    EXP8\r
+       LDI     A,'0'                   ; 2 TRAILING ZEROS FOR COMPATIBILITY\r
+       RCALL   TX_WAIT                 ; WITH PREVIOUS CHARACTERIZE VERSION\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'E'                   ; NOW FOR THE EXPONENT\r
+       RCALL   TX_WAIT\r
+       LDI     A,'+'                   ; SEND SIGN\r
+       TST     F\r
+       BRPL    EXP9\r
+       LDI     A,'-'\r
+       NEG     F                       ; ABS(E)\r
+EXP9:  RCALL   TX_WAIT\r
+       LDI     A,'0'-1                 ; CONVERT MS DIGIT TO ASCII\r
+EXP10: INC     A\r
+       SUBI    F,10\r
+       BRPL    EXP10\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'+10                ; NOW LS DIGIT\r
+       ADD     A,F\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   TX_WAIT                 ; SEPARATOR\r
+EXP11: FLD     F0                      ; AND RESTORE FA\r
+       RET\r
+\r
+EXP0:  FST     F0                      ; ADJUST EXPONENT FOR ABS(N)>1\r
+       LDI     A,' '                   ; SEND SIGN (SPACE FOR +)\r
+       TST     FA2\r
+       BRPL    EXP1\r
+       LDI     A,'-'\r
+EXP1:  RCALL   TX_WAIT\r
+; %\r
+\r
+DIGN:  LDI     A,$7F\r
+       AND     FA2,A                   ; ABS(N)\r
+       CLR     F                       ; HOLDS ADJUSTED EXPONENT FOR 1<N<10\r
+EXP2:  FCPE    K10K ;FCPF K10K         ; IF N>10K\r
+       BRCS    EXP3\r
+       FMLF    KR0001                  ; THEN N=N/10K\r
+       ADDI    F,4                     ;      E=E+4\r
+       RJMP    EXP2\r
+EXP3:  FCPF    K10                     ; IF N>10\r
+       BRCS    EXP4\r
+       FMLF    KR1                     ; THEN N=N/10\r
+       SUBI    F,-1                    ;      E=E+1\r
+       RJMP    EXP3\r
+EXP4:  RET\r
+\r
+DGTN:  FSB     F1                      ; N=(N-I)*10\r
+       FMLF    K10                     ; REALLY N=(I-N)*10, SIGN UNIMPORTANT\r
+; FMLF K_1 ; LET'S BE SAFE KILLED 17MAY01\r
+DGT0:  FST     F1                      ; N (ADJUSTED)\r
+       RCALL   FIX_FA                  ; I=INT(N)\r
+       MOV     B,FA0                   ; SAVE LS DIGIT\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       LDI     A,'0'\r
+       ADD     A,B                     ; A = LS DIGIT IN ASCII\r
+       RJMP    TX_WAIT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+LDS_A_STATUS:\r
+       LDS     A,STATUS\r
+       RET\r
+\r
+SET_TRYZRO:\r
+       LDS     A,STATUS                ; THEN SET ZERO\r
+       SBR     A,1<<TRYZRO\r
+STS_STATUS_A:\r
+       STS     STATUS,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;\r
+;TOG_B4:\r
+;      RET\r
+;      SBIS    PORTB,4\r
+;      RJMP    TOG0\r
+;      CBI     PORTB,4                 ; FOR TESTING ONLY\r
+;      RET\r
+;TOG0: SBI     PORTB,4                 ; FOR TESTING ONLY\r
+\r
+\r
+; FOR LOCKUP TEST\r
+;      POP     G                       ; HIGH BYTE\r
+;      POP     H                       ; LOW BYTE\r
+;      PUSH    H\r
+;      PUSH    G\r
+\r
+;      LDI     H,'2'\r
+;      OUT     UDR,H\r
+;      LDI     G,'1'\r
+;      OUT     UDR,G\r
+\r
+;      MOV     G,H\r
+\r
+;      MOV     I,G\r
+;      SWAP    G\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL0\r
+;      SUBI    G,-$07\r
+;NIBLL0:       OUT     UDR,G\r
+;      MOV     G,I\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL1\r
+;      SUBI    G,-$07\r
+;NIBLL1:       OUT     UDR,G\r
+\r
+;      RET\r
+\r
+;      LDS     A,TEST_BUF              ; TESTING ONLY\r
+;      RCALL   CONV_TO_HEX\r
+\r
+;STACK_TEST:\r
+;      LDI     XL,RAMEND+1             ; STACK TEST\r
+;TST1:\r
+;      LD      A,-X\r
+;      RCALL   CONV_TO_HEX\r
+;      RCALL   SND_BUF\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   SND_BUF\r
+;      CPI     XL,$C8\r
+;      BRNE    TST1\r
+\r
+;STACK_TST:\r
+;      LDI     A,$55\r
+;      LDI     B,50\r
+;      LDI     YL,RAMEND-2\r
+;TST0: ST      -Y,A\r
+;      DEC     B\r
+;      BRNE    TST0\r
+\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; ATmega8:\r
+       ; BODEN  =    0 ENABLED\r
+       ; BODLVL =    1 FOR 2.7V\r
+       ; CLKOPT =    0 HIGH SPEED XTAL\r
+       ; SUT    =   01\r
+       ; CLSEL  = 1111\r
+       ; BLB    = 0000 DISABLE BOOT LOADER\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4101                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACA8                   ; WRITE FUSE HIGH BITS COMMAND\r
+       .DW     $00C1\r
+       .DW     $ACA0                   ; WRITE FUSE LOW BITS COMMAND\r
+       .DW     $009F\r
+       .DW     $ACE0                   ; WRITE LOCK BITS COMMAND\r
+       .DW     $0003\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/chklin.asm b/src/avr/chklin.asm
new file mode 100644 (file)
index 0000000..477a1f4
--- /dev/null
@@ -0,0 +1,85 @@
+; CHKLIN.ASM\r
+\r
+CODE   SEGMENT\r
+\r
+       ASSUME  CS:CODE,DS:CODE\r
+\r
+B      EQU     BYTE PTR\r
+W      EQU     WORD PTR\r
+D      EQU     DWORD PTR\r
+\r
+       LOCALS\r
+\r
+MISC_ADDR      EQU     3C2H\r
+SEQU_ADDR      EQU     3C4H\r
+GC_ADDR                EQU     3CEH\r
+CRTC_ADDR      EQU     3D4H\r
+\r
+;      FLAG%=100\r
+;      CALL CHKLIN(FLAG%)      ' RETURNS FLAG%=-1 IF LINE 100 HAS COLOURS<>0FH\r
+\r
+PUBLIC CHKLIN\r
+\r
+CHKLIN:        PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+       PUSH    DS\r
+       PUSH    ES\r
+       PUSHF\r
+\r
+       LDS     SI,[BP+6]               ; DS:SI -> FLAG%\r
+       SUB     AX,AX\r
+       XCHG    AX,[SI]                 ; AX = FLAG%, FLAG% = 0\r
+       MOV     DX,640/8\r
+       MUL     DX\r
+       XCHG    DI,AX\r
+       MOV     AX,0A000H\r
+       MOV     ES,AX                   ; ES:DI -> SCREEN LINE\r
+\r
+       MOV     DX,GC_ADDR\r
+       MOV     AL,2\r
+       CALL    READ_REG\r
+       PUSH    AX\r
+       MOV     AH,0FH\r
+       OUT     DX,AX                   ; SET UP COLOUR COMPARE WITH 0FH\r
+       MOV     AL,5\r
+       CALL    READ_REG\r
+       PUSH    AX\r
+       OR      AH,8\r
+       OUT     DX,AX                   ; SET UP COLOUR COMPARE MODE\r
+\r
+       MOV     AL,0FFH                 ; CHECK FOR BLANK (WHITE 0FH -> TRUE)\r
+       MOV     CX,80\r
+       REPZ    SCASB                   ; MUST HAVE A LINE'S WORTH\r
+       JZ      GOT_FLAG\r
+\r
+       DEC     W [SI]                  ; FLAG%=-1\r
+       JMP     GOT_FLAG\r
+\r
+READ_REG:\r
+       OUT     DX,AL\r
+       INC     DX\r
+       XCHG    AL,AH\r
+       IN      AL,DX\r
+       XCHG    AL,AH\r
+       DEC     DX\r
+       RET\r
+\r
+GOT_FLAG:\r
+       POP     AX\r
+       OUT     DX,AX                   ; RESTORE GC MODE REG\r
+       POP     AX\r
+       OUT     DX,AX                   ; RESTORE COLOUR COMPARE REG\r
+\r
+       POPF\r
+       POP     ES\r
+       POP     DS\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    4\r
+\r
+CODE   ENDS\r
+       END\r
+\1a
\ No newline at end of file
diff --git a/src/avr/chset00.inc b/src/avr/chset00.inc
new file mode 100644 (file)
index 0000000..d584841
--- /dev/null
@@ -0,0 +1,58 @@
+; chset00.inc generated from chset00.win, do not edit!\r
+\r
+       .db     $46,$32,$34,$44,$30,$33,$31,$39,$30,$33,$31,$32,$31,$37,$30,$39\r
+       .db     $4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $00,$01,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$03,$01,$4c,$03,$4c,$03\r
+       .db     $06,$01,$0f,$01,$18,$01,$21,$01,$2a,$01,$33,$01,$3c,$01,$45,$01\r
+       .db     $4e,$01,$57,$01,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $4c,$03,$60,$01,$69,$01,$72,$01,$7b,$01,$84,$01,$8d,$01,$96,$01\r
+       .db     $9f,$01,$a9,$01,$b2,$01,$bb,$01,$c4,$01,$cd,$01,$d6,$01,$df,$01\r
+       .db     $e8,$01,$f1,$01,$08,$02,$11,$02,$1a,$02,$23,$02,$2c,$02,$35,$02\r
+       .db     $3e,$02,$47,$02,$50,$02,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $4c,$03,$59,$02,$62,$02,$6b,$02,$74,$02,$7d,$02,$86,$02,$8f,$02\r
+       .db     $99,$02,$a3,$02,$ad,$02,$b8,$02,$c2,$02,$cb,$02,$d4,$02,$dd,$02\r
+       .db     $e6,$02,$f0,$02,$fc,$02,$03,$03,$0c,$03,$15,$03,$1e,$03,$27,$03\r
+       .db     $30,$03,$39,$03,$43,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $00,$03,$06,$61,$01,$f8,$01,$07,$70,$88,$98,$a8,$c8,$88,$70,$01\r
+       .db     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .db     $f8,$01,$07,$f8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .db     $f8,$10,$10,$01,$07,$f8,$80,$f0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .db     $80,$f0,$88,$88,$70,$01,$07,$f8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .db     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .db     $01,$07,$70,$88,$88,$88,$f8,$88,$88,$01,$07,$f0,$88,$88,$f0,$88\r
+       .db     $88,$f0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$e0,$90,$88\r
+       .db     $88,$88,$90,$e0,$01,$07,$f8,$80,$80,$f0,$80,$80,$f8,$01,$07,$f8\r
+       .db     $80,$80,$f0,$80,$80,$80,$01,$07,$70,$88,$80,$b8,$88,$88,$78,$01\r
+       .db     $07,$88,$88,$88,$f8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .db     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$a0\r
+       .db     $c0,$a0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$f8,$01,$07,$88\r
+       .db     $d8,$a8,$a8,$88,$88,$88,$01,$07,$88,$88,$c8,$a8,$98,$88,$88,$01\r
+       .db     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$f0,$88,$88,$f0,$80,$80\r
+       .db     $80,$01,$07,$70,$88,$88,$88,$a8,$90,$68,$4c,$03,$4c,$03,$4c,$03\r
+       .db     $06,$08,$01,$01,$4f,$00,$65,$03,$01,$07,$f0,$88,$88,$f0,$a0,$90\r
+       .db     $88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$f8,$20,$20,$20\r
+       .db     $20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07,$88,$88\r
+       .db     $88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$a8,$a8,$a8,$50,$01,$07\r
+       .db     $88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20,$20,$20\r
+       .db     $01,$07,$f8,$08,$10,$20,$40,$80,$f8,$01,$07,$00,$00,$70,$08,$78\r
+       .db     $88,$78,$01,$07,$80,$80,$f0,$88,$88,$88,$f0,$01,$07,$00,$00,$78\r
+       .db     $80,$80,$80,$78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00\r
+       .db     $00,$70,$88,$f8,$80,$70,$01,$07,$18,$20,$f8,$20,$20,$20,$20,$01\r
+       .db     $08,$00,$00,$78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$b0,$c8,$88\r
+       .db     $88,$88,$02,$21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10\r
+       .db     $00,$10,$10,$10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$a0,$c0,$a0\r
+       .db     $90,$03,$21,$07,$c0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$f0\r
+       .db     $a8,$a8,$a8,$a8,$01,$07,$00,$00,$b0,$c8,$88,$88,$88,$01,$07,$00\r
+       .db     $00,$70,$88,$88,$88,$70,$01,$08,$00,$00,$f0,$88,$88,$f0,$80,$80\r
+       .db     $01,$08,$00,$00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$b0,$c0\r
+       .db     $80,$80,$80,$01,$07,$00,$00,$78,$80,$70,$08,$f0,$01,$07,$20,$20\r
+       .db     $f8,$20,$20,$20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07\r
+       .db     $00,$00,$88,$88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$a8,$a8,$50\r
+       .db     $01,$07,$00,$00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88\r
+       .db     $78,$08,$70,$01,$07,$00,$00,$f8,$10,$20,$40,$f8,$01,$07,$f8,$f8\r
+       .db     $f8,$f8,$f8,$f8,$f8,$00\r
+\r
diff --git a/src/avr/chtest.asm b/src/avr/chtest.asm
new file mode 100644 (file)
index 0000000..c47cfde
--- /dev/null
@@ -0,0 +1,2411 @@
+;      CHTEST.ASM\r
+;      CHARACTERIZE MODE\r
+\r
+.INCLUDE "4433DEF.INC" ; FOR AVR ASSEMBLER\r
+;.INCLUDE "4433DEFX.INC" ; FOR NICK ASSEMBLER\r
+.INCLUDE "MACLC.INC"\r
+;.INCLUDE "APILC.INC"\r
+.INCLUDE "TERLC.INC"\r
+\r
+; WE SHOULD CHANGE THE CODE TO USE UCSRA AND UCSRB\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   CR              =$0D\r
+.EQU   LF              =$0A\r
+.EQU   RX_SIZE         =1\r
+.EQU   TX_SIZE         =8              ; LEAVES 10 BYTES FREE\r
+.EQU   API_ADDRESS     =$01            ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   CYC_MAX         =256            ; MAXIMUM WEIGHING CYCLE TIME\r
+.EQU   CYC_MIN         =160            ; MINIMUM WEIGHING CYCLE TIME > 6\r
+                                       ; < 210 ELSE OVERFLOW FOR FREQ < 27KHZ\r
+\r
+.EQU   CYC_ZERO        =16             ; INITIAL ZEROING COUNT\r
+.EQU   CYC_START       =32             ; INITIAL SMOOTHING COUNT\r
+\r
+                                       ; BITS IN RANGE\r
+.EQU   RNG             =$0F            ; RANGE BITS 0-3\r
+.EQU   RND             =6              ; ROUND UP (FOR HYSTERESIS)\r
+.EQU   SGN             =7              ; SIGN (FOR HYSTERESIS)\r
+                                       ; SGN MUST BE BIT 7 FOR EOR INSTRUCTION\r
+\r
+                                       ; BITS IN STATUS\r
+.EQU   OUCHFLG         =0              ; OVERLOAD\r
+.EQU   LOWFLG          =1              ; UNDERLOAD\r
+.EQU   UNSTBL          =2              ; UNSTABLE\r
+.EQU   VSTBL           =3              ; VERY STABLE\r
+.EQU   ZROFLG          =4              ; DISPLAY SHOWS ZERO\r
+.EQU   TRYZRO          =5              ; TRYING TO SET ZERO\r
+.EQU   SEND_SN         =6              ; TRYING TO SEND S/N MESSAGE\r
+.EQU   SEND_SPAN       =7              ; TRYING TO SEND SPAN MESSAGE\r
+\r
+                                       ; BITS IN FLAGS\r
+.EQU   SNDDAT          =0              ; SEND CHARACTERIZE DATA\r
+.EQU   ESC             =1              ; SET AFTER RECEIVING ESC\r
+.EQU   ESCM            =2              ; SET AFTER RECEIVING ESC M\r
+.EQU   BOMB            =3              ; SET DURING TILT MEASUREMENT\r
+.EQU   NEWDAT          =4              ; NEW SCALE DATA AVAILABLE\r
+.EQU   DIR             =5              ; DIRECTION OF CHANGE IN WGT\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+                                       ; BITS IN MODE\r
+.EQU   ABSGMS_FLG      =0              ; ABSOLUTE WEIGHT IN FP FORMAT\r
+.EQU   ZROGMS_FLG      =1              ; ZERO REGISTER IN FP FORMAT\r
+.EQU   TMPDEG_FLG      =2              ; TEMPERATURE (DEGREES) IN FP FORMAT\r
+.EQU   TLTBUB_FLG      =3              ; TILT BUBBLE POSITION IN INT FORMAT\r
+.EQU   WGTFRQ_FLG      =4              ; WEIGHT FREQUENCY IN FP FORMAT\r
+.EQU   TMPFRQ_FLG      =5              ; TEMPERATURE FREQUENCY IN FP FORMAT\r
+.EQU   TLRFRQ_FLG      =6              ; TILT LEFT/RIGHT IN FP FORMAT\r
+.EQU   TFBFRQ_FLG      =7              ; TILT FRONT/BACK IN FP FORMAT\r
+\r
+.DEF   FC0             =R0             ; AUXILLIARY FP ACCUMULATOR\r
+.DEF   FC1             =R1\r
+.DEF   FC2             =R2\r
+\r
+.EQU   FB              =$03\r
+.DEF   FB0             =R3             ; ARGUMENT FP ACCUMULATOR\r
+.DEF   FB1             =R4\r
+.DEF   FB2             =R5\r
+.DEF   FB3             =R6\r
+\r
+.EQU   FA              =$07\r
+.DEF   FA0             =R7             ; PRINCIPAL FP ACCUMULATOR\r
+.DEF   FA1             =R8\r
+.DEF   FA2             =R9\r
+.DEF   FA3             =R10\r
+\r
+.DEF   CYC_0           =R11\r
+.DEF   CYC_1           =R12\r
+\r
+.DEF   WT_0            =R13            ; RUNNING COUNT FOR 16 WEIGHT CYCLES\r
+.DEF   WT_1            =R14            ; TIMER1 INPUT CAPTURE LOW\r
+.DEF   WT_2            =R15            ; TIMER1 INPUT CAPTURE HIGH\r
+\r
+.DEF    A              =R17            ; GLOBAL REGISTERS\r
+.DEF    B              =R18\r
+.DEF   D               =R19\r
+.DEF   E               =R20\r
+.DEF   F               =R21\r
+\r
+.DEF   SR              =R22            ; SECONDARY REGISTER SET\r
+.DEF   G               =R23\r
+.DEF   H               =R24\r
+.DEF   I               =R25\r
+.DEF   J               =R27            ; XH\r
+.DEF   K               =R29            ; YH\r
+\r
+.DEF   FLAGS           =R16            ; MUST BE REGISTER, FOR ATOMIC ACCESS\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+STARTUP:       .BYTE   1               ; SMOOTHING COUNT FOR INITIAL STARTUP\r
+F3:\r
+TLTL_BUF:      .BYTE   2               ; DATA OUTPUT BUFFERS\r
+TLTR_BUF:      .BYTE   2\r
+F4:\r
+TLTF_BUF:      .BYTE   2\r
+TLTB_BUF:      .BYTE   2\r
+WGT:           .BYTE   3               ; ACCUMULATOR FOR 64 GROUPS OF 16\r
+TMP:           .BYTE   3               ; ACCUMULATOR FOR 256 TEMPERATURE\r
+TLTL:          .BYTE   2               ; ACCUMULATOR FOR 64 TILT CYCLES (TLT0)\r
+TLTR:          .BYTE   2\r
+TLTF:          .BYTE   2               ;                                (TLT1)\r
+TLTB:          .BYTE   2\r
+DTMP:          .BYTE   2               ; DIFFERENCE COUNT FOR CURRENT TEMP CYC\r
+WGTLST:                .BYTE   3               ; VALUE OF ADDITION TO WGT ON LAST CYC\r
+TL:            .BYTE   4               ; AVERAGED TLTLR\r
+TF:            .BYTE   4               ; AVERAGED TLTFB\r
+TMPFRQ:                .BYTE   4               ; TEMPERATURE FREQUENCY CYCLES/30MHZ\r
+GMS:           .BYTE   4\r
+LSTGMS:                .BYTE   4\r
+LSTDEV:                .BYTE   4\r
+AVEGMS:                .BYTE   4\r
+AVESTD:                .BYTE   4\r
+INTGMS:                .BYTE   4\r
+COUNT:         .BYTE   4\r
+\r
+F0:            .BYTE   4               ; FLOATING POINT REGISTERS\r
+F1:            .BYTE   4\r
+F2:            .BYTE   4\r
+RANGE:         .BYTE   1\r
+STATUS:                .BYTE   1\r
+MODE:          .BYTE   1\r
+;MODE_CYCLE:   .BYTE   1               ; WEIGHING ONLY\r
+WGTFRQ:                .BYTE   4               ; CHARACTERIZE ONLY\r
+REF_30MHZ:     .BYTE   4               ; CHARACTERIZE ONLY\r
+TMP_PHASE:     .BYTE   1\r
+DSPGMS:                .BYTE   4\r
+ZROGMS:                .BYTE   4\r
+;DSPRES:               .BYTE   4\r
+\r
+API_REMAIN:    .BYTE   1\r
+RX_PTR:                .BYTE   1\r
+RX_COUNT:      .BYTE   1\r
+RX_BUF:                .BYTE   RX_SIZE\r
+TX_PTR:                .BYTE   1\r
+TX_COUNT:      .BYTE   1\r
+TX_BUF:                .BYTE   TX_SIZE         ; CAREFUL - COULD BE CLOBBERED BY STACK\r
+\r
+.ESEG\r
+.ORG   $000\r
+VOID:  .DB     $00,$00                 ; DON'T USE ADDR $000\r
+;EEMODE:       .DB     $00,$00         ; SEND ASCII WEIGHT DATA ONLY\r
+\r
+;SPAN: .DB     $00,$00,$80,$3F         ; 1.0000000E+00 DEFAULT TO 1\r
+SPAN:  .DB     $1B,$BA,$7F,$3F         ; 0.9989335E+00 SPAN FOR JSY/NLD\r
+\r
+CAL3:  .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+CAL2:  .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+CAL1:  .DB     $00,$00,$80,$3F         ; 1.0000000E+00\r
+CAL0:  .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+\r
+RANGES: .DB    $04,$00                 ;  OIML APO30\r
+RANGE1: .DB    $00,$40,$1C,$45         ;  2500\r
+       .DB     $00,$00,$80,$3F         ;     1\r
+       .DB     $00,$40,$9C,$45         ;  5000\r
+       .DB     $00,$00,$A0,$40         ;     5\r
+       .DB     $00,$40,$1C,$46         ; 10000\r
+       .DB     $00,$00,$20,$41         ;    10\r
+RNGMAX: .DB    $00,$D8,$EA,$46         ; 30060\r
+       .DB     $00,$00,$A0,$41         ;    20\r
+\r
+.CSEG\r
+\r
+       .ORG    0\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT0ADDR\r
+       RJMP    TMP_INT                 ; INT0 HANDLER FOR TEMPERATURE MEASUREMENT\r
+\r
+       .ORG    ICP1ADDR\r
+       RJMP    WGT_INT                 ; TIMER1 CAPTURE HANDLER\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+\r
+.INCLUDE  "PRM.INC"                    ; LOAD CELL CHARACTERIZE PARAMETERS\r
+\r
+TLT2:  .DB     $C7,$75,$41,$AF ;-1.759509E-10  TILT LINEARISATION PARAMETERS\r
+TLT1:  .DB     $25,$7E,$0B,$35 ; 5.196510E-07\r
+TLT0:  .DB     $04,$31,$E3,$39 ; 4.333333E-04\r
+\r
+TICKS: .DB     $AE,$11,$8D,$45 ; 4.514210E+03 = 4096*33.06306M/30M\r
+\r
+HSTRSL:        .DB     $33,$33,$B3,$3E ; 3.500000E-01 = (0.5-0.15)\r
+HSTRSH:        .DB     $66,$66,$26,$3F ; 6.500000E-01 = (0.5+0.15)\r
+\r
+CNFHYS:        .DB     $00,$00,$A0,$41 ; 2.000000E+01 = 3/.15\r
+HYSCNF:        .DB     $CD,$CC,$CC,$3D ; 1.000000E-01 = .3/3\r
+QUANT: .DB     $CD,$CC,$4C,$3E ; 2.000000E-01\r
+\r
+K0:    .DB     $00,$00         ; 0.000000E+00\r
+K_1:   .DB     $00,$00,$80,$BF ;-1.000000E+00 DON'T MOVE!\r
+K_R5:  .DB     $00,$00,$00,$BF ;-5.000000E-01\r
+KR0001:        .DB     $17,$B7,$D1,$38 ; 1.000000E-04\r
+KR005: .DB     $0A,$D7,$A3,$3B ; 5.000000E-03\r
+KR1:   .DB     $CD,$CC,$CC,$3D ; 1.000000E-01\r
+KR3:   .DB     $9A,$99,$99,$3E ; 3.000000E-01\r
+KR5:   .DB     $00,$00,$00,$3F ; 5.000000E-01\r
+K1:    .DB     $00,$00,$80,$3F ; 1.000000E+00\r
+K2:    .DB     $00,$00,$00,$40 ; 2.000000E+00\r
+K3:    .DB     $00,$00,$40,$40 ; 3.000000E+00\r
+K4:    .DB     $00,$00,$80,$40 ; 4.000000E+00\r
+K10:   .DB     $00,$00,$20,$41 ; 1.000000E+01\r
+K16:   .DB     $00,$00,$80,$41 ; 1.600000E+01\r
+K20:   .DB     $00,$00,$A0,$41 ; 2.000000E+01\r
+K30:   .DB     $00,$00,$F0,$41 ; 3.000000E+01\r
+K64:   .DB     $00,$00,$80,$42 ; 6.400000E+01\r
+;K100: .DB     $00,$00,$C8,$42 ; 1.000000E+02\r
+K256:  .DB     $00,$00,$80,$43 ; 2.560000E+02\r
+K400:  .DB     $00,$00,$C8,$43 ; 4.000000E+02\r
+K450:  .DB     $00,$00,$E1,$43 ; 4.500000E+02\r
+;K1450:        .DB     $00,$40,$B5,$44 ; 1.450000E+03\r
+;K10K: .DB     $00,$40,$1C,$46 ; 1.000000E+04\r
+;K30M: .DB     $C0,$E1,$E4,$4B ; 3.000000E+07\r
+; CHARACTERIZE ONLY %\r
+K100K: .DB     $00,$50,$C3,$47 ; 1.000000E+05\r
+K33M:  .DB     $00,$20,$FD,$4B ; 3.317760E+07\r
+; %\r
+\r
+; PUT THIS IN EEPROM:\r
+;SIGNON: .DB   3,0                     ; MUST HAVE EVEN NUMBER OF CHARS\r
+;      .DB     "LC"\r
+;      .DB     $0D,$0A\r
+FMAT0: .DB     6,0\r
+       .DB     " 0.000"\r
+FMAT1: .DB     6,0\r
+       .DB     "-OUCH "\r
+FMAT2: .DB     6,0\r
+       .DB     " -LO- "\r
+FMAT3: .DB     6,0\r
+       .DB     "HELLO "\r
+;FMAT4:        .DB     6,0\r
+;      .DB     "Error "\r
+FMAT5: .DB     6,0\r
+       .DB     "      "\r
+FMAT6: .DB     2,0\r
+       .DB     $0D,$0A\r
+;FMAT6:        .DB     3,0\r
+;      .DB     $20,$0D,$0A,0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       OUTI    SPL,RAMEND              ; INIT STACK POINTER\r
+       OUTI    ACSR,$80                ; POWER DOWN ANALOG COMPARATOR\r
+\r
+;      SBI     DDRB,5                  ; SET SK TO OUTPUT FOR DIAGNOSTICS\r
+\r
+       SBI     DDRD,2                  ; SET BIT 2 TO OUTPUT FOR TEMP SENSOR\r
+       SBI     DDRD,3                  ; SET BIT 3 TO OUTPUT FOR TILT SENSOR\r
+\r
+       OUTI    TCCR1B,1                ; SET COUNTER1 TO CLOCK AT 11.0592 MHZ\r
+                                       ; AND INPUT CAPTURE ON FALLING EDGE\r
+       OUTI    MCUCR,2                 ; SET INT0 FALLING EDGE FOR TEMP SENSOR\r
+\r
+       CLR     CYC_0\r
+       CLR     CYC_1\r
+\r
+       CLR     A\r
+       STS     RANGE,A\r
+       RCALL   STS_STATUS_A\r
+       STS     STARTUP,A\r
+       STS     TMP_PHASE,A\r
+\r
+       ;LDE    A,EEMODE\r
+; CHARACTERIZE ONLY %\r
+       LDI     A,$F0\r
+; %\r
+       STS     MODE,A\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     A,1\r
+;      STS     MODE_CYCLE,A\r
+; %\r
+\r
+       FLDF    K1\r
+;      FST     DSPRES\r
+       FST     COUNT\r
+       FLDF    K0\r
+       FST     LSTGMS\r
+       FST     LSTDEV\r
+       FST     AVEGMS\r
+       FST     AVESTD\r
+       FST     INTGMS\r
+; CHARACTERIZE ONLY %\r
+       FST     WGTFRQ                  ; MAY NOT BE NECESSARY\r
+       FST     REF_30MHZ               ; NECESSARY\r
+; %\r
+\r
+       INIT_API_BUS                    ; SET UART RATE AND CLEAR FLAGS/PTRS\r
+\r
+       IN      A,TIMSK\r
+       ORI     A,8                     ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+       OUT     TIMSK,A\r
+\r
+; WEIGHING ONLY %\r
+;      WDR                             ; RESET WATCHDOG\r
+;      LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+;      OUT     WDTCR,A\r
+; %\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;      LDFL    D,SIGNON                ; SEND SIGNON MESSAGE\r
+;      LDI     E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+\r
+LOOP:                                  ; MAIN PROGRAM\r
+       ; IF THE INTERRUPT ALREADY CAME,\r
+       ; THROW AWAY THE DATA AND WAIT FOR A NEW ONE\r
+       CBR     FLAGS,1<<NEWDAT\r
+WAIT_LOOP:\r
+       ; TEST FOR WAITING COMMANDS OR DATA\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    WAIT_LOOPE\r
+       RCALL   RX_CHAR\r
+ ; LOOPBACK TEST\r
+ ;RCALL TX_CHAR\r
+       SBRC    FLAGS,ESC\r
+       RJMP    PROCESS_ESC\r
+       CPI     A,$1B\r
+       BRNE    WAIT_LOOPE\r
+       SBR     FLAGS,1<<ESC\r
+WAIT_LOOPE:\r
+       ; TEST FOR NEW DATA LEFT BY THE INTERRUPT\r
+       SBRS    FLAGS,NEWDAT\r
+       RJMP    WAIT_LOOP\r
+\r
+; WEIGHING ONLY %\r
+;      WDR                     ; FEED WATCHDOG\r
+; %\r
+\r
+       ; SAY WE ARE TAKING THE NEW DATA\r
+       ;CBR    FLAGS,1<<NEWDAT\r
+\r
+       ; PROVIDE SQUARE WAVE DIAGNOSTIC ON B5\r
+       ;IN     A,PORTB\r
+       ;LDI    B,1<<5\r
+       ;EOR    A,B\r
+       ;OUT    PORTB,A\r
+\r
+       ;FLD DSPRES                     ; STACK TEST\r
+       ;RCALL SHOW_FA\r
+       ;LDI A,' '\r
+       ;RCALL TX_WAIT\r
+\r
+       FLD2    F2                      ; CONVERT CYCLE COUNT TO FP FORMAT\r
+       FST     F2\r
+       ;LDI    A,1<<WGTFRQ_FLG\r
+       ;LDI    F,'0'+WGTFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+GRAMS: FLD3    GMS                     ; CONVERT WEIGHT COUNT TO FP FORMAT\r
+; CHARACTERIZE ONLY %\r
+       FST     GMS\r
+       FAD     REF_30MHZ\r
+       FST     REF_30MHZ\r
+       FLD     GMS\r
+; %\r
+       ;LDI    A,1<<TMPFRQ_FLG\r
+       ;LDI    F,'0'+TMPFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FDV     F2\r
+       FMLF    K256 ;K64\r
+       FST     GMS\r
+       FLDF    TICKS                   ; CONVERSION FACTOR\r
+       FDV     GMS\r
+       FST     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;      30usec\r
+\r
+       FLD3    F0                      ; CONVERT TEMPERATURE COUNT TO FP\r
+       FDV     F2                      ;   (THIS ROUTINE FREES UP F0)\r
+       FMLF    K64 ;K16\r
+       FST     F0\r
+       FLDF    KR3\r
+       FDV     F0                      ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;LDI A,$0D\r
+;RCALL SNDEXP\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TMPFRQ\r
+       RCALL   SMOOTH\r
+;      270usec\r
+\r
+       ;LDS    A,STARTUP\r
+       ;SUBI   A,-$30\r
+       ;RCALL  TX_WAIT\r
+\r
+       FLD     GMS\r
+; CHARACTERIZE ONLY %\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,WGTFRQ\r
+       RCALL   SMOOTH\r
+; %\r
+       LDI     A,1<<WGTFRQ_FLG\r
+       LDI     F,'0'+WGTFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+       FLD     TMPFRQ\r
+       LDI     A,1<<TMPFRQ_FLG\r
+       LDI     F,'0'+TMPFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTL_BUF             ; CONVERT TILT TO FP (FREE UP F2, F3)\r
+       RCALL   LIN_TLT                 ; RETURNS CYCLES/30MHZ CLOCK TICK\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TL\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TLRFRQ_FLG\r
+       LDI     F,'0'+TLRFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TLRFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTF_BUF             ; (FREE UP F4)\r
+       RCALL   LIN_TLT\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TF\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TFBFRQ_FLG\r
+       LDI     F,'0'+TFBFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TFBFRQ IF DIAGNOSTIC MODE\r
+;2msec\r
+\r
+       RCALL   NRMTMP                  ; CONVERT TO NORMALIZED TEMP (-1<T<+1)\r
+       FST     F4                      ; AND SAVE NOW THAT F4 AVAILABLE\r
+       LDI     F,6                     ; DEGREE\r
+       LDIZ    A11                     ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; ZERO COMP A11*T^6+A10*T^5+A9*T^4+...\r
+       FST     F1\r
+;      1.1msec\r
+\r
+       FLD     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+       FADE    _WREF                   ; SHIFT ORIGIN TO IMPROVE PRECISION\r
+       LDFL    E,SEGS1                 ; GET SEGMENT COUNT\r
+       LDIZ    SEG1                    ; POINT TO FIRST SEGMENT BOUNDARY\r
+SEGN:  RCALL   CPF_FA                  ; COMPARE FA WITH SEGn\r
+       BRCC    GOTSEG\r
+       ADIW    ZL,12                   ; POINT TO NEXT SEGn\r
+       DEC     E\r
+       BRNE    SEGN\r
+GOTSEG:                                        ; CONVERT TO GMS = D2*W^2 + D1*W + D0\r
+       LDI     F,2                     ; DEGREE\r
+       RCALL   POLY                    ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FAD     F1                      ; GMS=GMS+(THERMAL ZERO CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; NOW, BACK TO GRAMS\r
+       LDFH    F,DEGS                  ; DEGREE\r
+       LDI     E,3                     ; RANGE COUNT\r
+       LDIZ    K500                    ; POINT TO 1ST RANGE BOUNDARY\r
+       RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCC    NEXT_SPNRNG\r
+\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CASE GMS<500\r
+       FDVE    K500\r
+       FML     GMS\r
+       RJMP    THERM_SPAN\r
+\r
+SPNRNG:        RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCS    GOT_SPNRNG\r
+NEXT_SPNRNG:\r
+       ADIW    ZL,32                   ; POINT TO NEXT RANGE BOUNDARY\r
+       DEC     E\r
+       BRNE    SPNRNG\r
+       ADIW    ZL,4\r
+GOT_SPNRNG:\r
+       SBIW    ZL,40                   ; POINT TO PREVIOUS BOUNDARY\r
+       RCALL   SUBE_FA\r
+       FST     F2                      ; F2=GMS-LOWER BOUNDARY\r
+       MOV     E,F                     ; SAVE DEGREE FOR LATER\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FST     F3                      ; CORR.LOW\r
+       MOV     F,E                     ; RESTORE DEGREE\r
+;      MOV     E,ZL                    ; ZL IS NOW POINTING TO DELTA LOAD\r
+       ADIW    ZL,8                    ; POINT TO NEXT HIGH ORDER COEFFICIENT\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CALCULATE CORR.HIGH\r
+       FSB     F3                      ; CORR.HIGH-CORR.LOW\r
+;      MOV     ZL,E                    ; POINT TO DELTA LOAD FROM EARLIER\r
+       SBIW    ZL,8+4+(6*4)            ; ASSUME DEGREE = 6\r
+       RCALL   DIVE_FA\r
+       FML     F2\r
+       FAD     F3                      ; THERMAL SPAN CORRECTION\r
+THERM_SPAN:\r
+       FST     F2\r
+\r
+       ;LDI    A,1<<ZROGMS_FLG\r
+       ;LDI    F,'0'+ZROGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FAD     GMS                     ; GMS=GMS+(THERMAL SPAN CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_10\r
+       MOV     F,FA0\r
+\r
+       FLD     F4                      ; NORMALISED TEMPERATURE\r
+       FMLF    K30\r
+       FADF    K20                     ; CONVERT TO DEGREES CELSIUS\r
+       RCALL   FIX_10                  ; TEMPERATURE (10TH DEGREES)\r
+       MOV     FA2,F                   ; THERMAL ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,E                   ; THERMAL SPAN CORRECTION (10TH GMS)\r
+\r
+       LDI     A,1<<TMPDEG_FLG\r
+       LDI     F,'0'+TMPDEG_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+; TILT CORRECTION\r
+; TLTP1=TLTA31*TLTFR0 + TLTA21*TLTFR1^2+TLTA11*TLTFR1+TLTA01\r
+       LDIZ    TLTA21                  ; TILT FB BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TF\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA31\r
+       FML     TL\r
+       FAD     F0\r
+       FST     F1\r
+\r
+; TLTP0=TLTA30*TLTFR1 + TLTA20*TLTFR0^2+TLTA10*TLTFR0+TLTA00\r
+       LDIZ    TLTA20                  ; TILT LR BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TL\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA30\r
+       FML     TF\r
+       FAD     F0\r
+       FST     F0\r
+\r
+; TLTSPN1 = (TLTC21*TLTP1+TLTC11)*TLTP1\r
+       RCALL   LDF_FA                  ; TLTC21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTC11\r
+       FML     F1\r
+       FST     F3\r
+\r
+; TLTSPN0 = (TLTC20*TLTP0+TLTC10)*TLTP0\r
+       RCALL   LDF_FA                  ; TLTC20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTC10\r
+       FML     F0\r
+\r
+; WEIGHT = WEIGHT + WEIGHT*(TLTSPN0+TLTSPN1)\r
+       FAD     F3\r
+       FST     F3                      ; TLTSPN\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FML     GMS\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+; WEIGHT=WEIGHT + TLTB21*TLTP1^2+TLTB11*TLTP1\r
+       RCALL   LDF_FA                  ; TLTB21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTB11\r
+       FML     F1\r
+       FST     F2\r
+\r
+; WEIGHT=WEIGHT + TLTB20*TLTP0^2+TLTB10*TLTP0\r
+       RCALL   LDF_FA                  ; TLTB20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTB10\r
+       FML     F0\r
+       FAD     F2\r
+       FST     F2                      ; TLTZRO\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+       FLD     F3\r
+       FMLE    K10K\r
+       RCALL   FIX_ENTRY\r
+       MOV     D,FA0\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_400\r
+       MOV     F,FA0\r
+\r
+       FLD     F0\r
+       RCALL   FIX_400                 ; TILT X POSITION\r
+       MOV     FA1,F                   ; TILT Y POSITION\r
+       MOV     FA2,E                   ; TILT ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,D                   ; TILT SPAN CORRECTION (10TH GMS/KG)\r
+\r
+       LDI     A,1<<TLTBUB_FLG\r
+       LDI     F,'0'+TLTBUB_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+;SKIP_TILT:\r
+       ;FLD    GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLDE    SPAN\r
+       FML     GMS\r
+       FST     GMS\r
+\r
+; RECALIBRATION\r
+       LDI     F,3                     ; DEGREE\r
+       LDI     ZL,LOW(CAL3*2)          ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; CAL3*GMS^3+CAL2*GMS^2+CAL1*GMS+CAL0\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; AVERAGING ALGORITHM\r
+                                       ; MEASURE DEVIATION\r
+       FSB     LSTGMS                  ; DEV=GMS-LSTGMS\r
+       LDS     A,LSTDEV+2              ; IF SGN(DEV)=SGN(LSTDEV) (SAME DIR)\r
+       EOR     A,FA2\r
+       BRMI    AV0\r
+       FAD     LSTDEV                  ; THEN DEV=DEV+LSTDEV (ACCUMULATE DEV)\r
+AV0:   FST     LSTDEV\r
+       LDI     A,$7F                   ; IF ABS(DEV) < QUANT\r
+       AND     FA2,A\r
+       FST     F0\r
+       FCPF    QUANT\r
+       BRCC    AV1\r
+       FLDF    QUANT                   ; THEN STD=QUANT (STD DEV > QUANT)\r
+       FST     F0                      ; ELSE STD=ABS(DEV) (APPROX STD DEV)\r
+\r
+                                       ; SET AVERAGING PERIOD\r
+AV1:   FLD     COUNT                   ; IF STD/AVESTD > CNT/(CNT+1)\r
+       FML     AVESTD                  ; (STILL TOO NOISY)\r
+       FST     F1\r
+       FLD     COUNT\r
+       FADF    K1\r
+       FST     F2\r
+       FML     F0\r
+       FCP     F1\r
+       BRCS    AV2\r
+       FLD     F2                      ; THEN INCR CNT (EXTEND AVERAGE)\r
+       FST     COUNT\r
+AV2:   FLD     AVESTD                  ; MAXCNT=(AVESTD/DSPRES)*(CONF/HYST)\r
+;      FDV     DSPRES\r
+       FMLF    CNFHYS\r
+       FST     F1\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV3                     ; (UNTIL STD DEV < HYST)\r
+       RCALL   LDS_A_STATUS            ; THEN VERY STABLE=1\r
+       SBR     A,1<<VSTBL\r
+       RCALL   STS_STATUS_A\r
+AV3:   FLD     F1                      ; MAXCNT=MAXCNT+30\r
+       FADF    K30\r
+       FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV4\r
+       FLD     F1                      ; THEN CNT=MAXCNT\r
+       FST     COUNT\r
+\r
+                                       ; AVERAGE THE DEVIATION\r
+AV4:   FLD     COUNT                   ; NN=CNT (WEIGHTING FOR AVESTD)\r
+       FST     F1\r
+       FLD     F0                      ; IF STD*3 < AVESTD (VERY QUIET)\r
+       FMLF    K3\r
+       FCP     AVESTD\r
+       BRCC    AV5\r
+       FLD     F1                      ; THEN IF NN>10 THEN NN=10\r
+       FCPF    K10                     ; (ADAPT LOWER QUICKLY)\r
+       BRCS    AV5\r
+       FLDF    K10\r
+       FST     F1                      ; NN\r
+AV5:   FLD     F0                      ; STD\r
+       LDI     F,AVESTD\r
+       RCALL   SMOOTH_FP               ; AVESTD=(STD+AVESTD*(NN-1))/NN\r
+       FLD     COUNT                   ; IF AVESTD < CNT*DSPRES*HYST\r
+;      FML     DSPRES                  ;    (NO DISPLAY FLICKER)\r
+       FMLF    HYSCNF\r
+       FCP     AVESTD\r
+       BRCS    AV6\r
+       RCALL   LDS_A_STATUS            ; THEN UNSTABLE=0 (STABLE)\r
+       CBR     A,1<<UNSTBL\r
+       RCALL   STS_STATUS_A\r
+                                       ; AVERAGE THE DATA\r
+AV6:   FLD     GMS\r
+       FST     LSTGMS                  ; READY FOR NEXT CYCLE\r
+       FSB     AVEGMS\r
+       FST     F2                      ; ERRGMS=GMS-AVEGMS\r
+       FMLF    K4\r
+       FST     F1                      ; ERRGMS*4\r
+       RCALL   LDS_A_STATUS            ; NOW SET WEIGHTING FOR AVEGMS\r
+       SBRS    A,VSTBL                 ; IF VERY STABLE\r
+       RJMP    AV7\r
+       FLD     F1                      ; THEN NN=CNT+(ERRGMS*4/DSPRES)^2\r
+;      FDV     DSPRES                  ;      (EXCLUDE NOISY DATA)\r
+       FST     F3                      ;       ERRGMS*4/DSPRES\r
+       FML     F3                      ;      (ERRGMS*4/DSPRES)^2\r
+       FAD     COUNT\r
+       RJMP    AV8\r
+AV7:   FLD     COUNT                   ; ELSE NN=CNT (EXCEPT AFTER JUMP)\r
+AV8:   FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     GMS\r
+       LDI     F,AVEGMS\r
+       RCALL   SMOOTH_FP               ; AVEGMS=(GMS+AVEGMS*(NN-1))/NN\r
+       LDI     A,1<<ABSGMS_FLG\r
+       LDI     F,'0'+ABSGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+                                       ; ALLOW INTGMS TO DECAY\r
+       FLD     F2                      ; ERRGMS\r
+       FMLF    K4\r
+       FST     F3                      ; ERRGMS*4\r
+       FML     F3\r
+       FADF    K10\r
+       FST     F1                      ; NN=10+(ERRGMS*4)^2 (TIME CONSTANT)\r
+       FLD     INTGMS                  ; INTGMS=INTGMS-INTGMS/NN (DECAY)\r
+       FDV     F1\r
+       FSB     INTGMS\r
+       FST     INTGMS                  ; ACTUALLY -INTGMS\r
+\r
+                                       ; INTEGRATE ERROR BETWEEN DATA AND AVE\r
+ FLD K1\r
+;      FLD     DSPRES                  ; MINERR=DSPRES-AVESTD*2\r
+       FSB     AVESTD\r
+       FSB     AVESTD\r
+       FST     F3\r
+       TST     FA2                     ; IF MINERR < 0\r
+       BRPL    AV9\r
+       FLDF    K0                      ; THEN MINERR=0\r
+       FST     F3\r
+AV9:   FLD     F2                      ; ERRGMS\r
+       BST     FA2,7                   ; SAVE SIGN\r
+       LDI     A,$7F\r
+       AND     FA2,A\r
+       FST     F1                      ; ABS(ERRGMS)\r
+       FCP     F3                      ; IF ABS(ERRGMS) < MINERR\r
+       BRCC    AV10\r
+       FLD     INTGMS                  ; THEN ERRGMS=0 (INTGMS UNCHANGED)\r
+       RJMP    AV12\r
+AV10:  FLD     F1                      ; WIND TO HAVE NO ADVANTAGE OVER GMS<20\r
+       FCPF    K20                     ; IF ABS(ERRGMS) < 20\r
+       BRCC    AV11\r
+       FLDF    K1                      ; THEN ERRGMS=SGN(ERRGMS)\r
+       BLD     FA2,7                   ;      (RESTORE SIGN)\r
+       FST     F2\r
+AV11:  FLDF    K4                      ; INTGMS=INTGMS+ERRGMS*4/STD\r
+       FML     F2\r
+       FDV     F0\r
+       FSB     INTGMS                  ; INTEGRATE THE ERROR\r
+       FST     INTGMS\r
+AV12:                                  ; RESTART AVERAGE IF ERROR SIGNIFICANT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; IF ABS(INTGMS)>64 (JUMP CONDITION)\r
+       FCPF    K64\r
+       BRCS    AV13\r
+       FLDF    K1                      ; THEN CNT=1\r
+       FST     COUNT\r
+       FLDF    K0                      ;      INTGMS=0\r
+       FST     INTGMS\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<VSTBL              ;      VERY STABLE=0\r
+       SBR     A,1<<UNSTBL             ;      UNSTABLE=1\r
+       RCALL   STS_STATUS_A\r
+\r
+; TO IMPROVE WIND PERFORMANCE I NEED TO VARY THE JUMP THRESHOLD\r
+; HAVING REGARD TO THE LONGER TERM EXCURSIONS ABOUT AVEGMS\r
+\r
+AV13:  FLD     AVEGMS                  ; AUTOZERO ROUTINE\r
+       FSB     ZROGMS\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+       FCPF    KR5                     ; IF ABS(AVEGMS-ZROGMS)<0.5\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<ZROFLG\r
+       BRCC    AZ0\r
+       SBR     A,1<<ZROFLG             ; THEN SET ZROFLG\r
+AZ0:   RCALL   STS_STATUS_A\r
+       SBRS    A,ZROFLG                ; IF NOT SHOWING ZERO\r
+       RJMP    AZ1                     ; THEN SKIP AUTOZERO\r
+       FLD     AVEGMS                  ; ELSE AVERAGE INTO ZERO POINT\r
+       LDI     F,ZROGMS\r
+       LDI     A,17                    ;      IF AVEOK=0 USE N=17 ELSE N=2\r
+       RCALL   SMOOTH\r
+\r
+AZ1:   RCALL   LDS_A_STATUS            ; IF NOT SET ZERO COMMAND\r
+       SBRS    A,TRYZRO\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING\r
+       ;RCALL  LDS_A_STATUS            ; IF UNSTABLE\r
+       SBRC    A,UNSTBL\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING, RETAIN RQ\r
+       FLD     AVEGMS                  ; ELSE IF OUTSIDE RANGE\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ;         ABS\r
+       FCPF    K450 ;K1450 FOR EXTENDED ZERO RANGE - SHIPPED WITH S/N 5637\r
+       BRCC    AZ2                     ;      THEN SKIP ZERO SETTING, CLEAR RQ\r
+       FLD     AVEGMS                  ; ADDED 18DEC00 - ALLOW NEGATIVE AVEGMS\r
+       FST     ZROGMS                  ;      ELSE ZROGMS=AVEGMS\r
+AZ2:   RCALL   LDS_A_STATUS            ; ADDED 24FEB99 - MISSING ALL ALONG?\r
+       CBR     A,1<<TRYZRO\r
+       RCALL   STS_STATUS_A\r
+AZ3:   FLD     ZROGMS\r
+       LDI     A,1<<ZROGMS_FLG\r
+       LDI     F,'0'+ZROGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+; FIND RANGE AND DISPLAY RESOLUTION\r
+; WE ALSO CALCULATE F0=AVEGMS-ZROGMS IN THE PROCESS\r
+       FLD     AVEGMS\r
+       FSB     ZROGMS\r
+       FST     F0\r
+\r
+       LDE     E,RANGES                ; GET RANGE COUNT\r
+       LDI     ZL,RANGE1*2             ; POINT TO FIRST RANGE BOUNDARY\r
+RNGE:  RCALL   CPE_FA                  ; COMPARE FA WITH BOUNDARY\r
+       BRCS    GOTRNG\r
+       ADIW    ZL,4                    ; POINT TO NEXT RNG\r
+       DEC     E\r
+       BRNE    RNGE\r
+       SBIW    ZL,4                    ; POINT BACK TO PREVIOUS RESOLUTION\r
+GOTRNG:        RCALL   LDE_FA                  ; GET DISPLAY RESOLUTION FOR THIS RANGE\r
+;      FST     DSPRES\r
+\r
+; STABILIZE DISPLAYED WEIGHT USING HYSTERESIS\r
+STAB:  FLD     F0\r
+       MOV     F,FA2                   ; SAVE SIGN BIT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+;      FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     F2\r
+       RCALL   FIX_FA                  ; TRUNCATE TO 3 BYTE INTEGER\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       FST     F0                      ; INTEGER PART\r
+       FLD     F2\r
+       FSB     F0                      ; FA = FRACTIONAL PART\r
+       FCPF    HSTRSL\r
+       BRCS    STB2                    ; FRACTION < HSTRSL, ROUND DOWN\r
+       FCPF    HSTRSH\r
+       BRCC    STB1                    ; FRACTION >= HSTRSH, ROUND UP\r
+\r
+       LDS     A,RANGE                 ; PREVIOUS RANGE, RND, SGN\r
+       MOV     B,A\r
+       EOR     B,F                     ; COMPARE WITH CURRENT SIGN (BIT 7)\r
+       BRMI    STB2                    ; JUST CHANGED SIGN, ROUND DOWN\r
+       ANDI    A,RNG                   ; PREVIOUS RANGE\r
+       CP      A,E                     ; COMPARE WITH CURRENT RANGE\r
+       BRCS    STB1                    ; JUST GONE TO LOWER RANGE, ROUND UP\r
+       BRNE    STB2                    ; JUST GONE TO HIGHER RANGE, ROUND DOWN\r
+\r
+       FLD     DSPGMS                  ; RECALCULATE VALUE FROM LAST TIME\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+;      FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       LDS     A,RANGE                 ; PREVIOUS STATE\r
+       SBRS    A,RND                   ; IF ROUNDED UP LAST TIME\r
+       RJMP    STB0\r
+       FSBF    K1                      ; THEN DECREMENT\r
+STB0:  FST     F2                      ; CORRESPONDING VALUE FROM LAST TIME\r
+       FCP     F0\r
+       BRCS    STB2                    ; GONE TO HIGHER VALUE, ROUND DOWN\r
+       FLD     F0\r
+       FCP     F2\r
+       BRCS    STB1                    ; GONE TO LOWER VALUE, ROUND UP\r
+       RJMP    STB5                    ; ELSE RETAIN EXISTING DSPGMS\r
+\r
+STB1:  FLD     F0                      ; ROUND UPWARDS\r
+       FADF    K1\r
+       SBR     E,1<<RND                ; SUPERIMPOSE UPWARDS FLAG ON RANGE\r
+       RJMP    STB3\r
+\r
+STB2:  FLD     F0                      ; ROUND DOWNWARDS\r
+       ;CBR    E,1<<RND                ; SUPERIMPOSE DOWNWARDS FLAG ON RANGE\r
+STB3:  BST     F,7                     ; GET CURRENT SIGN\r
+       TST     FA3                     ; IF DSPGMS<>0\r
+       BREQ    STB4\r
+       BLD     FA2,7                   ; THEN RESTORE SIGN\r
+STB4:  BLD     E,SGN                   ; SUPERIMPOSE ON CURRENT RANGE\r
+       STS     RANGE,E                 ; SAVE CURRENT RANGE, RND, SGN\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FMLF KR1\r
+ ; ELSE\r
+;      FML     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     DSPGMS\r
+\r
+STB5:\r
+; WEIGHING ONLY %\r
+;      ;LDS    A,MODE                  ; IF NOT WEIGHING MODE\r
+;      ;SBRS   A,DSPGMS_FLG\r
+;      ;RJMP   DSP9                    ; THEN SKIP OUTPUT IN GRAMS\r
+;\r
+;      LDI     E,CYC_MIN*2/3\r
+;      RCALL   TX_WAIT_EMPTY\r
+;      BRCS    FMT\r
+;      RJMP    DSP9                    ; NO TX_BUFFER TO SEND ITEM THIS CYCLE\r
+;\r
+;FMT:  RCALL   LDS_A_STATUS\r
+;      SBRS    A,SEND_SN               ; NEED TO SEND S/N MESSAGE ?\r
+;      RJMP    SKIP_SN\r
+;\r
+;      CBR     A,1<<SEND_SN\r
+;      RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;\r
+;      LDFL    D,SN\r
+;      RCALL   SNDSTR                  ; SEND S/N MESSAGE\r
+;      RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+;\r
+;SKIP_SN:\r
+;;     RCALL   LDS_A_STATUS\r
+;;     SBRS    A,SEND_SPAN             ; NEED TO SEND S/N MESSAGE ?\r
+;;     RJMP    SKIP_SPAN\r
+;;\r
+;;     CBR     A,1<<SEND_SPAN\r
+;;     RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;;\r
+;;     FLDE    SPAN\r
+;;     LDI     A,0                     ; ITEM MUST ALWAYS BE SENT\r
+;;     LDI     F,'S'\r
+;;     RCALL   SNDFP                   ; SEND SPAN MESSAGE\r
+;;     RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+;\r
+;SKIP_SPAN:\r
+;      LDS     A,STARTUP               ; IF STARTUP<CYC_ZERO\r
+;      CPI     A,CYC_ZERO\r
+;      BRCC    FMT0\r
+;      RCALL   SET_TRYZRO              ; THEN SET ZERO\r
+;      LDFL    D,FMAT3                 ;      SHOW " HELLO"\r
+;      RJMP    DSP7\r
+;\r
+;FMT0: FLD     DSPGMS                  ; FORMAT OUTPUT DATA PACKET\r
+;      LDFL    D,FMAT5                 ; IF SETTING ZERO\r
+;      LDS     F,STATUS\r
+;      SBRC    F,TRYZRO                ; THEN SHOW "     "\r
+;      RJMP    DSP7\r
+;      LDS     E,STARTUP               ; USED FOR DELAY BEFORE SHOWING " -LO-"\r
+;      TST     FA2                     ; IF DSPGMS>=0\r
+;      BRPL    FMT2                    ; THEN CONTINUE\r
+;;     FSBF    KR005                   ; ELIMINATE TRUNCATION ERROR (- VALUES)\r
+;      INC     E                       ; INC " -LO-" COUNTER (STARTUP)\r
+;      CPI     E,CYC_START+8           ; IF STARTUP<CYC_START+8\r
+;      BRCC    FMT1\r
+;      STS     STARTUP,E\r
+;      LDFL    D,FMAT0                 ; THEN SHOW " 0.000"\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;LDI E,CYC_MIN-10    ; TIMEOUT IS WHEN CYC_1 => E\r
+; ;RCALL SNDSTR\r
+; ;LDI A,'0'\r
+; ;RCALL TX_WAIT\r
+; ;RJMP DSP8\r
+; ; %\r
+;      RJMP    DSP7\r
+;FMT1: SBR     F,1<<LOWFLG             ; ELSE SET LOWFLG\r
+;      STS     STATUS,F\r
+;      LDFL    D,FMAT2                 ;      SHOW " -LO-"\r
+;      RJMP    DSP7\r
+;FMT2: CBR     F,1<<LOWFLG             ; CLEAR LOWFLG\r
+;      CPI     E,CYC_START             ; IF STARTUP>CYC_START  ' CLEAR " -LO-"\r
+;      BRCS    FMT3\r
+;      LDI     E,CYC_START             ; THEN STARTUP=CYC_START\r
+;      STS     STARTUP,E\r
+;FMT3: FCPE    RNGMAX                  ; IF DSPGMS>RNGMAX\r
+;      BRCS    FMT4\r
+;      SBR     F,1<<OUCHFLG            ; SET OUCHFLG\r
+;      STS     STATUS,F\r
+;      LDFL    D,FMAT1\r
+;      RJMP    DSP7                    ; THEN SHOW "-OUCH"\r
+;FMT4: CBR     F,1<<OUCHFLG            ; CLEAR OUCHFLG\r
+;      STS     STATUS,F\r
+;\r
+;DSP:  FADF    KR005                   ; ELIMINATE TRUNCATION ERROR (+ VALUES)\r
+;      RCALL   DIGN                    ; ADJUST EXPONENT FOR 1<N<10\r
+;      ADDI    F,2                     ; NUMBER OF DIGITS TO SEND +1\r
+;      ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      LDFL    D,FMAT0                 ; " 0.000"\r
+;      ADIW    ZL,2\r
+;DSP2: CP      F,D\r
+;      BRCC    DSP4\r
+;DSP3: RCALL   STR1                    ; GET NEXT CHARACTER FROM FMAT0\r
+;      BREQ    DSP8                    ; WHEN ALL DONE\r
+;      CPI     D,4\r
+;      BRNE    DSP2\r
+;      DEC     F                       ; TO COMPENSATE FOR EXTRA DEC C\r
+;      RJMP    DSP3                    ; DO DECIMAL PT\r
+;DSP4:\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;INC F\r
+; ; %\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND FIRST DIGIT\r
+;DSP5: DEC     F\r
+;      BREQ    DSP8\r
+;      CPI     F,4\r
+; ; FOR TENTHS OF GRAMS %\r
+; ;CPI F,5\r
+; ; %\r
+;      BRNE    DSP6\r
+;      LDI     A,'.'\r
+;      RCALL   TX_WAIT\r
+;      DEC     F\r
+;DSP6: RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    DSP5\r
+;DSP7: ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+;DSP8:\r
+;; ASCII STABILITY INDICATION FOR TESTING %\r
+;;     LDI     A,' '\r
+;;     RCALL   TX_WAIT\r
+;;     RCALL   LDS_A_STATUS\r
+;;     ANDI    A,1<<UNSTBL\r
+;;     LDI     A,' '\r
+;;     BREQ    DSP8X\r
+;;     LDI     A,'*'\r
+;;DSP8X:       RCALL   TX_WAIT\r
+;;     LDI     A,$0D\r
+;;     RCALL   TX_WAIT\r
+;;     LDI     A,$0A\r
+;;     RCALL   TX_WAIT\r
+;; %\r
+;      LDFL    D,FMAT6                 ; NOW SEND TRAILER\r
+;      RCALL   SNDSTR\r
+;DSP9:\r
+; %\r
+\r
+       ; END OF MAIN WEIGHING LOOP\r
+\r
+; WEIGHING ONLY %\r
+;      LDS     A,MODE_CYCLE\r
+;      CPI     A,$10\r
+;      BRLO    MODE_CYCLE_SWAP\r
+;      LSL     A\r
+;      BRNE    MODE_CYCLE_SWAP\r
+;      LDI     A,$10\r
+;MODE_CYCLE_SWAP:\r
+;      SWAP    A\r
+;      STS     MODE_CYCLE,A\r
+;\r
+;      LDS     A,STARTUP\r
+;      INC     A\r
+;      CPI     A,CYC_START+1           ; INC UP TO 32\r
+;      BRCC    LOOP_END\r
+;      STS     STARTUP,A\r
+; %\r
+\r
+; CHARACTERIZE ONLY %\r
+       LDS     A,STARTUP\r
+       SBRC    FLAGS,SNDDAT\r
+       LDI     A,0                     ; RESTART INTEGRATION IF WE SENT DATA\r
+       INC     A\r
+       STS     STARTUP,A               ; INCREASE COUNT FOR TRUE AVERAGE\r
+\r
+       CBR     FLAGS,1<<SNDDAT         ; SAY WE MUST NOT SEND DATA OUT\r
+\r
+       FLD     REF_30MHZ               ; ELAPSED INTEGRATION TIME, 33MHZ TICKS\r
+       FCPF    K33M                    ; => 1 SECOND ?\r
+       BRLO    LOOP_END                ; NO, CONTINUE CURRENT INTEGRATION\r
+\r
+       FSBF    K33M\r
+       FST     REF_30MHZ               ; WRAP ELAPSED TIME FOR NEW CYCLE\r
+\r
+       SBR     FLAGS,1<<SNDDAT         ; SAY WE MUST SEND DATA OUT\r
+\r
+LOOP_END:\r
+; %\r
+\r
+       RJMP    LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FIX_400:\r
+       FMLF    K400                    ; FOR +/- 20 FROM +/- 0.05\r
+       RJMP    FIX_ENTRY\r
+FIX_10:\r
+       FMLF    K10                     ; FOR 10TH GRAMS FROM GRAMS\r
+FIX_ENTRY:\r
+       ; THIS WILL CLOBBER D REGISTER,\r
+       ; AND DOES NOT CORRECTLY HANDLE NEGATIVE NUMBERS %\r
+       ;FADF   KR5                     ; FOR ROUNDING\r
+       ; %\r
+       RCALL   FIX_FA\r
+       BRTC    FIX_POSITIVE\r
+       COM     FA0\r
+       COM     FA1\r
+       INC     FA0\r
+       BRNE    FIX_POSITIVE\r
+       INC     FA1\r
+FIX_POSITIVE:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_WAIT_EMPTY:\r
+       LDS     A,TX_COUNT\r
+       CPI     A,1\r
+       BRLO    TX_WAIT_EMPTY_RET\r
+\r
+       CP      CYC_1,E\r
+       BRLO    TX_WAIT_EMPTY\r
+\r
+;      LDS     A,TX_COUNT\r
+;      CPI     A,1\r
+\r
+TX_WAIT_EMPTY_RET:\r
+       RET                             ; CF SET = READY, CF CLEAR = NOT READY\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+POLY:  FST     F0                      ; POLYNOMIAL CALCULATION, FLASH CONST\r
+                                       ; ENTER WITH FA = INDEPENDENT VAR\r
+       RCALL   LDF_FA                  ;            Z <= HIGHEST ORDER COEFF\r
+POLY0: FML     F0\r
+       RCALL   ADDF_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLY0\r
+       RET\r
+\r
+NRMTMP:        FLD     TMPFRQ                  ; NORMALIZE TEMP C3*T^3+C2*T^2+C1*T+C0\r
+       LDI     F,3                     ; DEGREE\r
+       LDIZ    C3                      ; HIGH ORDER COEFFICIENT\r
+;      RJMP    POLYE                   ; RETURN -1=-10 DEG, 0=20 DEG, 1=50 DEG\r
+\r
+POLYE: FST     F0                      ; POLYNOMIAL CALCULATION, EEPROM CONST\r
+       RCALL   LDE_FA                  ; ENTER WITH F0 = INDEPENDENT VARIABLE\r
+POLYE0:        FML     F0                      ;            Z <= HIGHEST ORDER COEFF\r
+       RCALL   ADDE_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLYE0\r
+       RET\r
+\r
+SMOOTH:                                        ; EXPONENTIAL SMOOTHING A=N E=>AVERAGE\r
+       TST     A                       ; IF N=0        NOTE: CLOBBERS F0, F1\r
+       BREQ    SMTH0                   ; THEN DO NOTHING\r
+       FST     F0                      ; SAVE CURRENT DATA\r
+       MOV     FA0,A                   ; CONVERT N\r
+       CLR     FA1\r
+       CLR     FA2\r
+       RCALL   LD3_FA                  ; TO FP FORMAT\r
+       FST     F1                      ; AND SAVE\r
+       FLD     F0                      ; RETRIEVE CURRENT DATA\r
+SMOOTH_FP:                             ; ENTRY POINT WITH F1=N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   SUB_FA\r
+       FDV     F1                      ; N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   ADD_FA\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   STS_FA                  ; AND SAVE\r
+SMTH0: RET\r
+\r
+LIN_TLT:\r
+       RCALL   LDS2_FA                 ; CONVERT 2 BYTE TILT COUNT TO FP\r
+       MOV     F,YL                    ; TEMP SAVE\r
+       FST     F0                      ; TLTL\r
+       MOV     YL,F\r
+       RCALL   LDS2_FA                 ; CONVERT OPPOSING TILT COUNT TO FP\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F1                      ; TLTR\r
+       FML     F1                      ; TLTR^2\r
+       FST     F3\r
+       FLD     F0\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F0                      ; TLTL\r
+       FML     F0                      ; TLTL^2\r
+       FSB     F3                      ; TLTL^2-TLTR^2\r
+       FMLF    TLT2\r
+       FST     F3\r
+       FLD     F1\r
+       FSB     F0                      ; TLTR-TLTL\r
+       FMLF    TLT1\r
+       FSB     F3\r
+       FADF    TLT0\r
+SNDFP2:        RET\r
+\r
+SNDFP:\r
+; WEIGHING ONLY %\r
+;      INC     FA3                     ; CHECK FOR NAN\r
+;      BRNE    SND0\r
+;      DEC     FA3                     ; TO COMPLY WITH IEEE754\r
+;SND0: DEC     FA3\r
+;      ROL     FA2                     ; CONVERT TO IEEE754\r
+;      ROR     FA3\r
+;      ROR     FA2\r
+; %\r
+\r
+       TST     A\r
+       BREQ    SNDFPX                  ; ITEM MUST ALWAYS BE SENT\r
+\r
+SNDFPE:        LDS     B,MODE                  ; SEND DIAGNOSTIC DATA\r
+       AND     A,B                     ; MODE BIT FOR THIS DATA ITEM SET?\r
+; WEIGHING ONLY %\r
+;      LDS     B,MODE_CYCLE\r
+;      AND     A,B                     ; ROUND ROBIN UP TO THIS DATA ITEM YET?\r
+; %\r
+       BREQ    SNDFP2                  ; DO NOT SEND THIS DATA ITEM THIS CYCLE\r
+\r
+       LDI     E,0                     ; TIMEOUT IS WHEN CYC_1 => E\r
+       RCALL   TX_WAIT_EMPTY\r
+       BRCC    SNDFP2                  ; NO TX_BUFFER SPACE TO SEND ITEM\r
+\r
+SNDFPX:\r
+; CHARACTERIZE ONLY %\r
+       SBRS    FLAGS,SNDDAT\r
+       RET\r
+       CPI     A,$80\r
+       LDI     A,$0A\r
+       BRNE    SEPOK\r
+       LDI     A,$0D\r
+SEPOK: RJMP    SNDEXP\r
+; %\r
+\r
+; WEIGHING ONLY %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,F                     ; INDICATE WHICH DATA IS BEING SENT\r
+;      RCALL   TX_WAIT\r
+;;SND_FA:\r
+;      LDI     XL,FA                   ; LOAD TX BUFFER\r
+;      LDI     D,4\r
+;SND1: LD      A,X+\r
+;      RCALL   TX_WAIT                 ; LS BYTE FIRST\r
+;      DEC     D\r
+;      BRNE    SND1\r
+;      RET\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PROCESS_ESC:\r
+       SBRC    FLAGS,ESCM\r
+       RJMP    PROCESS_ESC_M1\r
+\r
+       CPI     A,'#'\r
+       BREQ    PROCESS_ESC_HASH\r
+       CPI     A,'M'\r
+       BREQ    PROCESS_ESC_M0\r
+;      CPI     A,'S'\r
+;      BREQ    PROCESS_ESC_S\r
+       CPI     A,'Z'\r
+       BREQ    PROCESS_ESC_Z\r
+\r
+PROCESS_ESC_DONE:\r
+       CBR     FLAGS,1<<ESC            ; NEED ANOTHER ESC TO GET BACK HERE\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_HASH:\r
+       RCALL   LDS_A_STATUS\r
+       SBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SEND S/N INSTEAD OF WEIGHT OUTPUT\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_M0:\r
+       SBR     FLAGS,1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_M1:\r
+       STS     MODE,A\r
+       CBR     FLAGS,1<<ESC | 1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+;PROCESS_ESC_S:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SEND SPAN INSTEAD OF WEIGHT OUTPUT\r
+;      RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_Z:\r
+       RCALL   SET_TRYZRO              ; SET ZERO\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+WGT_INT:\r
+       IN      SR,SREG\r
+       INC     CYC_0                   ; INCREMENT WEIGHT CYCLE COUNTER\r
+       OUT     SREG,SR\r
+       SBRS    CYC_0,4                 ; DO TILT & TEMPERATURE EVERY 16 CYCLES\r
+       RETI                            ; NORMALLY EXIT HERE\r
+\r
+       PUSH    SR\r
+       LDI     SR,$10\r
+       ADD     CYC_0,SR                ; CLEAR BIT 4, CARRYING INTO BITS 5-7\r
+\r
+       IN      G,PIND\r
+       IN      H,PINC                  ; READ DATA\r
+       SEI                             ; ALLOW RECURSIVE WGT_INT\r
+\r
+;RCALL TOG_B5\r
+       ANDI    G,$F0                   ; ASSEMBLE DATA\r
+       ANDI    H,$0F\r
+       OR      G,H                     ; INTO G\r
+       ;MOV    H,G\r
+       ;SUB    H,WT_0                  ; AND CALC DIFFERENCE FROM LAST CYCLE\r
+       ;PUSH   H                       ; PUT HC590 DIFFERENCE COUNT ON STACK\r
+       ;MOV    WT_0,G                  ; SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       SUB     G,WT_0\r
+       ADD     WT_0,G\r
+       PUSH    G\r
+\r
+       IN      G,ICR1L                 ; READ TIMER1 INPUT CAPTURE REGISTER\r
+       MOV     H,G\r
+       SUB     H,WT_1\r
+       ;SBC    H,WT_1                  ; AND CALC DIFFERENCE FROM LAST CYCLE\r
+       MOV     WT_1,G                  ; SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       IN      G,ICR1H                 ; NOW HIGH BYTE\r
+       MOV     I,G\r
+       SBC     I,WT_2\r
+       MOV     WT_2,G\r
+\r
+;      USE 11MHZ COUNT TO DETERMINE HOW MANY TIMES HC590 HAS ROLLED OVER\r
+\r
+       MOV     G,H                     ; DIFFERENCE COUNT IN H|I\r
+       MOV     K,I\r
+       CLR     J\r
+       ADD     H,H                     ; H|I * 3 => H|I|J\r
+       ADC     I,I\r
+       ADC     J,J\r
+       ADD     H,G\r
+       ADC     I,K\r
+       CLR     G\r
+       ADC     J,G\r
+\r
+       MOV     G,I\r
+       MOV     K,J\r
+       LSR     K\r
+       ROR     G\r
+\r
+       ; ALLOW +/-128 COUNTS OF ERROR DUE TO XTAL TOLERANCES (-60 TYP)\r
+\r
+       POP     G                       ; RETRIEVE HC590 DIFFERENCE COUNT\r
+       SUB     G,H                     ; CALCULATE AMOUNT TO ADJUST H|I|J\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_COUNT\r
+; MOV A,G\r
+; RCALL TX_CHAR\r
+;SKIP_COUNT:\r
+; POP A\r
+       LDS     K,STARTUP       ; CHANGED 26MAR01 TO ALLOW FOR\r
+       TST     K               ; NEW BATCH OF 11MHZ XTALS\r
+       BREQ    CORRECTION_OK\r
+       CPI     G,-48           ; ASSUME NORMAL CORRECTION > -16\r
+       BRSH    CORRECTION_OK\r
+       CPI     G,16            ; OR            CORRECTION > +5\r
+       BRLO    CORRECTION_OK\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_DOLLAR\r
+ LDI A,'$'\r
+ RCALL TX_CHAR\r
+SKIP_DOLLAR:\r
+ POP A\r
+       SUB     WT_0,G\r
+       LDI     G,-12                   ; BUT TYPICALLY -12\r
+       ADD     WT_0,G\r
+CORRECTION_OK:\r
+       LDI     K,0\r
+       TST     G\r
+       BRPL    SIGN_EXTEND\r
+       LDI     K,$FF                   ; IF NEG\r
+SIGN_EXTEND:\r
+       ADD     H,G\r
+       ADC     I,K\r
+       ADC     J,K                     ; ADD INTO H|I|J\r
+\r
+       ; WARNING CANNOT CORRUPT H, I, J %\r
+;TEMPERATURE:                          ; START TEMPERATURE MEASUREMENT\r
+       LDS     G,TMP_PHASE             ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+       INC     G\r
+TMP0:  RJMP    TMP1\r
+TMP1:  DEC     G                       ; WAIT FOR HIGH ON WGT TO SYNCHRONISE\r
+       BRNE    TMP0\r
+\r
+       CLI\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,GIMSK                 ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+       SBRC    G,INT0\r
+       RCALL   TMP_INT00               ; THEN WE MUST PROCESS ANYWAY\r
+       SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+       SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+       LDI     G,$40\r
+       OUT     GIFR,G                  ; CLEAR PENDING INT0 RESULTING FROM\r
+       OUT     GIMSK,G                 ; ACTIVITY ON PIN, AND ENABLE INT0\r
+       CBI     DDRD,2                  ; SET BIT 2 TO INPUT TO START DISCHARGE\r
+       CBI     PORTD,2                 ; AND REMOVE PULLUP\r
+       IN      G,TCNT1L                ; GET STARTING COUNT FROM TIMER1\r
+       STS     DTMP,G\r
+       IN      G,TCNT1H                ; NOW HIGH BYTE\r
+       STS     DTMP+1,G\r
+       SEI\r
+       ; %\r
+\r
+       LDS     G,WGTLST                ; TEST DIRECTION OF CHANGE\r
+       CP      H,G                     ; DIFFERENCE NOW IN H|I|J\r
+       LDS     G,WGTLST+1\r
+       CPC     I,G\r
+       LDS     G,WGTLST+2\r
+       CPC     J,G\r
+\r
+       STS     WGTLST,H                ; AND SAVE SAMPLE FOR NEXT CYCLE\r
+       STS     WGTLST+1,I\r
+       STS     WGTLST+2,J\r
+\r
+       MOV     G,CYC_1                 ; CYCLE COUNT, NOT INCLUDING CURRENT\r
+       INC     CYC_1                   ; INCLUDE CURRENT CYCLE\r
+       BRCS    DEC0                    ; NOW LOOK AT CHANGE\r
+       CBR     FLAGS,1<<DIR            ; IF INCREASING\r
+       RJMP    CONT\r
+DEC0:  SBRC    FLAGS,DIR               ; IF DECREASING\r
+       RJMP    DEC1\r
+       SBR     FLAGS,1<<DIR            ;    BUT INCREASING LAST TIME\r
+       RJMP    PEAK                    ; THEN PROCESS PEAK\r
+DEC1:  SBR     FLAGS,1<<DIR\r
+CONT:  CPI     G,CYC_MAX-1\r
+       BRLO    NOPEAK                  ; LIMIT TO CYC_MAX GROUPS OF 16 CYCLES\r
+PEAK:  CPI     G,CYC_MIN-1             ; NEVER DETECT PEAKS CLOSER THAN CYC_MIN\r
+       BRLO    NOPEAK\r
+\r
+       LDI     H,0\r
+       SUBI    G,LOW(-1)\r
+       SBCI    H,HIGH(-1)              ; ALLOW H:G TO INCREMENT UP TO $100\r
+       STS     F2,G                    ; TRANSFER CYCLE COUNT TO FOREGROUND F2\r
+       STS     F2+1,H\r
+\r
+       CLR     CYC_1                   ; INITIALISE CYCLE COUNT\r
+\r
+       LDI     XL,LOW(WGT)             ; TRANSFER DATA TO OUTPUT BUFFER\r
+       CLR     G\r
+\r
+       LDI     YL,LOW(GMS)             ; WGHT DATA\r
+       LDI     H,3\r
+TRANSFER_0:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_0\r
+\r
+       LDI     YL,LOW(F0)              ; TEMP DATA\r
+       LDI     H,3\r
+TRANSFER_1:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_1\r
+\r
+       LDI     YL,LOW(F3)              ; TILT DATA\r
+       LDI     H,8\r
+TRANSFER_2:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_2\r
+\r
+       SBR     FLAGS,1<<NEWDAT         ; FLAG NEW DATA TO FOREGROUND\r
+\r
+NOPEAK:        LDS     G,WGT                   ; DIFFERENCE NOW IN WGTLST, ADD TO WGT\r
+       LDS     H,WGTLST\r
+       ADD     G,H\r
+       STS     WGT,G\r
+       LDS     G,WGT+1\r
+       LDS     H,WGTLST+1\r
+       ADC     G,H\r
+       STS     WGT+1,G\r
+       LDS     G,WGT+2\r
+       LDS     H,WGTLST+2\r
+       ADC     G,H\r
+       STS     WGT+2,G\r
+\r
+       CLI\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,BOMB              ; TILT MEASUREMENT STILL IN PROGRESS?\r
+       RETI\r
+\r
+       POP     G                       ; YES, TILT SENSOR MUST HAVE FAILED\r
+       POP     G                       ;      SO FIX STACK\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_ASTERISK\r
+ LDI A,'*'\r
+ RCALL TX_CHAR\r
+SKIP_ASTERISK:\r
+ POP A\r
+       RJMP    ABORT_TLT               ;      AND ABORT TILT MEASUREMENT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+TMP_INT:\r
+       IN      SR,SREG\r
+       RCALL   TMP_INT0\r
+       PUSH    SR\r
+\r
+       CLR     I\r
+       OUT     GIMSK,I                 ; DISABLE INT0 INTERRUPTS\r
+\r
+;TILT:                                 ; TILT, EACH DIRECTION SEQUENTIALLY\r
+       SBR     FLAGS,1<<BOMB           ; BOMB OUT ON 16TH WEIGHT INTERRUPT\r
+       SEI\r
+\r
+       LDI     G,-110                  ; LIMIT TO 50uSEC (FULL PERIOD 20KHZ)\r
+       LDI     H,-55                   ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0:   INC     G                       ; WAIT FOR LOW ON WGT TO SYNCHRONISE\r
+       BREQ    TL2\r
+       SBIC    PINB,0\r
+       RJMP    TL0\r
+TL1:   INC     G                       ; WAIT FOR HIGH ON WGT,\r
+       BREQ    TL2                     ; TO MEASURE TIME TO EDGE\r
+       SBIS    PINB,0\r
+       RJMP    TL1\r
+TL2:   INC     H                       ; WAIT FOR LOW ON WGT,\r
+       BREQ    TL3                     ; TO MEASURE PERIOD/2\r
+       SBIC    PINB,0\r
+       RJMP    TL2\r
+TL3:\r
+\r
+       SUBI    G,-110\r
+       SUBI    H,-55\r
+; OUT UDR,G\r
+; OUT UDR,H\r
+       LDS     I,TMP_PHASE\r
+       SUB     G,H                     ; H = PERIOD/2\r
+       BRLO    PHASE_INCREASE          ; SERVO TOWARDS G = 0\r
+;PHASE_DECREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,1\r
+       BRSH    PHASE_SAVE\r
+       ADD     I,H\r
+       RJMP    PHASE_SAVE\r
+PHASE_INCREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,-1\r
+       CP      I,H\r
+       BRLO    PHASE_SAVE\r
+       SUB     I,H\r
+PHASE_SAVE:\r
+       STS     TMP_PHASE,I\r
+\r
+       LDI     G,132                   ; DESIRED PULSE LENGTH, 60 uSEC\r
+MOD_LOOP:\r
+       SUB     G,H                     ; H = AT LEAST 1 BY ALGORITHM ABOVE\r
+       BRSH    MOD_LOOP\r
+\r
+PULSE_DELAY_0:\r
+       RJMP    PULSE_DELAY_1\r
+PULSE_DELAY_1:\r
+       INC     G\r
+       BRNE    PULSE_DELAY_0           ; DELAY H - (132 MOD H) BEFORE TURN ON\r
+\r
+       SBI     PORTD,3                 ; TURN ON PULSE\r
+\r
+       LDI     G,110*5/3               ; SLIGHTLY LESS THAN PULSE, 50 uSEC\r
+PULSE_DELAY_3:\r
+       DEC     G\r
+       BRNE    PULSE_DELAY_3\r
+\r
+;      MOV     H,CYC_0\r
+;      SUBI    H,-3                    ; FOR 3 WGT CYCLES\r
+;      LDI     G,0\r
+;TL4:  DEC     G\r
+;      BREQ    TL5\r
+;      CP      CYC_0,H\r
+;      BRNE    TL4\r
+;TL5:\r
+\r
+;      SBI     PORTD,3                 ; TURN ON PULSE\r
+;      LDI     G,160                   ; FOR ABOUT 60uSEC (G=110 IS TOO SHORT)\r
+;TLTDLY:\r
+;      DEC     G\r
+;      BRNE    TLTDLY\r
+\r
+       LDI     G,55                    ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0X:  DEC     G                       ; AND WAIT FOR LOW ON WGT TO ENSURE AT\r
+       BREQ    TOO_LONG                ; LEAST 1/2 CYCLE OF WGT HIGH, TO\r
+       SBIC    PINB,0                  ; PERFORM TILT MEASUREMENT BEFORE NEXT\r
+       RJMP    TL0X                    ; WGT INTERRUPT\r
+TOO_LONG:\r
+\r
+       CBI     PORTD,3                 ; TURN PULSE OFF AGAIN\r
+       MOV     G,CYC_0                 ; WHICH DIRECTION ? (WHILE WAITING)\r
+       IN      H,TCNT1L                ; SAVE STARTING COUNT\r
+       SWAP    G\r
+       LSR     G\r
+       ANDI    G,$03                   ; 2 LOW ORDER BITS INDICATE TILT AXIS\r
+       MOV     K,ZL                    ; TEMPORARY SAVE\r
+\r
+       LDI     ZL,TLTL\r
+       BREQ    LEFT                    ; =0\r
+       DEC     G\r
+       LDI     ZL,TLTR\r
+       BREQ    RIGHT                   ; =1\r
+       DEC     G\r
+       LDI     ZL,TLTB\r
+       BREQ    BACK                    ; =2\r
+       LDI     ZL,TLTF\r
+FRONT: SBIS    PINB,2                  ; WAIT FOR EDGE\r
+       RJMP    FRONT\r
+       RJMP    TLT_AD\r
+BACK:  SBIS    PINC,5                  ; WAIT FOR EDGE\r
+       RJMP    BACK\r
+       RJMP    TLT_AD\r
+LEFT:  SBIS    PINC,4                  ; WAIT FOR EDGE\r
+       RJMP    LEFT\r
+       RJMP    TLT_AD\r
+RIGHT: SBIS    PINB,1                  ; WAIT FOR EDGE\r
+       RJMP    RIGHT\r
+       RJMP    TLT_AD                  ; EQUALISE TIME DELAY\r
+TLT_AD:        IN      G,TCNT1L                ; GET ENDING COUNT\r
+       SUB     G,H                     ; CALCULATE INCREASE IN COUNT\r
+;PUSH G\r
+       LD      I,Z                     ; GET CURRENT ACCUMULATION\r
+       ADD     I,G                     ; ADD NEW READING\r
+       ST      Z+,I                    ; AND SAVE\r
+       LDI     G,0\r
+       LD      I,Z                     ; NOW HIGH BYTE\r
+       ADC     I,G                     ; G=0 FROM ABOVE\r
+       ST      Z+,I\r
+;POP G\r
+;CPI   ZL,TLTF\r
+;BRNE  ABORT_TLT\r
+;PUSH  A\r
+;PUSH  D\r
+;MOV   A,G\r
+;RCALL CONV_TO_HEX\r
+;LDI   A,$20\r
+;RCALL TX_CHAR\r
+;POP   D\r
+;POP   A\r
+\r
+       CLI\r
+\r
+ABORT_TLT:                             ; ENTER HERE WITH INTERRUPTS DISABLED\r
+       CBR     FLAGS,1<<BOMB           ; WE WILL NOT BOMB OUT ON WEIGHT INT\r
+       MOV     ZL,K                    ; RESTORE ZL\r
+\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+TMP_INT00:\r
+ PUSH A\r
+ LDS A,TX_COUNT\r
+ CPI A,TX_SIZE\r
+ BRSH SKIP_HASH\r
+ LDI A,'#'\r
+ RCALL TX_CHAR\r
+SKIP_HASH:\r
+ POP A\r
+\r
+TMP_INT0:\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET ENDING COUNT\r
+       LDS     I,DTMP                  ; RETRIEVE STARTING COUNT\r
+       SUB     G,I                     ; CALCULATE END-START DIFFERENCE\r
+       IN      H,TCNT1H                ; NOW HIGH BYTE\r
+       LDS     I,DTMP+1\r
+       SBC     H,I                     ; G|H NOW HAS DIFFERENCE COUNT\r
+\r
+       LDS     I,TMP                   ; ACCUMULATE DIFFERENCE COUNT\r
+       ADD     I,G\r
+       STS     TMP,I\r
+       LDS     I,TMP+1\r
+       ADC     I,H\r
+       STS     TMP+1,I\r
+       BRCC    DONE_TMP\r
+       LDS     I,TMP+2                 ; ADJUST HIGH ORDER BYTE IF CARRY\r
+       INC     I\r
+       STS     TMP+2,I\r
+\r
+DONE_TMP:\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SHOW_FA:\r
+;      MOV     A,FA3\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA2\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA1\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA0\r
+;      RCALL   CONV_TO_HEX\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RET\r
+;\r
+;CONV_TO_HEX:                          ; ENTER WITH BYTE IN A\r
+;      MOV     D,A\r
+;      SWAP    A\r
+;      RCALL   NIBL\r
+;      MOV     A,D\r
+;NIBL: ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,':'\r
+;      BRMI    NIBL0\r
+;      SUBI    A,-$07\r
+;NIBL0:\r
+;      RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+RX_WAIT:\r
+       MRX_WAIT                        ; FALLS OUT INTO RX_CHAR\r
+RX_CHAR:\r
+       MRX_CHAR                        ; FOR DIAGS, FALLS OUT INTO TX_WAIT\r
+TX_WAIT:\r
+       MTX_WAIT                        ; FALLS OUT INTO TX_CHAR\r
+TX_CHAR:\r
+       MTX_CHAR                        ; FALLS OUT INTO TX_CHAR_RET\r
+TX_CHAR_RET:\r
+       MTX_CHAR_RET                    ; DOES NOT FALL OUT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY                       ; DOES NOT FALL OUT\r
+\r
+RX_COMPLETE:\r
+       MRX_COMPLETE                    ; DOES NOT FALL OUT\r
+\r
+TX_COMPLETE:\r
+T0_OVERFLOW:\r
+       MTX_COMPLETE                    ; FALLS OUT INTO API_ERROR\r
+API_ERROR:\r
+       MAPI_ERROR                      ; FALLS OUT INTO API_REVERT\r
+API_REVERT:\r
+       MAPI_REVERT                     ; FALLS OUT INTO API_DONE\r
+API_DONE:\r
+       MAPI_DONE                       ; DOES NOT FALL OUT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      FLOATING POINT MATHS\r
+\r
+;      MS BYTE                     LS BYTE\r
+;      seeeeeee emmmmmmm mmmmmmmm mmmmmmmm IEEE754 FORMAT (FLASH/EEPROM)\r
+;      eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm INTERNAL FORMAT (SRAM/REGISTERS)\r
+;      VALUE =+1.mmmmmmm mmmmmmmm mmmmmmmm * 2^eeeeeeee\r
+\r
+;      WHERE:  s = SIGN BIT (OVERLAYING THE IMPLICIT 1 IN INTERNAL FORMAT)\r
+;              e = EXPONENT BITS WITH BIAS OF 127\r
+;              m = MANTISSA BITS\r
+\r
+;      NOTE:   IEEE754 FORMAT USED FOR FLASH/EEPROM CONSTANTS & SERIAL I/O\r
+;              INTERNAL FORMAT USED FOR SRAM ARGUMENTS & FA, FB\r
+;              FLDF & FLDE MACROS CONVERT FROM IEEE754 TO INTERNAL FORMAT\r
+\r
+;      MANTISSA:       $000000 TO $FFFFFF      REPRESENTING 1 =< MANTISSA < 2\r
+;      EXPONENT:       $00 TO $FF              REPRESENTING 2^-126 TO 2^128\r
+;                      $7F                     REPRESENTING 2^0\r
+\r
+;      NOTATION:       F0, F1, F2, F3          FP ARGUMENTS IN SRAM\r
+;                      FA3 FA2 FA1 FA0         FP REGISTER A (PRINCIPAL)\r
+;                      FB3 FB2 FB1 FB0         FP REGISTER B (ARGUMENT)\r
+;                          FC2 FC1 FC0         FP REGISTER C (AUXILIARY)\r
+\r
+;      IN GENERAL:     X IS USED TO INDEX FA, FB, ETC (FP REGISTERS)\r
+;                      Y IS USED TO INDEX F0, F1, ETC (FP SRAM ARGUMENTS)\r
+;                      Z IS USED TO INDEX K0, K1, ETC (FP FLASH/EEPROM CONSTANTS)\r
+\r
+;      REGISTER USAGE: GENERAL PURPOSE REGISTERS A,B,D\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      MISCELLANEOUS SUBROUTINES\r
+\r
+.EQU   BIAS    =$7F                    ; EXPONENT BIAS = 127\r
+\r
+LDS_FA:        LD      FA0,Y+                  ; LOAD FA FROM SRAM ARGUMENT\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+       LD      FA3,Y+\r
+       RET\r
+\r
+LDS_FB:        LD      FB0,Y+                  ; LOAD FB FROM SRAM ARGUMENT\r
+       LD      FB1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FB2,Y+\r
+       LD      FB3,Y+\r
+       RET\r
+\r
+LDF_FA:        LDI     XL,FA                   ; LOAD FA FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FA:        ROL     FA2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FA3\r
+       ROR     FA2\r
+       RET\r
+\r
+LDF_FB:        LDI     XL,FB                   ; LOAD FB FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FB:        ROL     FB2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FB3\r
+       ROR     FB2\r
+       RET\r
+\r
+LDF:   LDI     A,4                     ; LOAD FP REGISTER INDEXED BY XL\r
+LDF0:  LPM                             ; FROM FLASH CONSTANT\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDF0\r
+       RET\r
+\r
+LDE_FB:        LDI     XL,FB                   ; LOAD FB FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FB                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE_FA:        LDI     XL,FA                   ; LOAD FA FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FA                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE:   LDI     A,4\r
+LDE0:  RCALL   LDE1                    ; WAIT FOR WRITE IN PROGRESS\r
+       OUT     EEAR,ZL                 ; SET UP ADDRESS\r
+       SBI     EECR,EERE               ; ASSERT READ STROBE\r
+       IN      R0,EEDR\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDE0\r
+       RET\r
+\r
+LDE1:  SBIS    EECR,EEWE               ; IF WRITE IN PROGRESS\r
+       RET\r
+       RJMP    LDE1                    ; THEN WAIT\r
+\r
+STS_FA:        ST      Y+,FA0                  ; STORE FA REGISTER TO SRAM ARGUMENT\r
+       ST      Y+,FA1                  ; Y POINTS TO DESTINATION\r
+       ST      Y+,FA2\r
+       ST      Y+,FA3\r
+       RET\r
+\r
+COM_FA:        COM     FA2                     ; ONES COMPLEMENT FA\r
+       COM     FA1\r
+       COM     FA0\r
+       RET\r
+\r
+ROR_FA:        ROR     FA2                     ; ROTATE RIGHT FA,1\r
+       ROR     FA1\r
+       ROR     FA0\r
+       RET\r
+\r
+LSL_FA:        LSL     FA0                     ; SHIFT LEFT FA,1\r
+       ROL     FA1\r
+       ROL     FA2\r
+       RET\r
+\r
+SUB_FB:        SUB     FA0,FB0                 ; FA=FA-FB\r
+       SBC     FA1,FB1\r
+       SBC     FA2,FB2\r
+       RET\r
+\r
+ADD_FB:        ADD     FA0,FB0                 ; FA=FA+FB\r
+       ADC     FA1,FB1\r
+       ADC     FA2,FB2\r
+       RET\r
+\r
+SGN_FA:        BST     FA2,7                   ; SAVE SIGN BIT\r
+       LDI     B,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,B\r
+       RET\r
+\r
+SGNS:  MOV     A,FB2                   ; COMPUTE SIGN OF RESULT\r
+       EOR     A,FA2\r
+       BST     A,7                     ; SAVE FOR LATER\r
+       LDI     A,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,A\r
+       OR      FB2,A\r
+       LDI     A,BIAS                  ; SUBTRACT BIAS\r
+       SUB     FA3,A\r
+       SUB     FB3,A\r
+       RET\r
+\r
+FIX_FA:        LDI     A,23+BIAS               ; TRUNCATE FA AND RETURN INTEGER PART\r
+       SUB     A,FA3\r
+       BRCS    FIX0                    ; IF EXPONENT>=24 THEN RETURN\r
+       CPI     A,24                    ; IF EXPONENT<0\r
+       BRCC    GO_MIN_FA               ; THEN FA=0\r
+       RCALL   SGN_FA                  ; SAVE SIGN & INSERT IMPLICIT BIT\r
+FIX2:  LSR     FA2                     ; SHIFT MANTISSA RIGHT\r
+       ROR     FA1\r
+       ROR     FA0\r
+       DEC     A                       ; (24-EXPONENT) BITS\r
+       BRNE    FIX2\r
+FIX0:  RET\r
+\r
+GO_MIN_FA:\r
+       RJMP    MIN_FA\r
+\r
+; REMOVED TO SAVE FLASH %\r
+;CHSS: LDD     B,Y+2                   ; CHANGE SIGN OF SRAM ARGUMENT\r
+;      LDI     A,$80\r
+;      EOR     B,A                     ; TOGGLE SIGN BIT\r
+;      STD     Y+2,B                   ; AND SAVE\r
+;      RET\r
+; %\r
+\r
+LDS2_FA:LD     FA0,Y+                  ; LOAD FA WITH 2 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       CLR     FA2\r
+       RJMP    LD3_FA\r
+LDS3_FA:LD     FA0,Y+                  ; LOAD FA WITH 3 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+LD3_FA:        CLT                             ; SET SIGN POSITIVE\r
+LD3:   LDI     A,23+BIAS               ; SET EXPONENT AND FALL INTO NORMALIZE\r
+       MOV     FA3,A\r
+\r
+NRM_FA:        MOV     A,FA0                   ; NORMALIZE FA REGISTER\r
+       OR      A,FA1\r
+       OR      A,FA2\r
+       BREQ    NRM3                    ; IF ZERO THEN CLEAR EXPONENT & EXIT\r
+NRM0:  TST     FA2\r
+NRM1:  BRMI    NRM2                    ; IF MANTISSA DENORMALIZED\r
+       DEC     FA3                     ; THEN ADJUST EXPONENT\r
+       BREQ    MIN_FA                  ;      IF UNDERFLOW THEN RETURN MIN\r
+       RCALL   LSL_FA                  ;      ELSE SHIFT MANTISSA LEFT\r
+       RJMP    NRM1\r
+NRM2:  BLD     FA2,7                   ; ELSE OVERLAY WITH SIGN BIT\r
+       RET\r
+NRM3:  CLR     FA3\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+ADD_FA:        RCALL   LDS_FB                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+ADD0:  TST     FB3                     ; IF FB=0\r
+       BREQ    RET0                    ; THEN DO NOTHING\r
+       TST     FA3                     ; IF FA=0\r
+       BREQ    SWP_FA                  ; THEN SWAP FA,FB AND EXIT\r
+       MOV     D,FB2                   ; GET SIGN OF ARGUMENT\r
+       EOR     D,FA2                   ; BIT 7 SET IF SIGNS DIFFERENT\r
+       MOV     A,FA3\r
+       SUB     A,FB3                   ; IF FA EXPONENT < ARG EXPONENT\r
+       BRCC    ADD1\r
+       NEG     A                       ; THEN (EXP DIFF)=-(EXP DIFF)\r
+       RCALL   SWP_FA                  ;      SWAP FA,FB\r
+ADD1:  CPI     A,24                    ; IF EXP DIFFERENCE >= 24\r
+       BRCC    RET0                    ; THEN DO NOTHING\r
+       RCALL   SGN_FA                  ; ELSE SAVE SIGN & INSERT IMPLICIT BIT\r
+       OR      FB2,B                   ;      INSERT IMPLICIT BIT IN FB ALSO\r
+       TST     A\r
+ADD2:  BREQ    ADD3\r
+       LSR     FB2                     ;      SHIFT FB RIGHT TO ALIGN\r
+       ROR     FB1\r
+       ROR     FB0\r
+       DEC     A\r
+       RJMP    ADD2\r
+ADD3:  TST     D                       ; IF SIGNS SAME\r
+       BRMI    ADD5\r
+       RCALL   ADD_FB                  ; THEN FA=FA+FB\r
+       BRCC    ADD4                    ;      IF CARRY\r
+       RCALL   ROR_FA                  ;      THEN RIGHT SHIFT\r
+       INC     FA3                     ;           INC EXPONENT\r
+       BREQ    MAX_FA                  ;           IF OVERFLOW RETURN MAX\r
+ADD4:  BLD     FA2,7                   ;           ELSE OVERLAY WITH SIGN BIT\r
+RET0:  RET\r
+ADD5:  RCALL   SUB_FB                  ; ELSE FA=FA-FB\r
+       BREQ    NRM3                    ;      IF ZERO THEN CLEAR EXP & EXIT\r
+       BRCC    NRM0                    ;      IF CARRY\r
+       RCALL   COM_FA                  ;      THEN FA=-FA\r
+       LDI     A,-1\r
+       SUB     FA0,A\r
+       SBC     FA1,A\r
+       SBC     FA2,A\r
+       BLD     A,7                     ;      TOGGLE SIGN BIT\r
+       COM     A\r
+       BST     A,7\r
+       RJMP    NRM0                    ;      NORMALIZE\r
+\r
+ADDE_FA:RCALL  LDE_FB                  ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+ADDF_FA:RCALL  LDF_FB                  ; ADD FLASH CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+SUB_FA:        RCALL   LDS_FB                  ; SUBTRACT SRAM ARGUMENT FROM FA REG\r
+SUB0:  LDI     A,$80\r
+       EOR     FB2,A                   ; TOGGLE SIGN\r
+       RJMP    ADD0\r
+\r
+SUBE_FA:RCALL  LDE_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+SUBF_FA:RCALL  LDF_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+; VARIOUS SUBROUTINES\r
+\r
+MIN_FA:        CLR     FA3                     ; FA=0\r
+CLR_FA:        CLR     FA2                     ; CLEAR FA\r
+       CLR     FA1\r
+       CLR     FA0\r
+       RET\r
+\r
+SWP_FA:        RCALL   SWP0                    ; SWAP CONTENTS OF FA & FB\r
+       RCALL   SWP1\r
+SWP0:  EOR     FA0,FB0\r
+       EOR     FA1,FB1\r
+       EOR     FA2,FB2\r
+       EOR     FA3,FB3\r
+       RET\r
+SWP1:  EOR     FB0,FA0\r
+       EOR     FB1,FA1\r
+       EOR     FB2,FA2\r
+       EOR     FB3,FA3\r
+       RET\r
+\r
+OUTRNG:        BRPL    MIN_FA                  ; UNDERFLOW\r
+;      RJMP    MAX_FA                  ; OVERFLOW\r
+\r
+;      UNDERFLOW BY A LITTLE:    $80 + $FF =   $7F     POSITIVE\r
+;                               -128 -   1 =  -129\r
+;      UNDERFLOW BY A LOT:       $80 + $80 =   $00     POSITIVE\r
+;                               -128 - 128 =  -256\r
+;      OVERFLOW BY A LITTLE:     $7F + $0F =   $80     NEGATIVE\r
+;                                127 +   1 =   128\r
+;      OVERFLOW BY A LOT:        $7F + $7F =   $FE     NEGATIVE\r
+;                                127 + 127 =   254\r
+\r
+MAX_FA:        CLR     FA3                     ; FA=MAX\r
+       COM     FA3\r
+       MOV     FA2,FA3\r
+       MOV     FA1,FA3\r
+       MOV     FA0,FA3\r
+       BLD     FA2,7                   ; SET SIGN\r
+       RET\r
+\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+MUL_FA:        RCALL   LDS_FB                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+MUL0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MIN_FA                  ; THEN FA=0\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT & REMOVE BIAS\r
+       ADD     FA3,FB3                 ; ADD EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; ELSE RESTORE BIAS\r
+       MOV     FC0,FA0                 ; FC=FA\r
+       MOV     FC1,FA1\r
+       MOV     FC2,FA2\r
+       RCALL   CLR_FA                  ; FA=0\r
+       CLC\r
+       LDI     A,24                    ; LOOP COUNTER\r
+MUL1:  RCALL   ROR_FA                  ; RIGHT SHIFT\r
+       LSR     FC2\r
+       ROR     FC1\r
+       ROR     FC0\r
+       BRCC    MUL2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+MUL2:  DEC     A\r
+       BRNE    MUL1\r
+       BRCC    MUL3                    ; IF CARRY\r
+       RCALL   ROR_FA                  ; THEN NORMALIZE BY 1 BIT\r
+       INC     FA3                     ;      ADJUST EXPONENT\r
+       BREQ    MAX_FA                  ;      IF OVERFLOW RETURN MAX\r
+MUL3:  BLD     FA2,7                   ; ELSE RESTORE SIGN\r
+RET1:  RET\r
+\r
+MULE_FA:RCALL  LDE_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+MULF_FA:RCALL  LDF_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+DIV_FA:        RCALL   LDS_FB                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+DIV0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       BST     FA2,7                   ; GET SIGN OF FA\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MAX_FA                  ; THEN RETURN MAX\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT\r
+       SUB     FA3,FB3                 ; SUBTRACT EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; RESTORE BIAS\r
+       LSR     FA2                     ; DENORMALIZE SO THAT CARRY IS NOT LOST\r
+       ROR     FA1                     ; DURING SUBTRACTION AND SUBSEQUENT ADD\r
+       ROR     FA0\r
+       LSR     FB2\r
+       ROR     FB1\r
+       ROR     FB0\r
+       LDI     A,24                    ; LOOP COUNTER\r
+DIV1:  RCALL   SUB_FB                  ; FA=FA-FB\r
+       BRCC    DIV2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+DIV2:  ROL     FC0                     ; SHIFT CARRY INTO LSB\r
+       ROL     FC1\r
+       ROL     FC2\r
+       RCALL   LSL_FA\r
+       DEC     A\r
+       BRNE    DIV1\r
+       MOV     FA0,FC0                 ; FA=FC\r
+       MOV     FA1,FC1\r
+       MOV     FA2,FC2\r
+       RCALL   COM_FA                  ; SINCE CARRY WAS WRONG SENSE\r
+       RJMP    NRM0                    ; NORMALIZE & RESTORE SIGN\r
+\r
+DIVE_FA:RCALL  LDE_FB                  ; DIVIDE FA REGISTER BY EEPROM CONSTANT\r
+       RJMP    DIV0\r
+\r
+DIVF_FA:RCALL  LDF_FB                  ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       RJMP    DIV0\r
+\r
+CP_FA: RCALL   LDS_FB                  ; COMPARE FA WITH SRAM ARGUMENT\r
+CP0:   MOV     A,FA3                   ; FIRST CHECK FOR SPECIAL ZERO CASE\r
+       OR      A,FB3\r
+       BREQ    CP6                     ; FA=0, FB=0\r
+       MOV     A,FA2                   ; NOW, IF SIGNS DIFFERENT\r
+       EOR     A,FB2\r
+       BRMI    CP3                     ; THEN ANSWER DETERMINED BY THE SIGNS\r
+       BST     FA2,7                   ; ELSE SAVE SIGN FOR LATER\r
+       SUB     FB3,FA3                 ; TEST EXPONENT WITHOUT CORRUPTING FA\r
+       BRCS    CP2                     ; IF EXP FA > EXP FB\r
+       BRNE    CP1                     ; IF EXP FA < EXP FB\r
+       SUB     FB0,FA0                 ; IF EXPS EQUAL, MUST TEST MANTISSA\r
+       SBC     FB1,FA1\r
+       SBC     FB2,FA2\r
+       BRCS    CP2\r
+       BREQ    CP6\r
+CP1:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP4                     ; THEN CLEAR CARRY\r
+       RJMP    CP5                     ; ELSE SET CARRY\r
+CP2:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP5                     ; THEN SET CARRY\r
+       RJMP    CP4                     ; ELSE CLEAR CARRY\r
+CP3:   TST     FA2                     ; CHECK SIGN\r
+       BRMI    CP5\r
+CP4:   CLC                             ; FA > FB\r
+       CLZ\r
+       RET\r
+CP5:   SEC                             ; FA < FB\r
+       CLZ\r
+CP6:   RET                             ; FA = FB\r
+\r
+CPF_FA:        RCALL   LDF_FB                  ; COMPARE FA WITH FLASH CONSTANT\r
+       RJMP    CP0\r
+\r
+CPE_FA:        RCALL   LDE_FB                  ; COMPARE FA WITH EEPROM CONSTANT\r
+       RJMP    CP0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+SNDSTR:        ADIW    ZL,2                    ; OUTPUT STRING FROM FLASH\r
+STR0:  RCALL   STR1                    ; RETRIEVE MESSAGE\r
+       BRNE    STR0\r
+       RET\r
+STR1:  LPM                             ; GET NEXT CHARACTER\r
+       MOV     A,R0\r
+       RCALL   TX_WAIT\r
+       ADIW    ZL,1\r
+       DEC     D\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SNDASC:\r
+;      RCALL   EXP0                    ; SEND IN ASCII FORMAT\r
+;      INC     F                       ; DIGITS TO LEFT OF DECIMAL POINT\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;ASC0: DEC     F\r
+;      BREQ    EXP11\r
+;      RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    ASC0\r
+\r
+; CHARACTERIZE ONLY %\r
+SNDEXP:\r
+       PUSH    A                       ; SEPARATOR\r
+       RCALL   EXP0                    ; SEND EXPONENTIAL FORMAT +N.NNNNNNE+^^\r
+EXP5:  FCPF    KR0001                  ; IF N<.0001\r
+       BRCC    EXP6\r
+       FMLF    K100K                   ; THEN N=N*100K\r
+       SUBI    F,5                     ;      E=E-5\r
+       RJMP    EXP5\r
+EXP6:  FCPF    K1                      ; IF N<1\r
+       BRCC    EXP7\r
+       FMLF    K10                     ; THEN N=N*10\r
+       SUBI    F,1                     ;      E=E-1\r
+       RJMP    EXP6\r
+EXP7:  FADF    TLT1                    ; BY MEREST COINCIDENCE CLOSE TO 5.0E-7\r
+       RCALL   EXP3                    ; IN CASE WE JUMPED UP TO 10.000000\r
+       RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+       LDI     A,'.'\r
+       RCALL   TX_WAIT\r
+       LDI     E,6                     ; 7 SIGNIFICANT DIGITS IN ALL\r
+EXP8:  RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+       DEC     E\r
+       BRNE    EXP8\r
+       LDI     A,'0'                   ; 2 TRAILING ZEROS FOR COMPATIBILITY\r
+       RCALL   TX_WAIT                 ; WITH PREVIOUS CHARACTERIZE VERSION\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'E'                   ; NOW FOR THE EXPONENT\r
+       RCALL   TX_WAIT\r
+       LDI     A,'+'                   ; SEND SIGN\r
+       TST     F\r
+       BRPL    EXP9\r
+       LDI     A,'-'\r
+       NEG     F                       ; ABS(E)\r
+EXP9:  RCALL   TX_WAIT\r
+       LDI     A,'0'-1                 ; CONVERT MS DIGIT TO ASCII\r
+EXP10: INC     A\r
+       SUBI    F,10\r
+       BRPL    EXP10\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'+10                ; NOW LS DIGIT\r
+       ADD     A,F\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   TX_WAIT                 ; SEPARATOR\r
+EXP11: FLD     F0                      ; AND RESTORE FA\r
+       RET\r
+\r
+EXP0:  FST     F0                      ; ADJUST EXPONENT FOR ABS(N)>1\r
+       LDI     A,' '                   ; SEND SIGN (SPACE FOR +)\r
+       TST     FA2\r
+       BRPL    EXP1\r
+       LDI     A,'-'\r
+EXP1:  RCALL   TX_WAIT\r
+; %\r
+\r
+DIGN:  LDI     A,$7F\r
+       AND     FA2,A                   ; ABS(N)\r
+       CLR     F                       ; HOLDS ADJUSTED EXPONENT FOR 1<N<10\r
+EXP2:  FCPE    K10K ;FCPF K10K         ; IF N>10K\r
+       BRCS    EXP3\r
+       FMLF    KR0001                  ; THEN N=N/10K\r
+       ADDI    F,4                     ;      E=E+4\r
+       RJMP    EXP2\r
+EXP3:  FCPF    K10                     ; IF N>10\r
+       BRCS    EXP4\r
+       FMLF    KR1                     ; THEN N=N/10\r
+       SUBI    F,-1                    ;      E=E+1\r
+       RJMP    EXP3\r
+EXP4:  RET\r
+\r
+DGTN:  FSB     F1                      ; N=(N-I)*10\r
+       FMLF    K10                     ; REALLY N=(I-N)*10, SIGN UNIMPORTANT\r
+ FMLF K_1 ; LET'S BE SAFE\r
+DGT0:  FST     F1                      ; N (ADJUSTED)\r
+       RCALL   FIX_FA                  ; I=INT(N)\r
+       MOV     B,FA0                   ; SAVE LS DIGIT\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       LDI     A,'0'\r
+       ADD     A,B                     ; A = LS DIGIT IN ASCII\r
+       RJMP    TX_WAIT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+LDS_A_STATUS:\r
+       LDS     A,STATUS\r
+       RET\r
+\r
+SET_TRYZRO:\r
+       LDS     A,STATUS                ; THEN SET ZERO\r
+       SBR     A,1<<TRYZRO\r
+STS_STATUS_A:\r
+       STS     STATUS,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;\r
+;TOG_B4:\r
+;      RET\r
+;      SBIS    PORTB,4\r
+;      RJMP    TOG0\r
+;      CBI     PORTB,4                 ; FOR TESTING ONLY\r
+;      RET\r
+;TOG0: SBI     PORTB,4                 ; FOR TESTING ONLY\r
+\r
+\r
+; FOR LOCKUP TEST\r
+;      POP     G                       ; HIGH BYTE\r
+;      POP     H                       ; LOW BYTE\r
+;      PUSH    H\r
+;      PUSH    G\r
+\r
+;      LDI     H,'2'\r
+;      OUT     UDR,H\r
+;      LDI     G,'1'\r
+;      OUT     UDR,G\r
+\r
+;      MOV     G,H\r
+\r
+;      MOV     I,G\r
+;      SWAP    G\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL0\r
+;      SUBI    G,-$07\r
+;NIBLL0:       OUT     UDR,G\r
+;      MOV     G,I\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL1\r
+;      SUBI    G,-$07\r
+;NIBLL1:       OUT     UDR,G\r
+\r
+;      RET\r
+\r
+;      LDS     A,TEST_BUF              ; TESTING ONLY\r
+;      RCALL   CONV_TO_HEX\r
+\r
+;STACK_TEST:\r
+;      LDI     XL,RAMEND+1             ; STACK TEST\r
+;TST1:\r
+;      LD      A,-X\r
+;      RCALL   CONV_TO_HEX\r
+;      RCALL   SND_BUF\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   SND_BUF\r
+;      CPI     XL,$C8\r
+;      BRNE    TST1\r
+\r
+;STACK_TST:\r
+;      LDI     A,$55\r
+;      LDI     B,50\r
+;      LDI     YL,RAMEND-2\r
+;TST0: ST      -Y,A\r
+;      DEC     B\r
+;      BRNE    TST0\r
+\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/crcsubx.asm b/src/avr/crcsubx.asm
new file mode 100644 (file)
index 0000000..e0f007d
--- /dev/null
@@ -0,0 +1,87 @@
+; CRCSUB.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXTRN  GETSTRLOC:FAR\r
+EXTRN  GETSTRALLOC:FAR\r
+EXTRN  RLSSTRALLOC:FAR\r
+\r
+CODE   SEGMENT\r
+\r
+       ASSUME  CS:CODE,DS:CODE\r
+\r
+B      EQU     BYTE PTR\r
+W      EQU     WORD PTR\r
+D      EQU     DWORD PTR\r
+\r
+       JUMPS\r
+       LOCALS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;      CRC%=-1                         ' SEED\r
+;      F$="...."\r
+;      CALL CRC_CALCULATE(CRC%, F$)\r
+;      F$="...."\r
+;      CALL CRC_CALCULATE(CRC%, F$)\r
+;      F$="...."\r
+;      CALL CRC_CALCULATE(CRC%, F$)\r
+\r
+PUBLIC CRC_CALCULATE\r
+\r
+CRC_CALCULATE:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DS\r
+\r
+       LDS     SI,[BP+6]\r
+       LODSW\r
+       PUSH    AX\r
+       CALL    GETSTRLOC\r
+       JCXZ    @@L0\r
+\r
+       LDS     SI,[BP+10]\r
+       MOV     BX,[SI]                 ; CRC%\r
+\r
+       MOV     SI,AX\r
+       MOV     DS,DX\r
+\r
+       ; ENTER WITH\r
+       ; INITIAL CRC IN BX\r
+       ; CX = BYTE COUNT\r
+       ; SI --> BUFFER\r
+       ; RETURN WITH\r
+       ; NEW CRC IN BX\r
+\r
+       CLD\r
+       MOV     DX,1021H\r
+@@L1:  LODSB\r
+       XOR     BH,AL\r
+       REPT    8\r
+       SHL     BX,1\r
+       JNC     $+4\r
+       XOR     BX,DX\r
+       ENDM\r
+       LOOP    @@L1\r
+\r
+       LDS     SI,[BP+10]\r
+       MOV     [SI],BX                 ; CRC%\r
+\r
+@@L0:  POP     DS\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CODE   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+DATA   SEGMENT\r
+DATA   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       END\r
diff --git a/src/avr/crcsubx.inc b/src/avr/crcsubx.inc
new file mode 100644 (file)
index 0000000..d8d04bc
--- /dev/null
@@ -0,0 +1,10 @@
+' CRCSUBX.INC\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+$LINK "CRCSUBX.OBJ"\r
+\r
+DECLARE SUB CRC_CALCULATE(INTEGER,STRING)\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cs128v0.asm b/src/avr/cs128v0.asm
new file mode 100644 (file)
index 0000000..ff82c2f
--- /dev/null
@@ -0,0 +1,3076 @@
+;      CS128V0.ASM\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "API.INC"\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     PAGE,YH\r
+       RCALL   ADRYP                   ; AND SET PAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+       OUT     PORTC,@0                ; SET L ADDRESS FOR DSPRAM\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       SEI\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV          ; AND THIS\r
+       BST     @0,1                    ; A15\r
+       BLD     R19,7 ;1\r
+       BST     @0,0                    ; A14\r
+       BLD     R19,6 ;0\r
+       SEI\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV  ; AND THIS\r
+       BST     @1,7                    ; A15\r
+       BLD     R19,7 ;1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,6 ;0\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       SBI     PORTB,0\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,0\r
+       CBI     PORTB,1\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,0                 ; CS_ON\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,0                 ; CS_ON\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =$FB35\r
+.EQU   T1_FULL_SCALE   =$FC2F\r
+\r
+.EQU   VEE_MIN         =$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         =$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =$FE00\r
+\r
+.EQU   CONTRAST_LONG   =$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  =$FFC0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =$FE00\r
+\r
+.EQU   VCC_NOMINAL     =$FCDC\r
+\r
+; WITH VCC = $FCDC FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FD18 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FD78 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FD48\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+.EQU   CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    =$FF80 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =$FD80\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$80\r
+.EQU   CHARACTER_SETS  =4\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$10\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF    BOXSIZEX       =R7             ; ASSIGNED TWICE\r
+.DEF    BOXSIZEY       =R8             ; ASSIGNED TWICE\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   0=BACKLIGHT INVERSION OFF       1=BACKLIGHT INVERSION ON\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+BUZZ_TIME:     .BYTE   1       ; 10B\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+DEBOUNCE:      .BYTE   1\r
+ROW_INDEX:     .BYTE   1\r
+ROW_BITMAP:    .BYTE   2\r
+LATCH10_SAV:   .BYTE   1\r
+LATCH11_SAV:   .BYTE   1\r
+LATCH12_SAV:   .BYTE   1\r
+PAGE:          .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+CLOCKING_PTR:  .BYTE   2\r
+\r
+; MUST CONVERT TO USE DRAW_CHAR_TTY ROUTINE\r
+;CHAR_X:       .BYTE   1\r
+;CHAR_Y:       .BYTE   1\r
+;CHAR_PTR:     .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TOUCH_KEY:     .BYTE   1\r
+TOUCH_X:       .BYTE   1\r
+TOUCH_Y:       .BYTE   1\r
+TOUCH_XX:      .BYTE   1\r
+TOUCH_YY:      .BYTE   1\r
+\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+SCAN_CNT:      .BYTE   1\r
+LATCH5_SAV:    .BYTE   1\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   1\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+AVECNT:                .BYTE   1\r
+AVEVCC:                .BYTE   1\r
+AVEVCCL:       .BYTE   1\r
+AVEVCCH:       .BYTE   1\r
+AVEVEE:                .BYTE   1\r
+AVEVEEL:       .BYTE   1\r
+AVEVEEH:       .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $0000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RETI                            ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_TIM1_OVF\r
+       RJMP    GO_TIM0_OVF\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+RESTART_ENTRY:\r
+       ;LDI    F,8\r
+       ;OUT    ASSR,F                  ; TIMER 2 CLOCKED BY 32 KHZ XTAL\r
+       ;LDI    F,1\r
+       ;OUT    TCCR2,F                 ; TIMER 2 DIVIDE BY 1\r
+       LDI     F,$00 ;$40\r
+       OUT     TIMSK,F                 ; TIMER 2 OVERFLOW INTERRUPTS ENABLED\r
+       ;LDI    F,$00\r
+       OUT     GIMSK,F\r
+\r
+       LDI     F,$F8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       LDI     F,$B8 ;$F8\r
+       OUT     PORTD,F\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$03                   ; CS, WE HI, LEs ALL LO\r
+       OUT     PORTB,F\r
+\r
+       LDI     F,$10                   ; LED COMMON OFF, SPEAKER OFF\r
+       ;OUT    PORTC,F\r
+       ;SBI    PORTB,2\r
+       ;CBI    PORTB,2\r
+       STS     LATCH12_SAV,F\r
+\r
+       LDI     F,$20\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ENABLED\r
+\r
+       INIT_API_BUS\r
+\r
+;      LDI     D,$18                   ; A18|A17|A16|A15|A14=11000\r
+;      OUT     PORTA,D                 ; CL1=M=FLM=0\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,D\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+;RTNCDE: LDIZ  RTN_CODE                ; POINT Z TO FLASH\r
+;      LDIX    RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+;      LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET PAGE\r
+;CDE0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+;CDE1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+;      LPM                             ; GET DATA FROM FLASH\r
+; CLR R0 ; TEMPORARY CLEAR KB\r
+;      RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+;      DEC     XL\r
+;      BREQ    RTNCDE_END              ; CHECK IF ALL DONE\r
+;      ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+;      INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+;      MOV     A,YL ;\r
+;      ANDI    A,$3F ;YL,$3F\r
+;      BRNE    CDE1\r
+;      SUBI    YL,$40 ;\r
+;      INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+;      RJMP    CDE0\r
+;RTNCDE_END:\r
+\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       LDI     A,$10\r
+       STS     BUZZ_TIME,A             ; SHORT BEEP ON STARTUP\r
+\r
+       CLR     A\r
+       STS     SCAN_CNT,A              ; START ON FIRST LED / PHOTODIODE PAIR\r
+       STS     CLOCKING_PTR,A\r
+       STS     CLOCKING_PTR+1,A        ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       CBI     PORTD,4                 ; TURN TRANSISTOR ON (PULL DOWN VSWT)\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       IN      D,PORTD ;LDS D,LATCH10_SAV\r
+       ANDI    D,$BF                   ; DROP M\r
+       OUT     PORTD,D ;PORTA,D\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,D\r
+\r
+       LDI     D,$40\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 0 / 1 INTERRUPTS\r
+\r
+       LDI     D,0\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+;      LDI     F,$18\r
+;      STS     TURNON_COUNT,F          ; .1 SECOND TO BREAK, .2 SECOND TO MAKE\r
+;\r
+;      SEI\r
+;\r
+;SLEEP_LOOP:\r
+;      SLEEP\r
+;\r
+;      LDS     F,TURNON_COUNT\r
+;      TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+;      BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+;\r
+;      CLI\r
+;      RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+       LDI     D,$6A\r
+       OUT     MCUCR,D                 ; SE=0 SM1:SM0=10 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP:\r
+;      LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
+;      LDS     YL,LATCH10_SAV\r
+;      ANDI    YL,$E0\r
+;      OR      YH,YL\r
+;      OUT     PORTA,YH\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,PAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     PAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+       CPI     A,$0A\r
+       RJEQ    LF\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'A'\r
+       RJEQ    SET_BACKLIGHT\r
+       CPI     A,'B'\r
+       RJEQ    BUZZER\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       RJEQ    CONTRAST_CONTROL\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+BUZZER:        RCALL   RX_WAIT\r
+       STS     BUZZ_TIME,A             ; SAVE REQUESTED DURATION\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_BACKLIGHT:\r
+       RCALL   RX_WAIT\r
+;      ANDI    A,1\r
+;      BRNE    SET_BACKLIGHT_ON\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+;      CBI     PORTC,7\r
+;      CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+;      RJMP    MAIN_LOOP\r
+;SET_BACKLIGHT_ON:\r
+;      LDI     A,1<<7\r
+;      OR      FLAGS,A                 ; ENABLE INTERRUPT BACKLIGHT INVERSION\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    RCALL   CARRIAGE_RET\r
+       RJMP    MAIN_LOOP\r
+\r
+CARRIAGE_RET:\r
+       CLR     CURSORX\r
+       RET\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       CLI\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+GO_TIM1_OVF:\r
+       RJMP    TIM1_OVF\r
+GO_TIM0_OVF:\r
+       RJMP    TIM0_OVF\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       STS     TOUCH_KEY,A\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       SUBI    A,-9\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_X,B\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A\r
+       SUBI    A,-4\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_Y,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YL\r
+       SUBI    A,15\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_XX,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YH\r
+       SUBI    A,17\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_YY,B\r
+\r
+       LDS     YH,TOUCH_Y\r
+TOUCH_ZONE_Y:\r
+       LDS     A,TOUCH_YY\r
+       SUB     A,YH\r
+       BRSH    TOUCH_ZONE_Y_CONT\r
+       RJMP    TOUCH_ZONE_Y_END\r
+TOUCH_ZONE_Y_CONT:\r
+\r
+       LDS     YL,TOUCH_X\r
+       MOV     A,YL\r
+       ADD     A,YH\r
+       MOV     B,YH\r
+       LSL     B\r
+       LSL     B\r
+       LSL     B\r
+       ADD     A,B\r
+       LSL     B\r
+       ADD     A,B\r
+\r
+       LDI     XL,LOW(RTN_DSPRAM)\r
+       LDI     XH,HIGH(RTN_DSPRAM) ;<<2\r
+       LDI     B,0\r
+       ADD     XL,A\r
+       ADC     XH,B\r
+\r
+       LDI     B,HIGH(RTN_DSPRAM>>6)   ; B:X -> RETURN CODE TABLE\r
+       A14_A18 B\r
+\r
+TOUCH_ZONE_X:\r
+       LDS     A,TOUCH_XX\r
+       SUB     A,YL\r
+       BRLO    TOUCH_ZONE_X_END\r
+\r
+       A0_A13  XL,XH\r
+       LDS     A,TOUCH_KEY\r
+       RAMWR   A                       ; WRITE DATA TO DSPRAM\r
+\r
+       ADIW    XL,1\r
+       INC     YL\r
+       RJMP    TOUCH_ZONE_X\r
+\r
+TOUCH_ZONE_X_END:\r
+       INC     YH\r
+       RJMP    TOUCH_ZONE_Y\r
+\r
+TOUCH_ZONE_Y_END:\r
+       RJMP    MAIN_LOOP\r
+\r
+DIVIDE_10:\r
+       LDI     B,-1\r
+DIVIDE_10_LOOP:\r
+       INC     B\r
+       SUBI    A,10\r
+       BRSH    DIVIDE_10_LOOP\r
+       RET\r
+\r
+DIVIDE_13:\r
+       LDI     B,-1\r
+DIVIDE_13_LOOP:\r
+       INC     B\r
+       SUBI    A,13\r
+       BRSH    DIVIDE_13_LOOP\r
+       RET\r
+\r
+NULLSUB2:\r
+       RCALL   RX_WAIT\r
+\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+;NICK_REPORT:\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A\r
+;\r
+;      PUSH    B\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVCC\r
+;      LDS     B,VCCL\r
+;      ADD     A,B\r
+;      STS     AVEVCC,A\r
+;      LDS     A,AVEVCCL\r
+;      LDS     B,VCCH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVCCL,A\r
+;      LDS     A,AVEVCCH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVCCH,A\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVEE\r
+;      LDS     B,VEEL\r
+;      ADD     A,B\r
+;      STS     AVEVEE,A\r
+;      LDS     A,AVEVEEL\r
+;      LDS     B,VEEH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVEEL,A\r
+;      LDS     A,AVEVEEH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVEEH,A\r
+;\r
+;      POP     B\r
+;\r
+;      LDS     A,AVECNT\r
+;      INC     A\r
+;      STS     AVECNT,A\r
+;      BRNE    NICK_REPORT_DONE\r
+;\r
+;      LDS     A,AVEVCCL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVCCH\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEH\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;\r
+;      CLR     A\r
+;      STS     AVEVCC,A\r
+;      STS     AVEVCCL,A\r
+;      STS     AVEVCCH,A\r
+;      STS     AVEVEE,A\r
+;      STS     AVEVEEL,A\r
+;      STS     AVEVEEH,A\r
+;NICK_REPORT_DONE:\r
+;      RET\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+;      SBRC    FLAGS,7\r
+;      RCALL   NICK_REPORT\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       SEI\r
+       CLR     F\r
+       STS     TEMP,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       MOV     A,YL\r
+       MOV     B,YH\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    PROP_WIDTH\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+       RJMP    PROP_MODE\r
+\r
+PROP_WIDTH:\r
+       RCALL   LPMS\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       SUB     R0,W\r
+       BRSH    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       MOV     XPIXEL,CURSORX\r
+       ADD     XPIXEL,R0\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE\r
+       MOV     F,CURSORX\r
+       ADD     F,R0\r
+       BRLO    CR_LF\r
+       RJMP    OK_LINE\r
+\r
+CR_LF: PUSH    A\r
+       PUSH    B\r
+       RCALL   CARRIAGE_RET\r
+       RCALL   LINE_FEED\r
+       LDS     F,TEMP\r
+       ADD     CURSORX,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       POP     B\r
+       POP     A\r
+OK_LINE:\r
+       ADD     CURSORX,R0\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+Y_OFFSET_DONE:\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       ADIW    YL,$01\r
+       RCALL   LPMS\r
+       MOV     Y_SIZE,R0\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0         ; REMOVE_CS WHY ??\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> DISPLAY BUFFER\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       LDI     B,32\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       SBIW    XL,2\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   COPY_BYTES              ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+L0659: CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L0659\r
+;      BRNE    L0659\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       RET\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+EXT_INT0:\r
+       IN      SR,SREG                 ; MEASURE VCC\r
+       SBI     DDRD,2\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     VCCH,D\r
+       STS     VCCL,C\r
+       RJMP    END_EXT_INT\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    END_EXT_INT\r
+\r
+TIM1_OVF:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+;      SBRC    FLAGS,6                 ; TURNOFF REQUESTED?\r
+;      RJMP    SLEEP_ENTRY             ; YES, SKIP CLOCKING AND SHUT DOWN\r
+\r
+       LDS     C,CLOCKING_PTR\r
+       TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+       SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+       SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CLR     D\r
+       OUT     TCCR1B,D\r
+       OUT     TCNT1H,D\r
+       OUT     TCNT1L,D\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,CLOCKING_PTR+1\r
+       OR      D,C                     ; START OF FRAME?  (REALLY LINE 1)\r
+       BREQ    L04E6                   ; YES, GO AND TOGGLE M ETC\r
+\r
+       ;LDS    D,LATCH10_SAV\r
+       ;OUT    PORTA,D\r
+       ;SBI    PORTB,4\r
+       SBI     PORTB,2 ;PORTA,5        ; PULSE CL1\r
+       CBI     PORTB,2 ;PORTA,5\r
+       ;CBI    PORTB,4\r
+       RJMP    L04F9\r
+\r
+L04E6: IN      D,PORTB ;LDS D,LATCH10_SAV\r
+       ORI     D,$10 ;$80              ; RAISE FLM\r
+       ORI     D,$04 ;$20              ; RAISE CL1\r
+       OUT     PORTB,D ;PORTA,D\r
+       ANDI    D,$FB ;                 ; DROP CL1\r
+       OUT     PORTB,D ;\r
+\r
+       IN      D,PORTD ;SBI PORTB,4\r
+       LDI     C,$40 ;$60              ; TOGGLE M (FORMERLY CL1 ALSO)\r
+       EOR     D,C\r
+       OUT     PORTD,D ;OUT PORTA,D\r
+       IN      D,PORTB ;\r
+       ANDI    D,$EF ;$7F              ; DROP FLM\r
+       OUT     PORTB,D ;PORTA,D\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,D\r
+\r
+;      LDI     D,1<<7\r
+;      OR      FLAGS,D                 ; FOR NICK_REPORT\r
+\r
+L04F9: LDS     D,LATCH10_SAV           ; SAVE STATE\r
+       PUSH    D\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDS     ZL,CLOCKING_PTR\r
+       LDS     ZH,CLOCKING_PTR+1\r
+\r
+       SUBI    ZL,LOW(-$40)\r
+       SBCI    ZH,HIGH(-$40)\r
+       ANDI    ZH,HIGH(DISPLAY_LINES*$40-1)\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       CBI     PORTB,1                 ; CLR HC590\r
+       SBI     PORTB,1\r
+       CBI     PORTD,7                 ; DROP OE FOR HC590\r
+       CLR     C\r
+       OUT     DDRA,C                  ; PORTA HI Z\r
+       LDI     C,$C0\r
+       OUT     DDRC,C                  ; PORTC HI Z\r
+       CBI     PORTB,0                 ; DROP CS FOR DSPRAM\r
+\r
+       CLR     D\r
+       OUT     OCR1AH,D\r
+       OUT     OCR1AL,D\r
+       LDI     D,$09\r
+       OUT     TCCR1B,D                ; START CL2 CLOCKING\r
+\r
+       STS     CLOCKING_PTR,ZL\r
+       STS     CLOCKING_PTR+1,ZH\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDI     D,$39                   ; WAIT FOR 16uSEC\r
+L050E: DEC     D\r
+       BRNE    L050E\r
+\r
+       LDI     D,$01\r
+       OUT     TCCR1B,D\r
+       SBI     PORTD,5                 ; CL2 HIGH\r
+\r
+       SBI     PORTB,0                 ; RAISE CS FOR DSPRAM\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+       SBI     PORTD,7                 ; RAISE OE FOR HC590\r
+       OUT     DDRC,D                  ; PORTC OUTPUT\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       LDI     D,$0B                   ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VCCL\r
+       LDS     D,VCCH\r
+       LDI     E,LOW(VCC_NOMINAL)\r
+       SUB     C,E\r
+       LDI     E,HIGH(VCC_NOMINAL)\r
+       SBC     D,E\r
+\r
+       ROR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;      PUSH    D\r
+;      PUSH    C\r
+       ASR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;      POP     E\r
+;      ADD     C,E\r
+;      POP     E\r
+;      ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+\r
+       LDS     E,VEEL\r
+       ADD     C,E\r
+       LDS     E,VEEH\r
+       ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       LDI     D,$02\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,$C8 ;$B8              ; 54uSEC\r
+       OUT     TCNT0,D\r
+       CLR     D\r
+       STS     SCAN_CNT,D\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,2                  ; START VCC AND\r
+       CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+       RJMP    END_INT\r
+\r
+TIM0_OVF:\r
+ RETI\r
+       IN      SR,SREG                 ; LED/PHOTODIODE SCANNING\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+       LDS     D,LATCH10_SAV\r
+       PUSH    D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       LDS     D,SCAN_CNT\r
+       INC     D\r
+       STS     SCAN_CNT,D\r
+       DEC     D\r
+       BREQ    BEEPER                  ; IF SCAN_CNT WAS = 0\r
+       DEC     D\r
+       RJEQ    PHOTO                   ; IF SCAN_CNT WAS = 1\r
+\r
+END_INT:\r
+       POP     D                       ; RESTORE STATE OF THE WORLD\r
+       ;OUT    PORTA,D\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       STS     LATCH10_SAV,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+END_EXT_INT:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+BEEPER:        LDS     D,BUZZ_TIME\r
+       TST     D\r
+       BREQ    PULSE_LED\r
+       LDS     C,LATCH12_SAV\r
+       SBRS    C,3\r
+       RJMP    BEEPER_SPKHI\r
+       DEC     D\r
+       STS     BUZZ_TIME,D\r
+       BREQ    BEEPER_SPKOFF\r
+;BEEPER_SPKLO:\r
+       SPKLO\r
+       RJMP    PULSE_LED\r
+BEEPER_SPKHI:\r
+       SPKHI\r
+       RJMP    PULSE_LED\r
+BEEPER_SPKOFF:\r
+       SPKOFF\r
+\r
+PULSE_LED:\r
+       LDI     D,1<<7\r
+       EOR     FLAGS,D\r
+       BRPL    PULSE_LED_OK            ; PULSE LED EVERY 2ND CYCLE\r
+\r
+       CLR     D\r
+       OUT     TCCR0,D                 ; STOP TIMER\r
+       RJMP    END_INT                 ; AND WASTE EVERY REMAINING CYCLE\r
+\r
+PULSE_LED_OK:\r
+       LDI     D,$E2                   ; 22uSEC\r
+       OUT     TCNT0,D\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+       LDIZ    SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDI     D,$E0\r
+       CP      R0,D\r
+       BRLO    L0570\r
+       LEDLO                           ; ENABLE HORIZ LED DRIVE\r
+       RJMP    L0574\r
+L0570: LEDHI                           ; DISABLE HORIZ LED DRIVE\r
+L0574: LED     R0\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+       RJMP    END_INT\r
+\r
+PHOTO: CLR     D                       ; STOP TIMER SINCE\r
+       OUT     TCCR0,D                 ; WANT INTERRUPT EVERY 2ND CYCLE\r
+\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+\r
+       IN      D,PIND                  ; PHOTODIODE STATUS IN BIT 6,D\r
+       LDI     C,$E0\r
+       LED     C                       ; TURN OFF LED ??\r
+\r
+       SBRS    D,6\r
+       RJMP    L058A\r
+\r
+       ; ROW/COLUMN IS INACTIVE\r
+       CLC\r
+       IN      C,SREG\r
+       RJMP    L0593\r
+\r
+L058A: ; ROW/COLUMN IS ACTIVE\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0591\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+L0591: SEC\r
+       IN      C,SREG\r
+\r
+L0593: ; WE HAVE A ROW/COLUMN STATUS IN CF AND C\r
+\r
+ ;     MOV     D,TX_COUNT\r
+ ;     CPI     D,TX_SIZE\r
+ ;     BRSH    L0617X\r
+ ;     PUSH    A\r
+ ;     LDS     A,ROW_COLUMN\r
+ ;     OUT     SREG,C\r
+ ;     ROL     A\r
+ ;     SBRS    A,7\r
+ ;     RJMP    L0617XX\r
+ ;     RCALL   TX_CHAR\r
+ ;     LDI     A,1\r
+ ;L0617XX:\r
+ ;     STS     ROW_COLUMN,A\r
+ ;     POP     A\r
+ ;L0617X:\r
+\r
+       LDIZ    SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDI     D,$E0\r
+       CP      R0,D\r
+       BRLO    L05A8\r
+       ; WE HAVE A ROW STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       LDS     D,ROW_BITMAP\r
+       ROL     D\r
+       STS     ROW_BITMAP,D\r
+       LDS     D,ROW_BITMAP+1\r
+       ROL     D\r
+       STS     ROW_BITMAP+1,D\r
+       RJMP    L05F9\r
+L05A8: ; WE HAVE A COLUMN STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       BRLO    L05AB\r
+       RJMP    L05F9\r
+L05AB: ; WE HAVE AN ACTIVE COLUMN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L05B3\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       RJMP    L05F9\r
+L05B3: ; LOOK FOR ANY ACTIVE ROW\r
+       LDS     D,ROW_BITMAP+1\r
+       LDS     C,ROW_BITMAP\r
+       PUSH    A\r
+       LDI     A,$38\r
+L05B9: SUBI    A,$04\r
+       RJEQ    L05F8   ;BREQ   L05F8\r
+       ROR     D\r
+       ROR     C\r
+       BRSH    L05B9\r
+       ; WE FOUND AN INTERSECTION\r
+       PUSH    D\r
+       PUSH    C\r
+\r
+       LDS     D,LATCH5_SAV\r
+       SBRS    D,7\r
+       RJMP    ALREADY_ON\r
+\r
+       ;LDS    D,TURNON_COUNT\r
+       ;TST    D\r
+       ;BREQ   TURNON_OK\r
+       ;DEC    D\r
+       ;STS    TURNON_COUNT,D\r
+       ;BRNE   TURNON_OK\r
+\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; RESET TURNOFF REQUEST\r
+\r
+;TURNON_OK:\r
+       RJMP    L05F8\r
+\r
+ALREADY_ON:\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       MOV     C,A\r
+       SUBI    C,$04\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+       LPM\r
+       MOV     C,R0\r
+       LSL     R0\r
+       LSL     R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       ADD     C,R0\r
+       LDI     ZL,LOW(RTN_DSPRAM)      ; RETURN CODE TABLE\r
+       LDI     ZH,HIGH(RTN_DSPRAM)\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       PUSH    F\r
+       RAMRDX  R0\r
+       POP     F\r
+\r
+       POP     C\r
+       POP     D\r
+       TST     R0\r
+       RJEQ    L05B9                   ; NULL INTERSECTION, FIND ANOTHER\r
+\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       STS     ACTIVE_ZONE,R0\r
+       LDI     D,$10\r
+       STS     BUZZ_TIME,D             ; SHORT BEEP ON MAKE\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-2\r
+       BRSH    L05F8\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'Z'\r
+       RCALL   TX_CHAR\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+\r
+L05F8: ; SCAN TO NEXT LED / PHOTODIODE PAIR\r
+       POP     A\r
+L05F9: LDI     D,$04\r
+       ADD     SCAN,D\r
+       LDI     C,$C8\r
+       CP      SCAN,C\r
+       BRLO    L0617\r
+\r
+ ;     MOV     D,TX_COUNT\r
+ ;     CPI     D,TX_SIZE-1\r
+ ;     BRSH    L0617Y\r
+ ;     PUSH    A\r
+ ;     LDS     A,ROW_COLUMN\r
+ ;     LSR     A\r
+ ;L0617YY:\r
+ ;     ROL     A\r
+ ;     SBRS    A,7\r
+ ;     RJMP    L0617YY\r
+ ;     RCALL   TX_CHAR\r
+ ;     LDI     A,1\r
+ ;     STS     ROW_COLUMN,A\r
+ ;     LDI     A,$0D\r
+ ;     RCALL   TX_CHAR\r
+ ;     POP     A\r
+ ;L0617Y:\r
+\r
+       ; COMPLETED ENTIRE SCAN, START NEW SCAN\r
+;      SBI     DDRC,7\r
+;      SBI     PORTC,7                 ; DIAGNOSTIC SYNC FOR LED SCAN\r
+;      CBI     PORTC,7\r
+       CLR     SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0617\r
+       DEC     D\r
+       STS     DEBOUNCE,D\r
+       BRNE    L0617\r
+       LDS     D,ACTIVE_ZONE\r
+       TST     D\r
+       BREQ    L0617\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-2\r
+       BRSH    L0617\r
+       PUSH    A\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'Z'\r
+       RCALL   TX_CHAR\r
+       LDI     A,0\r
+       RCALL   TX_CHAR\r
+       POP     A\r
+L0617: ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+       LDIZ    SCAN_TBL\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDS     D,LATCH5_SAV\r
+       ANDI    D,$C0\r
+       OR      D,R0\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+;      SBI     PORTC,6                 ; DIAGNOSTIC DURATION FOR PHOTO ROUTINE\r
+;      CBI     PORTC,6\r
+       RJMP    END_INT\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    L0659\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_PAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; 1ST BYTE = LED\r
+; 2ND BYTE = PHOTO\r
+; 3RD BYTE = TOUCH CHANNEL\r
+\r
+SCAN_TBL:\r
+       .DB     $F0,$34,$00,$00,$E8,$34,$01,$00,$F0,$33,$01,$00,$E8,$33,$02,$00\r
+       .DB     $E4,$33,$03,$00,$E8,$32,$03,$00,$E4,$32,$04,$00,$E2,$32,$05,$00\r
+       .DB     $E4,$31,$05,$00,$E2,$31,$06,$00,$E1,$31,$07,$00,$E2,$30,$07,$00\r
+       .DB     $E1,$30,$08,$00,$C1,$2A,$00,$00,$C2,$2A,$01,$00,$C1,$2B,$01,$00\r
+       .DB     $C2,$2B,$02,$00,$C4,$2B,$03,$00,$C2,$2C,$03,$00,$C4,$2C,$04,$00\r
+       .DB     $C8,$2C,$05,$00,$C4,$18,$05,$00,$C8,$18,$06,$00,$D0,$18,$07,$00\r
+       .DB     $C8,$19,$07,$00,$D0,$19,$08,$00,$A1,$19,$09,$00,$D0,$1A,$09,$00\r
+       .DB     $A1,$1A,$0A,$00,$A2,$1A,$0B,$00,$A1,$1B,$0B,$00,$A2,$1B,$0C,$00\r
+       .DB     $A4,$1B,$0D,$00,$A2,$1C,$0D,$00,$A4,$1C,$0E,$00,$A8,$1C,$0F,$00\r
+       .DB     $A4,$1D,$0F,$00,$A8,$1D,$10,$00,$B0,$1D,$11,$00,$A8,$1E,$11,$00\r
+       .DB     $B0,$1E,$12,$00,$61,$1E,$13,$00,$B0,$1F,$13,$00,$61,$1F,$14,$00\r
+       .DB     $62,$1F,$15,$00,$61,$28,$15,$00,$62,$28,$16,$00,$64,$28,$17,$00\r
+       .DB     $62,$29,$17,$00,$64,$29,$18,$00\r
+\r
+RTN_CODE:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$08,$08,$08,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$7E,$00,$31,$00,$32,$00,$33,$00,$34,$00,$35,$00,$36,$00\r
+       .DB     $37,$00,$38,$00,$39,$00,$30,$00,$2D,$00,$3D,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$51,$00,$57,$00,$45,$00,$52,$00,$54,$00,$59,$00\r
+       .DB     $55,$00,$49,$00,$4F,$00,$50,$00,$5B,$00,$5D,$00,$5C,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$41,$00,$53,$00,$44,$00,$46,$00,$47,$00\r
+       .DB     $48,$00,$4A,$00,$4B,$00,$4C,$00,$3B,$00,$27,$00,$0D,$0D,$0D,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5A,$00,$58,$00,$43,$00\r
+       .DB     $56,$00,$42,$00,$4E,$00,$4D,$00,$2C,$00,$2E,$00,$2F,$00,$00,$00\r
+       .DB     $00,$00\r
+RTN_CODE_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+       .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+       .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+       .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+       .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+       .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+       .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+       .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+       .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+       .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+       .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+       .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+       .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+       .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+       .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+       .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+       .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+       .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+       .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+       .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+       .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+       .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+       .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+       .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+       .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+       .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+       .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+       .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+       .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+       .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+       .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+       .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+       .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+       .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+       .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+       .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+       .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+       .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+       .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+       .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+       .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+       .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+       .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+       .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+       .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+       .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+       .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+       .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+       .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+       .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+       .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+       .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+       .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+       .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+       .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+       .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+       .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+       .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+       .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+       .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+       .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+       .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+       .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+       .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cs64v0.asm b/src/avr/cs64v0.asm
new file mode 100644 (file)
index 0000000..8e6c256
--- /dev/null
@@ -0,0 +1,3076 @@
+;      CS64V0.ASM\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "API.INC" ; DIDN'T CHANGE THIS TO APICS.INC SINCE NO WDR IN CS64V0.ASM\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     PAGE,YH\r
+       RCALL   ADRYP                   ; AND SET PAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+       OUT     PORTC,@0                ; SET L ADDRESS FOR DSPRAM\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       SEI\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV          ; AND THIS\r
+       BST     @0,1                    ; A15\r
+       BLD     R19,7 ;1\r
+       BST     @0,0                    ; A14\r
+       BLD     R19,6 ;0\r
+       SEI\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV  ; AND THIS\r
+       BST     @1,7                    ; A15\r
+       BLD     R19,7 ;1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,6 ;0\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       SBI     PORTB,0\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,0\r
+       CBI     PORTB,1\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,0                 ; CS_ON\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,0                 ; CS_ON\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =$FB35\r
+.EQU   T1_FULL_SCALE   =$FC2F\r
+\r
+.EQU   VEE_MIN         =$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         =$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =$FE00\r
+\r
+.EQU   CONTRAST_LONG   =$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  =$FFC0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =$FE00\r
+\r
+.EQU   VCC_NOMINAL     =$FCDC\r
+\r
+; WITH VCC = $FCDC FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FD18 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FD78 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FD48\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+.EQU   CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    =$FF80 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =$FD80\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$61000 ;$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$62000 ;$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$40\r
+.EQU   CHARACTER_SETS  =6\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$10\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF    BOXSIZEX       =R7             ; ASSIGNED TWICE\r
+.DEF    BOXSIZEY       =R8             ; ASSIGNED TWICE\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   0=BACKLIGHT INVERSION OFF       1=BACKLIGHT INVERSION ON\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+BUZZ_TIME:     .BYTE   1       ; 10B\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+DEBOUNCE:      .BYTE   1\r
+ROW_INDEX:     .BYTE   1\r
+ROW_BITMAP:    .BYTE   2\r
+LATCH10_SAV:   .BYTE   1\r
+LATCH11_SAV:   .BYTE   1\r
+LATCH12_SAV:   .BYTE   1\r
+PAGE:          .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+CLOCKING_PTR:  .BYTE   2\r
+\r
+; MUST CONVERT TO USE DRAW_CHAR_TTY ROUTINE\r
+;CHAR_X:       .BYTE   1\r
+;CHAR_Y:       .BYTE   1\r
+;CHAR_PTR:     .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TOUCH_KEY:     .BYTE   1\r
+TOUCH_X:       .BYTE   1\r
+TOUCH_Y:       .BYTE   1\r
+TOUCH_XX:      .BYTE   1\r
+TOUCH_YY:      .BYTE   1\r
+\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+SCAN_CNT:      .BYTE   1\r
+LATCH5_SAV:    .BYTE   1\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   1\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+AVECNT:                .BYTE   1\r
+AVEVCC:                .BYTE   1\r
+AVEVCCL:       .BYTE   1\r
+AVEVCCH:       .BYTE   1\r
+AVEVEE:                .BYTE   1\r
+AVEVEEL:       .BYTE   1\r
+AVEVEEH:       .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $0000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RETI                            ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_TIM1_OVF\r
+       RJMP    GO_TIM0_OVF\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+RESTART_ENTRY:\r
+       ;LDI    F,8\r
+       ;OUT    ASSR,F                  ; TIMER 2 CLOCKED BY 32 KHZ XTAL\r
+       ;LDI    F,1\r
+       ;OUT    TCCR2,F                 ; TIMER 2 DIVIDE BY 1\r
+       LDI     F,$00 ;$40\r
+       OUT     TIMSK,F                 ; TIMER 2 OVERFLOW INTERRUPTS ENABLED\r
+       ;LDI    F,$00\r
+       OUT     GIMSK,F\r
+\r
+       LDI     F,$F8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       LDI     F,$B8 ;$F8\r
+       OUT     PORTD,F\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$03                   ; CS, WE HI, LEs ALL LO\r
+       OUT     PORTB,F\r
+\r
+       LDI     F,$10                   ; LED COMMON OFF, SPEAKER OFF\r
+       ;OUT    PORTC,F\r
+       ;SBI    PORTB,2\r
+       ;CBI    PORTB,2\r
+       STS     LATCH12_SAV,F\r
+\r
+       LDI     F,$20\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ENABLED\r
+\r
+       INIT_API_BUS\r
+\r
+;      LDI     D,$18                   ; A18|A17|A16|A15|A14=11000\r
+;      OUT     PORTA,D                 ; CL1=M=FLM=0\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,D\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+;RTNCDE: LDIZ  RTN_CODE                ; POINT Z TO FLASH\r
+;      LDIX    RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+;      LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET PAGE\r
+;CDE0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+;CDE1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+;      LPM                             ; GET DATA FROM FLASH\r
+; CLR R0 ; TEMPORARY CLEAR KB\r
+;      RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+;      DEC     XL\r
+;      BREQ    RTNCDE_END              ; CHECK IF ALL DONE\r
+;      ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+;      INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+;      MOV     A,YL ;\r
+;      ANDI    A,$3F ;YL,$3F\r
+;      BRNE    CDE1\r
+;      SUBI    YL,$40 ;\r
+;      INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+;      RJMP    CDE0\r
+;RTNCDE_END:\r
+\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       LDI     A,$10\r
+       STS     BUZZ_TIME,A             ; SHORT BEEP ON STARTUP\r
+\r
+       CLR     A\r
+       STS     SCAN_CNT,A              ; START ON FIRST LED / PHOTODIODE PAIR\r
+       STS     CLOCKING_PTR,A\r
+       STS     CLOCKING_PTR+1,A        ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       CBI     PORTD,4                 ; TURN TRANSISTOR ON (PULL DOWN VSWT)\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       IN      D,PORTD ;LDS D,LATCH10_SAV\r
+       ANDI    D,$BF                   ; DROP M\r
+       OUT     PORTD,D ;PORTA,D\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,D\r
+\r
+       LDI     D,$40\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 0 / 1 INTERRUPTS\r
+\r
+       LDI     D,0\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+;      LDI     F,$18\r
+;      STS     TURNON_COUNT,F          ; .1 SECOND TO BREAK, .2 SECOND TO MAKE\r
+;\r
+;      SEI\r
+;\r
+;SLEEP_LOOP:\r
+;      SLEEP\r
+;\r
+;      LDS     F,TURNON_COUNT\r
+;      TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+;      BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+;\r
+;      CLI\r
+;      RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+       LDI     D,$6A\r
+       OUT     MCUCR,D                 ; SE=0 SM1:SM0=10 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP:\r
+;      LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
+;      LDS     YL,LATCH10_SAV\r
+;      ANDI    YL,$E0\r
+;      OR      YH,YL\r
+;      OUT     PORTA,YH\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,PAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     PAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+       CPI     A,$0A\r
+       RJEQ    LF\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'A'\r
+       RJEQ    SET_BACKLIGHT\r
+       CPI     A,'B'\r
+       RJEQ    BUZZER\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       RJEQ    CONTRAST_CONTROL\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+BUZZER:        RCALL   RX_WAIT\r
+       STS     BUZZ_TIME,A             ; SAVE REQUESTED DURATION\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_BACKLIGHT:\r
+       RCALL   RX_WAIT\r
+;      ANDI    A,1\r
+;      BRNE    SET_BACKLIGHT_ON\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+;      CBI     PORTC,7\r
+;      CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+;      RJMP    MAIN_LOOP\r
+;SET_BACKLIGHT_ON:\r
+;      LDI     A,1<<7\r
+;      OR      FLAGS,A                 ; ENABLE INTERRUPT BACKLIGHT INVERSION\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    RCALL   CARRIAGE_RET\r
+       RJMP    MAIN_LOOP\r
+\r
+CARRIAGE_RET:\r
+       CLR     CURSORX\r
+       RET\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       CLI\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+GO_TIM1_OVF:\r
+       RJMP    TIM1_OVF\r
+GO_TIM0_OVF:\r
+       RJMP    TIM0_OVF\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       STS     TOUCH_KEY,A\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       SUBI    A,-9\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_X,B\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A\r
+       SUBI    A,-4\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_Y,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YL\r
+       SUBI    A,15\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_XX,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YH\r
+       SUBI    A,17\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_YY,B\r
+\r
+       LDS     YH,TOUCH_Y\r
+TOUCH_ZONE_Y:\r
+       LDS     A,TOUCH_YY\r
+       SUB     A,YH\r
+       BRSH    TOUCH_ZONE_Y_CONT\r
+       RJMP    TOUCH_ZONE_Y_END\r
+TOUCH_ZONE_Y_CONT:\r
+\r
+       LDS     YL,TOUCH_X\r
+       MOV     A,YL\r
+       ADD     A,YH\r
+       MOV     B,YH\r
+       LSL     B\r
+       LSL     B\r
+       LSL     B\r
+       ADD     A,B\r
+       LSL     B\r
+       ADD     A,B\r
+\r
+       LDI     XL,LOW(RTN_DSPRAM)\r
+       LDI     XH,HIGH(RTN_DSPRAM) ;<<2\r
+       LDI     B,0\r
+       ADD     XL,A\r
+       ADC     XH,B\r
+\r
+       LDI     B,HIGH(RTN_DSPRAM>>6)   ; B:X -> RETURN CODE TABLE\r
+       A14_A18 B\r
+\r
+TOUCH_ZONE_X:\r
+       LDS     A,TOUCH_XX\r
+       SUB     A,YL\r
+       BRLO    TOUCH_ZONE_X_END\r
+\r
+       A0_A13  XL,XH\r
+       LDS     A,TOUCH_KEY\r
+       RAMWR   A                       ; WRITE DATA TO DSPRAM\r
+\r
+       ADIW    XL,1\r
+       INC     YL\r
+       RJMP    TOUCH_ZONE_X\r
+\r
+TOUCH_ZONE_X_END:\r
+       INC     YH\r
+       RJMP    TOUCH_ZONE_Y\r
+\r
+TOUCH_ZONE_Y_END:\r
+       RJMP    MAIN_LOOP\r
+\r
+DIVIDE_10:\r
+       LDI     B,-1\r
+DIVIDE_10_LOOP:\r
+       INC     B\r
+       SUBI    A,10\r
+       BRSH    DIVIDE_10_LOOP\r
+       RET\r
+\r
+DIVIDE_13:\r
+       LDI     B,-1\r
+DIVIDE_13_LOOP:\r
+       INC     B\r
+       SUBI    A,13\r
+       BRSH    DIVIDE_13_LOOP\r
+       RET\r
+\r
+NULLSUB2:\r
+       RCALL   RX_WAIT\r
+\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+;NICK_REPORT:\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A\r
+;\r
+;      PUSH    B\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVCC\r
+;      LDS     B,VCCL\r
+;      ADD     A,B\r
+;      STS     AVEVCC,A\r
+;      LDS     A,AVEVCCL\r
+;      LDS     B,VCCH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVCCL,A\r
+;      LDS     A,AVEVCCH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVCCH,A\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVEE\r
+;      LDS     B,VEEL\r
+;      ADD     A,B\r
+;      STS     AVEVEE,A\r
+;      LDS     A,AVEVEEL\r
+;      LDS     B,VEEH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVEEL,A\r
+;      LDS     A,AVEVEEH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVEEH,A\r
+;\r
+;      POP     B\r
+;\r
+;      LDS     A,AVECNT\r
+;      INC     A\r
+;      STS     AVECNT,A\r
+;      BRNE    NICK_REPORT_DONE\r
+;\r
+;      LDS     A,AVEVCCL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVCCH\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEH\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;\r
+;      CLR     A\r
+;      STS     AVEVCC,A\r
+;      STS     AVEVCCL,A\r
+;      STS     AVEVCCH,A\r
+;      STS     AVEVEE,A\r
+;      STS     AVEVEEL,A\r
+;      STS     AVEVEEH,A\r
+;NICK_REPORT_DONE:\r
+;      RET\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+;      SBRC    FLAGS,7\r
+;      RCALL   NICK_REPORT\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       SEI\r
+       CLR     F\r
+       STS     TEMP,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       MOV     A,YL\r
+       MOV     B,YH\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    PROP_WIDTH\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+       RJMP    PROP_MODE\r
+\r
+PROP_WIDTH:\r
+       RCALL   LPMS\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       SUB     R0,W\r
+       BRSH    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       MOV     XPIXEL,CURSORX\r
+       ADD     XPIXEL,R0\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE\r
+       MOV     F,CURSORX\r
+       ADD     F,R0\r
+       BRLO    CR_LF\r
+       RJMP    OK_LINE\r
+\r
+CR_LF: PUSH    A\r
+       PUSH    B\r
+       RCALL   CARRIAGE_RET\r
+       RCALL   LINE_FEED\r
+       LDS     F,TEMP\r
+       ADD     CURSORX,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       POP     B\r
+       POP     A\r
+OK_LINE:\r
+       ADD     CURSORX,R0\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+Y_OFFSET_DONE:\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       ADIW    YL,$01\r
+       RCALL   LPMS\r
+       MOV     Y_SIZE,R0\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0         ; REMOVE_CS WHY ??\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> DISPLAY BUFFER\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       LDI     B,30\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, SKIP 16 FOR SAMSUNG\r
+\r
+       ;SBIW   XL,2\r
+       ;ADIW   YL,6\r
+       ;LDI    B,2\r
+       ;RCALL  COPY_BYTES              ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+L0659: CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L0659\r
+;      BRNE    L0659\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       RET\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+EXT_INT0:\r
+       IN      SR,SREG                 ; MEASURE VCC\r
+       SBI     DDRD,2\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     VCCH,D\r
+       STS     VCCL,C\r
+       RJMP    END_EXT_INT\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    END_EXT_INT\r
+\r
+TIM1_OVF:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+;      SBRC    FLAGS,6                 ; TURNOFF REQUESTED?\r
+;      RJMP    SLEEP_ENTRY             ; YES, SKIP CLOCKING AND SHUT DOWN\r
+\r
+       LDS     C,CLOCKING_PTR\r
+       TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+       SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+       SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CLR     D\r
+       OUT     TCCR1B,D\r
+       OUT     TCNT1H,D\r
+       OUT     TCNT1L,D\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,CLOCKING_PTR+1\r
+       OR      D,C                     ; START OF FRAME?  (REALLY LINE 1)\r
+       BREQ    L04E6                   ; YES, GO AND TOGGLE M ETC\r
+\r
+       ;LDS    D,LATCH10_SAV\r
+       ;OUT    PORTA,D\r
+       ;SBI    PORTB,4\r
+       SBI     PORTB,2 ;PORTA,5        ; PULSE CL1\r
+       CBI     PORTB,2 ;PORTA,5\r
+       ;CBI    PORTB,4\r
+       RJMP    L04F9\r
+\r
+L04E6: IN      D,PORTB ;LDS D,LATCH10_SAV\r
+       ORI     D,$10 ;$80              ; RAISE FLM\r
+       ORI     D,$04 ;$20              ; RAISE CL1\r
+       OUT     PORTB,D ;PORTA,D\r
+       ANDI    D,$FB ;                 ; DROP CL1\r
+       OUT     PORTB,D ;\r
+\r
+       IN      D,PORTD ;SBI PORTB,4\r
+       LDI     C,$40 ;$60              ; TOGGLE M (FORMERLY CL1 ALSO)\r
+       EOR     D,C\r
+       OUT     PORTD,D ;OUT PORTA,D\r
+       IN      D,PORTB ;\r
+       ANDI    D,$EF ;$7F              ; DROP FLM\r
+       OUT     PORTB,D ;PORTA,D\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,D\r
+\r
+;      LDI     D,1<<7\r
+;      OR      FLAGS,D                 ; FOR NICK_REPORT\r
+\r
+L04F9: LDS     D,LATCH10_SAV           ; SAVE STATE\r
+       PUSH    D\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDS     ZL,CLOCKING_PTR\r
+       LDS     ZH,CLOCKING_PTR+1\r
+\r
+       SUBI    ZL,LOW(-$40)\r
+       SBCI    ZH,HIGH(-$40)\r
+       ANDI    ZH,HIGH(DISPLAY_LINES*$40-1)\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       CBI     PORTB,1                 ; CLR HC590\r
+       SBI     PORTB,1\r
+       CBI     PORTD,7                 ; DROP OE FOR HC590\r
+       CLR     C\r
+       OUT     DDRA,C                  ; PORTA HI Z\r
+       LDI     C,$E0 ;$C0\r
+       OUT     DDRC,C                  ; PORTC HI Z\r
+       CBI     PORTB,0                 ; DROP CS FOR DSPRAM\r
+\r
+       CLR     D\r
+       OUT     OCR1AH,D\r
+       OUT     OCR1AL,D                ; TO CLOCK AT 5.5 MHZ\r
+       LDI     D,$09\r
+       OUT     TCCR1B,D                ; START CL2 CLOCKING WITH CLR ON MATCH\r
+\r
+       STS     CLOCKING_PTR,ZL\r
+       STS     CLOCKING_PTR+1,ZH\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDI     D,$AB ;$39              ; WAIT FOR 16uSEC\r
+L050E: DEC     D\r
+       BRNE    L050E\r
+\r
+       LDI     D,$01\r
+       OUT     TCCR1B,D\r
+       SBI     PORTD,5                 ; CL2 HIGH\r
+\r
+       SBI     PORTB,0                 ; RAISE CS FOR DSPRAM\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+       SBI     PORTD,7                 ; RAISE OE FOR HC590\r
+       OUT     DDRC,D                  ; PORTC OUTPUT\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       LDI     D,$0B                   ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VCCL\r
+       LDS     D,VCCH\r
+       LDI     E,LOW(VCC_NOMINAL)\r
+       SUB     C,E\r
+       LDI     E,HIGH(VCC_NOMINAL)\r
+       SBC     D,E\r
+\r
+       ROR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;      PUSH    D\r
+;      PUSH    C\r
+       ASR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;      POP     E\r
+;      ADD     C,E\r
+;      POP     E\r
+;      ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+\r
+       LDS     E,VEEL\r
+       ADD     C,E\r
+       LDS     E,VEEH\r
+       ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       LDI     D,$02\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,$C8 ;$B8              ; 54uSEC\r
+       OUT     TCNT0,D\r
+       CLR     D\r
+       STS     SCAN_CNT,D\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,2                  ; START VCC AND\r
+       CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+       RJMP    END_INT\r
+\r
+TIM0_OVF:\r
+ RETI\r
+       IN      SR,SREG                 ; LED/PHOTODIODE SCANNING\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+       LDS     D,LATCH10_SAV\r
+       PUSH    D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       LDS     D,SCAN_CNT\r
+       INC     D\r
+       STS     SCAN_CNT,D\r
+       DEC     D\r
+       BREQ    BEEPER                  ; IF SCAN_CNT WAS = 0\r
+       DEC     D\r
+       RJEQ    PHOTO                   ; IF SCAN_CNT WAS = 1\r
+\r
+END_INT:\r
+       POP     D                       ; RESTORE STATE OF THE WORLD\r
+       ;OUT    PORTA,D\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       STS     LATCH10_SAV,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+END_EXT_INT:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+BEEPER:        LDS     D,BUZZ_TIME\r
+       TST     D\r
+       BREQ    PULSE_LED\r
+       LDS     C,LATCH12_SAV\r
+       SBRS    C,3\r
+       RJMP    BEEPER_SPKHI\r
+       DEC     D\r
+       STS     BUZZ_TIME,D\r
+       BREQ    BEEPER_SPKOFF\r
+;BEEPER_SPKLO:\r
+       SPKLO\r
+       RJMP    PULSE_LED\r
+BEEPER_SPKHI:\r
+       SPKHI\r
+       RJMP    PULSE_LED\r
+BEEPER_SPKOFF:\r
+       SPKOFF\r
+\r
+PULSE_LED:\r
+       LDI     D,1<<7\r
+       EOR     FLAGS,D\r
+       BRPL    PULSE_LED_OK            ; PULSE LED EVERY 2ND CYCLE\r
+\r
+       CLR     D\r
+       OUT     TCCR0,D                 ; STOP TIMER\r
+       RJMP    END_INT                 ; AND WASTE EVERY REMAINING CYCLE\r
+\r
+PULSE_LED_OK:\r
+       LDI     D,$E2                   ; 22uSEC\r
+       OUT     TCNT0,D\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+       LDIZ    SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDI     D,$E0\r
+       CP      R0,D\r
+       BRLO    L0570\r
+       LEDLO                           ; ENABLE HORIZ LED DRIVE\r
+       RJMP    L0574\r
+L0570: LEDHI                           ; DISABLE HORIZ LED DRIVE\r
+L0574: LED     R0\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+       RJMP    END_INT\r
+\r
+PHOTO: CLR     D                       ; STOP TIMER SINCE\r
+       OUT     TCCR0,D                 ; WANT INTERRUPT EVERY 2ND CYCLE\r
+\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+\r
+       IN      D,PIND                  ; PHOTODIODE STATUS IN BIT 6,D\r
+       LDI     C,$E0\r
+       LED     C                       ; TURN OFF LED ??\r
+\r
+       SBRS    D,6\r
+       RJMP    L058A\r
+\r
+       ; ROW/COLUMN IS INACTIVE\r
+       CLC\r
+       IN      C,SREG\r
+       RJMP    L0593\r
+\r
+L058A: ; ROW/COLUMN IS ACTIVE\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0591\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+L0591: SEC\r
+       IN      C,SREG\r
+\r
+L0593: ; WE HAVE A ROW/COLUMN STATUS IN CF AND C\r
+\r
+ ;     MOV     D,TX_COUNT\r
+ ;     CPI     D,TX_SIZE\r
+ ;     BRSH    L0617X\r
+ ;     PUSH    A\r
+ ;     LDS     A,ROW_COLUMN\r
+ ;     OUT     SREG,C\r
+ ;     ROL     A\r
+ ;     SBRS    A,7\r
+ ;     RJMP    L0617XX\r
+ ;     RCALL   TX_CHAR\r
+ ;     LDI     A,1\r
+ ;L0617XX:\r
+ ;     STS     ROW_COLUMN,A\r
+ ;     POP     A\r
+ ;L0617X:\r
+\r
+       LDIZ    SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDI     D,$E0\r
+       CP      R0,D\r
+       BRLO    L05A8\r
+       ; WE HAVE A ROW STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       LDS     D,ROW_BITMAP\r
+       ROL     D\r
+       STS     ROW_BITMAP,D\r
+       LDS     D,ROW_BITMAP+1\r
+       ROL     D\r
+       STS     ROW_BITMAP+1,D\r
+       RJMP    L05F9\r
+L05A8: ; WE HAVE A COLUMN STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       BRLO    L05AB\r
+       RJMP    L05F9\r
+L05AB: ; WE HAVE AN ACTIVE COLUMN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L05B3\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       RJMP    L05F9\r
+L05B3: ; LOOK FOR ANY ACTIVE ROW\r
+       LDS     D,ROW_BITMAP+1\r
+       LDS     C,ROW_BITMAP\r
+       PUSH    A\r
+       LDI     A,$38\r
+L05B9: SUBI    A,$04\r
+       RJEQ    L05F8   ;BREQ   L05F8\r
+       ROR     D\r
+       ROR     C\r
+       BRSH    L05B9\r
+       ; WE FOUND AN INTERSECTION\r
+       PUSH    D\r
+       PUSH    C\r
+\r
+       LDS     D,LATCH5_SAV\r
+       SBRS    D,7\r
+       RJMP    ALREADY_ON\r
+\r
+       ;LDS    D,TURNON_COUNT\r
+       ;TST    D\r
+       ;BREQ   TURNON_OK\r
+       ;DEC    D\r
+       ;STS    TURNON_COUNT,D\r
+       ;BRNE   TURNON_OK\r
+\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; RESET TURNOFF REQUEST\r
+\r
+;TURNON_OK:\r
+       RJMP    L05F8\r
+\r
+ALREADY_ON:\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       MOV     C,A\r
+       SUBI    C,$04\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+       LPM\r
+       MOV     C,R0\r
+       LSL     R0\r
+       LSL     R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       ADD     C,R0\r
+       LDI     ZL,LOW(RTN_DSPRAM)      ; RETURN CODE TABLE\r
+       LDI     ZH,HIGH(RTN_DSPRAM)\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       PUSH    F\r
+       RAMRDX  R0\r
+       POP     F\r
+\r
+       POP     C\r
+       POP     D\r
+       TST     R0\r
+       RJEQ    L05B9                   ; NULL INTERSECTION, FIND ANOTHER\r
+\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       STS     ACTIVE_ZONE,R0\r
+       LDI     D,$10\r
+       STS     BUZZ_TIME,D             ; SHORT BEEP ON MAKE\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-2\r
+       BRSH    L05F8\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'Z'\r
+       RCALL   TX_CHAR\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+\r
+L05F8: ; SCAN TO NEXT LED / PHOTODIODE PAIR\r
+       POP     A\r
+L05F9: LDI     D,$04\r
+       ADD     SCAN,D\r
+       LDI     C,$C8\r
+       CP      SCAN,C\r
+       BRLO    L0617\r
+\r
+ ;     MOV     D,TX_COUNT\r
+ ;     CPI     D,TX_SIZE-1\r
+ ;     BRSH    L0617Y\r
+ ;     PUSH    A\r
+ ;     LDS     A,ROW_COLUMN\r
+ ;     LSR     A\r
+ ;L0617YY:\r
+ ;     ROL     A\r
+ ;     SBRS    A,7\r
+ ;     RJMP    L0617YY\r
+ ;     RCALL   TX_CHAR\r
+ ;     LDI     A,1\r
+ ;     STS     ROW_COLUMN,A\r
+ ;     LDI     A,$0D\r
+ ;     RCALL   TX_CHAR\r
+ ;     POP     A\r
+ ;L0617Y:\r
+\r
+       ; COMPLETED ENTIRE SCAN, START NEW SCAN\r
+;      SBI     DDRC,7\r
+;      SBI     PORTC,7                 ; DIAGNOSTIC SYNC FOR LED SCAN\r
+;      CBI     PORTC,7\r
+       CLR     SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0617\r
+       DEC     D\r
+       STS     DEBOUNCE,D\r
+       BRNE    L0617\r
+       LDS     D,ACTIVE_ZONE\r
+       TST     D\r
+       BREQ    L0617\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-2\r
+       BRSH    L0617\r
+       PUSH    A\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'Z'\r
+       RCALL   TX_CHAR\r
+       LDI     A,0\r
+       RCALL   TX_CHAR\r
+       POP     A\r
+L0617: ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+       LDIZ    SCAN_TBL\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDS     D,LATCH5_SAV\r
+       ANDI    D,$C0\r
+       OR      D,R0\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+;      SBI     PORTC,6                 ; DIAGNOSTIC DURATION FOR PHOTO ROUTINE\r
+;      CBI     PORTC,6\r
+       RJMP    END_INT\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    L0659\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_PAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; 1ST BYTE = LED\r
+; 2ND BYTE = PHOTO\r
+; 3RD BYTE = TOUCH CHANNEL\r
+\r
+SCAN_TBL:\r
+       .DB     $F0,$34,$00,$00,$E8,$34,$01,$00,$F0,$33,$01,$00,$E8,$33,$02,$00\r
+       .DB     $E4,$33,$03,$00,$E8,$32,$03,$00,$E4,$32,$04,$00,$E2,$32,$05,$00\r
+       .DB     $E4,$31,$05,$00,$E2,$31,$06,$00,$E1,$31,$07,$00,$E2,$30,$07,$00\r
+       .DB     $E1,$30,$08,$00,$C1,$2A,$00,$00,$C2,$2A,$01,$00,$C1,$2B,$01,$00\r
+       .DB     $C2,$2B,$02,$00,$C4,$2B,$03,$00,$C2,$2C,$03,$00,$C4,$2C,$04,$00\r
+       .DB     $C8,$2C,$05,$00,$C4,$18,$05,$00,$C8,$18,$06,$00,$D0,$18,$07,$00\r
+       .DB     $C8,$19,$07,$00,$D0,$19,$08,$00,$A1,$19,$09,$00,$D0,$1A,$09,$00\r
+       .DB     $A1,$1A,$0A,$00,$A2,$1A,$0B,$00,$A1,$1B,$0B,$00,$A2,$1B,$0C,$00\r
+       .DB     $A4,$1B,$0D,$00,$A2,$1C,$0D,$00,$A4,$1C,$0E,$00,$A8,$1C,$0F,$00\r
+       .DB     $A4,$1D,$0F,$00,$A8,$1D,$10,$00,$B0,$1D,$11,$00,$A8,$1E,$11,$00\r
+       .DB     $B0,$1E,$12,$00,$61,$1E,$13,$00,$B0,$1F,$13,$00,$61,$1F,$14,$00\r
+       .DB     $62,$1F,$15,$00,$61,$28,$15,$00,$62,$28,$16,$00,$64,$28,$17,$00\r
+       .DB     $62,$29,$17,$00,$64,$29,$18,$00\r
+\r
+RTN_CODE:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$08,$08,$08,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$7E,$00,$31,$00,$32,$00,$33,$00,$34,$00,$35,$00,$36,$00\r
+       .DB     $37,$00,$38,$00,$39,$00,$30,$00,$2D,$00,$3D,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$51,$00,$57,$00,$45,$00,$52,$00,$54,$00,$59,$00\r
+       .DB     $55,$00,$49,$00,$4F,$00,$50,$00,$5B,$00,$5D,$00,$5C,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$41,$00,$53,$00,$44,$00,$46,$00,$47,$00\r
+       .DB     $48,$00,$4A,$00,$4B,$00,$4C,$00,$3B,$00,$27,$00,$0D,$0D,$0D,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5A,$00,$58,$00,$43,$00\r
+       .DB     $56,$00,$42,$00,$4E,$00,$4D,$00,$2C,$00,$2E,$00,$2F,$00,$00,$00\r
+       .DB     $00,$00\r
+RTN_CODE_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+       .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+       .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+       .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+       .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+       .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+       .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+       .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+       .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+       .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+       .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+       .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+       .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+       .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+       .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+       .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+       .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+       .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+       .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+       .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+       .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+       .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+       .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+       .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+       .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+       .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+       .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+       .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+       .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+       .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+       .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+       .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+       .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+       .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+       .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+       .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+       .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+       .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+       .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+       .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+       .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+       .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+       .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+       .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+       .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+       .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+       .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+       .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+       .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+       .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+       .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+       .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+       .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+       .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+       .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+       .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+       .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+       .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+       .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+       .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+       .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+       .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+       .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+       .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cs64v1.asm b/src/avr/cs64v1.asm
new file mode 100644 (file)
index 0000000..a8e77d9
--- /dev/null
@@ -0,0 +1,2912 @@
+;      CS64V1.ASM\r
+;      22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;              TO WORK WITH REV E PARTS\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     PAGE,YH\r
+       RCALL   ADRYP                   ; AND SET PAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+; THIS WILL CORRUPT BACKLIGHT\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0\r
+       ANDI    R19,$80\r
+       EOR     R19,@0\r
+       SEI\r
+       OUT     PORTC,R19\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       SEI\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV          ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @0,1                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @0,0                    ; A14\r
+       BLD     R19,6 ;0\r
+       SEI\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV  ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @1,7                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,6 ;0\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,2\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       SBI     PORTB,2\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,2\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SBI     PORTB,2\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,2\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       SBI     PORTB,2\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,2\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       SBI     PORTB,2\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,2\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       SBI     PORTB,2\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =$FB35\r
+.EQU   T1_FULL_SCALE   =$FC2F\r
+\r
+.EQU   VEE_MIN         =$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         =$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =$FE00\r
+\r
+.EQU   CONTRAST_LONG   =$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  =$FFF0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =$FE00\r
+\r
+.EQU   VCC_NOMINAL     =$FCDC\r
+\r
+; WITH VCC = $FCDC FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FD18 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FD78 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FD48\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+.EQU   CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    =$FF80 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =$FD60\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$61000 ;$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$62000 ;$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$40\r
+.EQU   CHARACTER_SETS  =6\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$10\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF    BOXSIZEX       =R7             ; ASSIGNED TWICE\r
+.DEF    BOXSIZEY       =R8             ; ASSIGNED TWICE\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   0=BACKLIGHT INVERSION OFF       1=BACKLIGHT INVERSION ON\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+LATCH11_SAV:   .BYTE   1\r
+PAGE:          .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+; MUST CONVERT TO USE DRAW_CHAR_TTY ROUTINE\r
+;CHAR_X:       .BYTE   1\r
+;CHAR_Y:       .BYTE   1\r
+;CHAR_PTR:     .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   2\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+BACKLIGHT_COUNT: .BYTE 1\r
+\r
+AVECNT:                .BYTE   1\r
+AVEVCC:                .BYTE   1\r
+AVEVCCL:       .BYTE   1\r
+AVEVCCH:       .BYTE   1\r
+AVEVEE:                .BYTE   1\r
+AVEVEEL:       .BYTE   1\r
+AVEVEEH:       .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RETI                            ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_TIM1_OVF\r
+       RETI                            ; TIM0_OVF\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+RESTART_ENTRY:\r
+       LDI     F,$00\r
+       OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+       OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+\r
+       LDI     F,$F8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       LDI     F,$B8 ;$F8\r
+       OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+       OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+\r
+       LDI     F,$00\r
+       OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+\r
+       LDI     F,$20 ;$A0 NO BACKLIGHT INVERSION INITIALLY\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ON\r
+\r
+       INIT_API_BUS\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT+1,D         ; KLUDGE FOR EXTRA 2 BITS OF RESOLUTION\r
+\r
+       ; INITIALISE T6963C DISPLAY CONTROLLER\r
+       SBI     PORTD,6                 ; COME OUT OF RESET\r
+\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+RESET_DELAY:\r
+       WDR                             ; 10OCT02 RESET WATCHDOG\r
+       SBIW    ZL,1\r
+       BRNE    RESET_DELAY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOP:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+       ; ADRL MACRO WILL CORRUPT BACKLIGHT\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       CLR     A\r
+       STS     BACKLIGHT_COUNT,A       ; ENSURE BACKLIGHT COUNT IS IN RANGE\r
+\r
+       CLR     ZL\r
+       CLR     ZH                      ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$04 ;$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_COMMAND:\r
+       RCALL   WAIT_STATUS             ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+WRITE_COMMAND_AUTO:\r
+       RCALL   WAIT_AUTO               ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+\r
+WRITE_DATA:\r
+       RCALL   WAIT_STATUS\r
+       RJMP    WRITE_DATA_ENTRY\r
+WRITE_DATA_AUTO:\r
+       RCALL   WAIT_AUTO\r
+WRITE_DATA_ENTRY:\r
+       CBI     PORTC,0                 ; C/D = 0\r
+WRITE_ENTRY:\r
+       OUT     PORTA,F\r
+       NOP\r
+       NOP\r
+       NOP\r
+       CLI\r
+       CBI     PORTB,1                 ; WR = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SEI\r
+       SBI     PORTB,1                 ; WR = 1\r
+       RET\r
+\r
+WAIT_AUTO:\r
+       PUSH    F\r
+WAIT_AUTO_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRS    F,3\r
+       RJMP    WAIT_AUTO_LOOP\r
+       POP     F\r
+       RET\r
+\r
+WAIT_STATUS:\r
+       PUSH    F\r
+WAIT_STATUS_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRC    F,0\r
+       SBRS    F,1\r
+       RJMP    WAIT_STATUS_LOOP\r
+       POP     F\r
+       RET\r
+\r
+READ_STATUS:\r
+       SBI     PORTC,0                 ; C/D = 1\r
+       LDI     F,0\r
+       OUT     DDRA,F                  ; D0-D7 = INPUTS\r
+       CLI\r
+       CBI     PORTB,0                 ; RD = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SBI     PORTB,0                 ; RD = 1\r
+       IN      F,PINA                  ; READ DATA BEFORE RD COMES UP\r
+       SEI\r
+       PUSH    F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; D0-D7 = OUTPUTS\r
+       POP     F\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       CBI     PORTD,4                 ; TURN TRANSISTOR ON (PULL DOWN VSWT)\r
+       CBI     PORTD,5                 ; TURN OFF VEE MEASURING\r
+\r
+       SBI     PORTB,2                 ; SRAM SELECT = 1\r
+       CBI     PORTD,6                 ; T6963C RESET = 0\r
+       CBI     PORTD,7                 ; T6963C SELECT = 0\r
+       CBI     PORTB,0                 ; RD = 0\r
+       CBI     PORTB,1                 ; WR = 0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; D0-D7 = OUTPUTS\r
+       LDI     D,0\r
+       OUT     PORTA,D                 ; D0-D7 = 0\r
+\r
+       LDI     D,0 ;$40\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 0 / 1 INTERRUPTS\r
+\r
+       ;LDI    D,0\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+;      LDI     F,$18\r
+;      STS     TURNON_COUNT,F          ; .1 SECOND TO BREAK, .2 SECOND TO MAKE\r
+;\r
+;      SEI\r
+;\r
+;SLEEP_LOOP:\r
+;      SLEEP\r
+;\r
+;      LDS     F,TURNON_COUNT\r
+;      TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+;      BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+;\r
+;      CLI\r
+;      RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$6A\r
+       OUT     MCUCR,D                 ; SE=0 SM1:SM0=10 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP:\r
+;      LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
+;      LDS     YL,LATCH10_SAV\r
+;      ANDI    YL,$E0\r
+;      OR      YH,YL\r
+;      OUT     PORTA,YH\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,PAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     PAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+       CPI     A,$0A\r
+       RJEQ    LF\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'A'\r
+       RJEQ    SET_BACKLIGHT\r
+       CPI     A,'B'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+;      OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+;\r
+;      LDI     F,$F8                   ; INIT_PORTS\r
+;      OUT     DDRD,F\r
+;      LDI     F,$B8 ;$F8\r
+;      OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+;      LDI     F,$1F\r
+;      OUT     DDRB,F\r
+;      LDI     F,$FF\r
+;      OUT     DDRA,F\r
+;      OUT     DDRC,F\r
+;\r
+;      CLR     F\r
+;      OUT     PORTA,F\r
+;\r
+;;     LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+;;     LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+; IN F,PORTB\r
+; ANDI F,$10 ; PRESERVE B4 FOR BACKLIGHT\r
+; ORI F,$03 ; CS, RD, WR HI, LEs ALL LO\r
+;      OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+;\r
+;;     LDI     F,$00\r
+; IN F,PORTC\r
+; ANDI F,$80 ; PRESERVE C7 FOR BACKLIGHT\r
+;      OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+; CBI PORTD,6 ; SEE OUT PORTD,F ABOVE\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYX:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYX\r
+;\r
+;      ; INITIALISE T6963C DISPLAY CONTROLLER\r
+;      SBI     PORTD,6                 ; COME OUT OF RESET\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYY:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOPZ:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOPZ\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     A,HIGH(CONTRAST_MID)\r
+;      OUT     OCR1BH,A\r
+;      LDI     A,LOW(CONTRAST_MID)\r
+;      OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+;\r
+;      LDI     A,HIGH(T1_INIT)\r
+;      OUT     TCNT1H,A\r
+;      LDI     A,LOW(T1_INIT)\r
+;      OUT     TCNT1L,A\r
+;\r
+;      LDI     A,$50\r
+;      OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+;      LDI     A,$01\r
+;      OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+;\r
+;      LDI     F,$04 ;$05\r
+;      OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+;      OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+;\r
+;      LDI     F,$0A\r
+;      OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+;      LDI     F,$C0\r
+;      OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+;      OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_BACKLIGHT:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,1\r
+       BRNE    SET_BACKLIGHT_ON\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+       RJMP    MAIN_LOOP\r
+SET_BACKLIGHT_ON:\r
+       LDI     A,1<<7\r
+       OR      FLAGS,A                 ; ENABLE INTERRUPT BACKLIGHT INVERSION\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    RCALL   CARRIAGE_RET\r
+       RJMP    MAIN_LOOP\r
+\r
+CARRIAGE_RET:\r
+       CLR     CURSORX\r
+       RET\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+; LDS A,CONTRASTL\r
+; RCALL TX_WAIT\r
+; LDS A,CONTRASTH\r
+; RCALL TX_WAIT\r
+; LDI A,$0D\r
+; RCALL TX_WAIT\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+GO_TIM1_OVF:\r
+       RJMP    TIM1_OVF\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+;NICK_REPORT:\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A\r
+;\r
+;      PUSH    B\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVCC\r
+;      LDS     B,VCCL\r
+;      ADD     A,B\r
+;      STS     AVEVCC,A\r
+;      LDS     A,AVEVCCL\r
+;      LDS     B,VCCH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVCCL,A\r
+;      LDS     A,AVEVCCH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVCCH,A\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVEE\r
+;      LDS     B,VEEL\r
+;      ADD     A,B\r
+;      STS     AVEVEE,A\r
+;       LDS     A,AVEVEEL\r
+;       LDS     B,VEEH\r
+;       SEI\r
+;       ADC     A,B\r
+;      STS     AVEVEEL,A\r
+;      LDS     A,AVEVEEH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVEEH,A\r
+;\r
+;      POP     B\r
+;\r
+;      LDS     A,AVECNT\r
+;      INC     A\r
+;      STS     AVECNT,A\r
+;      BRNE    NICK_REPORT_DONE\r
+;\r
+;      LDS     A,AVEVCCL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVCCH\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEH\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;\r
+;      CLR     A\r
+;      STS     AVEVCC,A\r
+;      STS     AVEVCCL,A\r
+;      STS     AVEVCCH,A\r
+;      STS     AVEVEE,A\r
+;      STS     AVEVEEL,A\r
+;      STS     AVEVEEH,A\r
+;NICK_REPORT_DONE:\r
+;      RET\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 1 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+;      SBRC    FLAGS,7\r
+;      RCALL   NICK_REPORT\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       SEI\r
+       CLR     F\r
+       STS     TEMP,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       MOV     A,YL\r
+       MOV     B,YH\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    PROP_WIDTH\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+       RJMP    PROP_MODE\r
+\r
+PROP_WIDTH:\r
+       RCALL   LPMS\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       SUB     R0,W\r
+       BRSH    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       MOV     XPIXEL,CURSORX\r
+       ADD     XPIXEL,R0\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE\r
+       MOV     F,CURSORX\r
+       ADD     F,R0\r
+       BRLO    CR_LF\r
+       RJMP    OK_LINE\r
+\r
+CR_LF: PUSH    A\r
+       PUSH    B\r
+       RCALL   CARRIAGE_RET\r
+       RCALL   LINE_FEED\r
+       LDS     F,TEMP\r
+       ADD     CURSORX,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       POP     B\r
+       POP     A\r
+OK_LINE:\r
+       ADD     CURSORX,R0\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+Y_OFFSET_DONE:\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       ADIW    YL,$01\r
+       RCALL   LPMS\r
+       MOV     Y_SIZE,R0\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0         ; REMOVE_CS WHY ??\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+       LDI     XL,LOW(ROWBUF)\r
+       LDI     XH,HIGH(ROWBUF)         ; X -> SINGLE LINE BUFFER IN AVR SRAM\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y -> SINGLE LINE FROM DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       LDI     B,30                    ; BYTES TO COPY\r
+DO_MORE:\r
+       A0_A13  YL,YH\r
+       RAMRD   A\r
+       ST      X+,A\r
+       INC     YL\r
+       DEC     B\r
+       RJNE    DO_MORE         ;BRNE   DO_MORE\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> SINGLE LINE IN T6963C BUFFER\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       MOV     F,YL\r
+       RCALL   WRITE_DATA\r
+       MOV     F,YH\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     B,30\r
+       LDI     YL,LOW(ROWBUF)\r
+       LDI     YH,HIGH(ROWBUF)         ; Y -> SINGLE LINE BUFFER IN AVR SRAM\r
+NICK_SUB2_LOOP:\r
+       LD      F,Y+\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       DEC     B\r
+       BRNE    NICK_SUB2_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+L0659: CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L0659\r
+;      BRNE    L0659\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       RET\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+EXT_INT0:\r
+       IN      SR,SREG                 ; MEASURE VCC\r
+       SBI     DDRD,2\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     VCCH,D\r
+       STS     VCCL,C\r
+       RJMP    END_EXT_INT\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    END_EXT_INT\r
+\r
+TIM1_OVF:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+; SBI DDRB,7\r
+; IN D,PORTB\r
+; SUBI D,$80\r
+; OUT PORTB,D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       SBRS    FLAGS,7\r
+       RJMP    BACKLIGHT_SKIP\r
+       LDS     D,BACKLIGHT_COUNT\r
+       INC     D\r
+; LDS C,CONTRASTL\r
+; LSL C\r
+; CP D,C\r
+       CPI     D,62 ;64                        ; 64 COUNTS = 150 HZ\r
+       BRSH    BACKLIGHT_EVEN\r
+; LSR C\r
+; CP D,C\r
+       CPI     D,31 ;32\r
+       BRNE    BACKLIGHT_SAVE\r
+;BACKLIGHT_ODD:\r
+       CBI     PORTC,7\r
+       SBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+       RJMP    BACKLIGHT_CONT\r
+BACKLIGHT_EVEN:\r
+       SBI     PORTC,7\r
+       CBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+; LDI D,1<<7\r
+; OR FLAGS,D ; FOR NICK_REPORT\r
+       LDI     D,0\r
+BACKLIGHT_CONT:\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+BACKLIGHT_SAVE:\r
+       STS     BACKLIGHT_COUNT,D\r
+BACKLIGHT_SKIP:\r
+\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+;      SBRC    FLAGS,6                 ; TURNOFF REQUESTED?\r
+;      RJMP    SLEEP_ENTRY             ; YES, SKIP CLOCKING AND SHUT DOWN\r
+\r
+       LDS     D,BREAK_COUNT+1         ; WORD IS STORED IN REVERSE ORDER\r
+       SUBI    D,-$40\r
+       STS     BREAK_COUNT+1,D         ; START OF 4 INTERRUPT BLOCK?\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+       LDI     D,$B0                   ; FORCE DUMMY COMPARE MATCH\r
+       OUT     TCCR1A,D                ; TO SET OC1B, CLR OC1A\r
+       IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+       IN      D,TCNT1H                ; READ CURRENT COUNT\r
+       SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+       SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+       OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+       OUT     OCR1AL,C\r
+       OUT     OCR1BH,D\r
+       OUT     OCR1BL,C\r
+\r
+       SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+       SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH THERE IS NOW NO CLOCKING PERIOD\r
+       LDI     D,$0B+$AB               ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VCCL\r
+       LDS     D,VCCH\r
+       LDI     E,LOW(VCC_NOMINAL)\r
+       SUB     C,E\r
+       LDI     E,HIGH(VCC_NOMINAL)\r
+       SBC     D,E\r
+\r
+       ROR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;      PUSH    D\r
+;      PUSH    C\r
+       ASR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;      POP     E\r
+;      ADD     C,E\r
+;      POP     E\r
+;      ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+\r
+; CLR D\r
+; CLR C\r
+\r
+       LDS     E,VEEL\r
+       ADD     C,E\r
+       LDS     E,VEEH\r
+       ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH WE ARE NO LONGER SETTING TIMER 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,2                  ; START VCC AND\r
+       CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+       LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+       OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+;END_INT:\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+END_EXT_INT:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    L0659\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_PAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+       .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+       .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+       .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+       .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+       .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+       .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+       .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+       .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+       .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+       .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+       .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+       .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+       .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+       .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+       .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+       .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+       .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+       .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+       .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+       .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+       .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+       .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+       .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+       .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+       .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+       .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+       .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+       .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+       .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+       .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+       .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+       .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+       .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+       .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+       .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+       .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+       .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+       .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+       .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+       .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+       .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+       .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+       .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+       .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+       .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+       .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+       .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+       .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+       .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+       .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+       .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+       .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+       .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+       .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+       .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+       .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+       .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+       .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+       .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+       .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+       .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+       .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+       .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cs64v1a.asm b/src/avr/cs64v1a.asm
new file mode 100644 (file)
index 0000000..fd75aab
--- /dev/null
@@ -0,0 +1,2913 @@
+;      CS64V1A.ASM\r
+;      22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;              TO WORK WITH REV E PARTS\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     PAGE,YH\r
+       RCALL   ADRYP                   ; AND SET PAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+; THIS WILL CORRUPT BACKLIGHT\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0\r
+       ANDI    R19,$80\r
+       EOR     R19,@0\r
+       SEI\r
+       OUT     PORTC,R19\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       SEI\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV          ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @0,1                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @0,0                    ; A14\r
+       BLD     R19,6 ;0\r
+       SEI\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV  ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @1,7                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,6 ;0\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,2\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       SBI     PORTB,2\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,2\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SBI     PORTB,2\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,2\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       SBI     PORTB,2\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,2\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       SBI     PORTB,2\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,2\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       SBI     PORTB,2\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =$FB35\r
+.EQU   T1_FULL_SCALE   =$FC2F\r
+\r
+.EQU   VEE_MIN         =$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         =$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =$FE00\r
+\r
+.EQU   CONTRAST_LONG   =$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  =$FFF0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =$FE00\r
+\r
+.EQU   VCC_NOMINAL     =$FCDC\r
+\r
+; WITH VCC = $FCDC FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FD18 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FD78 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FD48\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+.EQU   CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    =$FF80 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =$FD60\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$61000 ;$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$62000 ;$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$40\r
+.EQU   CHARACTER_SETS  =6\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$10\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU    API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+.EQU    API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU    API_RATE_SLOW   =$5F ;$8F               ; DIVISOR FOR 4800 BPS\r
+.EQU    API_RATE_FAST   =$03 ;$05               ; DIVISOR FOR 115200 BPS\r
+.EQU    EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF    BOXSIZEX       =R7             ; ASSIGNED TWICE\r
+.DEF    BOXSIZEY       =R8             ; ASSIGNED TWICE\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   0=BACKLIGHT INVERSION OFF       1=BACKLIGHT INVERSION ON\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+LATCH11_SAV:   .BYTE   1\r
+PAGE:          .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+; MUST CONVERT TO USE DRAW_CHAR_TTY ROUTINE\r
+;CHAR_X:       .BYTE   1\r
+;CHAR_Y:       .BYTE   1\r
+;CHAR_PTR:     .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   2\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+BACKLIGHT_COUNT: .BYTE 1\r
+\r
+AVECNT:                .BYTE   1\r
+AVEVCC:                .BYTE   1\r
+AVEVCCL:       .BYTE   1\r
+AVEVCCH:       .BYTE   1\r
+AVEVEE:                .BYTE   1\r
+AVEVEEL:       .BYTE   1\r
+AVEVEEH:       .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RETI                            ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_TIM1_OVF\r
+       RETI                            ; TIM0_OVF\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+RESTART_ENTRY:\r
+       LDI     F,$00\r
+       OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+       OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+\r
+       LDI     F,$F8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       LDI     F,$B8 ;$F8\r
+       OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+       OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+\r
+       LDI     F,$00\r
+       OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+\r
+       LDI     F,$20 ;$A0 NO BACKLIGHT INVERSION INITIALLY\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ON\r
+\r
+       INIT_API_BUS\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT+1,D         ; KLUDGE FOR EXTRA 2 BITS OF RESOLUTION\r
+\r
+       ; INITIALISE T6963C DISPLAY CONTROLLER\r
+       SBI     PORTD,6                 ; COME OUT OF RESET\r
+\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+RESET_DELAY:\r
+       WDR                             ; 10OCT02 RESET WATCHDOG\r
+       SBIW    ZL,1\r
+       BRNE    RESET_DELAY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOP:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+       ; ADRL MACRO WILL CORRUPT BACKLIGHT\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       CLR     A\r
+       STS     BACKLIGHT_COUNT,A       ; ENSURE BACKLIGHT COUNT IS IN RANGE\r
+\r
+       CLR     ZL\r
+       CLR     ZH                      ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$04 ;$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_COMMAND:\r
+       RCALL   WAIT_STATUS             ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+WRITE_COMMAND_AUTO:\r
+       RCALL   WAIT_AUTO               ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+\r
+WRITE_DATA:\r
+       RCALL   WAIT_STATUS\r
+       RJMP    WRITE_DATA_ENTRY\r
+WRITE_DATA_AUTO:\r
+       RCALL   WAIT_AUTO\r
+WRITE_DATA_ENTRY:\r
+       CBI     PORTC,0                 ; C/D = 0\r
+WRITE_ENTRY:\r
+       OUT     PORTA,F\r
+       NOP\r
+       NOP\r
+       NOP\r
+       CLI\r
+       CBI     PORTB,1                 ; WR = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SEI\r
+       SBI     PORTB,1                 ; WR = 1\r
+       RET\r
+\r
+WAIT_AUTO:\r
+       PUSH    F\r
+WAIT_AUTO_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRS    F,3\r
+       RJMP    WAIT_AUTO_LOOP\r
+       POP     F\r
+       RET\r
+\r
+WAIT_STATUS:\r
+       PUSH    F\r
+WAIT_STATUS_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRC    F,0\r
+       SBRS    F,1\r
+       RJMP    WAIT_STATUS_LOOP\r
+       POP     F\r
+       RET\r
+\r
+READ_STATUS:\r
+       SBI     PORTC,0                 ; C/D = 1\r
+       LDI     F,0\r
+       OUT     DDRA,F                  ; D0-D7 = INPUTS\r
+       CLI\r
+       CBI     PORTB,0                 ; RD = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SBI     PORTB,0                 ; RD = 1\r
+       IN      F,PINA                  ; READ DATA BEFORE RD COMES UP\r
+       SEI\r
+       PUSH    F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; D0-D7 = OUTPUTS\r
+       POP     F\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       CBI     PORTD,4                 ; TURN TRANSISTOR ON (PULL DOWN VSWT)\r
+       CBI     PORTD,5                 ; TURN OFF VEE MEASURING\r
+\r
+       SBI     PORTB,2                 ; SRAM SELECT = 1\r
+       CBI     PORTD,6                 ; T6963C RESET = 0\r
+       CBI     PORTD,7                 ; T6963C SELECT = 0\r
+       CBI     PORTB,0                 ; RD = 0\r
+       CBI     PORTB,1                 ; WR = 0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; D0-D7 = OUTPUTS\r
+       LDI     D,0\r
+       OUT     PORTA,D                 ; D0-D7 = 0\r
+\r
+       LDI     D,0 ;$40\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 0 / 1 INTERRUPTS\r
+\r
+       ;LDI    D,0\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+;      LDI     F,$18\r
+;      STS     TURNON_COUNT,F          ; .1 SECOND TO BREAK, .2 SECOND TO MAKE\r
+;\r
+;      SEI\r
+;\r
+;SLEEP_LOOP:\r
+;      SLEEP\r
+;\r
+;      LDS     F,TURNON_COUNT\r
+;      TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+;      BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+;\r
+;      CLI\r
+;      RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$6A\r
+       OUT     MCUCR,D                 ; SE=0 SM1:SM0=10 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP:\r
+;      LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
+;      LDS     YL,LATCH10_SAV\r
+;      ANDI    YL,$E0\r
+;      OR      YH,YL\r
+;      OUT     PORTA,YH\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,PAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     PAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+       CPI     A,$0A\r
+       RJEQ    LF\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'A'\r
+       RJEQ    SET_BACKLIGHT\r
+       CPI     A,'B'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+;      OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+;\r
+;      LDI     F,$F8                   ; INIT_PORTS\r
+;      OUT     DDRD,F\r
+;      LDI     F,$B8 ;$F8\r
+;      OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+;      LDI     F,$1F\r
+;      OUT     DDRB,F\r
+;      LDI     F,$FF\r
+;      OUT     DDRA,F\r
+;      OUT     DDRC,F\r
+;\r
+;      CLR     F\r
+;      OUT     PORTA,F\r
+;\r
+;;     LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+;;     LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+; IN F,PORTB\r
+; ANDI F,$10 ; PRESERVE B4 FOR BACKLIGHT\r
+; ORI F,$03 ; CS, RD, WR HI, LEs ALL LO\r
+;      OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+;\r
+;;     LDI     F,$00\r
+; IN F,PORTC\r
+; ANDI F,$80 ; PRESERVE C7 FOR BACKLIGHT\r
+;      OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+; CBI PORTD,6 ; SEE OUT PORTD,F ABOVE\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYX:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYX\r
+;\r
+;      ; INITIALISE T6963C DISPLAY CONTROLLER\r
+;      SBI     PORTD,6                 ; COME OUT OF RESET\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYY:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOPZ:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOPZ\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     A,HIGH(CONTRAST_MID)\r
+;      OUT     OCR1BH,A\r
+;      LDI     A,LOW(CONTRAST_MID)\r
+;      OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+;\r
+;      LDI     A,HIGH(T1_INIT)\r
+;      OUT     TCNT1H,A\r
+;      LDI     A,LOW(T1_INIT)\r
+;      OUT     TCNT1L,A\r
+;\r
+;      LDI     A,$50\r
+;      OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+;      LDI     A,$01\r
+;      OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+;\r
+;      LDI     F,$04 ;$05\r
+;      OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+;      OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+;\r
+;      LDI     F,$0A\r
+;      OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+;      LDI     F,$C0\r
+;      OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+;      OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_BACKLIGHT:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,1\r
+       BRNE    SET_BACKLIGHT_ON\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+       RJMP    MAIN_LOOP\r
+SET_BACKLIGHT_ON:\r
+       LDI     A,1<<7\r
+       OR      FLAGS,A                 ; ENABLE INTERRUPT BACKLIGHT INVERSION\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    RCALL   CARRIAGE_RET\r
+       RJMP    MAIN_LOOP\r
+\r
+CARRIAGE_RET:\r
+       CLR     CURSORX\r
+       RET\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+; LDS A,CONTRASTL\r
+; RCALL TX_WAIT\r
+; LDS A,CONTRASTH\r
+; RCALL TX_WAIT\r
+; LDI A,$0D\r
+; RCALL TX_WAIT\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+GO_TIM1_OVF:\r
+       RJMP    TIM1_OVF\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+;NICK_REPORT:\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A\r
+;\r
+;      PUSH    B\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVCC\r
+;      LDS     B,VCCL\r
+;      ADD     A,B\r
+;      STS     AVEVCC,A\r
+;      LDS     A,AVEVCCL\r
+;      LDS     B,VCCH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVCCL,A\r
+;      LDS     A,AVEVCCH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVCCH,A\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVEE\r
+;      LDS     B,VEEL\r
+;      ADD     A,B\r
+;      STS     AVEVEE,A\r
+;       LDS     A,AVEVEEL\r
+;       LDS     B,VEEH\r
+;       SEI\r
+;       ADC     A,B\r
+;      STS     AVEVEEL,A\r
+;      LDS     A,AVEVEEH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVEEH,A\r
+;\r
+;      POP     B\r
+;\r
+;      LDS     A,AVECNT\r
+;      INC     A\r
+;      STS     AVECNT,A\r
+;      BRNE    NICK_REPORT_DONE\r
+;\r
+;      LDS     A,AVEVCCL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVCCH\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEH\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;\r
+;      CLR     A\r
+;      STS     AVEVCC,A\r
+;      STS     AVEVCCL,A\r
+;      STS     AVEVCCH,A\r
+;      STS     AVEVEE,A\r
+;      STS     AVEVEEL,A\r
+;      STS     AVEVEEH,A\r
+;NICK_REPORT_DONE:\r
+;      RET\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 1 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+;      SBRC    FLAGS,7\r
+;      RCALL   NICK_REPORT\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       SEI\r
+       CLR     F\r
+       STS     TEMP,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       MOV     A,YL\r
+       MOV     B,YH\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    PROP_WIDTH\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+       RJMP    PROP_MODE\r
+\r
+PROP_WIDTH:\r
+       RCALL   LPMS\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       SUB     R0,W\r
+       BRSH    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       MOV     XPIXEL,CURSORX\r
+       ADD     XPIXEL,R0\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE\r
+       MOV     F,CURSORX\r
+       ADD     F,R0\r
+       BRLO    CR_LF\r
+       RJMP    OK_LINE\r
+\r
+CR_LF: PUSH    A\r
+       PUSH    B\r
+       RCALL   CARRIAGE_RET\r
+       RCALL   LINE_FEED\r
+       LDS     F,TEMP\r
+       ADD     CURSORX,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       POP     B\r
+       POP     A\r
+OK_LINE:\r
+       ADD     CURSORX,R0\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+Y_OFFSET_DONE:\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       ADIW    YL,$01\r
+       RCALL   LPMS\r
+       MOV     Y_SIZE,R0\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0         ; REMOVE_CS WHY ??\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+       LDI     XL,LOW(ROWBUF)\r
+       LDI     XH,HIGH(ROWBUF)         ; X -> SINGLE LINE BUFFER IN AVR SRAM\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y -> SINGLE LINE FROM DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       LDI     B,30                    ; BYTES TO COPY\r
+DO_MORE:\r
+       A0_A13  YL,YH\r
+       RAMRD   A\r
+       ST      X+,A\r
+       INC     YL\r
+       DEC     B\r
+       RJNE    DO_MORE         ;BRNE   DO_MORE\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> SINGLE LINE IN T6963C BUFFER\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       MOV     F,YL\r
+       RCALL   WRITE_DATA\r
+       MOV     F,YH\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     B,30\r
+       LDI     YL,LOW(ROWBUF)\r
+       LDI     YH,HIGH(ROWBUF)         ; Y -> SINGLE LINE BUFFER IN AVR SRAM\r
+NICK_SUB2_LOOP:\r
+       LD      F,Y+\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       DEC     B\r
+       BRNE    NICK_SUB2_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+L0659: CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L0659\r
+;      BRNE    L0659\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       RET\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+EXT_INT0:\r
+       IN      SR,SREG                 ; MEASURE VCC\r
+       SBI     DDRD,2\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     VCCH,D\r
+       STS     VCCL,C\r
+       RJMP    END_EXT_INT\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    END_EXT_INT\r
+\r
+TIM1_OVF:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+; SBI DDRB,7\r
+; IN D,PORTB\r
+; SUBI D,$80\r
+; OUT PORTB,D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       SBRS    FLAGS,7\r
+       RJMP    BACKLIGHT_SKIP\r
+       LDS     D,BACKLIGHT_COUNT\r
+       INC     D\r
+; LDS C,CONTRASTL\r
+; LSL C\r
+; CP D,C\r
+       CPI     D,37 ;62 ;64                    ; 64 COUNTS = 150 HZ\r
+       BRSH    BACKLIGHT_EVEN\r
+; LSR C\r
+; CP D,C\r
+       CPI     D,18 ;31 ;32\r
+       BRNE    BACKLIGHT_SAVE\r
+;BACKLIGHT_ODD:\r
+       CBI     PORTC,7\r
+       SBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+       RJMP    BACKLIGHT_CONT\r
+BACKLIGHT_EVEN:\r
+       SBI     PORTC,7\r
+       CBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+; LDI D,1<<7\r
+; OR FLAGS,D ; FOR NICK_REPORT\r
+       LDI     D,0\r
+BACKLIGHT_CONT:\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+BACKLIGHT_SAVE:\r
+       STS     BACKLIGHT_COUNT,D\r
+BACKLIGHT_SKIP:\r
+\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+;      SBRC    FLAGS,6                 ; TURNOFF REQUESTED?\r
+;      RJMP    SLEEP_ENTRY             ; YES, SKIP CLOCKING AND SHUT DOWN\r
+\r
+       LDS     D,BREAK_COUNT+1         ; WORD IS STORED IN REVERSE ORDER\r
+       SUBI    D,-$40\r
+       STS     BREAK_COUNT+1,D         ; START OF 4 INTERRUPT BLOCK?\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+       LDI     D,$B0                   ; FORCE DUMMY COMPARE MATCH\r
+       OUT     TCCR1A,D                ; TO SET OC1B, CLR OC1A\r
+       IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+       IN      D,TCNT1H                ; READ CURRENT COUNT\r
+       SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+       SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+       OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+       OUT     OCR1AL,C\r
+       OUT     OCR1BH,D\r
+       OUT     OCR1BL,C\r
+\r
+       SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+       SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH THERE IS NOW NO CLOCKING PERIOD\r
+       LDI     D,$0B+$AB               ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VCCL\r
+       LDS     D,VCCH\r
+       LDI     E,LOW(VCC_NOMINAL)\r
+       SUB     C,E\r
+       LDI     E,HIGH(VCC_NOMINAL)\r
+       SBC     D,E\r
+\r
+       ROR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;      PUSH    D\r
+;      PUSH    C\r
+       ASR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;      POP     E\r
+;      ADD     C,E\r
+;      POP     E\r
+;      ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+\r
+; CLR D\r
+; CLR C\r
+\r
+       LDS     E,VEEL\r
+       ADD     C,E\r
+       LDS     E,VEEH\r
+       ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH WE ARE NO LONGER SETTING TIMER 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,2                  ; START VCC AND\r
+       CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+       LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+       OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+;END_INT:\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+END_EXT_INT:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    L0659\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_PAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+       .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+       .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+       .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+       .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+       .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+       .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+       .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+       .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+       .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+       .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+       .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+       .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+       .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+       .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+       .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+       .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+       .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+       .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+       .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+       .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+       .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+       .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+       .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+       .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+       .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+       .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+       .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+       .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+       .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+       .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+       .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+       .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+       .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+       .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+       .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+       .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+       .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+       .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+       .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+       .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+       .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+       .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+       .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+       .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+       .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+       .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+       .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+       .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+       .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+       .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+       .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+       .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+       .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+       .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+       .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+       .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+       .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+       .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+       .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+       .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+       .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+       .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+       .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cs64v2.asm b/src/avr/cs64v2.asm
new file mode 100644 (file)
index 0000000..2de7eab
--- /dev/null
@@ -0,0 +1,2928 @@
+;      CS64V2.ASM\r
+;      22NOV01 REVISE FOR OPERATION FROM VCC INSTEAD OF VBAT\r
+;              INVERT SENSE OF SRAM CHIP SELECT\r
+;              STILL NEED TO REMOVE VCC COMPENSATION CODE\r
+\r
+;      22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;              TO WORK WITH REV E PARTS\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     PAGE,YH\r
+       RCALL   ADRYP                   ; AND SET PAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+; THIS WILL CORRUPT BACKLIGHT\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0\r
+       ANDI    R19,$80\r
+       EOR     R19,@0\r
+       SEI\r
+       OUT     PORTC,R19\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       SEI\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV          ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @0,1                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @0,0                    ; A14\r
+       BLD     R19,6 ;0\r
+       SEI\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV  ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @1,7                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,6 ;0\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =$FB35\r
+.EQU   T1_FULL_SCALE   =$FC2F\r
+\r
+.EQU   VEE_MIN         =$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         =$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =$FE00\r
+\r
+.EQU   CONTRAST_LONG   =$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  =$FFF0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =$FE00\r
+\r
+.EQU   VCC_NOMINAL     =$FCDC\r
+\r
+; WITH VCC = $FCDC FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FD18 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FD78 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FD48\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+.EQU   CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    =$FF80 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =$FD60\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$61000 ;$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$62000 ;$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$40\r
+.EQU   CHARACTER_SETS  =6\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$10\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF    BOXSIZEX       =R7             ; ASSIGNED TWICE\r
+.DEF    BOXSIZEY       =R8             ; ASSIGNED TWICE\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   0=BACKLIGHT INVERSION OFF       1=BACKLIGHT INVERSION ON\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+LATCH11_SAV:   .BYTE   1\r
+PAGE:          .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+; MUST CONVERT TO USE DRAW_CHAR_TTY ROUTINE\r
+;CHAR_X:       .BYTE   1\r
+;CHAR_Y:       .BYTE   1\r
+;CHAR_PTR:     .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   2\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+BACKLIGHT_COUNT: .BYTE 1\r
+\r
+AVECNT:                .BYTE   1\r
+AVEVCC:                .BYTE   1\r
+AVEVCCL:       .BYTE   1\r
+AVEVCCH:       .BYTE   1\r
+AVEVEE:                .BYTE   1\r
+AVEVEEL:       .BYTE   1\r
+AVEVEEH:       .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RETI                            ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_TIM1_OVF\r
+       RETI                            ; TIM0_OVF\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+RESTART_ENTRY:\r
+       LDI     F,$00\r
+       OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+       OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+\r
+       LDI     F,$F8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       LDI     F,$B8 ;$F8\r
+       OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+;      LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+       LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+       OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+\r
+       LDI     F,$00\r
+       OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+\r
+       LDI     F,$20 ;$A0 NO BACKLIGHT INVERSION INITIALLY\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ON\r
+\r
+       INIT_API_BUS\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT+1,D         ; KLUDGE FOR EXTRA 2 BITS OF RESOLUTION\r
+\r
+       ; INITIALISE T6963C DISPLAY CONTROLLER\r
+       SBI     PORTD,6                 ; COME OUT OF RESET\r
+\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+RESET_DELAY:\r
+       WDR                             ; 10OCT02 RESET WATCHDOG\r
+       SBIW    ZL,1\r
+       BRNE    RESET_DELAY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOP:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+       ; ADRL MACRO WILL CORRUPT BACKLIGHT\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       CLR     A\r
+       STS     BACKLIGHT_COUNT,A       ; ENSURE BACKLIGHT COUNT IS IN RANGE\r
+\r
+       CLR     ZL\r
+       CLR     ZH                      ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$04 ;$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_COMMAND:\r
+       RCALL   WAIT_STATUS             ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+WRITE_COMMAND_AUTO:\r
+       RCALL   WAIT_AUTO               ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+\r
+WRITE_DATA:\r
+       RCALL   WAIT_STATUS\r
+       RJMP    WRITE_DATA_ENTRY\r
+WRITE_DATA_AUTO:\r
+       RCALL   WAIT_AUTO\r
+WRITE_DATA_ENTRY:\r
+       CBI     PORTC,0                 ; C/D = 0\r
+WRITE_ENTRY:\r
+       OUT     PORTA,F\r
+       NOP\r
+       NOP\r
+       NOP\r
+       CLI\r
+       CBI     PORTB,1                 ; WR = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SEI\r
+       SBI     PORTB,1                 ; WR = 1\r
+       RET\r
+\r
+WAIT_AUTO:\r
+       PUSH    F\r
+WAIT_AUTO_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRS    F,3\r
+       RJMP    WAIT_AUTO_LOOP\r
+       POP     F\r
+       RET\r
+\r
+WAIT_STATUS:\r
+       PUSH    F\r
+WAIT_STATUS_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRC    F,0\r
+       SBRS    F,1\r
+       RJMP    WAIT_STATUS_LOOP\r
+       POP     F\r
+       RET\r
+\r
+READ_STATUS:\r
+       SBI     PORTC,0                 ; C/D = 1\r
+       LDI     F,0\r
+       OUT     DDRA,F                  ; D0-D7 = INPUTS\r
+       CLI\r
+       CBI     PORTB,0                 ; RD = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SBI     PORTB,0                 ; RD = 1\r
+       IN      F,PINA                  ; READ DATA BEFORE RD COMES UP\r
+       SEI\r
+       PUSH    F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; D0-D7 = OUTPUTS\r
+       POP     F\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       CBI     PORTD,4                 ; TURN TRANSISTOR ON (PULL DOWN VSWT)\r
+       CBI     PORTD,5                 ; TURN OFF VEE MEASURING\r
+\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP (SRAM SELECT = 1)\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       CBI     PORTD,6                 ; T6963C RESET = 0\r
+       CBI     PORTD,7                 ; T6963C SELECT = 0\r
+       CBI     PORTB,0                 ; RD = 0\r
+       CBI     PORTB,1                 ; WR = 0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; D0-D7 = OUTPUTS\r
+       LDI     D,0\r
+       OUT     PORTA,D                 ; D0-D7 = 0\r
+\r
+       LDI     D,0 ;$40\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 0 / 1 INTERRUPTS\r
+\r
+       ;LDI    D,0\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+;      LDI     F,$18\r
+;      STS     TURNON_COUNT,F          ; .1 SECOND TO BREAK, .2 SECOND TO MAKE\r
+;\r
+;      SEI\r
+;\r
+;SLEEP_LOOP:\r
+;      SLEEP\r
+;\r
+;      LDS     F,TURNON_COUNT\r
+;      TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+;      BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+;\r
+;      CLI\r
+;      RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$6A\r
+       OUT     MCUCR,D                 ; SE=0 SM1:SM0=10 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP:\r
+;      LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
+;      LDS     YL,LATCH10_SAV\r
+;      ANDI    YL,$E0\r
+;      OR      YH,YL\r
+;      OUT     PORTA,YH\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,PAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     PAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+       CPI     A,$0A\r
+       RJEQ    LF\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'A'\r
+       RJEQ    SET_BACKLIGHT\r
+       CPI     A,'B'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+;      OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+;\r
+;      LDI     F,$F8                   ; INIT_PORTS\r
+;      OUT     DDRD,F\r
+;      LDI     F,$B8 ;$F8\r
+;      OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+;      LDI     F,$1F\r
+;      OUT     DDRB,F\r
+;      LDI     F,$FF\r
+;      OUT     DDRA,F\r
+;      OUT     DDRC,F\r
+;\r
+;      CLR     F\r
+;      OUT     PORTA,F\r
+;\r
+;;     LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+;;     LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+; IN F,PORTB\r
+; ANDI F,$10 ; PRESERVE B4 FOR BACKLIGHT\r
+; ORI F,$03 ; CS, RD, WR HI, LEs ALL LO\r
+;      OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+;\r
+;;     LDI     F,$00\r
+; IN F,PORTC\r
+; ANDI F,$80 ; PRESERVE C7 FOR BACKLIGHT\r
+;      OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+; CBI PORTD,6 ; SEE OUT PORTD,F ABOVE\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYX:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYX\r
+;\r
+;      ; INITIALISE T6963C DISPLAY CONTROLLER\r
+;      SBI     PORTD,6                 ; COME OUT OF RESET\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYY:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOPZ:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOPZ\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     A,HIGH(CONTRAST_MID)\r
+;      OUT     OCR1BH,A\r
+;      LDI     A,LOW(CONTRAST_MID)\r
+;      OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+;\r
+;      LDI     A,HIGH(T1_INIT)\r
+;      OUT     TCNT1H,A\r
+;      LDI     A,LOW(T1_INIT)\r
+;      OUT     TCNT1L,A\r
+;\r
+;      LDI     A,$50\r
+;      OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+;      LDI     A,$01\r
+;      OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+;\r
+;      LDI     F,$04 ;$05\r
+;      OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+;      OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+;\r
+;      LDI     F,$0A\r
+;      OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+;      LDI     F,$C0\r
+;      OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+;      OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_BACKLIGHT:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,1\r
+       BRNE    SET_BACKLIGHT_ON\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+       RJMP    MAIN_LOOP\r
+SET_BACKLIGHT_ON:\r
+       LDI     A,1<<7\r
+       OR      FLAGS,A                 ; ENABLE INTERRUPT BACKLIGHT INVERSION\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    RCALL   CARRIAGE_RET\r
+       RJMP    MAIN_LOOP\r
+\r
+CARRIAGE_RET:\r
+       CLR     CURSORX\r
+       RET\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+; LDS A,CONTRASTL\r
+; RCALL TX_WAIT\r
+; LDS A,CONTRASTH\r
+; RCALL TX_WAIT\r
+; LDI A,$0D\r
+; RCALL TX_WAIT\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+GO_TIM1_OVF:\r
+       RJMP    TIM1_OVF\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+;NICK_REPORT:\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A\r
+;\r
+;      PUSH    B\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVCC\r
+;      LDS     B,VCCL\r
+;      ADD     A,B\r
+;      STS     AVEVCC,A\r
+;      LDS     A,AVEVCCL\r
+;      LDS     B,VCCH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVCCL,A\r
+;      LDS     A,AVEVCCH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVCCH,A\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVEE\r
+;      LDS     B,VEEL\r
+;      ADD     A,B\r
+;      STS     AVEVEE,A\r
+;       LDS     A,AVEVEEL\r
+;       LDS     B,VEEH\r
+;       SEI\r
+;       ADC     A,B\r
+;      STS     AVEVEEL,A\r
+;      LDS     A,AVEVEEH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVEEH,A\r
+;\r
+;      POP     B\r
+;\r
+;      LDS     A,AVECNT\r
+;      INC     A\r
+;      STS     AVECNT,A\r
+;      BRNE    NICK_REPORT_DONE\r
+;\r
+;      LDS     A,AVEVCCL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVCCH\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEH\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;\r
+;      CLR     A\r
+;      STS     AVEVCC,A\r
+;      STS     AVEVCCL,A\r
+;      STS     AVEVCCH,A\r
+;      STS     AVEVEE,A\r
+;      STS     AVEVEEL,A\r
+;      STS     AVEVEEH,A\r
+;NICK_REPORT_DONE:\r
+;      RET\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 1 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+;      SBRC    FLAGS,7\r
+;      RCALL   NICK_REPORT\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       SEI\r
+       CLR     F\r
+       STS     TEMP,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       MOV     A,YL\r
+       MOV     B,YH\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    PROP_WIDTH\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+       RJMP    PROP_MODE\r
+\r
+PROP_WIDTH:\r
+       RCALL   LPMS\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       SUB     R0,W\r
+       BRSH    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       MOV     XPIXEL,CURSORX\r
+       ADD     XPIXEL,R0\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE\r
+       MOV     F,CURSORX\r
+       ADD     F,R0\r
+       BRLO    CR_LF\r
+       RJMP    OK_LINE\r
+\r
+CR_LF: PUSH    A\r
+       PUSH    B\r
+       RCALL   CARRIAGE_RET\r
+       RCALL   LINE_FEED\r
+       LDS     F,TEMP\r
+       ADD     CURSORX,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       POP     B\r
+       POP     A\r
+OK_LINE:\r
+       ADD     CURSORX,R0\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+Y_OFFSET_DONE:\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       ADIW    YL,$01\r
+       RCALL   LPMS\r
+       MOV     Y_SIZE,R0\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0         ; REMOVE_CS WHY ??\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+       LDI     XL,LOW(ROWBUF)\r
+       LDI     XH,HIGH(ROWBUF)         ; X -> SINGLE LINE BUFFER IN AVR SRAM\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y -> SINGLE LINE FROM DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       LDI     B,30                    ; BYTES TO COPY\r
+DO_MORE:\r
+       A0_A13  YL,YH\r
+       RAMRD   A\r
+       ST      X+,A\r
+       INC     YL\r
+       DEC     B\r
+       RJNE    DO_MORE         ;BRNE   DO_MORE\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> SINGLE LINE IN T6963C BUFFER\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       MOV     F,YL\r
+       RCALL   WRITE_DATA\r
+       MOV     F,YH\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     B,30\r
+       LDI     YL,LOW(ROWBUF)\r
+       LDI     YH,HIGH(ROWBUF)         ; Y -> SINGLE LINE BUFFER IN AVR SRAM\r
+NICK_SUB2_LOOP:\r
+       LD      F,Y+\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       DEC     B\r
+       BRNE    NICK_SUB2_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+L0659: CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L0659\r
+;      BRNE    L0659\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       RET\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+EXT_INT0:\r
+       IN      SR,SREG                 ; MEASURE VCC\r
+       SBI     DDRD,2\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     VCCH,D\r
+       STS     VCCL,C\r
+       RJMP    END_EXT_INT\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    END_EXT_INT\r
+\r
+TIM1_OVF:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+; SBI DDRB,7\r
+; IN D,PORTB\r
+; SUBI D,$80\r
+; OUT PORTB,D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       SBRS    FLAGS,7\r
+       RJMP    BACKLIGHT_SKIP\r
+       LDS     D,BACKLIGHT_COUNT\r
+       INC     D\r
+; LDS C,CONTRASTL\r
+; LSL C\r
+; CP D,C\r
+       CPI     D,62 ;64                        ; 64 COUNTS = 150 HZ\r
+       BRSH    BACKLIGHT_EVEN\r
+; LSR C\r
+; CP D,C\r
+       CPI     D,31 ;32\r
+       BRNE    BACKLIGHT_SAVE\r
+;BACKLIGHT_ODD:\r
+       CBI     PORTC,7\r
+       SBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+       RJMP    BACKLIGHT_CONT\r
+BACKLIGHT_EVEN:\r
+       SBI     PORTC,7\r
+       CBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+; LDI D,1<<7\r
+; OR FLAGS,D ; FOR NICK_REPORT\r
+       LDI     D,0\r
+BACKLIGHT_CONT:\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+BACKLIGHT_SAVE:\r
+       STS     BACKLIGHT_COUNT,D\r
+BACKLIGHT_SKIP:\r
+\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+;      SBRC    FLAGS,6                 ; TURNOFF REQUESTED?\r
+;      RJMP    SLEEP_ENTRY             ; YES, SKIP CLOCKING AND SHUT DOWN\r
+\r
+       LDS     D,BREAK_COUNT+1         ; WORD IS STORED IN REVERSE ORDER\r
+       SUBI    D,-$40\r
+       STS     BREAK_COUNT+1,D         ; START OF 4 INTERRUPT BLOCK?\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+       LDI     D,$B0                   ; FORCE DUMMY COMPARE MATCH\r
+       OUT     TCCR1A,D                ; TO SET OC1B, CLR OC1A\r
+       IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+       IN      D,TCNT1H                ; READ CURRENT COUNT\r
+       SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+       SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+       OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+       OUT     OCR1AL,C\r
+       OUT     OCR1BH,D\r
+       OUT     OCR1BL,C\r
+\r
+       SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+       SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH THERE IS NOW NO CLOCKING PERIOD\r
+       LDI     D,$0B+$AB               ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VCCL\r
+       LDS     D,VCCH\r
+       LDI     E,LOW(VCC_NOMINAL)\r
+       SUB     C,E\r
+       LDI     E,HIGH(VCC_NOMINAL)\r
+       SBC     D,E\r
+\r
+       ROR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;      PUSH    D\r
+;      PUSH    C\r
+       ASR     D\r
+       ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;      POP     E\r
+;      ADD     C,E\r
+;      POP     E\r
+;      ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+\r
+; CLR D\r
+; CLR C\r
+\r
+       LDS     E,VEEL\r
+       ADD     C,E\r
+       LDS     E,VEEH\r
+       ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH WE ARE NO LONGER SETTING TIMER 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,2                  ; START VCC AND\r
+       CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+       LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+       OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+;END_INT:\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+END_EXT_INT:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    L0659\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_PAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+       .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+       .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+       .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+       .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+       .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+       .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+       .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+       .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+       .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+       .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+       .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+       .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+       .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+       .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+       .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+       .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+       .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+       .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+       .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+       .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+       .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+       .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+       .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+       .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+       .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+       .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+       .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+       .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+       .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+       .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+       .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+       .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+       .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+       .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+       .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+       .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+       .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+       .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+       .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+       .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+       .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+       .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+       .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+       .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+       .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+       .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+       .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+       .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+       .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+       .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+       .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+       .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+       .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+       .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+       .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+       .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+       .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+       .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+       .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+       .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+       .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+       .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+       .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/cs64v4-cs64v5.diff b/src/avr/cs64v4-cs64v5.diff
new file mode 100644 (file)
index 0000000..8c3c215
--- /dev/null
@@ -0,0 +1,625 @@
+--- cs64v4.asm 2003-03-18 12:26:48.000000000 +1100
++++ cs64v5.asm 2003-03-20 16:55:20.000000000 +1100
+@@ -1,4 +1,4 @@
+-;     CS64V4.ASM\r
++;     CS64V5.ASM\r
\r
+ ;     01FEB02 REVISE FOR 7.3728MHz XTAL\r
+ ;     22NOV01 REVISE FOR OPERATION FROM VCC INSTEAD OF VBAT\r
+@@ -15,8 +15,8 @@
+ .LISTMAC\r
+ .MACRO        LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+-      STS     PAGE,YH\r
+-      RCALL   ADRYP                   ; AND SET PAGE\r
++      STS     XPAGE,YH\r
++      RCALL   ADRYP                   ; AND SET XPAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+ .ENDMACRO\r
+@@ -285,12 +285,13 @@
\r
+ .EQU  API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+ .EQU  API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+-.EQU  API_RATE_SLOW   =$5F ;$8F               ; DIVISOR FOR 4800 BPS\r
+-.EQU  API_RATE_FAST   =$03 ;$05               ; DIVISOR FOR 115200 BPS\r
++.EQU  API_RATE_SLOW   =$17 ;$5F       ; DIVISOR FOR 19200 BPS\r
++.EQU  API_RATE_FAST   =$00 ;$03       ; DIVISOR FOR 460800 BPS\r
+ .EQU  EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+ .EQU  APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+ .EQU  APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
\r
++.DEF  PATTERN         =R0             ; FOR HALFTONE_RECT ROUTINE\r
+ .DEF  SR              =R1\r
+ .DEF  RX_PTR          =R2\r
+ .DEF  RX_COUNT        =R3\r
+@@ -355,7 +356,7 @@
+ TEMP:         .BYTE   1       ; 10C\r
\r
+ LATCH11_SAV:  .BYTE   1\r
+-PAGE:         .BYTE   1\r
++XPAGE:                .BYTE   1\r
+ ROWBUF:               .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
\r
+ LINE_COUNT:   .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+@@ -572,9 +573,15 @@
+       BREQ    CHARACTER_SET_INIT_DONE\r
\r
+ CHARACTER_SET_INIT:\r
+-      LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+-      LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+-      LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
++;     LDIZ    CHSET00                 ; POINT Z TO FLASH\r
++      LDI     ZL,LOW((CHSET00)*2)     ; USE PRIOR TO LPM INSTRUCTION\r
++      LDI     ZH,HIGH((CHSET00)*2)    ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
++;     LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
++      LDI     XL,LOW((CHSET00_END-CHSET00)*2) ; USE AS BYTE COUNTER\r
++      LDI     XH,HIGH((CHSET00_END-CHSET00)*2)        ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
++      LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET XPAGE\r
+ CHST0:        ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+       ; ADRL MACRO WILL CORRUPT BACKLIGHT\r
+ CHST1:        ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+@@ -612,11 +619,11 @@
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
\r
+-      LDI     B,EE_CONTRAST*2\r
++      LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+-      LDI     B,EE_CONTRAST*2+1\r
++      LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
\r
+@@ -808,7 +815,7 @@
+ ; -----------------------------------------------------------------------------\r
\r
+ ADRYP:\r
+-;     LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
++;     LDS     YH,XPAGE                ; SET XPAGE ADDRESS FOR DSPRAM\r
+ ;     LDS     YL,LATCH10_SAV\r
+ ;     ANDI    YL,$E0\r
+ ;     OR      YH,YL\r
+@@ -822,10 +829,10 @@
+ ;     CLR     YL\r
+ ;     INC     YH\r
+ ;     BRNE    INCRET\r
+-;     LDS     YH,PAGE\r
++;     LDS     YH,XPAGE\r
+ ;     INC     YH\r
+ ;     ANDI    YH,$1F\r
+-;     STS     PAGE,YH\r
++;     STS     XPAGE,YH\r
+ ;     CLR     YH\r
+ ;INCRET:      RET\r
\r
+@@ -892,14 +899,22 @@
+       RJEQ    NULLSUB\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
++      CPI     A,'c'\r
++      RJEQ    GET_CLEAR_FRAME_RECT_SIZE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
++      CPI     A,'f'\r
++      RJEQ    GET_FRAME_RECT_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
++      CPI     A,'H'\r
++      RJEQ    GET_HALFTONE_RECT_SIZE\r
++      CPI     A,'h'\r
++      RJEQ    GET_CLEAR_HALFTONE_RECT_SIZE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+@@ -1320,10 +1335,10 @@
+ ; LDI A,$0D\r
+ ; RCALL TX_WAIT\r
\r
+-      LDI     B,EE_CONTRAST*2\r
++      LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+-      LDI     B,EE_CONTRAST*2+1\r
++      LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_WRITE\r
\r
+ CONTRAST_DONE:\r
+@@ -1702,7 +1717,7 @@
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+@@ -1772,7 +1787,7 @@
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+       POP     B\r
+       POP     A\r
+ OK_LINE:\r
+@@ -1823,7 +1838,7 @@
\r
+ MORE_X:       ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
\r
+       CLR     A\r
+@@ -1910,7 +1925,7 @@
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y -> SINGLE LINE FROM DRAWING BUFFER\r
\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
\r
+       LDI     B,30                    ; BYTES TO COPY\r
+ DO_MORE:\r
+@@ -2089,7 +2104,7 @@
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+       RJMP    L03A3\r
+ L039A:        SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+@@ -2285,7 +2300,7 @@
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+ L0659:        CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+ L065C:        LDS     A,XBYTE_SAV\r
+@@ -2439,12 +2454,13 @@
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
\r
+-      ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+-      ; REMAIN THE SAME ALTHOUGH THERE IS NOW NO CLOCKING PERIOD\r
+-      LDI     D,$0B+$AB               ; WAIT FOR 3uSEC\r
+-SETTLE_CL2:\r
+-      DEC     D\r
+-      BRNE    SETTLE_CL2\r
++; 10mar03 for better API bus performance (let the chips fall where they may)\r
++;     ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
++;     ; REMAIN THE SAME ALTHOUGH THERE IS NOW NO CLOCKING PERIOD\r
++;     LDI     D,$0B+$AB               ; WAIT FOR 3uSEC\r
++;SETTLE_CL2:\r
++;     DEC     D\r
++;     BRNE    SETTLE_CL2\r
\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+@@ -2474,31 +2490,31 @@
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
\r
+-      LDS     C,VCCL\r
+-      LDS     D,VCCH\r
+-      LDI     E,LOW(VCC_NOMINAL)\r
+-      SUB     C,E\r
+-      LDI     E,HIGH(VCC_NOMINAL)\r
+-      SBC     D,E\r
+-\r
+-      ROR     D\r
+-      ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+-;     PUSH    D\r
+-;     PUSH    C\r
+-      ASR     D\r
+-      ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+-;     POP     E\r
++;     LDS     C,VCCL\r
++;     LDS     D,VCCH\r
++;     LDI     E,LOW(VCC_NOMINAL)\r
++;     SUB     C,E\r
++;     LDI     E,HIGH(VCC_NOMINAL)\r
++;     SBC     D,E\r
++;\r
++;     ROR     D\r
++;     ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
++;;    PUSH    D\r
++;;    PUSH    C\r
++;     ASR     D\r
++;     ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
++;;    POP     E\r
++;;    ADD     C,E\r
++;;    POP     E\r
++;;    ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
++;\r
++;; CLR D\r
++;; CLR C\r
++;\r
++;     LDS     E,VEEL\r
+ ;     ADD     C,E\r
+-;     POP     E\r
+-;     ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+-\r
+-; CLR D\r
+-; CLR C\r
+-\r
+-      LDS     E,VEEL\r
+-      ADD     C,E\r
+-      LDS     E,VEEH\r
+-      ADC     D,E\r
++;     LDS     E,VEEH\r
++;     ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+@@ -2562,7 +2578,7 @@
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
\r
+ L0628:        SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+@@ -2614,7 +2630,7 @@
+       STS     SCROLL_Y,CURSORY\r
\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+@@ -2815,113 +2831,244 @@
+       RAMWR   A\r
+       RET\r
\r
+-SELECT_PAGE:\r
++SELECT_XPAGE:\r
+       A14_A18 A\r
+       RET\r
\r
+ ; -----------------------------------------------------------------------------\r
\r
+ CHSET00:\r
+-      .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+-      .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+-      .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+-      .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+-      .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+-      .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+-      .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+-      .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+-      .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+-      .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+-      .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+-      .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+-      .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+-      .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+-      .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+-      .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+-      .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+-      .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+-      .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+-      .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+-      .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+-      .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+-      .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+-      .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+-      .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+-      .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+-      .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+-      .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+-      .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+-      .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+-      .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+-      .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+-      .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+-      .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+-      .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+-      .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+-      .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+-      .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+-      .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+-      .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+-      .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+-      .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+-      .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+-      .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+-      .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+-      .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+-      .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+-      .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+-      .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+-      .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+-      .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+-      .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+-      .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+-      .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+-      .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+-      .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+-      .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+-      .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+-      .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+-      .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+-      .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+-      .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+-      .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+-      .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+-      .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+-      .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+-      .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+-      .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+-      .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+-      .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+-      .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
++.INCLUDE "CHSET00.INC"\r
+ CHSET00_END:\r
\r
+ ; -----------------------------------------------------------------------------\r
\r
++GET_CLEAR_FRAME_RECT_SIZE:\r
++      STS     RECTNC_X,CURSORX\r
++      STS     RECTNC_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_YY,A\r
++      RCALL   CLEAR_FRAME_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++GET_FRAME_RECT_SIZE:\r
++      STS     RECTNC_X,CURSORX\r
++      STS     RECTNC_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_YY,A\r
++      RCALL   FRAME_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++GET_CLEAR_HALFTONE_RECT_SIZE:\r
++      STS     RECT_X,CURSORX\r
++      STS     RECT_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECT_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECT_YY,A\r
++      RCALL   CLEAR_HALFTONE_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++GET_HALFTONE_RECT_SIZE:\r
++      STS     RECT_X,CURSORX\r
++      STS     RECT_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECT_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECT_YY,A\r
++      RCALL   HALFTONE_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++NO_GOX:       RET\r
++\r
++CLEAR_FRAME_RECT:\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_Y\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_XX\r
++      STS     RECT_XX,F\r
++      LDS     F,RECTNC_YY\r
++      STS     RECT_YY,F\r
++\r
++      LDI     F,$02\r
++      OR      FLAGS,F\r
++\r
++      RCALL   DRAW_RECT\r
++\r
++      LDI     F,$FD\r
++      AND     FLAGS,F\r
++\r
++FRAME_RECT:\r
++      LDS     F,RECTNC_XX\r
++      DEC     F\r
++      CPI     F,2\r
++      BRLO    NO_GOX\r
++      LDS     F,RECTNC_YY\r
++      CPI     F,3\r
++      BRLO    NO_GOX\r
++\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_Y\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_XX\r
++      STS     RECT_XX,F\r
++      LDI     F,$01\r
++      STS     RECT_YY,F\r
++      RCALL   DRAW_RECT\r
++\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_Y\r
++      INC     F\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_YY\r
++      SUBI    F,2\r
++      STS     RECT_YY,F\r
++      LDI     F,$01\r
++      STS     RECT_XX,F\r
++      RCALL   DRAW_RECT\r
++\r
++      LDS     X_SIZE,RECTNC_XX\r
++      LDS     F,RECTNC_X\r
++      ADD     F,X_SIZE\r
++      DEC     F\r
++      STS     RECT_X,F\r
++      LDI     F,$01\r
++      STS     RECT_XX,F\r
++      LDS     F,RECTNC_Y\r
++      INC     F\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_YY\r
++      SUBI    F,2\r
++      STS     RECT_YY,F\r
++      RCALL   DRAW_RECT\r
++\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_XX\r
++      STS     RECT_XX,F\r
++      LDS     Y_SIZE,RECTNC_YY\r
++      LDS     F,RECTNC_Y\r
++      ADD     F,Y_SIZE\r
++      DEC     F\r
++      STS     RECT_Y,F\r
++      LDI     F,$01\r
++      STS     RECT_YY,F\r
++      RJMP    DRAW_RECT\r
++\r
++CLEAR_HALFTONE_RECT:\r
++;     LDS     F,RECTNC_X\r
++;     STS     RECT_X,F\r
++;     LDS     F,RECTNC_Y\r
++;     STS     RECT_Y,F\r
++;     LDS     F,RECTNC_XX\r
++;     STS     RECT_XX,F\r
++;     LDS     F,RECTNC_YY\r
++;     STS     RECT_YY,F\r
++\r
++      LDI     F,$02\r
++      OR      FLAGS,F\r
++\r
++      RCALL   DRAW_RECT\r
++\r
++      LDI     F,$FD\r
++      AND     FLAGS,F\r
++\r
++HALFTONE_RECT:\r
++      SEI\r
++      LDS     LINE_CNT,RECT_Y\r
++      LDS     XPIXEL,RECT_X\r
++      RCALL   CALCULATE_XBYTE\r
++      STS     XPIXEL_SAV,XPIXEL\r
++      STS     XBYTE_SAV,XBYTE\r
++      LDS     Y_SIZE,RECT_YY\r
++      CLR     YL\r
++      MOV     YH,LINE_CNT\r
++      LDI     A,$55\r
++      SBRS    YH,0\r
++      LDI     A,$AA\r
++      MOV     PATTERN,A\r
++      LSR     YH\r
++      ROR     YL\r
++      LSR     YH\r
++      ROR     YL\r
++      SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
++      LDI     A,HIGH(DRAW_DSPRAM>>6)\r
++      RCALL   SELECT_XPAGE\r
++      RJMP    X03A3\r
++X039A:        SUBI    YL,LOW(-$40)\r
++      SBCI    YH,HIGH(-$40)\r
++      INC     LINE_CNT\r
++      LDS     XPIXEL,XPIXEL_SAV\r
++      LDS     XBYTE,XBYTE_SAV\r
++X03A3:        OR      XBYTE,YL\r
++      LDI     A,$FF\r
++      LDS     X_SIZE,RECT_XX\r
++      LDI     F,$00\r
++      CP      X_SIZE,F\r
++      BREQ    X03B0\r
++      LDI     F,$08\r
++      CP      X_SIZE,F\r
++      BRLO    X03C2\r
++      TST     XPIXEL\r
++      BREQ    X03B0\r
++X03AD:        LSR     A\r
++      DEC     XPIXEL\r
++      BRNE    X03AD\r
++X03B0:        AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++      LDI     F,$08\r
++      LDS     A,XPIXEL_SAV\r
++      SUB     F,A\r
++      SUB     X_SIZE,F\r
++      INC     XBYTE\r
++      LDI     A,$FF\r
++X03B8:        LDI     F,$08\r
++      CP      X_SIZE,F\r
++      BRLO    X03C2\r
++      BREQ    X03D2\r
++      AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++      LDI     A,$FF\r
++      LDI     F,$08\r
++      SUB     X_SIZE,F\r
++      INC     XBYTE\r
++      RJMP    X03B8\r
++X03C2:        TST     X_SIZE\r
++      BREQ    X03D3\r
++X03C4:        LSR     A\r
++      DEC     X_SIZE\r
++      BRNE    X03C4\r
++      COM     A\r
++      TST     XPIXEL\r
++      BREQ    X03D2\r
++      CLR     B\r
++X03CB:        LSR     A\r
++      ROR     B\r
++      DEC     XPIXEL\r
++      BRNE    X03CB\r
++      AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++      INC     XBYTE\r
++      MOV     A,B\r
++X03D2:        AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++X03D3:        COM     PATTERN\r
++      RCALL   NICK_SUB1\r
++      DEC     Y_SIZE\r
++      CLR     F\r
++      CPSE    Y_SIZE,F\r
++      RJMP    X039A\r
++      RET\r
++\r
++; -----------------------------------------------------------------------------\r
++\r
+       .ORG    $1000\r
\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
diff --git a/src/avr/cs64v4.asm b/src/avr/cs64v4.asm
new file mode 100644 (file)
index 0000000..f1c9a50
--- /dev/null
@@ -0,0 +1,3077 @@
+;      CS64V4.ASM\r
+\r
+;      01FEB02 REVISE FOR 7.3728MHz XTAL\r
+;      22NOV01 REVISE FOR OPERATION FROM VCC INSTEAD OF VBAT\r
+;              INVERT SENSE OF SRAM CHIP SELECT\r
+;              STILL NEED TO REMOVE VCC COMPENSATION CODE\r
+\r
+;      22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;              TO WORK WITH REV E PARTS\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APICS.INC" ; NOT API.INC BECAUSE APICS.INC HAS WDR IN TX_WAIT_LOOP\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     XPAGE,YH\r
+       RCALL   ADRYP                   ; AND SET XPAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+; THIS WILL CORRUPT BACKLIGHT\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0\r
+       ANDI    R19,$80\r
+       EOR     R19,@0\r
+       SEI\r
+       OUT     PORTC,R19\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       CLI\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       SEI\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV          ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @0,1                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @0,0                    ; A14\r
+       BLD     R19,6 ;0\r
+       SEI\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       IN      R19,PORTC ;MOV R19,@0\r
+       EOR     R19,@0 ;\r
+       ANDI    R19,$C0 ;$3F\r
+       EOR     R19,@0 ;\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,R19 ;@1\r
+       ;POP    @1\r
+\r
+       IN      R19,PORTC ;LDS R19,LATCH10_SAV  ; AND THIS\r
+; REMOVE TO AVOID CORRUPTING BACKLIGHT\r
+;      BST     @1,7                    ; A15\r
+;      BLD     R19,7 ;1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,6 ;0\r
+       OUT     PORTC,R19 ;PORTA,R19\r
+       ;SBI    PORTB,4\r
+       ;CBI    PORTB,4\r
+       ;STS    LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       NOP\r
+       SBI     PORTB,1\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       SBI     PORTB,2                 ; DRIVE HIGH\r
+       CBI     DDRB,2                  ; NOW SWITCH TO WEAK PULL UP\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       IN      @0,PINA                 ; READ DATA\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =-818 ;$FB35\r
+.EQU   T1_FULL_SCALE   =-651 ;$FC2F\r
+\r
+.EQU   VEE_MIN         =-640 ;$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         = -43 ;$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =-341 ;$FE00\r
+\r
+.EQU   CONTRAST_LONG   =-640 ;$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  = -11 ;$FFF0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =-341 ;$FE00\r
+\r
+.EQU   VCC_NOMINAL     =-536 ;$FCDC\r
+\r
+; WITH VCC = $FCDC FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FD18 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FD78 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FD48\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+.EQU   CONTRAST_MIN    =-630 ;$FC80 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    = -85 ;$FF80 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =-448 ;$FD60\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$61000 ;$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$62000 ;$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$40\r
+.EQU   CHARACTER_SETS  =6\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$10\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   API_ADDRESS     =$03            ; CUSTOMER DISPLAY ADDRESS\r
+.EQU   API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$5F ;$8F               ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$03 ;$05               ; DIVISOR FOR 115200 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   PATTERN         =R0             ; FOR HALFTONE_RECT ROUTINE\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF    BOXSIZEX       =R7             ; ASSIGNED TWICE\r
+.DEF    BOXSIZEY       =R8             ; ASSIGNED TWICE\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   0=BACKLIGHT INVERSION OFF       1=BACKLIGHT INVERSION ON\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+LATCH11_SAV:   .BYTE   1\r
+XPAGE:         .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+; MUST CONVERT TO USE DRAW_CHAR_TTY ROUTINE\r
+;CHAR_X:       .BYTE   1\r
+;CHAR_Y:       .BYTE   1\r
+;CHAR_PTR:     .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   2\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+BACKLIGHT_COUNT: .BYTE 1\r
+\r
+AVECNT:                .BYTE   1\r
+AVEVCC:                .BYTE   1\r
+AVEVCCL:       .BYTE   1\r
+AVEVCCH:       .BYTE   1\r
+AVEVEE:                .BYTE   1\r
+AVEVEEL:       .BYTE   1\r
+AVEVEEH:       .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RETI                            ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_TIM1_OVF\r
+       RETI                            ; TIM0_OVF\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+RESTART_ENTRY:\r
+       LDI     F,$00\r
+       OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+       OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+\r
+       LDI     F,$F8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       LDI     F,$B8 ;$F8\r
+       OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+;      LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+       LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+       OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+\r
+       LDI     F,$00\r
+       OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+\r
+       LDI     F,$20 ;$A0 NO BACKLIGHT INVERSION INITIALLY\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ON\r
+\r
+       INIT_API_BUS\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT+1,D         ; KLUDGE FOR EXTRA 2 BITS OF RESOLUTION\r
+\r
+       ; INITIALISE T6963C DISPLAY CONTROLLER\r
+       SBI     PORTD,6                 ; COME OUT OF RESET\r
+\r
+       LDI     ZL,0\r
+       LDI     ZH,0\r
+RESET_DELAY:\r
+       WDR                             ; 10OCT02 RESET WATCHDOG\r
+       SBIW    ZL,1\r
+       BRNE    RESET_DELAY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOP:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+;      LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((CHSET00)*2)     ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((CHSET00)*2)    ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+;      LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDI     XL,LOW((CHSET00_END-CHSET00)*2) ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((CHSET00_END-CHSET00)*2)        ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET XPAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+       ; ADRL MACRO WILL CORRUPT BACKLIGHT\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       CLR     A\r
+       STS     BACKLIGHT_COUNT,A       ; ENSURE BACKLIGHT COUNT IS IN RANGE\r
+\r
+       CLR     ZL\r
+       CLR     ZH                      ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$04 ;$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WRITE_COMMAND:\r
+       RCALL   WAIT_STATUS             ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+WRITE_COMMAND_AUTO:\r
+       RCALL   WAIT_AUTO               ; LEAVES C/D = 1\r
+       RJMP    WRITE_ENTRY\r
+\r
+WRITE_DATA:\r
+       RCALL   WAIT_STATUS\r
+       RJMP    WRITE_DATA_ENTRY\r
+WRITE_DATA_AUTO:\r
+       RCALL   WAIT_AUTO\r
+WRITE_DATA_ENTRY:\r
+       CBI     PORTC,0                 ; C/D = 0\r
+WRITE_ENTRY:\r
+       OUT     PORTA,F\r
+       NOP\r
+       NOP\r
+       NOP\r
+       CLI\r
+       CBI     PORTB,1                 ; WR = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SEI\r
+       SBI     PORTB,1                 ; WR = 1\r
+       RET\r
+\r
+WAIT_AUTO:\r
+       PUSH    F\r
+WAIT_AUTO_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRS    F,3\r
+       RJMP    WAIT_AUTO_LOOP\r
+       POP     F\r
+       RET\r
+\r
+WAIT_STATUS:\r
+       PUSH    F\r
+WAIT_STATUS_LOOP:\r
+       RCALL   READ_STATUS\r
+       SBRC    F,0\r
+       SBRS    F,1\r
+       RJMP    WAIT_STATUS_LOOP\r
+       POP     F\r
+       RET\r
+\r
+READ_STATUS:\r
+       SBI     PORTC,0                 ; C/D = 1\r
+       LDI     F,0\r
+       OUT     DDRA,F                  ; D0-D7 = INPUTS\r
+       CLI\r
+       CBI     PORTB,0                 ; RD = 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       SBI     PORTB,0                 ; RD = 1\r
+       IN      F,PINA                  ; READ DATA BEFORE RD COMES UP\r
+       SEI\r
+       PUSH    F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; D0-D7 = OUTPUTS\r
+       POP     F\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       CBI     PORTD,4                 ; TURN TRANSISTOR ON (PULL DOWN VSWT)\r
+       CBI     PORTD,5                 ; TURN OFF VEE MEASURING\r
+\r
+       CBI     PORTB,2                 ; REMOVE WEAK PULL UP (SRAM SELECT = 1)\r
+       SBI     DDRB,2                  ; NOW DRIVE LOW\r
+       CBI     PORTD,6                 ; T6963C RESET = 0\r
+       CBI     PORTD,7                 ; T6963C SELECT = 0\r
+       CBI     PORTB,0                 ; RD = 0\r
+       CBI     PORTB,1                 ; WR = 0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; D0-D7 = OUTPUTS\r
+       LDI     D,0\r
+       OUT     PORTA,D                 ; D0-D7 = 0\r
+\r
+       LDI     D,0 ;$40\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 0 / 1 INTERRUPTS\r
+\r
+       ;LDI    D,0\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+;      LDI     F,$18\r
+;      STS     TURNON_COUNT,F          ; .1 SECOND TO BREAK, .2 SECOND TO MAKE\r
+;\r
+;      SEI\r
+;\r
+;SLEEP_LOOP:\r
+;      SLEEP\r
+;\r
+;      LDS     F,TURNON_COUNT\r
+;      TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+;      BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+;\r
+;      CLI\r
+;      RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$6A\r
+       OUT     MCUCR,D                 ; SE=0 SM1:SM0=10 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP:\r
+;      LDS     YH,XPAGE                ; SET XPAGE ADDRESS FOR DSPRAM\r
+;      LDS     YL,LATCH10_SAV\r
+;      ANDI    YL,$E0\r
+;      OR      YH,YL\r
+;      OUT     PORTA,YH\r
+;      SBI     PORTB,4\r
+;      CBI     PORTB,4\r
+;      STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,XPAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     XPAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+       CPI     A,$0A\r
+       RJEQ    LF\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'A'\r
+       RJEQ    SET_BACKLIGHT\r
+       CPI     A,'B'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'c'\r
+       RJEQ    GET_CLEAR_FRAME_RECT_SIZE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'f'\r
+       RJEQ    GET_FRAME_RECT_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'H'\r
+       RJEQ    GET_HALFTONE_RECT_SIZE\r
+       CPI     A,'h'\r
+       RJEQ    GET_CLEAR_HALFTONE_RECT_SIZE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TIMSK,F                 ; TIMER 0 / 1 / 2 INTERRUPTS DISABLED\r
+;      OUT     GIMSK,F                 ; THERMISTOR / VCC INTERRUPTS DISABLED\r
+;\r
+;      LDI     F,$F8                   ; INIT_PORTS\r
+;      OUT     DDRD,F\r
+;      LDI     F,$B8 ;$F8\r
+;      OUT     PORTD,F                 ; D6 = LOW TO RESET T6963C\r
+;      LDI     F,$1F\r
+;      OUT     DDRB,F\r
+;      LDI     F,$FF\r
+;      OUT     DDRA,F\r
+;      OUT     DDRC,F\r
+;\r
+;      CLR     F\r
+;      OUT     PORTA,F\r
+;\r
+;;     LDI     F,$07                   ; CS, RD, WR HI, LEs ALL LO\r
+;;     LDI     F,$03                   ; CS, RD, WR HI, LEs ALL LO\r
+; IN F,PORTB\r
+; ANDI F,$10 ; PRESERVE B4 FOR BACKLIGHT\r
+; ORI F,$03 ; CS, RD, WR HI, LEs ALL LO\r
+;      OUT     PORTB,F                 ; INITIALISE B4 FOR BACKLIGHT\r
+;\r
+;;     LDI     F,$00\r
+; IN F,PORTC\r
+; ANDI F,$80 ; PRESERVE C7 FOR BACKLIGHT\r
+;      OUT     PORTC,F                 ; INITIALISE C7 FOR BACKLIGHT\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+; CBI PORTD,6 ; SEE OUT PORTD,F ABOVE\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYX:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYX\r
+;\r
+;      ; INITIALISE T6963C DISPLAY CONTROLLER\r
+;      SBI     PORTD,6                 ; COME OUT OF RESET\r
+;\r
+;      LDI     ZL,0\r
+;      LDI     ZH,0\r
+;RESET_DELAYY:\r
+;      WDR                             ; RESET WATCHDOG\r
+;      SBIW    ZL,1\r
+;      BRNE    RESET_DELAYY\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$42\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC HOME ADDRESS\r
+       LDI     F,$20\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$43\r
+       RCALL   WRITE_COMMAND           ; SET GRAPHIC AREA\r
+       LDI     F,$80\r
+       RCALL   WRITE_COMMAND           ; OR MODE\r
+       LDI     F,$90\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS OFF\r
+\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     ZL,LOW($800)\r
+       LDI     ZH,HIGH($800)\r
+CLEAR_LOOPZ:\r
+       LDI     F,$00\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       SBIW    ZL,1\r
+       BRNE    CLEAR_LOOPZ\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+\r
+       LDI     F,$98\r
+       RCALL   WRITE_COMMAND           ; CURSOR OFF, TEXT OFF, GRAPHICS ON\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+; CLI ; FOR BEST SAFETY\r
+;\r
+;      LDI     A,HIGH(CONTRAST_MID)\r
+;      OUT     OCR1BH,A\r
+;      LDI     A,LOW(CONTRAST_MID)\r
+;      OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+;\r
+;      LDI     A,HIGH(T1_INIT)\r
+;      OUT     TCNT1H,A\r
+;      LDI     A,LOW(T1_INIT)\r
+;      OUT     TCNT1L,A\r
+;\r
+;      LDI     A,$50\r
+;      OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+;      LDI     A,$01\r
+;      OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+;\r
+;      LDI     F,$00\r
+;      OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+;\r
+;      LDI     F,$04 ;$05\r
+;      OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+;      OUT     TIMSK,F                 ; TURN ON TIMER 0, 1 INTERRUPTS\r
+;\r
+;      LDI     F,$0A\r
+;      OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+;      LDI     F,$C0\r
+;      OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+;      OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+;\r
+; SEI ; FOR BEST SAFETY\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_BACKLIGHT:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,1\r
+       BRNE    SET_BACKLIGHT_ON\r
+       LDI     A,~(1<<7)\r
+       AND     FLAGS,A                 ; DISABLE INTERRUPT BACKLIGHT INVERSION\r
+       CBI     PORTC,7\r
+       CBI     PORTB,4                 ; EXPLICITLY TURN OFF BACKLIGHT\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+       RJMP    MAIN_LOOP\r
+SET_BACKLIGHT_ON:\r
+       LDI     A,1<<7\r
+       OR      FLAGS,A                 ; ENABLE INTERRUPT BACKLIGHT INVERSION\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    RCALL   CARRIAGE_RET\r
+       RJMP    MAIN_LOOP\r
+\r
+CARRIAGE_RET:\r
+       CLR     CURSORX\r
+       RET\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+; LDS A,CONTRASTL\r
+; RCALL TX_WAIT\r
+; LDS A,CONTRASTH\r
+; RCALL TX_WAIT\r
+; LDI A,$0D\r
+; RCALL TX_WAIT\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+GO_TIM1_OVF:\r
+       RJMP    TIM1_OVF\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+       RCALL   RX_WAIT\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+;NICK_REPORT:\r
+;      LDI     A,~(1<<7)\r
+;      AND     FLAGS,A\r
+;\r
+;      PUSH    B\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVCC\r
+;      LDS     B,VCCL\r
+;      ADD     A,B\r
+;      STS     AVEVCC,A\r
+;      LDS     A,AVEVCCL\r
+;      LDS     B,VCCH\r
+;      SEI\r
+;      ADC     A,B\r
+;      STS     AVEVCCL,A\r
+;      LDS     A,AVEVCCH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVCCH,A\r
+;\r
+;      CLI\r
+;      LDS     A,AVEVEE\r
+;      LDS     B,VEEL\r
+;      ADD     A,B\r
+;      STS     AVEVEE,A\r
+;       LDS     A,AVEVEEL\r
+;       LDS     B,VEEH\r
+;       SEI\r
+;       ADC     A,B\r
+;      STS     AVEVEEL,A\r
+;      LDS     A,AVEVEEH\r
+;      LDI     B,0\r
+;      ADC     A,B\r
+;      STS     AVEVEEH,A\r
+;\r
+;      POP     B\r
+;\r
+;      LDS     A,AVECNT\r
+;      INC     A\r
+;      STS     AVECNT,A\r
+;      BRNE    NICK_REPORT_DONE\r
+;\r
+;      LDS     A,AVEVCCL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVCCH\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEL\r
+;      RCALL   TX_WAIT\r
+;      LDS     A,AVEVEEH\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;\r
+;      CLR     A\r
+;      STS     AVEVCC,A\r
+;      STS     AVEVCCL,A\r
+;      STS     AVEVCCH,A\r
+;      STS     AVEVEE,A\r
+;      STS     AVEVEEL,A\r
+;      STS     AVEVEEH,A\r
+;NICK_REPORT_DONE:\r
+;      RET\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 1 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+;      SBRC    FLAGS,7\r
+;      RCALL   NICK_REPORT\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       SEI\r
+       CLR     F\r
+       STS     TEMP,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       MOV     A,YL\r
+       MOV     B,YH\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    PROP_WIDTH\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+       RJMP    PROP_MODE\r
+\r
+PROP_WIDTH:\r
+       RCALL   LPMS\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       SUB     R0,W\r
+       BRSH    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       MOV     XPIXEL,CURSORX\r
+       ADD     XPIXEL,R0\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RCALL   LPMS\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE\r
+       MOV     F,CURSORX\r
+       ADD     F,R0\r
+       BRLO    CR_LF\r
+       RJMP    OK_LINE\r
+\r
+CR_LF: PUSH    A\r
+       PUSH    B\r
+       RCALL   CARRIAGE_RET\r
+       RCALL   LINE_FEED\r
+       LDS     F,TEMP\r
+       ADD     CURSORX,F\r
+       MOV     LINE_CNT,CURSORY\r
+       MOV     XPIXEL,CURSORX\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     F,TEMP\r
+       SUB     CURSORX,F\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       POP     B\r
+       POP     A\r
+OK_LINE:\r
+       ADD     CURSORX,R0\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+Y_OFFSET_DONE:\r
+       MOV     YL,A\r
+       MOV     YH,B\r
+       ADIW    YL,$01\r
+       RCALL   LPMS\r
+       MOV     Y_SIZE,R0\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0         ; REMOVE_CS WHY ??\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+       LDI     XL,LOW(ROWBUF)\r
+       LDI     XH,HIGH(ROWBUF)         ; X -> SINGLE LINE BUFFER IN AVR SRAM\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y -> SINGLE LINE FROM DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       LDI     B,30                    ; BYTES TO COPY\r
+DO_MORE:\r
+       A0_A13  YL,YH\r
+       RAMRD   A\r
+       ST      X+,A\r
+       INC     YL\r
+       DEC     B\r
+       RJNE    DO_MORE         ;BRNE   DO_MORE\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> SINGLE LINE IN T6963C BUFFER\r
+\r
+       CBI     PORTD,7                 ; CS0 = 0\r
+       MOV     F,YL\r
+       RCALL   WRITE_DATA\r
+       MOV     F,YH\r
+       RCALL   WRITE_DATA\r
+       LDI     F,$24\r
+       RCALL   WRITE_COMMAND           ; SET ADDRESS POINTER\r
+       LDI     F,$B0\r
+       RCALL   WRITE_COMMAND           ; SET DATA AUTO WRITE\r
+       LDI     B,30\r
+       LDI     YL,LOW(ROWBUF)\r
+       LDI     YH,HIGH(ROWBUF)         ; Y -> SINGLE LINE BUFFER IN AVR SRAM\r
+NICK_SUB2_LOOP:\r
+       LD      F,Y+\r
+       RCALL   WRITE_DATA_AUTO         ; FILL DISPLAY RAM\r
+       DEC     B\r
+       BRNE    NICK_SUB2_LOOP\r
+       LDI     F,$B2\r
+       RCALL   WRITE_COMMAND_AUTO      ; AUTO RESET\r
+       SBI     PORTD,7                 ; CS0 = 1\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+L0659: CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L0659\r
+;      BRNE    L0659\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       RET\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+EXT_INT0:\r
+       IN      SR,SREG                 ; MEASURE VCC\r
+       SBI     DDRD,2\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     VCCH,D\r
+       STS     VCCL,C\r
+       RJMP    END_EXT_INT\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    END_EXT_INT\r
+\r
+TIM1_OVF:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+; SBI DDRB,7\r
+; IN D,PORTB\r
+; SUBI D,$80\r
+; OUT PORTB,D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       SBRS    FLAGS,7\r
+       RJMP    BACKLIGHT_SKIP\r
+       LDS     D,BACKLIGHT_COUNT\r
+       INC     D\r
+; LDS C,CONTRASTL\r
+; LSL C\r
+; CP D,C\r
+       CPI     D,37 ;62 ;64                    ; 64 COUNTS = 150 HZ\r
+       BRSH    BACKLIGHT_EVEN\r
+; LSR C\r
+; CP D,C\r
+       CPI     D,18 ;31 ;32\r
+       BRNE    BACKLIGHT_SAVE\r
+;BACKLIGHT_ODD:\r
+       CBI     PORTC,7\r
+       SBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+       RJMP    BACKLIGHT_CONT\r
+BACKLIGHT_EVEN:\r
+       SBI     PORTC,7\r
+       CBI     PORTB,4                 ; PROVIDE COMPLEMENTARY INPUTS TO AC573\r
+; LDI D,1<<7\r
+; OR FLAGS,D ; FOR NICK_REPORT\r
+       LDI     D,0\r
+BACKLIGHT_CONT:\r
+       LDS     C,LATCH11_SAV\r
+       OUT     PORTA,C                 ; JUST TO AVOID CLOBBERING HC573\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3                 ; PROVIDE LATCH PULSE, HC573 AND AC573\r
+BACKLIGHT_SAVE:\r
+       STS     BACKLIGHT_COUNT,D\r
+BACKLIGHT_SKIP:\r
+\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+;      SBRC    FLAGS,6                 ; TURNOFF REQUESTED?\r
+;      RJMP    SLEEP_ENTRY             ; YES, SKIP CLOCKING AND SHUT DOWN\r
+\r
+       LDS     D,BREAK_COUNT+1         ; WORD IS STORED IN REVERSE ORDER\r
+       SUBI    D,-$40\r
+       STS     BREAK_COUNT+1,D         ; START OF 4 INTERRUPT BLOCK?\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+       LDI     D,$B0                   ; FORCE DUMMY COMPARE MATCH\r
+       OUT     TCCR1A,D                ; TO SET OC1B, CLR OC1A\r
+       IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+       IN      D,TCNT1H                ; READ CURRENT COUNT\r
+       SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+       SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+       OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+       OUT     OCR1AL,C\r
+       OUT     OCR1BH,D\r
+       OUT     OCR1BL,C\r
+\r
+       SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+       SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+; 10mar03 for better API bus performance (let the chips fall where they may)\r
+;      ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+;      ; REMAIN THE SAME ALTHOUGH THERE IS NOW NO CLOCKING PERIOD\r
+;      LDI     D,$0B+$AB               ; WAIT FOR 3uSEC\r
+;SETTLE_CL2:\r
+;      DEC     D\r
+;      BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+;      LDS     C,VCCL\r
+;      LDS     D,VCCH\r
+;      LDI     E,LOW(VCC_NOMINAL)\r
+;      SUB     C,E\r
+;      LDI     E,HIGH(VCC_NOMINAL)\r
+;      SBC     D,E\r
+;\r
+;      ROR     D\r
+;      ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;;     PUSH    D\r
+;;     PUSH    C\r
+;      ASR     D\r
+;      ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;;     POP     E\r
+;;     ADD     C,E\r
+;;     POP     E\r
+;;     ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+;\r
+;; CLR D\r
+;; CLR C\r
+;\r
+;      LDS     E,VEEL\r
+;      ADD     C,E\r
+;      LDS     E,VEEH\r
+;      ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       ; ULTRA BODGY EXTRA DELAY SO THAT VCC COMPENSATION CAN\r
+       ; REMAIN THE SAME ALTHOUGH WE ARE NO LONGER SETTING TIMER 0\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,2                  ; START VCC AND\r
+       CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+       LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+       OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+;END_INT:\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+END_EXT_INT:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    L0659\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_XPAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+.INCLUDE "CHSET00.INC"\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+GET_CLEAR_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   CLEAR_FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_CLEAR_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   CLEAR_HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+NO_GOX:        RET\r
+\r
+CLEAR_FRAME_RECT:\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_YY\r
+       STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+FRAME_RECT:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GOX\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GOX\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CLEAR_HALFTONE_RECT:\r
+;      LDS     F,RECTNC_X\r
+;      STS     RECT_X,F\r
+;      LDS     F,RECTNC_Y\r
+;      STS     RECT_Y,F\r
+;      LDS     F,RECTNC_XX\r
+;      STS     RECT_XX,F\r
+;      LDS     F,RECTNC_YY\r
+;      STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+HALFTONE_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LDI     A,$55\r
+       SBRS    YH,0\r
+       LDI     A,$AA\r
+       MOV     PATTERN,A\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    X03A3\r
+X039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+X03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    X03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       TST     XPIXEL\r
+       BREQ    X03B0\r
+X03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    X03AD\r
+X03B0: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+X03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       BREQ    X03D2\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    X03B8\r
+X03C2: TST     X_SIZE\r
+       BREQ    X03D3\r
+X03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    X03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    X03D2\r
+       CLR     B\r
+X03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    X03CB\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+X03D2: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+X03D3: COM     PATTERN\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    X039A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4103                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/dos.asm b/src/avr/dos.asm
new file mode 100644 (file)
index 0000000..9c0d0ca
--- /dev/null
@@ -0,0 +1,366 @@
+; DOS.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXTRN  GETSTRLOC:FAR\r
+EXTRN  GETSTRALLOC:FAR\r
+EXTRN  RLSSTRALLOC:FAR\r
+\r
+EXTRN  DOS_READY:WORD\r
+EXTRN  DOS_ERROR:WORD\r
+EXTRN  DOS_COUNT:WORD\r
+\r
+CODE   SEGMENT\r
+\r
+       ASSUME  CS:CODE,DS:CODE\r
+\r
+B      EQU     BYTE PTR\r
+W      EQU     WORD PTR\r
+D      EQU     DWORD PTR\r
+\r
+       JUMPS\r
+       LOCALS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC DOS_PRINT\r
+\r
+DOS_PRINT:                             ; DOS_DATA$\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+6]               ; DOS_DATA$\r
+       CALL    STRING_PTR_DS_DX        ; DS:DX -> CX BYTE STRING\r
+\r
+       MOV     AH,40H\r
+       MOV     BX,1                    ; STDOUT\r
+       INT     21H\r
+\r
+       CALL    DOS_DONE                ; SET UP COUNT/ERROR/READY\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       PUBLIC  DOS_PRINT_LINE\r
+\r
+DOS_PRINT_LINE:                                ; DOS_DATA$\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+6]               ; DOS_DATA$\r
+       CALL    STRING_PTR_DS_SI\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    CX\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET DOS_BUF\r
+       MOV     AX,CX\r
+       ADD     AX,2\r
+       PUSH    AX\r
+       CALL    STRING_ALLOC            ; ALLOCATE LEN(DOS_DATA$)+2 BYTES\r
+\r
+       CALL    STRING_PTR_ES_DI\r
+       POP     AX\r
+       MOV     DX,DI\r
+       MOV     BX,ES\r
+\r
+       POP     CX\r
+       POP     SI\r
+       POP     DS\r
+       REP     MOVSB                   ; COPY USER STRING TO TEMPORARY BUFFER\r
+\r
+       MOV     DS,BX                   ; DS:DX -> TEMPORARY BUFFER\r
+       XCHG    CX,AX\r
+\r
+       MOV     AX,0A0DH\r
+       STOSW                           ; ADD CR/LF\r
+\r
+       MOV     AH,40H\r
+       MOV     BX,1                    ; STDOUT\r
+       INT     21H\r
+\r
+       CALL    DOS_DONE                ; SET UP COUNT/ERROR/READY\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET DOS_BUF\r
+       CALL    STRING_FREE\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       PUBLIC  DOS_GET_DATE            ; YEAR%, MONTH%, DAY%\r
+\r
+DOS_GET_DATE:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AH,2AH\r
+       INT     21H                     ; GET DATE\r
+\r
+       LES     DI,[BP+14]              ; YEAR%\r
+       XCHG    AX,CX\r
+       STOSW\r
+\r
+       LES     DI,[BP+10]              ; MONTH%\r
+       MOV     AL,DH\r
+       SUB     AH,AH\r
+       STOSW\r
+\r
+       LES     DI,[BP+6]               ; DAY%\r
+       MOV     AL,DL\r
+       STOSW\r
+\r
+       CALL    DOS_OK                  ; SET DOS_COUNT% DOS_READY% DOS_ERROR%\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       PUBLIC  DOS_GET_TIME            ; HOUR%, MINUTE%, SECOND%, HSEC%\r
+\r
+DOS_GET_TIME:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AH,2CH\r
+       INT     21H                     ; GET TIME\r
+\r
+       LES     DI,[BP+18]              ; HOUR%\r
+       MOV     AL,CH\r
+       SUB     AH,AH\r
+       STOSW\r
+\r
+       LES     DI,[BP+14]              ; MINUTE%\r
+       MOV     AL,CL\r
+       STOSW\r
+\r
+       LES     DI,[BP+10]              ; SECOND%\r
+       MOV     AL,DH\r
+       STOSW\r
+\r
+       LES     DI,[BP+6]               ; HSEC%\r
+       MOV     AL,DL\r
+       STOSW\r
+\r
+       CALL    DOS_OK                  ; SET DOS_COUNT% DOS_READY% DOS_ERROR%\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       PUBLIC  BIOS_KEY\r
+\r
+BIOS_KEY:                              ; K%\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       PUSH    [BP+8]\r
+       PUSH    [BP+6]\r
+       PUSH    CS\r
+       CALL    BIOS_KEY_TEST           ; BIOS_KEY_TEST K%\r
+\r
+       LDS     SI,[BP+6]\r
+       CMP     W [SI],0\r
+       JZ      @@DONE                  ; IF K% THEN\r
+\r
+       PUSH    [BP+8]\r
+       PUSH    [BP+6]\r
+       PUSH    CS\r
+       CALL    BIOS_KEY_WAIT           ; BIOS_KEY_WAIT K%\r
+\r
+@@DONE:        POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       PUBLIC  BIOS_KEY_TEST\r
+\r
+BIOS_KEY_TEST:                         ; K%\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     DI,[BP+6]\r
+       SUB     AX,AX\r
+       STOSW                           ; K% = 0\r
+\r
+       SUB     AX,AX\r
+       MOV     DS,AX\r
+       MOV     AX,DS:[41AH]\r
+       CMP     AX,DS:[41CH]\r
+       JZ      @@DONE                  ; DON'T GIVE UP A TIME SLICE\r
+\r
+       MOV     AH,1\r
+       INT     16H                     ; TEST FOR KEY\r
+       JZ      @@DONE\r
+\r
+       LES     DI,[BP+6]\r
+       TEST    AL,AL\r
+       JZ      @@EXTD\r
+       SUB     AH,AH\r
+@@EXTD:        STOSW                           ; K% = RETURNED AX\r
+\r
+@@DONE:        POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       PUBLIC  BIOS_KEY_WAIT\r
+\r
+BIOS_KEY_WAIT:                         ; K%\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       SUB     AH,AH\r
+       INT     16H                     ; WAIT FOR KEY\r
+\r
+       LES     DI,[BP+6]\r
+       TEST    AL,AL\r
+       JZ      @@EXTD\r
+       SUB     AH,AH\r
+@@EXTD:        STOSW                           ; K% = RETURNED AX\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+DOS_DONE:\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [DOS_COUNT],AX\r
+       MOV     W [DOS_ERROR],0\r
+       MOV     W [DOS_READY],-1\r
+       RET\r
+\r
+@@BAD: MOV     W [DOS_COUNT],0\r
+       MOV     W [DOS_ERROR],AX\r
+       MOV     W [DOS_READY],0\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+DOS_OK:\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+\r
+       MOV     W [DOS_COUNT],0\r
+       MOV     W [DOS_ERROR],0\r
+       MOV     W [DOS_READY],-1\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+STRING_PTR_DS_DX:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+\r
+       MOV     DS,DX\r
+       XCHG    DX,AX                   ; DS:DX -> CX BYTE STRING\r
+       RET\r
+\r
+STRING_PTR_DS_SI:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+\r
+       MOV     DS,DX\r
+       XCHG    SI,AX                   ; DS:SI -> CX BYTE STRING\r
+       RET\r
+\r
+STRING_PTR_ES_DI:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+\r
+       MOV     ES,DX\r
+       XCHG    DI,AX                   ; ES:DI -> CX BYTE STRING\r
+       RET\r
+\r
+STRING_FREE:\r
+       CMP     W [SI],0\r
+       JZ      @@RET\r
+\r
+       PUSH    [SI]\r
+       MOV     W [SI],0\r
+       CALL    RLSSTRALLOC\r
+@@RET: RET\r
+\r
+STRING_ALLOC:\r
+       PUSH    DS\r
+       PUSH    SI\r
+\r
+       PUSH    AX\r
+       CALL    GETSTRALLOC\r
+\r
+       POP     SI\r
+       POP     DS\r
+       MOV     [SI],AX\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+DOS_BUF                DW      0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CODE   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+DATA   SEGMENT\r
+DATA   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       END\r
diff --git a/src/avr/dos.inc b/src/avr/dos.inc
new file mode 100644 (file)
index 0000000..081aa3a
--- /dev/null
@@ -0,0 +1,20 @@
+' DOS.INC\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+$LINK "DOS.OBJ"\r
+\r
+PUBLIC DOS_READY%\r
+PUBLIC DOS_COUNT%\r
+PUBLIC DOS_ERROR%\r
+\r
+DECLARE SUB DOS_PRINT(STRING)\r
+DECLARE SUB DOS_PRINT_LINE(STRING)\r
+DECLARE SUB DOS_GET_TIME(INTEGER,INTEGER,INTEGER,INTEGER)\r
+DECLARE SUB DOS_GET_DATE(INTEGER,INTEGER,INTEGER)\r
+DECLARE SUB BIOS_KEY(INTEGER)\r
+DECLARE SUB BIOS_KEY_TEST(INTEGER)\r
+DECLARE SUB BIOS_KEY_WAIT(INTEGER)\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/file.asm b/src/avr/file.asm
new file mode 100644 (file)
index 0000000..f1bdf71
--- /dev/null
@@ -0,0 +1,3040 @@
+; FILE.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXTRN  GETSTRLOC:FAR\r
+EXTRN  GETSTRALLOC:FAR\r
+EXTRN  RLSSTRALLOC:FAR\r
+\r
+EXTRN  FILE_ERROR:WORD\r
+EXTRN  FILE_COUNT:WORD\r
+EXTRN  FILE_POINTER:DWORD\r
+EXTRN  FILE_DRIVES:WORD\r
+\r
+EXTRN  FILE_BOMB_OUT:FAR\r
+\r
+CODE   SEGMENT\r
+\r
+       ASSUME  CS:CODE,DS:CODE\r
+\r
+B      EQU     BYTE PTR\r
+W      EQU     WORD PTR\r
+D      EQU     DWORD PTR\r
+\r
+       JUMPS\r
+       LOCALS\r
+\r
+BLOCK_SIZE     EQU     400H ;1000H\r
+LINE_SIZE      EQU     400H ;1000H\r
+\r
+; HANDLE_STRING ENTRIES:\r
+\r
+BUF_FLAG       EQU     0\r
+BUF_STRING     EQU     2\r
+BUF_OFFSET     EQU     4\r
+BUF_COUNT      EQU     6\r
+BUF_SIZE       EQU     8\r
+\r
+BUF_FLAG_READ  EQU     1\r
+BUF_FLAG_WRITE EQU     2\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_OPEN\r
+\r
+FILE_OPEN:                             ; HANDLE%, FILE_NAME$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; FILE_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AX,3D02H                ; TRY TO OPEN FOR READ/WRITE\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+       JNC     @@OK\r
+\r
+       MOV     AX,3D00H                ; TRY TO OPEN FOR READ\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+@@OK:  MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       LES     DI,[BP+14]              ; HANDLE%\r
+       STOSW\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_CREATE\r
+\r
+FILE_CREATE:                           ; HANDLE%, FILE_NAME$, ATTR%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; FILE_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       LDS     SI,[BP+10]              ; ATTR%\r
+       MOV     CX,[SI]\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,3CH\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       LES     DI,[BP+18]              ; HANDLE%\r
+       STOSW\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_CLOSE\r
+\r
+FILE_CLOSE:                            ; HANDLE%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; HANDLE%\r
+       CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+\r
+       SUB     AX,AX                   ; 0 = NO BUFFER WANTED\r
+       CALL    BUF_SETUP               ; SET BUFFER DIRECTION OR KILL\r
+       CALL    BUF_FREE                ; FREE UP BUFFER STRING\r
+\r
+       LDS     SI,[BP+10]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       MOV     AH,3EH\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_READ\r
+\r
+FILE_READ:                             ; HANDLE%, FILE_DATA$, COUNT%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; COUNT%\r
+       CALL    USER_ALLOC              ; ALLOCATE USER BUFFER\r
+       MOV     SI,OFFSET USER_STRING\r
+       CALL    STRING_PTR_DS_DX        ; DS:DX -> USER BUFFER\r
+\r
+       LES     DI,[BP+18]              ; HANDLE%\r
+       MOV     BX,ES:[DI]\r
+       LES     DI,[BP+10]              ; COUNT%\r
+       MOV     CX,ES:[DI]\r
+\r
+       MOV     AH,3FH\r
+       INT     21H\r
+\r
+       LES     DI,[BP+14]              ; FILE_DATA$\r
+       LDS     SI,[BP+10]              ; COUNT%\r
+       MOV     BX,AX                   ; BYTES TRANSFERRED\r
+       CALL    READ_DONE               ; RETURN USER BUFFER IN FILE_DATA$\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_READ_BUF\r
+\r
+FILE_READ_BUF:                         ; HANDLE%, FILE_DATA$, COUNT%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; COUNT%\r
+       CALL    USER_ALLOC              ; ALLOCATE BUFFER, SET UP USER_PTR\r
+\r
+       LDS     SI,[BP+18]              ; HANDLE%\r
+       CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+       CALL    HANDLE_ALLOC            ; ENSURE WE HAVE A HANDLE_STRING ENTRY\r
+\r
+       MOV     AX,BUF_FLAG_READ        ; 1 = DIRECTION\r
+       CALL    BUF_SETUP               ; SET BUFFER DIRECTION\r
+       CALL    BUF_ALLOC               ; ENSURE WE HAVE A BUF_STRING ENTRY\r
+\r
+       MOV     AX,ES:[DI+BUF_OFFSET]\r
+       CMP     AX,ES:[DI+BUF_COUNT]\r
+       JAE     @@MORE\r
+\r
+@@LOOP:        CALL    READ_COPY               ; COPY OUT TO USER BUFFER\r
+       MOV     AX,[USER_OFFSET]\r
+       CMP     AX,[USER_COUNT]\r
+       JAE     @@DONE                  ; NC, GOT ENOUGH\r
+\r
+@@MORE:        CALL    READ_MORE               ; GET MORE INTO READ BUFFER\r
+       JC      @@DONE\r
+       TEST    AX,AX\r
+       JNZ     @@LOOP\r
+\r
+@@DONE:        MOV     AX,[USER_OFFSET]        ; CF = ERROR STATUS FROM READ\r
+       ; AX/CF NOW SET UP AS FOR RETURN FROM INT 21H\r
+\r
+       LES     DI,[BP+14]              ; FILE_DATA$\r
+       LDS     SI,[BP+10]              ; COUNT%\r
+       MOV     BX,AX                   ; BYTES TRANSFERRED\r
+       CALL    READ_DONE               ; RETURN USER BUFFER IN FILE_DATA$\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_READ_LINE\r
+\r
+FILE_READ_LINE:                                ; HANDLE%, FILE_DATA$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET READ_LINE_MAX ; COUNT%\r
+       CALL    USER_ALLOC              ; ALLOCATE BUFFER, SET UP USER_PTR\r
+\r
+       MOV     W [READ_LINE_CR],0\r
+       MOV     W [READ_SKIP_COUNT],0\r
+\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+       CALL    HANDLE_ALLOC            ; ENSURE WE HAVE A HANDLE_STRING ENTRY\r
+\r
+       MOV     AX,BUF_FLAG_READ        ; 1 = DIRECTION\r
+       CALL    BUF_SETUP               ; SET BUFFER DIRECTION\r
+       CALL    BUF_ALLOC               ; ENSURE WE HAVE A BUF_STRING ENTRY\r
+\r
+       MOV     AX,ES:[DI+BUF_OFFSET]\r
+       CMP     AX,ES:[DI+BUF_COUNT]\r
+       JAE     @@MORE\r
+\r
+@@LOOP:        CALL    READ_SCAN               ; CHECK READ BUFFER FOR CR\r
+       CALL    READ_COPY               ; COPY OUT TO USER BUFFER\r
+       MOV     AX,[USER_OFFSET]\r
+       CMP     AX,[USER_COUNT]\r
+       JAE     @@SKIP                  ; GOT ENOUGH, SKIP TO CR/LF\r
+\r
+@@MORE:        CALL    READ_MORE               ; GET MORE INTO READ BUFFER\r
+       JC      @@DONE\r
+       TEST    AX,AX\r
+       JZ      @@DONE                  ; NC, DON'T WORRY ABOUT CR/LF IF EOF\r
+       JMP     @@LOOP\r
+\r
+@@SKIP:        CALL    READ_SKIP               ; SCAN READ BUFFER FOR CR/LF AND SKIP\r
+       CMP     W [READ_LINE_CR],2\r
+       JAE     @@DONE\r
+\r
+       CALL    READ_MORE               ; GET MORE INTO READ BUFFER\r
+       JC      @@DONE\r
+       TEST    AX,AX\r
+       JNZ     @@SKIP\r
+\r
+@@DONE:        MOV     AX,[USER_OFFSET]        ; CF = ERROR STATUS FROM READ\r
+       ; AX/CF NOW SET UP AS FOR RETURN FROM INT 21H\r
+\r
+       PUSHF\r
+       MOV     BX,AX                   ; BYTES TRANSFERRED\r
+       ADD     BX,[READ_SKIP_COUNT]    ; INCLUDING CR/LF\r
+       POPF\r
+\r
+       LES     DI,[BP+10]              ; FILE_DATA$\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET READ_LINE_MAX ; COUNT%\r
+       CALL    READ_DONE               ; RETURN USER BUFFER IN FILE_DATA$\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_READ_DIRECT\r
+\r
+FILE_READ_DIRECT:                      ; HANDLE%, POINTER, COUNT%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+18]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+       LDS     SI,[BP+10]              ; COUNT%\r
+       MOV     CX,[SI]\r
+       LDS     SI,[BP+14]              ; POINTER\r
+       LDS     DX,[SI]\r
+\r
+       MOV     AH,3FH\r
+       INT     21H\r
+\r
+       CALL    WRITE_DONE              ; SET UP READY% FILE_COUNT% FILE_ERROR%\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_WRITE\r
+\r
+FILE_WRITE:                            ; HANDLE%, FILE_DATA$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; FILE_DATA$\r
+       CALL    STRING_PTR_DS_DX        ; DS:DX -> CX BYTE STRING\r
+\r
+       LES     DI,[BP+14]              ; HANDLE%\r
+       MOV     BX,ES:[DI]\r
+\r
+       MOV     AH,40H\r
+       INT     21H\r
+\r
+       CALL    WRITE_DONE              ; SET UP READY% FILE_COUNT% FILE_ERROR%\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_WRITE_BUF\r
+\r
+FILE_WRITE_BUF:                                ; HANDLE%, FILE_DATA$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; FILE_DATA$\r
+       CALL    USER_PTR_SETUP          ; USER_PTR, USER COUNT, USER OFFSET\r
+\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+       CALL    HANDLE_ALLOC            ; ENSURE WE HAVE A HANDLE_STRING ENTRY\r
+\r
+       MOV     AX,BUF_FLAG_WRITE       ; 2 = DIRECTION\r
+       CALL    BUF_SETUP               ; SET BUFFER DIRECTION\r
+       CALL    BUF_ALLOC               ; ENSURE WE HAVE A BUF_STRING ENTRY\r
+\r
+       MOV     AX,ES:[DI+BUF_OFFSET]\r
+       CMP     AX,BLOCK_SIZE\r
+       JAE     @@FLSH\r
+\r
+@@LOOP:        CALL    WRITE_COPY              ; COPY OUT TO WRITE BUFFER\r
+       MOV     AX,[USER_OFFSET]\r
+       CMP     AX,[USER_COUNT]\r
+       JAE     @@DONE                  ; NC, WRITTEN ENOUGH\r
+\r
+@@FLSH:        CALL    WRITE_FLUSH             ; FREE UP WRITE BUFFER\r
+       JC      @@DONE\r
+       TEST    AX,AX\r
+       JNZ     @@LOOP\r
+\r
+@@DONE:        MOV     AX,[USER_OFFSET]        ; CF = ERROR STATUS FROM WRITE\r
+       ; AX/CF NOW SET UP AS FOR RETURN FROM INT 21H\r
+\r
+       CALL    WRITE_DONE              ; SET UP READY% FILE_COUNT% FILE_ERROR%\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_WRITE_LINE\r
+\r
+FILE_WRITE_LINE:                       ; HANDLE%, FILE_DATA$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       PUSH    [BP+16]\r
+       PUSH    [BP+14]                 ; HANDLE%\r
+       PUSH    [BP+12]\r
+       PUSH    [BP+10]                 ; FILE_DATA$\r
+       PUSH    [BP+8]\r
+       PUSH    [BP+6]                  ; READY%\r
+       PUSH    CS\r
+       CALL    FILE_WRITE_BUF\r
+\r
+       LDS     SI,[BP+6]               ; READY%\r
+       CMP     W [SI],0\r
+       JZ      @@RET\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       PUSH    [FILE_COUNT]\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AX,2\r
+       MOV     SI,OFFSET CRLF_STRING\r
+       CALL    STRING_ALLOC\r
+       CALL    STRING_PTR_ES_DI\r
+\r
+       MOV     AX,0A0DH\r
+       STOSW\r
+\r
+       PUSH    [BP+16]\r
+       PUSH    [BP+14]                 ; HANDLE%\r
+       MOV     DI,OFFSET CRLF_STRING\r
+       PUSH    CS\r
+       PUSH    DI                      ; CHR$(&HD,&HA)\r
+       PUSH    [BP+8]\r
+       PUSH    [BP+6]                  ; READY%\r
+       PUSH    CS\r
+       CALL    FILE_WRITE_BUF\r
+\r
+       MOV     SI,OFFSET CRLF_STRING\r
+       CALL    STRING_FREE\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+\r
+       POP     AX\r
+       ADD     [FILE_COUNT],AX\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AX,[CURRENT_PSP]\r
+       TEST    AX,AX\r
+       JNZ     @@NPSP\r
+\r
+       MOV     AH,51H\r
+       INT     21H\r
+       XCHG    AX,BX\r
+       MOV     [CURRENT_PSP],AX\r
+\r
+@@NPSP:        LDS     SI,[BP+14]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       MOV     DS,AX\r
+       LDS     SI,D DS:[34H]           ; HANDLE TABLE\r
+       CMP     B DS:[BX+SI],1          ; DOES HANDLE BX REFER TO CON?\r
+       JNZ     @@RET\r
+\r
+       PUSH    [BP+16]\r
+       PUSH    [BP+14]                 ; HANDLE%\r
+       PUSH    [BP+8]\r
+       PUSH    [BP+6]                  ; READY%\r
+       PUSH    CS\r
+       CALL    FILE_FLUSH              ; ENSURE IMMEDIATE DISPLAY\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_WRITE_DIRECT\r
+\r
+FILE_WRITE_DIRECT:                     ; HANDLE%, POINTER, COUNT%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+18]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+       LDS     SI,[BP+10]              ; COUNT%\r
+       MOV     CX,[SI]\r
+       LDS     SI,[BP+14]              ; POINTER\r
+       LDS     DX,[SI]\r
+\r
+       MOV     AH,40H\r
+       INT     21H\r
+\r
+       CALL    WRITE_DONE              ; SET UP READY% FILE_COUNT% FILE_ERROR%\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SEEK\r
+PUBLIC FILE_SEEK_REL\r
+PUBLIC FILE_SEEK_END\r
+\r
+FILE_SEEK_END:                         ; HANDLE%, POINTER&, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       MOV     AL,2\r
+       JMP     FILE_SEEK_ENTRY\r
+\r
+FILE_SEEK_REL:                         ; HANDLE%, POINTER&, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       MOV     AL,1\r
+       JMP     FILE_SEEK_ENTRY\r
+\r
+FILE_SEEK:                             ; HANDLE%, POINTER&, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       SUB     AL,AL\r
+       ;JMP    FILE_SEEK_ENTRY\r
+\r
+FILE_SEEK_ENTRY:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       PUSH    AX\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+\r
+       SUB     AX,AX                   ; 0 = NO BUFFER WANTED\r
+       CALL    BUF_SETUP               ; SET BUFFER DIRECTION OR KILL\r
+       POP     AX\r
+\r
+       LDS     SI,[BP+10]              ; POINTER&\r
+       MOV     DX,[SI]\r
+       MOV     CX,[SI+2]\r
+\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       MOV     AH,42H\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_POINTER],AX\r
+       MOV     W [FILE_POINTER+2],DX\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SEEK_GET\r
+\r
+FILE_SEEK_GET:                         ; HANDLE%, POINTER&, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+\r
+       CALL    BUF_ADJUST              ; SET UP FILE_PTR_ADJUST USING AX\r
+\r
+       SUB     CX,CX\r
+       SUB     DX,DX\r
+\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       MOV     AX,4201H\r
+       INT     21H                     ; SEEK RELATIVE BY 0 BYTES\r
+       JC      @@BAD\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       ADD     AX,[FILE_PTR_ADJUST]\r
+       ADC     DX,[FILE_PTR_ADJUST+2]\r
+\r
+       LDS     SI,[BP+10]\r
+       MOV     [SI],AX\r
+       MOV     [SI+2],DX\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+\r
+       MOV     W [FILE_POINTER],AX\r
+       MOV     W [FILE_POINTER+2],DX\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     SI,DATA\r
+       MOV     DS,SI\r
+\r
+       MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_PRINT\r
+\r
+FILE_PRINT:                            ; FILE_DATA$\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     DI,OFFSET PRINT_HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       LDS     SI,[BP+6]               ; FILE_DATA$\r
+       PUSH    DS\r
+       PUSH    SI\r
+       MOV     DI,OFFSET PRINT_READY\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_WRITE_LINE\r
+\r
+IF 0\r
+       MOV     DI,OFFSET PRINT_HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET PRINT_READY\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_FLUSH\r
+ENDIF\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_FLUSH\r
+\r
+FILE_FLUSH:                            ; HANDLE%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; HANDLE%\r
+       CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+\r
+       SUB     AX,AX                   ; 0 = NO BUFFER WANTED\r
+       CALL    BUF_SETUP               ; SET BUFFER DIRECTION OR KILL\r
+\r
+       CALL    WRITE_DONE              ; SET UP READY% FILE_COUNT% FILE_ERROR%\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FILE_DUPLICATE_HANDLE:                 ; HANDLE%, HANDLE_NEW%, READY%\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       MOV     AH,45H\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       LES     DI,[BP+10]              ; HANDLE_NEW%\r
+       STOSW\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FILE_REDIRECT_HANDLE:                  ; HANDLE%, HANDLE_NEW%, READY%\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       LDS     SI,[BP+10]              ; HANDLE%\r
+       MOV     CX,[SI]\r
+\r
+       MOV     AH,46H\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_GET_DATE_TIME\r
+\r
+FILE_GET_DATE_TIME:                    ; HANDLE%, DOS_DATE%, DOS_TIME%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+18]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       MOV     AX,5700H\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       LDS     SI,[BP+14]              ; DOS_DATE%\r
+       MOV     [SI],DX\r
+\r
+       LDS     SI,[BP+10]              ; DOS_TIME%\r
+       MOV     [SI],CX\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SET_DATE_TIME\r
+\r
+FILE_SET_DATE_TIME:                    ; HANDLE%, DOS_DATE%, DOS_TIME%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+18]              ; HANDLE%\r
+       MOV     BX,[SI]\r
+\r
+       LDS     SI,[BP+14]              ; DOS_DATE%\r
+       MOV     DX,[SI]\r
+\r
+       LDS     SI,[BP+10]              ; DOS_TIME%\r
+       MOV     CX,[SI]\r
+\r
+       MOV     AX,5701H\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_GET_ATTRIBUTES\r
+\r
+FILE_GET_ATTRIBUTES:                   ; FILE_NAME$, ATTR%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; FILE_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AX,4300H\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       LDS     SI,[BP+10]              ; ATTR%\r
+       MOV     [SI],CX\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SET_ATTRIBUTES\r
+\r
+FILE_SET_ATTRIBUTES:                   ; FILE_NAME$, ATTR%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; FILE_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       LDS     SI,[BP+10]              ; ATTR%\r
+       MOV     CX,[SI]\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AX,4301H\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_RENAME\r
+\r
+FILE_RENAME:                           ; FILE_NAME$, FILE_NEW$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; FILE_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       LDS     SI,[BP+10]              ; FILE_NEW$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NEW\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NEW\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       PUSH    CS\r
+       POP     ES\r
+\r
+       MOV     AH,56H\r
+       MOV     DX,OFFSET BUF_NAME\r
+       MOV     DI,OFFSET BUF_NEW\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_DELETE\r
+\r
+FILE_DELETE:                           ; FILE_NAME$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; FILE_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,41H\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; CALL FILE_SEARCH_FIRST(FILE_MASK$,ATTR%,DTA$,READY%)\r
+\r
+PUBLIC FILE_SEARCH_FIRST\r
+\r
+FILE_SEARCH_FIRST:\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AH,2FH\r
+       INT     21H\r
+       PUSH    ES\r
+       PUSH    BX                      ; SAVE DTA\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,1AH\r
+       MOV     DX,OFFSET BUF_DTA\r
+       INT     21H                     ; SET DTA\r
+\r
+       LDS     SI,[BP+18]              ; FILE_MASK$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       LDS     SI,[BP+14]              ; ATTR%\r
+       MOV     CX,[SI]\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,4EH\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H                     ; SEARCH FIRST\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_DTA+1EH\r
+       SUB     AL,AL\r
+       MOV     CX,13 ;11\r
+       REPNZ   SCASB\r
+       MOV     AX,1EH+12 ;10\r
+       SUB     AX,CX                   ; AX = LENGTH OF RETURNED DTA\r
+\r
+       LDS     SI,[BP+10]              ; DTA$\r
+       CALL    STRING_REALLOC\r
+       CALL    STRING_PTR_ES_DI        ; ES:DI -> NEW CX BYTE STRING\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET BUF_DTA\r
+       REP     MOVSB\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DX\r
+       POP     DS\r
+       MOV     AH,1AH\r
+       INT     21H                     ; RESTORE DTA\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    16\r
+\r
+; -----------------------------------------------------------------------------\r
+; CALL FILE_SEARCH_NEXT(DTA$,READY%)\r
+\r
+PUBLIC FILE_SEARCH_NEXT\r
+\r
+FILE_SEARCH_NEXT:\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AH,2FH\r
+       INT     21H\r
+       PUSH    ES\r
+       PUSH    BX                      ; SAVE DTA\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,1AH\r
+       MOV     DX,OFFSET BUF_DTA\r
+       INT     21H                     ; SET DTA\r
+\r
+       LDS     SI,[BP+10]              ; DTA$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_DTA\r
+       MOV     AX,1EH+11\r
+       CALL    STRING_COPY             ; COPY STRING TO DTA AREA\r
+\r
+       MOV     AH,4FH\r
+       INT     21H                     ; SEARCH NEXT\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_DTA+1EH\r
+       SUB     AL,AL\r
+       MOV     CX,13 ;11\r
+       REPNZ   SCASB\r
+       MOV     AX,1EH+12 ;10\r
+       SUB     AX,CX                   ; AX = LENGTH OF RETURNED DTA\r
+\r
+       LDS     SI,[BP+10]              ; DTA$\r
+       CALL    STRING_REALLOC\r
+       CALL    STRING_PTR_ES_DI        ; ES:DI -> NEW CX BYTE STRING\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET BUF_DTA\r
+       REP     MOVSB\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DX\r
+       POP     DS\r
+       MOV     AH,1AH\r
+       INT     21H                     ; RESTORE DTA\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_CREATE_DIRECTORY\r
+\r
+FILE_CREATE_DIRECTORY:                 ; DIRECTORY_NAME$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; DIRECTORY_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,39H\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_DELETE_DIRECTORY\r
+\r
+FILE_DELETE_DIRECTORY:                 ; DIRECTORY_NAME$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; DIRECTORY_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,3AH\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_GET_DIRECTORY\r
+\r
+FILE_GET_DIRECTORY:                    ; DRIVE%, DIRECTORY_NAME$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; DRIVE%\r
+       MOV     DL,[SI]\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,47H\r
+       MOV     SI,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       SUB     AL,AL\r
+       MOV     CX,128\r
+       REPNZ   SCASB\r
+       MOV     AX,127\r
+       SUB     AX,CX                   ; AX = LENGTH OF RETURNED STRING\r
+\r
+       LDS     SI,[BP+10]              ; FILE_DATA$\r
+       CALL    STRING_REALLOC\r
+       CALL    STRING_PTR_ES_DI\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET BUF_NAME\r
+       REP     MOVSB                   ; COPY STRING TO USER\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SET_DIRECTORY\r
+\r
+FILE_SET_DIRECTORY:                    ; DIRECTORY_NAME$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; DIRECTORY_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AH,3BH\r
+       MOV     DX,OFFSET BUF_NAME\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_GET_DRIVE\r
+\r
+FILE_GET_DRIVE:                                ; DRIVE%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AH,19H\r
+       INT     21H\r
+\r
+       LES     DI,[BP+10]              ; DRIVE%\r
+       SUB     AH,AH\r
+       STOSW\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SET_DRIVE\r
+\r
+FILE_SET_DRIVE:                                ; DRIVE%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+10]              ; DRIVE%\r
+       MOV     DL,[SI]\r
+\r
+       MOV     AH,0EH\r
+       INT     21H\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       SUB     AH,AH\r
+       MOV     [FILE_DRIVES],AX\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_GET_DRIVE_INFO\r
+\r
+FILE_GET_DRIVE_INFO:                   ; DRIVE%, BYTES_SECTOR%,\r
+; CALL TEST_HANDLE_STRING\r
+                                       ; SECTORS_CLUSTER%, AVAIL_CLUSTERS%,\r
+                                       ; TOTAL_CLUSTERS%, READY%\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+26]              ; DRIVE%\r
+       MOV     DL,[SI]\r
+\r
+       MOV     AH,36H\r
+       INT     21H\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       CMP     AX,-1\r
+       JZ      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       LDS     SI,[BP+22]              ; BYTES_SECTOR%\r
+       MOV     [SI],CX\r
+\r
+       LES     DI,[BP+18]              ; SECTORS_CLUSTER%\r
+       STOSW\r
+\r
+       LDS     SI,[BP+14]              ; AVAIL_CLUSTERS%\r
+       MOV     [SI],BX\r
+\r
+       LDS     SI,[BP+10]              ; TOTAL_CLUSTERS%\r
+       MOV     [SI],DX\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    24\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_COPY\r
+\r
+FILE_COPY:                             ; FILE_NAME$, FILE_NEW$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     W [TEMP_STRING],0\r
+\r
+       MOV     DI,OFFSET TEMP_SOURCE   ; HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       LES     DI,[BP+14]              ; FILE_NAME$\r
+       PUSH    ES\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY    ; READY%\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_OPEN               ; OPEN SOURCE FILE\r
+       CMP     W [TEMP_READY],0\r
+       JZ      @@BAD2\r
+\r
+       ; SHOULD GET FILE SIZE AND CHECK DISK SPACE\r
+\r
+       MOV     DI,OFFSET TEMP_DEST     ; HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       LES     DI,[BP+10]              ; FILE_NEW$\r
+       PUSH    ES\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_ATTR     ; ATTR% = 0\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY    ; READY%\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_CREATE             ; CREATE DESTINATION FILE\r
+       CMP     W [TEMP_READY],0\r
+       JZ      @@BAD1\r
+\r
+@@LOOP:        MOV     DI,OFFSET TEMP_SOURCE   ; HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_STRING   ; BUF$\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_COUNT    ; COUNT% = &H1000\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY    ; READY%\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_READ               ; READ SOURCE FILE\r
+       CMP     W [TEMP_READY],0\r
+       JZ      @@BAD0\r
+\r
+       MOV     SI,OFFSET TEMP_STRING   ; DID WE GET ANYTHING?\r
+       CALL    STRING_PTR_ES_DI        ; CX = COUNT\r
+       JCXZ    @@DONE                  ; NO, DONE\r
+\r
+       MOV     DI,OFFSET TEMP_DEST     ; HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_STRING   ; BUF$\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY    ; READY%\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_WRITE              ; WRITE DESTINATION FILE\r
+       CMP     W [TEMP_READY],0\r
+       JZ      @@BAD0\r
+\r
+       MOV     SI,OFFSET TEMP_STRING\r
+       CALL    STRING_PTR_ES_DI        ; CX = COUNT\r
+       CMP     CX,BLOCK_SIZE           ; DID WE GET A FULL BLOCK?\r
+       JAE     @@LOOP                  ; YES, TRY FOR MORE\r
+\r
+@@DONE:        MOV     DI,OFFSET TEMP_SOURCE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_DATE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_TIME\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_GET_DATE_TIME\r
+       CMP     W [TEMP_READY],0\r
+       JZ      @@BAD0\r
+\r
+       MOV     DI,OFFSET TEMP_DEST\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_DATE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_TIME\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_SET_DATE_TIME\r
+       CMP     W [TEMP_READY],0\r
+       JZ      @@BAD0\r
+\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+@@BAD0:        PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET TEMP_STRING\r
+       CALL    STRING_FREE\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       PUSH    [FILE_ERROR]\r
+\r
+       MOV     DI,OFFSET TEMP_DEST     ; HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY    ; READY%\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_CLOSE              ; CLOSE DESTINATION FILE\r
+\r
+       ; SHOULD DELETE FILE HERE IF ERROR\r
+\r
+       POP     W [FILE_ERROR]\r
+\r
+@@BAD1:        MOV     SI,DATA\r
+       MOV     DS,SI\r
+       PUSH    [FILE_ERROR]\r
+\r
+       MOV     DI,OFFSET TEMP_SOURCE   ; HANDLE\r
+       PUSH    CS\r
+       PUSH    DI\r
+       MOV     DI,OFFSET TEMP_READY    ; READY%\r
+       PUSH    CS\r
+       PUSH    DI\r
+       PUSH    CS\r
+       CALL    FILE_CLOSE              ; CLOSE SOURCE FILE\r
+\r
+       POP     W [FILE_ERROR]\r
+\r
+@@BAD2:        POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_INVOCATION\r
+\r
+FILE_INVOCATION:                       ; FILE_NAME$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AH,62H\r
+       INT     21H                     ; GET CURRENT PSP\r
+       MOV     DS,BX\r
+\r
+       SUB     AL,AL                   ; ASCIZ SEARCH\r
+\r
+       MOV     ES,DS:[2CH]\r
+       SUB     DI,DI\r
+       MOV     CX,-1                   ; ES:DI -> ENVIRONMENT (MAX FFFF BYTES)\r
+\r
+@@LOOP:        REPNZ   SCASB\r
+       JNZ     @@BAD\r
+       SCASB\r
+       JZ      @@ENVE\r
+       DEC     DI\r
+       JMP     @@LOOP\r
+\r
+@@ENVE:        INC     DI                      ; GOT ENVIRONMENT END\r
+       INC     DI\r
+\r
+       PUSH    ES\r
+       PUSH    DI                      ; -> INVOCATION NAME\r
+\r
+       MOV     CX,128\r
+       REPNZ   SCASB\r
+       MOV     AX,127\r
+       SUB     AX,CX                   ; AX = LENGTH OF INVOCATION STRING\r
+       PUSH    AX\r
+\r
+       LDS     SI,[BP+10]              ; FILE_NAME$\r
+       CALL    STRING_REALLOC\r
+       CALL    STRING_PTR_ES_DI\r
+\r
+       POP     CX\r
+       POP     SI\r
+       POP     DS\r
+\r
+@@CPY0:        LODSB                           ; COPY STRING TO USER, UPPERCASE\r
+       CMP     AL,'a'\r
+       JB      @@CPY1\r
+       CMP     AL,'z'\r
+       JA      @@CPY1\r
+       AND     AL,0DFH\r
+@@CPY1:        STOSB\r
+       LOOP    @@CPY0\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     SI,DATA\r
+       MOV     DS,SI\r
+\r
+       MOV     W [FILE_ERROR],-1\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SET_HANDLES\r
+\r
+FILE_SET_HANDLES:                      ; HANDLES%, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AX,5800H\r
+       INT     21H                     ; GET ALLOCATION STRATEGY\r
+       JC      @@BAD\r
+       XCHG    DI,AX\r
+       MOV     AX,5801H\r
+       MOV     BX,2                    ; LAST FIT\r
+       INT     21H                     ; SET ALLOCATION STRATEGY\r
+       JC      @@BAD\r
+\r
+       LDS     SI,[BP+10]              ; HANDLES%\r
+       MOV     BX,[SI]                 ; REQUESTED NUMBER OF HANDLES\r
+\r
+       MOV     AH,67H\r
+       INT     21H                     ; TRY TO ALLOCATE HANDLES\r
+\r
+       PUSHF\r
+       MOV     AX,5801H\r
+       MOV     BX,DI\r
+       INT     21H                     ; TRY TO RESTORE ALLOCATION STRATEGY\r
+       POPF\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_SHELL\r
+\r
+FILE_SHELL:                            ; FILE_NAME$, COMMAND_LINE$, READY%\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LDS     SI,[BP+14]              ; FILE_NAME$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NAME\r
+       MOV     AX,128\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NAME\r
+\r
+       LDS     SI,[BP+10]              ; COMMAND_LINE$\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_NEW+1\r
+       MOV     AX,126\r
+       CALL    STRING_COPY             ; COPY STRING TO BUF_NEW+1\r
+       MOV     DI,OFFSET BUF_NEW\r
+       XCHG    AX,CX\r
+       STOSB                           ; LENGTH BYTE\r
+       ADD     DI,AX\r
+       MOV     AL,0DH\r
+       STOSB                           ; TRAILING CR\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     AX,4B00H\r
+       MOV     DX,OFFSET BUF_NAME\r
+       MOV     BX,OFFSET EXEC_PARAMS\r
+       MOV     [BX+4],CS\r
+       INT     21H                     ; EXECUTE PROGRAM\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     AH,4DH\r
+       INT     21H                     ; GET RETURN CODE\r
+       SUB     AH,AH\r
+       MOV     W [FILE_ERROR],AX\r
+\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+STRING_LEN:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+       RET\r
+\r
+STRING_PTR_DS_DX:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+\r
+       MOV     DS,DX\r
+       XCHG    DX,AX                   ; DS:DX -> CX BYTE STRING\r
+       RET\r
+\r
+STRING_PTR_DS_SI:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+\r
+       MOV     DS,DX\r
+       XCHG    SI,AX                   ; DS:SI -> CX BYTE STRING\r
+       RET\r
+\r
+STRING_PTR_ES_DI:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+\r
+       MOV     ES,DX\r
+       XCHG    DI,AX                   ; ES:DI -> CX BYTE STRING\r
+       RET\r
+\r
+STRING_PTR_SETUP:\r
+       PUSH    [SI]\r
+       CALL    GETSTRLOC\r
+\r
+       STOSW\r
+       XCHG    AX,DX\r
+       STOSW                           ; MEMORY PTR -> CX BYTE STRING\r
+       RET\r
+\r
+STRING_FREE:\r
+       CMP     W [SI],0\r
+       JZ      @@RET\r
+\r
+       PUSH    [SI]\r
+       MOV     W [SI],0\r
+       CALL    RLSSTRALLOC\r
+@@RET: RET\r
+\r
+STRING_REALLOC:\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    AX\r
+       CALL    STRING_FREE\r
+       POP     AX\r
+       POP     SI\r
+       POP     DS\r
+       ;JMP    STRING_ALLOC\r
+\r
+STRING_ALLOC:\r
+       TEST    AX,AX\r
+       JZ      @@NONE\r
+\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    AX\r
+       CALL    GETSTRALLOC\r
+       POP     SI\r
+       POP     DS\r
+\r
+       TEST    AX,AX\r
+       JZ      ERROR_STRING_ALLOC\r
+\r
+@@NONE:        MOV     [SI],AX\r
+       RET\r
+\r
+STRING_RESIZE:\r
+       PUSH    DS\r
+\r
+       PUSH    [SI]\r
+       PUSH    AX\r
+       PUSH    DS\r
+       PUSH    SI\r
+       CALL    STRING_ALLOC\r
+       POP     SI\r
+       POP     DS\r
+       CALL    STRING_PTR_ES_DI\r
+       POP     AX                      ; ES:DI -> AX BYTE NEW STRING\r
+       POP     BX                      ; BX = OLD STRING HANDLE\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET OLD_STRING\r
+       MOV     [SI],BX\r
+       CALL    STRING_COPY\r
+       MOV     SI,OFFSET OLD_STRING\r
+       CALL    STRING_FREE\r
+\r
+       POP     DS\r
+       RET\r
+\r
+STRING_COPY:\r
+       PUSH    DS\r
+\r
+       PUSH    ES\r
+       PUSH    DI\r
+       PUSH    AX\r
+       CALL    STRING_PTR_DS_SI\r
+       POP     AX\r
+       POP     DI\r
+       POP     ES\r
+\r
+       CMP     CX,AX\r
+       JBE     @@FITS\r
+       MOV     CX,AX\r
+\r
+@@FITS:        PUSH    CX\r
+\r
+       SUB     AX,CX\r
+       REP     MOVSB\r
+       XCHG    CX,AX                   ; LEAVES AL = 0\r
+       REP     STOSB\r
+\r
+       POP     CX\r
+       POP     DS\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_STRING_ALLOC:\r
+       MOV     SI,OFFSET MESS_STRING_ALLOC\r
+\r
+ERROR_HANDLER:\r
+       PUSH    CS\r
+       POP     DS\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     [ERROR_MESS_PTR],SI\r
+\r
+       MOV     AH,2AH\r
+       INT     21H                     ; GET DATE\r
+\r
+       MOV     DI,OFFSET MESS_DATE_TIME+2\r
+       MOV     AL,DL\r
+       CALL    ERROR_DECIMAL\r
+       MOV     AL,DH\r
+       SUB     AH,AH\r
+       MOV     SI,OFFSET ERROR_MONTHS\r
+       ADD     SI,AX\r
+       ADD     SI,AX\r
+       ADD     SI,AX\r
+       MOVSW\r
+       MOVSB\r
+       MOV     AX,CX\r
+       SUB     AX,2000\r
+       JNC     @@OK\r
+       ADD     AX,100\r
+@@OK:  CALL    ERROR_DECIMAL\r
+       INC     DI\r
+\r
+       MOV     AH,2CH\r
+       INT     21H\r
+\r
+       MOV     AL,CH\r
+       CALL    ERROR_DECIMAL\r
+       INC     DI\r
+       MOV     AL,CL\r
+       CALL    ERROR_DECIMAL\r
+       INC     DI\r
+       MOV     AL,DH\r
+       CALL    ERROR_DECIMAL\r
+\r
+       MOV     AH,2\r
+       SUB     BH,BH\r
+       MOV     DX,24*100H\r
+       INT     10H                     ; SET CURSOR POSITION\r
+\r
+       MOV     SI,OFFSET MESS_DATE_TIME\r
+       CALL    ERROR_BIOS_PRINT\r
+       MOV     SI,[ERROR_MESS_PTR]\r
+       CALL    ERROR_BIOS_PRINT\r
+\r
+       MOV     AH,62H\r
+       INT     21H                     ; GET CURRENT PSP\r
+       MOV     DS,BX\r
+\r
+       SUB     AL,AL                   ; ASCIZ SEARCH\r
+       MOV     ES,DS:[2CH]\r
+       SUB     DI,DI\r
+       MOV     CX,-1                   ; ES:DI -> ENVIRONMENT (MAX FFFF BYTES)\r
+\r
+@@SRCH:        REPNZ   SCASB\r
+       JNZ     @@BAD\r
+       SCASB\r
+       JZ      @@ENVE\r
+       DEC     DI\r
+       JMP     @@SRCH\r
+\r
+@@BAD: PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET ERROR_LOG_PATH\r
+       JMP     @@CONT\r
+\r
+@@ENVE:        INC     DI                      ; GOT ENVIRONMENT END\r
+       INC     DI\r
+\r
+       PUSH    ES\r
+       POP     DS\r
+       MOV     SI,DI\r
+\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET ERROR_LOG_PATH\r
+\r
+       MOV     CX,64\r
+       MOV     BX,DI                   ; WHERE LAST \ FOUND\r
+@@COPY:        LODSB\r
+       STOSB\r
+       CMP     AL,'\'\r
+       JNZ     @@COPE\r
+       MOV     BX,DI\r
+@@COPE:        TEST    AL,AL\r
+       LOOPNZ  @@COPY\r
+       MOV     DI,BX\r
+\r
+@@CONT:        PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET ERROR_LOG_NAME\r
+       MOV     CX,10                   ; ERROR.LOG <NUL>\r
+       REP     MOVSB\r
+\r
+       MOV     AX,3D02H\r
+       MOV     DX,OFFSET ERROR_LOG_PATH\r
+       INT     21H                     ; TRY TO OPEN EXISTING ERROR.LOG\r
+       JC      ERROR_LOG_CREATE\r
+       XCHG    BX,AX\r
+\r
+       MOV     AX,4202H\r
+       SUB     CX,CX\r
+       SUB     DX,DX\r
+       INT     21H                     ; SEEK TO END OF ERROR.LOG\r
+       JMP     ERROR_LOG_WRITE\r
+\r
+ERROR_LOG_CREATE:\r
+       MOV     AH,3CH\r
+       SUB     CX,CX\r
+       MOV     DX,OFFSET ERROR_LOG_PATH\r
+       INT     21H                     ; CREATE NEW ZERO LENGTH ERROR.LOG\r
+       JC      ERROR_HANDLER_DONE\r
+       XCHG    BX,AX\r
+\r
+ERROR_LOG_WRITE:\r
+       MOV     SI,OFFSET MESS_DATE_TIME\r
+       CALL    ERROR_FILE_PRINT\r
+       MOV     SI,[ERROR_MESS_PTR]\r
+       CALL    ERROR_FILE_PRINT\r
+       MOV     SI,OFFSET MESS_CRLF\r
+       CALL    ERROR_FILE_PRINT\r
+\r
+       MOV     AH,3EH\r
+       INT     21H                     ; CLOSE ERROR.LOG\r
+\r
+ERROR_HANDLER_DONE:\r
+       MOV     AX,DATA\r
+       MOV     DS,AX\r
+       JMP     FILE_BOMB_OUT\r
+\r
+ERROR_DECIMAL:\r
+       SUB     AH,AH\r
+       MOV     BL,10\r
+       DIV     BL                      ; AL = TENS, AH = UNITS\r
+       OR      AX,3030H\r
+       STOSW\r
+       RET\r
+\r
+ERROR_BIOS_PRINT:\r
+       PUSH    SI\r
+       LODSW\r
+       XCHG    CX,AX\r
+@@LOOP:        LODSB\r
+       PUSH    CX\r
+       PUSH    SI\r
+       MOV     AH,0EH\r
+       MOV     BX,7\r
+       INT     10H\r
+       POP     SI\r
+       POP     CX\r
+       LOOP    @@LOOP\r
+       POP     SI\r
+       RET\r
+\r
+ERROR_FILE_PRINT:\r
+       MOV     AH,40H\r
+       MOV     CX,[SI]\r
+       LEA     DX,[SI+2]\r
+       INT     21H                     ; WRITE TO ERROR.LOG\r
+       RET\r
+\r
+ERROR_MESS_PTR DW      0\r
+ERROR_LOG_NAME DB      'ERROR.LOG',0\r
+ERROR_LOG_PATH DB      129 DUP (?)\r
+\r
+ERROR_MONTHS   DB      '???JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'\r
+\r
+MESS_DATE_TIME DW      17\r
+               DB      '01JAN80 00:00:00 '\r
+\r
+MESS_STRING_ALLOC DW   29\r
+               DB      'FILE.ASM: Out of string space'\r
+\r
+MESS_CRLF      DW      2\r
+               DB      0DH,0AH\r
+\r
+; -----------------------------------------------------------------------------\r
+; SET UP USER BUFFER\r
+\r
+USER_ALLOC:\r
+       PUSH    [SI]                    ; COUNT%\r
+       CALL    GETSTRALLOC\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET USER_STRING\r
+       MOV     [SI],AX\r
+       ;JMP    USER_PTR_SETUP\r
+\r
+USER_PTR_SETUP:\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET USER_PTR\r
+       CALL    STRING_PTR_SETUP\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     [USER_COUNT],CX\r
+       MOV     W [USER_OFFSET],0\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; FREE UP READ BUFFER\r
+\r
+READ_FLUSH:\r
+       MOV     DX,ES:[DI+BUF_OFFSET]\r
+       SUB     DX,ES:[DI+BUF_COUNT]    ; DX = -BYTES LEFT IN READ BUFFER\r
+       JAE     @@DONE                  ; NC FOR CALLER\r
+\r
+       MOV     AX,4201H\r
+       MOV     BX,[BUF_HANDLE]\r
+       MOV     CX,-1\r
+       INT     21H                     ; SEEK RELATIVE\r
+       ; ERRORS HANDLED BY CALLER\r
+\r
+@@DONE:        MOV     W ES:[DI+BUF_COUNT],0\r
+       MOV     W ES:[DI+BUF_OFFSET],0\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; SCAN USER BUFFER FOR CR\r
+\r
+READ_SCAN:\r
+       MOV     BX,[USER_COUNT]\r
+       SUB     BX,[USER_OFFSET]        ; BX = USER BYTES LEFT\r
+\r
+       MOV     CX,ES:[DI+BUF_COUNT]\r
+       SUB     CX,ES:[DI+BUF_OFFSET]   ; CX = NATIVE BYTES LEFT\r
+\r
+       CMP     CX,BX\r
+       JB      @@SCAN\r
+       MOV     CX,BX\r
+@@SCAN:        JCXZ    @@RET\r
+\r
+       LDS     SI,D [BUF_PTR]\r
+       ADD     SI,ES:[DI+BUF_OFFSET]   ; DS:SI -> NATIVE BUFFER\r
+       MOV     BX,SI                   ; TO CALCULATE LENGTH\r
+\r
+@@LOOP:        LODSB\r
+       CMP     AL,1AH\r
+       JZ      @@DONE\r
+       CMP     AL,0DH\r
+       LOOPNZ  @@LOOP\r
+       JNZ     @@RET\r
+\r
+@@DONE:        PUSH    CS\r
+       POP     DS\r
+\r
+       DEC     SI\r
+       SUB     SI,BX\r
+       ADD     SI,[USER_OFFSET]\r
+       MOV     [USER_COUNT],SI         ; MAKE THE REQUEST SHORTER\r
+       RET\r
+\r
+@@RET: PUSH    CS\r
+       POP     DS\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; SCAN USER BUFFER FOR CR/LF AND SKIP\r
+\r
+READ_SKIP:\r
+       MOV     CX,ES:[DI+BUF_COUNT]\r
+       SUB     CX,ES:[DI+BUF_OFFSET]   ; CX = NATIVE BYTES LEFT\r
+       JZ      @@RET\r
+\r
+       LDS     SI,D [BUF_PTR]\r
+       ADD     SI,ES:[DI+BUF_OFFSET]   ; DS:SI -> NATIVE BUFFER\r
+       MOV     BX,SI                   ; TO CALCULATE LENGTH\r
+\r
+       CMP     W CS:[READ_LINE_CR],1   ; ALREADY FOUND CR?\r
+       JZ      @@LF\r
+\r
+@@CR:  LODSB\r
+       CMP     AL,1AH\r
+       JZ      @@BACK\r
+       CMP     AL,0DH\r
+       LOOPNZ  @@CR\r
+       JNZ     @@RET\r
+\r
+       MOV     W CS:[READ_LINE_CR],1   ; SAY WE FOUND CR\r
+       JCXZ    @@RET                   ; NO NEED TO UPDATE BUF_OFFSET, DODGY\r
+\r
+@@LF:  LODSB\r
+       CMP     AL,0AH\r
+       JZ      @@DONE\r
+\r
+@@BACK:        DEC     SI\r
+@@DONE:        MOV     W CS:[READ_LINE_CR],2   ; SAY WE FOUND LF\r
+\r
+@@RET: PUSH    CS\r
+       POP     DS\r
+\r
+       SUB     SI,BX\r
+       ADD     [READ_SKIP_COUNT],SI\r
+       ADD     ES:[DI+BUF_OFFSET],SI   ; SKIP THE BYTES\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; COPY OUT TO USER BUFFER\r
+\r
+READ_COPY:\r
+       PUSH    ES\r
+       PUSH    DI\r
+\r
+       MOV     BX,[USER_COUNT]\r
+       SUB     BX,[USER_OFFSET]        ; BX = USER BYTES LEFT\r
+\r
+       MOV     CX,ES:[DI+BUF_COUNT]\r
+       SUB     CX,ES:[DI+BUF_OFFSET]   ; CX = NATIVE BYTES LEFT\r
+\r
+       LDS     SI,D [BUF_PTR]\r
+       ADD     SI,ES:[DI+BUF_OFFSET]   ; DS:SI -> NATIVE BUFFER\r
+\r
+       LES     DI,D CS:[USER_PTR]\r
+       ADD     DI,CS:[USER_OFFSET]     ; ES:DI -> USER BUFFER\r
+\r
+       CMP     CX,BX\r
+       JB      @@COPY\r
+       MOV     CX,BX\r
+\r
+@@COPY:        MOV     AX,CX\r
+       REP     MOVSB\r
+\r
+       POP     DI\r
+       POP     ES\r
+       ADD     ES:[DI+BUF_OFFSET],AX\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       ADD     [USER_OFFSET],AX\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; GET MORE INTO READ BUFFER\r
+\r
+READ_MORE:\r
+       MOV     AX,ES:[DI+BUF_COUNT]\r
+       CMP     AX,ES:[DI+BUF_OFFSET]\r
+       JB      @@RET\r
+\r
+       MOV     AH,3FH\r
+       MOV     BX,[BUF_HANDLE]\r
+       MOV     CX,BLOCK_SIZE\r
+       LDS     DX,D [BUF_PTR]\r
+       INT     21H\r
+       PUSH    CS\r
+       POP     DS\r
+       ; ERRORS HANDLED BY CALLER\r
+\r
+       MOV     W ES:[DI+BUF_OFFSET],0\r
+       MOV     W ES:[DI+BUF_COUNT],0\r
+       JC      @@RET\r
+       MOV     ES:[DI+BUF_COUNT],AX\r
+@@RET: RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; RETURN USER BUFFER IN FILE_DATA$\r
+\r
+READ_DONE:\r
+       MOV     CX,[SI]                 ; CX = COUNT%\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     [FILE_DATA_PTR],DI\r
+       MOV     [FILE_DATA_PTR+2],ES\r
+\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD                   ; ERROR OCCURRED, DEALLOCATE BUF\r
+\r
+       MOV     W [FILE_COUNT],BX       ; BX = BYTES TRANSFERRED, INC CR/LF\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+\r
+       CMP     AX,CX                   ; AX = BYTES TRANSFERRED, NO CR/LF\r
+       JAE     @@DONE\r
+\r
+       ; ONLY PARTIALLY FILLED, TRUNCATE BUF\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET USER_STRING\r
+       CALL    STRING_RESIZE           ; RESIZE USER BUFFER TO AX BYTES\r
+\r
+@@DONE:        ; SUCCESSFUL, DEALLOCATE FILE_DATA$ AND REPLACE WITH BUF\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       LDS     SI,D [FILE_DATA_PTR]    ; FILE_DATA$\r
+       CALL    STRING_FREE\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET USER_STRING\r
+\r
+       LES     DI,D [FILE_DATA_PTR]    ; FILE_DATA$\r
+       SUB     AX,AX\r
+       XCHG    AX,[SI]\r
+       STOSW\r
+       RET\r
+\r
+@@BAD: ; ERROR OCCURRED, DEALLOCATE BUF\r
+\r
+       MOV     W [FILE_COUNT],0\r
+\r
+       MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET USER_STRING\r
+       JMP     STRING_FREE\r
+\r
+; -----------------------------------------------------------------------------\r
+; FREE UP WRITE BUFFER\r
+\r
+WRITE_FLUSH:\r
+       CMP     W ES:[DI+BUF_OFFSET],0\r
+       JZ      @@DONE                  ; NC FOR CALLER\r
+\r
+       MOV     AH,40H\r
+       MOV     BX,BUF_HANDLE\r
+       MOV     CX,ES:[DI+BUF_OFFSET]\r
+       LDS     DX,D [BUF_PTR]\r
+       INT     21H                     ; WRITE OUT WRITE BUFFER\r
+       PUSH    CS\r
+       POP     DS\r
+       ; ERRORS HANDLED BY CALLER\r
+\r
+@@DONE:        MOV     W ES:[DI+BUF_COUNT],0\r
+       MOV     W ES:[DI+BUF_OFFSET],0\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; COPY OUT TO WRITE BUFFER\r
+\r
+WRITE_COPY:\r
+       PUSH    ES\r
+       PUSH    DI\r
+\r
+       MOV     CX,BLOCK_SIZE\r
+       SUB     CX,ES:[DI+BUF_OFFSET]   ; CX = NATIVE BYTES LEFT\r
+\r
+       MOV     BX,[USER_COUNT]\r
+       SUB     BX,[USER_OFFSET]        ; BX = USER BYTES LEFT\r
+\r
+       MOV     DX,ES:[DI+BUF_OFFSET]\r
+       LES     DI,D [BUF_PTR]\r
+       ADD     DI,DX                   ; ES:DI -> NATIVE BUFFER\r
+\r
+       LDS     SI,D [USER_PTR]\r
+       ADD     SI,CS:[USER_OFFSET]     ; DS:SI -> USER BUFFER\r
+\r
+       CMP     CX,BX\r
+       JB      @@COPY\r
+       MOV     CX,BX\r
+\r
+@@COPY:        MOV     AX,CX\r
+       REP     MOVSB\r
+\r
+       POP     DI\r
+       POP     ES\r
+       ADD     ES:[DI+BUF_OFFSET],AX\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       ADD     [USER_OFFSET],AX\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; SET UP READY% FILE_COUNT% FILE_ERROR%\r
+\r
+WRITE_DONE:\r
+       MOV     SI,DATA\r
+       MOV     DS,SI\r
+       JC      @@BAD\r
+\r
+       MOV     W [FILE_COUNT],AX\r
+\r
+       MOV     W [FILE_ERROR],0\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],-1\r
+       RET\r
+\r
+@@BAD: MOV     W [FILE_COUNT],0\r
+\r
+       MOV     W [FILE_ERROR],AX\r
+       LDS     SI,[BP+6]               ; READY%\r
+       MOV     W [SI],0\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; USAGE OF HANDLE_ AND BUF_ ROUTINES:\r
+\r
+; CALLERS WANTING TO INTERROGATE BUFFER SITUATION SHOULD USE:\r
+\r
+;      LDS     SI,[BP+14]              ; HANDLE%\r
+;      CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+\r
+;      CALL    BUF_ADJUST              ; RETURN FILE_PTR_ADJUST\r
+\r
+; CALLERS WANTING TO FLUSH BUFFERS TRANSPARENTLY SHOULD USE:\r
+\r
+;      LDS     SI,[BP+14]              ; HANDLE%\r
+;      CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+\r
+;      SUB     AX,AX                   ; 0 = NO BUFFER WANTED\r
+;      CALL    BUF_SETUP               ; SET BUFFER DIRECTION OR KILL\r
+\r
+; CALLERS WANTING TO SET UP BUFFERS SHOULD USE:\r
+\r
+;      LDS     SI,[BP+14]              ; HANDLE%\r
+;      CALL    HANDLE_SETUP            ; SAVE HANDLE AND SET UP POINTERS\r
+;      CALL    HANDLE_ALLOC            ; ENSURE WE HAVE A HANDLE_STRING ENTRY\r
+\r
+;      MOV     AX,BUF_FLAG_READ        ; 1,2 = DIRECTION\r
+;      CALL    BUF_SETUP               ; SET BUFFER DIRECTION OR KILL\r
+;      CALL    BUF_ALLOC               ; ENSURE WE HAVE A BUF_STRING ENTRY\r
+\r
+; AFTER HANDLE_SETUP:\r
+\r
+; DS = CS, PRESERVE\r
+; HANDLE_STRING ENTRY IS ACCESSED FROM ES:DI, PRESERVE\r
+; FILE HANDLE IS ACCESSED FROM BUF_HANDLE\r
+\r
+; -----------------------------------------------------------------------------\r
+; ENSURE THERE IS AN INITIALISED ENTRY IN HANDLE_STRING FOR HANDLE%\r
+\r
+HANDLE_ALLOC:\r
+       MOV     AX,[HANDLE_OFFSET]\r
+       CMP     AX,[HANDLE_LEN]\r
+       JB      @@RET\r
+\r
+       MOV     SI,OFFSET HANDLE_STRING\r
+       ADD     AX,BUF_SIZE\r
+       CALL    STRING_RESIZE           ; MAKE IT BIGGER\r
+\r
+       JMP     HANDLE_PTR_SETUP\r
+\r
+@@RET: RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; SAVE HANDLE, SET UP ES:DI AND HANDLE_LEN\r
+\r
+HANDLE_SETUP:\r
+       LODSW                           ; HANDLE%\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     [BUF_HANDLE],AX         ; AX = HANDLE TO USE FOR BUF_FLUSH ETC\r
+\r
+       SHL     AX,1\r
+       SHL     AX,1\r
+       SHL     AX,1\r
+       MOV     [HANDLE_OFFSET],AX      ; AX = OFFSET INTO HANDLE_STRING\r
+       ;JMP    HANDLE_PTR_SETUP\r
+\r
+HANDLE_PTR_SETUP:\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       SUB     CX,CX\r
+       CMP     CX,[HANDLE_STRING]\r
+       JZ      @@DONE\r
+\r
+       MOV     SI,OFFSET HANDLE_STRING\r
+       CALL    STRING_PTR_ES_DI\r
+       ADD     DI,[HANDLE_OFFSET]\r
+\r
+@@DONE:        MOV     [HANDLE_LEN],CX\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; RETURN BUFFER DIRECTION IN AX, OR NO BUFFER IF AX = 0\r
+\r
+BUF_TEST:\r
+       SUB     AX,AX\r
+\r
+       MOV     BX,[HANDLE_OFFSET]\r
+       CMP     BX,[HANDLE_LEN]\r
+       JAE     @@RET                   ; NO HANDLE ALLOCATED\r
+\r
+       MOV     AX,ES:[DI+BUF_FLAG]\r
+@@RET: RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUF_ADJUST:\r
+       CALL    BUF_TEST                ; RETURNS AX = BUFFER DIRECTION\r
+\r
+       MOV     W [FILE_PTR_ADJUST],0\r
+       MOV     W [FILE_PTR_ADJUST+2],0\r
+\r
+       CMP     AX,BUF_FLAG_READ\r
+       JNZ     @@CONT\r
+\r
+       MOV     AX,ES:[DI+BUF_OFFSET]\r
+       SUB     AX,ES:[DI+BUF_COUNT]    ; AX = -BYTES LEFT IN READ BUFFER\r
+       JNC     @@RET\r
+\r
+       MOV     W [FILE_PTR_ADJUST+2],-1\r
+       JMP     @@DONE\r
+\r
+@@CONT:        CMP     AX,BUF_FLAG_WRITE\r
+       JNZ     @@RET\r
+\r
+       MOV     AX,ES:[DI+BUF_OFFSET]\r
+@@DONE:        MOV     [FILE_PTR_ADJUST],AX\r
+@@RET: RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; SET BUFFER DIRECTION FROM AX, OR KILL BUFFER IF AX = 0\r
+\r
+BUF_SETUP:\r
+       MOV     BX,[HANDLE_OFFSET]\r
+       CMP     BX,[HANDLE_LEN]\r
+       JAE     @@NULL                  ; NO HANDLE ALLOCATED\r
+\r
+       PUSH    AX\r
+       CALL    BUF_PTR_SETUP\r
+       POP     AX\r
+\r
+       CMP     AX,ES:[DI+BUF_FLAG]\r
+       JZ      @@NULL                  ; ALREADY SET UP, OR ALREADY DEAD\r
+\r
+       PUSH    AX\r
+       CALL    BUF_FLUSH\r
+       POP     AX\r
+\r
+       MOV     ES:[DI+BUF_FLAG],AX\r
+       MOV     W ES:[DI+BUF_OFFSET],0\r
+       MOV     W ES:[DI+BUF_COUNT],0\r
+@@RET: RET\r
+\r
+@@NULL:        SUB     AX,AX                   ; NC\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUF_PTR_SETUP:\r
+       CMP     W ES:[DI+BUF_STRING],0\r
+       JZ      @@RET\r
+\r
+       PUSH    ES\r
+       PUSH    DI\r
+\r
+       PUSH    ES\r
+       POP     DS\r
+       LEA     SI,[DI+BUF_STRING]\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET BUF_PTR\r
+       CALL    STRING_PTR_SETUP\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       POP     DI\r
+       POP     ES\r
+@@RET: RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUF_ALLOC:\r
+       CMP     W ES:[DI+BUF_STRING],0\r
+       JNZ     @@RET\r
+\r
+       PUSH    ES\r
+       POP     DS\r
+       LEA     SI,[DI+BUF_STRING]\r
+       MOV     AX,BLOCK_SIZE\r
+       CALL    STRING_ALLOC\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       CALL    BUF_PTR_SETUP\r
+\r
+       MOV     W ES:[DI+BUF_COUNT],0\r
+       MOV     W ES:[DI+BUF_OFFSET],0\r
+@@RET: RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUF_FREE:\r
+       MOV     BX,[HANDLE_OFFSET]\r
+       CMP     BX,[HANDLE_LEN]\r
+       JAE     @@RET                   ; NO HANDLE ALLOCATED\r
+\r
+       PUSH    ES\r
+       POP     DS\r
+       LEA     SI,[DI+BUF_STRING]\r
+       CALL    STRING_FREE\r
+       PUSH    CS\r
+       POP     DS\r
+\r
+       MOV     W ES:[DI+BUF_COUNT],0\r
+       MOV     W ES:[DI+BUF_OFFSET],0\r
+@@RET: RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+BUF_FLUSH:\r
+       MOV     AX,ES:[DI+BUF_FLAG]\r
+       CMP     AX,BUF_FLAG_READ\r
+       JNZ     @@CONT\r
+\r
+       CALL    READ_FLUSH\r
+       JMP     @@DONE\r
+\r
+@@CONT:        CMP     AX,BUF_FLAG_WRITE\r
+       JNZ     @@NULL\r
+\r
+       CALL    WRITE_FLUSH\r
+@@DONE:        MOV     W ES:[DI+BUF_FLAG],0\r
+       RET\r
+\r
+@@NULL:        SUB     AX,AX                   ; NC\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PUBLIC FILE_DIAG\r
+\r
+FILE_DIAG:\r
+; CALL TEST_HANDLE_STRING\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       LDS     SI,[BP+6]\r
+       MOV     AX,CS:[HANDLE_STRING]\r
+       MOV     [SI],AX\r
+       POP     SI\r
+       POP     DS\r
+       POP     BP\r
+; CALL SAVE_HANDLE_STRING\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IF 0\r
+TEST_HANDLE_STRING:\r
+       PUSHF\r
+       CLD\r
+       PUSH    DS\r
+       PUSH    ES\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET HANDLE_STRING\r
+       SUB     CX,CX\r
+       CMP     CX,[SI]\r
+       JZ      TEST_NO_HANDLE_STRING\r
+       CALL    STRING_PTR_ES_DI\r
+\r
+TEST_NO_HANDLE_STRING:\r
+       CMP     CX,[SAVED_HANDLE_LEN]\r
+       JNZ     ERROR_HANDLE_STRING\r
+       JCXZ    OK_HANDLE_STRING\r
+\r
+       MOV     SI,OFFSET SAVED_HANDLE_STRING\r
+       REPZ    CMPSB\r
+       JNZ     ERROR_HANDLE_STRING\r
+\r
+       ; CHECK FOR DUPLICATE BUF HANDLES\r
+       JMP     OK_HANDLE_STRING\r
+\r
+ERROR_HANDLE_STRING:\r
+       MOV     AX,3C00H\r
+       SUB     CX,CX\r
+       MOV     DX,OFFSET NAME_FILE_LOG\r
+       INT     21H\r
+       JC      OK_HANDLE_STRING\r
+\r
+       XCHG    BX,AX\r
+       MOV     AH,3EH\r
+       INT     21H\r
+\r
+OK_HANDLE_STRING:\r
+       POP     DI\r
+       POP     SI\r
+       POP     ES\r
+       POP     DS\r
+       POPF\r
+       RET\r
+\r
+SAVE_HANDLE_STRING:\r
+       PUSHF\r
+       CLD\r
+       PUSH    DS\r
+       PUSH    ES\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       PUSH    CS\r
+       POP     DS\r
+       MOV     SI,OFFSET HANDLE_STRING\r
+       SUB     CX,CX\r
+       CMP     CX,[SI]\r
+       JZ      SAVE_NO_HANDLE_STRING\r
+       CALL    STRING_PTR_DS_SI\r
+\r
+SAVE_NO_HANDLE_STRING:\r
+       MOV     CS:[SAVED_HANDLE_LEN],CX\r
+\r
+       PUSH    CS\r
+       POP     ES\r
+       MOV     DI,OFFSET SAVED_HANDLE_STRING\r
+       REP     MOVSB\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     ES\r
+       POP     DS\r
+       POPF\r
+       RET\r
+\r
+SAVED_HANDLE_LEN DW    0\r
+SAVED_HANDLE_STRING DB 100H*8 DUP (0)\r
+\r
+NAME_FILE_LOG  DB      'C:\JRNXL\FILE.LOG',0\r
+ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXEC_PARAMS    DW      0               ; SEGMENT OF ENVIRONMENT\r
+               DW      BUF_NEW,0       ; DWORD -> COMMAND LINE\r
+               DD      -1,-1\r
+\r
+CURRENT_PSP    DW      0\r
+\r
+PRINT_HANDLE   DW      0\r
+PRINT_READY    DW      0\r
+\r
+BUF_HANDLE     DW      0\r
+BUF_PTR                DW      0,0\r
+BUF_SEEK_PTR   DW      0,0\r
+\r
+;HANDLE_PTR    DW      0,0\r
+HANDLE_OFFSET  DW      0\r
+HANDLE_LEN     DW      0\r
+HANDLE_STRING  DW      0\r
+\r
+FILE_PTR_ADJUST        DW      0,0\r
+FILE_DATA_PTR  DW      0,0\r
+\r
+CRLF_STRING    DW      0               ; STRING HANDLE FOR CHR$(&HD,&HA)\r
+\r
+READ_LINE_MAX  DW      LINE_SIZE\r
+READ_LINE_CR   DW      0               ; 0=NOTHING, 1=CR FOUND, 2=CR/LF OR EOF\r
+READ_SKIP_COUNT        DW      0\r
+\r
+USER_STRING    DW      0               ; STRING HANDLE FOR DYNAMIC FILE BUFFER\r
+\r
+USER_PTR       DW      0,0\r
+USER_OFFSET    DW      0\r
+USER_COUNT     DW      0\r
+\r
+TEMP_SOURCE    DW      0               ; FOR FILE_COPY %\r
+TEMP_DEST      DW      0\r
+TEMP_STRING    DW      0\r
+TEMP_ATTR      DW      0\r
+TEMP_DATE      DW      0\r
+TEMP_TIME      DW      0\r
+TEMP_READY     DW      0               ; %\r
+\r
+TEMP_COUNT     DW      BLOCK_SIZE      ; VARIOUS\r
+\r
+OLD_STRING     DW      0               ; FOR STRING_RESIZE\r
+\r
+BUF_DTA                DB      2BH DUP (0)\r
+\r
+BUF_NAME       DB      129 DUP (0)\r
+BUF_NEW                DB      129 DUP (0)\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CODE   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+DATA   SEGMENT\r
+DATA   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       END\r
diff --git a/src/avr/file.inc b/src/avr/file.inc
new file mode 100644 (file)
index 0000000..7816f1b
--- /dev/null
@@ -0,0 +1,58 @@
+' FILE.INC\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+$LINK "FILE.OBJ"\r
+\r
+DECLARE SUB FILE_OPEN(INTEGER,STRING,INTEGER)\r
+DECLARE SUB FILE_CREATE(INTEGER,STRING,INTEGER,INTEGER)\r
+DECLARE SUB FILE_CLOSE(INTEGER,INTEGER)\r
+DECLARE SUB FILE_READ(INTEGER,STRING,INTEGER,INTEGER)\r
+DECLARE SUB FILE_READ_BUF(INTEGER,STRING,INTEGER,INTEGER)\r
+DECLARE SUB FILE_READ_LINE(INTEGER,STRING,INTEGER)\r
+DECLARE SUB FILE_READ_DIRECT(INTEGER,POINTER,INTEGER,INTEGER)\r
+DECLARE SUB FILE_WRITE(INTEGER,STRING,INTEGER)\r
+DECLARE SUB FILE_WRITE_BUF(INTEGER,STRING,INTEGER)\r
+DECLARE SUB FILE_WRITE_LINE(INTEGER,STRING,INTEGER)\r
+DECLARE SUB FILE_WRITE_DIRECT(INTEGER,POINTER,INTEGER,INTEGER)\r
+DECLARE SUB FILE_SEEK(INTEGER,LONG,INTEGER)\r
+DECLARE SUB FILE_SEEK_REL(INTEGER,LONG,INTEGER)\r
+DECLARE SUB FILE_SEEK_END(INTEGER,LONG,INTEGER)\r
+DECLARE SUB FILE_SEEK_GET(INTEGER,LONG,INTEGER)\r
+DECLARE SUB FILE_PRINT(STRING)\r
+DECLARE SUB FILE_FLUSH(INTEGER,INTEGER)\r
+DECLARE SUB FILE_DUPLICATE_HANDLE(INTEGER,INTEGER,INTEGER)\r
+DECLARE SUB FILE_REDIRECT_HANDLE(INTEGER,INTEGER,INTEGER)\r
+DECLARE SUB FILE_GET_DATE_TIME(INTEGER,INTEGER,INTEGER,INTEGER)\r
+DECLARE SUB FILE_SET_DATE_TIME(INTEGER,INTEGER,INTEGER,INTEGER)\r
+DECLARE SUB FILE_GET_ATTRIBUTES(STRING,INTEGER,INTEGER)\r
+DECLARE SUB FILE_SET_ATTRIBUTES(STRING,INTEGER,INTEGER)\r
+DECLARE SUB FILE_RENAME(STRING,STRING,INTEGER)\r
+DECLARE SUB FILE_DELETE(STRING,INTEGER)\r
+DECLARE SUB FILE_SEARCH_FIRST(STRING,INTEGER,STRING,INTEGER)\r
+DECLARE SUB FILE_SEARCH_NEXT(STRING,INTEGER)\r
+DECLARE SUB FILE_CREATE_DIRECTORY(STRING,INTEGER)\r
+DECLARE SUB FILE_DELETE_DIRECTORY(STRING,INTEGER)\r
+DECLARE SUB FILE_GET_DIRECTORY(INTEGER,STRING,INTEGER)\r
+DECLARE SUB FILE_SET_DIRECTORY(STRING,INTEGER)\r
+DECLARE SUB FILE_GET_DRIVE(INTEGER,INTEGER)\r
+DECLARE SUB FILE_SET_DRIVE(INTEGER,INTEGER)\r
+DECLARE SUB FILE_GET_DRIVE_INFO(INTEGER,INTEGER,INTEGER,INTEGER,INTEGER, _\r
+                               INTEGER)\r
+DECLARE SUB FILE_COPY(STRING,STRING,INTEGER)\r
+DECLARE SUB FILE_INVOCATION(STRING,INTEGER)\r
+DECLARE SUB FILE_SET_HANDLES(INTEGER,INTEGER)\r
+DECLARE SUB FILE_SHELL(STRING,STRING,INTEGER)\r
+DECLARE SUB FILE_DIAG(INTEGER)\r
+\r
+PUBLIC FILE_ERROR%\r
+PUBLIC FILE_COUNT%\r
+PUBLIC FILE_POINTER&\r
+PUBLIC FILE_DRIVES%\r
+\r
+SUB FILE_BOMB_OUT\r
+       END\r
+END SUB\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/iocall.asm b/src/avr/iocall.asm
new file mode 100644 (file)
index 0000000..4b1fcbe
--- /dev/null
@@ -0,0 +1,1015 @@
+; IOCALL.ASM\r
+\r
+EXTRN  GETSTRLOC:FAR\r
+EXTRN  GETSTRALLOC:FAR\r
+EXTRN  RLSSTRALLOC:FAR\r
+\r
+EXTRN  IO_READY:WORD\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CODE   SEGMENT\r
+\r
+       ASSUME  CS:CODE,DS:DATA\r
+\r
+B      EQU     BYTE PTR\r
+W      EQU     WORD PTR\r
+D      EQU     DWORD PTR\r
+\r
+       JUMPS\r
+       LOCALS\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_TEST\r
+; IF IO_READY%=0 THEN PRINT "OSCAR IO NOT INSTALLED":END\r
+\r
+PUBLIC IO_TEST\r
+\r
+IO_TEST:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       MOV     AX,35F8H\r
+       INT     21H\r
+       LEA     DI,[BX-8]               ; ES:DI -> 8 BYTES BEFORE INT\r
+\r
+       MOV     SI,OFFSET OSCAR_IO      ; DS:SI -> COMPARISON STRING\r
+\r
+       MOV     CX,4\r
+       REPZ    CMPSW                   ; CHECK THE BASTARD\r
+       JNZ     @@BAD\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF\r
+\r
+; -----------------------------------------------------------------------------\r
+; ID$="90000 RECALIBRATION             3072 "+ _\r
+;     "AUS SW:04APR97 0000   PC        SYS:0.000          "+ _\r
+;     MKI$(MODEM_PORT%)+MKI$(LOOP_PORT%)+CHR$(ESCAPE_CHAR%)\r
+; IO_TEACH_ID ID$\r
+\r
+PUBLIC IO_TEACH_ID\r
+\r
+IO_TEACH_ID:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; ES:SI -> ID$ DESCRIPTOR\r
+       CALL    STRING_PTR\r
+       MOV     CX,DX                   ; CX:AX -> ID$ DATA\r
+\r
+       MOV     BX,76H                  ; TEACH ID\r
+       INT     0F8H\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_INIT PORT%, RATE&\r
+\r
+PUBLIC IO_INIT\r
+\r
+IO_INIT:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]              ; DX = PORT\r
+\r
+       LES     SI,[BP+6]               ; RATE%\r
+       MOV     DI,ES:[SI+2]\r
+       MOV     SI,ES:[SI]              ; DI:SI = RATE DWORD\r
+\r
+       MOV     AX,4D01H                ; D8PN, SET DTR/RTS ON\r
+       MOV     BX,26H                  ; NEW SET PORT PARAMETERS\r
+       INT     0F8H                    ; ALSO CLEARS ADLC MODE, AUTOS OFF\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_INIT_D7PE PORT%, RATE&\r
+\r
+PUBLIC IO_INIT_D7PE\r
+\r
+IO_INIT_D7PE:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]              ; DX = PORT\r
+\r
+       LES     SI,[BP+6]               ; RATE%\r
+       MOV     DI,ES:[SI+2]\r
+       MOV     SI,ES:[SI]              ; DI:SI = RATE DWORD\r
+\r
+       MOV     AX,7901H                ; D7PE, SET DTR/RTS ON\r
+       MOV     BX,26H                  ; NEW SET PORT PARAMETERS\r
+       INT     0F8H                    ; ALSO CLEARS ADLC MODE, AUTOS OFF\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_INIT_PRESERVE PORT%, RATE&\r
+\r
+PUBLIC IO_INIT_PRESERVE\r
+\r
+IO_INIT_PRESERVE:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]              ; DX = PORT\r
+\r
+       LES     SI,[BP+6]               ; RATE%\r
+       MOV     DI,ES:[SI+2]\r
+       MOV     SI,ES:[SI]              ; DI:SI = RATE DWORD\r
+\r
+       MOV     AX,4D02H                ; D8PN, PRESERVE DTR/RTS\r
+       MOV     BX,26H                  ; NEW SET PORT PARAMETERS\r
+       INT     0F8H                    ; ALSO CLEARS ADLC MODE, AUTOS OFF\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_REINIT PORT%, RATE&\r
+\r
+PUBLIC IO_REINIT\r
+\r
+IO_REINIT:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]              ; DX = PORT\r
+\r
+       LES     SI,[BP+6]               ; RATE%\r
+       MOV     DI,ES:[SI+2]\r
+       MOV     SI,ES:[SI]              ; DI:SI = RATE DWORD\r
+\r
+       MOV     AX,4D03H                ; D8PN, JUST SET PARAMETERS\r
+       MOV     BX,26H                  ; NEW SET PORT PARAMETERS\r
+       INT     0F8H                    ; ALSO CLEARS ADLC MODE, AUTOS OFF\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_REINIT_WAIT PORT%, RATE&\r
+\r
+PUBLIC IO_REINIT_WAIT\r
+\r
+IO_REINIT_WAIT:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]              ; DX = PORT\r
+\r
+       LES     SI,[BP+6]               ; RATE%\r
+       MOV     DI,ES:[SI+2]\r
+       MOV     SI,ES:[SI]              ; DI:SI = RATE DWORD\r
+\r
+       MOV     AX,4D04H                ; D8PN, JUST SET PARAMETERS, WAIT TX\r
+       MOV     BX,26H                  ; NEW SET PORT PARAMETERS\r
+       INT     0F8H                    ; ALSO CLEARS ADLC MODE, AUTOS OFF\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_FLUSH PORT%\r
+\r
+PUBLIC IO_FLUSH\r
+\r
+IO_FLUSH:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       SUB     BX,BX                   ; FLUSH RECEIVER\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_FLUSH_ADLC PORT%\r
+\r
+PUBLIC IO_FLUSH_ADLC\r
+\r
+IO_FLUSH_ADLC:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,7AH                  ; FLUSH ADLC BUFFERS\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_TX PORT%, CHAR%\r
+\r
+PUBLIC IO_TX\r
+\r
+IO_TX: PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; CHAR%\r
+       LODS    B ES:[SI]\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,0AH                  ; SEND BYTE IF READY\r
+       INT     0F8H\r
+       JZ      @@BAD\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_TX_WAIT PORT%, CHAR%\r
+\r
+PUBLIC IO_TX_WAIT\r
+\r
+IO_TX_WAIT:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; CHAR%\r
+       LODS    B ES:[SI]\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,0CH                  ; WAIT TO SEND BYTE\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_TX_STATUS PORT%, FLAG%\r
+\r
+PUBLIC IO_TX_STATUS\r
+\r
+IO_TX_STATUS:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,8                    ; TX STATUS\r
+       INT     0F8H\r
+\r
+       MOV     AX,0\r
+       JZ      @@NULL\r
+       DEC     AX\r
+@@NULL:        LES     DI,[BP+6]               ; FLAG%\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_TX_COMPLETE PORT%, FLAG%\r
+\r
+PUBLIC IO_TX_COMPLETE\r
+\r
+IO_TX_COMPLETE:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,8EH                  ; TX COMPLETE\r
+       INT     0F8H\r
+\r
+       MOV     AX,0\r
+       JZ      @@NULL\r
+       DEC     AX\r
+@@NULL:        LES     DI,[BP+6]               ; FLAG%\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; FRAME$=CMD$+DAT$\r
+; CALL IO_TX_ADLC PORT%, DEST$, FRAME$\r
+\r
+PUBLIC IO_TX_ADLC\r
+\r
+IO_TX_ADLC:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+14]\r
+       MOV     DX,ES:[SI]              ; DX = PORT%\r
+\r
+       MOV     BX,8                    ; TX STATUS\r
+       INT     0F8H\r
+       JNZ     @@BAD\r
+       MOV     [POOL_PTR],AX\r
+       MOV     [POOL_PTR+2],CX         ; POOL_PTR -> RESERVED FRAME\r
+\r
+       LES     SI,[BP+6]               ; FRAME$\r
+       CALL    STRING_PTR              ; DX:AX -> FRAME$ DATA SPACE\r
+       JCXZ    @@BAD\r
+       MOV     [FRAME_LEN],CX          ; FRAME_LEN = LEN(FRAME$)\r
+       MOV     [FRAME_PTR],AX\r
+       MOV     [FRAME_PTR+2],DX        ; FRAME_PTR -> FRAME$ DATA SPACE\r
+\r
+       LES     SI,[BP+10]              ; DEST$\r
+       CALL    STRING_PTR              ; DX:AX -> DEST$ DATA SPACE\r
+       CMP     CX,5\r
+       JNZ     @@BAD\r
+       MOV     [DEST_PTR],AX\r
+       MOV     [DEST_PTR+2],DX         ; DEST_PTR -> DEST$ DATA SPACE\r
+\r
+       LES     DI,D [POOL_PTR]\r
+       INC     DI                      ; DI -> CHN THEN START XMITTED PART\r
+\r
+       MOV     AL,2 ; ???\r
+       STOSB\r
+\r
+       MOV     AL,1+1+1+5+5+1+1+2\r
+       ADD     AL,B [FRAME_LEN]\r
+       STOSB                           ; LEN\r
+\r
+       PUSH    DS\r
+       LDS     SI,[BP+14]              ; PORT%\r
+       MOV     AX,301H ; ???\r
+       ADD     AL,B [SI]\r
+       POP     DS\r
+       STOSW                           ; CHN, RAT\r
+\r
+       PUSH    DS\r
+       LDS     SI,D [DEST_PTR]         ; DS:SI -> DEST$ DATA\r
+       MOV     CX,5\r
+       REP     MOVSB                   ; DESTINATION ADDRESS\r
+       POP     DS\r
+\r
+       ADD     DI,5\r
+       XCHG    AX,CX                   ; AX = 0\r
+       STOSW\r
+\r
+       PUSH    DS\r
+       MOV     CX,[FRAME_LEN]\r
+       LDS     SI,D [FRAME_PTR]\r
+       REP     MOVSB\r
+       POP     DS\r
+\r
+       MOV     AX,[POOL_PTR]\r
+       MOV     CX,[POOL_PTR+2]\r
+\r
+       LES     SI,[BP+14]\r
+       MOV     DX,ES:[SI]              ; DX = PORT%\r
+\r
+       MOV     BX,0EH                  ; TX\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+; CALL IO_RX PORT%, CHAR%\r
+\r
+PUBLIC IO_RX\r
+\r
+IO_RX: PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,W ES:[SI]\r
+\r
+       MOV     BX,4                    ; RECEIVE BYTE IF READY\r
+       INT     0F8H\r
+       JZ      @@BAD\r
+\r
+       LES     DI,[BP+6]               ; CHAR%\r
+       SUB     AH,AH\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_RX_WAIT PORT%, CHAR%\r
+\r
+PUBLIC IO_RX_WAIT\r
+\r
+IO_RX_WAIT:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,W ES:[SI]\r
+\r
+       MOV     BX,6                    ; WAIT TO RECEIVE BYTE\r
+       INT     0F8H\r
+\r
+       LES     DI,[BP+6]               ; CHAR%\r
+       SUB     AH,AH\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_RX_ADLC PORT%, SOURCE$, FRAME$\r
+; IF IO_READY% THEN\r
+;   CMD%=ASC(FRAME$)\r
+;   DAT$=MID$(FRAME$, 2)\r
+; END IF\r
+\r
+PUBLIC IO_RX_ADLC\r
+\r
+IO_RX_ADLC:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+14]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,4                    ; RX STATUS\r
+       INT     0F8H\r
+       JZ      @@BAD\r
+       MOV     [POOL_PTR],AX\r
+       MOV     [POOL_PTR+2],CX\r
+\r
+       XCHG    SI,AX\r
+       MOV     ES,CX\r
+       MOV     AL,ES:[SI+2]\r
+       SUB     AH,AH                   ; CX = RECEIVED FRAME LENGTH\r
+       SUB     AX,1+1+1+5+5+1+1+2\r
+       MOV     [FRAME_LEN],AX\r
+\r
+       XCHG    CX,AX\r
+       LES     SI,[BP+6]               ; FRAME$\r
+       CALL    STRING_REALLOC\r
+       CALL    STRING_PTR              ; DX:AX -> FRAME$ DATA SPACE\r
+       MOV     [FRAME_PTR],AX\r
+       MOV     [FRAME_PTR+2],DX        ; FRAME_PTR -> FRAME$ DATA SPACE\r
+\r
+       MOV     CX,5\r
+       LES     SI,[BP+10]              ; SOURCE$\r
+       CALL    STRING_REALLOC\r
+       CALL    STRING_PTR              ; DX:AX -> SOURCE$ DATA SPACE\r
+\r
+       MOV     CX,5\r
+       XCHG    DI,AX\r
+       MOV     ES,DX                   ; ES:DI -> SOURCE$ DATA SPACE\r
+\r
+       PUSH    DS\r
+       LDS     SI,D [POOL_PTR]\r
+       ADD     SI,2+1+1+1+5            ; DS:SI -> SOURCE ADDRESS IN POOL\r
+       REP     MOVSB\r
+       POP     DS\r
+\r
+       MOV     CX,[FRAME_LEN]\r
+       LES     DI,D [FRAME_PTR]        ; ES:DI -> FRAME$ DATA SPACE\r
+\r
+       PUSH    DS\r
+       LDS     SI,D [POOL_PTR]\r
+       PUSH    SI\r
+       ADD     SI,2+1+1+1+5+5+2        ; DS:SI -> COMMAND + DATA IN POOL\r
+       REP     MOVSB\r
+       POP     SI                      ; SI -> FRAME FLAG\r
+       AND     B [SI],11111101B        ; CLEAR BIT 1\r
+       POP     DS\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    12\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_SET_DTR PORT%, FLAG%\r
+\r
+PUBLIC IO_SET_DTR\r
+\r
+IO_SET_DTR:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; FLAG%\r
+       LODSW\r
+       OR      AL,AH\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,10H                  ; DTR ON/OFF\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_SET_RTS PORT%, FLAG%\r
+\r
+PUBLIC IO_SET_RTS\r
+\r
+IO_SET_RTS:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; FLAG%\r
+       LODSW\r
+       OR      AL,AH\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,12H                  ; RTS ON/OFF\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_SET_BREAK PORT%, FLAG%\r
+\r
+PUBLIC IO_SET_BREAK\r
+\r
+IO_SET_BREAK:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; FLAG%\r
+       LODSW\r
+       OR      AL,AH\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,28H                  ; BREAK ON/OFF\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_SET_ADLC PORT%, FLAG%\r
+\r
+PUBLIC IO_SET_ADLC\r
+\r
+IO_SET_ADLC:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; FLAG%\r
+       LODSW\r
+       OR      AL,AH\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,74H                  ; ADLC ON/OFF\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_SET_AUTOS PORT%, FLAG%\r
+\r
+PUBLIC IO_SET_AUTOS\r
+\r
+IO_SET_AUTOS:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; FLAG%\r
+       LODSW\r
+       OR      AL,AH\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,14H                  ; AUTOS ON/OFF\r
+       INT     0F8H\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_READ_DCD PORT%, FLAG%\r
+\r
+PUBLIC IO_READ_DCD\r
+\r
+IO_READ_DCD:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,16H                  ; DCD STATUS\r
+       INT     0F8H\r
+\r
+       MOV     AX,0\r
+       JZ      @@NULL\r
+       DEC     AX\r
+@@NULL:        LES     DI,[BP+6]               ; FLAG%\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_READ_DSR PORT%, FLAG%\r
+\r
+PUBLIC IO_READ_DSR\r
+\r
+IO_READ_DSR:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,18H                  ; DSR STATUS\r
+       INT     0F8H\r
+\r
+       MOV     AX,0\r
+       JZ      @@NULL\r
+       DEC     AX\r
+@@NULL:        LES     DI,[BP+6]               ; FLAG%\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_READ_CTS PORT%, FLAG%\r
+\r
+PUBLIC IO_READ_CTS\r
+\r
+IO_READ_CTS:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,1AH                  ; CTS STATUS\r
+       INT     0F8H\r
+\r
+       MOV     AX,0\r
+       JZ      @@NULL\r
+       DEC     AX\r
+@@NULL:        LES     DI,[BP+6]               ; FLAG%\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; IO_READ_RI PORT%, FLAG%\r
+\r
+PUBLIC IO_READ_RI\r
+\r
+IO_READ_RI:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+10]              ; PORT%\r
+       MOV     DX,ES:[SI]\r
+\r
+       MOV     BX,1CH                  ; RI STATUS\r
+       INT     0F8H\r
+\r
+       MOV     AX,0\r
+       JZ      @@NULL\r
+       DEC     AX\r
+@@NULL:        LES     DI,[BP+6]               ; FLAG%\r
+       STOSW\r
+\r
+       MOV     W [IO_READY],-1\r
+\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    8\r
+\r
+; -----------------------------------------------------------------------------\r
+; QUEUE$="STUFF THIS"\r
+; IO_QUEUE QUEUE$\r
+\r
+PUBLIC IO_QUEUE\r
+\r
+IO_QUEUE:\r
+       PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    DS\r
+       PUSH    SI\r
+       PUSH    DI\r
+\r
+       LES     SI,[BP+6]               ; QUEUE$\r
+       CALL    STRING_PTR\r
+       MOV     [QUEUE_LEN],CX\r
+       MOV     [QUEUE_PTR],AX\r
+       MOV     [QUEUE_PTR+2],DX\r
+\r
+       INC     CX\r
+       INC     CX\r
+       PUSH    DS\r
+       POP     ES\r
+       MOV     SI,OFFSET STRING_TEMP\r
+       CALL    STRING_ALLOC\r
+       CALL    STRING_PTR              ; DX:AX -> TEMPORARY DATA SPACE\r
+\r
+       MOV     CX,[QUEUE_LEN]\r
+       XCHG    DI,AX\r
+       MOV     ES,DX\r
+\r
+       PUSH    DS\r
+       LDS     SI,D [QUEUE_PTR]\r
+       REP     MOVSB\r
+       POP     DS\r
+\r
+       MOV     AX,[QUEUE_LEN]\r
+       STOSW\r
+\r
+       DEC     DI\r
+       DEC     DI\r
+       XCHG    AX,DI\r
+       MOV     CX,ES                   ; CX:AX -> LENGTH WORD IN COPIED STRING\r
+\r
+       MOV     BX,62H                  ; ADD TO QUEUE, BUFFERED\r
+       INT     0F8H\r
+\r
+       PUSHF\r
+       PUSH    DS\r
+       POP     ES\r
+       MOV     SI,OFFSET STRING_TEMP\r
+       CALL    STRING_FREE\r
+       POPF\r
+       JZ      @@BAD\r
+\r
+       MOV     W [IO_READY],-1\r
+       JMP     @@RET\r
+\r
+@@BAD: MOV     W [IO_READY],0\r
+\r
+@@RET: POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    4\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+STRING_PTR:\r
+       PUSH    ES\r
+       PUSH    SI\r
+       PUSH    W ES:[SI]\r
+       CALL    GETSTRLOC\r
+       POP     SI\r
+       POP     ES\r
+       RET\r
+\r
+STRING_FREE:\r
+       CMP     W ES:[SI],0\r
+       JZ      @@RET\r
+       PUSH    ES\r
+       PUSH    SI\r
+       PUSH    ES:[SI]\r
+       CALL    RLSSTRALLOC\r
+       POP     SI\r
+       POP     ES\r
+       MOV     W ES:[SI],0\r
+@@RET: RET\r
+\r
+STRING_REALLOC:\r
+       PUSH    CX\r
+       CALL    STRING_FREE\r
+       POP     CX\r
+STRING_ALLOC:\r
+       PUSH    ES\r
+       PUSH    SI\r
+       PUSH    CX\r
+       CALL    GETSTRALLOC\r
+       POP     SI\r
+       POP     ES\r
+       MOV     ES:[SI],AX\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CODE   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+DATA   SEGMENT\r
+\r
+OSCAR_IO       DB      'OSCAR IO'\r
+\r
+               EVENDATA\r
+\r
+STRING_TEMP    DW      ?\r
+\r
+QUEUE_LEN      DW      ?\r
+QUEUE_PTR      DW      ?\r
+\r
+FRAME_LEN      DW      ?\r
+FRAME_PTR      DW      ?,?\r
+\r
+POOL_PTR       DW      ?,?\r
+DEST_PTR       DW      ?,?\r
+\r
+DATA   ENDS\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       END\r
diff --git a/src/avr/iocall.inc b/src/avr/iocall.inc
new file mode 100644 (file)
index 0000000..b148e3c
--- /dev/null
@@ -0,0 +1,44 @@
+' IOCALL.INC\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+PUBLIC IO_READY%\r
+\r
+$LINK "IOCALL.OBJ"\r
+\r
+DECLARE SUB IO_TEST()\r
+DECLARE SUB IO_TEACH_ID(STRING)\r
+\r
+DECLARE SUB IO_INIT(INTEGER,LONG)\r
+DECLARE SUB IO_INIT_D7PE(INTEGER,LONG)\r
+DECLARE SUB IO_INIT_PRESERVE(INTEGER,LONG)\r
+DECLARE SUB IO_REINIT(INTEGER,LONG)\r
+DECLARE SUB IO_REINIT_WAIT(INTEGER,LONG)\r
+DECLARE SUB IO_FLUSH(INTEGER)\r
+DECLARE SUB IO_FLUSH_ADLC(INTEGER)\r
+\r
+DECLARE SUB IO_TX(INTEGER,INTEGER)\r
+DECLARE SUB IO_TX_WAIT(INTEGER,INTEGER)\r
+DECLARE SUB IO_TX_STATUS(INTEGER,INTEGER)\r
+DECLARE SUB IO_TX_COMPLETE(INTEGER,INTEGER)\r
+DECLARE SUB IO_TX_ADLC(INTEGER,STRING,STRING)\r
+\r
+DECLARE SUB IO_RX(INTEGER,INTEGER)\r
+DECLARE SUB IO_RX_WAIT(INTEGER,INTEGER)\r
+DECLARE SUB IO_RX_ADLC(INTEGER,STRING,STRING)\r
+\r
+DECLARE SUB IO_SET_DTR(INTEGER,INTEGER)\r
+DECLARE SUB IO_SET_RTS(INTEGER,INTEGER)\r
+DECLARE SUB IO_SET_BREAK(INTEGER,INTEGER)\r
+DECLARE SUB IO_SET_ADLC(INTEGER,INTEGER)\r
+DECLARE SUB IO_SET_AUTOS(INTEGER,INTEGER)\r
+\r
+DECLARE SUB IO_READ_DCD(INTEGER,INTEGER)\r
+DECLARE SUB IO_READ_DSR(INTEGER,INTEGER)\r
+DECLARE SUB IO_READ_CTS(INTEGER,INTEGER)\r
+DECLARE SUB IO_READ_RI(INTEGER,INTEGER)\r
+\r
+DECLARE SUB IO_QUEUE(INTEGER)\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/lcter.asm b/src/avr/lcter.asm
new file mode 100644 (file)
index 0000000..892cb1f
--- /dev/null
@@ -0,0 +1,2398 @@
+;      LC.ASM\r
+;      WEIGHING MODE\r
+\r
+.INCLUDE "4433DEF.INC" ; FOR AVR ASSEMBLER\r
+;.INCLUDE "4433DEFX.INC" ; FOR NICK ASSEMBLER\r
+.INCLUDE "MACLC.INC"\r
+;.INCLUDE "APILC.INC"\r
+.INCLUDE "TERLC.INC"\r
+\r
+; WE SHOULD CHANGE THE CODE TO USE UCSRA AND UCSRB\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   CR              =$0D\r
+.EQU   LF              =$0A\r
+.EQU   RX_SIZE         =1\r
+.EQU   TX_SIZE         =8              ; LEAVES 10 BYTES FREE\r
+.EQU   API_ADDRESS     =$01            ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   CYC_MAX         =256            ; MAXIMUM WEIGHING CYCLE TIME\r
+.EQU   CYC_MIN         =160            ; MINIMUM WEIGHING CYCLE TIME > 6\r
+                                       ; < 210 ELSE OVERFLOW FOR FREQ < 27KHZ\r
+\r
+.EQU   CYC_ZERO        =16             ; INITIAL ZEROING COUNT\r
+.EQU   CYC_START       =32             ; INITIAL SMOOTHING COUNT\r
+\r
+                                       ; BITS IN RANGE\r
+.EQU   RNG             =$0F            ; RANGE BITS 0-3\r
+.EQU   RND             =6              ; ROUND UP (FOR HYSTERESIS)\r
+.EQU   SGN             =7              ; SIGN (FOR HYSTERESIS)\r
+                                       ; SGN MUST BE BIT 7 FOR EOR INSTRUCTION\r
+\r
+                                       ; BITS IN STATUS\r
+.EQU   OUCHFLG         =0              ; OVERLOAD\r
+.EQU   LOWFLG          =1              ; UNDERLOAD\r
+.EQU   UNSTBL          =2              ; UNSTABLE\r
+.EQU   VSTBL           =3              ; VERY STABLE\r
+.EQU   ZROFLG          =4              ; DISPLAY SHOWS ZERO\r
+.EQU   TRYZRO          =5              ; TRYING TO SET ZERO\r
+.EQU   SEND_SN         =6              ; TRYING TO SEND S/N MESSAGE\r
+.EQU   SEND_SPAN       =7              ; TRYING TO SEND SPAN MESSAGE\r
+\r
+                                       ; BITS IN FLAGS\r
+.EQU   SNDDAT          =0              ; SEND CHARACTERIZE DATA\r
+.EQU   ESC             =1              ; SET AFTER RECEIVING ESC\r
+.EQU   ESCM            =2              ; SET AFTER RECEIVING ESC M\r
+.EQU   BOMB            =3              ; SET DURING TILT MEASUREMENT\r
+.EQU   NEWDAT          =4              ; NEW SCALE DATA AVAILABLE\r
+.EQU   DIR             =5              ; DIRECTION OF CHANGE IN WGT\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+                                       ; BITS IN MODE\r
+.EQU   ABSGMS_FLG      =0              ; ABSOLUTE WEIGHT IN FP FORMAT\r
+.EQU   ZROGMS_FLG      =1              ; ZERO REGISTER IN FP FORMAT\r
+.EQU   TMPDEG_FLG      =2              ; TEMPERATURE (DEGREES) IN FP FORMAT\r
+.EQU   TLTBUB_FLG      =3              ; TILT BUBBLE POSITION IN INT FORMAT\r
+.EQU   WGTFRQ_FLG      =4              ; WEIGHT FREQUENCY IN FP FORMAT\r
+.EQU   TMPFRQ_FLG      =5              ; TEMPERATURE FREQUENCY IN FP FORMAT\r
+.EQU   TLRFRQ_FLG      =6              ; TILT LEFT/RIGHT IN FP FORMAT\r
+.EQU   TFBFRQ_FLG      =7              ; TILT FRONT/BACK IN FP FORMAT\r
+\r
+.DEF   FC0             =R0             ; AUXILLIARY FP ACCUMULATOR\r
+.DEF   FC1             =R1\r
+.DEF   FC2             =R2\r
+\r
+.EQU   FB              =$03\r
+.DEF   FB0             =R3             ; ARGUMENT FP ACCUMULATOR\r
+.DEF   FB1             =R4\r
+.DEF   FB2             =R5\r
+.DEF   FB3             =R6\r
+\r
+.EQU   FA              =$07\r
+.DEF   FA0             =R7             ; PRINCIPAL FP ACCUMULATOR\r
+.DEF   FA1             =R8\r
+.DEF   FA2             =R9\r
+.DEF   FA3             =R10\r
+\r
+.DEF   CYC_0           =R11\r
+.DEF   CYC_1           =R12\r
+\r
+.DEF   WT_0            =R13            ; RUNNING COUNT FOR 16 WEIGHT CYCLES\r
+.DEF   WT_1            =R14            ; TIMER1 INPUT CAPTURE LOW\r
+.DEF   WT_2            =R15            ; TIMER1 INPUT CAPTURE HIGH\r
+\r
+.DEF    A              =R17            ; GLOBAL REGISTERS\r
+.DEF    B              =R18\r
+.DEF   D               =R19\r
+.DEF   E               =R20\r
+.DEF   F               =R21\r
+\r
+.DEF   SR              =R22            ; SECONDARY REGISTER SET\r
+.DEF   G               =R23\r
+.DEF   H               =R24\r
+.DEF   I               =R25\r
+.DEF   J               =R27            ; XH\r
+.DEF   K               =R29            ; YH\r
+\r
+.DEF   FLAGS           =R16            ; MUST BE REGISTER, FOR ATOMIC ACCESS\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+STARTUP:       .BYTE   1               ; SMOOTHING COUNT FOR INITIAL STARTUP\r
+F3:\r
+TLTL_BUF:      .BYTE   2               ; DATA OUTPUT BUFFERS\r
+TLTR_BUF:      .BYTE   2\r
+F4:\r
+TLTF_BUF:      .BYTE   2\r
+TLTB_BUF:      .BYTE   2\r
+WGT:           .BYTE   3               ; ACCUMULATOR FOR 64 GROUPS OF 16\r
+TMP:           .BYTE   3               ; ACCUMULATOR FOR 256 TEMPERATURE\r
+TLTL:          .BYTE   2               ; ACCUMULATOR FOR 64 TILT CYCLES (TLT0)\r
+TLTR:          .BYTE   2\r
+TLTF:          .BYTE   2               ;                                (TLT1)\r
+TLTB:          .BYTE   2\r
+DTMP:          .BYTE   2               ; DIFFERENCE COUNT FOR CURRENT TEMP CYC\r
+WGTLST:                .BYTE   3               ; VALUE OF ADDITION TO WGT ON LAST CYC\r
+TL:            .BYTE   4               ; AVERAGED TLTLR\r
+TF:            .BYTE   4               ; AVERAGED TLTFB\r
+TMPFRQ:                .BYTE   4               ; TEMPERATURE FREQUENCY CYCLES/30MHZ\r
+GMS:           .BYTE   4\r
+LSTGMS:                .BYTE   4\r
+LSTDEV:                .BYTE   4\r
+AVEGMS:                .BYTE   4\r
+AVESTD:                .BYTE   4\r
+INTGMS:                .BYTE   4\r
+COUNT:         .BYTE   4\r
+\r
+F0:            .BYTE   4               ; FLOATING POINT REGISTERS\r
+F1:            .BYTE   4\r
+F2:            .BYTE   4\r
+RANGE:         .BYTE   1\r
+STATUS:                .BYTE   1\r
+MODE:          .BYTE   1\r
+MODE_CYCLE:    .BYTE   1               ; WEIGHING ONLY\r
+;WGTFRQ:       .BYTE   4               ; CHARACTERIZE ONLY\r
+;REF_30MHZ:    .BYTE   4               ; CHARACTERIZE ONLY\r
+TMP_PHASE:     .BYTE   1               ; CAREFUL\r
+DSPGMS:                .BYTE   4\r
+ZROGMS:                .BYTE   4\r
+DSPRES:                .BYTE   4\r
+\r
+API_REMAIN:    .BYTE   1\r
+RX_PTR:                .BYTE   1\r
+RX_COUNT:      .BYTE   1\r
+RX_BUF:                .BYTE   RX_SIZE\r
+TX_PTR:                .BYTE   1\r
+TX_COUNT:      .BYTE   1\r
+TX_BUF:                .BYTE   TX_SIZE         ; CAREFUL - COULD BE CLOBBERED BY STACK\r
+\r
+.ESEG\r
+.ORG   $000\r
+VOID:  .DB     $00,$00                 ; DON'T USE ADDR $000\r
+;EEMODE:       .DB     $00,$00         ; SEND ASCII WEIGHT DATA ONLY\r
+\r
+;SPAN: .DB     $00,$00,$80,$3F         ; 1.0000000E+00 SPAN FOR MELB/DELAWARE\r
+SPAN:  .DB     $1B,$BA,$7F,$3F         ; 0.9989335E+00 SPAN FOR JSY/NLD\r
+;SPAN: .DB     $6C,$21,$80,$3F         ; 1.0010200E+00 SPAN FOR QATAR\r
+\r
+;CAL3: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+;CAL2: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+;CAL1: .DB     $00,$00,$80,$3F         ; 1.0000000E+00\r
+;CAL0: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+\r
+RANGES: .DB    $04,$00                 ;  OIML APO30\r
+RANGE1: .DB    $00,$40,$1C,$45         ;  2500\r
+       .DB     $00,$00,$80,$3F         ;     1\r
+       .DB     $00,$40,$9C,$45         ;  5000\r
+       .DB     $00,$00,$A0,$40         ;     5\r
+       .DB     $00,$40,$1C,$46         ; 10000\r
+       .DB     $00,$00,$20,$41         ;    10\r
+RNGMAX: .DB    $00,$D8,$EA,$46         ; 30060\r
+       .DB     $00,$00,$A0,$41         ;    20\r
+\r
+.CSEG\r
+\r
+       .ORG    0\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT0ADDR\r
+       RJMP    TMP_INT                 ; INT0 HANDLER FOR TEMPERATURE MEASUREMENT\r
+\r
+       .ORG    ICP1ADDR\r
+       RJMP    WGT_INT                 ; TIMER1 CAPTURE HANDLER\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+\r
+.INCLUDE  "PRM.INC"                    ; LOAD CELL CHARACTERIZE PARAMETERS\r
+\r
+TLT2:  .DB     $C7,$75,$41,$AF ;-1.759509E-10  TILT LINEARISATION PARAMETERS\r
+TLT1:  .DB     $25,$7E,$0B,$35 ; 5.196510E-07\r
+TLT0:  .DB     $04,$31,$E3,$39 ; 4.333333E-04\r
+\r
+TICKS: .DB     $AE,$11,$8D,$45 ; 4.514210E+03 = 4096*33.06306M/30M\r
+\r
+HSTRSL:        .DB     $33,$33,$B3,$3E ; 3.500000E-01 = (0.5-0.15)\r
+HSTRSH:        .DB     $66,$66,$26,$3F ; 6.500000E-01 = (0.5+0.15)\r
+\r
+CNFHYS:        .DB     $00,$00,$A0,$41 ; 2.000000E+01 = 3/.15\r
+HYSCNF:        .DB     $CD,$CC,$CC,$3D ; 1.000000E-01 = .3/3\r
+QUANT: .DB     $CD,$CC,$4C,$3E ; 2.000000E-01\r
+\r
+;K_1:  .DB     $00,$00,$80,$BF ;-1.000000E+00\r
+;K_R5: .DB     $00,$00,$00,$BF ;-5.000000E-01\r
+KR0001:        .DB     $17,$B7,$D1,$38 ; 1.000000E-04\r
+KR005: .DB     $0A,$D7,$A3,$3B ; 5.000000E-03 COULD PERHAPS USE KR0001 INSTEAD\r
+KR1:   .DB     $CD,$CC,$CC,$3D ; 1.000000E-01\r
+KR3:   .DB     $9A,$99,$99,$3E ; 3.000000E-01 COULD PERHAPS ELIMINATE THIS\r
+KR5:   .DB     $00,$00,$00,$3F ; 5.000000E-01\r
+;K0:   .DB     $00,$00         ; 0.000000E+00 DON'T MOVE!\r
+K1:    .DB     $00,$00,$80,$3F ; 1.000000E+00           !\r
+;K2:   .DB     $00,$00,$00,$40 ; 2.000000E+00\r
+K3:    .DB     $00,$00,$40,$40 ; 3.000000E+00\r
+K4:    .DB     $00,$00,$80,$40 ; 4.000000E+00\r
+K10:   .DB     $00,$00,$20,$41 ; 1.000000E+01\r
+K16:   .DB     $00,$00,$80,$41 ; 1.600000E+01\r
+K20:   .DB     $00,$00,$A0,$41 ; 2.000000E+01\r
+K30:   .DB     $00,$00,$F0,$41 ; 3.000000E+01\r
+K64:   .DB     $00,$00,$80,$42 ; 6.400000E+01\r
+;K100: .DB     $00,$00,$C8,$42 ; 1.000000E+02\r
+;K256:  .DB     $00,$00,$80,$43 ; 2.560000E+02\r
+K228:   .DB     $39,$8E,$63,$43 ; 2.275556E+02 = 256*16/18 REVISED 17MAY01\r
+K400:  .DB     $00,$00,$C8,$43 ; 4.000000E+02\r
+K450:  .DB     $00,$00,$E1,$43 ; 4.500000E+02 SHOULD PUT ZERO RANGE IN EEPROM\r
+;K1450:        .DB     $00,$40,$B5,$44 ; 1.450000E+03\r
+;K10K: .DB     $00,$40,$1C,$46 ; 1.000000E+04\r
+; CHARACTERIZE ONLY %\r
+;K100K:        .DB     $00,$50,$C3,$47 ; 1.000000E+05\r
+;K30M: .DB     $C0,$E1,$E4,$4B ; 3.000000E+07\r
+;K33M: .DB     $00,$20,$FD,$4B ; 3.317760E+07\r
+; %\r
+\r
+; PUT THIS IN EEPROM:\r
+;SIGNON: .DB   3,0                     ; MUST HAVE EVEN NUMBER OF CHARS\r
+;      .DB     "LC"\r
+;      .DB     $0D,$0A\r
+FMAT0: .DB     6,0\r
+       .DB     " 0.000"\r
+FMAT1: .DB     6,0\r
+       .DB     "-OUCH "\r
+FMAT2: .DB     6,0\r
+       .DB     " -LO- "\r
+;FMAT3:        .DB     6,0\r
+;      .DB     "HELLO "\r
+;FMAT4:        .DB     6,0\r
+;      .DB     "Error "\r
+FMAT5: .DB     6,0\r
+       .DB     "      "\r
+FMAT6: .DB     2,0\r
+       .DB     $0D,$0A\r
+;FMAT6:        .DB     3,0\r
+;      .DB     $20,$0D,$0A,0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       OUTI    SPL,RAMEND              ; INIT STACK POINTER\r
+       OUTI    ACSR,$80                ; POWER DOWN ANALOG COMPARATOR\r
+\r
+;      SBI     DDRB,5                  ; SET SK TO OUTPUT FOR DIAGNOSTICS\r
+\r
+       SBI     DDRD,2                  ; SET BIT 2 TO OUTPUT FOR TEMP SENSOR\r
+       SBI     DDRD,3                  ; SET BIT 3 TO OUTPUT FOR TILT SENSOR\r
+\r
+       OUTI    TCCR1B,1                ; SET COUNTER1 TO CLOCK AT 11.0592 MHZ\r
+                                       ; AND INPUT CAPTURE ON FALLING EDGE\r
+;       OUTI    MCUCR,2                 ; SET INT0 FALLING EDGE FOR TEMP SENSOR\r
+        OUTI    MCUCR,0                 ; SET INT0 LOW SENSE FOR TEMP SENSOR\r
+                                        ; 17MAY01 BOMBS GRACEFULLY AT EACH EXTREME\r
+\r
+       CLR     CYC_0\r
+       CLR     CYC_1\r
+\r
+       CLR     A\r
+       STS     RANGE,A\r
+       RCALL   STS_STATUS_A\r
+       STS     STARTUP,A\r
+       STS     TMP_PHASE,A\r
+\r
+       ;LDER   A,EEMODE\r
+; CHARACTERIZE ONLY %\r
+;      LDI     A,$F0\r
+; %\r
+       STS     MODE,A\r
+\r
+; WEIGHING ONLY %\r
+       LDI     A,1\r
+       STS     MODE_CYCLE,A\r
+; %\r
+\r
+       FLDF    K1\r
+       FST     DSPRES\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     LSTGMS\r
+       FST     LSTDEV\r
+       FST     AVEGMS\r
+       FST     AVESTD\r
+       FST     INTGMS\r
+; CHARACTERIZE ONLY %\r
+;      FST     WGTFRQ                  ; MAY NOT BE NECESSARY\r
+;      FST     REF_30MHZ               ; NECESSARY\r
+; %\r
+\r
+       INIT_API_BUS                    ; SET UART RATE AND CLEAR FLAGS/PTRS\r
+\r
+       IN      A,TIMSK\r
+       ORI     A,8                     ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+       OUT     TIMSK,A\r
+\r
+; WEIGHING ONLY %\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+; %\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;      LDFL    D,SIGNON                ; SEND SIGNON MESSAGE\r
+;      LDI     E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+\r
+LOOP:                                  ; MAIN PROGRAM\r
+       ; IF THE INTERRUPT ALREADY CAME,\r
+       ; THROW AWAY THE DATA AND WAIT FOR A NEW ONE\r
+       CBR     FLAGS,1<<NEWDAT\r
+WAIT_LOOP:\r
+       ; TEST FOR WAITING COMMANDS OR DATA\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    WAIT_LOOPE\r
+       RCALL   RX_CHAR\r
+ ; LOOPBACK TEST\r
+ ;RCALL TX_CHAR\r
+       SBRC    FLAGS,ESC\r
+       RJMP    PROCESS_ESC\r
+       CPI     A,$1B\r
+       BRNE    WAIT_LOOPE\r
+       SBR     FLAGS,1<<ESC\r
+WAIT_LOOPE:\r
+       ; TEST FOR NEW DATA LEFT BY THE INTERRUPT\r
+       SBRS    FLAGS,NEWDAT\r
+       RJMP    WAIT_LOOP\r
+\r
+; WEIGHING ONLY %\r
+       WDR                     ; FEED WATCHDOG\r
+; %\r
+\r
+       ; SAY WE ARE TAKING THE NEW DATA\r
+       ;CBR    FLAGS,1<<NEWDAT\r
+\r
+       ; PROVIDE SQUARE WAVE DIAGNOSTIC ON B5\r
+       ;IN     A,PORTB\r
+       ;LDI    B,1<<5\r
+       ;EOR    A,B\r
+       ;OUT    PORTB,A\r
+\r
+       ;FLD DSPRES                     ; STACK TEST\r
+       ;RCALL SHOW_FA\r
+       ;LDI A,' '\r
+       ;RCALL TX_WAIT\r
+\r
+       FLD2    F2                      ; CONVERT CYCLE COUNT TO FP FORMAT\r
+       FST     F2\r
+       ;LDI    A,1<<WGTFRQ_FLG\r
+       ;LDI    F,'0'+WGTFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+GRAMS: FLD3    GMS                     ; CONVERT WEIGHT COUNT TO FP FORMAT\r
+; CHARACTERIZE ONLY %\r
+;      FST     GMS\r
+;      FAD     REF_30MHZ\r
+;      FST     REF_30MHZ\r
+;      FLD     GMS\r
+; %\r
+       ;LDI    A,1<<TMPFRQ_FLG\r
+       ;LDI    F,'0'+TMPFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FDV     F2\r
+;      FMLF    K256 ;K64\r
+        FMLF    K228                    ; 17MAY01 256*16/18=227.55556\r
+       FST     GMS\r
+       FLDF    TICKS                   ; CONVERSION FACTOR\r
+       FDV     GMS\r
+       FST     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;      30usec\r
+\r
+       FLD3    F0                      ; CONVERT TEMPERATURE COUNT TO FP\r
+       FDV     F2                      ;   (THIS ROUTINE FREES UP F0)\r
+       FMLF    K64 ;K16\r
+       FST     F0\r
+       FLDF    KR3\r
+       FDV     F0                      ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;LDI A,$0D\r
+;RCALL SNDEXP\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TMPFRQ\r
+       RCALL   SMOOTH\r
+;      270usec\r
+\r
+       ;LDS    A,STARTUP\r
+       ;SUBI   A,-$30\r
+       ;RCALL  TX_WAIT\r
+\r
+       FLD     GMS\r
+; CHARACTERIZE ONLY %\r
+;      LDS     A,STARTUP               ; SMOOTHING COUNT\r
+;      LDI     F,WGTFRQ\r
+;      RCALL   SMOOTH\r
+; %\r
+       LDI     A,1<<WGTFRQ_FLG\r
+       LDI     F,'0'+WGTFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+       FLD     TMPFRQ\r
+       LDI     A,1<<TMPFRQ_FLG\r
+       LDI     F,'0'+TMPFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTL_BUF             ; CONVERT TILT TO FP (FREE UP F2, F3)\r
+       RCALL   LIN_TLT                 ; RETURNS CYCLES/30MHZ CLOCK TICK\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TL\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TLRFRQ_FLG\r
+       LDI     F,'0'+TLRFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TLRFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTF_BUF             ; (FREE UP F4)\r
+       RCALL   LIN_TLT\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TF\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TFBFRQ_FLG\r
+       LDI     F,'0'+TFBFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TFBFRQ IF DIAGNOSTIC MODE\r
+;2msec\r
+\r
+       RCALL   NRMTMP                  ; CONVERT TO NORMALIZED TEMP (-1<T<+1)\r
+       FST     F4                      ; AND SAVE NOW THAT F4 AVAILABLE\r
+       LDI     F,6                     ; DEGREE\r
+       LDIZ    A11                     ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; ZERO COMP A11*T^6+A10*T^5+A9*T^4+...\r
+       FST     F1\r
+;      1.1msec\r
+\r
+       FLD     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+       FADE    _WREF                   ; SHIFT ORIGIN TO IMPROVE PRECISION\r
+       LDFL    E,SEGS1                 ; GET SEGMENT COUNT\r
+       LDIZ    SEG1                    ; POINT TO FIRST SEGMENT BOUNDARY\r
+SEGN:  RCALL   CPF_FA                  ; COMPARE FA WITH SEGn\r
+       BRCC    GOTSEG\r
+       ADIW    ZL,12                   ; POINT TO NEXT SEGn\r
+       DEC     E\r
+       BRNE    SEGN\r
+GOTSEG:                                        ; CONVERT TO GMS = D2*W^2 + D1*W + D0\r
+       LDI     F,2                     ; DEGREE\r
+       RCALL   POLY                    ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FAD     F1                      ; GMS=GMS+(THERMAL ZERO CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; NOW, BACK TO GRAMS\r
+       LDFH    F,DEGS                  ; DEGREE\r
+       LDI     E,3                     ; RANGE COUNT\r
+       LDIZ    K500                    ; POINT TO 1ST RANGE BOUNDARY\r
+       RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCC    NEXT_SPNRNG\r
+\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CASE GMS<500\r
+       FDVE    K500\r
+       FML     GMS\r
+       RJMP    THERM_SPAN\r
+\r
+SPNRNG:        RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCS    GOT_SPNRNG\r
+NEXT_SPNRNG:\r
+       ADIW    ZL,32                   ; POINT TO NEXT RANGE BOUNDARY\r
+       DEC     E\r
+       BRNE    SPNRNG\r
+       ADIW    ZL,4\r
+GOT_SPNRNG:\r
+       SBIW    ZL,40                   ; POINT TO PREVIOUS BOUNDARY\r
+       RCALL   SUBE_FA\r
+       FST     F2                      ; F2=GMS-LOWER BOUNDARY\r
+       MOV     E,F                     ; SAVE DEGREE FOR LATER\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FST     F3                      ; CORR.LOW\r
+       MOV     F,E                     ; RESTORE DEGREE\r
+       ADIW    ZL,8                    ; POINT TO NEXT HIGH ORDER COEFFICIENT\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CALCULATE CORR.HIGH\r
+       FSB     F3                      ; CORR.HIGH-CORR.LOW\r
+       SBIW    ZL,8+4+(6*4)            ; ASSUME DEGREE = 6\r
+       RCALL   DIVE_FA\r
+       FML     F2\r
+       FAD     F3                      ; THERMAL SPAN CORRECTION\r
+THERM_SPAN:\r
+       FST     F2\r
+\r
+       ;LDI    A,1<<ZROGMS_FLG\r
+       ;LDI    F,'0'+ZROGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FAD     GMS                     ; GMS=GMS+(THERMAL SPAN CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_10\r
+       MOV     F,FA0\r
+\r
+       FLD     F4                      ; NORMALISED TEMPERATURE\r
+       FMLF    K30\r
+       FADF    K20                     ; CONVERT TO DEGREES CELSIUS\r
+       RCALL   FIX_10                  ; TEMPERATURE (10TH DEGREES)\r
+       MOV     FA2,F                   ; THERMAL ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,E                   ; THERMAL SPAN CORRECTION (10TH GMS)\r
+\r
+       LDI     A,1<<TMPDEG_FLG\r
+       LDI     F,'0'+TMPDEG_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+; TILT CORRECTION\r
+; TLTP1=TLTA31*TLTFR0 + TLTA21*TLTFR1^2+TLTA11*TLTFR1+TLTA01\r
+       LDIZ    TLTA21                  ; TILT FB BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TF\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA31\r
+       FML     TL\r
+       FAD     F0\r
+       FST     F1\r
+\r
+; TLTP0=TLTA30*TLTFR1 + TLTA20*TLTFR0^2+TLTA10*TLTFR0+TLTA00\r
+       LDIZ    TLTA20                  ; TILT LR BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TL\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA30\r
+       FML     TF\r
+       FAD     F0\r
+       FST     F0\r
+\r
+; TLTSPN1 = (TLTC21*TLTP1+TLTC11)*TLTP1\r
+       RCALL   LDF_FA                  ; TLTC21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTC11\r
+       FML     F1\r
+       FST     F3\r
+\r
+; TLTSPN0 = (TLTC20*TLTP0+TLTC10)*TLTP0\r
+       RCALL   LDF_FA                  ; TLTC20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTC10\r
+       FML     F0\r
+\r
+; WEIGHT = WEIGHT + WEIGHT*(TLTSPN0+TLTSPN1)\r
+       FAD     F3\r
+       FST     F3                      ; TLTSPN\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FML     GMS\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+; WEIGHT=WEIGHT + TLTB21*TLTP1^2+TLTB11*TLTP1\r
+       RCALL   LDF_FA                  ; TLTB21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTB11\r
+       FML     F1\r
+       FST     F2\r
+\r
+; WEIGHT=WEIGHT + TLTB20*TLTP0^2+TLTB10*TLTP0\r
+       RCALL   LDF_FA                  ; TLTB20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTB10\r
+       FML     F0\r
+       FAD     F2\r
+       FST     F2                      ; TLTZRO\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+       FLD     F3\r
+       FMLE    K10K\r
+       RCALL   FIX_ENTRY\r
+       MOV     D,FA0\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_400\r
+       MOV     F,FA0\r
+\r
+       FLD     F0\r
+       RCALL   FIX_400                 ; TILT X POSITION\r
+       MOV     FA1,F                   ; TILT Y POSITION\r
+       MOV     FA2,E                   ; TILT ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,D                   ; TILT SPAN CORRECTION (10TH GMS/KG)\r
+\r
+       LDI     A,1<<TLTBUB_FLG\r
+       LDI     F,'0'+TLTBUB_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+;SKIP_TILT:\r
+       ;FLD    GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLDE    SPAN\r
+       FML     GMS\r
+       FST     GMS\r
+\r
+; RECALIBRATION\r
+       LDI     F,3                     ; DEGREE\r
+       LDI     ZL,LOW(CAL3*2)          ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; CAL3*GMS^3+CAL2*GMS^2+CAL1*GMS+CAL0\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; AVERAGING ALGORITHM\r
+                                       ; MEASURE DEVIATION\r
+       FSB     LSTGMS                  ; DEV=GMS-LSTGMS\r
+       LDS     A,LSTDEV+2              ; IF SGN(DEV)=SGN(LSTDEV) (SAME DIR)\r
+       EOR     A,FA2\r
+       BRMI    AV0\r
+       FAD     LSTDEV                  ; THEN DEV=DEV+LSTDEV (ACCUMULATE DEV)\r
+AV0:   FST     LSTDEV\r
+       LDI     A,$7F                   ; IF ABS(DEV) < QUANT\r
+       AND     FA2,A\r
+       FST     F0\r
+       FCPF    QUANT\r
+       BRCC    AV1\r
+       FLDF    QUANT                   ; THEN STD=QUANT (STD DEV > QUANT)\r
+       FST     F0                      ; ELSE STD=ABS(DEV) (APPROX STD DEV)\r
+\r
+                                       ; SET AVERAGING PERIOD\r
+AV1:   FLD     COUNT                   ; IF STD/AVESTD > CNT/(CNT+1)\r
+       FML     AVESTD                  ; (STILL TOO NOISY)\r
+       FST     F1\r
+       FLD     COUNT\r
+       FADF    K1\r
+       FST     F2\r
+       FML     F0\r
+       FCP     F1\r
+       BRCS    AV2\r
+       FLD     F2                      ; THEN INCR CNT (EXTEND AVERAGE)\r
+       FST     COUNT\r
+AV2:   FLD     AVESTD                  ; MAXCNT=(AVESTD/DSPRES)*(CONF/HYST)\r
+       FDV     DSPRES\r
+       FMLF    CNFHYS\r
+       FST     F1\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV3                     ; (UNTIL STD DEV < HYST)\r
+       RCALL   LDS_A_STATUS            ; THEN VERY STABLE=1\r
+       SBR     A,1<<VSTBL\r
+       RCALL   STS_STATUS_A\r
+AV3:   FLD     F1                      ; MAXCNT=MAXCNT+30\r
+       FADF    K30\r
+       FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV4\r
+       FLD     F1                      ; THEN CNT=MAXCNT\r
+       FST     COUNT\r
+\r
+                                       ; AVERAGE THE DEVIATION\r
+AV4:   FLD     COUNT                   ; NN=CNT (WEIGHTING FOR AVESTD)\r
+       FST     F1\r
+       FLD     F0                      ; IF STD*3 < AVESTD (VERY QUIET)\r
+       FMLF    K3\r
+       FCP     AVESTD\r
+       BRCC    AV5\r
+       FLD     F1                      ; THEN IF NN>10 THEN NN=10\r
+       FCPF    K10                     ; (ADAPT LOWER QUICKLY)\r
+       BRCS    AV5\r
+       FLDF    K10\r
+       FST     F1                      ; NN\r
+AV5:   FLD     F0                      ; STD\r
+       LDI     F,AVESTD\r
+       RCALL   SMOOTH_FP               ; AVESTD=(STD+AVESTD*(NN-1))/NN\r
+       FLD     COUNT                   ; IF AVESTD < CNT*DSPRES*HYST\r
+       FML     DSPRES                  ;    (NO DISPLAY FLICKER)\r
+       FMLF    HYSCNF\r
+       FCP     AVESTD\r
+       BRCS    AV6\r
+       RCALL   LDS_A_STATUS            ; THEN UNSTABLE=0 (STABLE)\r
+       CBR     A,1<<UNSTBL\r
+       RCALL   STS_STATUS_A\r
+                                       ; AVERAGE THE DATA\r
+AV6:   FLD     GMS\r
+       FST     LSTGMS                  ; READY FOR NEXT CYCLE\r
+       FSB     AVEGMS\r
+       FST     F2                      ; ERRGMS=GMS-AVEGMS\r
+       FMLF    K4\r
+       FST     F1                      ; ERRGMS*4\r
+       RCALL   LDS_A_STATUS            ; NOW SET WEIGHTING FOR AVEGMS\r
+       SBRS    A,VSTBL                 ; IF VERY STABLE\r
+       RJMP    AV7\r
+       FLD     F1                      ; THEN NN=CNT+(ERRGMS*4/DSPRES)^2\r
+       FDV     DSPRES                  ;      (EXCLUDE NOISY DATA)\r
+       FST     F3                      ;       ERRGMS*4/DSPRES\r
+       FML     F3                      ;      (ERRGMS*4/DSPRES)^2\r
+       FAD     COUNT\r
+       RJMP    AV8\r
+AV7:   FLD     COUNT                   ; ELSE NN=CNT (EXCEPT AFTER JUMP)\r
+AV8:   FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     GMS\r
+       LDI     F,AVEGMS\r
+       RCALL   SMOOTH_FP               ; AVEGMS=(GMS+AVEGMS*(NN-1))/NN\r
+       LDI     A,1<<ABSGMS_FLG\r
+       LDI     F,'0'+ABSGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+                                       ; ALLOW INTGMS TO DECAY\r
+       FLD     F2                      ; ERRGMS\r
+       FMLF    K4\r
+       FST     F3                      ; ERRGMS*4\r
+       FML     F3\r
+       FADF    K10\r
+       FST     F1                      ; NN=10+(ERRGMS*4)^2 (TIME CONSTANT)\r
+       FLD     INTGMS                  ; INTGMS=INTGMS-INTGMS/NN (DECAY)\r
+       FDV     F1\r
+       FSB     INTGMS\r
+       FST     INTGMS                  ; ACTUALLY -INTGMS\r
+\r
+                                       ; INTEGRATE ERROR BETWEEN DATA AND AVE\r
+       FLD     DSPRES                  ; MINERR=DSPRES-AVESTD*2\r
+       FSB     AVESTD\r
+       FSB     AVESTD\r
+       FST     F3\r
+       TST     FA2                     ; IF MINERR < 0\r
+       BRPL    AV9\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     F3                      ; THEN MINERR=0\r
+AV9:   FLD     F2                      ; ERRGMS\r
+       BST     FA2,7                   ; SAVE SIGN\r
+       LDI     A,$7F\r
+       AND     FA2,A\r
+       FST     F1                      ; ABS(ERRGMS)\r
+       FCP     F3                      ; IF ABS(ERRGMS) < MINERR\r
+       BRCC    AV10\r
+       FLD     INTGMS                  ; THEN ERRGMS=0 (INTGMS UNCHANGED)\r
+       RJMP    AV12\r
+AV10:  FLD     F1                      ; WIND TO HAVE NO ADVANTAGE OVER GMS<20\r
+       FCPF    K20                     ; IF ABS(ERRGMS) < 20\r
+       BRCC    AV11\r
+       FLDF    K1                      ; THEN ERRGMS=SGN(ERRGMS)\r
+       BLD     FA2,7                   ;      (RESTORE SIGN)\r
+       FST     F2\r
+AV11:  FLDF    K4                      ; INTGMS=INTGMS+ERRGMS*4/STD\r
+       FML     F2\r
+       FDV     F0\r
+       FSB     INTGMS                  ; INTEGRATE THE ERROR\r
+       FST     INTGMS\r
+AV12:                                  ; RESTART AVERAGE IF ERROR SIGNIFICANT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; IF ABS(INTGMS)>64 (JUMP CONDITION)\r
+       FCPF    K64\r
+       BRCS    AV13\r
+       FLDF    K1                      ; THEN CNT=1\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     INTGMS                  ;      INTGMS=0\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<VSTBL              ;      VERY STABLE=0\r
+       SBR     A,1<<UNSTBL             ;      UNSTABLE=1\r
+       RCALL   STS_STATUS_A\r
+\r
+; TO IMPROVE WIND PERFORMANCE I NEED TO VARY THE JUMP THRESHOLD\r
+; HAVING REGARD TO THE LONGER TERM EXCURSIONS ABOUT AVEGMS\r
+\r
+AV13:  FLD     AVEGMS                  ; AUTOZERO ROUTINE\r
+       FSB     ZROGMS\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+       FCPF    KR5                     ; IF ABS(AVEGMS-ZROGMS)<0.5\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<ZROFLG\r
+       BRCC    AZ0\r
+       SBR     A,1<<ZROFLG             ; THEN SET ZROFLG\r
+AZ0:   RCALL   STS_STATUS_A\r
+       SBRS    A,ZROFLG                ; IF NOT SHOWING ZERO\r
+       RJMP    AZ1                     ; THEN SKIP AUTOZERO\r
+       FLD     AVEGMS                  ; ELSE AVERAGE INTO ZERO POINT\r
+       LDI     F,ZROGMS\r
+       LDI     A,17                    ;      IF AVEOK=0 USE N=17 ELSE N=2\r
+       RCALL   SMOOTH\r
+\r
+AZ1:   RCALL   LDS_A_STATUS            ; IF NOT SET ZERO COMMAND\r
+       SBRS    A,TRYZRO\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING\r
+       ;RCALL  LDS_A_STATUS            ; IF UNSTABLE\r
+       SBRC    A,UNSTBL\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING, RETAIN RQ\r
+       FLD     AVEGMS                  ; ELSE IF OUTSIDE RANGE\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ;         ABS\r
+       FCPF    K450 ;K1450 FOR EXTENDED ZERO RANGE - SHIPPED WITH S/N 5637\r
+       BRCC    AZ2                     ;      THEN SKIP ZERO SETTING, CLEAR RQ\r
+       FLD     AVEGMS                  ; ADDED 18DEC00 - ALLOW NEGATIVE AVEGMS\r
+       FST     ZROGMS                  ;      ELSE ZROGMS=AVEGMS\r
+AZ2:   RCALL   LDS_A_STATUS            ; ADDED 24FEB99 - MISSING ALL ALONG?\r
+       CBR     A,1<<TRYZRO\r
+       RCALL   STS_STATUS_A\r
+AZ3:   FLD     ZROGMS\r
+       LDI     A,1<<ZROGMS_FLG\r
+       LDI     F,'0'+ZROGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+; FIND RANGE AND DISPLAY RESOLUTION\r
+; WE ALSO CALCULATE F0=AVEGMS-ZROGMS IN THE PROCESS\r
+       FLD     AVEGMS\r
+       FSB     ZROGMS\r
+       FST     F0\r
+\r
+       LDER    E,RANGES                ; 17MAY01 (LDE->LDER) GET RANGE COUNT\r
+       LDI     ZL,RANGE1*2             ; POINT TO FIRST RANGE BOUNDARY\r
+RNGE:  RCALL   CPE_FA                  ; COMPARE FA WITH BOUNDARY\r
+       BRCS    GOTRNG\r
+       ADIW    ZL,4                    ; POINT TO NEXT RNG\r
+       DEC     E\r
+       BRNE    RNGE\r
+       SBIW    ZL,4                    ; POINT BACK TO PREVIOUS RESOLUTION\r
+GOTRNG:        RCALL   LDE_FA                  ; GET DISPLAY RESOLUTION FOR THIS RANGE\r
+       FST     DSPRES\r
+\r
+; STABILIZE DISPLAYED WEIGHT USING HYSTERESIS\r
+STAB:  FLD     F0\r
+       MOV     F,FA2                   ; SAVE SIGN BIT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     F2\r
+       RCALL   FIX_FA                  ; TRUNCATE TO 3 BYTE INTEGER\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       FST     F0                      ; INTEGER PART\r
+       FLD     F2\r
+       FSB     F0                      ; FA = FRACTIONAL PART\r
+       FCPF    HSTRSL\r
+       BRCS    STB2                    ; FRACTION < HSTRSL, ROUND DOWN\r
+       FCPF    HSTRSH\r
+       BRCC    STB1                    ; FRACTION >= HSTRSH, ROUND UP\r
+\r
+       LDS     A,RANGE                 ; PREVIOUS RANGE, RND, SGN\r
+       MOV     B,A\r
+       EOR     B,F                     ; COMPARE WITH CURRENT SIGN (BIT 7)\r
+       BRMI    STB2                    ; JUST CHANGED SIGN, ROUND DOWN\r
+       ANDI    A,RNG                   ; PREVIOUS RANGE\r
+       CP      A,E                     ; COMPARE WITH CURRENT RANGE\r
+       BRCS    STB1                    ; JUST GONE TO LOWER RANGE, ROUND UP\r
+       BRNE    STB2                    ; JUST GONE TO HIGHER RANGE, ROUND DOWN\r
+\r
+       FLD     DSPGMS                  ; RECALCULATE VALUE FROM LAST TIME\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       LDS     A,RANGE                 ; PREVIOUS STATE\r
+       SBRS    A,RND                   ; IF ROUNDED UP LAST TIME\r
+       RJMP    STB0\r
+       FSBF    K1                      ; THEN DECREMENT\r
+STB0:  FST     F2                      ; CORRESPONDING VALUE FROM LAST TIME\r
+       FCP     F0\r
+       BRCS    STB2                    ; GONE TO HIGHER VALUE, ROUND DOWN\r
+       FLD     F0\r
+       FCP     F2\r
+       BRCS    STB1                    ; GONE TO LOWER VALUE, ROUND UP\r
+       RJMP    STB5                    ; ELSE RETAIN EXISTING DSPGMS\r
+\r
+STB1:  FLD     F0                      ; ROUND UPWARDS\r
+       FADF    K1\r
+       SBR     E,1<<RND                ; SUPERIMPOSE UPWARDS FLAG ON RANGE\r
+       RJMP    STB3\r
+\r
+STB2:  FLD     F0                      ; ROUND DOWNWARDS\r
+       ;CBR    E,1<<RND                ; SUPERIMPOSE DOWNWARDS FLAG ON RANGE\r
+STB3:  BST     F,7                     ; GET CURRENT SIGN\r
+       TST     FA3                     ; IF DSPGMS<>0\r
+       BREQ    STB4\r
+       BLD     FA2,7                   ; THEN RESTORE SIGN\r
+STB4:  BLD     E,SGN                   ; SUPERIMPOSE ON CURRENT RANGE\r
+       STS     RANGE,E                 ; SAVE CURRENT RANGE, RND, SGN\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FMLF KR1\r
+ ; ELSE\r
+       FML     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     DSPGMS\r
+\r
+STB5:  ;LDS    A,MODE                  ; IF NOT WEIGHING MODE\r
+       ;SBRS   A,DSPGMS_FLG\r
+       ;RJMP   DSP9                    ; THEN SKIP OUTPUT IN GRAMS\r
+\r
+       LDI     E,CYC_MIN*2/3\r
+       RCALL   TX_WAIT_EMPTY\r
+       BRCS    FMT\r
+       RJMP    DSP9                    ; NO TX_BUFFER TO SEND ITEM THIS CYCLE\r
+\r
+FMT:   RCALL   LDS_A_STATUS\r
+       SBRS    A,SEND_SN               ; NEED TO SEND S/N MESSAGE ?\r
+       RJMP    SKIP_SN\r
+\r
+       CBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+\r
+       LDFL    D,SN\r
+       RCALL   SNDSTR                  ; SEND S/N MESSAGE\r
+       RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+\r
+SKIP_SN:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBRS    A,SEND_SPAN             ; NEED TO SEND S/N MESSAGE ?\r
+;      RJMP    SKIP_SPAN\r
+;\r
+;      CBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;\r
+;      FLDE    SPAN\r
+;      LDI     A,0                     ; ITEM MUST ALWAYS BE SENT\r
+;      LDI     F,'S'\r
+;      RCALL   SNDFP                   ; SEND SPAN MESSAGE\r
+;      RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+\r
+SKIP_SPAN:\r
+       LDS     A,STARTUP               ; IF STARTUP<CYC_ZERO\r
+       CPI     A,CYC_ZERO\r
+       BRCC    FMT0\r
+       RCALL   SET_TRYZRO              ; THEN SET ZERO\r
+       LDFL    D,FMAT5 ;FMAT3                  ;      SHOW " HELLO"\r
+       RJMP    DSP7\r
+\r
+FMT0:  FLD     DSPGMS                  ; FORMAT OUTPUT DATA PACKET\r
+       LDFL    D,FMAT5                 ; IF SETTING ZERO\r
+       LDS     F,STATUS\r
+       SBRC    F,TRYZRO                ; THEN SHOW "     "\r
+       RJMP    DSP7\r
+       LDS     E,STARTUP               ; USED FOR DELAY BEFORE SHOWING " -LO-"\r
+       TST     FA2                     ; IF DSPGMS>=0\r
+       BRPL    FMT2                    ; THEN CONTINUE\r
+;      FSBF    KR005                   ; ELIMINATE TRUNCATION ERROR (- VALUES)\r
+       INC     E                       ; INC " -LO-" COUNTER (STARTUP)\r
+       CPI     E,CYC_START+8           ; IF STARTUP<CYC_START+8\r
+       BRCC    FMT1\r
+       STS     STARTUP,E\r
+       LDFL    D,FMAT0                 ; THEN SHOW " 0.000"\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;LDI E,CYC_MIN-10     ; TIMEOUT IS WHEN CYC_1 => E\r
+ ;RCALL SNDSTR\r
+ ;LDI A,'0'\r
+ ;RCALL TX_WAIT\r
+ ;RJMP DSP8\r
+ ; %\r
+       RJMP    DSP7\r
+FMT1:  SBR     F,1<<LOWFLG             ; ELSE SET LOWFLG\r
+       STS     STATUS,F\r
+       LDFL    D,FMAT2                 ;      SHOW " -LO-"\r
+       RJMP    DSP7\r
+FMT2:  CBR     F,1<<LOWFLG             ; CLEAR LOWFLG\r
+       CPI     E,CYC_START             ; IF STARTUP>CYC_START  ' CLEAR " -LO-"\r
+       BRCS    FMT3\r
+       LDI     E,CYC_START             ; THEN STARTUP=CYC_START\r
+       STS     STARTUP,E\r
+FMT3:  FCPE    RNGMAX                  ; IF DSPGMS>RNGMAX\r
+       BRCS    FMT4\r
+       SBR     F,1<<OUCHFLG            ; SET OUCHFLG\r
+       STS     STATUS,F\r
+       LDFL    D,FMAT1\r
+       RJMP    DSP7                    ; THEN SHOW "-OUCH"\r
+FMT4:  CBR     F,1<<OUCHFLG            ; CLEAR OUCHFLG\r
+       STS     STATUS,F\r
+\r
+DSP:   FADF    KR005                   ; ELIMINATE TRUNCATION ERROR (+ VALUES)\r
+       RCALL   DIGN                    ; ADJUST EXPONENT FOR 1<N<10\r
+       ADDI    F,2                     ; NUMBER OF DIGITS TO SEND +1\r
+       ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+       LDFL    D,FMAT0                 ; " 0.000"\r
+       ADIW    ZL,2\r
+DSP2:  CP      F,D\r
+       BRCC    DSP4\r
+DSP3:  RCALL   STR1                    ; GET NEXT CHARACTER FROM FMAT0\r
+       BREQ    DSP8                    ; WHEN ALL DONE\r
+       CPI     D,4\r
+       BRNE    DSP2\r
+       DEC     F                       ; TO COMPENSATE FOR EXTRA DEC C\r
+       RJMP    DSP3                    ; DO DECIMAL PT\r
+DSP4:\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;INC F\r
+ ; %\r
+       RCALL   DGT0                    ; CONVERT TO ASCII & SEND FIRST DIGIT\r
+DSP5:  DEC     F\r
+       BREQ    DSP8\r
+       CPI     F,4\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;CPI F,5\r
+ ; %\r
+       BRNE    DSP6\r
+       LDI     A,'.'\r
+       RCALL   TX_WAIT\r
+       DEC     F\r
+DSP6:  RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+       RJMP    DSP5\r
+DSP7:  ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+       RCALL   SNDSTR\r
+DSP8:\r
+; ASCII STABILITY INDICATION FOR TESTING %\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   LDS_A_STATUS\r
+;      ANDI    A,1<<UNSTBL\r
+;      LDI     A,' '\r
+;      BREQ    DSP8X\r
+;      LDI     A,'*'\r
+;DSP8X:        RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0A\r
+;      RCALL   TX_WAIT\r
+; %\r
+       LDFL    D,FMAT6                 ; NOW SEND TRAILER\r
+       RCALL   SNDSTR\r
+DSP9:\r
+\r
+       ; END OF MAIN WEIGHING LOOP\r
+\r
+; WEIGHING ONLY %\r
+       LDS     A,MODE_CYCLE\r
+       CPI     A,$10\r
+       BRLO    MODE_CYCLE_SWAP\r
+       LSL     A\r
+       BRNE    MODE_CYCLE_SWAP\r
+       LDI     A,$10\r
+MODE_CYCLE_SWAP:\r
+       SWAP    A\r
+       STS     MODE_CYCLE,A\r
+\r
+       LDS     A,STARTUP\r
+       INC     A\r
+       CPI     A,CYC_START+1           ; INC UP TO 32\r
+       BRCC    LOOP_END\r
+       STS     STARTUP,A\r
+; %\r
+\r
+; CHARACTERIZE ONLY %\r
+;      LDS     A,STARTUP\r
+;      SBRC    FLAGS,SNDDAT\r
+;      LDI     A,0                     ; RESTART INTEGRATION IF WE SENT DATA\r
+;      INC     A\r
+;      STS     STARTUP,A               ; INCREASE COUNT FOR TRUE AVERAGE\r
+;\r
+;      CBR     FLAGS,1<<SNDDAT         ; SAY WE MUST NOT SEND DATA OUT\r
+;\r
+;      FLD     REF_30MHZ               ; ELAPSED INTEGRATION TIME, 33MHZ TICKS\r
+;      FCPF    K33M                    ; => 1 SECOND ?\r
+;      BRLO    LOOP_END                ; NO, CONTINUE CURRENT INTEGRATION\r
+;\r
+;      FSBF    K33M\r
+;      FST     REF_30MHZ               ; WRAP ELAPSED TIME FOR NEW CYCLE\r
+;\r
+;      SBR     FLAGS,1<<SNDDAT         ; SAY WE MUST SEND DATA OUT\r
+; %\r
+\r
+LOOP_END:\r
+       RJMP    LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FIX_400:\r
+       FMLF    K400                    ; FOR +/- 20 FROM +/- 0.05\r
+       RJMP    FIX_ENTRY\r
+FIX_10:\r
+       FMLF    K10                     ; FOR 10TH GRAMS FROM GRAMS\r
+FIX_ENTRY:\r
+       ; THIS WILL CLOBBER D REGISTER,\r
+       ; AND DOES NOT CORRECTLY HANDLE NEGATIVE NUMBERS %\r
+       ;FADF   KR5                     ; FOR ROUNDING\r
+       ; %\r
+       RCALL   FIX_FA\r
+       BRTC    FIX_POSITIVE\r
+       COM     FA0\r
+       COM     FA1\r
+       INC     FA0\r
+       BRNE    FIX_POSITIVE\r
+       INC     FA1\r
+FIX_POSITIVE:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_WAIT_EMPTY:\r
+       LDS     A,TX_COUNT\r
+       CPI     A,1\r
+       BRLO    TX_WAIT_EMPTY_RET\r
+\r
+       CP      CYC_1,E\r
+       BRLO    TX_WAIT_EMPTY\r
+\r
+;      LDS     A,TX_COUNT\r
+;      CPI     A,1\r
+\r
+TX_WAIT_EMPTY_RET:\r
+       RET                             ; CF SET = READY, CF CLEAR = NOT READY\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+POLY:  FST     F0                      ; POLYNOMIAL CALCULATION, FLASH CONST\r
+                                       ; ENTER WITH FA = INDEPENDENT VAR\r
+       RCALL   LDF_FA                  ;            Z <= HIGHEST ORDER COEFF\r
+POLY0: FML     F0\r
+       RCALL   ADDF_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLY0\r
+       RET\r
+\r
+NRMTMP:        FLD     TMPFRQ                  ; NORMALIZE TEMP C3*T^3+C2*T^2+C1*T+C0\r
+       LDI     F,3                     ; DEGREE\r
+       LDIZ    C3                      ; HIGH ORDER COEFFICIENT\r
+;      RJMP    POLYE                   ; RETURN -1=-10 DEG, 0=20 DEG, 1=50 DEG\r
+\r
+POLYE: FST     F0                      ; POLYNOMIAL CALCULATION, EEPROM CONST\r
+       RCALL   LDE_FA                  ; ENTER WITH F0 = INDEPENDENT VARIABLE\r
+POLYE0:        FML     F0                      ;            Z <= HIGHEST ORDER COEFF\r
+       RCALL   ADDE_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLYE0\r
+SMTH0: RET\r
+\r
+SMOOTH:                                        ; EXPONENTIAL SMOOTHING A=N E=>AVERAGE\r
+       TST     A                       ; IF N=0        NOTE: CLOBBERS F0, F1\r
+       BREQ    SMTH0                   ; THEN DO NOTHING\r
+       FST     F0                      ; SAVE CURRENT DATA\r
+       MOV     FA0,A                   ; CONVERT N\r
+       CLR     FA1\r
+       CLR     FA2\r
+       RCALL   LD3_FA                  ; TO FP FORMAT\r
+       FST     F1                      ; AND SAVE\r
+       FLD     F0                      ; RETRIEVE CURRENT DATA\r
+SMOOTH_FP:                             ; ENTRY POINT WITH F1=N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   SUB_FA\r
+       FDV     F1                      ; N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   ADD_FA\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RJMP    STS_FA                  ; AND SAVE\r
+\r
+LIN_TLT:\r
+       RCALL   LDS2_FA                 ; CONVERT 2 BYTE TILT COUNT TO FP\r
+       MOV     F,YL                    ; TEMP SAVE\r
+       FST     F0                      ; TLTL\r
+       MOV     YL,F\r
+       RCALL   LDS2_FA                 ; CONVERT OPPOSING TILT COUNT TO FP\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F1                      ; TLTR\r
+       FML     F1                      ; TLTR^2\r
+       FST     F3\r
+       FLD     F0\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F0                      ; TLTL\r
+       FML     F0                      ; TLTL^2\r
+       FSB     F3                      ; TLTL^2-TLTR^2\r
+       FMLF    TLT2\r
+       FST     F3\r
+       FLD     F1\r
+       FSB     F0                      ; TLTR-TLTL\r
+       FMLF    TLT1\r
+       FSB     F3\r
+       FADF    TLT0\r
+SNDFP2:        RET\r
+\r
+SNDFP:\r
+; WEIGHING ONLY %\r
+       INC     FA3                     ; CHECK FOR NAN\r
+       BRNE    SND0\r
+       DEC     FA3                     ; TO COMPLY WITH IEEE754\r
+SND0:  DEC     FA3\r
+       ROL     FA2                     ; CONVERT TO IEEE754\r
+       ROR     FA3\r
+       ROR     FA2\r
+; %\r
+\r
+       TST     A\r
+       BREQ    SNDFPX                  ; ITEM MUST ALWAYS BE SENT\r
+\r
+SNDFPE:        LDS     B,MODE                  ; SEND DIAGNOSTIC DATA\r
+       AND     A,B                     ; MODE BIT FOR THIS DATA ITEM SET?\r
+; WEIGHING ONLY %\r
+       LDS     B,MODE_CYCLE\r
+       AND     A,B                     ; ROUND ROBIN UP TO THIS DATA ITEM YET?\r
+; %\r
+       BREQ    SNDFP2                  ; DO NOT SEND THIS DATA ITEM THIS CYCLE\r
+\r
+; WEIGHING ONLY %\r
+       LDI     E,0                     ; TIMEOUT IS WHEN CYC_1 => E\r
+       RCALL   TX_WAIT_EMPTY\r
+       BRCC    SNDFP2                  ; NO TX_BUFFER SPACE TO SEND ITEM\r
+; %\r
+\r
+SNDFPX:\r
+; CHARACTERIZE ONLY %\r
+;      SBRS    FLAGS,SNDDAT\r
+;      RET\r
+;      CPI     A,$80\r
+;      LDI     A,$0A\r
+;      BRNE    SEPOK\r
+;      LDI     A,$0D\r
+;SEPOK:        RJMP    SNDEXP\r
+; %\r
+\r
+; WEIGHING ONLY %\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       MOV     A,F                     ; INDICATE WHICH DATA IS BEING SENT\r
+       RCALL   TX_WAIT\r
+;SND_FA:\r
+       LDI     XL,FA                   ; LOAD TX BUFFER\r
+       LDI     D,4\r
+SND1:  LD      A,X+\r
+       RCALL   TX_WAIT                 ; LS BYTE FIRST\r
+       DEC     D\r
+       BRNE    SND1\r
+       RET\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PROCESS_ESC:\r
+       SBRC    FLAGS,ESCM\r
+       RJMP    PROCESS_ESC_M1\r
+\r
+       CPI     A,'#'\r
+       BREQ    PROCESS_ESC_HASH\r
+       CPI     A,'M'\r
+       BREQ    PROCESS_ESC_M0\r
+;      CPI     A,'S'\r
+;      BREQ    PROCESS_ESC_S\r
+       CPI     A,'Z'\r
+       BREQ    PROCESS_ESC_Z\r
+\r
+PROCESS_ESC_DONE:\r
+       CBR     FLAGS,1<<ESC            ; NEED ANOTHER ESC TO GET BACK HERE\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_HASH:\r
+       RCALL   LDS_A_STATUS\r
+       SBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SEND S/N INSTEAD OF WEIGHT OUTPUT\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_M0:\r
+       SBR     FLAGS,1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_M1:\r
+       STS     MODE,A\r
+       CBR     FLAGS,1<<ESC | 1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+;PROCESS_ESC_S:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SEND SPAN INSTEAD OF WEIGHT OUTPUT\r
+;      RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_Z:\r
+       RCALL   SET_TRYZRO              ; SET ZERO\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+WGT_INT:\r
+       IN      SR,SREG\r
+       INC     CYC_0                   ; INCREMENT WEIGHT CYCLE COUNTER\r
+        OUT     SREG,SR\r
+        SBRS    CYC_0,4\r
+       RETI                            ; CYC_0<16\r
+        SBRS    CYC_0,0\r
+       RETI                            ; CYC_0=16\r
+;;     CBI     UCR,UDRIE               ; CYC_0=17 DISABLE UART INTERRUPT\r
+        SBRS    CYC_0,1                        ;          TO REDUCE JITTER FOR TEMP\r
+       RETI                            ;          MEASUREMENT, AND RETURN\r
+\r
+       PUSH    SR                      ; CYC_0=18 DO TEMP AND TILT\r
+       LDI     SR,$10+16-18            ; 17MAY01 NEED MORE TIME FOR FAST XTALS\r
+       ADD     CYC_0,SR                ; CLEAR BIT 4, CARRYING INTO BITS 5-7\r
+       IN      G,PIND\r
+       IN      H,PINC                  ; READ DATA\r
+       SEI                             ; ALLOW RECURSIVE WGT_INT\r
+\r
+;RCALL TOG_B5\r
+       ANDI    G,$F0                   ; ASSEMBLE DATA\r
+       ANDI    H,$0F\r
+       OR      G,H                     ; INTO G\r
+        SUB     G,WT_0                  ; CALC DIFFERENCE FROM LAST CYCLE\r
+        ADD     WT_0,G                  ; AND SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+        PUSH    G                       ; PUT HC590 DIFFERENCE COUNT ON STACK\r
+\r
+       IN      G,ICR1L                 ; READ TIMER1 INPUT CAPTURE REGISTER\r
+       MOV     H,G\r
+       SUB     H,WT_1                  ; AND CALC DIFFERENCE FROM LAST CYCLE\r
+       MOV     WT_1,G                  ; SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       IN      G,ICR1H                 ; NOW HIGH BYTE\r
+       MOV     I,G\r
+       SBC     I,WT_2\r
+       MOV     WT_2,G\r
+\r
+;      USE 11MHZ COUNT TO DETERMINE HOW MANY TIMES HC590 HAS ROLLED OVER\r
+\r
+       MOV     G,H                     ; DIFFERENCE COUNT IN H|I\r
+       MOV     K,I\r
+       CLR     J\r
+       ADD     H,H                     ; H|I * 3 => H|I|J\r
+       ADC     I,I\r
+       ADC     J,J\r
+       ADD     H,G\r
+       ADC     I,K\r
+       CLR     G\r
+       ADC     J,G\r
+\r
+       MOV     G,I\r
+       MOV     K,J\r
+       LSR     K\r
+       ROR     G\r
+\r
+       ; ALLOW +/-128 COUNTS OF ERROR DUE TO XTAL TOLERANCES (-60 TYP)\r
+\r
+       POP     G                       ; RETRIEVE HC590 DIFFERENCE COUNT\r
+       SUB     G,H                     ; CALCULATE AMOUNT TO ADJUST H|I|J\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_COUNT\r
+; MOV A,G\r
+; RCALL TX_CHAR\r
+;SKIP_COUNT:\r
+; POP A\r
+       LDS     K,STARTUP       ; CHANGED 26MAR01 TO ALLOW FOR\r
+       TST     K               ; NEW BATCH OF 11MHZ XTALS\r
+       BREQ    CORRECTION_OK\r
+       CPI     G,-48           ; ASSUME NORMAL CORRECTION > -16\r
+       BRSH    CORRECTION_OK\r
+       CPI     G,16            ; OR            CORRECTION > +5\r
+       BRLO    CORRECTION_OK\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_DOLLAR\r
+; LDI A,'$'\r
+; RCALL TX_CHAR\r
+;SKIP_DOLLAR:\r
+; POP A\r
+       SUB     WT_0,G\r
+       LDI     G,-12                   ; BUT TYPICALLY -12\r
+       ADD     WT_0,G\r
+CORRECTION_OK:\r
+       LDI     K,0\r
+       TST     G\r
+       BRPL    SIGN_EXTEND\r
+       LDI     K,$FF                   ; IF NEG\r
+SIGN_EXTEND:\r
+       ADD     H,G\r
+       ADC     I,K\r
+       ADC     J,K                     ; ADD INTO H|I|J\r
+\r
+       LDS     G,WGTLST                ; TEST DIRECTION OF CHANGE\r
+       CP      H,G                     ; DIFFERENCE NOW IN H|I|J\r
+       LDS     G,WGTLST+1\r
+       CPC     I,G\r
+       LDS     G,WGTLST+2\r
+       CPC     J,G\r
+\r
+       STS     WGTLST,H                ; AND SAVE SAMPLE FOR NEXT CYCLE\r
+       STS     WGTLST+1,I\r
+       STS     WGTLST+2,J\r
+\r
+        CLI                             ; 17MAY01\r
+        LDS     G,TMP_PHASE             ; START TEMPERATURE MEASUREMENT %\r
+        INC     G\r
+TMP0:   RJMP    TMP1\r
+TMP1:   DEC     G                       ; WAIT TO SYNCHRONISE SUBSEQUENT INT0\r
+        BRNE    TMP0\r
+\r
+        SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+        SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+        IN      G,GIMSK                 ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+       SBRC    G,INT0\r
+        RCALL   TMP_INT00               ; THEN WE MUST PROCESS ANYWAY\r
+        CBI     DDRD,2                  ; SET BIT 2 TO INPUT TO START DISCHARGE\r
+       CBI     PORTD,2                 ; AND REMOVE PULLUP\r
+       IN      G,TCNT1L                ; GET STARTING COUNT FROM TIMER1\r
+       STS     DTMP,G\r
+       IN      G,TCNT1H                ; NOW HIGH BYTE\r
+       STS     DTMP+1,G\r
+       SEI\r
+\r
+       MOV     G,CYC_1                 ; CYCLE COUNT, NOT INCLUDING CURRENT\r
+       INC     CYC_1                   ; INCLUDE CURRENT CYCLE\r
+       BRCS    DEC0                    ; NOW LOOK AT CHANGE\r
+       CBR     FLAGS,1<<DIR            ; IF INCREASING\r
+       RJMP    CONT\r
+DEC0:  SBRC    FLAGS,DIR               ; IF DECREASING\r
+       RJMP    DEC1\r
+       SBR     FLAGS,1<<DIR            ;    BUT INCREASING LAST TIME\r
+       RJMP    PEAK                    ; THEN PROCESS PEAK\r
+DEC1:  SBR     FLAGS,1<<DIR\r
+CONT:  CPI     G,CYC_MAX-1\r
+       BRLO    NOPEAK                  ; LIMIT TO CYC_MAX GROUPS OF 16 CYCLES\r
+PEAK:  CPI     G,CYC_MIN-1             ; NEVER DETECT PEAKS CLOSER THAN CYC_MIN\r
+       BRLO    NOPEAK\r
+\r
+       LDI     H,0\r
+       SUBI    G,LOW(-1)\r
+       SBCI    H,HIGH(-1)              ; ALLOW H:G TO INCREMENT UP TO $100\r
+       STS     F2,G                    ; TRANSFER CYCLE COUNT TO FOREGROUND F2\r
+       STS     F2+1,H\r
+\r
+       CLR     CYC_1                   ; INITIALISE CYCLE COUNT\r
+\r
+       LDI     XL,LOW(WGT)             ; TRANSFER DATA TO OUTPUT BUFFER\r
+       CLR     G\r
+\r
+       LDI     YL,LOW(GMS)             ; WGHT DATA\r
+       LDI     H,3\r
+TRANSFER_0:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_0\r
+\r
+       LDI     YL,LOW(F0)              ; TEMP DATA\r
+       LDI     H,3\r
+TRANSFER_1:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_1\r
+\r
+       LDI     YL,LOW(F3)              ; TILT DATA\r
+       LDI     H,8\r
+TRANSFER_2:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_2\r
+\r
+       SBR     FLAGS,1<<NEWDAT         ; FLAG NEW DATA TO FOREGROUND\r
+\r
+NOPEAK:        LDS     G,WGT                   ; DIFFERENCE NOW IN WGTLST, ADD TO WGT\r
+       LDS     H,WGTLST\r
+       ADD     G,H\r
+       STS     WGT,G\r
+       LDS     G,WGT+1\r
+       LDS     H,WGTLST+1\r
+       ADC     G,H\r
+       STS     WGT+1,G\r
+       LDS     G,WGT+2\r
+       LDS     H,WGTLST+2\r
+       ADC     G,H\r
+       STS     WGT+2,G\r
+\r
+       CLI\r
+        LDI     G,$40                   ; 17MAY01 ENABLE TEMPERATURE INTERRUPT\r
+        OUT     GIFR,G                  ; CLEAR PENDING INT0 RESULTING FROM\r
+        OUT     GIMSK,G                 ; ACTIVITY ON PIN, AND ENABLE INT0\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,BOMB              ; TILT MEASUREMENT STILL IN PROGRESS?\r
+       RETI\r
+\r
+       POP     G                       ; YES, TILT SENSOR MUST HAVE FAILED\r
+       POP     G                       ;      SO FIX STACK\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_ASTERISK\r
+; LDI A,'*'\r
+; RCALL TX_CHAR\r
+;SKIP_ASTERISK:\r
+; POP A\r
+       RJMP    ABORT_TLT               ;      AND ABORT TILT MEASUREMENT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+TMP_INT:\r
+       IN      SR,SREG\r
+       RCALL   TMP_INT0\r
+       PUSH    SR\r
+\r
+       CLR     I\r
+       OUT     GIMSK,I                 ; DISABLE INT0 INTERRUPTS\r
+\r
+                                       ; START TILT\r
+       SBR     FLAGS,1<<BOMB           ; BOMB OUT ON 18TH WEIGHT INTERRUPT\r
+       SEI\r
+\r
+       LDI     G,-110                  ; LIMIT TO 50uSEC (FULL PERIOD 20KHZ)\r
+       LDI     H,-55                   ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0:   INC     G                       ; WAIT FOR LOW ON WGT TO SYNCHRONISE\r
+       BREQ    TL2\r
+       SBIC    PINB,0\r
+       RJMP    TL0\r
+TL1:   INC     G                       ; WAIT FOR HIGH ON WGT,\r
+       BREQ    TL2                     ; TO MEASURE TIME TO EDGE\r
+       SBIS    PINB,0\r
+       RJMP    TL1\r
+TL2:   INC     H                       ; WAIT FOR LOW ON WGT,\r
+       BREQ    TL3                     ; TO MEASURE PERIOD/2\r
+       SBIC    PINB,0\r
+       RJMP    TL2\r
+TL3:                                    ; 17MAY01\r
+        SUBI    G,-110+5                ; +5 TO MAKE SURE WE HIT WITH WGT LOW\r
+        SUBI    H,-55                   ; WHICH SAVES A FULL WGT CYCLE IN TIME\r
+                                        ; BUT ALSO NOT TOO CLOSE TO HC590\r
+                                        ; CLOCKING WHICH CAUSES PREMATURE INT0\r
+; OUT UDR,G\r
+; OUT UDR,H\r
+       LDS     I,TMP_PHASE\r
+       SUB     G,H                     ; H = PERIOD/2\r
+       BRLO    PHASE_INCREASE          ; SERVO TOWARDS G = 0\r
+;PHASE_DECREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,1\r
+       BRSH    PHASE_SAVE\r
+       ADD     I,H\r
+       RJMP    PHASE_SAVE\r
+PHASE_INCREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,-1\r
+       CP      I,H\r
+       BRLO    PHASE_SAVE\r
+       SUB     I,H\r
+PHASE_SAVE:\r
+       STS     TMP_PHASE,I\r
+\r
+       LDI     G,132                   ; DESIRED PULSE LENGTH, 60 uSEC\r
+MOD_LOOP:\r
+       SUB     G,H                     ; H = AT LEAST 1 BY ALGORITHM ABOVE\r
+       BRSH    MOD_LOOP\r
+\r
+PULSE_DELAY_0:\r
+       RJMP    PULSE_DELAY_1\r
+PULSE_DELAY_1:\r
+       INC     G\r
+       BRNE    PULSE_DELAY_0           ; DELAY H - (132 MOD H) BEFORE TURN ON\r
+\r
+       SBI     PORTD,3                 ; TURN ON PULSE\r
+\r
+       LDI     G,110*5/3               ; SLIGHTLY LESS THAN PULSE, 50 uSEC\r
+PULSE_DELAY_3:\r
+       DEC     G\r
+       BRNE    PULSE_DELAY_3\r
+\r
+       LDI     G,55                    ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0X:  DEC     G                       ; AND WAIT FOR LOW ON WGT TO ENSURE AT\r
+       BREQ    TOO_LONG                ; LEAST 1/2 CYCLE OF WGT HIGH, TO\r
+       SBIC    PINB,0                  ; PERFORM TILT MEASUREMENT BEFORE NEXT\r
+       RJMP    TL0X                    ; WGT INTERRUPT\r
+TOO_LONG:\r
+\r
+       CBI     PORTD,3                 ; TURN PULSE OFF AGAIN\r
+       MOV     G,CYC_0                 ; WHICH DIRECTION ? (WHILE WAITING)\r
+       IN      H,TCNT1L                ; SAVE STARTING COUNT\r
+       SWAP    G\r
+       LSR     G\r
+       ANDI    G,$03                   ; 2 LOW ORDER BITS INDICATE TILT AXIS\r
+\r
+       LDI     K,TLTL\r
+       BREQ    LEFT                    ; =0\r
+       DEC     G\r
+       LDI     K,TLTR\r
+       BREQ    RIGHT                   ; =1\r
+       DEC     G\r
+       LDI     K,TLTB\r
+       BREQ    BACK                    ; =2\r
+       LDI     K,TLTF\r
+FRONT: SBIS    PINB,2                  ; WAIT FOR EDGE\r
+       RJMP    FRONT\r
+       RJMP    TLT_AD\r
+BACK:  SBIS    PINC,5                  ; WAIT FOR EDGE\r
+       RJMP    BACK\r
+       RJMP    TLT_AD\r
+LEFT:  SBIS    PINC,4                  ; WAIT FOR EDGE\r
+       RJMP    LEFT\r
+       RJMP    TLT_AD\r
+RIGHT: SBIS    PINB,1                  ; WAIT FOR EDGE\r
+       RJMP    RIGHT\r
+       RJMP    TLT_AD                  ; EQUALISE TIME DELAY\r
+TLT_AD:        IN      G,TCNT1L                ; GET ENDING COUNT\r
+       SUB     G,H                     ; CALCULATE INCREASE IN COUNT\r
+        MOV     H,ZL                    ; 17MAY01\r
+        MOV     ZL,K                   ; TEMPORARY SAVE IN CASE OF BOMB OUT\r
+;PUSH G\r
+       LD      I,Z                     ; GET CURRENT ACCUMULATION\r
+       ADD     I,G                     ; ADD NEW READING\r
+       ST      Z+,I                    ; AND SAVE\r
+       LDI     G,0\r
+       LD      I,Z                     ; NOW HIGH BYTE\r
+       ADC     I,G                     ; G=0 FROM ABOVE\r
+       ST      Z+,I\r
+;POP G\r
+;CPI   ZL,TLTF\r
+;BRNE  ABORT_TLT\r
+;PUSH  A\r
+;PUSH  D\r
+;MOV   A,G\r
+;RCALL CONV_TO_HEX\r
+;LDI   A,$20\r
+;RCALL TX_CHAR\r
+;POP   D\r
+;POP   A\r
+\r
+        MOV     ZL,H                    ; 17MAY01\r
+       CLI\r
+\r
+ABORT_TLT:                             ; ENTER HERE WITH INTERRUPTS DISABLED\r
+       CBR     FLAGS,1<<BOMB           ; WE WILL NOT BOMB OUT ON WEIGHT INT\r
+;;     SBI     UCR,UDRIE               ; 17MAY01 ALLOW DATA AFTER TEMP INT0\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+TMP_INT00:\r
+                                       ; 17MAY01 TO PREVENT DATA LOCKUP\r
+;;      SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_HASH\r
+; LDI A,'#'\r
+; RCALL TX_CHAR\r
+;SKIP_HASH:\r
+; POP A\r
+\r
+TMP_INT0:\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET ENDING COUNT\r
+       LDS     I,DTMP                  ; RETRIEVE STARTING COUNT\r
+       SUB     G,I                     ; CALCULATE END-START DIFFERENCE\r
+       IN      H,TCNT1H                ; NOW HIGH BYTE\r
+       LDS     I,DTMP+1\r
+       SBC     H,I                     ; G|H NOW HAS DIFFERENCE COUNT\r
+\r
+       LDS     I,TMP                   ; ACCUMULATE DIFFERENCE COUNT\r
+       ADD     I,G\r
+       STS     TMP,I\r
+       LDS     I,TMP+1\r
+       ADC     I,H\r
+       STS     TMP+1,I\r
+       BRCC    DONE_TMP\r
+       LDS     I,TMP+2                 ; ADJUST HIGH ORDER BYTE IF CARRY\r
+       INC     I\r
+       STS     TMP+2,I\r
+\r
+DONE_TMP:\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SHOW_FA:\r
+;      MOV     A,FA3\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA2\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA1\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA0\r
+;      RCALL   CONV_TO_HEX\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RET\r
+;\r
+;CONV_TO_HEX:                          ; ENTER WITH BYTE IN A\r
+;      MOV     D,A\r
+;      SWAP    A\r
+;      RCALL   NIBL\r
+;      MOV     A,D\r
+;NIBL: ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,':'\r
+;      BRMI    NIBL0\r
+;      SUBI    A,-$07\r
+;NIBL0:\r
+;      RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+RX_WAIT:\r
+       MRX_WAIT                        ; FALLS OUT INTO RX_CHAR\r
+RX_CHAR:\r
+       MRX_CHAR                        ; FOR DIAGS, FALLS OUT INTO TX_WAIT\r
+TX_WAIT:\r
+       MTX_WAIT                        ; FALLS OUT INTO TX_CHAR\r
+TX_CHAR:\r
+       MTX_CHAR                        ; FALLS OUT INTO TX_CHAR_RET\r
+TX_CHAR_RET:\r
+       MTX_CHAR_RET                    ; DOES NOT FALL OUT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY                       ; DOES NOT FALL OUT\r
+\r
+RX_COMPLETE:\r
+       MRX_COMPLETE                    ; DOES NOT FALL OUT\r
+\r
+TX_COMPLETE:\r
+T0_OVERFLOW:\r
+       MTX_COMPLETE                    ; FALLS OUT INTO API_ERROR\r
+API_ERROR:\r
+       MAPI_ERROR                      ; FALLS OUT INTO API_REVERT\r
+API_REVERT:\r
+       MAPI_REVERT                     ; FALLS OUT INTO API_DONE\r
+API_DONE:\r
+       MAPI_DONE                       ; DOES NOT FALL OUT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      FLOATING POINT MATHS\r
+\r
+;      MS BYTE                     LS BYTE\r
+;      seeeeeee emmmmmmm mmmmmmmm mmmmmmmm IEEE754 FORMAT (FLASH/EEPROM)\r
+;      eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm INTERNAL FORMAT (SRAM/REGISTERS)\r
+;      VALUE =+1.mmmmmmm mmmmmmmm mmmmmmmm * 2^eeeeeeee\r
+\r
+;      WHERE:  s = SIGN BIT (OVERLAYING THE IMPLICIT 1 IN INTERNAL FORMAT)\r
+;              e = EXPONENT BITS WITH BIAS OF 127\r
+;              m = MANTISSA BITS\r
+\r
+;      NOTE:   IEEE754 FORMAT USED FOR FLASH/EEPROM CONSTANTS & SERIAL I/O\r
+;              INTERNAL FORMAT USED FOR SRAM ARGUMENTS & FA, FB\r
+;              FLDF & FLDE MACROS CONVERT FROM IEEE754 TO INTERNAL FORMAT\r
+\r
+;      MANTISSA:       $000000 TO $FFFFFF      REPRESENTING 1 =< MANTISSA < 2\r
+;      EXPONENT:       $00 TO $FF              REPRESENTING 2^-126 TO 2^128\r
+;                      $7F                     REPRESENTING 2^0\r
+\r
+;      NOTATION:       F0, F1, F2, F3          FP ARGUMENTS IN SRAM\r
+;                      FA3 FA2 FA1 FA0         FP REGISTER A (PRINCIPAL)\r
+;                      FB3 FB2 FB1 FB0         FP REGISTER B (ARGUMENT)\r
+;                          FC2 FC1 FC0         FP REGISTER C (AUXILIARY)\r
+\r
+;      IN GENERAL:     X IS USED TO INDEX FA, FB, ETC (FP REGISTERS)\r
+;                      Y IS USED TO INDEX F0, F1, ETC (FP SRAM ARGUMENTS)\r
+;                      Z IS USED TO INDEX K0, K1, ETC (FP FLASH/EEPROM CONSTANTS)\r
+\r
+;      REGISTER USAGE: GENERAL PURPOSE REGISTERS A,B,D\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      MISCELLANEOUS SUBROUTINES\r
+\r
+.EQU   BIAS    =$7F                    ; EXPONENT BIAS = 127\r
+\r
+LDS_FA:        LD      FA0,Y+                  ; LOAD FA FROM SRAM ARGUMENT\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+       LD      FA3,Y+\r
+       RET\r
+\r
+LDS_FB:        LD      FB0,Y+                  ; LOAD FB FROM SRAM ARGUMENT\r
+       LD      FB1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FB2,Y+\r
+       LD      FB3,Y+\r
+       RET\r
+\r
+LDF_FA:        LDI     XL,FA                   ; LOAD FA FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FA:        ROL     FA2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FA3\r
+       ROR     FA2\r
+       RET\r
+\r
+LDF_FB:        LDI     XL,FB                   ; LOAD FB FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FB:        ROL     FB2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FB3\r
+       ROR     FB2\r
+       RET\r
+\r
+LDF:   LDI     A,4                     ; LOAD FP REGISTER INDEXED BY XL\r
+LDF0:  LPM                             ; FROM FLASH CONSTANT\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDF0\r
+       RET\r
+\r
+LDE_FB:        LDI     XL,FB                   ; LOAD FB FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FB                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE_FA:        LDI     XL,FA                   ; LOAD FA FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FA                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE:   LDI     A,4\r
+LDE0:\r
+;       RCALL   LDE1                    ; 17MAY01 WAIT FOR WRITE IN PROGRESS\r
+       OUT     EEAR,ZL                 ; SET UP ADDRESS\r
+       SBI     EECR,EERE               ; ASSERT READ STROBE\r
+       IN      R0,EEDR\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDE0\r
+       RET\r
+\r
+;LDE1:  SBIS    EECR,EEWE               ; 17MAY01 IF WRITE IN PROGRESS\r
+;       RET\r
+;       RJMP    LDE1                    ; THEN WAIT\r
+\r
+STS_FA:        ST      Y+,FA0                  ; STORE FA REGISTER TO SRAM ARGUMENT\r
+       ST      Y+,FA1                  ; Y POINTS TO DESTINATION\r
+       ST      Y+,FA2\r
+       ST      Y+,FA3\r
+       RET\r
+\r
+COM_FA:        COM     FA2                     ; ONES COMPLEMENT FA\r
+       COM     FA1\r
+       COM     FA0\r
+       RET\r
+\r
+ROR_FA:        ROR     FA2                     ; ROTATE RIGHT FA,1\r
+       ROR     FA1\r
+       ROR     FA0\r
+       RET\r
+\r
+LSL_FA:        LSL     FA0                     ; SHIFT LEFT FA,1\r
+       ROL     FA1\r
+       ROL     FA2\r
+       RET\r
+\r
+SUB_FB:        SUB     FA0,FB0                 ; FA=FA-FB\r
+       SBC     FA1,FB1\r
+       SBC     FA2,FB2\r
+       RET\r
+\r
+ADD_FB:        ADD     FA0,FB0                 ; FA=FA+FB\r
+       ADC     FA1,FB1\r
+       ADC     FA2,FB2\r
+       RET\r
+\r
+SGN_FA:        BST     FA2,7                   ; SAVE SIGN BIT\r
+       LDI     B,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,B\r
+       RET\r
+\r
+SGNS:  MOV     A,FB2                   ; COMPUTE SIGN OF RESULT\r
+       EOR     A,FA2\r
+       BST     A,7                     ; SAVE FOR LATER\r
+       LDI     A,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,A\r
+       OR      FB2,A\r
+       LDI     A,BIAS                  ; SUBTRACT BIAS\r
+       SUB     FA3,A\r
+       SUB     FB3,A\r
+       RET\r
+\r
+FIX_FA:        LDI     A,23+BIAS               ; TRUNCATE FA AND RETURN INTEGER PART\r
+       SUB     A,FA3\r
+       BRCS    FIX0                    ; IF EXPONENT>=24 THEN RETURN\r
+       CPI     A,24                    ; IF EXPONENT<0\r
+       BRCC    GO_MIN_FA               ; THEN FA=0\r
+       RCALL   SGN_FA                  ; SAVE SIGN & INSERT IMPLICIT BIT\r
+FIX2:  LSR     FA2                     ; SHIFT MANTISSA RIGHT\r
+       ROR     FA1\r
+       ROR     FA0\r
+       DEC     A                       ; (24-EXPONENT) BITS\r
+       BRNE    FIX2\r
+FIX0:  RET\r
+\r
+GO_MIN_FA:\r
+       RJMP    MIN_FA\r
+\r
+; REMOVED TO SAVE FLASH %\r
+;CHSS: LDD     B,Y+2                   ; CHANGE SIGN OF SRAM ARGUMENT\r
+;      LDI     A,$80\r
+;      EOR     B,A                     ; TOGGLE SIGN BIT\r
+;      STD     Y+2,B                   ; AND SAVE\r
+;      RET\r
+; %\r
+\r
+LDS2_FA:LD     FA0,Y+                  ; LOAD FA WITH 2 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       CLR     FA2\r
+       RJMP    LD3_FA\r
+LDS3_FA:LD     FA0,Y+                  ; LOAD FA WITH 3 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+LD3_FA:        CLT                             ; SET SIGN POSITIVE\r
+LD3:   LDI     A,23+BIAS               ; SET EXPONENT AND FALL INTO NORMALIZE\r
+       MOV     FA3,A\r
+\r
+NRM_FA:        MOV     A,FA0                   ; NORMALIZE FA REGISTER\r
+       OR      A,FA1\r
+       OR      A,FA2\r
+       BREQ    NRM3                    ; IF ZERO THEN CLEAR EXPONENT & EXIT\r
+NRM0:  TST     FA2\r
+NRM1:  BRMI    NRM2                    ; IF MANTISSA DENORMALIZED\r
+       DEC     FA3                     ; THEN ADJUST EXPONENT\r
+       BREQ    MIN_FA                  ;      IF UNDERFLOW THEN RETURN MIN\r
+       RCALL   LSL_FA                  ;      ELSE SHIFT MANTISSA LEFT\r
+       RJMP    NRM1\r
+NRM2:  BLD     FA2,7                   ; ELSE OVERLAY WITH SIGN BIT\r
+       RET\r
+NRM3:  CLR     FA3\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+ADD_FA:        RCALL   LDS_FB                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+ADD0:  TST     FB3                     ; IF FB=0\r
+       BREQ    RET0                    ; THEN DO NOTHING\r
+       TST     FA3                     ; IF FA=0\r
+       BREQ    SWP_FA                  ; THEN SWAP FA,FB AND EXIT\r
+       MOV     D,FB2                   ; GET SIGN OF ARGUMENT\r
+       EOR     D,FA2                   ; BIT 7 SET IF SIGNS DIFFERENT\r
+       MOV     A,FA3\r
+       SUB     A,FB3                   ; IF FA EXPONENT < ARG EXPONENT\r
+       BRCC    ADD1\r
+       NEG     A                       ; THEN (EXP DIFF)=-(EXP DIFF)\r
+       RCALL   SWP_FA                  ;      SWAP FA,FB\r
+ADD1:  CPI     A,24                    ; IF EXP DIFFERENCE >= 24\r
+       BRCC    RET0                    ; THEN DO NOTHING\r
+       RCALL   SGN_FA                  ; ELSE SAVE SIGN & INSERT IMPLICIT BIT\r
+       OR      FB2,B                   ;      INSERT IMPLICIT BIT IN FB ALSO\r
+       TST     A\r
+ADD2:  BREQ    ADD3\r
+       LSR     FB2                     ;      SHIFT FB RIGHT TO ALIGN\r
+       ROR     FB1\r
+       ROR     FB0\r
+       DEC     A\r
+       RJMP    ADD2\r
+ADD3:  TST     D                       ; IF SIGNS SAME\r
+       BRMI    ADD5\r
+       RCALL   ADD_FB                  ; THEN FA=FA+FB\r
+       BRCC    ADD4                    ;      IF CARRY\r
+       RCALL   ROR_FA                  ;      THEN RIGHT SHIFT\r
+       INC     FA3                     ;           INC EXPONENT\r
+       BREQ    MAX_FA                  ;           IF OVERFLOW RETURN MAX\r
+ADD4:  BLD     FA2,7                   ;           ELSE OVERLAY WITH SIGN BIT\r
+RET0:  RET\r
+ADD5:  RCALL   SUB_FB                  ; ELSE FA=FA-FB\r
+       BREQ    NRM3                    ;      IF ZERO THEN CLEAR EXP & EXIT\r
+       BRCC    NRM0                    ;      IF CARRY\r
+       RCALL   COM_FA                  ;      THEN FA=-FA\r
+       LDI     A,-1\r
+       SUB     FA0,A\r
+       SBC     FA1,A\r
+       SBC     FA2,A\r
+       BLD     A,7                     ;      TOGGLE SIGN BIT\r
+       COM     A\r
+       BST     A,7\r
+       RJMP    NRM0                    ;      NORMALIZE\r
+\r
+ADDE_FA:RCALL  LDE_FB                  ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+ADDF_FA:RCALL  LDF_FB                  ; ADD FLASH CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+SUB_FA:        RCALL   LDS_FB                  ; SUBTRACT SRAM ARGUMENT FROM FA REG\r
+SUB0:  LDI     A,$80\r
+       EOR     FB2,A                   ; TOGGLE SIGN\r
+       RJMP    ADD0\r
+\r
+SUBE_FA:RCALL  LDE_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+SUBF_FA:RCALL  LDF_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+; VARIOUS SUBROUTINES\r
+\r
+MIN_FA:        CLR     FA3                     ; FA=0\r
+CLR_FA:        CLR     FA2                     ; CLEAR FA\r
+       CLR     FA1\r
+       CLR     FA0\r
+       RET\r
+\r
+SWP_FA:        RCALL   SWP0                    ; SWAP CONTENTS OF FA & FB\r
+       RCALL   SWP1\r
+SWP0:  EOR     FA0,FB0\r
+       EOR     FA1,FB1\r
+       EOR     FA2,FB2\r
+       EOR     FA3,FB3\r
+       RET\r
+SWP1:  EOR     FB0,FA0\r
+       EOR     FB1,FA1\r
+       EOR     FB2,FA2\r
+       EOR     FB3,FA3\r
+       RET\r
+\r
+OUTRNG:        BRPL    MIN_FA                  ; UNDERFLOW\r
+;      RJMP    MAX_FA                  ; OVERFLOW\r
+\r
+;      UNDERFLOW BY A LITTLE:    $80 + $FF =   $7F     POSITIVE\r
+;                               -128 -   1 =  -129\r
+;      UNDERFLOW BY A LOT:       $80 + $80 =   $00     POSITIVE\r
+;                               -128 - 128 =  -256\r
+;      OVERFLOW BY A LITTLE:     $7F + $0F =   $80     NEGATIVE\r
+;                                127 +   1 =   128\r
+;      OVERFLOW BY A LOT:        $7F + $7F =   $FE     NEGATIVE\r
+;                                127 + 127 =   254\r
+\r
+MAX_FA:        CLR     FA3                     ; FA=MAX\r
+       COM     FA3\r
+       MOV     FA2,FA3\r
+       MOV     FA1,FA3\r
+       MOV     FA0,FA3\r
+       BLD     FA2,7                   ; SET SIGN\r
+       RET\r
+\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+MUL_FA:        RCALL   LDS_FB                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+MUL0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MIN_FA                  ; THEN FA=0\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT & REMOVE BIAS\r
+       ADD     FA3,FB3                 ; ADD EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; ELSE RESTORE BIAS\r
+       MOV     FC0,FA0                 ; FC=FA\r
+       MOV     FC1,FA1\r
+       MOV     FC2,FA2\r
+       RCALL   CLR_FA                  ; FA=0\r
+       CLC\r
+       LDI     A,24                    ; LOOP COUNTER\r
+MUL1:  RCALL   ROR_FA                  ; RIGHT SHIFT\r
+       LSR     FC2\r
+       ROR     FC1\r
+       ROR     FC0\r
+       BRCC    MUL2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+MUL2:  DEC     A\r
+       BRNE    MUL1\r
+       BRCC    MUL3                    ; IF CARRY\r
+       RCALL   ROR_FA                  ; THEN NORMALIZE BY 1 BIT\r
+       INC     FA3                     ;      ADJUST EXPONENT\r
+       BREQ    MAX_FA                  ;      IF OVERFLOW RETURN MAX\r
+MUL3:  BLD     FA2,7                   ; ELSE RESTORE SIGN\r
+RET1:  RET\r
+\r
+MULE_FA:RCALL  LDE_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+MULF_FA:RCALL  LDF_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+DIV_FA:        RCALL   LDS_FB                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+DIV0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       BST     FA2,7                   ; GET SIGN OF FA\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MAX_FA                  ; THEN RETURN MAX\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT\r
+       SUB     FA3,FB3                 ; SUBTRACT EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; RESTORE BIAS\r
+       LSR     FA2                     ; DENORMALIZE SO THAT CARRY IS NOT LOST\r
+       ROR     FA1                     ; DURING SUBTRACTION AND SUBSEQUENT ADD\r
+       ROR     FA0\r
+       LSR     FB2\r
+       ROR     FB1\r
+       ROR     FB0\r
+       LDI     A,24                    ; LOOP COUNTER\r
+DIV1:  RCALL   SUB_FB                  ; FA=FA-FB\r
+       BRCC    DIV2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+DIV2:  ROL     FC0                     ; SHIFT CARRY INTO LSB\r
+       ROL     FC1\r
+       ROL     FC2\r
+       RCALL   LSL_FA\r
+       DEC     A\r
+       BRNE    DIV1\r
+       MOV     FA0,FC0                 ; FA=FC\r
+       MOV     FA1,FC1\r
+       MOV     FA2,FC2\r
+       RCALL   COM_FA                  ; SINCE CARRY WAS WRONG SENSE\r
+       RJMP    NRM0                    ; NORMALIZE & RESTORE SIGN\r
+\r
+DIVE_FA:RCALL  LDE_FB                  ; DIVIDE FA REGISTER BY EEPROM CONSTANT\r
+       RJMP    DIV0\r
+\r
+DIVF_FA:RCALL  LDF_FB                  ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       RJMP    DIV0\r
+\r
+CP_FA: RCALL   LDS_FB                  ; COMPARE FA WITH SRAM ARGUMENT\r
+CP0:   MOV     A,FA3                   ; FIRST CHECK FOR SPECIAL ZERO CASE\r
+       OR      A,FB3\r
+       BREQ    CP6                     ; FA=0, FB=0\r
+       MOV     A,FA2                   ; NOW, IF SIGNS DIFFERENT\r
+       EOR     A,FB2\r
+       BRMI    CP3                     ; THEN ANSWER DETERMINED BY THE SIGNS\r
+       BST     FA2,7                   ; ELSE SAVE SIGN FOR LATER\r
+       SUB     FB3,FA3                 ; TEST EXPONENT WITHOUT CORRUPTING FA\r
+       BRCS    CP2                     ; IF EXP FA > EXP FB\r
+       BRNE    CP1                     ; IF EXP FA < EXP FB\r
+       SUB     FB0,FA0                 ; IF EXPS EQUAL, MUST TEST MANTISSA\r
+       SBC     FB1,FA1\r
+       SBC     FB2,FA2\r
+       BRCS    CP2\r
+       BREQ    CP6\r
+CP1:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP4                     ; THEN CLEAR CARRY\r
+       RJMP    CP5                     ; ELSE SET CARRY\r
+CP2:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP5                     ; THEN SET CARRY\r
+       RJMP    CP4                     ; ELSE CLEAR CARRY\r
+CP3:   TST     FA2                     ; CHECK SIGN\r
+       BRMI    CP5\r
+CP4:   CLC                             ; FA > FB\r
+       CLZ\r
+       RET\r
+CP5:   SEC                             ; FA < FB\r
+       CLZ\r
+CP6:   RET                             ; FA = FB\r
+\r
+CPF_FA:        RCALL   LDF_FB                  ; COMPARE FA WITH FLASH CONSTANT\r
+       RJMP    CP0\r
+\r
+CPE_FA:        RCALL   LDE_FB                  ; COMPARE FA WITH EEPROM CONSTANT\r
+       RJMP    CP0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+SNDSTR:        ADIW    ZL,2                    ; OUTPUT STRING FROM FLASH\r
+STR0:  RCALL   STR1                    ; RETRIEVE MESSAGE\r
+       BRNE    STR0\r
+       RET\r
+STR1:  LPM                             ; GET NEXT CHARACTER\r
+       MOV     A,R0\r
+       RCALL   TX_WAIT\r
+       ADIW    ZL,1\r
+       DEC     D\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SNDASC:\r
+;      RCALL   EXP0                    ; SEND IN ASCII FORMAT\r
+;      INC     F                       ; DIGITS TO LEFT OF DECIMAL POINT\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;ASC0: DEC     F\r
+;      BREQ    EXP11\r
+;      RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    ASC0\r
+\r
+; CHARACTERIZE ONLY %\r
+;SNDEXP:\r
+;      PUSH    A                       ; SEPARATOR\r
+;      RCALL   EXP0                    ; SEND EXPONENTIAL FORMAT +N.NNNNNNE+^^\r
+;EXP5: FCPF    KR0001                  ; IF N<.0001\r
+;      BRCC    EXP6\r
+;      FMLF    K100K                   ; THEN N=N*100K\r
+;      SUBI    F,5                     ;      E=E-5\r
+;      RJMP    EXP5\r
+;EXP6: FCPF    K1                      ; IF N<1\r
+;      BRCC    EXP7\r
+;      FMLF    K10                     ; THEN N=N*10\r
+;      SUBI    F,1                     ;      E=E-1\r
+;      RJMP    EXP6\r
+;EXP7: FADF    TLT1                    ; BY MEREST COINCIDENCE CLOSE TO 5.0E-7\r
+;      RCALL   EXP3                    ; IN CASE WE JUMPED UP TO 10.000000\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;      LDI     A,'.'\r
+;      RCALL   TX_WAIT\r
+;      LDI     E,6                     ; 7 SIGNIFICANT DIGITS IN ALL\r
+;EXP8: RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      DEC     E\r
+;      BRNE    EXP8\r
+;      LDI     A,'0'                   ; 2 TRAILING ZEROS FOR COMPATIBILITY\r
+;      RCALL   TX_WAIT                 ; WITH PREVIOUS CHARACTERIZE VERSION\r
+;      LDI     A,'0'\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'E'                   ; NOW FOR THE EXPONENT\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'+'                   ; SEND SIGN\r
+;      TST     F\r
+;      BRPL    EXP9\r
+;      LDI     A,'-'\r
+;      NEG     F                       ; ABS(E)\r
+;EXP9: RCALL   TX_WAIT\r
+;      LDI     A,'0'-1                 ; CONVERT MS DIGIT TO ASCII\r
+;EXP10:        INC     A\r
+;      SUBI    F,10\r
+;      BRPL    EXP10\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'0'+10                ; NOW LS DIGIT\r
+;      ADD     A,F\r
+;      RCALL   TX_WAIT\r
+;      POP     A\r
+;      RCALL   TX_WAIT                 ; SEPARATOR\r
+;EXP11:        FLD     F0                      ; AND RESTORE FA\r
+;      RET\r
+;\r
+;EXP0: FST     F0                      ; ADJUST EXPONENT FOR ABS(N)>1\r
+;      LDI     A,' '                   ; SEND SIGN (SPACE FOR +)\r
+;      TST     FA2\r
+;      BRPL    EXP1\r
+;      LDI     A,'-'\r
+;EXP1: RCALL   TX_WAIT\r
+; %\r
+\r
+DIGN:  LDI     A,$7F\r
+       AND     FA2,A                   ; ABS(N)\r
+       CLR     F                       ; HOLDS ADJUSTED EXPONENT FOR 1<N<10\r
+EXP2:  FCPE    K10K ;FCPF K10K         ; IF N>10K\r
+       BRCS    EXP3\r
+       FMLF    KR0001                  ; THEN N=N/10K\r
+       ADDI    F,4                     ;      E=E+4\r
+       RJMP    EXP2\r
+EXP3:  FCPF    K10                     ; IF N>10\r
+       BRCS    EXP4\r
+       FMLF    KR1                     ; THEN N=N/10\r
+       SUBI    F,-1                    ;      E=E+1\r
+       RJMP    EXP3\r
+;EXP4: RET\r
+\r
+DGTN:  FSB     F1                      ; N=(N-I)*10\r
+       FMLF    K10                     ; REALLY N=(I-N)*10, SIGN UNIMPORTANT\r
+ ;;FMLF K_1 ; LET'S BE SAFE ;; LET'S NOT\r
+DGT0:  FST     F1                      ; N (ADJUSTED)\r
+       RCALL   FIX_FA                  ; I=INT(N)\r
+       MOV     B,FA0                   ; SAVE LS DIGIT\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       LDI     A,'0'\r
+       ADD     A,B                     ; A = LS DIGIT IN ASCII\r
+       RJMP    TX_WAIT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+LDS_A_STATUS:\r
+       LDS     A,STATUS\r
+EXP4:  RET\r
+\r
+SET_TRYZRO:\r
+       LDS     A,STATUS                ; THEN SET ZERO\r
+       SBR     A,1<<TRYZRO\r
+STS_STATUS_A:\r
+       STS     STATUS,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;\r
+;TOG_B4:\r
+;      RET\r
+;      SBIS    PORTB,4\r
+;      RJMP    TOG0\r
+;      CBI     PORTB,4                 ; FOR TESTING ONLY\r
+;      RET\r
+;TOG0: SBI     PORTB,4                 ; FOR TESTING ONLY\r
+\r
+\r
+; FOR LOCKUP TEST\r
+;      POP     G                       ; HIGH BYTE\r
+;      POP     H                       ; LOW BYTE\r
+;      PUSH    H\r
+;      PUSH    G\r
+\r
+;      LDI     H,'2'\r
+;      OUT     UDR,H\r
+;      LDI     G,'1'\r
+;      OUT     UDR,G\r
+\r
+;      MOV     G,H\r
+\r
+;      MOV     I,G\r
+;      SWAP    G\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL0\r
+;      SUBI    G,-$07\r
+;NIBLL0:       OUT     UDR,G\r
+;      MOV     G,I\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL1\r
+;      SUBI    G,-$07\r
+;NIBLL1:       OUT     UDR,G\r
+\r
+;      RET\r
+\r
+;      LDS     A,TEST_BUF              ; TESTING ONLY\r
+;      RCALL   CONV_TO_HEX\r
+\r
+;STACK_TEST:\r
+;      LDI     XL,RAMEND+1             ; STACK TEST\r
+;TST1:\r
+;      LD      A,-X\r
+;      RCALL   CONV_TO_HEX\r
+;      RCALL   SND_BUF\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   SND_BUF\r
+;      CPI     XL,$C8\r
+;      BRNE    TST1\r
+\r
+;STACK_TST:\r
+;      LDI     A,$55\r
+;      LDI     B,50\r
+;      LDI     YL,RAMEND-2\r
+;TST0: ST      -Y,A\r
+;      DEC     B\r
+;      BRNE    TST0\r
+\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4101                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/lcv0.asm b/src/avr/lcv0.asm
new file mode 100644 (file)
index 0000000..e7832a7
--- /dev/null
@@ -0,0 +1,2398 @@
+;      LCV0.ASM\r
+;      WEIGHING MODE\r
+\r
+.INCLUDE "4433DEF.INC" ; FOR AVR ASSEMBLER\r
+;.INCLUDE "4433DEFX.INC" ; FOR NICK ASSEMBLER\r
+.INCLUDE "MACLC.INC"\r
+.INCLUDE "APILC.INC"\r
+;.INCLUDE "TERLC.INC"\r
+\r
+; WE SHOULD CHANGE THE CODE TO USE UCSRA AND UCSRB\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   CR              =$0D\r
+.EQU   LF              =$0A\r
+.EQU   RX_SIZE         =1\r
+.EQU   TX_SIZE         =8              ; LEAVES 10 BYTES FREE\r
+.EQU   API_ADDRESS     =$01            ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   CYC_MAX         =256            ; MAXIMUM WEIGHING CYCLE TIME\r
+.EQU   CYC_MIN         =160            ; MINIMUM WEIGHING CYCLE TIME > 6\r
+                                       ; < 210 ELSE OVERFLOW FOR FREQ < 27KHZ\r
+\r
+.EQU   CYC_ZERO        =16             ; INITIAL ZEROING COUNT\r
+.EQU   CYC_START       =32             ; INITIAL SMOOTHING COUNT\r
+\r
+                                       ; BITS IN RANGE\r
+.EQU   RNG             =$0F            ; RANGE BITS 0-3\r
+.EQU   RND             =6              ; ROUND UP (FOR HYSTERESIS)\r
+.EQU   SGN             =7              ; SIGN (FOR HYSTERESIS)\r
+                                       ; SGN MUST BE BIT 7 FOR EOR INSTRUCTION\r
+\r
+                                       ; BITS IN STATUS\r
+.EQU   OUCHFLG         =0              ; OVERLOAD\r
+.EQU   LOWFLG          =1              ; UNDERLOAD\r
+.EQU   UNSTBL          =2              ; UNSTABLE\r
+.EQU   VSTBL           =3              ; VERY STABLE\r
+.EQU   ZROFLG          =4              ; DISPLAY SHOWS ZERO\r
+.EQU   TRYZRO          =5              ; TRYING TO SET ZERO\r
+.EQU   SEND_SN         =6              ; TRYING TO SEND S/N MESSAGE\r
+.EQU   SEND_SPAN       =7              ; TRYING TO SEND SPAN MESSAGE\r
+\r
+                                       ; BITS IN FLAGS\r
+.EQU   SNDDAT          =0              ; SEND CHARACTERIZE DATA\r
+.EQU   ESC             =1              ; SET AFTER RECEIVING ESC\r
+.EQU   ESCM            =2              ; SET AFTER RECEIVING ESC M\r
+.EQU   BOMB            =3              ; SET DURING TILT MEASUREMENT\r
+.EQU   NEWDAT          =4              ; NEW SCALE DATA AVAILABLE\r
+.EQU   DIR             =5              ; DIRECTION OF CHANGE IN WGT\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+                                       ; BITS IN MODE\r
+.EQU   ABSGMS_FLG      =0              ; ABSOLUTE WEIGHT IN FP FORMAT\r
+.EQU   ZROGMS_FLG      =1              ; ZERO REGISTER IN FP FORMAT\r
+.EQU   TMPDEG_FLG      =2              ; TEMPERATURE (DEGREES) IN FP FORMAT\r
+.EQU   TLTBUB_FLG      =3              ; TILT BUBBLE POSITION IN INT FORMAT\r
+.EQU   WGTFRQ_FLG      =4              ; WEIGHT FREQUENCY IN FP FORMAT\r
+.EQU   TMPFRQ_FLG      =5              ; TEMPERATURE FREQUENCY IN FP FORMAT\r
+.EQU   TLRFRQ_FLG      =6              ; TILT LEFT/RIGHT IN FP FORMAT\r
+.EQU   TFBFRQ_FLG      =7              ; TILT FRONT/BACK IN FP FORMAT\r
+\r
+.DEF   FC0             =R0             ; AUXILLIARY FP ACCUMULATOR\r
+.DEF   FC1             =R1\r
+.DEF   FC2             =R2\r
+\r
+.EQU   FB              =$03\r
+.DEF   FB0             =R3             ; ARGUMENT FP ACCUMULATOR\r
+.DEF   FB1             =R4\r
+.DEF   FB2             =R5\r
+.DEF   FB3             =R6\r
+\r
+.EQU   FA              =$07\r
+.DEF   FA0             =R7             ; PRINCIPAL FP ACCUMULATOR\r
+.DEF   FA1             =R8\r
+.DEF   FA2             =R9\r
+.DEF   FA3             =R10\r
+\r
+.DEF   CYC_0           =R11\r
+.DEF   CYC_1           =R12\r
+\r
+.DEF   WT_0            =R13            ; RUNNING COUNT FOR 16 WEIGHT CYCLES\r
+.DEF   WT_1            =R14            ; TIMER1 INPUT CAPTURE LOW\r
+.DEF   WT_2            =R15            ; TIMER1 INPUT CAPTURE HIGH\r
+\r
+.DEF    A              =R17            ; GLOBAL REGISTERS\r
+.DEF    B              =R18\r
+.DEF   D               =R19\r
+.DEF   E               =R20\r
+.DEF   F               =R21\r
+\r
+.DEF   SR              =R22            ; SECONDARY REGISTER SET\r
+.DEF   G               =R23\r
+.DEF   H               =R24\r
+.DEF   I               =R25\r
+.DEF   J               =R27            ; XH\r
+.DEF   K               =R29            ; YH\r
+\r
+.DEF   FLAGS           =R16            ; MUST BE REGISTER, FOR ATOMIC ACCESS\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+STARTUP:       .BYTE   1               ; SMOOTHING COUNT FOR INITIAL STARTUP\r
+F3:\r
+TLTL_BUF:      .BYTE   2               ; DATA OUTPUT BUFFERS\r
+TLTR_BUF:      .BYTE   2\r
+F4:\r
+TLTF_BUF:      .BYTE   2\r
+TLTB_BUF:      .BYTE   2\r
+WGT:           .BYTE   3               ; ACCUMULATOR FOR 64 GROUPS OF 16\r
+TMP:           .BYTE   3               ; ACCUMULATOR FOR 256 TEMPERATURE\r
+TLTL:          .BYTE   2               ; ACCUMULATOR FOR 64 TILT CYCLES (TLT0)\r
+TLTR:          .BYTE   2\r
+TLTF:          .BYTE   2               ;                                (TLT1)\r
+TLTB:          .BYTE   2\r
+DTMP:          .BYTE   2               ; DIFFERENCE COUNT FOR CURRENT TEMP CYC\r
+WGTLST:                .BYTE   3               ; VALUE OF ADDITION TO WGT ON LAST CYC\r
+TL:            .BYTE   4               ; AVERAGED TLTLR\r
+TF:            .BYTE   4               ; AVERAGED TLTFB\r
+TMPFRQ:                .BYTE   4               ; TEMPERATURE FREQUENCY CYCLES/30MHZ\r
+GMS:           .BYTE   4\r
+LSTGMS:                .BYTE   4\r
+LSTDEV:                .BYTE   4\r
+AVEGMS:                .BYTE   4\r
+AVESTD:                .BYTE   4\r
+INTGMS:                .BYTE   4\r
+COUNT:         .BYTE   4\r
+\r
+F0:            .BYTE   4               ; FLOATING POINT REGISTERS\r
+F1:            .BYTE   4\r
+F2:            .BYTE   4\r
+RANGE:         .BYTE   1\r
+STATUS:                .BYTE   1\r
+MODE:          .BYTE   1\r
+MODE_CYCLE:    .BYTE   1               ; WEIGHING ONLY\r
+;WGTFRQ:       .BYTE   4               ; CHARACTERIZE ONLY\r
+;REF_30MHZ:    .BYTE   4               ; CHARACTERIZE ONLY\r
+TMP_PHASE:     .BYTE   1               ; CAREFUL\r
+DSPGMS:                .BYTE   4\r
+ZROGMS:                .BYTE   4\r
+DSPRES:                .BYTE   4\r
+\r
+API_REMAIN:    .BYTE   1\r
+RX_PTR:                .BYTE   1\r
+RX_COUNT:      .BYTE   1\r
+RX_BUF:                .BYTE   RX_SIZE\r
+TX_PTR:                .BYTE   1\r
+TX_COUNT:      .BYTE   1\r
+TX_BUF:                .BYTE   TX_SIZE         ; CAREFUL - COULD BE CLOBBERED BY STACK\r
+\r
+.ESEG\r
+.ORG   $000\r
+VOID:  .DB     $00,$00                 ; DON'T USE ADDR $000\r
+;EEMODE:       .DB     $00,$00         ; SEND ASCII WEIGHT DATA ONLY\r
+\r
+;SPAN: .DB     $00,$00,$80,$3F         ; 1.0000000E+00 SPAN FOR MELB/DELAWARE\r
+SPAN:  .DB     $1B,$BA,$7F,$3F         ; 0.9989335E+00 SPAN FOR JSY/NLD\r
+;SPAN: .DB     $6C,$21,$80,$3F         ; 1.0010200E+00 SPAN FOR QATAR\r
+\r
+;CAL3: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+;CAL2: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+;CAL1: .DB     $00,$00,$80,$3F         ; 1.0000000E+00\r
+;CAL0: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+\r
+RANGES: .DB    $04,$00                 ;  OIML APO30\r
+RANGE1: .DB    $00,$40,$1C,$45         ;  2500\r
+       .DB     $00,$00,$80,$3F         ;     1\r
+       .DB     $00,$40,$9C,$45         ;  5000\r
+       .DB     $00,$00,$A0,$40         ;     5\r
+       .DB     $00,$40,$1C,$46         ; 10000\r
+       .DB     $00,$00,$20,$41         ;    10\r
+RNGMAX: .DB    $00,$D8,$EA,$46         ; 30060\r
+       .DB     $00,$00,$A0,$41         ;    20\r
+\r
+.CSEG\r
+\r
+       .ORG    0\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT0ADDR\r
+       RJMP    TMP_INT                 ; INT0 HANDLER FOR TEMPERATURE MEASUREMENT\r
+\r
+       .ORG    ICP1ADDR\r
+       RJMP    WGT_INT                 ; TIMER1 CAPTURE HANDLER\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+\r
+.INCLUDE  "PRM.INC"                    ; LOAD CELL CHARACTERIZE PARAMETERS\r
+\r
+TLT2:  .DB     $C7,$75,$41,$AF ;-1.759509E-10  TILT LINEARISATION PARAMETERS\r
+TLT1:  .DB     $25,$7E,$0B,$35 ; 5.196510E-07\r
+TLT0:  .DB     $04,$31,$E3,$39 ; 4.333333E-04\r
+\r
+TICKS: .DB     $AE,$11,$8D,$45 ; 4.514210E+03 = 4096*33.06306M/30M\r
+\r
+HSTRSL:        .DB     $33,$33,$B3,$3E ; 3.500000E-01 = (0.5-0.15)\r
+HSTRSH:        .DB     $66,$66,$26,$3F ; 6.500000E-01 = (0.5+0.15)\r
+\r
+CNFHYS:        .DB     $00,$00,$A0,$41 ; 2.000000E+01 = 3/.15\r
+HYSCNF:        .DB     $CD,$CC,$CC,$3D ; 1.000000E-01 = .3/3\r
+QUANT: .DB     $CD,$CC,$4C,$3E ; 2.000000E-01\r
+\r
+;K_1:  .DB     $00,$00,$80,$BF ;-1.000000E+00\r
+;K_R5: .DB     $00,$00,$00,$BF ;-5.000000E-01\r
+KR0001:        .DB     $17,$B7,$D1,$38 ; 1.000000E-04\r
+KR005: .DB     $0A,$D7,$A3,$3B ; 5.000000E-03 COULD PERHAPS USE KR0001 INSTEAD\r
+KR1:   .DB     $CD,$CC,$CC,$3D ; 1.000000E-01\r
+KR3:   .DB     $9A,$99,$99,$3E ; 3.000000E-01 COULD PERHAPS ELIMINATE THIS\r
+KR5:   .DB     $00,$00,$00,$3F ; 5.000000E-01\r
+;K0:   .DB     $00,$00         ; 0.000000E+00 DON'T MOVE!\r
+K1:    .DB     $00,$00,$80,$3F ; 1.000000E+00           !\r
+;K2:   .DB     $00,$00,$00,$40 ; 2.000000E+00\r
+K3:    .DB     $00,$00,$40,$40 ; 3.000000E+00\r
+K4:    .DB     $00,$00,$80,$40 ; 4.000000E+00\r
+K10:   .DB     $00,$00,$20,$41 ; 1.000000E+01\r
+K16:   .DB     $00,$00,$80,$41 ; 1.600000E+01\r
+K20:   .DB     $00,$00,$A0,$41 ; 2.000000E+01\r
+K30:   .DB     $00,$00,$F0,$41 ; 3.000000E+01\r
+K64:   .DB     $00,$00,$80,$42 ; 6.400000E+01\r
+;K100: .DB     $00,$00,$C8,$42 ; 1.000000E+02\r
+;K256:  .DB     $00,$00,$80,$43 ; 2.560000E+02\r
+K228:   .DB     $39,$8E,$63,$43 ; 2.275556E+02 = 256*16/18 REVISED 17MAY01\r
+K400:  .DB     $00,$00,$C8,$43 ; 4.000000E+02\r
+K450:  .DB     $00,$00,$E1,$43 ; 4.500000E+02 SHOULD PUT ZERO RANGE IN EEPROM\r
+;K1450:        .DB     $00,$40,$B5,$44 ; 1.450000E+03\r
+;K10K: .DB     $00,$40,$1C,$46 ; 1.000000E+04\r
+; CHARACTERIZE ONLY %\r
+;K100K:        .DB     $00,$50,$C3,$47 ; 1.000000E+05\r
+;K30M: .DB     $C0,$E1,$E4,$4B ; 3.000000E+07\r
+;K33M: .DB     $00,$20,$FD,$4B ; 3.317760E+07\r
+; %\r
+\r
+; PUT THIS IN EEPROM:\r
+;SIGNON: .DB   3,0                     ; MUST HAVE EVEN NUMBER OF CHARS\r
+;      .DB     "LC"\r
+;      .DB     $0D,$0A\r
+FMAT0: .DB     6,0\r
+       .DB     " 0.000"\r
+FMAT1: .DB     6,0\r
+       .DB     "-OUCH "\r
+FMAT2: .DB     6,0\r
+       .DB     " -LO- "\r
+;FMAT3:        .DB     6,0\r
+;      .DB     "HELLO "\r
+;FMAT4:        .DB     6,0\r
+;      .DB     "Error "\r
+FMAT5: .DB     6,0\r
+       .DB     "      "\r
+FMAT6: .DB     2,0\r
+       .DB     $0D,$0A\r
+;FMAT6:        .DB     3,0\r
+;      .DB     $20,$0D,$0A,0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       OUTI    SPL,RAMEND              ; INIT STACK POINTER\r
+       OUTI    ACSR,$80                ; POWER DOWN ANALOG COMPARATOR\r
+\r
+;      SBI     DDRB,5                  ; SET SK TO OUTPUT FOR DIAGNOSTICS\r
+\r
+       SBI     DDRD,2                  ; SET BIT 2 TO OUTPUT FOR TEMP SENSOR\r
+       SBI     DDRD,3                  ; SET BIT 3 TO OUTPUT FOR TILT SENSOR\r
+\r
+       OUTI    TCCR1B,1                ; SET COUNTER1 TO CLOCK AT 11.0592 MHZ\r
+                                       ; AND INPUT CAPTURE ON FALLING EDGE\r
+;       OUTI    MCUCR,2                 ; SET INT0 FALLING EDGE FOR TEMP SENSOR\r
+        OUTI    MCUCR,0                 ; SET INT0 LOW SENSE FOR TEMP SENSOR\r
+                                        ; 17MAY01 BOMBS GRACEFULLY AT EACH EXTREME\r
+\r
+       CLR     CYC_0\r
+       CLR     CYC_1\r
+\r
+       CLR     A\r
+       STS     RANGE,A\r
+       RCALL   STS_STATUS_A\r
+       STS     STARTUP,A\r
+       STS     TMP_PHASE,A\r
+\r
+       ;LDER   A,EEMODE\r
+; CHARACTERIZE ONLY %\r
+;      LDI     A,$F0\r
+; %\r
+       STS     MODE,A\r
+\r
+; WEIGHING ONLY %\r
+       LDI     A,1\r
+       STS     MODE_CYCLE,A\r
+; %\r
+\r
+       FLDF    K1\r
+       FST     DSPRES\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     LSTGMS\r
+       FST     LSTDEV\r
+       FST     AVEGMS\r
+       FST     AVESTD\r
+       FST     INTGMS\r
+; CHARACTERIZE ONLY %\r
+;      FST     WGTFRQ                  ; MAY NOT BE NECESSARY\r
+;      FST     REF_30MHZ               ; NECESSARY\r
+; %\r
+\r
+       INIT_API_BUS                    ; SET UART RATE AND CLEAR FLAGS/PTRS\r
+\r
+       IN      A,TIMSK\r
+       ORI     A,8                     ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+       OUT     TIMSK,A\r
+\r
+; WEIGHING ONLY %\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+; %\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;      LDFL    D,SIGNON                ; SEND SIGNON MESSAGE\r
+;      LDI     E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+\r
+LOOP:                                  ; MAIN PROGRAM\r
+       ; IF THE INTERRUPT ALREADY CAME,\r
+       ; THROW AWAY THE DATA AND WAIT FOR A NEW ONE\r
+       CBR     FLAGS,1<<NEWDAT\r
+WAIT_LOOP:\r
+       ; TEST FOR WAITING COMMANDS OR DATA\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    WAIT_LOOPE\r
+       RCALL   RX_CHAR\r
+ ; LOOPBACK TEST\r
+ ;RCALL TX_CHAR\r
+       SBRC    FLAGS,ESC\r
+       RJMP    PROCESS_ESC\r
+       CPI     A,$1B\r
+       BRNE    WAIT_LOOPE\r
+       SBR     FLAGS,1<<ESC\r
+WAIT_LOOPE:\r
+       ; TEST FOR NEW DATA LEFT BY THE INTERRUPT\r
+       SBRS    FLAGS,NEWDAT\r
+       RJMP    WAIT_LOOP\r
+\r
+; WEIGHING ONLY %\r
+       WDR                     ; FEED WATCHDOG\r
+; %\r
+\r
+       ; SAY WE ARE TAKING THE NEW DATA\r
+       ;CBR    FLAGS,1<<NEWDAT\r
+\r
+       ; PROVIDE SQUARE WAVE DIAGNOSTIC ON B5\r
+       ;IN     A,PORTB\r
+       ;LDI    B,1<<5\r
+       ;EOR    A,B\r
+       ;OUT    PORTB,A\r
+\r
+       ;FLD DSPRES                     ; STACK TEST\r
+       ;RCALL SHOW_FA\r
+       ;LDI A,' '\r
+       ;RCALL TX_WAIT\r
+\r
+       FLD2    F2                      ; CONVERT CYCLE COUNT TO FP FORMAT\r
+       FST     F2\r
+       ;LDI    A,1<<WGTFRQ_FLG\r
+       ;LDI    F,'0'+WGTFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+GRAMS: FLD3    GMS                     ; CONVERT WEIGHT COUNT TO FP FORMAT\r
+; CHARACTERIZE ONLY %\r
+;      FST     GMS\r
+;      FAD     REF_30MHZ\r
+;      FST     REF_30MHZ\r
+;      FLD     GMS\r
+; %\r
+       ;LDI    A,1<<TMPFRQ_FLG\r
+       ;LDI    F,'0'+TMPFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FDV     F2\r
+;      FMLF    K256 ;K64\r
+        FMLF    K228                    ; 17MAY01 256*16/18=227.55556\r
+       FST     GMS\r
+       FLDF    TICKS                   ; CONVERSION FACTOR\r
+       FDV     GMS\r
+       FST     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;      30usec\r
+\r
+       FLD3    F0                      ; CONVERT TEMPERATURE COUNT TO FP\r
+       FDV     F2                      ;   (THIS ROUTINE FREES UP F0)\r
+       FMLF    K64 ;K16\r
+       FST     F0\r
+       FLDF    KR3\r
+       FDV     F0                      ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;LDI A,$0D\r
+;RCALL SNDEXP\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TMPFRQ\r
+       RCALL   SMOOTH\r
+;      270usec\r
+\r
+       ;LDS    A,STARTUP\r
+       ;SUBI   A,-$30\r
+       ;RCALL  TX_WAIT\r
+\r
+       FLD     GMS\r
+; CHARACTERIZE ONLY %\r
+;      LDS     A,STARTUP               ; SMOOTHING COUNT\r
+;      LDI     F,WGTFRQ\r
+;      RCALL   SMOOTH\r
+; %\r
+       LDI     A,1<<WGTFRQ_FLG\r
+       LDI     F,'0'+WGTFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+       FLD     TMPFRQ\r
+       LDI     A,1<<TMPFRQ_FLG\r
+       LDI     F,'0'+TMPFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTL_BUF             ; CONVERT TILT TO FP (FREE UP F2, F3)\r
+       RCALL   LIN_TLT                 ; RETURNS CYCLES/30MHZ CLOCK TICK\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TL\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TLRFRQ_FLG\r
+       LDI     F,'0'+TLRFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TLRFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTF_BUF             ; (FREE UP F4)\r
+       RCALL   LIN_TLT\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TF\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TFBFRQ_FLG\r
+       LDI     F,'0'+TFBFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TFBFRQ IF DIAGNOSTIC MODE\r
+;2msec\r
+\r
+       RCALL   NRMTMP                  ; CONVERT TO NORMALIZED TEMP (-1<T<+1)\r
+       FST     F4                      ; AND SAVE NOW THAT F4 AVAILABLE\r
+       LDI     F,6                     ; DEGREE\r
+       LDIZ    A11                     ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; ZERO COMP A11*T^6+A10*T^5+A9*T^4+...\r
+       FST     F1\r
+;      1.1msec\r
+\r
+       FLD     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+       FADE    _WREF                   ; SHIFT ORIGIN TO IMPROVE PRECISION\r
+       LDFL    E,SEGS1                 ; GET SEGMENT COUNT\r
+       LDIZ    SEG1                    ; POINT TO FIRST SEGMENT BOUNDARY\r
+SEGN:  RCALL   CPF_FA                  ; COMPARE FA WITH SEGn\r
+       BRCC    GOTSEG\r
+       ADIW    ZL,12                   ; POINT TO NEXT SEGn\r
+       DEC     E\r
+       BRNE    SEGN\r
+GOTSEG:                                        ; CONVERT TO GMS = D2*W^2 + D1*W + D0\r
+       LDI     F,2                     ; DEGREE\r
+       RCALL   POLY                    ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FAD     F1                      ; GMS=GMS+(THERMAL ZERO CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; NOW, BACK TO GRAMS\r
+       LDFH    F,DEGS                  ; DEGREE\r
+       LDI     E,3                     ; RANGE COUNT\r
+       LDIZ    K500                    ; POINT TO 1ST RANGE BOUNDARY\r
+       RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCC    NEXT_SPNRNG\r
+\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CASE GMS<500\r
+       FDVE    K500\r
+       FML     GMS\r
+       RJMP    THERM_SPAN\r
+\r
+SPNRNG:        RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCS    GOT_SPNRNG\r
+NEXT_SPNRNG:\r
+       ADIW    ZL,32                   ; POINT TO NEXT RANGE BOUNDARY\r
+       DEC     E\r
+       BRNE    SPNRNG\r
+       ADIW    ZL,4\r
+GOT_SPNRNG:\r
+       SBIW    ZL,40                   ; POINT TO PREVIOUS BOUNDARY\r
+       RCALL   SUBE_FA\r
+       FST     F2                      ; F2=GMS-LOWER BOUNDARY\r
+       MOV     E,F                     ; SAVE DEGREE FOR LATER\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FST     F3                      ; CORR.LOW\r
+       MOV     F,E                     ; RESTORE DEGREE\r
+       ADIW    ZL,8                    ; POINT TO NEXT HIGH ORDER COEFFICIENT\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CALCULATE CORR.HIGH\r
+       FSB     F3                      ; CORR.HIGH-CORR.LOW\r
+       SBIW    ZL,8+4+(6*4)            ; ASSUME DEGREE = 6\r
+       RCALL   DIVE_FA\r
+       FML     F2\r
+       FAD     F3                      ; THERMAL SPAN CORRECTION\r
+THERM_SPAN:\r
+       FST     F2\r
+\r
+       ;LDI    A,1<<ZROGMS_FLG\r
+       ;LDI    F,'0'+ZROGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FAD     GMS                     ; GMS=GMS+(THERMAL SPAN CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_10\r
+       MOV     F,FA0\r
+\r
+       FLD     F4                      ; NORMALISED TEMPERATURE\r
+       FMLF    K30\r
+       FADF    K20                     ; CONVERT TO DEGREES CELSIUS\r
+       RCALL   FIX_10                  ; TEMPERATURE (10TH DEGREES)\r
+       MOV     FA2,F                   ; THERMAL ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,E                   ; THERMAL SPAN CORRECTION (10TH GMS)\r
+\r
+       LDI     A,1<<TMPDEG_FLG\r
+       LDI     F,'0'+TMPDEG_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+; TILT CORRECTION\r
+; TLTP1=TLTA31*TLTFR0 + TLTA21*TLTFR1^2+TLTA11*TLTFR1+TLTA01\r
+       LDIZ    TLTA21                  ; TILT FB BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TF\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA31\r
+       FML     TL\r
+       FAD     F0\r
+       FST     F1\r
+\r
+; TLTP0=TLTA30*TLTFR1 + TLTA20*TLTFR0^2+TLTA10*TLTFR0+TLTA00\r
+       LDIZ    TLTA20                  ; TILT LR BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TL\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA30\r
+       FML     TF\r
+       FAD     F0\r
+       FST     F0\r
+\r
+; TLTSPN1 = (TLTC21*TLTP1+TLTC11)*TLTP1\r
+       RCALL   LDF_FA                  ; TLTC21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTC11\r
+       FML     F1\r
+       FST     F3\r
+\r
+; TLTSPN0 = (TLTC20*TLTP0+TLTC10)*TLTP0\r
+       RCALL   LDF_FA                  ; TLTC20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTC10\r
+       FML     F0\r
+\r
+; WEIGHT = WEIGHT + WEIGHT*(TLTSPN0+TLTSPN1)\r
+       FAD     F3\r
+       FST     F3                      ; TLTSPN\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FML     GMS\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+; WEIGHT=WEIGHT + TLTB21*TLTP1^2+TLTB11*TLTP1\r
+       RCALL   LDF_FA                  ; TLTB21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTB11\r
+       FML     F1\r
+       FST     F2\r
+\r
+; WEIGHT=WEIGHT + TLTB20*TLTP0^2+TLTB10*TLTP0\r
+       RCALL   LDF_FA                  ; TLTB20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTB10\r
+       FML     F0\r
+       FAD     F2\r
+       FST     F2                      ; TLTZRO\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+       FLD     F3\r
+       FMLE    K10K\r
+       RCALL   FIX_ENTRY\r
+       MOV     D,FA0\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_400\r
+       MOV     F,FA0\r
+\r
+       FLD     F0\r
+       RCALL   FIX_400                 ; TILT X POSITION\r
+       MOV     FA1,F                   ; TILT Y POSITION\r
+       MOV     FA2,E                   ; TILT ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,D                   ; TILT SPAN CORRECTION (10TH GMS/KG)\r
+\r
+       LDI     A,1<<TLTBUB_FLG\r
+       LDI     F,'0'+TLTBUB_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+;SKIP_TILT:\r
+       ;FLD    GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLDE    SPAN\r
+       FML     GMS\r
+       FST     GMS\r
+\r
+; RECALIBRATION\r
+       LDI     F,3                     ; DEGREE\r
+       LDI     ZL,LOW(CAL3*2)          ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; CAL3*GMS^3+CAL2*GMS^2+CAL1*GMS+CAL0\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; AVERAGING ALGORITHM\r
+                                       ; MEASURE DEVIATION\r
+       FSB     LSTGMS                  ; DEV=GMS-LSTGMS\r
+       LDS     A,LSTDEV+2              ; IF SGN(DEV)=SGN(LSTDEV) (SAME DIR)\r
+       EOR     A,FA2\r
+       BRMI    AV0\r
+       FAD     LSTDEV                  ; THEN DEV=DEV+LSTDEV (ACCUMULATE DEV)\r
+AV0:   FST     LSTDEV\r
+       LDI     A,$7F                   ; IF ABS(DEV) < QUANT\r
+       AND     FA2,A\r
+       FST     F0\r
+       FCPF    QUANT\r
+       BRCC    AV1\r
+       FLDF    QUANT                   ; THEN STD=QUANT (STD DEV > QUANT)\r
+       FST     F0                      ; ELSE STD=ABS(DEV) (APPROX STD DEV)\r
+\r
+                                       ; SET AVERAGING PERIOD\r
+AV1:   FLD     COUNT                   ; IF STD/AVESTD > CNT/(CNT+1)\r
+       FML     AVESTD                  ; (STILL TOO NOISY)\r
+       FST     F1\r
+       FLD     COUNT\r
+       FADF    K1\r
+       FST     F2\r
+       FML     F0\r
+       FCP     F1\r
+       BRCS    AV2\r
+       FLD     F2                      ; THEN INCR CNT (EXTEND AVERAGE)\r
+       FST     COUNT\r
+AV2:   FLD     AVESTD                  ; MAXCNT=(AVESTD/DSPRES)*(CONF/HYST)\r
+       FDV     DSPRES\r
+       FMLF    CNFHYS\r
+       FST     F1\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV3                     ; (UNTIL STD DEV < HYST)\r
+       RCALL   LDS_A_STATUS            ; THEN VERY STABLE=1\r
+       SBR     A,1<<VSTBL\r
+       RCALL   STS_STATUS_A\r
+AV3:   FLD     F1                      ; MAXCNT=MAXCNT+30\r
+       FADF    K30\r
+       FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV4\r
+       FLD     F1                      ; THEN CNT=MAXCNT\r
+       FST     COUNT\r
+\r
+                                       ; AVERAGE THE DEVIATION\r
+AV4:   FLD     COUNT                   ; NN=CNT (WEIGHTING FOR AVESTD)\r
+       FST     F1\r
+       FLD     F0                      ; IF STD*3 < AVESTD (VERY QUIET)\r
+       FMLF    K3\r
+       FCP     AVESTD\r
+       BRCC    AV5\r
+       FLD     F1                      ; THEN IF NN>10 THEN NN=10\r
+       FCPF    K10                     ; (ADAPT LOWER QUICKLY)\r
+       BRCS    AV5\r
+       FLDF    K10\r
+       FST     F1                      ; NN\r
+AV5:   FLD     F0                      ; STD\r
+       LDI     F,AVESTD\r
+       RCALL   SMOOTH_FP               ; AVESTD=(STD+AVESTD*(NN-1))/NN\r
+       FLD     COUNT                   ; IF AVESTD < CNT*DSPRES*HYST\r
+       FML     DSPRES                  ;    (NO DISPLAY FLICKER)\r
+       FMLF    HYSCNF\r
+       FCP     AVESTD\r
+       BRCS    AV6\r
+       RCALL   LDS_A_STATUS            ; THEN UNSTABLE=0 (STABLE)\r
+       CBR     A,1<<UNSTBL\r
+       RCALL   STS_STATUS_A\r
+                                       ; AVERAGE THE DATA\r
+AV6:   FLD     GMS\r
+       FST     LSTGMS                  ; READY FOR NEXT CYCLE\r
+       FSB     AVEGMS\r
+       FST     F2                      ; ERRGMS=GMS-AVEGMS\r
+       FMLF    K4\r
+       FST     F1                      ; ERRGMS*4\r
+       RCALL   LDS_A_STATUS            ; NOW SET WEIGHTING FOR AVEGMS\r
+       SBRS    A,VSTBL                 ; IF VERY STABLE\r
+       RJMP    AV7\r
+       FLD     F1                      ; THEN NN=CNT+(ERRGMS*4/DSPRES)^2\r
+       FDV     DSPRES                  ;      (EXCLUDE NOISY DATA)\r
+       FST     F3                      ;       ERRGMS*4/DSPRES\r
+       FML     F3                      ;      (ERRGMS*4/DSPRES)^2\r
+       FAD     COUNT\r
+       RJMP    AV8\r
+AV7:   FLD     COUNT                   ; ELSE NN=CNT (EXCEPT AFTER JUMP)\r
+AV8:   FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     GMS\r
+       LDI     F,AVEGMS\r
+       RCALL   SMOOTH_FP               ; AVEGMS=(GMS+AVEGMS*(NN-1))/NN\r
+       LDI     A,1<<ABSGMS_FLG\r
+       LDI     F,'0'+ABSGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+                                       ; ALLOW INTGMS TO DECAY\r
+       FLD     F2                      ; ERRGMS\r
+       FMLF    K4\r
+       FST     F3                      ; ERRGMS*4\r
+       FML     F3\r
+       FADF    K10\r
+       FST     F1                      ; NN=10+(ERRGMS*4)^2 (TIME CONSTANT)\r
+       FLD     INTGMS                  ; INTGMS=INTGMS-INTGMS/NN (DECAY)\r
+       FDV     F1\r
+       FSB     INTGMS\r
+       FST     INTGMS                  ; ACTUALLY -INTGMS\r
+\r
+                                       ; INTEGRATE ERROR BETWEEN DATA AND AVE\r
+       FLD     DSPRES                  ; MINERR=DSPRES-AVESTD*2\r
+       FSB     AVESTD\r
+       FSB     AVESTD\r
+       FST     F3\r
+       TST     FA2                     ; IF MINERR < 0\r
+       BRPL    AV9\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     F3                      ; THEN MINERR=0\r
+AV9:   FLD     F2                      ; ERRGMS\r
+       BST     FA2,7                   ; SAVE SIGN\r
+       LDI     A,$7F\r
+       AND     FA2,A\r
+       FST     F1                      ; ABS(ERRGMS)\r
+       FCP     F3                      ; IF ABS(ERRGMS) < MINERR\r
+       BRCC    AV10\r
+       FLD     INTGMS                  ; THEN ERRGMS=0 (INTGMS UNCHANGED)\r
+       RJMP    AV12\r
+AV10:  FLD     F1                      ; WIND TO HAVE NO ADVANTAGE OVER GMS<20\r
+       FCPF    K20                     ; IF ABS(ERRGMS) < 20\r
+       BRCC    AV11\r
+       FLDF    K1                      ; THEN ERRGMS=SGN(ERRGMS)\r
+       BLD     FA2,7                   ;      (RESTORE SIGN)\r
+       FST     F2\r
+AV11:  FLDF    K4                      ; INTGMS=INTGMS+ERRGMS*4/STD\r
+       FML     F2\r
+       FDV     F0\r
+       FSB     INTGMS                  ; INTEGRATE THE ERROR\r
+       FST     INTGMS\r
+AV12:                                  ; RESTART AVERAGE IF ERROR SIGNIFICANT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; IF ABS(INTGMS)>64 (JUMP CONDITION)\r
+       FCPF    K64\r
+       BRCS    AV13\r
+       FLDF    K1                      ; THEN CNT=1\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     INTGMS                  ;      INTGMS=0\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<VSTBL              ;      VERY STABLE=0\r
+       SBR     A,1<<UNSTBL             ;      UNSTABLE=1\r
+       RCALL   STS_STATUS_A\r
+\r
+; TO IMPROVE WIND PERFORMANCE I NEED TO VARY THE JUMP THRESHOLD\r
+; HAVING REGARD TO THE LONGER TERM EXCURSIONS ABOUT AVEGMS\r
+\r
+AV13:  FLD     AVEGMS                  ; AUTOZERO ROUTINE\r
+       FSB     ZROGMS\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+       FCPF    KR5                     ; IF ABS(AVEGMS-ZROGMS)<0.5\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<ZROFLG\r
+       BRCC    AZ0\r
+       SBR     A,1<<ZROFLG             ; THEN SET ZROFLG\r
+AZ0:   RCALL   STS_STATUS_A\r
+       SBRS    A,ZROFLG                ; IF NOT SHOWING ZERO\r
+       RJMP    AZ1                     ; THEN SKIP AUTOZERO\r
+       FLD     AVEGMS                  ; ELSE AVERAGE INTO ZERO POINT\r
+       LDI     F,ZROGMS\r
+       LDI     A,17                    ;      IF AVEOK=0 USE N=17 ELSE N=2\r
+       RCALL   SMOOTH\r
+\r
+AZ1:   RCALL   LDS_A_STATUS            ; IF NOT SET ZERO COMMAND\r
+       SBRS    A,TRYZRO\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING\r
+       ;RCALL  LDS_A_STATUS            ; IF UNSTABLE\r
+       SBRC    A,UNSTBL\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING, RETAIN RQ\r
+       FLD     AVEGMS                  ; ELSE IF OUTSIDE RANGE\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ;         ABS\r
+       FCPF    K450 ;K1450 FOR EXTENDED ZERO RANGE - SHIPPED WITH S/N 5637\r
+       BRCC    AZ2                     ;      THEN SKIP ZERO SETTING, CLEAR RQ\r
+       FLD     AVEGMS                  ; ADDED 18DEC00 - ALLOW NEGATIVE AVEGMS\r
+       FST     ZROGMS                  ;      ELSE ZROGMS=AVEGMS\r
+AZ2:   RCALL   LDS_A_STATUS            ; ADDED 24FEB99 - MISSING ALL ALONG?\r
+       CBR     A,1<<TRYZRO\r
+       RCALL   STS_STATUS_A\r
+AZ3:   FLD     ZROGMS\r
+       LDI     A,1<<ZROGMS_FLG\r
+       LDI     F,'0'+ZROGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+; FIND RANGE AND DISPLAY RESOLUTION\r
+; WE ALSO CALCULATE F0=AVEGMS-ZROGMS IN THE PROCESS\r
+       FLD     AVEGMS\r
+       FSB     ZROGMS\r
+       FST     F0\r
+\r
+       LDER    E,RANGES                ; 17MAY01 (LDE->LDER) GET RANGE COUNT\r
+       LDI     ZL,RANGE1*2             ; POINT TO FIRST RANGE BOUNDARY\r
+RNGE:  RCALL   CPE_FA                  ; COMPARE FA WITH BOUNDARY\r
+       BRCS    GOTRNG\r
+       ADIW    ZL,4                    ; POINT TO NEXT RNG\r
+       DEC     E\r
+       BRNE    RNGE\r
+       SBIW    ZL,4                    ; POINT BACK TO PREVIOUS RESOLUTION\r
+GOTRNG:        RCALL   LDE_FA                  ; GET DISPLAY RESOLUTION FOR THIS RANGE\r
+       FST     DSPRES\r
+\r
+; STABILIZE DISPLAYED WEIGHT USING HYSTERESIS\r
+STAB:  FLD     F0\r
+       MOV     F,FA2                   ; SAVE SIGN BIT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     F2\r
+       RCALL   FIX_FA                  ; TRUNCATE TO 3 BYTE INTEGER\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       FST     F0                      ; INTEGER PART\r
+       FLD     F2\r
+       FSB     F0                      ; FA = FRACTIONAL PART\r
+       FCPF    HSTRSL\r
+       BRCS    STB2                    ; FRACTION < HSTRSL, ROUND DOWN\r
+       FCPF    HSTRSH\r
+       BRCC    STB1                    ; FRACTION >= HSTRSH, ROUND UP\r
+\r
+       LDS     A,RANGE                 ; PREVIOUS RANGE, RND, SGN\r
+       MOV     B,A\r
+       EOR     B,F                     ; COMPARE WITH CURRENT SIGN (BIT 7)\r
+       BRMI    STB2                    ; JUST CHANGED SIGN, ROUND DOWN\r
+       ANDI    A,RNG                   ; PREVIOUS RANGE\r
+       CP      A,E                     ; COMPARE WITH CURRENT RANGE\r
+       BRCS    STB1                    ; JUST GONE TO LOWER RANGE, ROUND UP\r
+       BRNE    STB2                    ; JUST GONE TO HIGHER RANGE, ROUND DOWN\r
+\r
+       FLD     DSPGMS                  ; RECALCULATE VALUE FROM LAST TIME\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       LDS     A,RANGE                 ; PREVIOUS STATE\r
+       SBRS    A,RND                   ; IF ROUNDED UP LAST TIME\r
+       RJMP    STB0\r
+       FSBF    K1                      ; THEN DECREMENT\r
+STB0:  FST     F2                      ; CORRESPONDING VALUE FROM LAST TIME\r
+       FCP     F0\r
+       BRCS    STB2                    ; GONE TO HIGHER VALUE, ROUND DOWN\r
+       FLD     F0\r
+       FCP     F2\r
+       BRCS    STB1                    ; GONE TO LOWER VALUE, ROUND UP\r
+       RJMP    STB5                    ; ELSE RETAIN EXISTING DSPGMS\r
+\r
+STB1:  FLD     F0                      ; ROUND UPWARDS\r
+       FADF    K1\r
+       SBR     E,1<<RND                ; SUPERIMPOSE UPWARDS FLAG ON RANGE\r
+       RJMP    STB3\r
+\r
+STB2:  FLD     F0                      ; ROUND DOWNWARDS\r
+       ;CBR    E,1<<RND                ; SUPERIMPOSE DOWNWARDS FLAG ON RANGE\r
+STB3:  BST     F,7                     ; GET CURRENT SIGN\r
+       TST     FA3                     ; IF DSPGMS<>0\r
+       BREQ    STB4\r
+       BLD     FA2,7                   ; THEN RESTORE SIGN\r
+STB4:  BLD     E,SGN                   ; SUPERIMPOSE ON CURRENT RANGE\r
+       STS     RANGE,E                 ; SAVE CURRENT RANGE, RND, SGN\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FMLF KR1\r
+ ; ELSE\r
+       FML     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     DSPGMS\r
+\r
+STB5:  ;LDS    A,MODE                  ; IF NOT WEIGHING MODE\r
+       ;SBRS   A,DSPGMS_FLG\r
+       ;RJMP   DSP9                    ; THEN SKIP OUTPUT IN GRAMS\r
+\r
+       LDI     E,CYC_MIN*2/3\r
+       RCALL   TX_WAIT_EMPTY\r
+       BRCS    FMT\r
+       RJMP    DSP9                    ; NO TX_BUFFER TO SEND ITEM THIS CYCLE\r
+\r
+FMT:   RCALL   LDS_A_STATUS\r
+       SBRS    A,SEND_SN               ; NEED TO SEND S/N MESSAGE ?\r
+       RJMP    SKIP_SN\r
+\r
+       CBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+\r
+       LDFL    D,SN\r
+       RCALL   SNDSTR                  ; SEND S/N MESSAGE\r
+       RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+\r
+SKIP_SN:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBRS    A,SEND_SPAN             ; NEED TO SEND S/N MESSAGE ?\r
+;      RJMP    SKIP_SPAN\r
+;\r
+;      CBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;\r
+;      FLDE    SPAN\r
+;      LDI     A,0                     ; ITEM MUST ALWAYS BE SENT\r
+;      LDI     F,'S'\r
+;      RCALL   SNDFP                   ; SEND SPAN MESSAGE\r
+;      RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+\r
+SKIP_SPAN:\r
+       LDS     A,STARTUP               ; IF STARTUP<CYC_ZERO\r
+       CPI     A,CYC_ZERO\r
+       BRCC    FMT0\r
+       RCALL   SET_TRYZRO              ; THEN SET ZERO\r
+       LDFL    D,FMAT5 ;FMAT3                  ;      SHOW " HELLO"\r
+       RJMP    DSP7\r
+\r
+FMT0:  FLD     DSPGMS                  ; FORMAT OUTPUT DATA PACKET\r
+       LDFL    D,FMAT5                 ; IF SETTING ZERO\r
+       LDS     F,STATUS\r
+       SBRC    F,TRYZRO                ; THEN SHOW "     "\r
+       RJMP    DSP7\r
+       LDS     E,STARTUP               ; USED FOR DELAY BEFORE SHOWING " -LO-"\r
+       TST     FA2                     ; IF DSPGMS>=0\r
+       BRPL    FMT2                    ; THEN CONTINUE\r
+;      FSBF    KR005                   ; ELIMINATE TRUNCATION ERROR (- VALUES)\r
+       INC     E                       ; INC " -LO-" COUNTER (STARTUP)\r
+       CPI     E,CYC_START+8           ; IF STARTUP<CYC_START+8\r
+       BRCC    FMT1\r
+       STS     STARTUP,E\r
+       LDFL    D,FMAT0                 ; THEN SHOW " 0.000"\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;LDI E,CYC_MIN-10     ; TIMEOUT IS WHEN CYC_1 => E\r
+ ;RCALL SNDSTR\r
+ ;LDI A,'0'\r
+ ;RCALL TX_WAIT\r
+ ;RJMP DSP8\r
+ ; %\r
+       RJMP    DSP7\r
+FMT1:  SBR     F,1<<LOWFLG             ; ELSE SET LOWFLG\r
+       STS     STATUS,F\r
+       LDFL    D,FMAT2                 ;      SHOW " -LO-"\r
+       RJMP    DSP7\r
+FMT2:  CBR     F,1<<LOWFLG             ; CLEAR LOWFLG\r
+       CPI     E,CYC_START             ; IF STARTUP>CYC_START  ' CLEAR " -LO-"\r
+       BRCS    FMT3\r
+       LDI     E,CYC_START             ; THEN STARTUP=CYC_START\r
+       STS     STARTUP,E\r
+FMT3:  FCPE    RNGMAX                  ; IF DSPGMS>RNGMAX\r
+       BRCS    FMT4\r
+       SBR     F,1<<OUCHFLG            ; SET OUCHFLG\r
+       STS     STATUS,F\r
+       LDFL    D,FMAT1\r
+       RJMP    DSP7                    ; THEN SHOW "-OUCH"\r
+FMT4:  CBR     F,1<<OUCHFLG            ; CLEAR OUCHFLG\r
+       STS     STATUS,F\r
+\r
+DSP:   FADF    KR005                   ; ELIMINATE TRUNCATION ERROR (+ VALUES)\r
+       RCALL   DIGN                    ; ADJUST EXPONENT FOR 1<N<10\r
+       ADDI    F,2                     ; NUMBER OF DIGITS TO SEND +1\r
+       ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+       LDFL    D,FMAT0                 ; " 0.000"\r
+       ADIW    ZL,2\r
+DSP2:  CP      F,D\r
+       BRCC    DSP4\r
+DSP3:  RCALL   STR1                    ; GET NEXT CHARACTER FROM FMAT0\r
+       BREQ    DSP8                    ; WHEN ALL DONE\r
+       CPI     D,4\r
+       BRNE    DSP2\r
+       DEC     F                       ; TO COMPENSATE FOR EXTRA DEC C\r
+       RJMP    DSP3                    ; DO DECIMAL PT\r
+DSP4:\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;INC F\r
+ ; %\r
+       RCALL   DGT0                    ; CONVERT TO ASCII & SEND FIRST DIGIT\r
+DSP5:  DEC     F\r
+       BREQ    DSP8\r
+       CPI     F,4\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;CPI F,5\r
+ ; %\r
+       BRNE    DSP6\r
+       LDI     A,'.'\r
+       RCALL   TX_WAIT\r
+       DEC     F\r
+DSP6:  RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+       RJMP    DSP5\r
+DSP7:  ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+       RCALL   SNDSTR\r
+DSP8:\r
+; ASCII STABILITY INDICATION FOR TESTING %\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   LDS_A_STATUS\r
+;      ANDI    A,1<<UNSTBL\r
+;      LDI     A,' '\r
+;      BREQ    DSP8X\r
+;      LDI     A,'*'\r
+;DSP8X:        RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0A\r
+;      RCALL   TX_WAIT\r
+; %\r
+       LDFL    D,FMAT6                 ; NOW SEND TRAILER\r
+       RCALL   SNDSTR\r
+DSP9:\r
+\r
+       ; END OF MAIN WEIGHING LOOP\r
+\r
+; WEIGHING ONLY %\r
+       LDS     A,MODE_CYCLE\r
+       CPI     A,$10\r
+       BRLO    MODE_CYCLE_SWAP\r
+       LSL     A\r
+       BRNE    MODE_CYCLE_SWAP\r
+       LDI     A,$10\r
+MODE_CYCLE_SWAP:\r
+       SWAP    A\r
+       STS     MODE_CYCLE,A\r
+\r
+       LDS     A,STARTUP\r
+       INC     A\r
+       CPI     A,CYC_START+1           ; INC UP TO 32\r
+       BRCC    LOOP_END\r
+       STS     STARTUP,A\r
+; %\r
+\r
+; CHARACTERIZE ONLY %\r
+;      LDS     A,STARTUP\r
+;      SBRC    FLAGS,SNDDAT\r
+;      LDI     A,0                     ; RESTART INTEGRATION IF WE SENT DATA\r
+;      INC     A\r
+;      STS     STARTUP,A               ; INCREASE COUNT FOR TRUE AVERAGE\r
+;\r
+;      CBR     FLAGS,1<<SNDDAT         ; SAY WE MUST NOT SEND DATA OUT\r
+;\r
+;      FLD     REF_30MHZ               ; ELAPSED INTEGRATION TIME, 33MHZ TICKS\r
+;      FCPF    K33M                    ; => 1 SECOND ?\r
+;      BRLO    LOOP_END                ; NO, CONTINUE CURRENT INTEGRATION\r
+;\r
+;      FSBF    K33M\r
+;      FST     REF_30MHZ               ; WRAP ELAPSED TIME FOR NEW CYCLE\r
+;\r
+;      SBR     FLAGS,1<<SNDDAT         ; SAY WE MUST SEND DATA OUT\r
+; %\r
+\r
+LOOP_END:\r
+       RJMP    LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FIX_400:\r
+       FMLF    K400                    ; FOR +/- 20 FROM +/- 0.05\r
+       RJMP    FIX_ENTRY\r
+FIX_10:\r
+       FMLF    K10                     ; FOR 10TH GRAMS FROM GRAMS\r
+FIX_ENTRY:\r
+       ; THIS WILL CLOBBER D REGISTER,\r
+       ; AND DOES NOT CORRECTLY HANDLE NEGATIVE NUMBERS %\r
+       ;FADF   KR5                     ; FOR ROUNDING\r
+       ; %\r
+       RCALL   FIX_FA\r
+       BRTC    FIX_POSITIVE\r
+       COM     FA0\r
+       COM     FA1\r
+       INC     FA0\r
+       BRNE    FIX_POSITIVE\r
+       INC     FA1\r
+FIX_POSITIVE:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_WAIT_EMPTY:\r
+       LDS     A,TX_COUNT\r
+       CPI     A,1\r
+       BRLO    TX_WAIT_EMPTY_RET\r
+\r
+       CP      CYC_1,E\r
+       BRLO    TX_WAIT_EMPTY\r
+\r
+;      LDS     A,TX_COUNT\r
+;      CPI     A,1\r
+\r
+TX_WAIT_EMPTY_RET:\r
+       RET                             ; CF SET = READY, CF CLEAR = NOT READY\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+POLY:  FST     F0                      ; POLYNOMIAL CALCULATION, FLASH CONST\r
+                                       ; ENTER WITH FA = INDEPENDENT VAR\r
+       RCALL   LDF_FA                  ;            Z <= HIGHEST ORDER COEFF\r
+POLY0: FML     F0\r
+       RCALL   ADDF_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLY0\r
+       RET\r
+\r
+NRMTMP:        FLD     TMPFRQ                  ; NORMALIZE TEMP C3*T^3+C2*T^2+C1*T+C0\r
+       LDI     F,3                     ; DEGREE\r
+       LDIZ    C3                      ; HIGH ORDER COEFFICIENT\r
+;      RJMP    POLYE                   ; RETURN -1=-10 DEG, 0=20 DEG, 1=50 DEG\r
+\r
+POLYE: FST     F0                      ; POLYNOMIAL CALCULATION, EEPROM CONST\r
+       RCALL   LDE_FA                  ; ENTER WITH F0 = INDEPENDENT VARIABLE\r
+POLYE0:        FML     F0                      ;            Z <= HIGHEST ORDER COEFF\r
+       RCALL   ADDE_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLYE0\r
+SMTH0: RET\r
+\r
+SMOOTH:                                        ; EXPONENTIAL SMOOTHING A=N E=>AVERAGE\r
+       TST     A                       ; IF N=0        NOTE: CLOBBERS F0, F1\r
+       BREQ    SMTH0                   ; THEN DO NOTHING\r
+       FST     F0                      ; SAVE CURRENT DATA\r
+       MOV     FA0,A                   ; CONVERT N\r
+       CLR     FA1\r
+       CLR     FA2\r
+       RCALL   LD3_FA                  ; TO FP FORMAT\r
+       FST     F1                      ; AND SAVE\r
+       FLD     F0                      ; RETRIEVE CURRENT DATA\r
+SMOOTH_FP:                             ; ENTRY POINT WITH F1=N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   SUB_FA\r
+       FDV     F1                      ; N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   ADD_FA\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RJMP    STS_FA                  ; AND SAVE\r
+\r
+LIN_TLT:\r
+       RCALL   LDS2_FA                 ; CONVERT 2 BYTE TILT COUNT TO FP\r
+       MOV     F,YL                    ; TEMP SAVE\r
+       FST     F0                      ; TLTL\r
+       MOV     YL,F\r
+       RCALL   LDS2_FA                 ; CONVERT OPPOSING TILT COUNT TO FP\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F1                      ; TLTR\r
+       FML     F1                      ; TLTR^2\r
+       FST     F3\r
+       FLD     F0\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F0                      ; TLTL\r
+       FML     F0                      ; TLTL^2\r
+       FSB     F3                      ; TLTL^2-TLTR^2\r
+       FMLF    TLT2\r
+       FST     F3\r
+       FLD     F1\r
+       FSB     F0                      ; TLTR-TLTL\r
+       FMLF    TLT1\r
+       FSB     F3\r
+       FADF    TLT0\r
+SNDFP2:        RET\r
+\r
+SNDFP:\r
+; WEIGHING ONLY %\r
+       INC     FA3                     ; CHECK FOR NAN\r
+       BRNE    SND0\r
+       DEC     FA3                     ; TO COMPLY WITH IEEE754\r
+SND0:  DEC     FA3\r
+       ROL     FA2                     ; CONVERT TO IEEE754\r
+       ROR     FA3\r
+       ROR     FA2\r
+; %\r
+\r
+       TST     A\r
+       BREQ    SNDFPX                  ; ITEM MUST ALWAYS BE SENT\r
+\r
+SNDFPE:        LDS     B,MODE                  ; SEND DIAGNOSTIC DATA\r
+       AND     A,B                     ; MODE BIT FOR THIS DATA ITEM SET?\r
+; WEIGHING ONLY %\r
+       LDS     B,MODE_CYCLE\r
+       AND     A,B                     ; ROUND ROBIN UP TO THIS DATA ITEM YET?\r
+; %\r
+       BREQ    SNDFP2                  ; DO NOT SEND THIS DATA ITEM THIS CYCLE\r
+\r
+; WEIGHING ONLY %\r
+       LDI     E,0                     ; TIMEOUT IS WHEN CYC_1 => E\r
+       RCALL   TX_WAIT_EMPTY\r
+       BRCC    SNDFP2                  ; NO TX_BUFFER SPACE TO SEND ITEM\r
+; %\r
+\r
+SNDFPX:\r
+; CHARACTERIZE ONLY %\r
+;      SBRS    FLAGS,SNDDAT\r
+;      RET\r
+;      CPI     A,$80\r
+;      LDI     A,$0A\r
+;      BRNE    SEPOK\r
+;      LDI     A,$0D\r
+;SEPOK:        RJMP    SNDEXP\r
+; %\r
+\r
+; WEIGHING ONLY %\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       MOV     A,F                     ; INDICATE WHICH DATA IS BEING SENT\r
+       RCALL   TX_WAIT\r
+;SND_FA:\r
+       LDI     XL,FA                   ; LOAD TX BUFFER\r
+       LDI     D,4\r
+SND1:  LD      A,X+\r
+       RCALL   TX_WAIT                 ; LS BYTE FIRST\r
+       DEC     D\r
+       BRNE    SND1\r
+       RET\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PROCESS_ESC:\r
+       SBRC    FLAGS,ESCM\r
+       RJMP    PROCESS_ESC_M1\r
+\r
+       CPI     A,'#'\r
+       BREQ    PROCESS_ESC_HASH\r
+       CPI     A,'M'\r
+       BREQ    PROCESS_ESC_M0\r
+;      CPI     A,'S'\r
+;      BREQ    PROCESS_ESC_S\r
+       CPI     A,'Z'\r
+       BREQ    PROCESS_ESC_Z\r
+\r
+PROCESS_ESC_DONE:\r
+       CBR     FLAGS,1<<ESC            ; NEED ANOTHER ESC TO GET BACK HERE\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_HASH:\r
+       RCALL   LDS_A_STATUS\r
+       SBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SEND S/N INSTEAD OF WEIGHT OUTPUT\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_M0:\r
+       SBR     FLAGS,1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_M1:\r
+       STS     MODE,A\r
+       CBR     FLAGS,1<<ESC | 1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+;PROCESS_ESC_S:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SEND SPAN INSTEAD OF WEIGHT OUTPUT\r
+;      RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_Z:\r
+       RCALL   SET_TRYZRO              ; SET ZERO\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+WGT_INT:\r
+       IN      SR,SREG\r
+       INC     CYC_0                   ; INCREMENT WEIGHT CYCLE COUNTER\r
+        OUT     SREG,SR\r
+        SBRS    CYC_0,4\r
+       RETI                            ; CYC_0<16\r
+        SBRS    CYC_0,0\r
+       RETI                            ; CYC_0=16\r
+;;     CBI     UCR,UDRIE               ; CYC_0=17 DISABLE UART INTERRUPT\r
+        SBRS    CYC_0,1                        ;          TO REDUCE JITTER FOR TEMP\r
+       RETI                            ;          MEASUREMENT, AND RETURN\r
+\r
+       PUSH    SR                      ; CYC_0=18 DO TEMP AND TILT\r
+       LDI     SR,$10+16-18            ; 17MAY01 NEED MORE TIME FOR FAST XTALS\r
+       ADD     CYC_0,SR                ; CLEAR BIT 4, CARRYING INTO BITS 5-7\r
+       IN      G,PIND\r
+       IN      H,PINC                  ; READ DATA\r
+       SEI                             ; ALLOW RECURSIVE WGT_INT\r
+\r
+;RCALL TOG_B5\r
+       ANDI    G,$F0                   ; ASSEMBLE DATA\r
+       ANDI    H,$0F\r
+       OR      G,H                     ; INTO G\r
+        SUB     G,WT_0                  ; CALC DIFFERENCE FROM LAST CYCLE\r
+        ADD     WT_0,G                  ; AND SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+        PUSH    G                       ; PUT HC590 DIFFERENCE COUNT ON STACK\r
+\r
+       IN      G,ICR1L                 ; READ TIMER1 INPUT CAPTURE REGISTER\r
+       MOV     H,G\r
+       SUB     H,WT_1                  ; AND CALC DIFFERENCE FROM LAST CYCLE\r
+       MOV     WT_1,G                  ; SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       IN      G,ICR1H                 ; NOW HIGH BYTE\r
+       MOV     I,G\r
+       SBC     I,WT_2\r
+       MOV     WT_2,G\r
+\r
+;      USE 11MHZ COUNT TO DETERMINE HOW MANY TIMES HC590 HAS ROLLED OVER\r
+\r
+       MOV     G,H                     ; DIFFERENCE COUNT IN H|I\r
+       MOV     K,I\r
+       CLR     J\r
+       ADD     H,H                     ; H|I * 3 => H|I|J\r
+       ADC     I,I\r
+       ADC     J,J\r
+       ADD     H,G\r
+       ADC     I,K\r
+       CLR     G\r
+       ADC     J,G\r
+\r
+       MOV     G,I\r
+       MOV     K,J\r
+       LSR     K\r
+       ROR     G\r
+\r
+       ; ALLOW +/-128 COUNTS OF ERROR DUE TO XTAL TOLERANCES (-60 TYP)\r
+\r
+       POP     G                       ; RETRIEVE HC590 DIFFERENCE COUNT\r
+       SUB     G,H                     ; CALCULATE AMOUNT TO ADJUST H|I|J\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_COUNT\r
+; MOV A,G\r
+; RCALL TX_CHAR\r
+;SKIP_COUNT:\r
+; POP A\r
+       LDS     K,STARTUP       ; CHANGED 26MAR01 TO ALLOW FOR\r
+       TST     K               ; NEW BATCH OF 11MHZ XTALS\r
+       BREQ    CORRECTION_OK\r
+       CPI     G,-48           ; ASSUME NORMAL CORRECTION > -16\r
+       BRSH    CORRECTION_OK\r
+       CPI     G,16            ; OR            CORRECTION > +5\r
+       BRLO    CORRECTION_OK\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_DOLLAR\r
+; LDI A,'$'\r
+; RCALL TX_CHAR\r
+;SKIP_DOLLAR:\r
+; POP A\r
+       SUB     WT_0,G\r
+       LDI     G,-12                   ; BUT TYPICALLY -12\r
+       ADD     WT_0,G\r
+CORRECTION_OK:\r
+       LDI     K,0\r
+       TST     G\r
+       BRPL    SIGN_EXTEND\r
+       LDI     K,$FF                   ; IF NEG\r
+SIGN_EXTEND:\r
+       ADD     H,G\r
+       ADC     I,K\r
+       ADC     J,K                     ; ADD INTO H|I|J\r
+\r
+       LDS     G,WGTLST                ; TEST DIRECTION OF CHANGE\r
+       CP      H,G                     ; DIFFERENCE NOW IN H|I|J\r
+       LDS     G,WGTLST+1\r
+       CPC     I,G\r
+       LDS     G,WGTLST+2\r
+       CPC     J,G\r
+\r
+       STS     WGTLST,H                ; AND SAVE SAMPLE FOR NEXT CYCLE\r
+       STS     WGTLST+1,I\r
+       STS     WGTLST+2,J\r
+\r
+        CLI                             ; 17MAY01\r
+        LDS     G,TMP_PHASE             ; START TEMPERATURE MEASUREMENT %\r
+        INC     G\r
+TMP0:   RJMP    TMP1\r
+TMP1:   DEC     G                       ; WAIT TO SYNCHRONISE SUBSEQUENT INT0\r
+        BRNE    TMP0\r
+\r
+        SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+        SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+        IN      G,GIMSK                 ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+       SBRC    G,INT0\r
+        RCALL   TMP_INT00               ; THEN WE MUST PROCESS ANYWAY\r
+        CBI     DDRD,2                  ; SET BIT 2 TO INPUT TO START DISCHARGE\r
+       CBI     PORTD,2                 ; AND REMOVE PULLUP\r
+       IN      G,TCNT1L                ; GET STARTING COUNT FROM TIMER1\r
+       STS     DTMP,G\r
+       IN      G,TCNT1H                ; NOW HIGH BYTE\r
+       STS     DTMP+1,G\r
+       SEI\r
+\r
+       MOV     G,CYC_1                 ; CYCLE COUNT, NOT INCLUDING CURRENT\r
+       INC     CYC_1                   ; INCLUDE CURRENT CYCLE\r
+       BRCS    DEC0                    ; NOW LOOK AT CHANGE\r
+       CBR     FLAGS,1<<DIR            ; IF INCREASING\r
+       RJMP    CONT\r
+DEC0:  SBRC    FLAGS,DIR               ; IF DECREASING\r
+       RJMP    DEC1\r
+       SBR     FLAGS,1<<DIR            ;    BUT INCREASING LAST TIME\r
+       RJMP    PEAK                    ; THEN PROCESS PEAK\r
+DEC1:  SBR     FLAGS,1<<DIR\r
+CONT:  CPI     G,CYC_MAX-1\r
+       BRLO    NOPEAK                  ; LIMIT TO CYC_MAX GROUPS OF 16 CYCLES\r
+PEAK:  CPI     G,CYC_MIN-1             ; NEVER DETECT PEAKS CLOSER THAN CYC_MIN\r
+       BRLO    NOPEAK\r
+\r
+       LDI     H,0\r
+       SUBI    G,LOW(-1)\r
+       SBCI    H,HIGH(-1)              ; ALLOW H:G TO INCREMENT UP TO $100\r
+       STS     F2,G                    ; TRANSFER CYCLE COUNT TO FOREGROUND F2\r
+       STS     F2+1,H\r
+\r
+       CLR     CYC_1                   ; INITIALISE CYCLE COUNT\r
+\r
+       LDI     XL,LOW(WGT)             ; TRANSFER DATA TO OUTPUT BUFFER\r
+       CLR     G\r
+\r
+       LDI     YL,LOW(GMS)             ; WGHT DATA\r
+       LDI     H,3\r
+TRANSFER_0:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_0\r
+\r
+       LDI     YL,LOW(F0)              ; TEMP DATA\r
+       LDI     H,3\r
+TRANSFER_1:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_1\r
+\r
+       LDI     YL,LOW(F3)              ; TILT DATA\r
+       LDI     H,8\r
+TRANSFER_2:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_2\r
+\r
+       SBR     FLAGS,1<<NEWDAT         ; FLAG NEW DATA TO FOREGROUND\r
+\r
+NOPEAK:        LDS     G,WGT                   ; DIFFERENCE NOW IN WGTLST, ADD TO WGT\r
+       LDS     H,WGTLST\r
+       ADD     G,H\r
+       STS     WGT,G\r
+       LDS     G,WGT+1\r
+       LDS     H,WGTLST+1\r
+       ADC     G,H\r
+       STS     WGT+1,G\r
+       LDS     G,WGT+2\r
+       LDS     H,WGTLST+2\r
+       ADC     G,H\r
+       STS     WGT+2,G\r
+\r
+       CLI\r
+        LDI     G,$40                   ; 17MAY01 ENABLE TEMPERATURE INTERRUPT\r
+        OUT     GIFR,G                  ; CLEAR PENDING INT0 RESULTING FROM\r
+        OUT     GIMSK,G                 ; ACTIVITY ON PIN, AND ENABLE INT0\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,BOMB              ; TILT MEASUREMENT STILL IN PROGRESS?\r
+       RETI\r
+\r
+       POP     G                       ; YES, TILT SENSOR MUST HAVE FAILED\r
+       POP     G                       ;      SO FIX STACK\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_ASTERISK\r
+; LDI A,'*'\r
+; RCALL TX_CHAR\r
+;SKIP_ASTERISK:\r
+; POP A\r
+       RJMP    ABORT_TLT               ;      AND ABORT TILT MEASUREMENT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+TMP_INT:\r
+       IN      SR,SREG\r
+       RCALL   TMP_INT0\r
+       PUSH    SR\r
+\r
+       CLR     I\r
+       OUT     GIMSK,I                 ; DISABLE INT0 INTERRUPTS\r
+\r
+                                       ; START TILT\r
+       SBR     FLAGS,1<<BOMB           ; BOMB OUT ON 18TH WEIGHT INTERRUPT\r
+       SEI\r
+\r
+       LDI     G,-110                  ; LIMIT TO 50uSEC (FULL PERIOD 20KHZ)\r
+       LDI     H,-55                   ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0:   INC     G                       ; WAIT FOR LOW ON WGT TO SYNCHRONISE\r
+       BREQ    TL2\r
+       SBIC    PINB,0\r
+       RJMP    TL0\r
+TL1:   INC     G                       ; WAIT FOR HIGH ON WGT,\r
+       BREQ    TL2                     ; TO MEASURE TIME TO EDGE\r
+       SBIS    PINB,0\r
+       RJMP    TL1\r
+TL2:   INC     H                       ; WAIT FOR LOW ON WGT,\r
+       BREQ    TL3                     ; TO MEASURE PERIOD/2\r
+       SBIC    PINB,0\r
+       RJMP    TL2\r
+TL3:                                    ; 17MAY01\r
+        SUBI    G,-110+5                ; +5 TO MAKE SURE WE HIT WITH WGT LOW\r
+        SUBI    H,-55                   ; WHICH SAVES A FULL WGT CYCLE IN TIME\r
+                                        ; BUT ALSO NOT TOO CLOSE TO HC590\r
+                                        ; CLOCKING WHICH CAUSES PREMATURE INT0\r
+; OUT UDR,G\r
+; OUT UDR,H\r
+       LDS     I,TMP_PHASE\r
+       SUB     G,H                     ; H = PERIOD/2\r
+       BRLO    PHASE_INCREASE          ; SERVO TOWARDS G = 0\r
+;PHASE_DECREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,1\r
+       BRSH    PHASE_SAVE\r
+       ADD     I,H\r
+       RJMP    PHASE_SAVE\r
+PHASE_INCREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,-1\r
+       CP      I,H\r
+       BRLO    PHASE_SAVE\r
+       SUB     I,H\r
+PHASE_SAVE:\r
+       STS     TMP_PHASE,I\r
+\r
+       LDI     G,132                   ; DESIRED PULSE LENGTH, 60 uSEC\r
+MOD_LOOP:\r
+       SUB     G,H                     ; H = AT LEAST 1 BY ALGORITHM ABOVE\r
+       BRSH    MOD_LOOP\r
+\r
+PULSE_DELAY_0:\r
+       RJMP    PULSE_DELAY_1\r
+PULSE_DELAY_1:\r
+       INC     G\r
+       BRNE    PULSE_DELAY_0           ; DELAY H - (132 MOD H) BEFORE TURN ON\r
+\r
+       SBI     PORTD,3                 ; TURN ON PULSE\r
+\r
+       LDI     G,110*5/3               ; SLIGHTLY LESS THAN PULSE, 50 uSEC\r
+PULSE_DELAY_3:\r
+       DEC     G\r
+       BRNE    PULSE_DELAY_3\r
+\r
+       LDI     G,55                    ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0X:  DEC     G                       ; AND WAIT FOR LOW ON WGT TO ENSURE AT\r
+       BREQ    TOO_LONG                ; LEAST 1/2 CYCLE OF WGT HIGH, TO\r
+       SBIC    PINB,0                  ; PERFORM TILT MEASUREMENT BEFORE NEXT\r
+       RJMP    TL0X                    ; WGT INTERRUPT\r
+TOO_LONG:\r
+\r
+       CBI     PORTD,3                 ; TURN PULSE OFF AGAIN\r
+       MOV     G,CYC_0                 ; WHICH DIRECTION ? (WHILE WAITING)\r
+       IN      H,TCNT1L                ; SAVE STARTING COUNT\r
+       SWAP    G\r
+       LSR     G\r
+       ANDI    G,$03                   ; 2 LOW ORDER BITS INDICATE TILT AXIS\r
+\r
+       LDI     K,TLTL\r
+       BREQ    LEFT                    ; =0\r
+       DEC     G\r
+       LDI     K,TLTR\r
+       BREQ    RIGHT                   ; =1\r
+       DEC     G\r
+       LDI     K,TLTB\r
+       BREQ    BACK                    ; =2\r
+       LDI     K,TLTF\r
+FRONT: SBIS    PINB,2                  ; WAIT FOR EDGE\r
+       RJMP    FRONT\r
+       RJMP    TLT_AD\r
+BACK:  SBIS    PINC,5                  ; WAIT FOR EDGE\r
+       RJMP    BACK\r
+       RJMP    TLT_AD\r
+LEFT:  SBIS    PINC,4                  ; WAIT FOR EDGE\r
+       RJMP    LEFT\r
+       RJMP    TLT_AD\r
+RIGHT: SBIS    PINB,1                  ; WAIT FOR EDGE\r
+       RJMP    RIGHT\r
+       RJMP    TLT_AD                  ; EQUALISE TIME DELAY\r
+TLT_AD:        IN      G,TCNT1L                ; GET ENDING COUNT\r
+       SUB     G,H                     ; CALCULATE INCREASE IN COUNT\r
+        MOV     H,ZL                    ; 17MAY01\r
+        MOV     ZL,K                   ; TEMPORARY SAVE IN CASE OF BOMB OUT\r
+;PUSH G\r
+       LD      I,Z                     ; GET CURRENT ACCUMULATION\r
+       ADD     I,G                     ; ADD NEW READING\r
+       ST      Z+,I                    ; AND SAVE\r
+       LDI     G,0\r
+       LD      I,Z                     ; NOW HIGH BYTE\r
+       ADC     I,G                     ; G=0 FROM ABOVE\r
+       ST      Z+,I\r
+;POP G\r
+;CPI   ZL,TLTF\r
+;BRNE  ABORT_TLT\r
+;PUSH  A\r
+;PUSH  D\r
+;MOV   A,G\r
+;RCALL CONV_TO_HEX\r
+;LDI   A,$20\r
+;RCALL TX_CHAR\r
+;POP   D\r
+;POP   A\r
+\r
+        MOV     ZL,H                    ; 17MAY01\r
+       CLI\r
+\r
+ABORT_TLT:                             ; ENTER HERE WITH INTERRUPTS DISABLED\r
+       CBR     FLAGS,1<<BOMB           ; WE WILL NOT BOMB OUT ON WEIGHT INT\r
+;;     SBI     UCR,UDRIE               ; 17MAY01 ALLOW DATA AFTER TEMP INT0\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+TMP_INT00:\r
+                                       ; 17MAY01 TO PREVENT DATA LOCKUP\r
+;;      SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_HASH\r
+; LDI A,'#'\r
+; RCALL TX_CHAR\r
+;SKIP_HASH:\r
+; POP A\r
+\r
+TMP_INT0:\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET ENDING COUNT\r
+       LDS     I,DTMP                  ; RETRIEVE STARTING COUNT\r
+       SUB     G,I                     ; CALCULATE END-START DIFFERENCE\r
+       IN      H,TCNT1H                ; NOW HIGH BYTE\r
+       LDS     I,DTMP+1\r
+       SBC     H,I                     ; G|H NOW HAS DIFFERENCE COUNT\r
+\r
+       LDS     I,TMP                   ; ACCUMULATE DIFFERENCE COUNT\r
+       ADD     I,G\r
+       STS     TMP,I\r
+       LDS     I,TMP+1\r
+       ADC     I,H\r
+       STS     TMP+1,I\r
+       BRCC    DONE_TMP\r
+       LDS     I,TMP+2                 ; ADJUST HIGH ORDER BYTE IF CARRY\r
+       INC     I\r
+       STS     TMP+2,I\r
+\r
+DONE_TMP:\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SHOW_FA:\r
+;      MOV     A,FA3\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA2\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA1\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA0\r
+;      RCALL   CONV_TO_HEX\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RET\r
+;\r
+;CONV_TO_HEX:                          ; ENTER WITH BYTE IN A\r
+;      MOV     D,A\r
+;      SWAP    A\r
+;      RCALL   NIBL\r
+;      MOV     A,D\r
+;NIBL: ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,':'\r
+;      BRMI    NIBL0\r
+;      SUBI    A,-$07\r
+;NIBL0:\r
+;      RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+RX_WAIT:\r
+       MRX_WAIT                        ; FALLS OUT INTO RX_CHAR\r
+RX_CHAR:\r
+       MRX_CHAR                        ; FOR DIAGS, FALLS OUT INTO TX_WAIT\r
+TX_WAIT:\r
+       MTX_WAIT                        ; FALLS OUT INTO TX_CHAR\r
+TX_CHAR:\r
+       MTX_CHAR                        ; FALLS OUT INTO TX_CHAR_RET\r
+TX_CHAR_RET:\r
+       MTX_CHAR_RET                    ; DOES NOT FALL OUT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY                       ; DOES NOT FALL OUT\r
+\r
+RX_COMPLETE:\r
+       MRX_COMPLETE                    ; DOES NOT FALL OUT\r
+\r
+TX_COMPLETE:\r
+T0_OVERFLOW:\r
+       MTX_COMPLETE                    ; FALLS OUT INTO API_ERROR\r
+API_ERROR:\r
+       MAPI_ERROR                      ; FALLS OUT INTO API_REVERT\r
+API_REVERT:\r
+       MAPI_REVERT                     ; FALLS OUT INTO API_DONE\r
+API_DONE:\r
+       MAPI_DONE                       ; DOES NOT FALL OUT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      FLOATING POINT MATHS\r
+\r
+;      MS BYTE                     LS BYTE\r
+;      seeeeeee emmmmmmm mmmmmmmm mmmmmmmm IEEE754 FORMAT (FLASH/EEPROM)\r
+;      eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm INTERNAL FORMAT (SRAM/REGISTERS)\r
+;      VALUE =+1.mmmmmmm mmmmmmmm mmmmmmmm * 2^eeeeeeee\r
+\r
+;      WHERE:  s = SIGN BIT (OVERLAYING THE IMPLICIT 1 IN INTERNAL FORMAT)\r
+;              e = EXPONENT BITS WITH BIAS OF 127\r
+;              m = MANTISSA BITS\r
+\r
+;      NOTE:   IEEE754 FORMAT USED FOR FLASH/EEPROM CONSTANTS & SERIAL I/O\r
+;              INTERNAL FORMAT USED FOR SRAM ARGUMENTS & FA, FB\r
+;              FLDF & FLDE MACROS CONVERT FROM IEEE754 TO INTERNAL FORMAT\r
+\r
+;      MANTISSA:       $000000 TO $FFFFFF      REPRESENTING 1 =< MANTISSA < 2\r
+;      EXPONENT:       $00 TO $FF              REPRESENTING 2^-126 TO 2^128\r
+;                      $7F                     REPRESENTING 2^0\r
+\r
+;      NOTATION:       F0, F1, F2, F3          FP ARGUMENTS IN SRAM\r
+;                      FA3 FA2 FA1 FA0         FP REGISTER A (PRINCIPAL)\r
+;                      FB3 FB2 FB1 FB0         FP REGISTER B (ARGUMENT)\r
+;                          FC2 FC1 FC0         FP REGISTER C (AUXILIARY)\r
+\r
+;      IN GENERAL:     X IS USED TO INDEX FA, FB, ETC (FP REGISTERS)\r
+;                      Y IS USED TO INDEX F0, F1, ETC (FP SRAM ARGUMENTS)\r
+;                      Z IS USED TO INDEX K0, K1, ETC (FP FLASH/EEPROM CONSTANTS)\r
+\r
+;      REGISTER USAGE: GENERAL PURPOSE REGISTERS A,B,D\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      MISCELLANEOUS SUBROUTINES\r
+\r
+.EQU   BIAS    =$7F                    ; EXPONENT BIAS = 127\r
+\r
+LDS_FA:        LD      FA0,Y+                  ; LOAD FA FROM SRAM ARGUMENT\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+       LD      FA3,Y+\r
+       RET\r
+\r
+LDS_FB:        LD      FB0,Y+                  ; LOAD FB FROM SRAM ARGUMENT\r
+       LD      FB1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FB2,Y+\r
+       LD      FB3,Y+\r
+       RET\r
+\r
+LDF_FA:        LDI     XL,FA                   ; LOAD FA FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FA:        ROL     FA2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FA3\r
+       ROR     FA2\r
+       RET\r
+\r
+LDF_FB:        LDI     XL,FB                   ; LOAD FB FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FB:        ROL     FB2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FB3\r
+       ROR     FB2\r
+       RET\r
+\r
+LDF:   LDI     A,4                     ; LOAD FP REGISTER INDEXED BY XL\r
+LDF0:  LPM                             ; FROM FLASH CONSTANT\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDF0\r
+       RET\r
+\r
+LDE_FB:        LDI     XL,FB                   ; LOAD FB FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FB                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE_FA:        LDI     XL,FA                   ; LOAD FA FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FA                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE:   LDI     A,4\r
+LDE0:\r
+;       RCALL   LDE1                    ; 17MAY01 WAIT FOR WRITE IN PROGRESS\r
+       OUT     EEAR,ZL                 ; SET UP ADDRESS\r
+       SBI     EECR,EERE               ; ASSERT READ STROBE\r
+       IN      R0,EEDR\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDE0\r
+       RET\r
+\r
+;LDE1:  SBIS    EECR,EEWE               ; 17MAY01 IF WRITE IN PROGRESS\r
+;       RET\r
+;       RJMP    LDE1                    ; THEN WAIT\r
+\r
+STS_FA:        ST      Y+,FA0                  ; STORE FA REGISTER TO SRAM ARGUMENT\r
+       ST      Y+,FA1                  ; Y POINTS TO DESTINATION\r
+       ST      Y+,FA2\r
+       ST      Y+,FA3\r
+       RET\r
+\r
+COM_FA:        COM     FA2                     ; ONES COMPLEMENT FA\r
+       COM     FA1\r
+       COM     FA0\r
+       RET\r
+\r
+ROR_FA:        ROR     FA2                     ; ROTATE RIGHT FA,1\r
+       ROR     FA1\r
+       ROR     FA0\r
+       RET\r
+\r
+LSL_FA:        LSL     FA0                     ; SHIFT LEFT FA,1\r
+       ROL     FA1\r
+       ROL     FA2\r
+       RET\r
+\r
+SUB_FB:        SUB     FA0,FB0                 ; FA=FA-FB\r
+       SBC     FA1,FB1\r
+       SBC     FA2,FB2\r
+       RET\r
+\r
+ADD_FB:        ADD     FA0,FB0                 ; FA=FA+FB\r
+       ADC     FA1,FB1\r
+       ADC     FA2,FB2\r
+       RET\r
+\r
+SGN_FA:        BST     FA2,7                   ; SAVE SIGN BIT\r
+       LDI     B,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,B\r
+       RET\r
+\r
+SGNS:  MOV     A,FB2                   ; COMPUTE SIGN OF RESULT\r
+       EOR     A,FA2\r
+       BST     A,7                     ; SAVE FOR LATER\r
+       LDI     A,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,A\r
+       OR      FB2,A\r
+       LDI     A,BIAS                  ; SUBTRACT BIAS\r
+       SUB     FA3,A\r
+       SUB     FB3,A\r
+       RET\r
+\r
+FIX_FA:        LDI     A,23+BIAS               ; TRUNCATE FA AND RETURN INTEGER PART\r
+       SUB     A,FA3\r
+       BRCS    FIX0                    ; IF EXPONENT>=24 THEN RETURN\r
+       CPI     A,24                    ; IF EXPONENT<0\r
+       BRCC    GO_MIN_FA               ; THEN FA=0\r
+       RCALL   SGN_FA                  ; SAVE SIGN & INSERT IMPLICIT BIT\r
+FIX2:  LSR     FA2                     ; SHIFT MANTISSA RIGHT\r
+       ROR     FA1\r
+       ROR     FA0\r
+       DEC     A                       ; (24-EXPONENT) BITS\r
+       BRNE    FIX2\r
+FIX0:  RET\r
+\r
+GO_MIN_FA:\r
+       RJMP    MIN_FA\r
+\r
+; REMOVED TO SAVE FLASH %\r
+;CHSS: LDD     B,Y+2                   ; CHANGE SIGN OF SRAM ARGUMENT\r
+;      LDI     A,$80\r
+;      EOR     B,A                     ; TOGGLE SIGN BIT\r
+;      STD     Y+2,B                   ; AND SAVE\r
+;      RET\r
+; %\r
+\r
+LDS2_FA:LD     FA0,Y+                  ; LOAD FA WITH 2 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       CLR     FA2\r
+       RJMP    LD3_FA\r
+LDS3_FA:LD     FA0,Y+                  ; LOAD FA WITH 3 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+LD3_FA:        CLT                             ; SET SIGN POSITIVE\r
+LD3:   LDI     A,23+BIAS               ; SET EXPONENT AND FALL INTO NORMALIZE\r
+       MOV     FA3,A\r
+\r
+NRM_FA:        MOV     A,FA0                   ; NORMALIZE FA REGISTER\r
+       OR      A,FA1\r
+       OR      A,FA2\r
+       BREQ    NRM3                    ; IF ZERO THEN CLEAR EXPONENT & EXIT\r
+NRM0:  TST     FA2\r
+NRM1:  BRMI    NRM2                    ; IF MANTISSA DENORMALIZED\r
+       DEC     FA3                     ; THEN ADJUST EXPONENT\r
+       BREQ    MIN_FA                  ;      IF UNDERFLOW THEN RETURN MIN\r
+       RCALL   LSL_FA                  ;      ELSE SHIFT MANTISSA LEFT\r
+       RJMP    NRM1\r
+NRM2:  BLD     FA2,7                   ; ELSE OVERLAY WITH SIGN BIT\r
+       RET\r
+NRM3:  CLR     FA3\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+ADD_FA:        RCALL   LDS_FB                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+ADD0:  TST     FB3                     ; IF FB=0\r
+       BREQ    RET0                    ; THEN DO NOTHING\r
+       TST     FA3                     ; IF FA=0\r
+       BREQ    SWP_FA                  ; THEN SWAP FA,FB AND EXIT\r
+       MOV     D,FB2                   ; GET SIGN OF ARGUMENT\r
+       EOR     D,FA2                   ; BIT 7 SET IF SIGNS DIFFERENT\r
+       MOV     A,FA3\r
+       SUB     A,FB3                   ; IF FA EXPONENT < ARG EXPONENT\r
+       BRCC    ADD1\r
+       NEG     A                       ; THEN (EXP DIFF)=-(EXP DIFF)\r
+       RCALL   SWP_FA                  ;      SWAP FA,FB\r
+ADD1:  CPI     A,24                    ; IF EXP DIFFERENCE >= 24\r
+       BRCC    RET0                    ; THEN DO NOTHING\r
+       RCALL   SGN_FA                  ; ELSE SAVE SIGN & INSERT IMPLICIT BIT\r
+       OR      FB2,B                   ;      INSERT IMPLICIT BIT IN FB ALSO\r
+       TST     A\r
+ADD2:  BREQ    ADD3\r
+       LSR     FB2                     ;      SHIFT FB RIGHT TO ALIGN\r
+       ROR     FB1\r
+       ROR     FB0\r
+       DEC     A\r
+       RJMP    ADD2\r
+ADD3:  TST     D                       ; IF SIGNS SAME\r
+       BRMI    ADD5\r
+       RCALL   ADD_FB                  ; THEN FA=FA+FB\r
+       BRCC    ADD4                    ;      IF CARRY\r
+       RCALL   ROR_FA                  ;      THEN RIGHT SHIFT\r
+       INC     FA3                     ;           INC EXPONENT\r
+       BREQ    MAX_FA                  ;           IF OVERFLOW RETURN MAX\r
+ADD4:  BLD     FA2,7                   ;           ELSE OVERLAY WITH SIGN BIT\r
+RET0:  RET\r
+ADD5:  RCALL   SUB_FB                  ; ELSE FA=FA-FB\r
+       BREQ    NRM3                    ;      IF ZERO THEN CLEAR EXP & EXIT\r
+       BRCC    NRM0                    ;      IF CARRY\r
+       RCALL   COM_FA                  ;      THEN FA=-FA\r
+       LDI     A,-1\r
+       SUB     FA0,A\r
+       SBC     FA1,A\r
+       SBC     FA2,A\r
+       BLD     A,7                     ;      TOGGLE SIGN BIT\r
+       COM     A\r
+       BST     A,7\r
+       RJMP    NRM0                    ;      NORMALIZE\r
+\r
+ADDE_FA:RCALL  LDE_FB                  ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+ADDF_FA:RCALL  LDF_FB                  ; ADD FLASH CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+SUB_FA:        RCALL   LDS_FB                  ; SUBTRACT SRAM ARGUMENT FROM FA REG\r
+SUB0:  LDI     A,$80\r
+       EOR     FB2,A                   ; TOGGLE SIGN\r
+       RJMP    ADD0\r
+\r
+SUBE_FA:RCALL  LDE_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+SUBF_FA:RCALL  LDF_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+; VARIOUS SUBROUTINES\r
+\r
+MIN_FA:        CLR     FA3                     ; FA=0\r
+CLR_FA:        CLR     FA2                     ; CLEAR FA\r
+       CLR     FA1\r
+       CLR     FA0\r
+       RET\r
+\r
+SWP_FA:        RCALL   SWP0                    ; SWAP CONTENTS OF FA & FB\r
+       RCALL   SWP1\r
+SWP0:  EOR     FA0,FB0\r
+       EOR     FA1,FB1\r
+       EOR     FA2,FB2\r
+       EOR     FA3,FB3\r
+       RET\r
+SWP1:  EOR     FB0,FA0\r
+       EOR     FB1,FA1\r
+       EOR     FB2,FA2\r
+       EOR     FB3,FA3\r
+       RET\r
+\r
+OUTRNG:        BRPL    MIN_FA                  ; UNDERFLOW\r
+;      RJMP    MAX_FA                  ; OVERFLOW\r
+\r
+;      UNDERFLOW BY A LITTLE:    $80 + $FF =   $7F     POSITIVE\r
+;                               -128 -   1 =  -129\r
+;      UNDERFLOW BY A LOT:       $80 + $80 =   $00     POSITIVE\r
+;                               -128 - 128 =  -256\r
+;      OVERFLOW BY A LITTLE:     $7F + $0F =   $80     NEGATIVE\r
+;                                127 +   1 =   128\r
+;      OVERFLOW BY A LOT:        $7F + $7F =   $FE     NEGATIVE\r
+;                                127 + 127 =   254\r
+\r
+MAX_FA:        CLR     FA3                     ; FA=MAX\r
+       COM     FA3\r
+       MOV     FA2,FA3\r
+       MOV     FA1,FA3\r
+       MOV     FA0,FA3\r
+       BLD     FA2,7                   ; SET SIGN\r
+       RET\r
+\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+MUL_FA:        RCALL   LDS_FB                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+MUL0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MIN_FA                  ; THEN FA=0\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT & REMOVE BIAS\r
+       ADD     FA3,FB3                 ; ADD EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; ELSE RESTORE BIAS\r
+       MOV     FC0,FA0                 ; FC=FA\r
+       MOV     FC1,FA1\r
+       MOV     FC2,FA2\r
+       RCALL   CLR_FA                  ; FA=0\r
+       CLC\r
+       LDI     A,24                    ; LOOP COUNTER\r
+MUL1:  RCALL   ROR_FA                  ; RIGHT SHIFT\r
+       LSR     FC2\r
+       ROR     FC1\r
+       ROR     FC0\r
+       BRCC    MUL2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+MUL2:  DEC     A\r
+       BRNE    MUL1\r
+       BRCC    MUL3                    ; IF CARRY\r
+       RCALL   ROR_FA                  ; THEN NORMALIZE BY 1 BIT\r
+       INC     FA3                     ;      ADJUST EXPONENT\r
+       BREQ    MAX_FA                  ;      IF OVERFLOW RETURN MAX\r
+MUL3:  BLD     FA2,7                   ; ELSE RESTORE SIGN\r
+RET1:  RET\r
+\r
+MULE_FA:RCALL  LDE_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+MULF_FA:RCALL  LDF_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+DIV_FA:        RCALL   LDS_FB                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+DIV0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       BST     FA2,7                   ; GET SIGN OF FA\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MAX_FA                  ; THEN RETURN MAX\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT\r
+       SUB     FA3,FB3                 ; SUBTRACT EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; RESTORE BIAS\r
+       LSR     FA2                     ; DENORMALIZE SO THAT CARRY IS NOT LOST\r
+       ROR     FA1                     ; DURING SUBTRACTION AND SUBSEQUENT ADD\r
+       ROR     FA0\r
+       LSR     FB2\r
+       ROR     FB1\r
+       ROR     FB0\r
+       LDI     A,24                    ; LOOP COUNTER\r
+DIV1:  RCALL   SUB_FB                  ; FA=FA-FB\r
+       BRCC    DIV2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+DIV2:  ROL     FC0                     ; SHIFT CARRY INTO LSB\r
+       ROL     FC1\r
+       ROL     FC2\r
+       RCALL   LSL_FA\r
+       DEC     A\r
+       BRNE    DIV1\r
+       MOV     FA0,FC0                 ; FA=FC\r
+       MOV     FA1,FC1\r
+       MOV     FA2,FC2\r
+       RCALL   COM_FA                  ; SINCE CARRY WAS WRONG SENSE\r
+       RJMP    NRM0                    ; NORMALIZE & RESTORE SIGN\r
+\r
+DIVE_FA:RCALL  LDE_FB                  ; DIVIDE FA REGISTER BY EEPROM CONSTANT\r
+       RJMP    DIV0\r
+\r
+DIVF_FA:RCALL  LDF_FB                  ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       RJMP    DIV0\r
+\r
+CP_FA: RCALL   LDS_FB                  ; COMPARE FA WITH SRAM ARGUMENT\r
+CP0:   MOV     A,FA3                   ; FIRST CHECK FOR SPECIAL ZERO CASE\r
+       OR      A,FB3\r
+       BREQ    CP6                     ; FA=0, FB=0\r
+       MOV     A,FA2                   ; NOW, IF SIGNS DIFFERENT\r
+       EOR     A,FB2\r
+       BRMI    CP3                     ; THEN ANSWER DETERMINED BY THE SIGNS\r
+       BST     FA2,7                   ; ELSE SAVE SIGN FOR LATER\r
+       SUB     FB3,FA3                 ; TEST EXPONENT WITHOUT CORRUPTING FA\r
+       BRCS    CP2                     ; IF EXP FA > EXP FB\r
+       BRNE    CP1                     ; IF EXP FA < EXP FB\r
+       SUB     FB0,FA0                 ; IF EXPS EQUAL, MUST TEST MANTISSA\r
+       SBC     FB1,FA1\r
+       SBC     FB2,FA2\r
+       BRCS    CP2\r
+       BREQ    CP6\r
+CP1:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP4                     ; THEN CLEAR CARRY\r
+       RJMP    CP5                     ; ELSE SET CARRY\r
+CP2:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP5                     ; THEN SET CARRY\r
+       RJMP    CP4                     ; ELSE CLEAR CARRY\r
+CP3:   TST     FA2                     ; CHECK SIGN\r
+       BRMI    CP5\r
+CP4:   CLC                             ; FA > FB\r
+       CLZ\r
+       RET\r
+CP5:   SEC                             ; FA < FB\r
+       CLZ\r
+CP6:   RET                             ; FA = FB\r
+\r
+CPF_FA:        RCALL   LDF_FB                  ; COMPARE FA WITH FLASH CONSTANT\r
+       RJMP    CP0\r
+\r
+CPE_FA:        RCALL   LDE_FB                  ; COMPARE FA WITH EEPROM CONSTANT\r
+       RJMP    CP0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+SNDSTR:        ADIW    ZL,2                    ; OUTPUT STRING FROM FLASH\r
+STR0:  RCALL   STR1                    ; RETRIEVE MESSAGE\r
+       BRNE    STR0\r
+       RET\r
+STR1:  LPM                             ; GET NEXT CHARACTER\r
+       MOV     A,R0\r
+       RCALL   TX_WAIT\r
+       ADIW    ZL,1\r
+       DEC     D\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SNDASC:\r
+;      RCALL   EXP0                    ; SEND IN ASCII FORMAT\r
+;      INC     F                       ; DIGITS TO LEFT OF DECIMAL POINT\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;ASC0: DEC     F\r
+;      BREQ    EXP11\r
+;      RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    ASC0\r
+\r
+; CHARACTERIZE ONLY %\r
+;SNDEXP:\r
+;      PUSH    A                       ; SEPARATOR\r
+;      RCALL   EXP0                    ; SEND EXPONENTIAL FORMAT +N.NNNNNNE+^^\r
+;EXP5: FCPF    KR0001                  ; IF N<.0001\r
+;      BRCC    EXP6\r
+;      FMLF    K100K                   ; THEN N=N*100K\r
+;      SUBI    F,5                     ;      E=E-5\r
+;      RJMP    EXP5\r
+;EXP6: FCPF    K1                      ; IF N<1\r
+;      BRCC    EXP7\r
+;      FMLF    K10                     ; THEN N=N*10\r
+;      SUBI    F,1                     ;      E=E-1\r
+;      RJMP    EXP6\r
+;EXP7: FADF    TLT1                    ; BY MEREST COINCIDENCE CLOSE TO 5.0E-7\r
+;      RCALL   EXP3                    ; IN CASE WE JUMPED UP TO 10.000000\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;      LDI     A,'.'\r
+;      RCALL   TX_WAIT\r
+;      LDI     E,6                     ; 7 SIGNIFICANT DIGITS IN ALL\r
+;EXP8: RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      DEC     E\r
+;      BRNE    EXP8\r
+;      LDI     A,'0'                   ; 2 TRAILING ZEROS FOR COMPATIBILITY\r
+;      RCALL   TX_WAIT                 ; WITH PREVIOUS CHARACTERIZE VERSION\r
+;      LDI     A,'0'\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'E'                   ; NOW FOR THE EXPONENT\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'+'                   ; SEND SIGN\r
+;      TST     F\r
+;      BRPL    EXP9\r
+;      LDI     A,'-'\r
+;      NEG     F                       ; ABS(E)\r
+;EXP9: RCALL   TX_WAIT\r
+;      LDI     A,'0'-1                 ; CONVERT MS DIGIT TO ASCII\r
+;EXP10:        INC     A\r
+;      SUBI    F,10\r
+;      BRPL    EXP10\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'0'+10                ; NOW LS DIGIT\r
+;      ADD     A,F\r
+;      RCALL   TX_WAIT\r
+;      POP     A\r
+;      RCALL   TX_WAIT                 ; SEPARATOR\r
+;EXP11:        FLD     F0                      ; AND RESTORE FA\r
+;      RET\r
+;\r
+;EXP0: FST     F0                      ; ADJUST EXPONENT FOR ABS(N)>1\r
+;      LDI     A,' '                   ; SEND SIGN (SPACE FOR +)\r
+;      TST     FA2\r
+;      BRPL    EXP1\r
+;      LDI     A,'-'\r
+;EXP1: RCALL   TX_WAIT\r
+; %\r
+\r
+DIGN:  LDI     A,$7F\r
+       AND     FA2,A                   ; ABS(N)\r
+       CLR     F                       ; HOLDS ADJUSTED EXPONENT FOR 1<N<10\r
+EXP2:  FCPE    K10K ;FCPF K10K         ; IF N>10K\r
+       BRCS    EXP3\r
+       FMLF    KR0001                  ; THEN N=N/10K\r
+       ADDI    F,4                     ;      E=E+4\r
+       RJMP    EXP2\r
+EXP3:  FCPF    K10                     ; IF N>10\r
+       BRCS    EXP4\r
+       FMLF    KR1                     ; THEN N=N/10\r
+       SUBI    F,-1                    ;      E=E+1\r
+       RJMP    EXP3\r
+;EXP4: RET\r
+\r
+DGTN:  FSB     F1                      ; N=(N-I)*10\r
+       FMLF    K10                     ; REALLY N=(I-N)*10, SIGN UNIMPORTANT\r
+ ;;FMLF K_1 ; LET'S BE SAFE ;; LET'S NOT\r
+DGT0:  FST     F1                      ; N (ADJUSTED)\r
+       RCALL   FIX_FA                  ; I=INT(N)\r
+       MOV     B,FA0                   ; SAVE LS DIGIT\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       LDI     A,'0'\r
+       ADD     A,B                     ; A = LS DIGIT IN ASCII\r
+       RJMP    TX_WAIT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+LDS_A_STATUS:\r
+       LDS     A,STATUS\r
+EXP4:  RET\r
+\r
+SET_TRYZRO:\r
+       LDS     A,STATUS                ; THEN SET ZERO\r
+       SBR     A,1<<TRYZRO\r
+STS_STATUS_A:\r
+       STS     STATUS,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;\r
+;TOG_B4:\r
+;      RET\r
+;      SBIS    PORTB,4\r
+;      RJMP    TOG0\r
+;      CBI     PORTB,4                 ; FOR TESTING ONLY\r
+;      RET\r
+;TOG0: SBI     PORTB,4                 ; FOR TESTING ONLY\r
+\r
+\r
+; FOR LOCKUP TEST\r
+;      POP     G                       ; HIGH BYTE\r
+;      POP     H                       ; LOW BYTE\r
+;      PUSH    H\r
+;      PUSH    G\r
+\r
+;      LDI     H,'2'\r
+;      OUT     UDR,H\r
+;      LDI     G,'1'\r
+;      OUT     UDR,G\r
+\r
+;      MOV     G,H\r
+\r
+;      MOV     I,G\r
+;      SWAP    G\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL0\r
+;      SUBI    G,-$07\r
+;NIBLL0:       OUT     UDR,G\r
+;      MOV     G,I\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL1\r
+;      SUBI    G,-$07\r
+;NIBLL1:       OUT     UDR,G\r
+\r
+;      RET\r
+\r
+;      LDS     A,TEST_BUF              ; TESTING ONLY\r
+;      RCALL   CONV_TO_HEX\r
+\r
+;STACK_TEST:\r
+;      LDI     XL,RAMEND+1             ; STACK TEST\r
+;TST1:\r
+;      LD      A,-X\r
+;      RCALL   CONV_TO_HEX\r
+;      RCALL   SND_BUF\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   SND_BUF\r
+;      CPI     XL,$C8\r
+;      BRNE    TST1\r
+\r
+;STACK_TST:\r
+;      LDI     A,$55\r
+;      LDI     B,50\r
+;      LDI     YL,RAMEND-2\r
+;TST0: ST      -Y,A\r
+;      DEC     B\r
+;      BRNE    TST0\r
+\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4101                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/lcv1.asm b/src/avr/lcv1.asm
new file mode 100644 (file)
index 0000000..ecc10ed
--- /dev/null
@@ -0,0 +1,2476 @@
+;      LCV0.ASM\r
+;      WEIGHING MODE\r
+\r
+;      15JUN02\r
+;      ATmega8 VERSION HARDWARE/SOFTWARE CHANGES REQUIRED:\r
+;      1. REDUCE R8 FROM 100k TO 10k TO REDUCE RESET PIN IMPEDANCE\r
+;      2. CHANGE D2 FROM 1N4148 TO BAT46 FOR REDUCED TILT SIGNAL THRESHOLD\r
+;      3. IN ISPD.EXE KEEP DUTY CYCLE FOR SK BELOW 10% DURING PROGRAMMING\r
+;      4. PUSH/POP XH, YH, ZH TO PREVENT CORRUPTION DURING INTERRUPTS\r
+;      5. REVISE SOME REGISTER BIT POSITIONS FOR TIMER1\r
+\r
+;      ATmega8:\r
+.INCLUDE "MEGA8DEF.INC"                        ; FOR AVR ASSEMBLER\r
+;.INCLUDE "4433DEFX.INC"               ; FOR NICK ASSEMBLER\r
+.INCLUDE "MACLC.INC"\r
+;      ATmega8:\r
+.INCLUDE "APILC8.INC"\r
+;.INCLUDE "TERLC.INC"\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   CR              =$0D\r
+.EQU   LF              =$0A\r
+.EQU   RX_SIZE         =1\r
+.EQU   TX_SIZE         =8              ; LEAVES 10 BYTES FREE\r
+.EQU   API_ADDRESS     =$01            ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   CYC_MAX         =256            ; MAXIMUM WEIGHING CYCLE TIME\r
+.EQU   CYC_MIN         =160            ; MINIMUM WEIGHING CYCLE TIME > 6\r
+                                       ; < 210 ELSE OVERFLOW FOR FREQ < 27KHZ\r
+\r
+.EQU   CYC_ZERO        =16             ; INITIAL ZEROING COUNT\r
+.EQU   CYC_START       =32             ; INITIAL SMOOTHING COUNT\r
+\r
+                                       ; BITS IN RANGE\r
+.EQU   RNG             =$0F            ; RANGE BITS 0-3\r
+.EQU   RND             =6              ; ROUND UP (FOR HYSTERESIS)\r
+.EQU   SGN             =7              ; SIGN (FOR HYSTERESIS)\r
+                                       ; SGN MUST BE BIT 7 FOR EOR INSTRUCTION\r
+\r
+                                       ; BITS IN STATUS\r
+.EQU   OUCHFLG         =0              ; OVERLOAD\r
+.EQU   LOWFLG          =1              ; UNDERLOAD\r
+.EQU   UNSTBL          =2              ; UNSTABLE\r
+.EQU   VSTBL           =3              ; VERY STABLE\r
+.EQU   ZROFLG          =4              ; DISPLAY SHOWS ZERO\r
+.EQU   TRYZRO          =5              ; TRYING TO SET ZERO\r
+.EQU   SEND_SN         =6              ; TRYING TO SEND S/N MESSAGE\r
+.EQU   SEND_SPAN       =7              ; TRYING TO SEND SPAN MESSAGE\r
+\r
+                                       ; BITS IN FLAGS\r
+.EQU   SNDDAT          =0              ; SEND CHARACTERIZE DATA\r
+.EQU   ESC             =1              ; SET AFTER RECEIVING ESC\r
+.EQU   ESCM            =2              ; SET AFTER RECEIVING ESC M\r
+.EQU   BOMB            =3              ; SET DURING TILT MEASUREMENT\r
+.EQU   NEWDAT          =4              ; NEW SCALE DATA AVAILABLE\r
+.EQU   DIR             =5              ; DIRECTION OF CHANGE IN WGT\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+                                       ; BITS IN MODE\r
+.EQU   ABSGMS_FLG      =0              ; ABSOLUTE WEIGHT IN FP FORMAT\r
+.EQU   ZROGMS_FLG      =1              ; ZERO REGISTER IN FP FORMAT\r
+.EQU   TMPDEG_FLG      =2              ; TEMPERATURE (DEGREES) IN FP FORMAT\r
+.EQU   TLTBUB_FLG      =3              ; TILT BUBBLE POSITION IN INT FORMAT\r
+.EQU   WGTFRQ_FLG      =4              ; WEIGHT FREQUENCY IN FP FORMAT\r
+.EQU   TMPFRQ_FLG      =5              ; TEMPERATURE FREQUENCY IN FP FORMAT\r
+.EQU   TLRFRQ_FLG      =6              ; TILT LEFT/RIGHT IN FP FORMAT\r
+.EQU   TFBFRQ_FLG      =7              ; TILT FRONT/BACK IN FP FORMAT\r
+\r
+.DEF   FC0             =R0             ; AUXILLIARY FP ACCUMULATOR\r
+.DEF   FC1             =R1\r
+.DEF   FC2             =R2\r
+\r
+.EQU   FB              =$03\r
+.DEF   FB0             =R3             ; ARGUMENT FP ACCUMULATOR\r
+.DEF   FB1             =R4\r
+.DEF   FB2             =R5\r
+.DEF   FB3             =R6\r
+\r
+.EQU   FA              =$07\r
+.DEF   FA0             =R7             ; PRINCIPAL FP ACCUMULATOR\r
+.DEF   FA1             =R8\r
+.DEF   FA2             =R9\r
+.DEF   FA3             =R10\r
+\r
+.DEF   CYC_0           =R11\r
+.DEF   CYC_1           =R12\r
+\r
+.DEF   WT_0            =R13            ; RUNNING COUNT FOR 16 WEIGHT CYCLES\r
+.DEF   WT_1            =R14            ; TIMER1 INPUT CAPTURE LOW\r
+.DEF   WT_2            =R15            ; TIMER1 INPUT CAPTURE HIGH\r
+\r
+.DEF    A              =R17            ; GLOBAL REGISTERS\r
+.DEF    B              =R18\r
+.DEF   D               =R19\r
+.DEF   E               =R20\r
+.DEF   F               =R21\r
+\r
+.DEF   SR              =R22            ; SECONDARY REGISTER SET\r
+.DEF   G               =R23\r
+.DEF   H               =R24\r
+.DEF   I               =R25\r
+.DEF   J               =R27            ; XH\r
+.DEF   K               =R29            ; YH\r
+\r
+.DEF   FLAGS           =R16            ; MUST BE REGISTER, FOR ATOMIC ACCESS\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+STARTUP:       .BYTE   1               ; SMOOTHING COUNT FOR INITIAL STARTUP\r
+F3:\r
+TLTL_BUF:      .BYTE   2               ; DATA OUTPUT BUFFERS\r
+TLTR_BUF:      .BYTE   2\r
+F4:\r
+TLTF_BUF:      .BYTE   2\r
+TLTB_BUF:      .BYTE   2\r
+WGT:           .BYTE   3               ; ACCUMULATOR FOR 64 GROUPS OF 16\r
+TMP:           .BYTE   3               ; ACCUMULATOR FOR 256 TEMPERATURE\r
+TLTL:          .BYTE   2               ; ACCUMULATOR FOR 64 TILT CYCLES (TLT0)\r
+TLTR:          .BYTE   2\r
+TLTF:          .BYTE   2               ;                                (TLT1)\r
+TLTB:          .BYTE   2\r
+DTMP:          .BYTE   2               ; DIFFERENCE COUNT FOR CURRENT TEMP CYC\r
+WGTLST:                .BYTE   3               ; VALUE OF ADDITION TO WGT ON LAST CYC\r
+TL:            .BYTE   4               ; AVERAGED TLTLR\r
+TF:            .BYTE   4               ; AVERAGED TLTFB\r
+TMPFRQ:                .BYTE   4               ; TEMPERATURE FREQUENCY CYCLES/30MHZ\r
+GMS:           .BYTE   4\r
+LSTGMS:                .BYTE   4\r
+LSTDEV:                .BYTE   4\r
+AVEGMS:                .BYTE   4\r
+AVESTD:                .BYTE   4\r
+INTGMS:                .BYTE   4\r
+COUNT:         .BYTE   4\r
+\r
+F0:            .BYTE   4               ; FLOATING POINT REGISTERS\r
+F1:            .BYTE   4\r
+F2:            .BYTE   4\r
+RANGE:         .BYTE   1\r
+STATUS:                .BYTE   1\r
+MODE:          .BYTE   1\r
+MODE_CYCLE:    .BYTE   1               ; WEIGHING ONLY\r
+;WGTFRQ:       .BYTE   4               ; CHARACTERIZE ONLY\r
+;REF_30MHZ:    .BYTE   4               ; CHARACTERIZE ONLY\r
+TMP_PHASE:     .BYTE   1               ; CAREFUL\r
+DSPGMS:                .BYTE   4\r
+ZROGMS:                .BYTE   4\r
+DSPRES:                .BYTE   4\r
+\r
+API_REMAIN:    .BYTE   1\r
+RX_PTR:                .BYTE   1\r
+RX_COUNT:      .BYTE   1\r
+RX_BUF:                .BYTE   RX_SIZE\r
+TX_PTR:                .BYTE   1\r
+TX_COUNT:      .BYTE   1\r
+TX_BUF:                .BYTE   TX_SIZE         ; CAREFUL - COULD BE CLOBBERED BY STACK\r
+\r
+.ESEG\r
+.ORG   $000\r
+VOID:  .DB     $00,$00                 ; DON'T USE ADDR $000\r
+;EEMODE:       .DB     $00,$00         ; SEND ASCII WEIGHT DATA ONLY\r
+\r
+;SPAN: .DB     $00,$00,$80,$3F         ; 1.0000000E+00 SPAN FOR MELB/DELAWARE\r
+SPAN:  .DB     $1B,$BA,$7F,$3F         ; 0.9989335E+00 SPAN FOR JSY/NLD\r
+;SPAN: .DB     $6C,$21,$80,$3F         ; 1.0010200E+00 SPAN FOR QATAR\r
+\r
+;CAL3: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+;CAL2: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+;CAL1: .DB     $00,$00,$80,$3F         ; 1.0000000E+00\r
+;CAL0: .DB     $00,$00,$00,$00         ; 0.0000000E+00\r
+\r
+RANGES: .DB    $04,$00                 ;  OIML APO30\r
+RANGE1: .DB    $00,$40,$1C,$45         ;  2500\r
+       .DB     $00,$00,$80,$3F         ;     1\r
+       .DB     $00,$40,$9C,$45         ;  5000\r
+       .DB     $00,$00,$A0,$40         ;     5\r
+       .DB     $00,$40,$1C,$46         ; 10000\r
+       .DB     $00,$00,$20,$41         ;    10\r
+RNGMAX: .DB    $00,$D8,$EA,$46         ; 30060\r
+       .DB     $00,$00,$A0,$41         ;    20\r
+\r
+.CSEG\r
+\r
+       .ORG    0\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT0ADDR\r
+       RJMP    TMP_INT                 ; INT0 HANDLER FOR TEMPERATURE MEASUREMENT\r
+\r
+       .ORG    ICP1ADDR\r
+       RJMP    WGT_INT                 ; TIMER1 CAPTURE HANDLER\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+\r
+.INCLUDE  "PRM.INC"                    ; LOAD CELL CHARACTERIZE PARAMETERS\r
+\r
+TLT2:  .DB     $C7,$75,$41,$AF ;-1.759509E-10  TILT LINEARISATION PARAMETERS\r
+TLT1:  .DB     $25,$7E,$0B,$35 ; 5.196510E-07\r
+TLT0:  .DB     $04,$31,$E3,$39 ; 4.333333E-04\r
+\r
+TICKS: .DB     $AE,$11,$8D,$45 ; 4.514210E+03 = 4096*33.06306M/30M\r
+\r
+HSTRSL:        .DB     $33,$33,$B3,$3E ; 3.500000E-01 = (0.5-0.15)\r
+HSTRSH:        .DB     $66,$66,$26,$3F ; 6.500000E-01 = (0.5+0.15)\r
+\r
+CNFHYS:        .DB     $00,$00,$A0,$41 ; 2.000000E+01 = 3/.15\r
+HYSCNF:        .DB     $CD,$CC,$CC,$3D ; 1.000000E-01 = .3/3\r
+QUANT: .DB     $CD,$CC,$4C,$3E ; 2.000000E-01\r
+\r
+;K_1:  .DB     $00,$00,$80,$BF ;-1.000000E+00\r
+;K_R5: .DB     $00,$00,$00,$BF ;-5.000000E-01\r
+KR0001:        .DB     $17,$B7,$D1,$38 ; 1.000000E-04\r
+KR005: .DB     $0A,$D7,$A3,$3B ; 5.000000E-03 COULD PERHAPS USE KR0001 INSTEAD\r
+KR1:   .DB     $CD,$CC,$CC,$3D ; 1.000000E-01\r
+KR3:   .DB     $9A,$99,$99,$3E ; 3.000000E-01 COULD PERHAPS ELIMINATE THIS\r
+KR5:   .DB     $00,$00,$00,$3F ; 5.000000E-01\r
+;K0:   .DB     $00,$00         ; 0.000000E+00 DON'T MOVE!\r
+K1:    .DB     $00,$00,$80,$3F ; 1.000000E+00           !\r
+;K2:   .DB     $00,$00,$00,$40 ; 2.000000E+00\r
+K3:    .DB     $00,$00,$40,$40 ; 3.000000E+00\r
+K4:    .DB     $00,$00,$80,$40 ; 4.000000E+00\r
+K10:   .DB     $00,$00,$20,$41 ; 1.000000E+01\r
+K16:   .DB     $00,$00,$80,$41 ; 1.600000E+01\r
+K20:   .DB     $00,$00,$A0,$41 ; 2.000000E+01\r
+K30:   .DB     $00,$00,$F0,$41 ; 3.000000E+01\r
+K64:   .DB     $00,$00,$80,$42 ; 6.400000E+01\r
+;K100: .DB     $00,$00,$C8,$42 ; 1.000000E+02\r
+;K256:  .DB     $00,$00,$80,$43 ; 2.560000E+02\r
+K228:   .DB     $39,$8E,$63,$43 ; 2.275556E+02 = 256*16/18 REVISED 17MAY01\r
+K400:  .DB     $00,$00,$C8,$43 ; 4.000000E+02\r
+K450:  .DB     $00,$00,$E1,$43 ; 4.500000E+02 SHOULD PUT ZERO RANGE IN EEPROM\r
+;K1450:        .DB     $00,$40,$B5,$44 ; 1.450000E+03\r
+;K10K: .DB     $00,$40,$1C,$46 ; 1.000000E+04\r
+; CHARACTERIZE ONLY %\r
+;K100K:        .DB     $00,$50,$C3,$47 ; 1.000000E+05\r
+;K30M: .DB     $C0,$E1,$E4,$4B ; 3.000000E+07\r
+;K33M: .DB     $00,$20,$FD,$4B ; 3.317760E+07\r
+; %\r
+\r
+; PUT THIS IN EEPROM:\r
+;SIGNON: .DB   3,0                     ; MUST HAVE EVEN NUMBER OF CHARS\r
+;      .DB     "LC"\r
+;      .DB     $0D,$0A\r
+FMAT0: .DB     6,0\r
+       .DB     " 0.000"\r
+FMAT1: .DB     6,0\r
+       .DB     "-OUCH "\r
+FMAT2: .DB     6,0\r
+       .DB     " -LO- "\r
+;FMAT3:        .DB     6,0\r
+;      .DB     "HELLO "\r
+;FMAT4:        .DB     6,0\r
+;      .DB     "Error "\r
+FMAT5: .DB     6,0\r
+       .DB     "      "\r
+FMAT6: .DB     2,0\r
+       .DB     $0D,$0A\r
+;FMAT6:        .DB     3,0\r
+;      .DB     $20,$0D,$0A,0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+;      ATmega8:\r
+       OUTI    SPL,LOW(RAMEND)         ; INIT STACK POINTER\r
+       OUTI    SPH,HIGH(RAMEND)\r
+;      OUTI    SPL,RAMEND              ; INIT STACK POINTER\r
+       OUTI    ACSR,1<<ACD             ; POWER DOWN ANALOG COMPARATOR\r
+;      OUTI    ACSR,$80                ; POWER DOWN ANALOG COMPARATOR\r
+\r
+;      SBI     DDRB,5                  ; SET SK TO OUTPUT FOR DIAGNOSTICS\r
+\r
+       SBI     DDRD,2                  ; SET BIT 2 TO OUTPUT FOR TEMP SENSOR\r
+       SBI     DDRD,3                  ; SET BIT 3 TO OUTPUT FOR TILT SENSOR\r
+\r
+       OUTI    TCCR1B,1                ; SET COUNTER1 TO CLOCK AT 11.0592 MHZ\r
+                                       ; AND INPUT CAPTURE ON FALLING EDGE\r
+;       OUTI    MCUCR,2                 ; SET INT0 FALLING EDGE FOR TEMP SENSOR\r
+        OUTI    MCUCR,0                 ; SET INT0 LOW SENSE FOR TEMP SENSOR\r
+                                        ; 17MAY01 BOMBS GRACEFULLY AT EACH EXTREME\r
+\r
+       CLR     CYC_0\r
+       CLR     CYC_1\r
+\r
+       CLR     A\r
+       STS     RANGE,A\r
+       RCALL   STS_STATUS_A\r
+       STS     STARTUP,A\r
+       STS     TMP_PHASE,A\r
+\r
+       ;LDER   A,EEMODE\r
+; CHARACTERIZE ONLY %\r
+;      LDI     A,$F0\r
+; %\r
+       STS     MODE,A\r
+\r
+; WEIGHING ONLY %\r
+       LDI     A,1\r
+       STS     MODE_CYCLE,A\r
+; %\r
+\r
+       FLDF    K1\r
+       FST     DSPRES\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     LSTGMS\r
+       FST     LSTDEV\r
+       FST     AVEGMS\r
+       FST     AVESTD\r
+       FST     INTGMS\r
+; CHARACTERIZE ONLY %\r
+;      FST     WGTFRQ                  ; MAY NOT BE NECESSARY\r
+;      FST     REF_30MHZ               ; NECESSARY\r
+; %\r
+\r
+       INIT_API_BUS                    ; SET UART RATE AND CLEAR FLAGS/PTRS\r
+\r
+       IN      A,TIMSK\r
+;      ATmega8:\r
+       SBR     A,1<<TICIE1             ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+;      ORI     A,8                     ; ENABLE INTERRUPT ON T1 INPUT CAPTURE\r
+       OUT     TIMSK,A\r
+\r
+; WEIGHING ONLY %\r
+       WDR                             ; RESET WATCHDOG\r
+       OUTI    WDTCR,1<<WDE | 1<<WDCE  ; ENABLE CHANGE OF TIMEOUT VALUE\r
+       OUTI    WDTCR,1<<WDE | $07      ; ENABLE WATCHDOG WITH 2 SEC TIMEOUT\r
+;      LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+;      OUT     WDTCR,A\r
+; %\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;      LDFL    D,SIGNON                ; SEND SIGNON MESSAGE\r
+;      LDI     E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+;      RCALL   SNDSTR\r
+\r
+LOOP:                                  ; MAIN PROGRAM\r
+       ; IF THE INTERRUPT ALREADY CAME,\r
+       ; THROW AWAY THE DATA AND WAIT FOR A NEW ONE\r
+       CBR     FLAGS,1<<NEWDAT\r
+WAIT_LOOP:\r
+       ; TEST FOR WAITING COMMANDS OR DATA\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    WAIT_LOOPE\r
+       RCALL   RX_CHAR\r
+ ; LOOPBACK TEST\r
+ ;RCALL TX_CHAR\r
+       SBRC    FLAGS,ESC\r
+       RJMP    PROCESS_ESC\r
+       CPI     A,$1B\r
+       BRNE    WAIT_LOOPE\r
+       SBR     FLAGS,1<<ESC\r
+WAIT_LOOPE:\r
+       ; TEST FOR NEW DATA LEFT BY THE INTERRUPT\r
+       SBRS    FLAGS,NEWDAT\r
+       RJMP    WAIT_LOOP\r
+\r
+; WEIGHING ONLY %\r
+       WDR                     ; FEED WATCHDOG\r
+; %\r
+\r
+       ; SAY WE ARE TAKING THE NEW DATA\r
+       ;CBR    FLAGS,1<<NEWDAT\r
+\r
+       ; PROVIDE SQUARE WAVE DIAGNOSTIC ON B5\r
+       ;IN     A,PORTB\r
+       ;LDI    B,1<<5\r
+       ;EOR    A,B\r
+       ;OUT    PORTB,A\r
+\r
+       ;FLD DSPRES                     ; STACK TEST\r
+       ;RCALL SHOW_FA\r
+       ;LDI A,' '\r
+       ;RCALL TX_WAIT\r
+\r
+       FLD2    F2                      ; CONVERT CYCLE COUNT TO FP FORMAT\r
+       FST     F2\r
+       ;LDI    A,1<<WGTFRQ_FLG\r
+       ;LDI    F,'0'+WGTFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+GRAMS: FLD3    GMS                     ; CONVERT WEIGHT COUNT TO FP FORMAT\r
+; CHARACTERIZE ONLY %\r
+;      FST     GMS\r
+;      FAD     REF_30MHZ\r
+;      FST     REF_30MHZ\r
+;      FLD     GMS\r
+; %\r
+       ;LDI    A,1<<TMPFRQ_FLG\r
+       ;LDI    F,'0'+TMPFRQ_FLG\r
+       ;RCALL  SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FDV     F2\r
+;      FMLF    K256 ;K64\r
+        FMLF    K228                    ; 17MAY01 256*16/18=227.55556\r
+       FST     GMS\r
+       FLDF    TICKS                   ; CONVERSION FACTOR\r
+       FDV     GMS\r
+       FST     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;      30usec\r
+\r
+       FLD3    F0                      ; CONVERT TEMPERATURE COUNT TO FP\r
+       FDV     F2                      ;   (THIS ROUTINE FREES UP F0)\r
+       FMLF    K64 ;K16\r
+       FST     F0\r
+       FLDF    KR3\r
+       FDV     F0                      ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+;LDI A,$0D\r
+;RCALL SNDEXP\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TMPFRQ\r
+       RCALL   SMOOTH\r
+;      270usec\r
+\r
+       ;LDS    A,STARTUP\r
+       ;SUBI   A,-$30\r
+       ;RCALL  TX_WAIT\r
+\r
+       FLD     GMS\r
+; CHARACTERIZE ONLY %\r
+;      LDS     A,STARTUP               ; SMOOTHING COUNT\r
+;      LDI     F,WGTFRQ\r
+;      RCALL   SMOOTH\r
+; %\r
+       LDI     A,1<<WGTFRQ_FLG\r
+       LDI     F,'0'+WGTFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND WGTFRQ IF DIAGNOSTIC MODE\r
+\r
+       FLD     TMPFRQ\r
+       LDI     A,1<<TMPFRQ_FLG\r
+       LDI     F,'0'+TMPFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TMPFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTL_BUF             ; CONVERT TILT TO FP (FREE UP F2, F3)\r
+       RCALL   LIN_TLT                 ; RETURNS CYCLES/30MHZ CLOCK TICK\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TL\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TLRFRQ_FLG\r
+       LDI     F,'0'+TLRFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TLRFRQ IF DIAGNOSTIC MODE\r
+\r
+       LDI     YL,TLTF_BUF             ; (FREE UP F4)\r
+       RCALL   LIN_TLT\r
+       LDS     A,STARTUP               ; SMOOTHING COUNT\r
+       LDI     F,TF\r
+       RCALL   SMOOTH\r
+       LDI     A,1<<TFBFRQ_FLG\r
+       LDI     F,'0'+TFBFRQ_FLG\r
+       RCALL   SNDFP                   ; SEND TFBFRQ IF DIAGNOSTIC MODE\r
+;2msec\r
+\r
+       RCALL   NRMTMP                  ; CONVERT TO NORMALIZED TEMP (-1<T<+1)\r
+       FST     F4                      ; AND SAVE NOW THAT F4 AVAILABLE\r
+       LDI     F,6                     ; DEGREE\r
+       LDIZ    A11                     ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; ZERO COMP A11*T^6+A10*T^5+A9*T^4+...\r
+       FST     F1\r
+;      1.1msec\r
+\r
+       FLD     GMS                     ; NOW IN CYCLES/30MHZ CLOCK TICK\r
+       FADE    _WREF                   ; SHIFT ORIGIN TO IMPROVE PRECISION\r
+       LDFL    E,SEGS1                 ; GET SEGMENT COUNT\r
+       LDIZ    SEG1                    ; POINT TO FIRST SEGMENT BOUNDARY\r
+SEGN:  RCALL   CPF_FA                  ; COMPARE FA WITH SEGn\r
+       BRCC    GOTSEG\r
+       ADIW    ZL,12                   ; POINT TO NEXT SEGn\r
+       DEC     E\r
+       BRNE    SEGN\r
+GOTSEG:                                        ; CONVERT TO GMS = D2*W^2 + D1*W + D0\r
+       LDI     F,2                     ; DEGREE\r
+       RCALL   POLY                    ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FAD     F1                      ; GMS=GMS+(THERMAL ZERO CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; NOW, BACK TO GRAMS\r
+       LDFH    F,DEGS                  ; DEGREE\r
+       LDI     E,3                     ; RANGE COUNT\r
+       LDIZ    K500                    ; POINT TO 1ST RANGE BOUNDARY\r
+       RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCC    NEXT_SPNRNG\r
+\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CASE GMS<500\r
+       FDVE    K500\r
+       FML     GMS\r
+       RJMP    THERM_SPAN\r
+\r
+SPNRNG:        RCALL   CPE_FA                  ; COMPARE FA WITH RANGE BOUNDARY\r
+       BRCS    GOT_SPNRNG\r
+NEXT_SPNRNG:\r
+       ADIW    ZL,32                   ; POINT TO NEXT RANGE BOUNDARY\r
+       DEC     E\r
+       BRNE    SPNRNG\r
+       ADIW    ZL,4\r
+GOT_SPNRNG:\r
+       SBIW    ZL,40                   ; POINT TO PREVIOUS BOUNDARY\r
+       RCALL   SUBE_FA\r
+       FST     F2                      ; F2=GMS-LOWER BOUNDARY\r
+       MOV     E,F                     ; SAVE DEGREE FOR LATER\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; ENTER WITH Z <= HIGH ORDER COEFF\r
+       FST     F3                      ; CORR.LOW\r
+       MOV     F,E                     ; RESTORE DEGREE\r
+       ADIW    ZL,8                    ; POINT TO NEXT HIGH ORDER COEFFICIENT\r
+       FLD     F4                      ; NORMALIZED TEMPERATURE\r
+       RCALL   POLYE                   ; CALCULATE CORR.HIGH\r
+       FSB     F3                      ; CORR.HIGH-CORR.LOW\r
+       SBIW    ZL,8+4+(6*4)            ; ASSUME DEGREE = 6\r
+       RCALL   DIVE_FA\r
+       FML     F2\r
+       FAD     F3                      ; THERMAL SPAN CORRECTION\r
+THERM_SPAN:\r
+       FST     F2\r
+\r
+       ;LDI    A,1<<ZROGMS_FLG\r
+       ;LDI    F,'0'+ZROGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FAD     GMS                     ; GMS=GMS+(THERMAL SPAN CORRECTION)\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_10\r
+       MOV     F,FA0\r
+\r
+       FLD     F4                      ; NORMALISED TEMPERATURE\r
+       FMLF    K30\r
+       FADF    K20                     ; CONVERT TO DEGREES CELSIUS\r
+       RCALL   FIX_10                  ; TEMPERATURE (10TH DEGREES)\r
+       MOV     FA2,F                   ; THERMAL ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,E                   ; THERMAL SPAN CORRECTION (10TH GMS)\r
+\r
+       LDI     A,1<<TMPDEG_FLG\r
+       LDI     F,'0'+TMPDEG_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+; TILT CORRECTION\r
+; TLTP1=TLTA31*TLTFR0 + TLTA21*TLTFR1^2+TLTA11*TLTFR1+TLTA01\r
+       LDIZ    TLTA21                  ; TILT FB BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TF\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA31\r
+       FML     TL\r
+       FAD     F0\r
+       FST     F1\r
+\r
+; TLTP0=TLTA30*TLTFR1 + TLTA20*TLTFR0^2+TLTA10*TLTFR0+TLTA00\r
+       LDIZ    TLTA20                  ; TILT LR BUBBLE POSITION\r
+       LDI     F,2\r
+       FLD     TL\r
+       RCALL   POLY\r
+       FST     F0\r
+       RCALL   LDF_FA                  ; TLTA30\r
+       FML     TF\r
+       FAD     F0\r
+       FST     F0\r
+\r
+; TLTSPN1 = (TLTC21*TLTP1+TLTC11)*TLTP1\r
+       RCALL   LDF_FA                  ; TLTC21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTC11\r
+       FML     F1\r
+       FST     F3\r
+\r
+; TLTSPN0 = (TLTC20*TLTP0+TLTC10)*TLTP0\r
+       RCALL   LDF_FA                  ; TLTC20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTC10\r
+       FML     F0\r
+\r
+; WEIGHT = WEIGHT + WEIGHT*(TLTSPN0+TLTSPN1)\r
+       FAD     F3\r
+       FST     F3                      ; TLTSPN\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FML     GMS\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+; WEIGHT=WEIGHT + TLTB21*TLTP1^2+TLTB11*TLTP1\r
+       RCALL   LDF_FA                  ; TLTB21\r
+       FML     F1\r
+       RCALL   ADDF_FA                 ; TLTB11\r
+       FML     F1\r
+       FST     F2\r
+\r
+; WEIGHT=WEIGHT + TLTB20*TLTP0^2+TLTB10*TLTP0\r
+       RCALL   LDF_FA                  ; TLTB20\r
+       FML     F0\r
+       RCALL   ADDF_FA                 ; TLTB10\r
+       FML     F0\r
+       FAD     F2\r
+       FST     F2                      ; TLTZRO\r
+;      REALLY WANT TO LIMIT MAX CORRECTION AT THIS POINT\r
+       FAD     GMS\r
+       FST     GMS\r
+\r
+       FLD     F3\r
+       FMLE    K10K\r
+       RCALL   FIX_ENTRY\r
+       MOV     D,FA0\r
+\r
+       FLD     F2\r
+       RCALL   FIX_10\r
+       MOV     E,FA0\r
+\r
+       FLD     F1\r
+       RCALL   FIX_400\r
+       MOV     F,FA0\r
+\r
+       FLD     F0\r
+       RCALL   FIX_400                 ; TILT X POSITION\r
+       MOV     FA1,F                   ; TILT Y POSITION\r
+       MOV     FA2,E                   ; TILT ZERO CORRECTION (10TH GMS)\r
+       MOV     FA3,D                   ; TILT SPAN CORRECTION (10TH GMS/KG)\r
+\r
+       LDI     A,1<<TLTBUB_FLG\r
+       LDI     F,'0'+TLTBUB_FLG\r
+       RCALL   SNDFPE                  ; SEND IF ENABLED\r
+\r
+;SKIP_TILT:\r
+       ;FLD    GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLDE    SPAN\r
+       FML     GMS\r
+       FST     GMS\r
+\r
+; RECALIBRATION\r
+       LDI     F,3                     ; DEGREE\r
+       LDI     ZL,LOW(CAL3*2)          ; HIGH ORDER COEFFICIENT\r
+       RCALL   POLYE                   ; CAL3*GMS^3+CAL2*GMS^2+CAL1*GMS+CAL0\r
+       FST     GMS\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+; AVERAGING ALGORITHM\r
+                                       ; MEASURE DEVIATION\r
+       FSB     LSTGMS                  ; DEV=GMS-LSTGMS\r
+       LDS     A,LSTDEV+2              ; IF SGN(DEV)=SGN(LSTDEV) (SAME DIR)\r
+       EOR     A,FA2\r
+       BRMI    AV0\r
+       FAD     LSTDEV                  ; THEN DEV=DEV+LSTDEV (ACCUMULATE DEV)\r
+AV0:   FST     LSTDEV\r
+       LDI     A,$7F                   ; IF ABS(DEV) < QUANT\r
+       AND     FA2,A\r
+       FST     F0\r
+       FCPF    QUANT\r
+       BRCC    AV1\r
+       FLDF    QUANT                   ; THEN STD=QUANT (STD DEV > QUANT)\r
+       FST     F0                      ; ELSE STD=ABS(DEV) (APPROX STD DEV)\r
+\r
+                                       ; SET AVERAGING PERIOD\r
+AV1:   FLD     COUNT                   ; IF STD/AVESTD > CNT/(CNT+1)\r
+       FML     AVESTD                  ; (STILL TOO NOISY)\r
+       FST     F1\r
+       FLD     COUNT\r
+       FADF    K1\r
+       FST     F2\r
+       FML     F0\r
+       FCP     F1\r
+       BRCS    AV2\r
+       FLD     F2                      ; THEN INCR CNT (EXTEND AVERAGE)\r
+       FST     COUNT\r
+AV2:   FLD     AVESTD                  ; MAXCNT=(AVESTD/DSPRES)*(CONF/HYST)\r
+       FDV     DSPRES\r
+       FMLF    CNFHYS\r
+       FST     F1\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV3                     ; (UNTIL STD DEV < HYST)\r
+       RCALL   LDS_A_STATUS            ; THEN VERY STABLE=1\r
+       SBR     A,1<<VSTBL\r
+       RCALL   STS_STATUS_A\r
+AV3:   FLD     F1                      ; MAXCNT=MAXCNT+30\r
+       FADF    K30\r
+       FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+       ;RCALL  HYT_FA                  ; CONVERT BACK TO INTERNAL FORMAT\r
+\r
+       FCP     COUNT                   ; IF CNT > MAXCNT\r
+       BRCC    AV4\r
+       FLD     F1                      ; THEN CNT=MAXCNT\r
+       FST     COUNT\r
+\r
+                                       ; AVERAGE THE DEVIATION\r
+AV4:   FLD     COUNT                   ; NN=CNT (WEIGHTING FOR AVESTD)\r
+       FST     F1\r
+       FLD     F0                      ; IF STD*3 < AVESTD (VERY QUIET)\r
+       FMLF    K3\r
+       FCP     AVESTD\r
+       BRCC    AV5\r
+       FLD     F1                      ; THEN IF NN>10 THEN NN=10\r
+       FCPF    K10                     ; (ADAPT LOWER QUICKLY)\r
+       BRCS    AV5\r
+       FLDF    K10\r
+       FST     F1                      ; NN\r
+AV5:   FLD     F0                      ; STD\r
+       LDI     F,AVESTD\r
+       RCALL   SMOOTH_FP               ; AVESTD=(STD+AVESTD*(NN-1))/NN\r
+       FLD     COUNT                   ; IF AVESTD < CNT*DSPRES*HYST\r
+       FML     DSPRES                  ;    (NO DISPLAY FLICKER)\r
+       FMLF    HYSCNF\r
+       FCP     AVESTD\r
+       BRCS    AV6\r
+       RCALL   LDS_A_STATUS            ; THEN UNSTABLE=0 (STABLE)\r
+       CBR     A,1<<UNSTBL\r
+       RCALL   STS_STATUS_A\r
+                                       ; AVERAGE THE DATA\r
+AV6:   FLD     GMS\r
+       FST     LSTGMS                  ; READY FOR NEXT CYCLE\r
+       FSB     AVEGMS\r
+       FST     F2                      ; ERRGMS=GMS-AVEGMS\r
+       FMLF    K4\r
+       FST     F1                      ; ERRGMS*4\r
+       RCALL   LDS_A_STATUS            ; NOW SET WEIGHTING FOR AVEGMS\r
+       SBRS    A,VSTBL                 ; IF VERY STABLE\r
+       RJMP    AV7\r
+       FLD     F1                      ; THEN NN=CNT+(ERRGMS*4/DSPRES)^2\r
+       FDV     DSPRES                  ;      (EXCLUDE NOISY DATA)\r
+       FST     F3                      ;       ERRGMS*4/DSPRES\r
+       FML     F3                      ;      (ERRGMS*4/DSPRES)^2\r
+       FAD     COUNT\r
+       RJMP    AV8\r
+AV7:   FLD     COUNT                   ; ELSE NN=CNT (EXCEPT AFTER JUMP)\r
+AV8:   FST     F1\r
+       ;LDI    A,1<<ABSGMS_FLG\r
+       ;LDI    F,'0'+ABSGMS_FLG\r
+       ;RCALL  SNDFP                   ; SEND IF ENABLED\r
+\r
+       FLD     GMS\r
+       LDI     F,AVEGMS\r
+       RCALL   SMOOTH_FP               ; AVEGMS=(GMS+AVEGMS*(NN-1))/NN\r
+       LDI     A,1<<ABSGMS_FLG\r
+       LDI     F,'0'+ABSGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+                                       ; ALLOW INTGMS TO DECAY\r
+       FLD     F2                      ; ERRGMS\r
+       FMLF    K4\r
+       FST     F3                      ; ERRGMS*4\r
+       FML     F3\r
+       FADF    K10\r
+       FST     F1                      ; NN=10+(ERRGMS*4)^2 (TIME CONSTANT)\r
+       FLD     INTGMS                  ; INTGMS=INTGMS-INTGMS/NN (DECAY)\r
+       FDV     F1\r
+       FSB     INTGMS\r
+       FST     INTGMS                  ; ACTUALLY -INTGMS\r
+\r
+                                       ; INTEGRATE ERROR BETWEEN DATA AND AVE\r
+       FLD     DSPRES                  ; MINERR=DSPRES-AVESTD*2\r
+       FSB     AVESTD\r
+       FSB     AVESTD\r
+       FST     F3\r
+       TST     FA2                     ; IF MINERR < 0\r
+       BRPL    AV9\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     F3                      ; THEN MINERR=0\r
+AV9:   FLD     F2                      ; ERRGMS\r
+       BST     FA2,7                   ; SAVE SIGN\r
+       LDI     A,$7F\r
+       AND     FA2,A\r
+       FST     F1                      ; ABS(ERRGMS)\r
+       FCP     F3                      ; IF ABS(ERRGMS) < MINERR\r
+       BRCC    AV10\r
+       FLD     INTGMS                  ; THEN ERRGMS=0 (INTGMS UNCHANGED)\r
+       RJMP    AV12\r
+AV10:  FLD     F1                      ; WIND TO HAVE NO ADVANTAGE OVER GMS<20\r
+       FCPF    K20                     ; IF ABS(ERRGMS) < 20\r
+       BRCC    AV11\r
+       FLDF    K1                      ; THEN ERRGMS=SGN(ERRGMS)\r
+       BLD     FA2,7                   ;      (RESTORE SIGN)\r
+       FST     F2\r
+AV11:  FLDF    K4                      ; INTGMS=INTGMS+ERRGMS*4/STD\r
+       FML     F2\r
+       FDV     F0\r
+       FSB     INTGMS                  ; INTEGRATE THE ERROR\r
+       FST     INTGMS\r
+AV12:                                  ; RESTART AVERAGE IF ERROR SIGNIFICANT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; IF ABS(INTGMS)>64 (JUMP CONDITION)\r
+       FCPF    K64\r
+       BRCS    AV13\r
+       FLDF    K1                      ; THEN CNT=1\r
+       FST     COUNT\r
+;      FLDF    K0\r
+       FCLR                            ; 17MAY01\r
+       FST     INTGMS                  ;      INTGMS=0\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<VSTBL              ;      VERY STABLE=0\r
+       SBR     A,1<<UNSTBL             ;      UNSTABLE=1\r
+       RCALL   STS_STATUS_A\r
+\r
+; TO IMPROVE WIND PERFORMANCE I NEED TO VARY THE JUMP THRESHOLD\r
+; HAVING REGARD TO THE LONGER TERM EXCURSIONS ABOUT AVEGMS\r
+\r
+AV13:  FLD     AVEGMS                  ; AUTOZERO ROUTINE\r
+       FSB     ZROGMS\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+       FCPF    KR5                     ; IF ABS(AVEGMS-ZROGMS)<0.5\r
+       RCALL   LDS_A_STATUS\r
+       CBR     A,1<<ZROFLG\r
+       BRCC    AZ0\r
+       SBR     A,1<<ZROFLG             ; THEN SET ZROFLG\r
+AZ0:   RCALL   STS_STATUS_A\r
+       SBRS    A,ZROFLG                ; IF NOT SHOWING ZERO\r
+       RJMP    AZ1                     ; THEN SKIP AUTOZERO\r
+       FLD     AVEGMS                  ; ELSE AVERAGE INTO ZERO POINT\r
+       LDI     F,ZROGMS\r
+       LDI     A,17                    ;      IF AVEOK=0 USE N=17 ELSE N=2\r
+       RCALL   SMOOTH\r
+\r
+AZ1:   RCALL   LDS_A_STATUS            ; IF NOT SET ZERO COMMAND\r
+       SBRS    A,TRYZRO\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING\r
+       ;RCALL  LDS_A_STATUS            ; IF UNSTABLE\r
+       SBRC    A,UNSTBL\r
+       RJMP    AZ3                     ; THEN SKIP ZERO SETTING, RETAIN RQ\r
+       FLD     AVEGMS                  ; ELSE IF OUTSIDE RANGE\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ;         ABS\r
+       FCPF    K450 ;K1450 FOR EXTENDED ZERO RANGE - SHIPPED WITH S/N 5637\r
+       BRCC    AZ2                     ;      THEN SKIP ZERO SETTING, CLEAR RQ\r
+       FLD     AVEGMS                  ; ADDED 18DEC00 - ALLOW NEGATIVE AVEGMS\r
+       FST     ZROGMS                  ;      ELSE ZROGMS=AVEGMS\r
+AZ2:   RCALL   LDS_A_STATUS            ; ADDED 24FEB99 - MISSING ALL ALONG?\r
+       CBR     A,1<<TRYZRO\r
+       RCALL   STS_STATUS_A\r
+AZ3:   FLD     ZROGMS\r
+       LDI     A,1<<ZROGMS_FLG\r
+       LDI     F,'0'+ZROGMS_FLG\r
+       RCALL   SNDFP                   ; SEND IF ENABLED\r
+\r
+; FIND RANGE AND DISPLAY RESOLUTION\r
+; WE ALSO CALCULATE F0=AVEGMS-ZROGMS IN THE PROCESS\r
+       FLD     AVEGMS\r
+       FSB     ZROGMS\r
+       FST     F0\r
+\r
+       LDER    E,RANGES                ; 17MAY01 (LDE->LDER) GET RANGE COUNT\r
+       LDI     ZL,RANGE1*2             ; POINT TO FIRST RANGE BOUNDARY\r
+RNGE:  RCALL   CPE_FA                  ; COMPARE FA WITH BOUNDARY\r
+       BRCS    GOTRNG\r
+       ADIW    ZL,4                    ; POINT TO NEXT RNG\r
+       DEC     E\r
+       BRNE    RNGE\r
+       SBIW    ZL,4                    ; POINT BACK TO PREVIOUS RESOLUTION\r
+GOTRNG:        RCALL   LDE_FA                  ; GET DISPLAY RESOLUTION FOR THIS RANGE\r
+       FST     DSPRES\r
+\r
+; STABILIZE DISPLAYED WEIGHT USING HYSTERESIS\r
+STAB:  FLD     F0\r
+       MOV     F,FA2                   ; SAVE SIGN BIT\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     F2\r
+       RCALL   FIX_FA                  ; TRUNCATE TO 3 BYTE INTEGER\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       FST     F0                      ; INTEGER PART\r
+       FLD     F2\r
+       FSB     F0                      ; FA = FRACTIONAL PART\r
+       FCPF    HSTRSL\r
+       BRCS    STB2                    ; FRACTION < HSTRSL, ROUND DOWN\r
+       FCPF    HSTRSH\r
+       BRCC    STB1                    ; FRACTION >= HSTRSH, ROUND UP\r
+\r
+       LDS     A,RANGE                 ; PREVIOUS RANGE, RND, SGN\r
+       MOV     B,A\r
+       EOR     B,F                     ; COMPARE WITH CURRENT SIGN (BIT 7)\r
+       BRMI    STB2                    ; JUST CHANGED SIGN, ROUND DOWN\r
+       ANDI    A,RNG                   ; PREVIOUS RANGE\r
+       CP      A,E                     ; COMPARE WITH CURRENT RANGE\r
+       BRCS    STB1                    ; JUST GONE TO LOWER RANGE, ROUND UP\r
+       BRNE    STB2                    ; JUST GONE TO HIGHER RANGE, ROUND DOWN\r
+\r
+       FLD     DSPGMS                  ; RECALCULATE VALUE FROM LAST TIME\r
+       LDI     A,$7F\r
+       AND     FA2,A                   ; ABS\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FDVF KR1\r
+ ; ELSE\r
+       FDV     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       LDS     A,RANGE                 ; PREVIOUS STATE\r
+       SBRS    A,RND                   ; IF ROUNDED UP LAST TIME\r
+       RJMP    STB0\r
+       FSBF    K1                      ; THEN DECREMENT\r
+STB0:  FST     F2                      ; CORRESPONDING VALUE FROM LAST TIME\r
+       FCP     F0\r
+       BRCS    STB2                    ; GONE TO HIGHER VALUE, ROUND DOWN\r
+       FLD     F0\r
+       FCP     F2\r
+       BRCS    STB1                    ; GONE TO LOWER VALUE, ROUND UP\r
+       RJMP    STB5                    ; ELSE RETAIN EXISTING DSPGMS\r
+\r
+STB1:  FLD     F0                      ; ROUND UPWARDS\r
+       FADF    K1\r
+       SBR     E,1<<RND                ; SUPERIMPOSE UPWARDS FLAG ON RANGE\r
+       RJMP    STB3\r
+\r
+STB2:  FLD     F0                      ; ROUND DOWNWARDS\r
+       ;CBR    E,1<<RND                ; SUPERIMPOSE DOWNWARDS FLAG ON RANGE\r
+STB3:  BST     F,7                     ; GET CURRENT SIGN\r
+       TST     FA3                     ; IF DSPGMS<>0\r
+       BREQ    STB4\r
+       BLD     FA2,7                   ; THEN RESTORE SIGN\r
+STB4:  BLD     E,SGN                   ; SUPERIMPOSE ON CURRENT RANGE\r
+       STS     RANGE,E                 ; SAVE CURRENT RANGE, RND, SGN\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;FMLF KR1\r
+ ; ELSE\r
+       FML     DSPRES                  ; DISPLAY RESOLUTION\r
+ ; %\r
+       FST     DSPGMS\r
+\r
+STB5:  ;LDS    A,MODE                  ; IF NOT WEIGHING MODE\r
+       ;SBRS   A,DSPGMS_FLG\r
+       ;RJMP   DSP9                    ; THEN SKIP OUTPUT IN GRAMS\r
+\r
+       LDI     E,CYC_MIN*2/3\r
+       RCALL   TX_WAIT_EMPTY\r
+       BRCS    FMT\r
+       RJMP    DSP9                    ; NO TX_BUFFER TO SEND ITEM THIS CYCLE\r
+\r
+FMT:   RCALL   LDS_A_STATUS\r
+       SBRS    A,SEND_SN               ; NEED TO SEND S/N MESSAGE ?\r
+       RJMP    SKIP_SN\r
+\r
+       CBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+\r
+       LDFL    D,SN\r
+       RCALL   SNDSTR                  ; SEND S/N MESSAGE\r
+       RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+\r
+SKIP_SN:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBRS    A,SEND_SPAN             ; NEED TO SEND S/N MESSAGE ?\r
+;      RJMP    SKIP_SPAN\r
+;\r
+;      CBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SAY WE HAVE SENT S/N MESSAGE\r
+;\r
+;      FLDE    SPAN\r
+;      LDI     A,0                     ; ITEM MUST ALWAYS BE SENT\r
+;      LDI     F,'S'\r
+;      RCALL   SNDFP                   ; SEND SPAN MESSAGE\r
+;      RJMP    DSP9                    ; SKIP WEIGHT OUTPUT THIS CYCLE\r
+\r
+SKIP_SPAN:\r
+       LDS     A,STARTUP               ; IF STARTUP<CYC_ZERO\r
+       CPI     A,CYC_ZERO\r
+       BRCC    FMT0\r
+       RCALL   SET_TRYZRO              ; THEN SET ZERO\r
+       LDFL    D,FMAT5 ;FMAT3                  ;      SHOW " HELLO"\r
+       RJMP    DSP7\r
+\r
+FMT0:  FLD     DSPGMS                  ; FORMAT OUTPUT DATA PACKET\r
+       LDFL    D,FMAT5                 ; IF SETTING ZERO\r
+       LDS     F,STATUS\r
+       SBRC    F,TRYZRO                ; THEN SHOW "     "\r
+       RJMP    DSP7\r
+       LDS     E,STARTUP               ; USED FOR DELAY BEFORE SHOWING " -LO-"\r
+       TST     FA2                     ; IF DSPGMS>=0\r
+       BRPL    FMT2                    ; THEN CONTINUE\r
+;      FSBF    KR005                   ; ELIMINATE TRUNCATION ERROR (- VALUES)\r
+       INC     E                       ; INC " -LO-" COUNTER (STARTUP)\r
+       CPI     E,CYC_START+8           ; IF STARTUP<CYC_START+8\r
+       BRCC    FMT1\r
+       STS     STARTUP,E\r
+       LDFL    D,FMAT0                 ; THEN SHOW " 0.000"\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;LDI E,CYC_MIN-10     ; TIMEOUT IS WHEN CYC_1 => E\r
+ ;RCALL SNDSTR\r
+ ;LDI A,'0'\r
+ ;RCALL TX_WAIT\r
+ ;RJMP DSP8\r
+ ; %\r
+       RJMP    DSP7\r
+FMT1:  SBR     F,1<<LOWFLG             ; ELSE SET LOWFLG\r
+       STS     STATUS,F\r
+       LDFL    D,FMAT2                 ;      SHOW " -LO-"\r
+       RJMP    DSP7\r
+FMT2:  CBR     F,1<<LOWFLG             ; CLEAR LOWFLG\r
+       CPI     E,CYC_START             ; IF STARTUP>CYC_START  ' CLEAR " -LO-"\r
+       BRCS    FMT3\r
+       LDI     E,CYC_START             ; THEN STARTUP=CYC_START\r
+       STS     STARTUP,E\r
+FMT3:  FCPE    RNGMAX                  ; IF DSPGMS>RNGMAX\r
+       BRCS    FMT4\r
+       SBR     F,1<<OUCHFLG            ; SET OUCHFLG\r
+       STS     STATUS,F\r
+       LDFL    D,FMAT1\r
+       RJMP    DSP7                    ; THEN SHOW "-OUCH"\r
+FMT4:  CBR     F,1<<OUCHFLG            ; CLEAR OUCHFLG\r
+       STS     STATUS,F\r
+\r
+DSP:   FADF    KR005                   ; ELIMINATE TRUNCATION ERROR (+ VALUES)\r
+       RCALL   DIGN                    ; ADJUST EXPONENT FOR 1<N<10\r
+       ADDI    F,2                     ; NUMBER OF DIGITS TO SEND +1\r
+       ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+       LDFL    D,FMAT0                 ; " 0.000"\r
+       ADIW    ZL,2\r
+DSP2:  CP      F,D\r
+       BRCC    DSP4\r
+DSP3:  RCALL   STR1                    ; GET NEXT CHARACTER FROM FMAT0\r
+       BREQ    DSP8                    ; WHEN ALL DONE\r
+       CPI     D,4\r
+       BRNE    DSP2\r
+       DEC     F                       ; TO COMPENSATE FOR EXTRA DEC C\r
+       RJMP    DSP3                    ; DO DECIMAL PT\r
+DSP4:\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;INC F\r
+ ; %\r
+       RCALL   DGT0                    ; CONVERT TO ASCII & SEND FIRST DIGIT\r
+DSP5:  DEC     F\r
+       BREQ    DSP8\r
+       CPI     F,4\r
+ ; FOR TENTHS OF GRAMS %\r
+ ;CPI F,5\r
+ ; %\r
+       BRNE    DSP6\r
+       LDI     A,'.'\r
+       RCALL   TX_WAIT\r
+       DEC     F\r
+DSP6:  RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+       RJMP    DSP5\r
+DSP7:  ;LDI    E,CYC_MIN-10            ; TIMEOUT IS WHEN CYC_1 => E\r
+       RCALL   SNDSTR\r
+DSP8:\r
+; ASCII STABILITY INDICATION FOR TESTING %\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   LDS_A_STATUS\r
+;      ANDI    A,1<<UNSTBL\r
+;      LDI     A,' '\r
+;      BREQ    DSP8X\r
+;      LDI     A,'*'\r
+;DSP8X:        RCALL   TX_WAIT\r
+;      LDI     A,$0D\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,$0A\r
+;      RCALL   TX_WAIT\r
+; %\r
+       LDFL    D,FMAT6                 ; NOW SEND TRAILER\r
+       RCALL   SNDSTR\r
+DSP9:\r
+\r
+       ; END OF MAIN WEIGHING LOOP\r
+\r
+; WEIGHING ONLY %\r
+       LDS     A,MODE_CYCLE\r
+       CPI     A,$10\r
+       BRLO    MODE_CYCLE_SWAP\r
+       LSL     A\r
+       BRNE    MODE_CYCLE_SWAP\r
+       LDI     A,$10\r
+MODE_CYCLE_SWAP:\r
+       SWAP    A\r
+       STS     MODE_CYCLE,A\r
+\r
+       LDS     A,STARTUP\r
+       INC     A\r
+       CPI     A,CYC_START+1           ; INC UP TO 32\r
+       BRCC    LOOP_END\r
+       STS     STARTUP,A\r
+; %\r
+\r
+; CHARACTERIZE ONLY %\r
+;      LDS     A,STARTUP\r
+;      SBRC    FLAGS,SNDDAT\r
+;      LDI     A,0                     ; RESTART INTEGRATION IF WE SENT DATA\r
+;      INC     A\r
+;      STS     STARTUP,A               ; INCREASE COUNT FOR TRUE AVERAGE\r
+;\r
+;      CBR     FLAGS,1<<SNDDAT         ; SAY WE MUST NOT SEND DATA OUT\r
+;\r
+;      FLD     REF_30MHZ               ; ELAPSED INTEGRATION TIME, 33MHZ TICKS\r
+;      FCPF    K33M                    ; => 1 SECOND ?\r
+;      BRLO    LOOP_END                ; NO, CONTINUE CURRENT INTEGRATION\r
+;\r
+;      FSBF    K33M\r
+;      FST     REF_30MHZ               ; WRAP ELAPSED TIME FOR NEW CYCLE\r
+;\r
+;      SBR     FLAGS,1<<SNDDAT         ; SAY WE MUST SEND DATA OUT\r
+; %\r
+\r
+LOOP_END:\r
+       RJMP    LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FIX_400:\r
+       FMLF    K400                    ; FOR +/- 20 FROM +/- 0.05\r
+       RJMP    FIX_ENTRY\r
+FIX_10:\r
+       FMLF    K10                     ; FOR 10TH GRAMS FROM GRAMS\r
+FIX_ENTRY:\r
+       ; THIS WILL CLOBBER D REGISTER,\r
+       ; AND DOES NOT CORRECTLY HANDLE NEGATIVE NUMBERS %\r
+       ;FADF   KR5                     ; FOR ROUNDING\r
+       ; %\r
+       RCALL   FIX_FA\r
+       BRTC    FIX_POSITIVE\r
+       COM     FA0\r
+       COM     FA1\r
+       INC     FA0\r
+       BRNE    FIX_POSITIVE\r
+       INC     FA1\r
+FIX_POSITIVE:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_WAIT_EMPTY:\r
+       LDS     A,TX_COUNT\r
+       CPI     A,1\r
+       BRLO    TX_WAIT_EMPTY_RET\r
+\r
+       CP      CYC_1,E\r
+       BRLO    TX_WAIT_EMPTY\r
+\r
+;      LDS     A,TX_COUNT\r
+;      CPI     A,1\r
+\r
+TX_WAIT_EMPTY_RET:\r
+       RET                             ; CF SET = READY, CF CLEAR = NOT READY\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+POLY:  FST     F0                      ; POLYNOMIAL CALCULATION, FLASH CONST\r
+                                       ; ENTER WITH FA = INDEPENDENT VAR\r
+       RCALL   LDF_FA                  ;            Z <= HIGHEST ORDER COEFF\r
+POLY0: FML     F0\r
+       RCALL   ADDF_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLY0\r
+       RET\r
+\r
+NRMTMP:        FLD     TMPFRQ                  ; NORMALIZE TEMP C3*T^3+C2*T^2+C1*T+C0\r
+       LDI     F,3                     ; DEGREE\r
+       LDIZ    C3                      ; HIGH ORDER COEFFICIENT\r
+;      RJMP    POLYE                   ; RETURN -1=-10 DEG, 0=20 DEG, 1=50 DEG\r
+\r
+POLYE: FST     F0                      ; POLYNOMIAL CALCULATION, EEPROM CONST\r
+       RCALL   LDE_FA                  ; ENTER WITH F0 = INDEPENDENT VARIABLE\r
+POLYE0:        FML     F0                      ;            Z <= HIGHEST ORDER COEFF\r
+       RCALL   ADDE_FA                 ;            F  = DEGREE\r
+       DEC     F                       ; NOTE:      CLOBBERS F0\r
+       BRNE    POLYE0\r
+SMTH0: RET\r
+\r
+SMOOTH:                                        ; EXPONENTIAL SMOOTHING A=N E=>AVERAGE\r
+       TST     A                       ; IF N=0        NOTE: CLOBBERS F0, F1\r
+       BREQ    SMTH0                   ; THEN DO NOTHING\r
+       FST     F0                      ; SAVE CURRENT DATA\r
+       MOV     FA0,A                   ; CONVERT N\r
+       CLR     FA1\r
+       CLR     FA2\r
+       RCALL   LD3_FA                  ; TO FP FORMAT\r
+       FST     F1                      ; AND SAVE\r
+       FLD     F0                      ; RETRIEVE CURRENT DATA\r
+SMOOTH_FP:                             ; ENTRY POINT WITH F1=N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   SUB_FA\r
+       FDV     F1                      ; N\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RCALL   ADD_FA\r
+       MOV     YL,F                    ; POINT TO EXISTING AVERAGE\r
+       RJMP    STS_FA                  ; AND SAVE\r
+\r
+LIN_TLT:\r
+       RCALL   LDS2_FA                 ; CONVERT 2 BYTE TILT COUNT TO FP\r
+       MOV     F,YL                    ; TEMP SAVE\r
+       FST     F0                      ; TLTL\r
+       MOV     YL,F\r
+       RCALL   LDS2_FA                 ; CONVERT OPPOSING TILT COUNT TO FP\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F1                      ; TLTR\r
+       FML     F1                      ; TLTR^2\r
+       FST     F3\r
+       FLD     F0\r
+       FDV     F2\r
+       FMLF    K16\r
+       FST     F0                      ; TLTL\r
+       FML     F0                      ; TLTL^2\r
+       FSB     F3                      ; TLTL^2-TLTR^2\r
+       FMLF    TLT2\r
+       FST     F3\r
+       FLD     F1\r
+       FSB     F0                      ; TLTR-TLTL\r
+       FMLF    TLT1\r
+       FSB     F3\r
+       FADF    TLT0\r
+SNDFP2:        RET\r
+\r
+SNDFP:\r
+; WEIGHING ONLY %\r
+       INC     FA3                     ; CHECK FOR NAN\r
+       BRNE    SND0\r
+       DEC     FA3                     ; TO COMPLY WITH IEEE754\r
+SND0:  DEC     FA3\r
+       ROL     FA2                     ; CONVERT TO IEEE754\r
+       ROR     FA3\r
+       ROR     FA2\r
+; %\r
+\r
+       TST     A\r
+       BREQ    SNDFPX                  ; ITEM MUST ALWAYS BE SENT\r
+\r
+SNDFPE:        LDS     B,MODE                  ; SEND DIAGNOSTIC DATA\r
+       AND     A,B                     ; MODE BIT FOR THIS DATA ITEM SET?\r
+; WEIGHING ONLY %\r
+       LDS     B,MODE_CYCLE\r
+       AND     A,B                     ; ROUND ROBIN UP TO THIS DATA ITEM YET?\r
+; %\r
+       BREQ    SNDFP2                  ; DO NOT SEND THIS DATA ITEM THIS CYCLE\r
+\r
+; WEIGHING ONLY %\r
+       LDI     E,0                     ; TIMEOUT IS WHEN CYC_1 => E\r
+       RCALL   TX_WAIT_EMPTY\r
+       BRCC    SNDFP2                  ; NO TX_BUFFER SPACE TO SEND ITEM\r
+; %\r
+\r
+SNDFPX:\r
+; CHARACTERIZE ONLY %\r
+;      SBRS    FLAGS,SNDDAT\r
+;      RET\r
+;      CPI     A,$80\r
+;      LDI     A,$0A\r
+;      BRNE    SEPOK\r
+;      LDI     A,$0D\r
+;SEPOK:        RJMP    SNDEXP\r
+; %\r
+\r
+; WEIGHING ONLY %\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       MOV     A,F                     ; INDICATE WHICH DATA IS BEING SENT\r
+       RCALL   TX_WAIT\r
+;SND_FA:\r
+       LDI     XL,FA                   ; LOAD TX BUFFER\r
+;      ATmega8:\r
+        CLR     XH\r
+       LDI     D,4\r
+SND1:  LD      A,X+\r
+       RCALL   TX_WAIT                 ; LS BYTE FIRST\r
+       DEC     D\r
+       BRNE    SND1\r
+       RET\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PROCESS_ESC:\r
+       SBRC    FLAGS,ESCM\r
+       RJMP    PROCESS_ESC_M1\r
+\r
+       CPI     A,'#'\r
+       BREQ    PROCESS_ESC_HASH\r
+       CPI     A,'M'\r
+       BREQ    PROCESS_ESC_M0\r
+;      CPI     A,'S'\r
+;      BREQ    PROCESS_ESC_S\r
+       CPI     A,'Z'\r
+       BREQ    PROCESS_ESC_Z\r
+\r
+PROCESS_ESC_DONE:\r
+       CBR     FLAGS,1<<ESC            ; NEED ANOTHER ESC TO GET BACK HERE\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_HASH:\r
+       RCALL   LDS_A_STATUS\r
+       SBR     A,1<<SEND_SN\r
+       RCALL   STS_STATUS_A            ; SEND S/N INSTEAD OF WEIGHT OUTPUT\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_M0:\r
+       SBR     FLAGS,1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+PROCESS_ESC_M1:\r
+       STS     MODE,A\r
+       CBR     FLAGS,1<<ESC | 1<<ESCM\r
+       RJMP    WAIT_LOOPE\r
+\r
+;PROCESS_ESC_S:\r
+;      RCALL   LDS_A_STATUS\r
+;      SBR     A,1<<SEND_SPAN\r
+;      RCALL   STS_STATUS_A            ; SEND SPAN INSTEAD OF WEIGHT OUTPUT\r
+;      RJMP    PROCESS_ESC_DONE\r
+\r
+PROCESS_ESC_Z:\r
+       RCALL   SET_TRYZRO              ; SET ZERO\r
+       RJMP    PROCESS_ESC_DONE\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+WGT_INT:\r
+       IN      SR,SREG\r
+       INC     CYC_0                   ; INCREMENT WEIGHT CYCLE COUNTER\r
+        OUT     SREG,SR\r
+        SBRS    CYC_0,4\r
+       RETI                            ; CYC_0<16\r
+        SBRS    CYC_0,0\r
+       RETI                            ; CYC_0=16\r
+;;     CBI     UCR,UDRIE               ; CYC_0=17 DISABLE UART INTERRUPT\r
+        SBRS    CYC_0,1                        ;          TO REDUCE JITTER FOR TEMP\r
+       RETI                            ;          MEASUREMENT, AND RETURN\r
+\r
+       PUSH    SR                      ; CYC_0=18 DO TEMP AND TILT\r
+       LDI     SR,$10+16-18            ; 17MAY01 NEED MORE TIME FOR FAST XTALS\r
+       ADD     CYC_0,SR                ; CLEAR BIT 4, CARRYING INTO BITS 5-7\r
+       IN      G,PIND\r
+       IN      H,PINC                  ; READ DATA\r
+       SEI                             ; ALLOW RECURSIVE WGT_INT\r
+\r
+;      ATmega8:\r
+       PUSH    K                       ; J,K USED BY FOREGROUND\r
+       PUSH    J\r
+\r
+;RCALL TOG_B5\r
+       ANDI    G,$F0                   ; ASSEMBLE DATA\r
+       ANDI    H,$0F\r
+       OR      G,H                     ; INTO G\r
+        SUB     G,WT_0                  ; CALC DIFFERENCE FROM LAST CYCLE\r
+        ADD     WT_0,G                  ; AND SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+        PUSH    G                       ; PUT HC590 DIFFERENCE COUNT ON STACK\r
+\r
+       IN      G,ICR1L                 ; READ TIMER1 INPUT CAPTURE REGISTER\r
+       MOV     H,G\r
+       SUB     H,WT_1                  ; AND CALC DIFFERENCE FROM LAST CYCLE\r
+       MOV     WT_1,G                  ; SAVE ORIGINAL COUNT FOR NEXT CYCLE\r
+       IN      G,ICR1H                 ; NOW HIGH BYTE\r
+       MOV     I,G\r
+       SBC     I,WT_2\r
+       MOV     WT_2,G\r
+\r
+;      USE 11MHZ COUNT TO DETERMINE HOW MANY TIMES HC590 HAS ROLLED OVER\r
+\r
+       MOV     G,H                     ; DIFFERENCE COUNT IN H|I\r
+       MOV     K,I\r
+       CLR     J\r
+       ADD     H,H                     ; H|I * 3 => H|I|J\r
+       ADC     I,I\r
+       ADC     J,J\r
+       ADD     H,G\r
+       ADC     I,K\r
+       CLR     G\r
+       ADC     J,G\r
+\r
+       MOV     G,I\r
+       MOV     K,J\r
+       LSR     K\r
+       ROR     G\r
+\r
+       ; ALLOW +/-128 COUNTS OF ERROR DUE TO XTAL TOLERANCES (-60 TYP)\r
+\r
+       POP     G                       ; RETRIEVE HC590 DIFFERENCE COUNT\r
+       SUB     G,H                     ; CALCULATE AMOUNT TO ADJUST H|I|J\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_COUNT\r
+; MOV A,G\r
+; RCALL TX_CHAR\r
+;SKIP_COUNT:\r
+; POP A\r
+       LDS     K,STARTUP       ; CHANGED 26MAR01 TO ALLOW FOR\r
+       TST     K               ; NEW BATCH OF 11MHZ XTALS\r
+       BREQ    CORRECTION_OK\r
+       CPI     G,-48           ; ASSUME NORMAL CORRECTION > -16\r
+       BRSH    CORRECTION_OK\r
+       CPI     G,16            ; OR            CORRECTION > +5\r
+       BRLO    CORRECTION_OK\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_DOLLAR\r
+; LDI A,'$'\r
+; RCALL TX_CHAR\r
+;SKIP_DOLLAR:\r
+; POP A\r
+       SUB     WT_0,G\r
+       LDI     G,-12                   ; BUT TYPICALLY -12\r
+       ADD     WT_0,G\r
+CORRECTION_OK:\r
+       LDI     K,0\r
+       TST     G\r
+       BRPL    SIGN_EXTEND\r
+       LDI     K,$FF                   ; IF NEG\r
+SIGN_EXTEND:\r
+       ADD     H,G\r
+       ADC     I,K\r
+       ADC     J,K                     ; ADD INTO H|I|J\r
+\r
+       LDS     G,WGTLST                ; TEST DIRECTION OF CHANGE\r
+       CP      H,G                     ; DIFFERENCE NOW IN H|I|J\r
+       LDS     G,WGTLST+1\r
+       CPC     I,G\r
+       LDS     G,WGTLST+2\r
+       CPC     J,G\r
+\r
+       STS     WGTLST,H                ; AND SAVE SAMPLE FOR NEXT CYCLE\r
+       STS     WGTLST+1,I\r
+       STS     WGTLST+2,J\r
+\r
+;      ATmega8:\r
+       POP     J\r
+       POP     K\r
+\r
+        CLI                             ; 17MAY01\r
+        LDS     G,TMP_PHASE             ; START TEMPERATURE MEASUREMENT %\r
+        INC     G\r
+TMP0:   RJMP    TMP1\r
+TMP1:   DEC     G                       ; WAIT TO SYNCHRONISE SUBSEQUENT INT0\r
+        BRNE    TMP0\r
+\r
+        SBI     PORTD,2                 ; ENGAGE PULLUP SO TEMP OUTPUT WILL GO\r
+        SBI     DDRD,2                  ; HIGH, AND SET BIT 2 TO OUTPUT\r
+\r
+;      ATmega8:\r
+       IN      G,GICR                  ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+;      IN      G,GIMSK                 ; IF PREV INT0 DIDN'T HAPPEN (STILL ON)\r
+       SBRC    G,INT0\r
+        RCALL   TMP_INT00               ; THEN WE MUST PROCESS ANYWAY\r
+        CBI     DDRD,2                  ; SET BIT 2 TO INPUT TO START DISCHARGE\r
+       CBI     PORTD,2                 ; AND REMOVE PULLUP\r
+       IN      G,TCNT1L                ; GET STARTING COUNT FROM TIMER1\r
+       STS     DTMP,G\r
+       IN      G,TCNT1H                ; NOW HIGH BYTE\r
+       STS     DTMP+1,G\r
+       SEI\r
+\r
+       MOV     G,CYC_1                 ; CYCLE COUNT, NOT INCLUDING CURRENT\r
+       INC     CYC_1                   ; INCLUDE CURRENT CYCLE\r
+       BRCS    DEC0                    ; NOW LOOK AT CHANGE\r
+       CBR     FLAGS,1<<DIR            ; IF INCREASING\r
+       RJMP    CONT\r
+DEC0:  SBRC    FLAGS,DIR               ; IF DECREASING\r
+       RJMP    DEC1\r
+       SBR     FLAGS,1<<DIR            ;    BUT INCREASING LAST TIME\r
+       RJMP    PEAK                    ; THEN PROCESS PEAK\r
+DEC1:  SBR     FLAGS,1<<DIR\r
+CONT:  CPI     G,CYC_MAX-1\r
+       BRLO    NOPEAK                  ; LIMIT TO CYC_MAX GROUPS OF 16 CYCLES\r
+PEAK:  CPI     G,CYC_MIN-1             ; NEVER DETECT PEAKS CLOSER THAN CYC_MIN\r
+       BRLO    NOPEAK\r
+\r
+       LDI     H,0\r
+       SUBI    G,LOW(-1)\r
+       SBCI    H,HIGH(-1)              ; ALLOW H:G TO INCREMENT UP TO $100\r
+       STS     F2,G                    ; TRANSFER CYCLE COUNT TO FOREGROUND F2\r
+       STS     F2+1,H\r
+\r
+       CLR     CYC_1                   ; INITIALISE CYCLE COUNT\r
+\r
+       LDI     XL,LOW(WGT)             ; TRANSFER DATA TO OUTPUT BUFFER\r
+;      ATmega8:\r
+        CLR     XH\r
+       CLR     G\r
+\r
+       LDI     YL,LOW(GMS)             ; WGHT DATA\r
+;      ATmega8:\r
+        CLR     YH\r
+       LDI     H,3\r
+TRANSFER_0:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_0\r
+\r
+       LDI     YL,LOW(F0)              ; TEMP DATA\r
+       LDI     H,3\r
+TRANSFER_1:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_1\r
+\r
+       LDI     YL,LOW(F3)              ; TILT DATA\r
+       LDI     H,8\r
+TRANSFER_2:\r
+       LD      R0,X                    ; TRANSFER DATA TO OUTPUT BUFFER\r
+       SBRS    FLAGS,NEWDAT            ; FOREGROUND / BACKGROUND COLLISION ?\r
+       ST      Y+,R0                   ; NO, OK TO COPY NEW DATA TO FOREGROUND\r
+       ST      X+,G                    ; AND CLEAR ACCUMULATOR\r
+       DEC     H\r
+       BRNE    TRANSFER_2\r
+\r
+       SBR     FLAGS,1<<NEWDAT         ; FLAG NEW DATA TO FOREGROUND\r
+\r
+NOPEAK:        LDS     G,WGT                   ; DIFFERENCE NOW IN WGTLST, ADD TO WGT\r
+       LDS     H,WGTLST\r
+       ADD     G,H\r
+       STS     WGT,G\r
+       LDS     G,WGT+1\r
+       LDS     H,WGTLST+1\r
+       ADC     G,H\r
+       STS     WGT+1,G\r
+       LDS     G,WGT+2\r
+       LDS     H,WGTLST+2\r
+       ADC     G,H\r
+       STS     WGT+2,G\r
+\r
+       CLI\r
+        LDI     G,$40                   ; 17MAY01 ENABLE TEMPERATURE INTERRUPT\r
+        OUT     GIFR,G                  ; CLEAR PENDING INT0 RESULTING FROM\r
+;      ATmega8:\r
+       OUT     GICR,G                  ; ACTIVITY ON PIN, AND ENABLE INT0\r
+;      OUT     GIMSK,G                 ; ACTIVITY ON PIN, AND ENABLE INT0\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,BOMB              ; TILT MEASUREMENT STILL IN PROGRESS?\r
+       RETI\r
+\r
+       POP     G                       ; YES, TILT SENSOR MUST HAVE FAILED\r
+       POP     G                       ;      SO FIX STACK\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_ASTERISK\r
+; LDI A,'*'\r
+; RCALL TX_CHAR\r
+;SKIP_ASTERISK:\r
+; POP A\r
+       RJMP    ABORT_TLT               ;      AND ABORT TILT MEASUREMENT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+TMP_INT:\r
+       IN      SR,SREG\r
+       RCALL   TMP_INT0                ; PROCESS TEMPERATURE DATA\r
+       PUSH    SR\r
+\r
+       CLR     I\r
+;      ATmega8:\r
+       OUT     GICR,I                  ; DISABLE INT0 INTERRUPTS\r
+;      OUT     GIMSK,I                 ; DISABLE INT0 INTERRUPTS\r
+\r
+                                       ; START TILT\r
+       SBR     FLAGS,1<<BOMB           ; BOMB OUT ON 18TH WEIGHT INTERRUPT\r
+       SEI\r
+\r
+       LDI     G,-110                  ; LIMIT TO 50uSEC (FULL PERIOD 20KHZ)\r
+       LDI     H,-55                   ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0:   INC     G                       ; WAIT FOR LOW ON WGT TO SYNCHRONISE\r
+       BREQ    TL2\r
+       SBIC    PINB,0\r
+       RJMP    TL0\r
+TL1:   INC     G                       ; WAIT FOR HIGH ON WGT,\r
+       BREQ    TL2                     ; TO MEASURE TIME TO EDGE\r
+       SBIS    PINB,0\r
+       RJMP    TL1\r
+TL2:   INC     H                       ; WAIT FOR LOW ON WGT,\r
+       BREQ    TL3                     ; TO MEASURE PERIOD/2\r
+       SBIC    PINB,0\r
+       RJMP    TL2\r
+TL3:                                    ; 17MAY01\r
+        SUBI    G,-110+5                ; +5 TO MAKE SURE WE HIT WITH WGT LOW\r
+        SUBI    H,-55                   ; WHICH SAVES A FULL WGT CYCLE IN TIME\r
+                                        ; BUT ALSO NOT TOO CLOSE TO HC590\r
+                                        ; CLOCKING WHICH CAUSES PREMATURE INT0\r
+; OUT UDR,G\r
+; OUT UDR,H\r
+       LDS     I,TMP_PHASE\r
+       SUB     G,H                     ; H = PERIOD/2\r
+       BRLO    PHASE_INCREASE          ; SERVO TOWARDS G = 0\r
+;PHASE_DECREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,1\r
+       BRSH    PHASE_SAVE\r
+       ADD     I,H\r
+       RJMP    PHASE_SAVE\r
+PHASE_INCREASE:\r
+       LSL     H                       ; H = PERIOD\r
+       SUBI    I,-1\r
+       CP      I,H\r
+       BRLO    PHASE_SAVE\r
+       SUB     I,H\r
+PHASE_SAVE:\r
+       STS     TMP_PHASE,I\r
+\r
+       LDI     G,132                   ; DESIRED PULSE LENGTH, 60 uSEC\r
+MOD_LOOP:\r
+       SUB     G,H                     ; H = AT LEAST 1 BY ALGORITHM ABOVE\r
+       BRSH    MOD_LOOP\r
+\r
+PULSE_DELAY_0:\r
+       RJMP    PULSE_DELAY_1\r
+PULSE_DELAY_1:\r
+       INC     G\r
+       BRNE    PULSE_DELAY_0           ; DELAY H - (132 MOD H) BEFORE TURN ON\r
+\r
+       SBI     PORTD,3                 ; TURN ON PULSE\r
+\r
+       LDI     G,110*5/3               ; SLIGHTLY LESS THAN PULSE, 50 uSEC\r
+PULSE_DELAY_3:\r
+       DEC     G\r
+       BRNE    PULSE_DELAY_3\r
+\r
+       LDI     G,55                    ; LIMIT TO 25uSEC (HALF PERIOD 20KHZ)\r
+TL0X:  DEC     G                       ; AND WAIT FOR LOW ON WGT TO ENSURE AT\r
+       BREQ    TOO_LONG                ; LEAST 1/2 CYCLE OF WGT HIGH, TO\r
+       SBIC    PINB,0                  ; PERFORM TILT MEASUREMENT BEFORE NEXT\r
+       RJMP    TL0X                    ; WGT INTERRUPT\r
+TOO_LONG:\r
+\r
+       CBI     PORTD,3                 ; TURN PULSE OFF AGAIN\r
+       MOV     G,CYC_0                 ; WHICH DIRECTION ? (WHILE WAITING)\r
+       IN      H,TCNT1L                ; SAVE STARTING COUNT\r
+       SWAP    G\r
+       LSR     G\r
+       ANDI    G,$03                   ; 2 LOW ORDER BITS INDICATE TILT AXIS\r
+\r
+;      ATmega8:\r
+       LDI     I,TLTL                  ; DON'T USE Z IN CASE OF BOMB OUT\r
+;      LDI     K,TLTL\r
+       BREQ    LEFT                    ; =0\r
+       DEC     G\r
+       LDI     I,TLTR\r
+;      LDI     K,TLTR\r
+       BREQ    RIGHT                   ; =1\r
+       DEC     G\r
+       LDI     I,TLTB\r
+;      LDI     K,TLTB\r
+       BREQ    BACK                    ; =2\r
+       LDI     I,TLTF\r
+;      LDI     K,TLTF\r
+FRONT: SBIS    PINB,2                  ; WAIT FOR EDGE\r
+       RJMP    FRONT\r
+       RJMP    TLT_AD\r
+BACK:  SBIS    PINC,5                  ; WAIT FOR EDGE\r
+       RJMP    BACK\r
+       RJMP    TLT_AD\r
+LEFT:  SBIS    PINC,4                  ; WAIT FOR EDGE\r
+       RJMP    LEFT\r
+       RJMP    TLT_AD\r
+RIGHT: SBIS    PINB,1                  ; WAIT FOR EDGE\r
+       RJMP    RIGHT\r
+       RJMP    TLT_AD                  ; EQUALISE TIME DELAY\r
+TLT_AD:        IN      G,TCNT1L                ; GET ENDING COUNT\r
+       SUB     G,H                     ; CALCULATE INCREASE IN COUNT\r
+\r
+;      ATmega8:\r
+       PUSH    ZH                      ; FOREGROUND USES Z\r
+       PUSH    ZL\r
+       CLR     ZH\r
+       MOV     ZL,I\r
+;      MOV     H,ZL                    ; 17MAY01\r
+;      MOV     ZL,K                    ; TEMPORARY SAVE IN CASE OF BOMB OUT\r
+;PUSH G\r
+       LD      I,Z                     ; GET CURRENT ACCUMULATION\r
+       ADD     I,G                     ; ADD NEW READING\r
+       ST      Z+,I                    ; AND SAVE\r
+       LDI     G,0\r
+       LD      I,Z                     ; NOW HIGH BYTE\r
+       ADC     I,G                     ; G=0 FROM ABOVE\r
+       ST      Z+,I\r
+;POP G\r
+;CPI   ZL,TLTF\r
+;BRNE  ABORT_TLT\r
+;PUSH  A\r
+;PUSH  D\r
+;MOV   A,G\r
+;RCALL CONV_TO_HEX\r
+;LDI   A,$20\r
+;RCALL TX_CHAR\r
+;POP   D\r
+;POP   A\r
+\r
+;      ATmega8:\r
+       POP     ZL                      ; RESTORE Z\r
+       POP     ZH\r
+;      MOV     ZL,H                    ; 17MAY01\r
+       CLI\r
+\r
+ABORT_TLT:                             ; ENTER HERE WITH INTERRUPTS DISABLED\r
+       CBR     FLAGS,1<<BOMB           ; WE WILL NOT BOMB OUT ON WEIGHT INT\r
+\r
+;;     SBI     UCR,UDRIE               ; 17MAY01 ALLOW DATA AFTER TEMP INT0\r
+       POP     SR\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+TMP_INT00:\r
+                                       ; 17MAY01 TO PREVENT DATA LOCKUP\r
+;;      SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+; PUSH A\r
+; LDS A,TX_COUNT\r
+; CPI A,TX_SIZE\r
+; BRSH SKIP_HASH\r
+; LDI A,'#'\r
+; RCALL TX_CHAR\r
+;SKIP_HASH:\r
+; POP A\r
+\r
+TMP_INT0:\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+       IN      G,TCNT1L                ; GET ENDING COUNT\r
+       LDS     I,DTMP                  ; RETRIEVE STARTING COUNT\r
+       SUB     G,I                     ; CALCULATE END-START DIFFERENCE\r
+       IN      H,TCNT1H                ; NOW HIGH BYTE\r
+       LDS     I,DTMP+1\r
+       SBC     H,I                     ; G|H NOW HAS DIFFERENCE COUNT\r
+\r
+       LDS     I,TMP                   ; ACCUMULATE DIFFERENCE COUNT\r
+       ADD     I,G\r
+       STS     TMP,I\r
+       LDS     I,TMP+1\r
+       ADC     I,H\r
+       STS     TMP+1,I\r
+       BRCC    DONE_TMP\r
+       LDS     I,TMP+2                 ; ADJUST HIGH ORDER BYTE IF CARRY\r
+       INC     I\r
+       STS     TMP+2,I\r
+\r
+DONE_TMP:\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SHOW_FA:\r
+;      MOV     A,FA3\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA2\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA1\r
+;      RCALL   CONV_TO_HEX\r
+;      MOV     A,FA0\r
+;      RCALL   CONV_TO_HEX\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RET\r
+;\r
+;CONV_TO_HEX:                          ; ENTER WITH BYTE IN A\r
+;      MOV     D,A\r
+;      SWAP    A\r
+;      RCALL   NIBL\r
+;      MOV     A,D\r
+;NIBL: ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,':'\r
+;      BRMI    NIBL0\r
+;      SUBI    A,-$07\r
+;NIBL0:\r
+;      RJMP    TX_WAIT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+RX_WAIT:\r
+       MRX_WAIT                        ; FALLS OUT INTO RX_CHAR\r
+RX_CHAR:\r
+       MRX_CHAR                        ; FOR DIAGS, FALLS OUT INTO TX_WAIT\r
+TX_WAIT:\r
+       MTX_WAIT                        ; FALLS OUT INTO TX_CHAR\r
+TX_CHAR:\r
+       MTX_CHAR                        ; FALLS OUT INTO TX_CHAR_RET\r
+TX_CHAR_RET:\r
+       MTX_CHAR_RET                    ; DOES NOT FALL OUT\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY                       ; DOES NOT FALL OUT\r
+\r
+RX_COMPLETE:\r
+       MRX_COMPLETE                    ; DOES NOT FALL OUT\r
+\r
+TX_COMPLETE:\r
+T0_OVERFLOW:\r
+       MTX_COMPLETE                    ; FALLS OUT INTO API_ERROR\r
+API_ERROR:\r
+       MAPI_ERROR                      ; FALLS OUT INTO API_REVERT\r
+API_REVERT:\r
+       MAPI_REVERT                     ; FALLS OUT INTO API_DONE\r
+API_DONE:\r
+       MAPI_DONE                       ; DOES NOT FALL OUT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      FLOATING POINT MATHS\r
+\r
+;      MS BYTE                     LS BYTE\r
+;      seeeeeee emmmmmmm mmmmmmmm mmmmmmmm IEEE754 FORMAT (FLASH/EEPROM)\r
+;      eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm INTERNAL FORMAT (SRAM/REGISTERS)\r
+;      VALUE =+1.mmmmmmm mmmmmmmm mmmmmmmm * 2^eeeeeeee\r
+\r
+;      WHERE:  s = SIGN BIT (OVERLAYING THE IMPLICIT 1 IN INTERNAL FORMAT)\r
+;              e = EXPONENT BITS WITH BIAS OF 127\r
+;              m = MANTISSA BITS\r
+\r
+;      NOTE:   IEEE754 FORMAT USED FOR FLASH/EEPROM CONSTANTS & SERIAL I/O\r
+;              INTERNAL FORMAT USED FOR SRAM ARGUMENTS & FA, FB\r
+;              FLDF & FLDE MACROS CONVERT FROM IEEE754 TO INTERNAL FORMAT\r
+\r
+;      MANTISSA:       $000000 TO $FFFFFF      REPRESENTING 1 =< MANTISSA < 2\r
+;      EXPONENT:       $00 TO $FF              REPRESENTING 2^-126 TO 2^128\r
+;                      $7F                     REPRESENTING 2^0\r
+\r
+;      NOTATION:       F0, F1, F2, F3          FP ARGUMENTS IN SRAM\r
+;                      FA3 FA2 FA1 FA0         FP REGISTER A (PRINCIPAL)\r
+;                      FB3 FB2 FB1 FB0         FP REGISTER B (ARGUMENT)\r
+;                          FC2 FC1 FC0         FP REGISTER C (AUXILIARY)\r
+\r
+;      IN GENERAL:     X IS USED TO INDEX FA, FB, ETC (FP REGISTERS)\r
+;                      Y IS USED TO INDEX F0, F1, ETC (FP SRAM ARGUMENTS)\r
+;                      Z IS USED TO INDEX K0, K1, ETC (FP FLASH/EEPROM CONSTANTS)\r
+\r
+;      REGISTER USAGE: GENERAL PURPOSE REGISTERS A,B,D\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;      MISCELLANEOUS SUBROUTINES\r
+\r
+.EQU   BIAS    =$7F                    ; EXPONENT BIAS = 127\r
+\r
+LDS_FA:\r
+;      ATmega8:\r
+        CLR     YH\r
+       LD      FA0,Y+                  ; LOAD FA FROM SRAM ARGUMENT\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+       LD      FA3,Y+\r
+       RET\r
+\r
+LDS_FB:\r
+;      ATmega8:\r
+        CLR     YH\r
+       LD      FB0,Y+                  ; LOAD FB FROM SRAM ARGUMENT\r
+       LD      FB1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FB2,Y+\r
+       LD      FB3,Y+\r
+       RET\r
+\r
+LDF_FA:        LDI     XL,FA                   ; LOAD FA FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FA:        ROL     FA2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FA3\r
+       ROR     FA2\r
+       RET\r
+\r
+LDF_FB:        LDI     XL,FB                   ; LOAD FB FROM FLASH CONST INDEXED BY Z\r
+       RCALL   LDF\r
+HYT_FB:        ROL     FB2                     ; CONVERT TO INTERNAL FORMAT\r
+       ROL     FB3\r
+       ROR     FB2\r
+       RET\r
+\r
+LDF:   LDI     A,4                     ; LOAD FP REGISTER INDEXED BY XL\r
+LDF0:  LPM                             ; FROM FLASH CONSTANT\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDF0\r
+       RET\r
+\r
+LDE_FB:        LDI     XL,FB                   ; LOAD FB FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FB                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE_FA:        LDI     XL,FA                   ; LOAD FA FROM EEPROM CONSTANT\r
+       RCALL   LDE\r
+       RJMP    HYT_FA                  ; CONVERT TO INTERNAL FORMAT\r
+\r
+LDE:   LDI     A,4\r
+LDE0:\r
+;       RCALL   LDE1                    ; 17MAY01 WAIT FOR WRITE IN PROGRESS\r
+;      ATmega8:\r
+        CLR     ZH\r
+        OUT     EEARH,ZH                ; SET UP ADDRESS\r
+       OUT     EEAR,ZL                 ; SET UP ADDRESS\r
+       SBI     EECR,EERE               ; ASSERT READ STROBE\r
+       IN      R0,EEDR\r
+       ADIW    ZL,1                    ; Z POINTS TO SOURCE\r
+       ST      X+,R0\r
+       DEC     A\r
+       BRNE    LDE0\r
+       RET\r
+\r
+;LDE1:  SBIS    EECR,EEWE               ; 17MAY01 IF WRITE IN PROGRESS\r
+;       RET\r
+;       RJMP    LDE1                    ; THEN WAIT\r
+\r
+STS_FA:\r
+;      ATmega8:\r
+        CLR     YH\r
+       ST      Y+,FA0                  ; STORE FA REGISTER TO SRAM ARGUMENT\r
+       ST      Y+,FA1                  ; Y POINTS TO DESTINATION\r
+       ST      Y+,FA2\r
+       ST      Y+,FA3\r
+       RET\r
+\r
+COM_FA:        COM     FA2                     ; ONES COMPLEMENT FA\r
+       COM     FA1\r
+       COM     FA0\r
+       RET\r
+\r
+ROR_FA:        ROR     FA2                     ; ROTATE RIGHT FA,1\r
+       ROR     FA1\r
+       ROR     FA0\r
+       RET\r
+\r
+LSL_FA:        LSL     FA0                     ; SHIFT LEFT FA,1\r
+       ROL     FA1\r
+       ROL     FA2\r
+       RET\r
+\r
+SUB_FB:        SUB     FA0,FB0                 ; FA=FA-FB\r
+       SBC     FA1,FB1\r
+       SBC     FA2,FB2\r
+       RET\r
+\r
+ADD_FB:        ADD     FA0,FB0                 ; FA=FA+FB\r
+       ADC     FA1,FB1\r
+       ADC     FA2,FB2\r
+       RET\r
+\r
+SGN_FA:        BST     FA2,7                   ; SAVE SIGN BIT\r
+       LDI     B,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,B\r
+       RET\r
+\r
+SGNS:  MOV     A,FB2                   ; COMPUTE SIGN OF RESULT\r
+       EOR     A,FA2\r
+       BST     A,7                     ; SAVE FOR LATER\r
+       LDI     A,$80                   ; INSERT IMPLICIT BIT\r
+       OR      FA2,A\r
+       OR      FB2,A\r
+       LDI     A,BIAS                  ; SUBTRACT BIAS\r
+       SUB     FA3,A\r
+       SUB     FB3,A\r
+       RET\r
+\r
+FIX_FA:        LDI     A,23+BIAS               ; TRUNCATE FA AND RETURN INTEGER PART\r
+       SUB     A,FA3\r
+       BRCS    FIX0                    ; IF EXPONENT>=24 THEN RETURN\r
+       CPI     A,24                    ; IF EXPONENT<0\r
+       BRCC    GO_MIN_FA               ; THEN FA=0\r
+       RCALL   SGN_FA                  ; SAVE SIGN & INSERT IMPLICIT BIT\r
+FIX2:  LSR     FA2                     ; SHIFT MANTISSA RIGHT\r
+       ROR     FA1\r
+       ROR     FA0\r
+       DEC     A                       ; (24-EXPONENT) BITS\r
+       BRNE    FIX2\r
+FIX0:  RET\r
+\r
+GO_MIN_FA:\r
+       RJMP    MIN_FA\r
+\r
+; REMOVED TO SAVE FLASH %\r
+;CHSS: LDD     B,Y+2                   ; CHANGE SIGN OF SRAM ARGUMENT\r
+;      LDI     A,$80\r
+;      EOR     B,A                     ; TOGGLE SIGN BIT\r
+;      STD     Y+2,B                   ; AND SAVE\r
+;      RET\r
+; %\r
+\r
+LDS2_FA:\r
+;      ATmega8:\r
+        CLR     YH\r
+       LD      FA0,Y+                  ; LOAD FA WITH 2 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       CLR     FA2\r
+       RJMP    LD3_FA\r
+LDS3_FA:\r
+;      ATmega8:\r
+        CLR     YH\r
+       LD      FA0,Y+                  ; LOAD FA WITH 3 BYTE POSITIVE INTEGER\r
+       LD      FA1,Y+                  ; Y POINTS TO SOURCE\r
+       LD      FA2,Y+\r
+LD3_FA:        CLT                             ; SET SIGN POSITIVE\r
+LD3:   LDI     A,23+BIAS               ; SET EXPONENT AND FALL INTO NORMALIZE\r
+       MOV     FA3,A\r
+\r
+NRM_FA:        MOV     A,FA0                   ; NORMALIZE FA REGISTER\r
+       OR      A,FA1\r
+       OR      A,FA2\r
+       BREQ    NRM3                    ; IF ZERO THEN CLEAR EXPONENT & EXIT\r
+NRM0:  TST     FA2\r
+NRM1:  BRMI    NRM2                    ; IF MANTISSA DENORMALIZED\r
+       DEC     FA3                     ; THEN ADJUST EXPONENT\r
+       BREQ    MIN_FA                  ;      IF UNDERFLOW THEN RETURN MIN\r
+       RCALL   LSL_FA                  ;      ELSE SHIFT MANTISSA LEFT\r
+       RJMP    NRM1\r
+NRM2:  BLD     FA2,7                   ; ELSE OVERLAY WITH SIGN BIT\r
+       RET\r
+NRM3:  CLR     FA3\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+ADD_FA:        RCALL   LDS_FB                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+ADD0:  TST     FB3                     ; IF FB=0\r
+       BREQ    RET0                    ; THEN DO NOTHING\r
+       TST     FA3                     ; IF FA=0\r
+       BREQ    SWP_FA                  ; THEN SWAP FA,FB AND EXIT\r
+       MOV     D,FB2                   ; GET SIGN OF ARGUMENT\r
+       EOR     D,FA2                   ; BIT 7 SET IF SIGNS DIFFERENT\r
+       MOV     A,FA3\r
+       SUB     A,FB3                   ; IF FA EXPONENT < ARG EXPONENT\r
+       BRCC    ADD1\r
+       NEG     A                       ; THEN (EXP DIFF)=-(EXP DIFF)\r
+       RCALL   SWP_FA                  ;      SWAP FA,FB\r
+ADD1:  CPI     A,24                    ; IF EXP DIFFERENCE >= 24\r
+       BRCC    RET0                    ; THEN DO NOTHING\r
+       RCALL   SGN_FA                  ; ELSE SAVE SIGN & INSERT IMPLICIT BIT\r
+       OR      FB2,B                   ;      INSERT IMPLICIT BIT IN FB ALSO\r
+       TST     A\r
+ADD2:  BREQ    ADD3\r
+       LSR     FB2                     ;      SHIFT FB RIGHT TO ALIGN\r
+       ROR     FB1\r
+       ROR     FB0\r
+       DEC     A\r
+       RJMP    ADD2\r
+ADD3:  TST     D                       ; IF SIGNS SAME\r
+       BRMI    ADD5\r
+       RCALL   ADD_FB                  ; THEN FA=FA+FB\r
+       BRCC    ADD4                    ;      IF CARRY\r
+       RCALL   ROR_FA                  ;      THEN RIGHT SHIFT\r
+       INC     FA3                     ;           INC EXPONENT\r
+       BREQ    MAX_FA                  ;           IF OVERFLOW RETURN MAX\r
+ADD4:  BLD     FA2,7                   ;           ELSE OVERLAY WITH SIGN BIT\r
+RET0:  RET\r
+ADD5:  RCALL   SUB_FB                  ; ELSE FA=FA-FB\r
+       BREQ    NRM3                    ;      IF ZERO THEN CLEAR EXP & EXIT\r
+       BRCC    NRM0                    ;      IF CARRY\r
+       RCALL   COM_FA                  ;      THEN FA=-FA\r
+       LDI     A,-1\r
+       SUB     FA0,A\r
+       SBC     FA1,A\r
+       SBC     FA2,A\r
+       BLD     A,7                     ;      TOGGLE SIGN BIT\r
+       COM     A\r
+       BST     A,7\r
+       RJMP    NRM0                    ;      NORMALIZE\r
+\r
+ADDE_FA:RCALL  LDE_FB                  ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+ADDF_FA:RCALL  LDF_FB                  ; ADD FLASH CONSTANT TO FA REGISTER\r
+       RJMP    ADD0\r
+\r
+SUB_FA:        RCALL   LDS_FB                  ; SUBTRACT SRAM ARGUMENT FROM FA REG\r
+SUB0:  LDI     A,$80\r
+       EOR     FB2,A                   ; TOGGLE SIGN\r
+       RJMP    ADD0\r
+\r
+SUBE_FA:RCALL  LDE_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+SUBF_FA:RCALL  LDF_FB                  ; SUBTRACT FLASH CONSTANT FROM FP REG\r
+       RJMP    SUB0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+; VARIOUS SUBROUTINES\r
+\r
+MIN_FA:        CLR     FA3                     ; FA=0\r
+CLR_FA:        CLR     FA2                     ; CLEAR FA\r
+       CLR     FA1\r
+       CLR     FA0\r
+       RET\r
+\r
+SWP_FA:        RCALL   SWP0                    ; SWAP CONTENTS OF FA & FB\r
+       RCALL   SWP1\r
+SWP0:  EOR     FA0,FB0\r
+       EOR     FA1,FB1\r
+       EOR     FA2,FB2\r
+       EOR     FA3,FB3\r
+       RET\r
+SWP1:  EOR     FB0,FA0\r
+       EOR     FB1,FA1\r
+       EOR     FB2,FA2\r
+       EOR     FB3,FA3\r
+       RET\r
+\r
+OUTRNG:        BRPL    MIN_FA                  ; UNDERFLOW\r
+;      RJMP    MAX_FA                  ; OVERFLOW\r
+\r
+;      UNDERFLOW BY A LITTLE:    $80 + $FF =   $7F     POSITIVE\r
+;                               -128 -   1 =  -129\r
+;      UNDERFLOW BY A LOT:       $80 + $80 =   $00     POSITIVE\r
+;                               -128 - 128 =  -256\r
+;      OVERFLOW BY A LITTLE:     $7F + $0F =   $80     NEGATIVE\r
+;                                127 +   1 =   128\r
+;      OVERFLOW BY A LOT:        $7F + $7F =   $FE     NEGATIVE\r
+;                                127 + 127 =   254\r
+\r
+MAX_FA:        CLR     FA3                     ; FA=MAX\r
+       COM     FA3\r
+       MOV     FA2,FA3\r
+       MOV     FA1,FA3\r
+       MOV     FA0,FA3\r
+       BLD     FA2,7                   ; SET SIGN\r
+       RET\r
+\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+MUL_FA:        RCALL   LDS_FB                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+MUL0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MIN_FA                  ; THEN FA=0\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT & REMOVE BIAS\r
+       ADD     FA3,FB3                 ; ADD EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; ELSE RESTORE BIAS\r
+       MOV     FC0,FA0                 ; FC=FA\r
+       MOV     FC1,FA1\r
+       MOV     FC2,FA2\r
+       RCALL   CLR_FA                  ; FA=0\r
+       CLC\r
+       LDI     A,24                    ; LOOP COUNTER\r
+MUL1:  RCALL   ROR_FA                  ; RIGHT SHIFT\r
+       LSR     FC2\r
+       ROR     FC1\r
+       ROR     FC0\r
+       BRCC    MUL2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+MUL2:  DEC     A\r
+       BRNE    MUL1\r
+       BRCC    MUL3                    ; IF CARRY\r
+       RCALL   ROR_FA                  ; THEN NORMALIZE BY 1 BIT\r
+       INC     FA3                     ;      ADJUST EXPONENT\r
+       BREQ    MAX_FA                  ;      IF OVERFLOW RETURN MAX\r
+MUL3:  BLD     FA2,7                   ; ELSE RESTORE SIGN\r
+RET1:  RET\r
+\r
+MULE_FA:RCALL  LDE_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+MULF_FA:RCALL  LDF_FB                  ; FP MULTIPLY BY FLASH CONSTANT\r
+       RJMP    MUL0\r
+\r
+DIV_FA:        RCALL   LDS_FB                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+DIV0:  TST     FA3                     ; IF FA=0\r
+       BREQ    RET1                    ; THEN DO NOTHING\r
+       BST     FA2,7                   ; GET SIGN OF FA\r
+       TST     FB3                     ; IF FB=0\r
+       BREQ    MAX_FA                  ; THEN RETURN MAX\r
+       RCALL   SGNS                    ; PROCESS SIGN OF RESULT\r
+       SUB     FA3,FB3                 ; SUBTRACT EXPONENTS\r
+       BRVS    OUTRNG                  ; IF UNDER/OVERFLOW RETURN MIN/MAX\r
+       LDI     A,BIAS\r
+       ADD     FA3,A                   ; RESTORE BIAS\r
+       LSR     FA2                     ; DENORMALIZE SO THAT CARRY IS NOT LOST\r
+       ROR     FA1                     ; DURING SUBTRACTION AND SUBSEQUENT ADD\r
+       ROR     FA0\r
+       LSR     FB2\r
+       ROR     FB1\r
+       ROR     FB0\r
+       LDI     A,24                    ; LOOP COUNTER\r
+DIV1:  RCALL   SUB_FB                  ; FA=FA-FB\r
+       BRCC    DIV2\r
+       RCALL   ADD_FB                  ; FA=FA+FB\r
+DIV2:  ROL     FC0                     ; SHIFT CARRY INTO LSB\r
+       ROL     FC1\r
+       ROL     FC2\r
+       RCALL   LSL_FA\r
+       DEC     A\r
+       BRNE    DIV1\r
+       MOV     FA0,FC0                 ; FA=FC\r
+       MOV     FA1,FC1\r
+       MOV     FA2,FC2\r
+       RCALL   COM_FA                  ; SINCE CARRY WAS WRONG SENSE\r
+       RJMP    NRM0                    ; NORMALIZE & RESTORE SIGN\r
+\r
+DIVE_FA:RCALL  LDE_FB                  ; DIVIDE FA REGISTER BY EEPROM CONSTANT\r
+       RJMP    DIV0\r
+\r
+DIVF_FA:RCALL  LDF_FB                  ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       RJMP    DIV0\r
+\r
+CP_FA: RCALL   LDS_FB                  ; COMPARE FA WITH SRAM ARGUMENT\r
+CP0:   MOV     A,FA3                   ; FIRST CHECK FOR SPECIAL ZERO CASE\r
+       OR      A,FB3\r
+       BREQ    CP6                     ; FA=0, FB=0\r
+       MOV     A,FA2                   ; NOW, IF SIGNS DIFFERENT\r
+       EOR     A,FB2\r
+       BRMI    CP3                     ; THEN ANSWER DETERMINED BY THE SIGNS\r
+       BST     FA2,7                   ; ELSE SAVE SIGN FOR LATER\r
+       SUB     FB3,FA3                 ; TEST EXPONENT WITHOUT CORRUPTING FA\r
+       BRCS    CP2                     ; IF EXP FA > EXP FB\r
+       BRNE    CP1                     ; IF EXP FA < EXP FB\r
+       SUB     FB0,FA0                 ; IF EXPS EQUAL, MUST TEST MANTISSA\r
+       SBC     FB1,FA1\r
+       SBC     FB2,FA2\r
+       BRCS    CP2\r
+       BREQ    CP6\r
+CP1:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP4                     ; THEN CLEAR CARRY\r
+       RJMP    CP5                     ; ELSE SET CARRY\r
+CP2:   BLD     A,7                     ; RETRIEVE SIGN\r
+       TST     A                       ; IF BOTH NEGATIVE\r
+       BRMI    CP5                     ; THEN SET CARRY\r
+       RJMP    CP4                     ; ELSE CLEAR CARRY\r
+CP3:   TST     FA2                     ; CHECK SIGN\r
+       BRMI    CP5\r
+CP4:   CLC                             ; FA > FB\r
+       CLZ\r
+       RET\r
+CP5:   SEC                             ; FA < FB\r
+       CLZ\r
+CP6:   RET                             ; FA = FB\r
+\r
+CPF_FA:        RCALL   LDF_FB                  ; COMPARE FA WITH FLASH CONSTANT\r
+       RJMP    CP0\r
+\r
+CPE_FA:        RCALL   LDE_FB                  ; COMPARE FA WITH EEPROM CONSTANT\r
+       RJMP    CP0\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+SNDSTR:        ADIW    ZL,2                    ; OUTPUT STRING FROM FLASH\r
+STR0:  RCALL   STR1                    ; RETRIEVE MESSAGE\r
+       BRNE    STR0\r
+       RET\r
+STR1:  LPM                             ; GET NEXT CHARACTER\r
+       MOV     A,R0\r
+       RCALL   TX_WAIT\r
+       ADIW    ZL,1\r
+       DEC     D\r
+       RET\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+;SNDASC:\r
+;      RCALL   EXP0                    ; SEND IN ASCII FORMAT\r
+;      INC     F                       ; DIGITS TO LEFT OF DECIMAL POINT\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;ASC0: DEC     F\r
+;      BREQ    EXP11\r
+;      RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      RJMP    ASC0\r
+\r
+; CHARACTERIZE ONLY %\r
+;SNDEXP:\r
+;      PUSH    A                       ; SEPARATOR\r
+;      RCALL   EXP0                    ; SEND EXPONENTIAL FORMAT +N.NNNNNNE+^^\r
+;EXP5: FCPF    KR0001                  ; IF N<.0001\r
+;      BRCC    EXP6\r
+;      FMLF    K100K                   ; THEN N=N*100K\r
+;      SUBI    F,5                     ;      E=E-5\r
+;      RJMP    EXP5\r
+;EXP6: FCPF    K1                      ; IF N<1\r
+;      BRCC    EXP7\r
+;      FMLF    K10                     ; THEN N=N*10\r
+;      SUBI    F,1                     ;      E=E-1\r
+;      RJMP    EXP6\r
+;EXP7: FADF    TLT1                    ; BY MEREST COINCIDENCE CLOSE TO 5.0E-7\r
+;      RCALL   EXP3                    ; IN CASE WE JUMPED UP TO 10.000000\r
+;      RCALL   DGT0                    ; CONVERT TO ASCII & SEND DIGIT\r
+;      LDI     A,'.'\r
+;      RCALL   TX_WAIT\r
+;      LDI     E,6                     ; 7 SIGNIFICANT DIGITS IN ALL\r
+;EXP8: RCALL   DGTN                    ; *10 THEN CONVERT TO ASCII, SEND DIGIT\r
+;      DEC     E\r
+;      BRNE    EXP8\r
+;      LDI     A,'0'                   ; 2 TRAILING ZEROS FOR COMPATIBILITY\r
+;      RCALL   TX_WAIT                 ; WITH PREVIOUS CHARACTERIZE VERSION\r
+;      LDI     A,'0'\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'E'                   ; NOW FOR THE EXPONENT\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'+'                   ; SEND SIGN\r
+;      TST     F\r
+;      BRPL    EXP9\r
+;      LDI     A,'-'\r
+;      NEG     F                       ; ABS(E)\r
+;EXP9: RCALL   TX_WAIT\r
+;      LDI     A,'0'-1                 ; CONVERT MS DIGIT TO ASCII\r
+;EXP10:        INC     A\r
+;      SUBI    F,10\r
+;      BRPL    EXP10\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'0'+10                ; NOW LS DIGIT\r
+;      ADD     A,F\r
+;      RCALL   TX_WAIT\r
+;      POP     A\r
+;      RCALL   TX_WAIT                 ; SEPARATOR\r
+;EXP11:        FLD     F0                      ; AND RESTORE FA\r
+;      RET\r
+;\r
+;EXP0: FST     F0                      ; ADJUST EXPONENT FOR ABS(N)>1\r
+;      LDI     A,' '                   ; SEND SIGN (SPACE FOR +)\r
+;      TST     FA2\r
+;      BRPL    EXP1\r
+;      LDI     A,'-'\r
+;EXP1: RCALL   TX_WAIT\r
+; %\r
+\r
+DIGN:  LDI     A,$7F\r
+       AND     FA2,A                   ; ABS(N)\r
+       CLR     F                       ; HOLDS ADJUSTED EXPONENT FOR 1<N<10\r
+EXP2:  FCPE    K10K ;FCPF K10K         ; IF N>10K\r
+       BRCS    EXP3\r
+       FMLF    KR0001                  ; THEN N=N/10K\r
+       ADDI    F,4                     ;      E=E+4\r
+       RJMP    EXP2\r
+EXP3:  FCPF    K10                     ; IF N>10\r
+       BRCS    EXP4\r
+       FMLF    KR1                     ; THEN N=N/10\r
+       SUBI    F,-1                    ;      E=E+1\r
+       RJMP    EXP3\r
+;EXP4: RET\r
+\r
+DGTN:  FSB     F1                      ; N=(N-I)*10\r
+       FMLF    K10                     ; REALLY N=(I-N)*10, SIGN UNIMPORTANT\r
+ ;;FMLF K_1 ; LET'S BE SAFE ;; LET'S NOT\r
+DGT0:  FST     F1                      ; N (ADJUSTED)\r
+       RCALL   FIX_FA                  ; I=INT(N)\r
+       MOV     B,FA0                   ; SAVE LS DIGIT\r
+       RCALL   LD3                     ; CONVERT BACK TO FP FORMAT\r
+       LDI     A,'0'\r
+       ADD     A,B                     ; A = LS DIGIT IN ASCII\r
+       RJMP    TX_WAIT\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+LDS_A_STATUS:\r
+       LDS     A,STATUS\r
+EXP4:  RET\r
+\r
+SET_TRYZRO:\r
+       LDS     A,STATUS                ; THEN SET ZERO\r
+       SBR     A,1<<TRYZRO\r
+STS_STATUS_A:\r
+       STS     STATUS,A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;\r
+;TOG_B4:\r
+;      RET\r
+;      SBIS    PORTB,4\r
+;      RJMP    TOG0\r
+;      CBI     PORTB,4                 ; FOR TESTING ONLY\r
+;      RET\r
+;TOG0: SBI     PORTB,4                 ; FOR TESTING ONLY\r
+\r
+\r
+; FOR LOCKUP TEST\r
+;      POP     G                       ; HIGH BYTE\r
+;      POP     H                       ; LOW BYTE\r
+;      PUSH    H\r
+;      PUSH    G\r
+\r
+;      LDI     H,'2'\r
+;      OUT     UDR,H\r
+;      LDI     G,'1'\r
+;      OUT     UDR,G\r
+\r
+;      MOV     G,H\r
+\r
+;      MOV     I,G\r
+;      SWAP    G\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL0\r
+;      SUBI    G,-$07\r
+;NIBLL0:       OUT     UDR,G\r
+;      MOV     G,I\r
+;      ANDI    G,$0F\r
+;      SUBI    G,-$30\r
+;      CPI     G,':'\r
+;      BRMI    NIBLL1\r
+;      SUBI    G,-$07\r
+;NIBLL1:       OUT     UDR,G\r
+\r
+;      RET\r
+\r
+;      LDS     A,TEST_BUF              ; TESTING ONLY\r
+;      RCALL   CONV_TO_HEX\r
+\r
+;STACK_TEST:\r
+;      LDI     XL,RAMEND+1             ; STACK TEST\r
+;TST1:\r
+;      LD      A,-X\r
+;      RCALL   CONV_TO_HEX\r
+;      RCALL   SND_BUF\r
+;      LDI     A,' '\r
+;      RCALL   TX_WAIT\r
+;      RCALL   SND_BUF\r
+;      CPI     XL,$C8\r
+;      BRNE    TST1\r
+\r
+;STACK_TST:\r
+;      LDI     A,$55\r
+;      LDI     B,50\r
+;      LDI     YL,RAMEND-2\r
+;TST0: ST      -Y,A\r
+;      DEC     B\r
+;      BRNE    TST0\r
+\r
+;      SBI     PORTB,5                 ; FOR TESTING ONLY\r
+;      CBI     PORTB,5                 ; FOR TESTING ONLY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; ATmega8:\r
+       ; BODEN  =    0 ENABLED\r
+       ; BODLVL =    1 FOR 2.7V\r
+       ; CLKOPT =    0 HIGH SPEED XTAL\r
+       ; SUT    =   01\r
+       ; CLSEL  = 1111\r
+       ; BLB    = 0000 DISABLE BOOT LOADER\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4101                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACA8                   ; WRITE FUSE HIGH BITS COMMAND\r
+       .DW     $00C1\r
+       .DW     $ACA0                   ; WRITE FUSE LOW BITS COMMAND\r
+       .DW     $009F\r
+       .DW     $ACE0                   ; WRITE LOCK BITS COMMAND\r
+       .DW     $0003\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/m192rhs.asm b/src/avr/m192rhs.asm
new file mode 100644 (file)
index 0000000..95eef13
--- /dev/null
@@ -0,0 +1,1685 @@
+;      M192RHS.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =4              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F ;$11       ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05 ;$11       ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =30             ; 240 / 8 = 30 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =40             ; 240 / 6 = 40 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =5              ; 40 / 8  = 5 TEXT WIDTH FLAGS\r
+\r
+.EQU   TIME_EMERGENCY  =1000           ; 1000 * 0.1 MS = APPROX 100 MS\r
+\r
+.EQU   FEED_INITIAL    =2              ; LINES ALLOWED FOR MOTOR SLOWDOWN\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED IN BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   TP_COUNT        =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   NOTIFY_COUNT    =R14            ; COUNTER TO SEND EVERY 6.5536 SECONDS\r
+.DEF   ABORT_COUNT     =R15            ; COUNTER TO ABORT ESC AFTER 0.1 SECS\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   SR              =R23\r
+.DEF   FLAGS           =R24\r
+.DEF   STATUS          =R25\r
+\r
+.EQU   TX_SIZE         =2\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_CHARS+WIDTH_FLAGS\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   RSWSAVE         =2              ; SET IF RSW HI, MUST BE BIT POSITION 2\r
+.EQU   IMAGE           =3              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =4              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+;.EQU  NODESC          =5              ; SET BY FG WHILE PRINTING TOP 7 DOTS\r
+;.EQU  BIGDESC         =6              ; SET BY FG WHILE PRINTING LOWER 2 DOTS\r
+.EQU   BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY FG JUST PRIOR TO NOTIFICATION\r
+.EQU   TP_ERROR        =2              ; SET BY BG IF WE HAVE TIMEOUT ON TP\r
+.EQU   RSW_ERROR       =3              ; SET BY BG IF WE HAVE TIMEOUT ON RSW\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; NODESC\r
+\r
+; FLAG RESET BY FOREGROUND AFTER DESCENDER TRANSLATION, IF DESCENDERS PRESENT.\r
+; FLAG SET BY FOREGROUND AFTER DESCENDERS FINISHED AND BUFFER CLOBBERED.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE, FOR SPECIAL DESCENDER\r
+; PROCESSING.\r
+\r
+; BIGDESC\r
+\r
+; FLAG SET UP BY FOREGROUND DURING DESCENDER TRANSLATION.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE IN COMBINATION WITH\r
+; TEXT_MASK, TO CONTINUE DESCENDER OR REVERT TO FEEDS.\r
+\r
+; NOWFAST\r
+\r
+; FLAG SET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 115200 BPS.\r
+; FLAG RESET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 4800 BPS.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT1ADDR\r
+       RJMP    TP_EDGE         ; EXTERNAL INT 1 HANDLER\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','1','9','2',' '\r
+;      .DB     'P','R','I','N','T','E','R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP EDGE INTERRUPT HANDLER\r
+\r
+TP_EDGE:\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       IN      D,MCUCR\r
+       SBRS    D,ISC10\r
+       CBI     PORTB,2                 ; IF WE WERE LOOKING FOR A FALLING EDGE\r
+       SBRC    D,ISC10\r
+       SBI     PORTB,2                 ; IF WE WERE LOOKING FOR A RISING EDGE\r
+       LDI     G,1<<ISC10\r
+       EOR     D,G\r
+       OUT     MCUCR,D                 ; START LOOKING FOR THE OPPOSITE EDGE\r
+\r
+       LDI     D,1<<INTF1\r
+       OUT     GIFR,D\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+TP_DONE:\r
+       LDI     D,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,D                ; RELOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR FEEDING\r
+\r
+TP_HALT:\r
+       SBR     STATUS,1<<RSW_ERROR     ; SAY WE HAD TIMEOUT ON RSW\r
+\r
+TP_KILL:\r
+       LDI     D,1<<TOIE0\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 OVERFLOW INTERRUPTS\r
+\r
+       CBI     PORTC,4                 ; MOTOR OFF\r
+       CBR     STATUS,1<<MOTOR         ; SAY MOTOR IS OFF\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+; ON ENTRY TO HERE, LOAD E WITH PREVIOUS RSW STATE, DON'T USE FLAGS\r
+\r
+TP_SEARCH:\r
+       RCALL   TP_DONE\r
+\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO RSW\r
+       BREQ    TP_HALT\r
+\r
+       IN      D,PIND                  ; D.2 = CURRENT RSW STATE\r
+       MOV     G,FLAGS                 ; G.2 = PREVIOUS RSW STATE\r
+       BST     D,2\r
+       BLD     FLAGS,2                 ; SAVE CURRENT RSW STATE FOR NEXT TIME\r
+       EOR     D,G                     ; D.2 = 1 IF RSW CHANGED\r
+       AND     D,G                     ; D.2 = 1 IF RSW CHANGED HIGH -> LOW\r
+\r
+       SBRS    D,2\r
+       RJMP    TP_SEARCH\r
+\r
+       ; RSW FALLING EDGE DETECTED\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    TP_FEED                 ; YES, GO AND PRINT\r
+\r
+       ; WE STOPPED THE MOTOR, MONITOR RSW WHILE IT SLOWS DOWN\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       TST     FEEDS\r
+       BREQ    TP_SEARCH\r
+       DEC     FEEDS                   ; DECREMENT FEEDS TO MINIMUM OF 0\r
+       RJMP    TP_SEARCH\r
+\r
+TP_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       MOV     D,TP_COUNT\r
+       CPI     D,3\r
+       BRSH    TP_PAPER_SKIP           ; ON LAST OR 2ND LAST TP EDGE,\r
+\r
+       SBIC    PORTB,2\r
+       RJMP    TP_PAPER_SKIP           ; WITH TP GENERATOR IN KNOWN STATE,\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     A,0\r
+       OUT     GIMSK,A                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       ;CBI    PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-3\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+\r
+TP_PAPER_SKIP:\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_COAST\r
+\r
+TP_FEED:\r
+       ;SBRS   STATUS,PAPER            ; PAPER IN?\r
+       ;RJMP   TP_BRAKE_NOW            ; NO, STOP PRINTING IMMEDIATELY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE); GOT SOMETHING TO PRINT?\r
+       BREQ    TP_BRAKE                ; NO, FULL NUMBER OF FEEDS-3 THEN STOP\r
+                                       ; YES, FULL NUMBER OF FEEDS THEN PRINT\r
+       MOV     D,FEEDS\r
+       CPI     D,3\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3 INTERNAL FEEDS\r
+       CPI     D,1\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1 INTERNAL FEED\r
+\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    TP_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       RJMP    TP_PRINT_TEXT           ; OTHERWISE ASSUME TEXT IS WAITING\r
+\r
+TP_BRAKE:\r
+       MOV     D,FEEDS\r
+       CPI     D,3+FEED_INITIAL\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3+n INTERNAL FEEDS\r
+       CPI     D,1+FEED_INITIAL\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1+n INTERNAL FEED\r
+\r
+TP_BRAKE_NOW:\r
+;      TST     FEEDS                   ; JUST MISSED RSW -> 0, COMPENSATE\r
+;      BREQ    TP_BRAKE_NOW_CONT\r
+;      DEC     FEEDS                   ; DECREMENT TO MINIMUM OF 0\r
+;TP_BRAKE_NOW_CONT:\r
+       CLR     FEEDS\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+TP_FEED_SLOW:\r
+       DEC     FEEDS\r
+\r
+       LDI     D,150\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+TP_FEED_FAST:                          ; AT PRINTABLE AREA-2\r
+       SUBI    D,3\r
+       MOV     FEEDS,D\r
+\r
+       SBI     PORTB,0                 ; APPLY TRIGGER SOLENOID\r
+\r
+       LDI     D,9\r
+       MOV     TP_COUNT,D\r
+TP_TRIGGERING:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT\r
+       BRNE    TP_TRIGGERING\r
+\r
+       CBI     PORTB,0                 ; CLEAR TRIGGER SOLENOID\r
+\r
+       LDI     D,150-9\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR TEXT PRINTING\r
+\r
+; TP_TEXT_START DOES NOT RE-ENABLE ACCESS TO FEEDS.\r
+; FEEDS IS USED AS A COUNTER FOR DESCENDER PRINTING,\r
+; SO WE RELY ON TIMER_COPY TO RESET NOFEED, AFTER THE\r
+; LINE HAS BEEN CHECKED FOR DESCENDERS AND IS ABOUT TO\r
+; BE CLOBBERED BY NEW DATA.\r
+\r
+TP_PRINT_TEXT:\r
+       LDI     D,2\r
+       MOV     TEXT_MASK,D\r
+       MOV     FEEDS,SPACING           ; SET UP STANDARD FEED AFTER TEXT LINE\r
+\r
+TP_PRINT_TEXT_START:\r
+       LDI     E,0                     ; CURRENT CHARACTER FOR PRINT HEAD, 0-4\r
+\r
+TP_PRINT_TEXT_CHAR:\r
+       LDI     F,0                     ; CURRENT PIXEL FOR CHARACTER, 0-5\r
+\r
+TP_PRINT_TEXT_PIXEL:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-30                   ; E = CURRENT CHARACTER + 30\r
+       RCALL   TP_TEXT_FIRE2\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 15\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-35                   ; E = CURRENT CHARACTER + 35\r
+       RCALL   TP_TEXT_FIRE1\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 20\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 5\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-20                   ; E = CURRENT CHARACTER + 25\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 10\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       SUBI    E,10                    ; E = CURRENT CHARACTER\r
+\r
+       INC     F                       ; NEXT PIXEL FOR CHARACTER\r
+       CPI     F,6                     ; GONE PAST LAST PIXEL FOR CHARACTER?\r
+       BRLO    TP_PRINT_TEXT_PIXEL     ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       INC     E                       ; NEXT CHARACTER FOR PRINT HEAD\r
+       CPI     E,5                     ; GONE PAST LAST CHAR FOR PRINT HEAD?\r
+       BRLO    TP_PRINT_TEXT_CHAR      ; REPEAT UNLESS ALL CHARACTERS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       SBRC    TEXT_MASK,7             ; LAST DOT LINE FOR CHARACTER LINE?\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       ; COMPLICATED DESCENDER LOGIC\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_PRINT_TEXT_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_PRINT_TEXT_COAST\r
+\r
+       LSL     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       BRCS    GO_TP_FEED\r
+       RJMP    TP_PRINT_TEXT_START     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_TP_FEED:\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_TEXT_FIRE3:\r
+       LSL     H\r
+TP_TEXT_FIRE2:\r
+       LSL     H\r
+TP_TEXT_FIRE1:\r
+       LSL     H\r
+\r
+       TST     E                       ; FIRST FLAG BIT FOR LINE?\r
+       LDS     D,PRINT_BUF\r
+       BREQ    TP_TEXT_SETUP_CONT      ; WITH CF = 0, D = FIRST FLAG BYTE\r
+\r
+       MOV     G,E\r
+       DEC     G                       ; BACK 1 FLAG BIT\r
+       ANDI    G,7\r
+       INC     G                       ; G = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       MOV     ZL,E\r
+       DEC     ZL                      ; BACK 1 FLAG BIT\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-(PRINT_BUF+1)       ; THEN FORWARD 1 FLAG BYTE\r
+       CLR     ZH\r
+       LD      D,Z\r
+       ROR     D                       ; CF = BIT 0 OF SUBSEQUENT FLAG BYTE\r
+       DEC     ZL\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+T0_TEXT_SETUP_FLAG:\r
+       ROR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_TEXT_SETUP_FLAG\r
+\r
+TP_TEXT_SETUP_CONT:\r
+       PUSH    F\r
+       BRCS    T0_TEXT_SETUP_RWIDE\r
+       ROR     D\r
+       BRCC    T0_TEXT_SETUP_NARROW\r
+;T0_TEXT_SETUP_LWIDE:\r
+       SUBI    F,6\r
+T0_TEXT_SETUP_RWIDE:\r
+       SUBI    F,-6\r
+       LSR     F\r
+T0_TEXT_SETUP_NARROW:\r
+       RCALL   LOOKUP_CHAR             ; GET R0 = VERTICAL SLICE OF CHAR\r
+       POP     F\r
+\r
+       AND     R0,TEXT_MASK\r
+       BREQ    TP_TEXT_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_TEXT_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR GRAPHICS PRINTING\r
+\r
+TP_PRINT_IMAGE:\r
+       CLR     F\r
+\r
+TP_IMAGE_PIXEL:\r
+       LDI     D,180\r
+       RCALL   TP_IMAGE_FIRE2\r
+       LDI     D,90\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,0\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,210\r
+       RCALL   TP_IMAGE_FIRE1\r
+       LDI     D,120\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,30\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,150\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,60\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       INC     F                       ; NEXT PIXEL FOR PRINT HEAD\r
+       MOV     D,F\r
+       CPI     D,30                    ; GONE PAST LAST PIXEL FOR PRINT HEAD?\r
+       BRLO    TP_IMAGE_PIXEL          ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_IMAGE_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_IMAGE_COAST\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_IMAGE_FIRE3:\r
+       LSL     H\r
+TP_IMAGE_FIRE2:\r
+       LSL     H\r
+TP_IMAGE_FIRE1:\r
+       LSL     H\r
+\r
+       ADD     D,F                     ; PIXEL ADDRESS\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,D\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = IMAGE BYTE\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ANDI    D,$07\r
+       INC     D\r
+TP_IMAGE_FIRE_SHIFT:\r
+       LSL     E                       ; AT LEAST ONCE\r
+       DEC     D\r
+       BRNE    TP_IMAGE_FIRE_SHIFT\r
+\r
+       BRCC    TP_IMAGE_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_IMAGE_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_LATCH2:\r
+       LSL     H\r
+TP_LATCH1:\r
+       LSL     H\r
+TP_LATCH0:\r
+       SWAP    H                       ; PUT BITS IN POSITION\r
+\r
+       IN      D,PORTD\r
+       EOR     D,H\r
+       ANDI    D,$0F\r
+       EOR     D,H\r
+       OUT     PORTD,D                 ; PLACE ORIGINAL LOWER 4 BITS ON D4-D7\r
+\r
+       IN      D,PORTC\r
+       EOR     D,H\r
+       ANDI    D,$F0\r
+       EOR     D,H\r
+       OUT     PORTC,D                 ; PLACE ORIGINAL UPPER 4 BITS ON C0-C3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; TRANSFER TO D4-D7 AND C0-C3\r
+\r
+       SBR     STATUS,1<<TP_ERROR      ; SAY WE HAD TIMEOUT ON TP\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 3\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 6\r
+\r
+       ADD     ZL,F\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 6 + SLICE INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*6)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*6)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       LPM                             ; R0 = CORRECT VERTICAL SLICE OF CHAR\r
+       RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 8\r
+       SUB     ZL,D                    ; ZL = CHARACTER DEFINITION * 7\r
+       ;CLR    ZH\r
+\r
+       SUBI    ZL,-(EE_COUNT*2+2)      ; PAST CRC, COUNT, AND CHARACTER CODE\r
+       ADD     ZL,F                    ; ZL = BASE + CHAR * 6 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      R0,EEDR                 ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+       SBRC    FLAGS,BOMB\r
+       RJMP    TEXT_RESET\r
+\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       CLR     NOTIFY_COUNT            ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+       CBR     STATUS,1<<NOTIFY        ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    RX_CHAR_CONT\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+\r
+       ;MAPI_TIMER\r
+\r
+       TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+       BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+\r
+       DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+       BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       SBIC    DDRB,1                  ; LED ON?\r
+       RJMP    T0_PAPER_TEST           ; YES, GO AND TEST OPTOCOUPLER INPUT\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    API_DONE                ; YES, RELY ON TP_EDGE TO TEST PAPER\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     D,0\r
+       OUT     GIMSK,D                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       CBI     PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-2\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_TEST:\r
+       LDI     D,1<<INT1\r
+       OUT     GIMSK,D                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,D                  ; CLEAR PENDING INT 1 FROM PAPER TEST\r
+\r
+       INC     NOTIFY_COUNT\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       SBR     STATUS,1<<NOTIFY        ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      D,PINC                  ; SAMPLE D5 STATE\r
+       CBI     DDRB,1                  ; B1 = TRI-STATE TO EXTINGUISH LED\r
+\r
+       SBRS    D,5\r
+       RJMP    T0_PAPER_IN             ; D5 = 0, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; D5 = 1, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   API_DONE\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       SBRC    STATUS,PAPER\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       CBR     STATUS,1<<PAPER         ; SAY PAPER IS OUT\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER\r
+       RJMP    API_DONE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       PUSH    A ; SLIGHTLY DODGY\r
+       RCALL   MOTOR_START             ; NORMALLY CALLED FROM FOREGROUND\r
+       POP     A\r
+\r
+       SBR     STATUS,(1<<PAPER) | (1<<NOTIFY) ; SAY PAPER IS IN, MUST SEND\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = PULL UP FOR RSW SWITCH\r
+       SBI     DDRB,2                  ; B2 = OUTPUT FOR TP GENERATOR\r
+\r
+       SBI     DDRB,0                  ; B0 = OUTPUT FOR TRG\r
+       LDI     A,$1F                   ; C5 = TRI-STATE FOR OPTOCOUPLER\r
+       OUT     DDRC,A                  ; C0-C4 = OUTPUTS FOR HE-HH, MSTR\r
+       ;SBI    PORTC,5                 ; C5 = PULLED UP INPUT FOR OPTOCOUPLER\r
+       LDI     A,$F0\r
+       OUT     DDRD,A                  ; D4-D7 = OUTPUTS FOR HA-HD\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW\r
+       LDI     STATUS,1<<PAPER\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A\r
+\r
+;      LDI     A,FEED_INITIAL\r
+;      MOV     FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       CLR     NOTIFY_COUNT\r
+       DEC     NOTIFY_COUNT            ; NEXT NOTIFICATION IMMEDIATELY\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,5                     ; TIMER0 TICK = APPROX 0.1 MS\r
+       OUT     TCCR0,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(TP_SEARCH)\r
+       LDI     H,HIGH(TP_SEARCH)       ; TP_SEARCH NEXT INTERRUPT\r
+\r
+       LDI     A,1<<ISC11 | 1<<ISC10\r
+       OUT     MCUCR,A                 ; INT 1 ON RISING EDGE\r
+       LDI     A,1<<INT1\r
+       OUT     GIMSK,A                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,A                  ; CLEAR ANY PENDING INT 1\r
+\r
+       LDI     A,5\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 MS\r
+\r
+       LDI     A,1<<TOIE0\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_RESET:\r
+       ; ENTRY POINT FROM RX_WAIT\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+       CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       SBR     FLAGS,1<<TEXT\r
+       RCALL   MOTOR_START\r
+\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+       OR      A,YL\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF LINES = 0\r
+\r
+       TST     R0\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF WIDTH = 0\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+       RCALL   MOTOR_START\r
+\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+GO_TEXT_RECEIVE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH*2          ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     XL,$21\r
+       LDI     XH,$10                  ; X = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,XL\r
+       EOR     YH,XH\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_FEEDS:\r
+       PUSH    A\r
+       ADD     A,FEEDS\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS\r
+\r
+       ADD     FEEDS,A\r
+\r
+MOTOR_START:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RET\r
+\r
+       SBIC    PORTC,4\r
+       RET\r
+\r
+       CBR     FLAGS,1<<RSWSAVE\r
+       SBI     PORTC,4                 ; MOTOR ON\r
+       SBR     STATUS,(1<<MOTOR) | (1<<NOTIFY) ; SAY MOTOR IS ON AND MUST SEND\r
+\r
+       LDI     A,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,A                ; LOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       LDI     A,1<<TOIE1\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,(1<<TOIE1) | (1<<TOIE0)\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 1 OVERFLOW INTERRUPTS\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-7\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$9E,$00,$00,$00\r
+       .DB     $00,$0E,$00,$0E,$00,$00\r
+       .DB     $28,$FE,$28,$FE,$28,$00\r
+       .DB     $4C,$92,$FF,$92,$64,$00\r
+       .DB     $46,$26,$10,$C8,$C4,$00\r
+       .DB     $6C,$92,$AA,$44,$A0,$00\r
+       .DB     $00,$0B,$07,$00,$00,$00\r
+       .DB     $00,$38,$44,$82,$00,$00\r
+       .DB     $00,$82,$44,$38,$00,$00\r
+       .DB     $28,$10,$7C,$10,$28,$00\r
+       .DB     $10,$10,$7C,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $10,$10,$10,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $40,$20,$10,$08,$04,$00\r
+       .DB     $7C,$A2,$92,$8A,$7C,$00\r
+       .DB     $00,$84,$FE,$80,$00,$00\r
+       .DB     $84,$C2,$A2,$92,$8C,$00\r
+       .DB     $42,$82,$8A,$96,$62,$00\r
+       .DB     $30,$28,$24,$FE,$20,$00\r
+       .DB     $4E,$8A,$8A,$8A,$72,$00\r
+       .DB     $78,$94,$92,$92,$60,$00\r
+       .DB     $02,$E2,$12,$0A,$06,$00\r
+       .DB     $6C,$92,$92,$92,$6C,$00\r
+       .DB     $0C,$92,$92,$52,$3C,$00\r
+       .DB     $00,$6C,$6C,$00,$00,$00\r
+       .DB     $00,$6C,$EC,$00,$00,$00\r
+       .DB     $10,$28,$44,$82,$00,$00\r
+       .DB     $28,$28,$28,$28,$28,$00\r
+       .DB     $00,$82,$44,$28,$10,$00\r
+       .DB     $04,$02,$A2,$12,$0C,$00\r
+       .DB     $7C,$82,$BA,$AA,$3C,$00\r
+       .DB     $FC,$22,$22,$22,$FC,$00\r
+       .DB     $FE,$92,$92,$92,$6C,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $FE,$82,$82,$44,$38,$00\r
+       .DB     $FE,$92,$92,$92,$82,$00\r
+       .DB     $FE,$12,$12,$12,$02,$00\r
+       .DB     $7C,$82,$92,$92,$F4,$00\r
+       .DB     $FE,$10,$10,$10,$FE,$00\r
+       .DB     $00,$82,$FE,$82,$00,$00\r
+       .DB     $40,$80,$82,$7E,$02,$00\r
+       .DB     $FE,$10,$28,$44,$82,$00\r
+       .DB     $FE,$80,$80,$80,$80,$00\r
+       .DB     $FE,$04,$18,$04,$FE,$00\r
+       .DB     $FE,$08,$10,$20,$FE,$00\r
+       .DB     $7C,$82,$82,$82,$7C,$00\r
+       .DB     $FE,$12,$12,$12,$0C,$00\r
+       .DB     $7C,$82,$A2,$42,$BC,$00\r
+       .DB     $FE,$12,$32,$52,$8C,$00\r
+       .DB     $4C,$92,$92,$92,$64,$00\r
+       .DB     $02,$02,$FE,$02,$02,$00\r
+       .DB     $7E,$80,$80,$80,$7E,$00\r
+       .DB     $3E,$40,$80,$40,$3E,$00\r
+       .DB     $7E,$80,$70,$80,$7E,$00\r
+       .DB     $C6,$28,$10,$28,$C6,$00\r
+       .DB     $0E,$10,$E0,$10,$0E,$00\r
+       .DB     $C2,$A2,$92,$8A,$86,$00\r
+       .DB     $00,$FE,$82,$82,$00,$00\r
+       .DB     $04,$08,$10,$20,$40,$00\r
+       .DB     $00,$82,$82,$FE,$00,$00\r
+       .DB     $08,$04,$02,$04,$08,$00\r
+       .DB     $80,$80,$80,$80,$80,$00\r
+       .DB     $00,$00,$0E,$0D,$00,$00\r
+       .DB     $40,$A8,$A8,$A8,$F0,$00\r
+       .DB     $FE,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$88,$88,$88,$FE,$00\r
+       .DB     $70,$A8,$A8,$A8,$30,$00\r
+       .DB     $08,$08,$FC,$0A,$0A,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $FE,$10,$08,$08,$F0,$00\r
+       .DB     $00,$88,$FA,$80,$00,$00\r
+       .DB     $00,$00,$08,$FA,$00,$00\r
+       .DB     $FE,$20,$50,$88,$00,$00\r
+       .DB     $00,$82,$FE,$80,$00,$00\r
+       .DB     $F8,$08,$F8,$08,$F0,$00\r
+       .DB     $F8,$10,$08,$08,$F0,$00\r
+       .DB     $70,$88,$88,$88,$70,$00\r
+       .DB     $F8,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $F8,$10,$08,$08,$00,$00\r
+       .DB     $90,$A8,$A8,$A8,$48,$00\r
+       .DB     $08,$08,$7E,$88,$88,$00\r
+       .DB     $78,$80,$80,$40,$F8,$00\r
+       .DB     $38,$40,$80,$40,$38,$00\r
+       .DB     $78,$80,$60,$80,$78,$00\r
+       .DB     $88,$50,$20,$50,$88,$00\r
+       .DB     $78,$80,$80,$80,$F8,$00\r
+       .DB     $88,$C8,$A8,$98,$88,$00\r
+       .DB     $10,$6C,$82,$82,$00,$00\r
+       .DB     $00,$00,$EE,$00,$00,$00\r
+       .DB     $00,$82,$82,$6C,$10,$00\r
+       .DB     $04,$02,$04,$08,$04,$00\r
+       .DB     $E0,$90,$88,$90,$E0,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $7A,$80,$80,$40,$FA,$00\r
+       .DB     $70,$A8,$AA,$A9,$30,$00\r
+       .DB     $40,$AA,$A9,$AA,$F0,$00\r
+       .DB     $42,$A8,$A8,$A8,$F2,$00\r
+       .DB     $40,$A9,$AA,$A8,$F0,$00\r
+       .DB     $40,$AE,$AA,$AE,$F0,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$AA,$A9,$AA,$30,$00\r
+       .DB     $72,$A8,$A8,$A8,$32,$00\r
+       .DB     $70,$A9,$AA,$A8,$30,$00\r
+       .DB     $02,$88,$F8,$80,$02,$00\r
+       .DB     $00,$8A,$F9,$82,$00,$00\r
+       .DB     $00,$89,$FA,$80,$00,$00\r
+       .DB     $F9,$24,$24,$24,$F9,$00\r
+       .DB     $F8,$27,$25,$27,$F8,$00\r
+       .DB     $F8,$A8,$AA,$A9,$88,$00\r
+       .DB     $68,$A8,$F8,$A8,$B0,$00\r
+       .DB     $FC,$12,$FE,$92,$92,$00\r
+       .DB     $70,$8A,$89,$8A,$70,$00\r
+       .DB     $72,$88,$88,$88,$72,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$82,$81,$42,$F8,$00\r
+       .DB     $78,$81,$82,$40,$F8,$00\r
+       .DB     $7A,$80,$80,$80,$FA,$00\r
+       .DB     $79,$84,$84,$84,$79,$00\r
+       .DB     $7D,$80,$80,$80,$7D,$00\r
+       .DB     $70,$88,$88,$FC,$88,$00\r
+       .DB     $90,$7C,$92,$92,$C4,$00\r
+       .DB     $52,$54,$F8,$54,$52,$00\r
+       .DB     $82,$82,$44,$44,$28,$28\r
+       .DB     $10,$10,$28,$54,$54,$28\r
+       .DB     $40,$A8,$AA,$A9,$F0,$00\r
+       .DB     $00,$8A,$F9,$80,$00,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$80,$82,$41,$F8,$00\r
+       .DB     $FA,$11,$0A,$09,$F0,$00\r
+       .DB     $FA,$11,$22,$41,$F8,$00\r
+       .DB     $90,$AA,$AA,$AA,$BC,$00\r
+       .DB     $9C,$A2,$A2,$A2,$9C,$00\r
+       .DB     $60,$90,$8A,$80,$40,$00\r
+       .DB     $FE,$02,$02,$02,$02,$02\r
+       .DB     $02,$02,$02,$02,$02,$FE\r
+       .DB     $2F,$10,$48,$24,$C0,$00\r
+       .DB     $2F,$90,$48,$E4,$00,$00\r
+       .DB     $00,$00,$F2,$00,$00,$00\r
+       .DB     $FE,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$80,$80,$80,$FE\r
+       .DB     $00,$80,$00,$00,$80,$00\r
+       .DB     $55,$AA,$55,$AA,$55,$AA\r
+       .DB     $33,$CC,$33,$CC,$33,$CC\r
+       .DB     $00,$00,$FF,$00,$00,$00\r
+       .DB     $10,$10,$FF,$00,$00,$00\r
+       .DB     $28,$28,$FF,$00,$00,$00\r
+       .DB     $10,$FF,$00,$FF,$00,$00\r
+       .DB     $10,$F0,$10,$F0,$00,$00\r
+       .DB     $28,$28,$F8,$00,$00,$00\r
+       .DB     $28,$EF,$00,$FF,$00,$00\r
+       .DB     $00,$FF,$00,$FF,$00,$00\r
+       .DB     $28,$E8,$08,$F8,$00,$00\r
+       .DB     $28,$2F,$20,$3F,$00,$00\r
+       .DB     $10,$1F,$10,$1F,$00,$00\r
+       .DB     $28,$28,$3F,$00,$00,$00\r
+       .DB     $10,$10,$F0,$00,$00,$00\r
+       .DB     $00,$00,$1F,$10,$10,$10\r
+       .DB     $10,$10,$1F,$10,$10,$10\r
+       .DB     $10,$10,$F0,$10,$10,$10\r
+       .DB     $00,$00,$FF,$10,$10,$10\r
+       .DB     $10,$10,$10,$10,$10,$10\r
+       .DB     $10,$10,$FF,$10,$10,$10\r
+       .DB     $00,$00,$FF,$28,$28,$28\r
+       .DB     $00,$FF,$00,$FF,$10,$10\r
+       .DB     $00,$3F,$20,$2F,$28,$28\r
+       .DB     $00,$F8,$08,$E8,$28,$28\r
+       .DB     $28,$2F,$20,$2F,$28,$28\r
+       .DB     $28,$E8,$08,$E8,$28,$28\r
+       .DB     $00,$FF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$28,$28,$28,$28\r
+       .DB     $28,$EF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$2F,$28,$28,$28\r
+       .DB     $10,$1F,$10,$1F,$10,$10\r
+       .DB     $28,$28,$E8,$28,$28,$28\r
+       .DB     $10,$F0,$10,$F0,$10,$10\r
+       .DB     $00,$1F,$10,$1F,$10,$10\r
+       .DB     $00,$00,$3F,$28,$28,$28\r
+       .DB     $00,$00,$F8,$28,$28,$28\r
+       .DB     $00,$F0,$10,$F0,$10,$10\r
+       .DB     $10,$FF,$10,$FF,$10,$10\r
+       .DB     $28,$28,$FF,$28,$28,$28\r
+       .DB     $10,$10,$1F,$00,$00,$00\r
+       .DB     $00,$00,$F0,$10,$10,$10\r
+       .DB     $FF,$FF,$FF,$FF,$FF,$FF\r
+       .DB     $E0,$E0,$E0,$E0,$E0,$E0\r
+       .DB     $FF,$FF,$FF,$00,$00,$00\r
+       .DB     $00,$00,$00,$FF,$FF,$FF\r
+       .DB     $1F,$1F,$1F,$1F,$1F,$1F\r
+       .DB     $70,$88,$88,$70,$88,$00\r
+       .DB     $FC,$02,$92,$92,$6C,$00\r
+       .DB     $FE,$02,$02,$02,$06,$00\r
+       .DB     $08,$F8,$08,$F8,$08,$00\r
+       .DB     $C6,$AA,$92,$82,$C6,$00\r
+       .DB     $70,$88,$88,$78,$08,$00\r
+       .DB     $00,$F8,$80,$80,$78,$00\r
+       .DB     $10,$08,$F0,$08,$00,$00\r
+       .DB     $10,$AA,$EE,$AA,$10,$00\r
+       .DB     $7C,$92,$92,$92,$7C,$00\r
+       .DB     $9C,$E2,$02,$E2,$9C,$00\r
+       .DB     $60,$94,$9A,$92,$60,$00\r
+       .DB     $70,$88,$70,$88,$70,$00\r
+       .DB     $70,$88,$FC,$88,$70,$00\r
+       .DB     $38,$54,$92,$92,$00,$00\r
+       .DB     $FC,$02,$02,$02,$FC,$00\r
+       .DB     $54,$54,$54,$54,$54,$00\r
+       .DB     $88,$88,$BE,$88,$88,$00\r
+       .DB     $A2,$A2,$94,$94,$88,$00\r
+       .DB     $88,$94,$94,$A2,$A2,$00\r
+       .DB     $00,$00,$F8,$04,$08,$00\r
+       .DB     $40,$80,$7F,$00,$00,$00\r
+       .DB     $10,$10,$54,$10,$10,$00\r
+       .DB     $48,$24,$48,$24,$00,$00\r
+       .DB     $0C,$12,$12,$0C,$00,$00\r
+       .DB     $00,$18,$18,$00,$00,$00\r
+       .DB     $00,$00,$10,$00,$00,$00\r
+       .DB     $20,$40,$FF,$01,$01,$00\r
+       .DB     $1F,$02,$01,$1E,$00,$00\r
+       .DB     $00,$12,$19,$16,$00,$00\r
+       .DB     $00,$38,$38,$38,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$02,$02,$02,$01,$00\r
+       .DB     $01,$02,$02,$01,$00,$00\r
+       .DB     $03,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$03,$00\r
+       .DB     $00,$00,$02,$03,$02,$00\r
+       .DB     $00,$01,$01,$03,$01,$00\r
+       .DB     $00,$00,$01,$00,$00,$00\r
+       .DB     $00,$00,$00,$01,$00,$00\r
+       .DB     $02,$01,$00,$00,$00,$00\r
+       .DB     $00,$02,$01,$00,$00,$00\r
+       .DB     $00,$00,$02,$01,$00,$00\r
+       .DB     $00,$01,$00,$00,$00,$00\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4106                   ; HARDWARE ADDRESS COMMAND\r
+       .DW     $4204                   ; SOFTWARE ADDRESS COMMAND\r
+       .DW     $ACBA                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/m192ter.asm b/src/avr/m192ter.asm
new file mode 100644 (file)
index 0000000..ae477c3
--- /dev/null
@@ -0,0 +1,1685 @@
+;      M192TER.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+;.INCLUDE "API.INC"\r
+.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =6              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F ;$11       ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05 ;$11       ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =30             ; 240 / 8 = 30 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =40             ; 240 / 6 = 40 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =5              ; 40 / 8  = 5 TEXT WIDTH FLAGS\r
+\r
+.EQU   TIME_EMERGENCY  =1000           ; 1000 * 0.1 MS = APPROX 100 MS\r
+\r
+.EQU   FEED_INITIAL    =2              ; LINES ALLOWED FOR MOTOR SLOWDOWN\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED IN BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   TP_COUNT        =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   NOTIFY_COUNT    =R14            ; COUNTER TO SEND EVERY 6.5536 SECONDS\r
+.DEF   ABORT_COUNT     =R15            ; COUNTER TO ABORT ESC AFTER 0.1 SECS\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   SR              =R23\r
+.DEF   FLAGS           =R24\r
+.DEF   STATUS          =R25\r
+\r
+.EQU   TX_SIZE         =2\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_CHARS+WIDTH_FLAGS\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   RSWSAVE         =2              ; SET IF RSW HI, MUST BE BIT POSITION 2\r
+.EQU   IMAGE           =3              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =4              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+;.EQU  NODESC          =5              ; SET BY FG WHILE PRINTING TOP 7 DOTS\r
+;.EQU  BIGDESC         =6              ; SET BY FG WHILE PRINTING LOWER 2 DOTS\r
+.EQU   BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY FG JUST PRIOR TO NOTIFICATION\r
+.EQU   TP_ERROR        =2              ; SET BY BG IF WE HAVE TIMEOUT ON TP\r
+.EQU   RSW_ERROR       =3              ; SET BY BG IF WE HAVE TIMEOUT ON RSW\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; NODESC\r
+\r
+; FLAG RESET BY FOREGROUND AFTER DESCENDER TRANSLATION, IF DESCENDERS PRESENT.\r
+; FLAG SET BY FOREGROUND AFTER DESCENDERS FINISHED AND BUFFER CLOBBERED.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE, FOR SPECIAL DESCENDER\r
+; PROCESSING.\r
+\r
+; BIGDESC\r
+\r
+; FLAG SET UP BY FOREGROUND DURING DESCENDER TRANSLATION.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE IN COMBINATION WITH\r
+; TEXT_MASK, TO CONTINUE DESCENDER OR REVERT TO FEEDS.\r
+\r
+; NOWFAST\r
+\r
+; FLAG SET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 115200 BPS.\r
+; FLAG RESET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 4800 BPS.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT1ADDR\r
+       RJMP    TP_EDGE         ; EXTERNAL INT 1 HANDLER\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','1','9','2',' '\r
+;      .DB     'P','R','I','N','T','E','R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP EDGE INTERRUPT HANDLER\r
+\r
+TP_EDGE:\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       IN      D,MCUCR\r
+       SBRS    D,ISC10\r
+       CBI     PORTB,2                 ; IF WE WERE LOOKING FOR A FALLING EDGE\r
+       SBRC    D,ISC10\r
+       SBI     PORTB,2                 ; IF WE WERE LOOKING FOR A RISING EDGE\r
+       LDI     G,1<<ISC10\r
+       EOR     D,G\r
+       OUT     MCUCR,D                 ; START LOOKING FOR THE OPPOSITE EDGE\r
+\r
+       LDI     D,1<<INTF1\r
+       OUT     GIFR,D\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+TP_DONE:\r
+       LDI     D,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,D                ; RELOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR FEEDING\r
+\r
+TP_HALT:\r
+       SBR     STATUS,1<<RSW_ERROR     ; SAY WE HAD TIMEOUT ON RSW\r
+\r
+TP_KILL:\r
+       LDI     D,1<<TOIE0\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 OVERFLOW INTERRUPTS\r
+\r
+       CBI     PORTC,4                 ; MOTOR OFF\r
+       CBR     STATUS,1<<MOTOR         ; SAY MOTOR IS OFF\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+; ON ENTRY TO HERE, LOAD E WITH PREVIOUS RSW STATE, DON'T USE FLAGS\r
+\r
+TP_SEARCH:\r
+       RCALL   TP_DONE\r
+\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO RSW\r
+       BREQ    TP_HALT\r
+\r
+       IN      D,PIND                  ; D.2 = CURRENT RSW STATE\r
+       MOV     G,FLAGS                 ; G.2 = PREVIOUS RSW STATE\r
+       BST     D,2\r
+       BLD     FLAGS,2                 ; SAVE CURRENT RSW STATE FOR NEXT TIME\r
+       EOR     D,G                     ; D.2 = 1 IF RSW CHANGED\r
+       AND     D,G                     ; D.2 = 1 IF RSW CHANGED HIGH -> LOW\r
+\r
+       SBRS    D,2\r
+       RJMP    TP_SEARCH\r
+\r
+       ; RSW FALLING EDGE DETECTED\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    TP_FEED                 ; YES, GO AND PRINT\r
+\r
+       ; WE STOPPED THE MOTOR, MONITOR RSW WHILE IT SLOWS DOWN\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       TST     FEEDS\r
+       BREQ    TP_SEARCH\r
+       DEC     FEEDS                   ; DECREMENT FEEDS TO MINIMUM OF 0\r
+       RJMP    TP_SEARCH\r
+\r
+TP_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       MOV     D,TP_COUNT\r
+       CPI     D,3\r
+       BRSH    TP_PAPER_SKIP           ; ON LAST OR 2ND LAST TP EDGE,\r
+\r
+       SBIC    PORTB,2\r
+       RJMP    TP_PAPER_SKIP           ; WITH TP GENERATOR IN KNOWN STATE,\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     A,0\r
+       OUT     GIMSK,A                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       ;CBI    PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-3\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+\r
+TP_PAPER_SKIP:\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_COAST\r
+\r
+TP_FEED:\r
+       ;SBRS   STATUS,PAPER            ; PAPER IN?\r
+       ;RJMP   TP_BRAKE_NOW            ; NO, STOP PRINTING IMMEDIATELY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE); GOT SOMETHING TO PRINT?\r
+       BREQ    TP_BRAKE                ; NO, FULL NUMBER OF FEEDS-3 THEN STOP\r
+                                       ; YES, FULL NUMBER OF FEEDS THEN PRINT\r
+       MOV     D,FEEDS\r
+       CPI     D,3\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3 INTERNAL FEEDS\r
+       CPI     D,1\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1 INTERNAL FEED\r
+\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    TP_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       RJMP    TP_PRINT_TEXT           ; OTHERWISE ASSUME TEXT IS WAITING\r
+\r
+TP_BRAKE:\r
+       MOV     D,FEEDS\r
+       CPI     D,3+FEED_INITIAL\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3+n INTERNAL FEEDS\r
+       CPI     D,1+FEED_INITIAL\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1+n INTERNAL FEED\r
+\r
+TP_BRAKE_NOW:\r
+;      TST     FEEDS                   ; JUST MISSED RSW -> 0, COMPENSATE\r
+;      BREQ    TP_BRAKE_NOW_CONT\r
+;      DEC     FEEDS                   ; DECREMENT TO MINIMUM OF 0\r
+;TP_BRAKE_NOW_CONT:\r
+       CLR     FEEDS\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+TP_FEED_SLOW:\r
+       DEC     FEEDS\r
+\r
+       LDI     D,150\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+TP_FEED_FAST:                          ; AT PRINTABLE AREA-2\r
+       SUBI    D,3\r
+       MOV     FEEDS,D\r
+\r
+       SBI     PORTB,0                 ; APPLY TRIGGER SOLENOID\r
+\r
+       LDI     D,9\r
+       MOV     TP_COUNT,D\r
+TP_TRIGGERING:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT\r
+       BRNE    TP_TRIGGERING\r
+\r
+       CBI     PORTB,0                 ; CLEAR TRIGGER SOLENOID\r
+\r
+       LDI     D,150-9\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR TEXT PRINTING\r
+\r
+; TP_TEXT_START DOES NOT RE-ENABLE ACCESS TO FEEDS.\r
+; FEEDS IS USED AS A COUNTER FOR DESCENDER PRINTING,\r
+; SO WE RELY ON TIMER_COPY TO RESET NOFEED, AFTER THE\r
+; LINE HAS BEEN CHECKED FOR DESCENDERS AND IS ABOUT TO\r
+; BE CLOBBERED BY NEW DATA.\r
+\r
+TP_PRINT_TEXT:\r
+       LDI     D,2\r
+       MOV     TEXT_MASK,D\r
+       MOV     FEEDS,SPACING           ; SET UP STANDARD FEED AFTER TEXT LINE\r
+\r
+TP_PRINT_TEXT_START:\r
+       LDI     E,0                     ; CURRENT CHARACTER FOR PRINT HEAD, 0-4\r
+\r
+TP_PRINT_TEXT_CHAR:\r
+       LDI     F,0                     ; CURRENT PIXEL FOR CHARACTER, 0-5\r
+\r
+TP_PRINT_TEXT_PIXEL:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-30                   ; E = CURRENT CHARACTER + 30\r
+       RCALL   TP_TEXT_FIRE2\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 15\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-35                   ; E = CURRENT CHARACTER + 35\r
+       RCALL   TP_TEXT_FIRE1\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 20\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 5\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-20                   ; E = CURRENT CHARACTER + 25\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 10\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       SUBI    E,10                    ; E = CURRENT CHARACTER\r
+\r
+       INC     F                       ; NEXT PIXEL FOR CHARACTER\r
+       CPI     F,6                     ; GONE PAST LAST PIXEL FOR CHARACTER?\r
+       BRLO    TP_PRINT_TEXT_PIXEL     ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       INC     E                       ; NEXT CHARACTER FOR PRINT HEAD\r
+       CPI     E,5                     ; GONE PAST LAST CHAR FOR PRINT HEAD?\r
+       BRLO    TP_PRINT_TEXT_CHAR      ; REPEAT UNLESS ALL CHARACTERS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       SBRC    TEXT_MASK,7             ; LAST DOT LINE FOR CHARACTER LINE?\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       ; COMPLICATED DESCENDER LOGIC\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_PRINT_TEXT_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_PRINT_TEXT_COAST\r
+\r
+       LSL     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       BRCS    GO_TP_FEED\r
+       RJMP    TP_PRINT_TEXT_START     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_TP_FEED:\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_TEXT_FIRE3:\r
+       LSL     H\r
+TP_TEXT_FIRE2:\r
+       LSL     H\r
+TP_TEXT_FIRE1:\r
+       LSL     H\r
+\r
+       TST     E                       ; FIRST FLAG BIT FOR LINE?\r
+       LDS     D,PRINT_BUF\r
+       BREQ    TP_TEXT_SETUP_CONT      ; WITH CF = 0, D = FIRST FLAG BYTE\r
+\r
+       MOV     G,E\r
+       DEC     G                       ; BACK 1 FLAG BIT\r
+       ANDI    G,7\r
+       INC     G                       ; G = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       MOV     ZL,E\r
+       DEC     ZL                      ; BACK 1 FLAG BIT\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-(PRINT_BUF+1)       ; THEN FORWARD 1 FLAG BYTE\r
+       CLR     ZH\r
+       LD      D,Z\r
+       ROR     D                       ; CF = BIT 0 OF SUBSEQUENT FLAG BYTE\r
+       DEC     ZL\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+T0_TEXT_SETUP_FLAG:\r
+       ROR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_TEXT_SETUP_FLAG\r
+\r
+TP_TEXT_SETUP_CONT:\r
+       PUSH    F\r
+       BRCS    T0_TEXT_SETUP_RWIDE\r
+       ROR     D\r
+       BRCC    T0_TEXT_SETUP_NARROW\r
+;T0_TEXT_SETUP_LWIDE:\r
+       SUBI    F,6\r
+T0_TEXT_SETUP_RWIDE:\r
+       SUBI    F,-6\r
+       LSR     F\r
+T0_TEXT_SETUP_NARROW:\r
+       RCALL   LOOKUP_CHAR             ; GET R0 = VERTICAL SLICE OF CHAR\r
+       POP     F\r
+\r
+       AND     R0,TEXT_MASK\r
+       BREQ    TP_TEXT_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_TEXT_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR GRAPHICS PRINTING\r
+\r
+TP_PRINT_IMAGE:\r
+       CLR     F\r
+\r
+TP_IMAGE_PIXEL:\r
+       LDI     D,180\r
+       RCALL   TP_IMAGE_FIRE2\r
+       LDI     D,90\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,0\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,210\r
+       RCALL   TP_IMAGE_FIRE1\r
+       LDI     D,120\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,30\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,150\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,60\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       INC     F                       ; NEXT PIXEL FOR PRINT HEAD\r
+       MOV     D,F\r
+       CPI     D,30                    ; GONE PAST LAST PIXEL FOR PRINT HEAD?\r
+       BRLO    TP_IMAGE_PIXEL          ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_IMAGE_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_IMAGE_COAST\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_IMAGE_FIRE3:\r
+       LSL     H\r
+TP_IMAGE_FIRE2:\r
+       LSL     H\r
+TP_IMAGE_FIRE1:\r
+       LSL     H\r
+\r
+       ADD     D,F                     ; PIXEL ADDRESS\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,D\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = IMAGE BYTE\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ANDI    D,$07\r
+       INC     D\r
+TP_IMAGE_FIRE_SHIFT:\r
+       LSL     E                       ; AT LEAST ONCE\r
+       DEC     D\r
+       BRNE    TP_IMAGE_FIRE_SHIFT\r
+\r
+       BRCC    TP_IMAGE_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_IMAGE_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_LATCH2:\r
+       LSL     H\r
+TP_LATCH1:\r
+       LSL     H\r
+TP_LATCH0:\r
+       SWAP    H                       ; PUT BITS IN POSITION\r
+\r
+       IN      D,PORTD\r
+       EOR     D,H\r
+       ANDI    D,$0F\r
+       EOR     D,H\r
+       OUT     PORTD,D                 ; PLACE ORIGINAL LOWER 4 BITS ON D4-D7\r
+\r
+       IN      D,PORTC\r
+       EOR     D,H\r
+       ANDI    D,$F0\r
+       EOR     D,H\r
+       OUT     PORTC,D                 ; PLACE ORIGINAL UPPER 4 BITS ON C0-C3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; TRANSFER TO D4-D7 AND C0-C3\r
+\r
+       SBR     STATUS,1<<TP_ERROR      ; SAY WE HAD TIMEOUT ON TP\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 3\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 6\r
+\r
+       ADD     ZL,F\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 6 + SLICE INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*6)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*6)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       LPM                             ; R0 = CORRECT VERTICAL SLICE OF CHAR\r
+       RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 8\r
+       SUB     ZL,D                    ; ZL = CHARACTER DEFINITION * 7\r
+       ;CLR    ZH\r
+\r
+       SUBI    ZL,-(EE_COUNT*2+2)      ; PAST CRC, COUNT, AND CHARACTER CODE\r
+       ADD     ZL,F                    ; ZL = BASE + CHAR * 6 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      R0,EEDR                 ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+       SBRC    FLAGS,BOMB\r
+       RJMP    TEXT_RESET\r
+\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       CLR     NOTIFY_COUNT            ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+       CBR     STATUS,1<<NOTIFY        ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    RX_CHAR_CONT\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+\r
+       ;MAPI_TIMER\r
+\r
+       TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+       BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+\r
+       DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+       BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       SBIC    DDRB,1                  ; LED ON?\r
+       RJMP    T0_PAPER_TEST           ; YES, GO AND TEST OPTOCOUPLER INPUT\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    API_DONE                ; YES, RELY ON TP_EDGE TO TEST PAPER\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     D,0\r
+       OUT     GIMSK,D                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       CBI     PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-2\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_TEST:\r
+       LDI     D,1<<INT1\r
+       OUT     GIMSK,D                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,D                  ; CLEAR PENDING INT 1 FROM PAPER TEST\r
+\r
+       INC     NOTIFY_COUNT\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       SBR     FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       SBR     STATUS,1<<NOTIFY        ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      D,PINC                  ; SAMPLE D5 STATE\r
+       CBI     DDRB,1                  ; B1 = TRI-STATE TO EXTINGUISH LED\r
+\r
+       SBRS    D,5\r
+       RJMP    T0_PAPER_IN             ; D5 = 0, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; D5 = 1, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   API_DONE\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       SBRC    STATUS,PAPER\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       CBR     STATUS,1<<PAPER         ; SAY PAPER IS OUT\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER\r
+       RJMP    API_DONE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       PUSH    A ; SLIGHTLY DODGY\r
+       RCALL   MOTOR_START             ; NORMALLY CALLED FROM FOREGROUND\r
+       POP     A\r
+\r
+       SBR     STATUS,(1<<PAPER) | (1<<NOTIFY) ; SAY PAPER IS IN, MUST SEND\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = PULL UP FOR RSW SWITCH\r
+       SBI     DDRB,2                  ; B2 = OUTPUT FOR TP GENERATOR\r
+\r
+       SBI     DDRB,0                  ; B0 = OUTPUT FOR TRG\r
+       LDI     A,$1F                   ; C5 = TRI-STATE FOR OPTOCOUPLER\r
+       OUT     DDRC,A                  ; C0-C4 = OUTPUTS FOR HE-HH, MSTR\r
+       ;SBI    PORTC,5                 ; C5 = PULLED UP INPUT FOR OPTOCOUPLER\r
+       LDI     A,$F0\r
+       OUT     DDRD,A                  ; D4-D7 = OUTPUTS FOR HA-HD\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW\r
+       LDI     STATUS,1<<PAPER\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A\r
+\r
+;      LDI     A,FEED_INITIAL\r
+;      MOV     FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       CLR     NOTIFY_COUNT\r
+       DEC     NOTIFY_COUNT            ; NEXT NOTIFICATION IMMEDIATELY\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,5                     ; TIMER0 TICK = APPROX 0.1 MS\r
+       OUT     TCCR0,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(TP_SEARCH)\r
+       LDI     H,HIGH(TP_SEARCH)       ; TP_SEARCH NEXT INTERRUPT\r
+\r
+       LDI     A,1<<ISC11 | 1<<ISC10\r
+       OUT     MCUCR,A                 ; INT 1 ON RISING EDGE\r
+       LDI     A,1<<INT1\r
+       OUT     GIMSK,A                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,A                  ; CLEAR ANY PENDING INT 1\r
+\r
+       LDI     A,5\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 MS\r
+\r
+       LDI     A,1<<TOIE0\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_RESET:\r
+       ; ENTRY POINT FROM RX_WAIT\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+       CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       SBR     FLAGS,1<<TEXT\r
+       RCALL   MOTOR_START\r
+\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+       OR      A,YL\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF LINES = 0\r
+\r
+       TST     R0\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF WIDTH = 0\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+       RCALL   MOTOR_START\r
+\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+GO_TEXT_RECEIVE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH*2          ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     XL,$21\r
+       LDI     XH,$10                  ; X = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,XL\r
+       EOR     YH,XH\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_FEEDS:\r
+       PUSH    A\r
+       ADD     A,FEEDS\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS\r
+\r
+       ADD     FEEDS,A\r
+\r
+MOTOR_START:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RET\r
+\r
+       SBIC    PORTC,4\r
+       RET\r
+\r
+       CBR     FLAGS,1<<RSWSAVE\r
+       SBI     PORTC,4                 ; MOTOR ON\r
+       SBR     STATUS,(1<<MOTOR) | (1<<NOTIFY) ; SAY MOTOR IS ON AND MUST SEND\r
+\r
+       LDI     A,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,A                ; LOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       LDI     A,1<<TOIE1\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,(1<<TOIE1) | (1<<TOIE0)\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 1 OVERFLOW INTERRUPTS\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-7\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$9E,$00,$00,$00\r
+       .DB     $00,$0E,$00,$0E,$00,$00\r
+       .DB     $28,$FE,$28,$FE,$28,$00\r
+       .DB     $4C,$92,$FF,$92,$64,$00\r
+       .DB     $46,$26,$10,$C8,$C4,$00\r
+       .DB     $6C,$92,$AA,$44,$A0,$00\r
+       .DB     $00,$0B,$07,$00,$00,$00\r
+       .DB     $00,$38,$44,$82,$00,$00\r
+       .DB     $00,$82,$44,$38,$00,$00\r
+       .DB     $28,$10,$7C,$10,$28,$00\r
+       .DB     $10,$10,$7C,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $10,$10,$10,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $40,$20,$10,$08,$04,$00\r
+       .DB     $7C,$A2,$92,$8A,$7C,$00\r
+       .DB     $00,$84,$FE,$80,$00,$00\r
+       .DB     $84,$C2,$A2,$92,$8C,$00\r
+       .DB     $42,$82,$8A,$96,$62,$00\r
+       .DB     $30,$28,$24,$FE,$20,$00\r
+       .DB     $4E,$8A,$8A,$8A,$72,$00\r
+       .DB     $78,$94,$92,$92,$60,$00\r
+       .DB     $02,$E2,$12,$0A,$06,$00\r
+       .DB     $6C,$92,$92,$92,$6C,$00\r
+       .DB     $0C,$92,$92,$52,$3C,$00\r
+       .DB     $00,$6C,$6C,$00,$00,$00\r
+       .DB     $00,$6C,$EC,$00,$00,$00\r
+       .DB     $10,$28,$44,$82,$00,$00\r
+       .DB     $28,$28,$28,$28,$28,$00\r
+       .DB     $00,$82,$44,$28,$10,$00\r
+       .DB     $04,$02,$A2,$12,$0C,$00\r
+       .DB     $7C,$82,$BA,$AA,$3C,$00\r
+       .DB     $FC,$22,$22,$22,$FC,$00\r
+       .DB     $FE,$92,$92,$92,$6C,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $FE,$82,$82,$44,$38,$00\r
+       .DB     $FE,$92,$92,$92,$82,$00\r
+       .DB     $FE,$12,$12,$12,$02,$00\r
+       .DB     $7C,$82,$92,$92,$F4,$00\r
+       .DB     $FE,$10,$10,$10,$FE,$00\r
+       .DB     $00,$82,$FE,$82,$00,$00\r
+       .DB     $40,$80,$82,$7E,$02,$00\r
+       .DB     $FE,$10,$28,$44,$82,$00\r
+       .DB     $FE,$80,$80,$80,$80,$00\r
+       .DB     $FE,$04,$18,$04,$FE,$00\r
+       .DB     $FE,$08,$10,$20,$FE,$00\r
+       .DB     $7C,$82,$82,$82,$7C,$00\r
+       .DB     $FE,$12,$12,$12,$0C,$00\r
+       .DB     $7C,$82,$A2,$42,$BC,$00\r
+       .DB     $FE,$12,$32,$52,$8C,$00\r
+       .DB     $4C,$92,$92,$92,$64,$00\r
+       .DB     $02,$02,$FE,$02,$02,$00\r
+       .DB     $7E,$80,$80,$80,$7E,$00\r
+       .DB     $3E,$40,$80,$40,$3E,$00\r
+       .DB     $7E,$80,$70,$80,$7E,$00\r
+       .DB     $C6,$28,$10,$28,$C6,$00\r
+       .DB     $0E,$10,$E0,$10,$0E,$00\r
+       .DB     $C2,$A2,$92,$8A,$86,$00\r
+       .DB     $00,$FE,$82,$82,$00,$00\r
+       .DB     $04,$08,$10,$20,$40,$00\r
+       .DB     $00,$82,$82,$FE,$00,$00\r
+       .DB     $08,$04,$02,$04,$08,$00\r
+       .DB     $80,$80,$80,$80,$80,$00\r
+       .DB     $00,$00,$0E,$0D,$00,$00\r
+       .DB     $40,$A8,$A8,$A8,$F0,$00\r
+       .DB     $FE,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$88,$88,$88,$FE,$00\r
+       .DB     $70,$A8,$A8,$A8,$30,$00\r
+       .DB     $08,$08,$FC,$0A,$0A,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $FE,$10,$08,$08,$F0,$00\r
+       .DB     $00,$88,$FA,$80,$00,$00\r
+       .DB     $00,$00,$08,$FA,$00,$00\r
+       .DB     $FE,$20,$50,$88,$00,$00\r
+       .DB     $00,$82,$FE,$80,$00,$00\r
+       .DB     $F8,$08,$F8,$08,$F0,$00\r
+       .DB     $F8,$10,$08,$08,$F0,$00\r
+       .DB     $70,$88,$88,$88,$70,$00\r
+       .DB     $F8,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $F8,$10,$08,$08,$00,$00\r
+       .DB     $90,$A8,$A8,$A8,$48,$00\r
+       .DB     $08,$08,$7E,$88,$88,$00\r
+       .DB     $78,$80,$80,$40,$F8,$00\r
+       .DB     $38,$40,$80,$40,$38,$00\r
+       .DB     $78,$80,$60,$80,$78,$00\r
+       .DB     $88,$50,$20,$50,$88,$00\r
+       .DB     $78,$80,$80,$80,$F8,$00\r
+       .DB     $88,$C8,$A8,$98,$88,$00\r
+       .DB     $10,$6C,$82,$82,$00,$00\r
+       .DB     $00,$00,$EE,$00,$00,$00\r
+       .DB     $00,$82,$82,$6C,$10,$00\r
+       .DB     $04,$02,$04,$08,$04,$00\r
+       .DB     $E0,$90,$88,$90,$E0,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $7A,$80,$80,$40,$FA,$00\r
+       .DB     $70,$A8,$AA,$A9,$30,$00\r
+       .DB     $40,$AA,$A9,$AA,$F0,$00\r
+       .DB     $42,$A8,$A8,$A8,$F2,$00\r
+       .DB     $40,$A9,$AA,$A8,$F0,$00\r
+       .DB     $40,$AE,$AA,$AE,$F0,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$AA,$A9,$AA,$30,$00\r
+       .DB     $72,$A8,$A8,$A8,$32,$00\r
+       .DB     $70,$A9,$AA,$A8,$30,$00\r
+       .DB     $02,$88,$F8,$80,$02,$00\r
+       .DB     $00,$8A,$F9,$82,$00,$00\r
+       .DB     $00,$89,$FA,$80,$00,$00\r
+       .DB     $F9,$24,$24,$24,$F9,$00\r
+       .DB     $F8,$27,$25,$27,$F8,$00\r
+       .DB     $F8,$A8,$AA,$A9,$88,$00\r
+       .DB     $68,$A8,$F8,$A8,$B0,$00\r
+       .DB     $FC,$12,$FE,$92,$92,$00\r
+       .DB     $70,$8A,$89,$8A,$70,$00\r
+       .DB     $72,$88,$88,$88,$72,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$82,$81,$42,$F8,$00\r
+       .DB     $78,$81,$82,$40,$F8,$00\r
+       .DB     $7A,$80,$80,$80,$FA,$00\r
+       .DB     $79,$84,$84,$84,$79,$00\r
+       .DB     $7D,$80,$80,$80,$7D,$00\r
+       .DB     $70,$88,$88,$FC,$88,$00\r
+       .DB     $90,$7C,$92,$92,$C4,$00\r
+       .DB     $52,$54,$F8,$54,$52,$00\r
+       .DB     $82,$82,$44,$44,$28,$28\r
+       .DB     $10,$10,$28,$54,$54,$28\r
+       .DB     $40,$A8,$AA,$A9,$F0,$00\r
+       .DB     $00,$8A,$F9,$80,$00,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$80,$82,$41,$F8,$00\r
+       .DB     $FA,$11,$0A,$09,$F0,$00\r
+       .DB     $FA,$11,$22,$41,$F8,$00\r
+       .DB     $90,$AA,$AA,$AA,$BC,$00\r
+       .DB     $9C,$A2,$A2,$A2,$9C,$00\r
+       .DB     $60,$90,$8A,$80,$40,$00\r
+       .DB     $FE,$02,$02,$02,$02,$02\r
+       .DB     $02,$02,$02,$02,$02,$FE\r
+       .DB     $2F,$10,$48,$24,$C0,$00\r
+       .DB     $2F,$90,$48,$E4,$00,$00\r
+       .DB     $00,$00,$F2,$00,$00,$00\r
+       .DB     $FE,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$80,$80,$80,$FE\r
+       .DB     $00,$80,$00,$00,$80,$00\r
+       .DB     $55,$AA,$55,$AA,$55,$AA\r
+       .DB     $33,$CC,$33,$CC,$33,$CC\r
+       .DB     $00,$00,$FF,$00,$00,$00\r
+       .DB     $10,$10,$FF,$00,$00,$00\r
+       .DB     $28,$28,$FF,$00,$00,$00\r
+       .DB     $10,$FF,$00,$FF,$00,$00\r
+       .DB     $10,$F0,$10,$F0,$00,$00\r
+       .DB     $28,$28,$F8,$00,$00,$00\r
+       .DB     $28,$EF,$00,$FF,$00,$00\r
+       .DB     $00,$FF,$00,$FF,$00,$00\r
+       .DB     $28,$E8,$08,$F8,$00,$00\r
+       .DB     $28,$2F,$20,$3F,$00,$00\r
+       .DB     $10,$1F,$10,$1F,$00,$00\r
+       .DB     $28,$28,$3F,$00,$00,$00\r
+       .DB     $10,$10,$F0,$00,$00,$00\r
+       .DB     $00,$00,$1F,$10,$10,$10\r
+       .DB     $10,$10,$1F,$10,$10,$10\r
+       .DB     $10,$10,$F0,$10,$10,$10\r
+       .DB     $00,$00,$FF,$10,$10,$10\r
+       .DB     $10,$10,$10,$10,$10,$10\r
+       .DB     $10,$10,$FF,$10,$10,$10\r
+       .DB     $00,$00,$FF,$28,$28,$28\r
+       .DB     $00,$FF,$00,$FF,$10,$10\r
+       .DB     $00,$3F,$20,$2F,$28,$28\r
+       .DB     $00,$F8,$08,$E8,$28,$28\r
+       .DB     $28,$2F,$20,$2F,$28,$28\r
+       .DB     $28,$E8,$08,$E8,$28,$28\r
+       .DB     $00,$FF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$28,$28,$28,$28\r
+       .DB     $28,$EF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$2F,$28,$28,$28\r
+       .DB     $10,$1F,$10,$1F,$10,$10\r
+       .DB     $28,$28,$E8,$28,$28,$28\r
+       .DB     $10,$F0,$10,$F0,$10,$10\r
+       .DB     $00,$1F,$10,$1F,$10,$10\r
+       .DB     $00,$00,$3F,$28,$28,$28\r
+       .DB     $00,$00,$F8,$28,$28,$28\r
+       .DB     $00,$F0,$10,$F0,$10,$10\r
+       .DB     $10,$FF,$10,$FF,$10,$10\r
+       .DB     $28,$28,$FF,$28,$28,$28\r
+       .DB     $10,$10,$1F,$00,$00,$00\r
+       .DB     $00,$00,$F0,$10,$10,$10\r
+       .DB     $FF,$FF,$FF,$FF,$FF,$FF\r
+       .DB     $E0,$E0,$E0,$E0,$E0,$E0\r
+       .DB     $FF,$FF,$FF,$00,$00,$00\r
+       .DB     $00,$00,$00,$FF,$FF,$FF\r
+       .DB     $1F,$1F,$1F,$1F,$1F,$1F\r
+       .DB     $70,$88,$88,$70,$88,$00\r
+       .DB     $FC,$02,$92,$92,$6C,$00\r
+       .DB     $FE,$02,$02,$02,$06,$00\r
+       .DB     $08,$F8,$08,$F8,$08,$00\r
+       .DB     $C6,$AA,$92,$82,$C6,$00\r
+       .DB     $70,$88,$88,$78,$08,$00\r
+       .DB     $00,$F8,$80,$80,$78,$00\r
+       .DB     $10,$08,$F0,$08,$00,$00\r
+       .DB     $10,$AA,$EE,$AA,$10,$00\r
+       .DB     $7C,$92,$92,$92,$7C,$00\r
+       .DB     $9C,$E2,$02,$E2,$9C,$00\r
+       .DB     $60,$94,$9A,$92,$60,$00\r
+       .DB     $70,$88,$70,$88,$70,$00\r
+       .DB     $70,$88,$FC,$88,$70,$00\r
+       .DB     $38,$54,$92,$92,$00,$00\r
+       .DB     $FC,$02,$02,$02,$FC,$00\r
+       .DB     $54,$54,$54,$54,$54,$00\r
+       .DB     $88,$88,$BE,$88,$88,$00\r
+       .DB     $A2,$A2,$94,$94,$88,$00\r
+       .DB     $88,$94,$94,$A2,$A2,$00\r
+       .DB     $00,$00,$F8,$04,$08,$00\r
+       .DB     $40,$80,$7F,$00,$00,$00\r
+       .DB     $10,$10,$54,$10,$10,$00\r
+       .DB     $48,$24,$48,$24,$00,$00\r
+       .DB     $0C,$12,$12,$0C,$00,$00\r
+       .DB     $00,$18,$18,$00,$00,$00\r
+       .DB     $00,$00,$10,$00,$00,$00\r
+       .DB     $20,$40,$FF,$01,$01,$00\r
+       .DB     $1F,$02,$01,$1E,$00,$00\r
+       .DB     $00,$12,$19,$16,$00,$00\r
+       .DB     $00,$38,$38,$38,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$02,$02,$02,$01,$00\r
+       .DB     $01,$02,$02,$01,$00,$00\r
+       .DB     $03,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$03,$00\r
+       .DB     $00,$00,$02,$03,$02,$00\r
+       .DB     $00,$01,$01,$03,$01,$00\r
+       .DB     $00,$00,$01,$00,$00,$00\r
+       .DB     $00,$00,$00,$01,$00,$00\r
+       .DB     $02,$01,$00,$00,$00,$00\r
+       .DB     $00,$02,$01,$00,$00,$00\r
+       .DB     $00,$00,$02,$01,$00,$00\r
+       .DB     $00,$01,$00,$00,$00,$00\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4107                   ; HARDWARE ADDRESS COMMAND\r
+       .DW     $4206                   ; SOFTWARE ADDRESS COMMAND\r
+       .DW     $ACBA                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/m192v0.asm b/src/avr/m192v0.asm
new file mode 100644 (file)
index 0000000..904f1f2
--- /dev/null
@@ -0,0 +1,1685 @@
+;      M192V0.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =6              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F ;$11       ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05 ;$11       ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =30             ; 240 / 8 = 30 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =40             ; 240 / 6 = 40 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =5              ; 40 / 8  = 5 TEXT WIDTH FLAGS\r
+\r
+.EQU   TIME_EMERGENCY  =1000           ; 1000 * 0.1 MS = APPROX 100 MS\r
+\r
+.EQU   FEED_INITIAL    =2              ; LINES ALLOWED FOR MOTOR SLOWDOWN\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED IN BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   TP_COUNT        =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   NOTIFY_COUNT    =R14            ; COUNTER TO SEND EVERY 6.5536 SECONDS\r
+.DEF   ABORT_COUNT     =R15            ; COUNTER TO ABORT ESC AFTER 0.1 SECS\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   SR              =R23\r
+.DEF   FLAGS           =R24\r
+.DEF   STATUS          =R25\r
+\r
+.EQU   TX_SIZE         =2\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_CHARS+WIDTH_FLAGS\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   RSWSAVE         =2              ; SET IF RSW HI, MUST BE BIT POSITION 2\r
+.EQU   IMAGE           =3              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =4              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+;.EQU  NODESC          =5              ; SET BY FG WHILE PRINTING TOP 7 DOTS\r
+;.EQU  BIGDESC         =6              ; SET BY FG WHILE PRINTING LOWER 2 DOTS\r
+.EQU   BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY FG JUST PRIOR TO NOTIFICATION\r
+.EQU   TP_ERROR        =2              ; SET BY BG IF WE HAVE TIMEOUT ON TP\r
+.EQU   RSW_ERROR       =3              ; SET BY BG IF WE HAVE TIMEOUT ON RSW\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; NODESC\r
+\r
+; FLAG RESET BY FOREGROUND AFTER DESCENDER TRANSLATION, IF DESCENDERS PRESENT.\r
+; FLAG SET BY FOREGROUND AFTER DESCENDERS FINISHED AND BUFFER CLOBBERED.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE, FOR SPECIAL DESCENDER\r
+; PROCESSING.\r
+\r
+; BIGDESC\r
+\r
+; FLAG SET UP BY FOREGROUND DURING DESCENDER TRANSLATION.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE IN COMBINATION WITH\r
+; TEXT_MASK, TO CONTINUE DESCENDER OR REVERT TO FEEDS.\r
+\r
+; NOWFAST\r
+\r
+; FLAG SET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 115200 BPS.\r
+; FLAG RESET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 4800 BPS.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT1ADDR\r
+       RJMP    TP_EDGE         ; EXTERNAL INT 1 HANDLER\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','1','9','2',' '\r
+;      .DB     'P','R','I','N','T','E','R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP EDGE INTERRUPT HANDLER\r
+\r
+TP_EDGE:\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       IN      D,MCUCR\r
+       SBRS    D,ISC10\r
+       CBI     PORTB,2                 ; IF WE WERE LOOKING FOR A FALLING EDGE\r
+       SBRC    D,ISC10\r
+       SBI     PORTB,2                 ; IF WE WERE LOOKING FOR A RISING EDGE\r
+       LDI     G,1<<ISC10\r
+       EOR     D,G\r
+       OUT     MCUCR,D                 ; START LOOKING FOR THE OPPOSITE EDGE\r
+\r
+       LDI     D,1<<INTF1\r
+       OUT     GIFR,D\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+TP_DONE:\r
+       LDI     D,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,D                ; RELOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR FEEDING\r
+\r
+TP_HALT:\r
+       SBR     STATUS,1<<RSW_ERROR     ; SAY WE HAD TIMEOUT ON RSW\r
+\r
+TP_KILL:\r
+       LDI     D,1<<TOIE0\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 OVERFLOW INTERRUPTS\r
+\r
+       CBI     PORTC,4                 ; MOTOR OFF\r
+       CBR     STATUS,1<<MOTOR         ; SAY MOTOR IS OFF\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+; ON ENTRY TO HERE, LOAD E WITH PREVIOUS RSW STATE, DON'T USE FLAGS\r
+\r
+TP_SEARCH:\r
+       RCALL   TP_DONE\r
+\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO RSW\r
+       BREQ    TP_HALT\r
+\r
+       IN      D,PIND                  ; D.2 = CURRENT RSW STATE\r
+       MOV     G,FLAGS                 ; G.2 = PREVIOUS RSW STATE\r
+       BST     D,2\r
+       BLD     FLAGS,2                 ; SAVE CURRENT RSW STATE FOR NEXT TIME\r
+       EOR     D,G                     ; D.2 = 1 IF RSW CHANGED\r
+       AND     D,G                     ; D.2 = 1 IF RSW CHANGED HIGH -> LOW\r
+\r
+       SBRS    D,2\r
+       RJMP    TP_SEARCH\r
+\r
+       ; RSW FALLING EDGE DETECTED\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    TP_FEED                 ; YES, GO AND PRINT\r
+\r
+       ; WE STOPPED THE MOTOR, MONITOR RSW WHILE IT SLOWS DOWN\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       TST     FEEDS\r
+       BREQ    TP_SEARCH\r
+       DEC     FEEDS                   ; DECREMENT FEEDS TO MINIMUM OF 0\r
+       RJMP    TP_SEARCH\r
+\r
+TP_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       MOV     D,TP_COUNT\r
+       CPI     D,3\r
+       BRSH    TP_PAPER_SKIP           ; ON LAST OR 2ND LAST TP EDGE,\r
+\r
+       SBIC    PORTB,2\r
+       RJMP    TP_PAPER_SKIP           ; WITH TP GENERATOR IN KNOWN STATE,\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     A,0\r
+       OUT     GIMSK,A                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       ;CBI    PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-3\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+\r
+TP_PAPER_SKIP:\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_COAST\r
+\r
+TP_FEED:\r
+       ;SBRS   STATUS,PAPER            ; PAPER IN?\r
+       ;RJMP   TP_BRAKE_NOW            ; NO, STOP PRINTING IMMEDIATELY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE); GOT SOMETHING TO PRINT?\r
+       BREQ    TP_BRAKE                ; NO, FULL NUMBER OF FEEDS-3 THEN STOP\r
+                                       ; YES, FULL NUMBER OF FEEDS THEN PRINT\r
+       MOV     D,FEEDS\r
+       CPI     D,3\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3 INTERNAL FEEDS\r
+       CPI     D,1\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1 INTERNAL FEED\r
+\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    TP_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       RJMP    TP_PRINT_TEXT           ; OTHERWISE ASSUME TEXT IS WAITING\r
+\r
+TP_BRAKE:\r
+       MOV     D,FEEDS\r
+       CPI     D,3+FEED_INITIAL\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3+n INTERNAL FEEDS\r
+       CPI     D,1+FEED_INITIAL\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1+n INTERNAL FEED\r
+\r
+TP_BRAKE_NOW:\r
+;      TST     FEEDS                   ; JUST MISSED RSW -> 0, COMPENSATE\r
+;      BREQ    TP_BRAKE_NOW_CONT\r
+;      DEC     FEEDS                   ; DECREMENT TO MINIMUM OF 0\r
+;TP_BRAKE_NOW_CONT:\r
+       CLR     FEEDS\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+TP_FEED_SLOW:\r
+       DEC     FEEDS\r
+\r
+       LDI     D,150\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+TP_FEED_FAST:                          ; AT PRINTABLE AREA-2\r
+       SUBI    D,3\r
+       MOV     FEEDS,D\r
+\r
+       SBI     PORTB,0                 ; APPLY TRIGGER SOLENOID\r
+\r
+       LDI     D,9\r
+       MOV     TP_COUNT,D\r
+TP_TRIGGERING:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT\r
+       BRNE    TP_TRIGGERING\r
+\r
+       CBI     PORTB,0                 ; CLEAR TRIGGER SOLENOID\r
+\r
+       LDI     D,150-9\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR TEXT PRINTING\r
+\r
+; TP_TEXT_START DOES NOT RE-ENABLE ACCESS TO FEEDS.\r
+; FEEDS IS USED AS A COUNTER FOR DESCENDER PRINTING,\r
+; SO WE RELY ON TIMER_COPY TO RESET NOFEED, AFTER THE\r
+; LINE HAS BEEN CHECKED FOR DESCENDERS AND IS ABOUT TO\r
+; BE CLOBBERED BY NEW DATA.\r
+\r
+TP_PRINT_TEXT:\r
+       LDI     D,2\r
+       MOV     TEXT_MASK,D\r
+       MOV     FEEDS,SPACING           ; SET UP STANDARD FEED AFTER TEXT LINE\r
+\r
+TP_PRINT_TEXT_START:\r
+       LDI     E,0                     ; CURRENT CHARACTER FOR PRINT HEAD, 0-4\r
+\r
+TP_PRINT_TEXT_CHAR:\r
+       LDI     F,0                     ; CURRENT PIXEL FOR CHARACTER, 0-5\r
+\r
+TP_PRINT_TEXT_PIXEL:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-30                   ; E = CURRENT CHARACTER + 30\r
+       RCALL   TP_TEXT_FIRE2\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 15\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-35                   ; E = CURRENT CHARACTER + 35\r
+       RCALL   TP_TEXT_FIRE1\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 20\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 5\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-20                   ; E = CURRENT CHARACTER + 25\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 10\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       SUBI    E,10                    ; E = CURRENT CHARACTER\r
+\r
+       INC     F                       ; NEXT PIXEL FOR CHARACTER\r
+       CPI     F,6                     ; GONE PAST LAST PIXEL FOR CHARACTER?\r
+       BRLO    TP_PRINT_TEXT_PIXEL     ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       INC     E                       ; NEXT CHARACTER FOR PRINT HEAD\r
+       CPI     E,5                     ; GONE PAST LAST CHAR FOR PRINT HEAD?\r
+       BRLO    TP_PRINT_TEXT_CHAR      ; REPEAT UNLESS ALL CHARACTERS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       SBRC    TEXT_MASK,7             ; LAST DOT LINE FOR CHARACTER LINE?\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       ; COMPLICATED DESCENDER LOGIC\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_PRINT_TEXT_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_PRINT_TEXT_COAST\r
+\r
+       LSL     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       BRCS    GO_TP_FEED\r
+       RJMP    TP_PRINT_TEXT_START     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_TP_FEED:\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_TEXT_FIRE3:\r
+       LSL     H\r
+TP_TEXT_FIRE2:\r
+       LSL     H\r
+TP_TEXT_FIRE1:\r
+       LSL     H\r
+\r
+       TST     E                       ; FIRST FLAG BIT FOR LINE?\r
+       LDS     D,PRINT_BUF\r
+       BREQ    TP_TEXT_SETUP_CONT      ; WITH CF = 0, D = FIRST FLAG BYTE\r
+\r
+       MOV     G,E\r
+       DEC     G                       ; BACK 1 FLAG BIT\r
+       ANDI    G,7\r
+       INC     G                       ; G = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       MOV     ZL,E\r
+       DEC     ZL                      ; BACK 1 FLAG BIT\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-(PRINT_BUF+1)       ; THEN FORWARD 1 FLAG BYTE\r
+       CLR     ZH\r
+       LD      D,Z\r
+       ROR     D                       ; CF = BIT 0 OF SUBSEQUENT FLAG BYTE\r
+       DEC     ZL\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+T0_TEXT_SETUP_FLAG:\r
+       ROR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_TEXT_SETUP_FLAG\r
+\r
+TP_TEXT_SETUP_CONT:\r
+       PUSH    F\r
+       BRCS    T0_TEXT_SETUP_RWIDE\r
+       ROR     D\r
+       BRCC    T0_TEXT_SETUP_NARROW\r
+;T0_TEXT_SETUP_LWIDE:\r
+       SUBI    F,6\r
+T0_TEXT_SETUP_RWIDE:\r
+       SUBI    F,-6\r
+       LSR     F\r
+T0_TEXT_SETUP_NARROW:\r
+       RCALL   LOOKUP_CHAR             ; GET R0 = VERTICAL SLICE OF CHAR\r
+       POP     F\r
+\r
+       AND     R0,TEXT_MASK\r
+       BREQ    TP_TEXT_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_TEXT_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR GRAPHICS PRINTING\r
+\r
+TP_PRINT_IMAGE:\r
+       CLR     F\r
+\r
+TP_IMAGE_PIXEL:\r
+       LDI     D,180\r
+       RCALL   TP_IMAGE_FIRE2\r
+       LDI     D,90\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,0\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,210\r
+       RCALL   TP_IMAGE_FIRE1\r
+       LDI     D,120\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,30\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,150\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,60\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       INC     F                       ; NEXT PIXEL FOR PRINT HEAD\r
+       MOV     D,F\r
+       CPI     D,30                    ; GONE PAST LAST PIXEL FOR PRINT HEAD?\r
+       BRLO    TP_IMAGE_PIXEL          ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_IMAGE_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_IMAGE_COAST\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_IMAGE_FIRE3:\r
+       LSL     H\r
+TP_IMAGE_FIRE2:\r
+       LSL     H\r
+TP_IMAGE_FIRE1:\r
+       LSL     H\r
+\r
+       ADD     D,F                     ; PIXEL ADDRESS\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,D\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = IMAGE BYTE\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ANDI    D,$07\r
+       INC     D\r
+TP_IMAGE_FIRE_SHIFT:\r
+       LSL     E                       ; AT LEAST ONCE\r
+       DEC     D\r
+       BRNE    TP_IMAGE_FIRE_SHIFT\r
+\r
+       BRCC    TP_IMAGE_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_IMAGE_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_LATCH2:\r
+       LSL     H\r
+TP_LATCH1:\r
+       LSL     H\r
+TP_LATCH0:\r
+       SWAP    H                       ; PUT BITS IN POSITION\r
+\r
+       IN      D,PORTD\r
+       EOR     D,H\r
+       ANDI    D,$0F\r
+       EOR     D,H\r
+       OUT     PORTD,D                 ; PLACE ORIGINAL LOWER 4 BITS ON D4-D7\r
+\r
+       IN      D,PORTC\r
+       EOR     D,H\r
+       ANDI    D,$F0\r
+       EOR     D,H\r
+       OUT     PORTC,D                 ; PLACE ORIGINAL UPPER 4 BITS ON C0-C3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; TRANSFER TO D4-D7 AND C0-C3\r
+\r
+       SBR     STATUS,1<<TP_ERROR      ; SAY WE HAD TIMEOUT ON TP\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 3\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 6\r
+\r
+       ADD     ZL,F\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 6 + SLICE INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*6)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*6)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       LPM                             ; R0 = CORRECT VERTICAL SLICE OF CHAR\r
+       RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 8\r
+       SUB     ZL,D                    ; ZL = CHARACTER DEFINITION * 7\r
+       ;CLR    ZH\r
+\r
+       SUBI    ZL,-(EE_COUNT*2+2)      ; PAST CRC, COUNT, AND CHARACTER CODE\r
+       ADD     ZL,F                    ; ZL = BASE + CHAR * 6 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      R0,EEDR                 ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+       SBRC    FLAGS,BOMB\r
+       RJMP    TEXT_RESET\r
+\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       CLR     NOTIFY_COUNT            ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+       CBR     STATUS,1<<NOTIFY        ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    RX_CHAR_CONT\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+\r
+       ;MAPI_TIMER\r
+\r
+       TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+       BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+\r
+       DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+       BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       SBIC    DDRB,1                  ; LED ON?\r
+       RJMP    T0_PAPER_TEST           ; YES, GO AND TEST OPTOCOUPLER INPUT\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    API_DONE                ; YES, RELY ON TP_EDGE TO TEST PAPER\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     D,0\r
+       OUT     GIMSK,D                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       CBI     PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-2\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_TEST:\r
+       LDI     D,1<<INT1\r
+       OUT     GIMSK,D                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,D                  ; CLEAR PENDING INT 1 FROM PAPER TEST\r
+\r
+       INC     NOTIFY_COUNT\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       SBR     STATUS,1<<NOTIFY        ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      D,PINC                  ; SAMPLE D5 STATE\r
+       CBI     DDRB,1                  ; B1 = TRI-STATE TO EXTINGUISH LED\r
+\r
+       SBRS    D,5\r
+       RJMP    T0_PAPER_IN             ; D5 = 0, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; D5 = 1, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   API_DONE\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       SBRC    STATUS,PAPER\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       CBR     STATUS,1<<PAPER         ; SAY PAPER IS OUT\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER\r
+       RJMP    API_DONE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       PUSH    A ; SLIGHTLY DODGY\r
+       RCALL   MOTOR_START             ; NORMALLY CALLED FROM FOREGROUND\r
+       POP     A\r
+\r
+       SBR     STATUS,(1<<PAPER) | (1<<NOTIFY) ; SAY PAPER IS IN, MUST SEND\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = PULL UP FOR RSW SWITCH\r
+       SBI     DDRB,2                  ; B2 = OUTPUT FOR TP GENERATOR\r
+\r
+       SBI     DDRB,0                  ; B0 = OUTPUT FOR TRG\r
+       LDI     A,$1F                   ; C5 = TRI-STATE FOR OPTOCOUPLER\r
+       OUT     DDRC,A                  ; C0-C4 = OUTPUTS FOR HE-HH, MSTR\r
+       ;SBI    PORTC,5                 ; C5 = PULLED UP INPUT FOR OPTOCOUPLER\r
+       LDI     A,$F0\r
+       OUT     DDRD,A                  ; D4-D7 = OUTPUTS FOR HA-HD\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW\r
+       LDI     STATUS,1<<PAPER\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A\r
+\r
+;      LDI     A,FEED_INITIAL\r
+;      MOV     FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       CLR     NOTIFY_COUNT\r
+       DEC     NOTIFY_COUNT            ; NEXT NOTIFICATION IMMEDIATELY\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,5                     ; TIMER0 TICK = APPROX 0.1 MS\r
+       OUT     TCCR0,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(TP_SEARCH)\r
+       LDI     H,HIGH(TP_SEARCH)       ; TP_SEARCH NEXT INTERRUPT\r
+\r
+       LDI     A,1<<ISC11 | 1<<ISC10\r
+       OUT     MCUCR,A                 ; INT 1 ON RISING EDGE\r
+       LDI     A,1<<INT1\r
+       OUT     GIMSK,A                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,A                  ; CLEAR ANY PENDING INT 1\r
+\r
+       LDI     A,5\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 MS\r
+\r
+       LDI     A,1<<TOIE0\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_RESET:\r
+       ; ENTRY POINT FROM RX_WAIT\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+       CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       SBR     FLAGS,1<<TEXT\r
+       RCALL   MOTOR_START\r
+\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+       OR      A,YL\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF LINES = 0\r
+\r
+       TST     R0\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF WIDTH = 0\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+       RCALL   MOTOR_START\r
+\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+GO_TEXT_RECEIVE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH*2          ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     XL,$21\r
+       LDI     XH,$10                  ; X = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,XL\r
+       EOR     YH,XH\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_FEEDS:\r
+       PUSH    A\r
+       ADD     A,FEEDS\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS\r
+\r
+       ADD     FEEDS,A\r
+\r
+MOTOR_START:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RET\r
+\r
+       SBIC    PORTC,4\r
+       RET\r
+\r
+       CBR     FLAGS,1<<RSWSAVE\r
+       SBI     PORTC,4                 ; MOTOR ON\r
+       SBR     STATUS,(1<<MOTOR) | (1<<NOTIFY) ; SAY MOTOR IS ON AND MUST SEND\r
+\r
+       LDI     A,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,A                ; LOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       LDI     A,1<<TOIE1\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,(1<<TOIE1) | (1<<TOIE0)\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 1 OVERFLOW INTERRUPTS\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-7\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$9E,$00,$00,$00\r
+       .DB     $00,$0E,$00,$0E,$00,$00\r
+       .DB     $28,$FE,$28,$FE,$28,$00\r
+       .DB     $4C,$92,$FF,$92,$64,$00\r
+       .DB     $46,$26,$10,$C8,$C4,$00\r
+       .DB     $6C,$92,$AA,$44,$A0,$00\r
+       .DB     $00,$0B,$07,$00,$00,$00\r
+       .DB     $00,$38,$44,$82,$00,$00\r
+       .DB     $00,$82,$44,$38,$00,$00\r
+       .DB     $28,$10,$7C,$10,$28,$00\r
+       .DB     $10,$10,$7C,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $10,$10,$10,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $40,$20,$10,$08,$04,$00\r
+       .DB     $7C,$A2,$92,$8A,$7C,$00\r
+       .DB     $00,$84,$FE,$80,$00,$00\r
+       .DB     $84,$C2,$A2,$92,$8C,$00\r
+       .DB     $42,$82,$8A,$96,$62,$00\r
+       .DB     $30,$28,$24,$FE,$20,$00\r
+       .DB     $4E,$8A,$8A,$8A,$72,$00\r
+       .DB     $78,$94,$92,$92,$60,$00\r
+       .DB     $02,$E2,$12,$0A,$06,$00\r
+       .DB     $6C,$92,$92,$92,$6C,$00\r
+       .DB     $0C,$92,$92,$52,$3C,$00\r
+       .DB     $00,$6C,$6C,$00,$00,$00\r
+       .DB     $00,$6C,$EC,$00,$00,$00\r
+       .DB     $10,$28,$44,$82,$00,$00\r
+       .DB     $28,$28,$28,$28,$28,$00\r
+       .DB     $00,$82,$44,$28,$10,$00\r
+       .DB     $04,$02,$A2,$12,$0C,$00\r
+       .DB     $7C,$82,$BA,$AA,$3C,$00\r
+       .DB     $FC,$22,$22,$22,$FC,$00\r
+       .DB     $FE,$92,$92,$92,$6C,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $FE,$82,$82,$44,$38,$00\r
+       .DB     $FE,$92,$92,$92,$82,$00\r
+       .DB     $FE,$12,$12,$12,$02,$00\r
+       .DB     $7C,$82,$92,$92,$F4,$00\r
+       .DB     $FE,$10,$10,$10,$FE,$00\r
+       .DB     $00,$82,$FE,$82,$00,$00\r
+       .DB     $40,$80,$82,$7E,$02,$00\r
+       .DB     $FE,$10,$28,$44,$82,$00\r
+       .DB     $FE,$80,$80,$80,$80,$00\r
+       .DB     $FE,$04,$18,$04,$FE,$00\r
+       .DB     $FE,$08,$10,$20,$FE,$00\r
+       .DB     $7C,$82,$82,$82,$7C,$00\r
+       .DB     $FE,$12,$12,$12,$0C,$00\r
+       .DB     $7C,$82,$A2,$42,$BC,$00\r
+       .DB     $FE,$12,$32,$52,$8C,$00\r
+       .DB     $4C,$92,$92,$92,$64,$00\r
+       .DB     $02,$02,$FE,$02,$02,$00\r
+       .DB     $7E,$80,$80,$80,$7E,$00\r
+       .DB     $3E,$40,$80,$40,$3E,$00\r
+       .DB     $7E,$80,$70,$80,$7E,$00\r
+       .DB     $C6,$28,$10,$28,$C6,$00\r
+       .DB     $0E,$10,$E0,$10,$0E,$00\r
+       .DB     $C2,$A2,$92,$8A,$86,$00\r
+       .DB     $00,$FE,$82,$82,$00,$00\r
+       .DB     $04,$08,$10,$20,$40,$00\r
+       .DB     $00,$82,$82,$FE,$00,$00\r
+       .DB     $08,$04,$02,$04,$08,$00\r
+       .DB     $80,$80,$80,$80,$80,$00\r
+       .DB     $00,$00,$0E,$0D,$00,$00\r
+       .DB     $40,$A8,$A8,$A8,$F0,$00\r
+       .DB     $FE,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$88,$88,$88,$FE,$00\r
+       .DB     $70,$A8,$A8,$A8,$30,$00\r
+       .DB     $08,$08,$FC,$0A,$0A,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $FE,$10,$08,$08,$F0,$00\r
+       .DB     $00,$88,$FA,$80,$00,$00\r
+       .DB     $00,$00,$08,$FA,$00,$00\r
+       .DB     $FE,$20,$50,$88,$00,$00\r
+       .DB     $00,$82,$FE,$80,$00,$00\r
+       .DB     $F8,$08,$F8,$08,$F0,$00\r
+       .DB     $F8,$10,$08,$08,$F0,$00\r
+       .DB     $70,$88,$88,$88,$70,$00\r
+       .DB     $F8,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $F8,$10,$08,$08,$00,$00\r
+       .DB     $90,$A8,$A8,$A8,$48,$00\r
+       .DB     $08,$08,$7E,$88,$88,$00\r
+       .DB     $78,$80,$80,$40,$F8,$00\r
+       .DB     $38,$40,$80,$40,$38,$00\r
+       .DB     $78,$80,$60,$80,$78,$00\r
+       .DB     $88,$50,$20,$50,$88,$00\r
+       .DB     $78,$80,$80,$80,$F8,$00\r
+       .DB     $88,$C8,$A8,$98,$88,$00\r
+       .DB     $10,$6C,$82,$82,$00,$00\r
+       .DB     $00,$00,$EE,$00,$00,$00\r
+       .DB     $00,$82,$82,$6C,$10,$00\r
+       .DB     $04,$02,$04,$08,$04,$00\r
+       .DB     $E0,$90,$88,$90,$E0,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $7A,$80,$80,$40,$FA,$00\r
+       .DB     $70,$A8,$AA,$A9,$30,$00\r
+       .DB     $40,$AA,$A9,$AA,$F0,$00\r
+       .DB     $42,$A8,$A8,$A8,$F2,$00\r
+       .DB     $40,$A9,$AA,$A8,$F0,$00\r
+       .DB     $40,$AE,$AA,$AE,$F0,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$AA,$A9,$AA,$30,$00\r
+       .DB     $72,$A8,$A8,$A8,$32,$00\r
+       .DB     $70,$A9,$AA,$A8,$30,$00\r
+       .DB     $02,$88,$F8,$80,$02,$00\r
+       .DB     $00,$8A,$F9,$82,$00,$00\r
+       .DB     $00,$89,$FA,$80,$00,$00\r
+       .DB     $F9,$24,$24,$24,$F9,$00\r
+       .DB     $F8,$27,$25,$27,$F8,$00\r
+       .DB     $F8,$A8,$AA,$A9,$88,$00\r
+       .DB     $68,$A8,$F8,$A8,$B0,$00\r
+       .DB     $FC,$12,$FE,$92,$92,$00\r
+       .DB     $70,$8A,$89,$8A,$70,$00\r
+       .DB     $72,$88,$88,$88,$72,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$82,$81,$42,$F8,$00\r
+       .DB     $78,$81,$82,$40,$F8,$00\r
+       .DB     $7A,$80,$80,$80,$FA,$00\r
+       .DB     $79,$84,$84,$84,$79,$00\r
+       .DB     $7D,$80,$80,$80,$7D,$00\r
+       .DB     $70,$88,$88,$FC,$88,$00\r
+       .DB     $90,$7C,$92,$92,$C4,$00\r
+       .DB     $52,$54,$F8,$54,$52,$00\r
+       .DB     $82,$82,$44,$44,$28,$28\r
+       .DB     $10,$10,$28,$54,$54,$28\r
+       .DB     $40,$A8,$AA,$A9,$F0,$00\r
+       .DB     $00,$8A,$F9,$80,$00,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$80,$82,$41,$F8,$00\r
+       .DB     $FA,$11,$0A,$09,$F0,$00\r
+       .DB     $FA,$11,$22,$41,$F8,$00\r
+       .DB     $90,$AA,$AA,$AA,$BC,$00\r
+       .DB     $9C,$A2,$A2,$A2,$9C,$00\r
+       .DB     $60,$90,$8A,$80,$40,$00\r
+       .DB     $FE,$02,$02,$02,$02,$02\r
+       .DB     $02,$02,$02,$02,$02,$FE\r
+       .DB     $2F,$10,$48,$24,$C0,$00\r
+       .DB     $2F,$90,$48,$E4,$00,$00\r
+       .DB     $00,$00,$F2,$00,$00,$00\r
+       .DB     $FE,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$80,$80,$80,$FE\r
+       .DB     $00,$80,$00,$00,$80,$00\r
+       .DB     $55,$AA,$55,$AA,$55,$AA\r
+       .DB     $33,$CC,$33,$CC,$33,$CC\r
+       .DB     $00,$00,$FF,$00,$00,$00\r
+       .DB     $10,$10,$FF,$00,$00,$00\r
+       .DB     $28,$28,$FF,$00,$00,$00\r
+       .DB     $10,$FF,$00,$FF,$00,$00\r
+       .DB     $10,$F0,$10,$F0,$00,$00\r
+       .DB     $28,$28,$F8,$00,$00,$00\r
+       .DB     $28,$EF,$00,$FF,$00,$00\r
+       .DB     $00,$FF,$00,$FF,$00,$00\r
+       .DB     $28,$E8,$08,$F8,$00,$00\r
+       .DB     $28,$2F,$20,$3F,$00,$00\r
+       .DB     $10,$1F,$10,$1F,$00,$00\r
+       .DB     $28,$28,$3F,$00,$00,$00\r
+       .DB     $10,$10,$F0,$00,$00,$00\r
+       .DB     $00,$00,$1F,$10,$10,$10\r
+       .DB     $10,$10,$1F,$10,$10,$10\r
+       .DB     $10,$10,$F0,$10,$10,$10\r
+       .DB     $00,$00,$FF,$10,$10,$10\r
+       .DB     $10,$10,$10,$10,$10,$10\r
+       .DB     $10,$10,$FF,$10,$10,$10\r
+       .DB     $00,$00,$FF,$28,$28,$28\r
+       .DB     $00,$FF,$00,$FF,$10,$10\r
+       .DB     $00,$3F,$20,$2F,$28,$28\r
+       .DB     $00,$F8,$08,$E8,$28,$28\r
+       .DB     $28,$2F,$20,$2F,$28,$28\r
+       .DB     $28,$E8,$08,$E8,$28,$28\r
+       .DB     $00,$FF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$28,$28,$28,$28\r
+       .DB     $28,$EF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$2F,$28,$28,$28\r
+       .DB     $10,$1F,$10,$1F,$10,$10\r
+       .DB     $28,$28,$E8,$28,$28,$28\r
+       .DB     $10,$F0,$10,$F0,$10,$10\r
+       .DB     $00,$1F,$10,$1F,$10,$10\r
+       .DB     $00,$00,$3F,$28,$28,$28\r
+       .DB     $00,$00,$F8,$28,$28,$28\r
+       .DB     $00,$F0,$10,$F0,$10,$10\r
+       .DB     $10,$FF,$10,$FF,$10,$10\r
+       .DB     $28,$28,$FF,$28,$28,$28\r
+       .DB     $10,$10,$1F,$00,$00,$00\r
+       .DB     $00,$00,$F0,$10,$10,$10\r
+       .DB     $FF,$FF,$FF,$FF,$FF,$FF\r
+       .DB     $E0,$E0,$E0,$E0,$E0,$E0\r
+       .DB     $FF,$FF,$FF,$00,$00,$00\r
+       .DB     $00,$00,$00,$FF,$FF,$FF\r
+       .DB     $1F,$1F,$1F,$1F,$1F,$1F\r
+       .DB     $70,$88,$88,$70,$88,$00\r
+       .DB     $FC,$02,$92,$92,$6C,$00\r
+       .DB     $FE,$02,$02,$02,$06,$00\r
+       .DB     $08,$F8,$08,$F8,$08,$00\r
+       .DB     $C6,$AA,$92,$82,$C6,$00\r
+       .DB     $70,$88,$88,$78,$08,$00\r
+       .DB     $00,$F8,$80,$80,$78,$00\r
+       .DB     $10,$08,$F0,$08,$00,$00\r
+       .DB     $10,$AA,$EE,$AA,$10,$00\r
+       .DB     $7C,$92,$92,$92,$7C,$00\r
+       .DB     $9C,$E2,$02,$E2,$9C,$00\r
+       .DB     $60,$94,$9A,$92,$60,$00\r
+       .DB     $70,$88,$70,$88,$70,$00\r
+       .DB     $70,$88,$FC,$88,$70,$00\r
+       .DB     $38,$54,$92,$92,$00,$00\r
+       .DB     $FC,$02,$02,$02,$FC,$00\r
+       .DB     $54,$54,$54,$54,$54,$00\r
+       .DB     $88,$88,$BE,$88,$88,$00\r
+       .DB     $A2,$A2,$94,$94,$88,$00\r
+       .DB     $88,$94,$94,$A2,$A2,$00\r
+       .DB     $00,$00,$F8,$04,$08,$00\r
+       .DB     $40,$80,$7F,$00,$00,$00\r
+       .DB     $10,$10,$54,$10,$10,$00\r
+       .DB     $48,$24,$48,$24,$00,$00\r
+       .DB     $0C,$12,$12,$0C,$00,$00\r
+       .DB     $00,$18,$18,$00,$00,$00\r
+       .DB     $00,$00,$10,$00,$00,$00\r
+       .DB     $20,$40,$FF,$01,$01,$00\r
+       .DB     $1F,$02,$01,$1E,$00,$00\r
+       .DB     $00,$12,$19,$16,$00,$00\r
+       .DB     $00,$38,$38,$38,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$02,$02,$02,$01,$00\r
+       .DB     $01,$02,$02,$01,$00,$00\r
+       .DB     $03,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$03,$00\r
+       .DB     $00,$00,$02,$03,$02,$00\r
+       .DB     $00,$01,$01,$03,$01,$00\r
+       .DB     $00,$00,$01,$00,$00,$00\r
+       .DB     $00,$00,$00,$01,$00,$00\r
+       .DB     $02,$01,$00,$00,$00,$00\r
+       .DB     $00,$02,$01,$00,$00,$00\r
+       .DB     $00,$00,$02,$01,$00,$00\r
+       .DB     $00,$01,$00,$00,$00,$00\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4107                   ; HARDWARE ADDRESS COMMAND\r
+       .DW     $4206                   ; SOFTWARE ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/m192v1.asm b/src/avr/m192v1.asm
new file mode 100644 (file)
index 0000000..1bf5b23
--- /dev/null
@@ -0,0 +1,1685 @@
+;      M192V1.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =6              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F ;$11       ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05 ;$11       ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =30             ; 240 / 8 = 30 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =40             ; 240 / 6 = 40 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =5              ; 40 / 8  = 5 TEXT WIDTH FLAGS\r
+\r
+.EQU   TIME_EMERGENCY  =1000           ; 1000 * 0.1 MS = APPROX 100 MS\r
+\r
+.EQU   FEED_INITIAL    =2              ; LINES ALLOWED FOR MOTOR SLOWDOWN\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED IN BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   TP_COUNT        =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   NOTIFY_COUNT    =R14            ; COUNTER TO SEND EVERY 6.5536 SECONDS\r
+.DEF   ABORT_COUNT     =R15            ; COUNTER TO ABORT ESC AFTER 0.1 SECS\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   SR              =R23\r
+.DEF   FLAGS           =R24\r
+.DEF   STATUS          =R25\r
+\r
+.EQU   TX_SIZE         =2\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_CHARS+WIDTH_FLAGS\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   RSWSAVE         =2              ; SET IF RSW HI, MUST BE BIT POSITION 2\r
+.EQU   IMAGE           =3              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =4              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+;.EQU  NODESC          =5              ; SET BY FG WHILE PRINTING TOP 7 DOTS\r
+;.EQU  BIGDESC         =6              ; SET BY FG WHILE PRINTING LOWER 2 DOTS\r
+.EQU   BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY FG JUST PRIOR TO NOTIFICATION\r
+.EQU   TP_ERROR        =2              ; SET BY BG IF WE HAVE TIMEOUT ON TP\r
+.EQU   RSW_ERROR       =3              ; SET BY BG IF WE HAVE TIMEOUT ON RSW\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; NODESC\r
+\r
+; FLAG RESET BY FOREGROUND AFTER DESCENDER TRANSLATION, IF DESCENDERS PRESENT.\r
+; FLAG SET BY FOREGROUND AFTER DESCENDERS FINISHED AND BUFFER CLOBBERED.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE, FOR SPECIAL DESCENDER\r
+; PROCESSING.\r
+\r
+; BIGDESC\r
+\r
+; FLAG SET UP BY FOREGROUND DURING DESCENDER TRANSLATION.\r
+; FLAG SAMPLED BY BACKGROUND AT END OF DOT LINE IN COMBINATION WITH\r
+; TEXT_MASK, TO CONTINUE DESCENDER OR REVERT TO FEEDS.\r
+\r
+; NOWFAST\r
+\r
+; FLAG SET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 115200 BPS.\r
+; FLAG RESET BY BACKGROUND COMMS TASK WHEN UART IS PROGRAMMED TO 4800 BPS.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    INT1ADDR\r
+       RJMP    TP_EDGE         ; EXTERNAL INT 1 HANDLER\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','1','9','2',' '\r
+;      .DB     'P','R','I','N','T','E','R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP EDGE INTERRUPT HANDLER\r
+\r
+TP_EDGE:\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       IN      D,MCUCR\r
+       SBRS    D,ISC10\r
+       CBI     PORTB,2                 ; IF WE WERE LOOKING FOR A FALLING EDGE\r
+       SBRC    D,ISC10\r
+       SBI     PORTB,2                 ; IF WE WERE LOOKING FOR A RISING EDGE\r
+       LDI     G,1<<ISC10\r
+       EOR     D,G\r
+       OUT     MCUCR,D                 ; START LOOKING FOR THE OPPOSITE EDGE\r
+\r
+       LDI     D,1<<INTF1\r
+       OUT     GIFR,D\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+TP_DONE:\r
+       LDI     D,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,D                ; RELOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR FEEDING\r
+\r
+TP_HALT:\r
+       SBR     STATUS,1<<RSW_ERROR     ; SAY WE HAD TIMEOUT ON RSW\r
+\r
+TP_KILL:\r
+       LDI     D,1<<TOIE0\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 OVERFLOW INTERRUPTS\r
+\r
+       CBI     PORTC,4                 ; MOTOR OFF\r
+       CBR     STATUS,1<<MOTOR         ; SAY MOTOR IS OFF\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+; ON ENTRY TO HERE, LOAD E WITH PREVIOUS RSW STATE, DON'T USE FLAGS\r
+\r
+TP_SEARCH:\r
+       RCALL   TP_DONE\r
+\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO RSW\r
+       BREQ    TP_HALT\r
+\r
+       IN      D,PIND                  ; D.2 = CURRENT RSW STATE\r
+       MOV     G,FLAGS                 ; G.2 = PREVIOUS RSW STATE\r
+       BST     D,2\r
+       BLD     FLAGS,2                 ; SAVE CURRENT RSW STATE FOR NEXT TIME\r
+       EOR     D,G                     ; D.2 = 1 IF RSW CHANGED\r
+       AND     D,G                     ; D.2 = 1 IF RSW CHANGED HIGH -> LOW\r
+\r
+       SBRS    D,2\r
+       RJMP    TP_SEARCH\r
+\r
+       ; RSW FALLING EDGE DETECTED\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    TP_FEED                 ; YES, GO AND PRINT\r
+\r
+       ; WE STOPPED THE MOTOR, MONITOR RSW WHILE IT SLOWS DOWN\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       TST     FEEDS\r
+       BREQ    TP_SEARCH\r
+       DEC     FEEDS                   ; DECREMENT FEEDS TO MINIMUM OF 0\r
+       RJMP    TP_SEARCH\r
+\r
+TP_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       MOV     D,TP_COUNT\r
+       CPI     D,3\r
+       BRSH    TP_PAPER_SKIP           ; ON LAST OR 2ND LAST TP EDGE,\r
+\r
+       SBIC    PORTB,2\r
+       RJMP    TP_PAPER_SKIP           ; WITH TP GENERATOR IN KNOWN STATE,\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     A,0\r
+       OUT     GIMSK,A                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       ;CBI    PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-3\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+\r
+TP_PAPER_SKIP:\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_COAST\r
+\r
+TP_FEED:\r
+       ;SBRS   STATUS,PAPER            ; PAPER IN?\r
+       ;RJMP   TP_BRAKE_NOW            ; NO, STOP PRINTING IMMEDIATELY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE); GOT SOMETHING TO PRINT?\r
+       BREQ    TP_BRAKE                ; NO, FULL NUMBER OF FEEDS-3 THEN STOP\r
+                                       ; YES, FULL NUMBER OF FEEDS THEN PRINT\r
+       MOV     D,FEEDS\r
+       CPI     D,3\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3 INTERNAL FEEDS\r
+       CPI     D,1\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1 INTERNAL FEED\r
+\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    TP_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       RJMP    TP_PRINT_TEXT           ; OTHERWISE ASSUME TEXT IS WAITING\r
+\r
+TP_BRAKE:\r
+       MOV     D,FEEDS\r
+       CPI     D,3+FEED_INITIAL\r
+       BRSH    TP_FEED_FAST            ; TRIGGER IF => 3+n INTERNAL FEEDS\r
+       CPI     D,1+FEED_INITIAL\r
+       BRSH    TP_FEED_SLOW            ; COAST IF => 1+n INTERNAL FEED\r
+\r
+TP_BRAKE_NOW:\r
+;      TST     FEEDS                   ; JUST MISSED RSW -> 0, COMPENSATE\r
+;      BREQ    TP_BRAKE_NOW_CONT\r
+;      DEC     FEEDS                   ; DECREMENT TO MINIMUM OF 0\r
+;TP_BRAKE_NOW_CONT:\r
+       CLR     FEEDS\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+TP_FEED_SLOW:\r
+       DEC     FEEDS\r
+\r
+       LDI     D,150\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+TP_FEED_FAST:                          ; AT PRINTABLE AREA-2\r
+       SUBI    D,3\r
+       MOV     FEEDS,D\r
+\r
+       SBI     PORTB,0                 ; APPLY TRIGGER SOLENOID\r
+\r
+       LDI     D,9\r
+       MOV     TP_COUNT,D\r
+TP_TRIGGERING:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT\r
+       BRNE    TP_TRIGGERING\r
+\r
+       CBI     PORTB,0                 ; CLEAR TRIGGER SOLENOID\r
+\r
+       LDI     D,150-9\r
+       MOV     TP_COUNT,D\r
+       RJMP    TP_COAST\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR TEXT PRINTING\r
+\r
+; TP_TEXT_START DOES NOT RE-ENABLE ACCESS TO FEEDS.\r
+; FEEDS IS USED AS A COUNTER FOR DESCENDER PRINTING,\r
+; SO WE RELY ON TIMER_COPY TO RESET NOFEED, AFTER THE\r
+; LINE HAS BEEN CHECKED FOR DESCENDERS AND IS ABOUT TO\r
+; BE CLOBBERED BY NEW DATA.\r
+\r
+TP_PRINT_TEXT:\r
+       LDI     D,2\r
+       MOV     TEXT_MASK,D\r
+       MOV     FEEDS,SPACING           ; SET UP STANDARD FEED AFTER TEXT LINE\r
+\r
+TP_PRINT_TEXT_START:\r
+       LDI     E,0                     ; CURRENT CHARACTER FOR PRINT HEAD, 0-4\r
+\r
+TP_PRINT_TEXT_CHAR:\r
+       LDI     F,0                     ; CURRENT PIXEL FOR CHARACTER, 0-5\r
+\r
+TP_PRINT_TEXT_PIXEL:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-30                   ; E = CURRENT CHARACTER + 30\r
+       RCALL   TP_TEXT_FIRE2\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 15\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-35                   ; E = CURRENT CHARACTER + 35\r
+       RCALL   TP_TEXT_FIRE1\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 20\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 5\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+\r
+       SUBI    E,-20                   ; E = CURRENT CHARACTER + 25\r
+       RCALL   TP_TEXT_FIRE3\r
+       SUBI    E,15                    ; E = CURRENT CHARACTER + 10\r
+       RCALL   TP_TEXT_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       SUBI    E,10                    ; E = CURRENT CHARACTER\r
+\r
+       INC     F                       ; NEXT PIXEL FOR CHARACTER\r
+       CPI     F,6                     ; GONE PAST LAST PIXEL FOR CHARACTER?\r
+       BRLO    TP_PRINT_TEXT_PIXEL     ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       INC     E                       ; NEXT CHARACTER FOR PRINT HEAD\r
+       CPI     E,5                     ; GONE PAST LAST CHAR FOR PRINT HEAD?\r
+       BRLO    TP_PRINT_TEXT_CHAR      ; REPEAT UNLESS ALL CHARACTERS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       SBRC    TEXT_MASK,7             ; LAST DOT LINE FOR CHARACTER LINE?\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       ; COMPLICATED DESCENDER LOGIC\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_PRINT_TEXT_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_PRINT_TEXT_COAST\r
+\r
+       LSL     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       BRCS    GO_TP_FEED\r
+       RJMP    TP_PRINT_TEXT_START     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_TP_FEED:\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_TEXT_FIRE3:\r
+       LSL     H\r
+TP_TEXT_FIRE2:\r
+       LSL     H\r
+TP_TEXT_FIRE1:\r
+       LSL     H\r
+\r
+       TST     E                       ; FIRST FLAG BIT FOR LINE?\r
+       LDS     D,PRINT_BUF\r
+       BREQ    TP_TEXT_SETUP_CONT      ; WITH CF = 0, D = FIRST FLAG BYTE\r
+\r
+       MOV     G,E\r
+       DEC     G                       ; BACK 1 FLAG BIT\r
+       ANDI    G,7\r
+       INC     G                       ; G = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       MOV     ZL,E\r
+       DEC     ZL                      ; BACK 1 FLAG BIT\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-(PRINT_BUF+1)       ; THEN FORWARD 1 FLAG BYTE\r
+       CLR     ZH\r
+       LD      D,Z\r
+       ROR     D                       ; CF = BIT 0 OF SUBSEQUENT FLAG BYTE\r
+       DEC     ZL\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+T0_TEXT_SETUP_FLAG:\r
+       ROR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_TEXT_SETUP_FLAG\r
+\r
+TP_TEXT_SETUP_CONT:\r
+       PUSH    F\r
+       BRCS    T0_TEXT_SETUP_RWIDE\r
+       ROR     D\r
+       BRCC    T0_TEXT_SETUP_NARROW\r
+;T0_TEXT_SETUP_LWIDE:\r
+       SUBI    F,6\r
+T0_TEXT_SETUP_RWIDE:\r
+       SUBI    F,-6\r
+       LSR     F\r
+T0_TEXT_SETUP_NARROW:\r
+       RCALL   LOOKUP_CHAR             ; GET R0 = VERTICAL SLICE OF CHAR\r
+       POP     F\r
+\r
+       AND     R0,TEXT_MASK\r
+       BREQ    TP_TEXT_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_TEXT_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TP INTERRUPT ROUTINES FOR GRAPHICS PRINTING\r
+\r
+TP_PRINT_IMAGE:\r
+       CLR     F\r
+\r
+TP_IMAGE_PIXEL:\r
+       LDI     D,180\r
+       RCALL   TP_IMAGE_FIRE2\r
+       LDI     D,90\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,0\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH0\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,210\r
+       RCALL   TP_IMAGE_FIRE1\r
+       LDI     D,120\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,30\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH1\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       LDI     D,150\r
+       RCALL   TP_IMAGE_FIRE3\r
+       LDI     D,60\r
+       RCALL   TP_IMAGE_FIRE3\r
+       RCALL   TP_LATCH2\r
+\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+\r
+       INC     F                       ; NEXT PIXEL FOR PRINT HEAD\r
+       MOV     D,F\r
+       CPI     D,30                    ; GONE PAST LAST PIXEL FOR PRINT HEAD?\r
+       BRLO    TP_IMAGE_PIXEL          ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; CLEAR D4-D7 AND C0-C3\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE FINISHED WITH THE BUFFER\r
+\r
+       LDI     D,150-90                ; REMAINDER, TO NEXT PRINTABLE AREA\r
+       MOV     TP_COUNT,D\r
+\r
+TP_IMAGE_COAST:\r
+       RCALL   TP_DONE                 ; RETURNS NEXT TP EDGE\r
+       DEC     TP_COUNT                ; COUNT EDGES/2 TO PRINTABLE AREA-4\r
+       BRNE    TP_IMAGE_COAST\r
+       RJMP    TP_FEED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_IMAGE_FIRE3:\r
+       LSL     H\r
+TP_IMAGE_FIRE2:\r
+       LSL     H\r
+TP_IMAGE_FIRE1:\r
+       LSL     H\r
+\r
+       ADD     D,F                     ; PIXEL ADDRESS\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,D\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = IMAGE BYTE\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ANDI    D,$07\r
+       INC     D\r
+TP_IMAGE_FIRE_SHIFT:\r
+       LSL     E                       ; AT LEAST ONCE\r
+       DEC     D\r
+       BRNE    TP_IMAGE_FIRE_SHIFT\r
+\r
+       BRCC    TP_IMAGE_FIRE_RET\r
+\r
+       LDI     D,1\r
+       OR      H,D\r
+\r
+TP_IMAGE_FIRE_RET:\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TP_LATCH2:\r
+       LSL     H\r
+TP_LATCH1:\r
+       LSL     H\r
+TP_LATCH0:\r
+       SWAP    H                       ; PUT BITS IN POSITION\r
+\r
+       IN      D,PORTD\r
+       EOR     D,H\r
+       ANDI    D,$0F\r
+       EOR     D,H\r
+       OUT     PORTD,D                 ; PLACE ORIGINAL LOWER 4 BITS ON D4-D7\r
+\r
+       IN      D,PORTC\r
+       EOR     D,H\r
+       ANDI    D,$F0\r
+       EOR     D,H\r
+       OUT     PORTC,D                 ; PLACE ORIGINAL UPPER 4 BITS ON C0-C3\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       CLR     H\r
+       RCALL   TP_LATCH0               ; TRANSFER TO D4-D7 AND C0-C3\r
+\r
+       SBR     STATUS,1<<TP_ERROR      ; SAY WE HAD TIMEOUT ON TP\r
+       RJMP    TP_KILL                 ; GO AND KILL MOTOR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 3\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 6\r
+\r
+       ADD     ZL,F\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 6 + SLICE INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*6)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*6)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       LPM                             ; R0 = CORRECT VERTICAL SLICE OF CHAR\r
+       RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 8\r
+       SUB     ZL,D                    ; ZL = CHARACTER DEFINITION * 7\r
+       ;CLR    ZH\r
+\r
+       SUBI    ZL,-(EE_COUNT*2+2)      ; PAST CRC, COUNT, AND CHARACTER CODE\r
+       ADD     ZL,F                    ; ZL = BASE + CHAR * 6 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      R0,EEDR                 ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+       SBRC    FLAGS,BOMB\r
+       RJMP    TEXT_RESET\r
+\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       CLR     NOTIFY_COUNT            ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+       CBR     STATUS,1<<NOTIFY        ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+       TST     ABORT_COUNT\r
+       BREQ    RX_CHAR_CONT\r
+\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+\r
+       ;MAPI_TIMER\r
+\r
+       TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+       BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+\r
+       DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+       BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+\r
+       SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       SBIC    DDRB,1                  ; LED ON?\r
+       RJMP    T0_PAPER_TEST           ; YES, GO AND TEST OPTOCOUPLER INPUT\r
+\r
+       SBIC    PORTC,4                 ; MOTOR ON?\r
+       RJMP    API_DONE                ; YES, RELY ON TP_EDGE TO TEST PAPER\r
+\r
+;T0_PAPER_SETUP:\r
+       LDI     D,0\r
+       OUT     GIMSK,D                 ; DISABLE INT 1 INTERRUPTS\r
+\r
+       CBI     PORTB,2                 ; SET TP GENERATOR TO KNOWN STATE\r
+       SBI     PORTB,1                 ; MUST BE OPPOSITE TO PORTB,2 STATE\r
+       SBI     DDRB,1                  ; D1 = HIGH / LOW TO LIGHT LED\r
+\r
+       LDI     D,-2\r
+       OUT     TCNT0,D                 ; TEST PAPER IN 2 * 0.1 MS = 0.2 MS\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_TEST:\r
+       LDI     D,1<<INT1\r
+       OUT     GIMSK,D                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,D                  ; CLEAR PENDING INT 1 FROM PAPER TEST\r
+\r
+       INC     NOTIFY_COUNT\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       SBR     STATUS,1<<NOTIFY        ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      D,PINC                  ; SAMPLE D5 STATE\r
+       CBI     DDRB,1                  ; B1 = TRI-STATE TO EXTINGUISH LED\r
+\r
+       SBRS    D,5\r
+       RJMP    T0_PAPER_IN             ; D5 = 0, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; D5 = 1, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   API_DONE\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       SBRC    STATUS,PAPER\r
+       SBR     STATUS,1<<NOTIFY        ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       CBR     STATUS,1<<PAPER         ; SAY PAPER IS OUT\r
+       RJMP    API_DONE\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER\r
+       RJMP    API_DONE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       PUSH    A ; SLIGHTLY DODGY\r
+       RCALL   MOTOR_START             ; NORMALLY CALLED FROM FOREGROUND\r
+       POP     A\r
+\r
+       SBR     STATUS,(1<<PAPER) | (1<<NOTIFY) ; SAY PAPER IS IN, MUST SEND\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = PULL UP FOR RSW SWITCH\r
+       SBI     DDRB,2                  ; B2 = OUTPUT FOR TP GENERATOR\r
+\r
+       SBI     DDRB,0                  ; B0 = OUTPUT FOR TRG\r
+       LDI     A,$1F                   ; C5 = TRI-STATE FOR OPTOCOUPLER\r
+       OUT     DDRC,A                  ; C0-C4 = OUTPUTS FOR HE-HH, MSTR\r
+       ;SBI    PORTC,5                 ; C5 = PULLED UP INPUT FOR OPTOCOUPLER\r
+       LDI     A,$F0\r
+       OUT     DDRD,A                  ; D4-D7 = OUTPUTS FOR HA-HD\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW\r
+       LDI     STATUS,1<<PAPER\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A\r
+\r
+;      LDI     A,FEED_INITIAL\r
+;      MOV     FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       CLR     TP_COUNT                ; REPLENISH COUNT OF TP EDGES TO RSW\r
+\r
+       CLR     NOTIFY_COUNT\r
+       DEC     NOTIFY_COUNT            ; NEXT NOTIFICATION IMMEDIATELY\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,5                     ; TIMER0 TICK = APPROX 0.1 MS\r
+       OUT     TCCR0,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(TP_SEARCH)\r
+       LDI     H,HIGH(TP_SEARCH)       ; TP_SEARCH NEXT INTERRUPT\r
+\r
+       LDI     A,1<<ISC11 | 1<<ISC10\r
+       OUT     MCUCR,A                 ; INT 1 ON RISING EDGE\r
+       LDI     A,1<<INT1\r
+       OUT     GIMSK,A                 ; ENABLE INT 1 INTERRUPTS\r
+       OUT     GIFR,A                  ; CLEAR ANY PENDING INT 1\r
+\r
+       LDI     A,5\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 MS\r
+\r
+       LDI     A,1<<TOIE0\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_RESET:\r
+       ; ENTRY POINT FROM RX_WAIT\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+       CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+       CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       SBR     FLAGS,1<<TEXT\r
+       RCALL   MOTOR_START\r
+\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+       MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+       OR      A,YL\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF LINES = 0\r
+\r
+       TST     R0\r
+       BREQ    GO_TEXT_RECEIVE         ; ABORT IF WIDTH = 0\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+       RCALL   MOTOR_START\r
+\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       MOV     A,SPACING\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+GO_TEXT_RECEIVE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       RCALL   WAIT_ADD_FEEDS\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH*2          ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     XL,$21\r
+       LDI     XH,$10                  ; X = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,XL\r
+       EOR     YH,XH\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_FEEDS:\r
+       PUSH    A\r
+       ADD     A,FEEDS\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS\r
+\r
+       ADD     FEEDS,A\r
+\r
+MOTOR_START:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RET\r
+\r
+       SBIC    PORTC,4\r
+       RET\r
+\r
+       CBR     FLAGS,1<<RSWSAVE\r
+       SBI     PORTC,4                 ; MOTOR ON\r
+       SBR     STATUS,(1<<MOTOR) | (1<<NOTIFY) ; SAY MOTOR IS ON AND MUST SEND\r
+\r
+       LDI     A,HIGH(-TIME_EMERGENCY)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(-TIME_EMERGENCY)\r
+       OUT     TCNT1L,A                ; LOAD T1 TO TEST FOR TP NOT PRESENT\r
+\r
+       LDI     A,1<<TOIE1\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,(1<<TOIE1) | (1<<TOIE0)\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 1 OVERFLOW INTERRUPTS\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-7\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       CLR     ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$9E,$00,$00,$00\r
+       .DB     $00,$0E,$00,$0E,$00,$00\r
+       .DB     $28,$FE,$28,$FE,$28,$00\r
+       .DB     $4C,$92,$FF,$92,$64,$00\r
+       .DB     $46,$26,$10,$C8,$C4,$00\r
+       .DB     $6C,$92,$AA,$44,$A0,$00\r
+       .DB     $00,$0B,$07,$00,$00,$00\r
+       .DB     $00,$38,$44,$82,$00,$00\r
+       .DB     $00,$82,$44,$38,$00,$00\r
+       .DB     $28,$10,$7C,$10,$28,$00\r
+       .DB     $10,$10,$7C,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $10,$10,$10,$10,$10,$00\r
+       .DB     $00,$C0,$C0,$00,$00,$00\r
+       .DB     $40,$20,$10,$08,$04,$00\r
+       .DB     $7C,$A2,$92,$8A,$7C,$00\r
+       .DB     $00,$84,$FE,$80,$00,$00\r
+       .DB     $84,$C2,$A2,$92,$8C,$00\r
+       .DB     $42,$82,$8A,$96,$62,$00\r
+       .DB     $30,$28,$24,$FE,$20,$00\r
+       .DB     $4E,$8A,$8A,$8A,$72,$00\r
+       .DB     $78,$94,$92,$92,$60,$00\r
+       .DB     $02,$E2,$12,$0A,$06,$00\r
+       .DB     $6C,$92,$92,$92,$6C,$00\r
+       .DB     $0C,$92,$92,$52,$3C,$00\r
+       .DB     $00,$6C,$6C,$00,$00,$00\r
+       .DB     $00,$6C,$EC,$00,$00,$00\r
+       .DB     $10,$28,$44,$82,$00,$00\r
+       .DB     $28,$28,$28,$28,$28,$00\r
+       .DB     $00,$82,$44,$28,$10,$00\r
+       .DB     $04,$02,$A2,$12,$0C,$00\r
+       .DB     $7C,$82,$BA,$AA,$3C,$00\r
+       .DB     $FC,$22,$22,$22,$FC,$00\r
+       .DB     $FE,$92,$92,$92,$6C,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $FE,$82,$82,$44,$38,$00\r
+       .DB     $FE,$92,$92,$92,$82,$00\r
+       .DB     $FE,$12,$12,$12,$02,$00\r
+       .DB     $7C,$82,$92,$92,$F4,$00\r
+       .DB     $FE,$10,$10,$10,$FE,$00\r
+       .DB     $00,$82,$FE,$82,$00,$00\r
+       .DB     $40,$80,$82,$7E,$02,$00\r
+       .DB     $FE,$10,$28,$44,$82,$00\r
+       .DB     $FE,$80,$80,$80,$80,$00\r
+       .DB     $FE,$04,$18,$04,$FE,$00\r
+       .DB     $FE,$08,$10,$20,$FE,$00\r
+       .DB     $7C,$82,$82,$82,$7C,$00\r
+       .DB     $FE,$12,$12,$12,$0C,$00\r
+       .DB     $7C,$82,$A2,$42,$BC,$00\r
+       .DB     $FE,$12,$32,$52,$8C,$00\r
+       .DB     $4C,$92,$92,$92,$64,$00\r
+       .DB     $02,$02,$FE,$02,$02,$00\r
+       .DB     $7E,$80,$80,$80,$7E,$00\r
+       .DB     $3E,$40,$80,$40,$3E,$00\r
+       .DB     $7E,$80,$70,$80,$7E,$00\r
+       .DB     $C6,$28,$10,$28,$C6,$00\r
+       .DB     $0E,$10,$E0,$10,$0E,$00\r
+       .DB     $C2,$A2,$92,$8A,$86,$00\r
+       .DB     $00,$FE,$82,$82,$00,$00\r
+       .DB     $04,$08,$10,$20,$40,$00\r
+       .DB     $00,$82,$82,$FE,$00,$00\r
+       .DB     $08,$04,$02,$04,$08,$00\r
+       .DB     $80,$80,$80,$80,$80,$00\r
+       .DB     $00,$00,$0E,$0D,$00,$00\r
+       .DB     $40,$A8,$A8,$A8,$F0,$00\r
+       .DB     $FE,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$88,$88,$88,$FE,$00\r
+       .DB     $70,$A8,$A8,$A8,$30,$00\r
+       .DB     $08,$08,$FC,$0A,$0A,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $FE,$10,$08,$08,$F0,$00\r
+       .DB     $00,$88,$FA,$80,$00,$00\r
+       .DB     $00,$00,$08,$FA,$00,$00\r
+       .DB     $FE,$20,$50,$88,$00,$00\r
+       .DB     $00,$82,$FE,$80,$00,$00\r
+       .DB     $F8,$08,$F8,$08,$F0,$00\r
+       .DB     $F8,$10,$08,$08,$F0,$00\r
+       .DB     $70,$88,$88,$88,$70,$00\r
+       .DB     $F8,$88,$88,$88,$70,$00\r
+       .DB     $70,$88,$88,$88,$F8,$00\r
+       .DB     $F8,$10,$08,$08,$00,$00\r
+       .DB     $90,$A8,$A8,$A8,$48,$00\r
+       .DB     $08,$08,$7E,$88,$88,$00\r
+       .DB     $78,$80,$80,$40,$F8,$00\r
+       .DB     $38,$40,$80,$40,$38,$00\r
+       .DB     $78,$80,$60,$80,$78,$00\r
+       .DB     $88,$50,$20,$50,$88,$00\r
+       .DB     $78,$80,$80,$80,$F8,$00\r
+       .DB     $88,$C8,$A8,$98,$88,$00\r
+       .DB     $10,$6C,$82,$82,$00,$00\r
+       .DB     $00,$00,$EE,$00,$00,$00\r
+       .DB     $00,$82,$82,$6C,$10,$00\r
+       .DB     $04,$02,$04,$08,$04,$00\r
+       .DB     $E0,$90,$88,$90,$E0,$00\r
+       .DB     $7C,$82,$82,$82,$44,$00\r
+       .DB     $7A,$80,$80,$40,$FA,$00\r
+       .DB     $70,$A8,$AA,$A9,$30,$00\r
+       .DB     $40,$AA,$A9,$AA,$F0,$00\r
+       .DB     $42,$A8,$A8,$A8,$F2,$00\r
+       .DB     $40,$A9,$AA,$A8,$F0,$00\r
+       .DB     $40,$AE,$AA,$AE,$F0,$00\r
+       .DB     $70,$88,$88,$88,$88,$00\r
+       .DB     $70,$AA,$A9,$AA,$30,$00\r
+       .DB     $72,$A8,$A8,$A8,$32,$00\r
+       .DB     $70,$A9,$AA,$A8,$30,$00\r
+       .DB     $02,$88,$F8,$80,$02,$00\r
+       .DB     $00,$8A,$F9,$82,$00,$00\r
+       .DB     $00,$89,$FA,$80,$00,$00\r
+       .DB     $F9,$24,$24,$24,$F9,$00\r
+       .DB     $F8,$27,$25,$27,$F8,$00\r
+       .DB     $F8,$A8,$AA,$A9,$88,$00\r
+       .DB     $68,$A8,$F8,$A8,$B0,$00\r
+       .DB     $FC,$12,$FE,$92,$92,$00\r
+       .DB     $70,$8A,$89,$8A,$70,$00\r
+       .DB     $72,$88,$88,$88,$72,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$82,$81,$42,$F8,$00\r
+       .DB     $78,$81,$82,$40,$F8,$00\r
+       .DB     $7A,$80,$80,$80,$FA,$00\r
+       .DB     $79,$84,$84,$84,$79,$00\r
+       .DB     $7D,$80,$80,$80,$7D,$00\r
+       .DB     $70,$88,$88,$FC,$88,$00\r
+       .DB     $90,$7C,$92,$92,$C4,$00\r
+       .DB     $52,$54,$F8,$54,$52,$00\r
+       .DB     $82,$82,$44,$44,$28,$28\r
+       .DB     $10,$10,$28,$54,$54,$28\r
+       .DB     $40,$A8,$AA,$A9,$F0,$00\r
+       .DB     $00,$8A,$F9,$80,$00,$00\r
+       .DB     $70,$88,$8A,$89,$70,$00\r
+       .DB     $78,$80,$82,$41,$F8,$00\r
+       .DB     $FA,$11,$0A,$09,$F0,$00\r
+       .DB     $FA,$11,$22,$41,$F8,$00\r
+       .DB     $90,$AA,$AA,$AA,$BC,$00\r
+       .DB     $9C,$A2,$A2,$A2,$9C,$00\r
+       .DB     $60,$90,$8A,$80,$40,$00\r
+       .DB     $FE,$02,$02,$02,$02,$02\r
+       .DB     $02,$02,$02,$02,$02,$FE\r
+       .DB     $2F,$10,$48,$24,$C0,$00\r
+       .DB     $2F,$90,$48,$E4,$00,$00\r
+       .DB     $00,$00,$F2,$00,$00,$00\r
+       .DB     $FE,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$80,$80,$80,$FE\r
+       .DB     $00,$80,$00,$00,$80,$00\r
+       .DB     $55,$AA,$55,$AA,$55,$AA\r
+       .DB     $33,$CC,$33,$CC,$33,$CC\r
+       .DB     $00,$00,$FF,$00,$00,$00\r
+       .DB     $10,$10,$FF,$00,$00,$00\r
+       .DB     $28,$28,$FF,$00,$00,$00\r
+       .DB     $10,$FF,$00,$FF,$00,$00\r
+       .DB     $10,$F0,$10,$F0,$00,$00\r
+       .DB     $28,$28,$F8,$00,$00,$00\r
+       .DB     $28,$EF,$00,$FF,$00,$00\r
+       .DB     $00,$FF,$00,$FF,$00,$00\r
+       .DB     $28,$E8,$08,$F8,$00,$00\r
+       .DB     $28,$2F,$20,$3F,$00,$00\r
+       .DB     $10,$1F,$10,$1F,$00,$00\r
+       .DB     $28,$28,$3F,$00,$00,$00\r
+       .DB     $10,$10,$F0,$00,$00,$00\r
+       .DB     $00,$00,$1F,$10,$10,$10\r
+       .DB     $10,$10,$1F,$10,$10,$10\r
+       .DB     $10,$10,$F0,$10,$10,$10\r
+       .DB     $00,$00,$FF,$10,$10,$10\r
+       .DB     $10,$10,$10,$10,$10,$10\r
+       .DB     $10,$10,$FF,$10,$10,$10\r
+       .DB     $00,$00,$FF,$28,$28,$28\r
+       .DB     $00,$FF,$00,$FF,$10,$10\r
+       .DB     $00,$3F,$20,$2F,$28,$28\r
+       .DB     $00,$F8,$08,$E8,$28,$28\r
+       .DB     $28,$2F,$20,$2F,$28,$28\r
+       .DB     $28,$E8,$08,$E8,$28,$28\r
+       .DB     $00,$FF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$28,$28,$28,$28\r
+       .DB     $28,$EF,$00,$EF,$28,$28\r
+       .DB     $28,$28,$2F,$28,$28,$28\r
+       .DB     $10,$1F,$10,$1F,$10,$10\r
+       .DB     $28,$28,$E8,$28,$28,$28\r
+       .DB     $10,$F0,$10,$F0,$10,$10\r
+       .DB     $00,$1F,$10,$1F,$10,$10\r
+       .DB     $00,$00,$3F,$28,$28,$28\r
+       .DB     $00,$00,$F8,$28,$28,$28\r
+       .DB     $00,$F0,$10,$F0,$10,$10\r
+       .DB     $10,$FF,$10,$FF,$10,$10\r
+       .DB     $28,$28,$FF,$28,$28,$28\r
+       .DB     $10,$10,$1F,$00,$00,$00\r
+       .DB     $00,$00,$F0,$10,$10,$10\r
+       .DB     $FF,$FF,$FF,$FF,$FF,$FF\r
+       .DB     $E0,$E0,$E0,$E0,$E0,$E0\r
+       .DB     $FF,$FF,$FF,$00,$00,$00\r
+       .DB     $00,$00,$00,$FF,$FF,$FF\r
+       .DB     $1F,$1F,$1F,$1F,$1F,$1F\r
+       .DB     $70,$88,$88,$70,$88,$00\r
+       .DB     $FC,$02,$92,$92,$6C,$00\r
+       .DB     $FE,$02,$02,$02,$06,$00\r
+       .DB     $08,$F8,$08,$F8,$08,$00\r
+       .DB     $C6,$AA,$92,$82,$C6,$00\r
+       .DB     $70,$88,$88,$78,$08,$00\r
+       .DB     $00,$F8,$80,$80,$78,$00\r
+       .DB     $10,$08,$F0,$08,$00,$00\r
+       .DB     $10,$AA,$EE,$AA,$10,$00\r
+       .DB     $7C,$92,$92,$92,$7C,$00\r
+       .DB     $9C,$E2,$02,$E2,$9C,$00\r
+       .DB     $60,$94,$9A,$92,$60,$00\r
+       .DB     $70,$88,$70,$88,$70,$00\r
+       .DB     $70,$88,$FC,$88,$70,$00\r
+       .DB     $38,$54,$92,$92,$00,$00\r
+       .DB     $FC,$02,$02,$02,$FC,$00\r
+       .DB     $54,$54,$54,$54,$54,$00\r
+       .DB     $88,$88,$BE,$88,$88,$00\r
+       .DB     $A2,$A2,$94,$94,$88,$00\r
+       .DB     $88,$94,$94,$A2,$A2,$00\r
+       .DB     $00,$00,$F8,$04,$08,$00\r
+       .DB     $40,$80,$7F,$00,$00,$00\r
+       .DB     $10,$10,$54,$10,$10,$00\r
+       .DB     $48,$24,$48,$24,$00,$00\r
+       .DB     $0C,$12,$12,$0C,$00,$00\r
+       .DB     $00,$18,$18,$00,$00,$00\r
+       .DB     $00,$00,$10,$00,$00,$00\r
+       .DB     $20,$40,$FF,$01,$01,$00\r
+       .DB     $1F,$02,$01,$1E,$00,$00\r
+       .DB     $00,$12,$19,$16,$00,$00\r
+       .DB     $00,$38,$38,$38,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00\r
+       .DB     $00,$02,$02,$02,$01,$00\r
+       .DB     $01,$02,$02,$01,$00,$00\r
+       .DB     $03,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$03,$00\r
+       .DB     $00,$00,$02,$03,$02,$00\r
+       .DB     $00,$01,$01,$03,$01,$00\r
+       .DB     $00,$00,$01,$00,$00,$00\r
+       .DB     $00,$00,$00,$01,$00,$00\r
+       .DB     $02,$01,$00,$00,$00,$00\r
+       .DB     $00,$02,$01,$00,$00,$00\r
+       .DB     $00,$00,$02,$01,$00,$00\r
+       .DB     $00,$01,$00,$00,$00,$00\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4107                   ; HARDWARE ADDRESS COMMAND\r
+       .DW     $4206                   ; SOFTWARE ADDRESS COMMAND\r
+       .DW     $ACBA                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/mac.inc b/src/avr/mac.inc
new file mode 100644 (file)
index 0000000..f2f9930
--- /dev/null
@@ -0,0 +1,195 @@
+;      MAC.INC\r
+;      MACROS FOR THE AVR PROCESSOR\r
+\r
+.MACRO RJEQ\r
+       BRNE    LOCAL\r
+       RJMP    @0\r
+LOCAL:\r
+.ENDMACRO\r
+\r
+.MACRO RJNE\r
+       BREQ    LOCAL\r
+       RJMP    @0\r
+LOCAL:\r
+.ENDMACRO\r
+\r
+.MACRO OUTI @0,@1\r
+       LDI     A,@1            ; OUT IMMEDIATE TO PORT\r
+       OUT     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ADDI @0,@1\r
+       SUBI    @0,-@1          ; ADD IMMEDIATE\r
+.ENDMACRO\r
+\r
+.MACRO EORI @0,@1\r
+       LDI     A,@1            ; EOR IMMEDIATE\r
+       EOR     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO STI @0,@1\r
+       LDI     A,@1            ; STORE IMMEDIATE\r
+       ST      @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ADDIL @0,@1\r
+       LDI     A,@1            ; ADD IMMEDIATE LOWER REGISTER SET\r
+       ADD     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO SUBIL @0,@1\r
+       LDI     A,@1            ; ADD IMMEDIATE LOWER REGISTER SET\r
+       SUB     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ANDIL @0,@1\r
+       LDI     A,@1            ; AND IMMEDIATE LOWER REGISTER SET\r
+       AND     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO LDIL @0,@1\r
+       LDI     A,@1            ; LOAD IMMEDIATE LOWER REGISTER SET\r
+       MOV     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO LDIX @0                 ; LOAD IMMEDIATE XL, XH WITH FLASH ADDRESS\r
+       LDI     XL,LOW((@0)*2)  ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((@0)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+.ENDMACRO\r
+\r
+.MACRO LDIZ @0                 ; LOAD IMMEDIATE ZL, ZH WITH FLASH ADDRESS\r
+       LDI     ZL,LOW((@0)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((@0)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+.ENDMACRO\r
+\r
+.MACRO LDE @0,@1               ; LOAD REGISTER FROM EEPROM\r
+       RCALL   LDE1\r
+       LDI     @0,LOW(@1*2)    ; POINT TO EEPROM CONSTANT\r
+       OUT     EEAR,@0         ; SET UP ADDRESS\r
+       SBI     EECR,EERE       ; ASSERT READ STROBE\r
+       IN      @0,EEDR\r
+.ENDMACRO\r
+\r
+.MACRO LDFL @0,@1              ; LOAD REGISTER FROM FLASH LOW BYTE\r
+       LDI     ZL,LOW(@1*2)\r
+       LDI     ZH,HIGH(@1*2)\r
+       LPM\r
+       MOV     @0,R0\r
+.ENDMACRO\r
+\r
+.MACRO LDFH @0,@1              ; LOAD REGISTER FROM FLASH HIGH BYTE\r
+       LDI     ZL,LOW(@1*2+1)\r
+       LDI     ZH,HIGH(@1*2+1)\r
+       LPM\r
+       MOV     @0,R0\r
+.ENDMACRO\r
+\r
+;.MACRO        LDF @0,@1               ; LOAD REGISTER FROM FLASH\r
+;      LDI     ZL,@1           ; POINT TO FLASH CONSTANT\r
+;      LPM\r
+;      MOV     @0,R0\r
+;.ENDMACRO\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+.MACRO FLD @0                  ; LOAD FA REGISTER FROM SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   LDS_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLDF @0                 ; LOAD FA REGISTER FROM FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   LDF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLDE @0                 ; LOAD FA REGISTER FROM EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   LDE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLD3 @0                 ; LOAD FA REGISTER WITH 3 BYTE SRAM INTEGER\r
+       LDI     YL,LOW(@0)      ; POINT TO SOURCE\r
+       RCALL   LDS3_FA         ; CONVERT TO INTERNAL FP FORMAT\r
+.ENDMACRO\r
+\r
+.MACRO FLD2 @0                 ; LOAD FA REGISTER WITH 2 BYTE SRAM INTEGER\r
+       LDI     YL,LOW(@0)      ; POINT TO SOURCE\r
+       RCALL   LDS2_FA         ; CONVERT TO INTERNAL FP FORMAT\r
+.ENDMACRO\r
+\r
+.MACRO FST @0                  ; STORE FP REGISTER TO FP ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   STS_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCHS @0                 ; CHANGE SIGN OF SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)\r
+       RCALL   CHSS\r
+.ENDMACRO\r
+\r
+.MACRO FAD @0                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   ADD_FA\r
+.ENDMACRO\r
+\r
+.MACRO FADF @0                 ; ADD FLASH CONSTANT TO FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   ADDF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FADE @0                 ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   ADDE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FSB @0                  ; SUBTRACT SRAM ARGUMENT FROM FA REGISTER\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   SUB_FA\r
+.ENDMACRO\r
+\r
+.MACRO FSBF @0                 ; SUBTRACT FLASH CONSTANT FROM FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   SUBF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FML @0                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   MUL_FA\r
+.ENDMACRO\r
+\r
+.MACRO FMLF @0                 ; MULTIPLY FA REGISTER BY FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   MULF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FDV @0                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   DIV_FA\r
+.ENDMACRO\r
+\r
+.MACRO FDVF @0                 ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   DIVF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCP @0                  ; COMPARE FA REGISTER WITH SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   CP_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCPF @0                 ; COMPARE FA REGISTER WITH FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   CPF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCPE @0                 ; COMPARE FA REGISTER WITH EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       RCALL   CPE_FA\r
+.ENDMACRO\r
+\r
diff --git a/src/avr/maclc.inc b/src/avr/maclc.inc
new file mode 100644 (file)
index 0000000..7e378ad
--- /dev/null
@@ -0,0 +1,242 @@
+;      MACLC.INC\r
+;      MACROS FOR THE AVR PROCESSOR\r
+\r
+.LISTMAC\r
+\r
+.MACRO OUTI @0,@1\r
+       LDI     A,@1    ; sends immediate data out port eg outi porta,$0f\r
+       OUT     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO PUL_H @0,@1\r
+       SBI     @0,@1   ; pulses bit in port high  eg pul_h portb,1\r
+       CBI     @0,@1\r
+.ENDMACRO\r
+\r
+.MACRO PUL_L @0,@1\r
+       CBI     @0,@1   ; pulses bit in port low  eg pul_l portb,1\r
+       SBI     @0,@1\r
+.ENDMACRO\r
+\r
+.MACRO RAMW @0\r
+       CBI     PORTD,WE\r
+       CBI     PORTD,CS\r
+       LDI     A,@0            ; writes immed data to static ram  eg ramw  $34\r
+       OUT     PORTA,A\r
+       SBI     PORTD,CS\r
+       SBI     PORTD,WE        ; NOT PORTABLE -USED FOR LCD CONTROL\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR @0\r
+       CBI     PORTD,WE\r
+       CBI     PORTD,CS\r
+       MOV     A,@0            ; writes REG data to static ram  eg ramw  R21\r
+       OUT     PORTA,A\r
+       SBI     PORTD,CS\r
+       SBI     PORTD,WE        ; NOT PORTABLE -USED FOR LCD CONTROL\r
+.ENDMACRO\r
+\r
+.MACRO ADDI @0,@1\r
+       SUBI    @0,-@1          ; add immediate data to reg\r
+.ENDMACRO\r
+\r
+.MACRO EORI @0,@1\r
+       LDI     A,@1            ; EOR IMMEDIATE\r
+       EOR     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO STI @0,@1\r
+       LDI     A,@1            ; STORE IMMEDIATE\r
+       ST      @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ADDIL @0,@1\r
+       LDI     A,@1            ; ADD IMMEDIATE LOWER REGISTER SET\r
+       ADD     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO SUBIL @0,@1\r
+       LDI     A,@1            ; ADD IMMEDIATE LOWER REGISTER SET\r
+       SUB     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ANDIL @0,@1\r
+       LDI     A,@1            ; AND IMMEDIATE LOWER REGISTER SET\r
+       AND     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO LDIL @0,@1\r
+       LDI     A,@1            ; LOAD IMMEDIATE LOWER REGISTER SET\r
+       MOV     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO LDIZ @0                 ; LOAD IMMEDIATE ZL, ZH WITH FLASH ADDRESS\r
+       LDI     ZL,LOW(@0*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH(@0*2)\r
+.ENDMACRO\r
+\r
+.MACRO LDE @0,@1               ; LOAD REGISTER FROM EEPROM\r
+       RCALL   LDE1\r
+       LDI     @0,LOW(@1*2)    ; POINT TO EEPROM CONSTANT\r
+       OUT     EEAR,@0         ; SET UP ADDRESS\r
+       SBI     EECR,EERE       ; ASSERT READ STROBE\r
+       IN      @0,EEDR\r
+.ENDMACRO\r
+\r
+.MACRO LDER @0,@1              ; LOAD REGISTER FROM EEPROM 17MAY01\r
+;      RCALL   LDE1\r
+       LDI     @0,LOW(@1*2)    ; POINT TO EEPROM CONSTANT\r
+       OUT     EEAR,@0         ; SET UP ADDRESS\r
+       SBI     EECR,EERE       ; ASSERT READ STROBE\r
+       IN      @0,EEDR\r
+.ENDMACRO\r
+\r
+.MACRO LDFL @0,@1              ; LOAD REGISTER FROM FLASH LOW BYTE\r
+       LDI     ZL,LOW(@1*2)\r
+       LDI     ZH,HIGH(@1*2)\r
+       LPM\r
+       MOV     @0,R0\r
+.ENDMACRO\r
+\r
+.MACRO LDFH @0,@1              ; LOAD REGISTER FROM FLASH HIGH BYTE\r
+       LDI     ZL,LOW(@1*2+1)\r
+       LDI     ZH,HIGH(@1*2+1)\r
+       LPM\r
+       MOV     @0,R0\r
+.ENDMACRO\r
+\r
+;.MACRO        LDF @0,@1               ; LOAD REGISTER FROM FLASH\r
+;      LDI     ZL,@1           ; POINT TO FLASH CONSTANT\r
+;      LPM\r
+;      MOV     @0,R0\r
+;.ENDMACRO\r
+\r
+;.MACRO        FDVI @0,@1              ; DIVIDE FLASH CONSTANT BY 3 BYTE SRAM INTEGER\r
+;      LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+;      LDI     YL,LOW(@1)      ; POINT TO SRAM INTEGER\r
+;      RCALL   FP_DIVI\r
+;.ENDMACRO\r
+\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+.MACRO FLD @0                  ; LOAD FA REGISTER FROM SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   LDS_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLDF @0                 ; LOAD FA REGISTER FROM FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   LDF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLDE @0                 ; LOAD FA REGISTER FROM EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   LDE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLD3 @0                 ; LOAD FA REGISTER WITH 3 BYTE SRAM INTEGER\r
+       LDI     YL,LOW(@0)      ; POINT TO SOURCE\r
+       RCALL   LDS3_FA         ; CONVERT TO INTERNAL FP FORMAT\r
+.ENDMACRO\r
+\r
+.MACRO FLD2 @0                 ; LOAD FA REGISTER WITH 2 BYTE SRAM INTEGER\r
+       LDI     YL,LOW(@0)      ; POINT TO SOURCE\r
+       RCALL   LDS2_FA         ; CONVERT TO INTERNAL FP FORMAT\r
+.ENDMACRO\r
+\r
+.MACRO FST @0                  ; STORE FP REGISTER TO FP ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   STS_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCHS @0                 ; CHANGE SIGN OF SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)\r
+       RCALL   CHSS\r
+.ENDMACRO\r
+\r
+.MACRO FAD @0                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   ADD_FA\r
+.ENDMACRO\r
+\r
+.MACRO FADE @0                 ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   ADDE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FADF @0                 ; ADD FLASH CONSTANT TO FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   ADDF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FSB @0                  ; SUBTRACT SRAM ARGUMENT FROM FA REGISTER\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   SUB_FA\r
+.ENDMACRO\r
+\r
+.MACRO FSBE @0                 ; SUBTRACT EEPROM CONSTANT FROM FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   SUBE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FSBF @0                 ; SUBTRACT FLASH CONSTANT FROM FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   SUBF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FML @0                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   MUL_FA\r
+.ENDMACRO\r
+\r
+.MACRO FMLE @0                 ; MULTIPLY FA REGISTER BY EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   MULE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FMLF @0                 ; MULTIPLY FA REGISTER BY FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   MULF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FDV @0                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   DIV_FA\r
+.ENDMACRO\r
+\r
+.MACRO FDVE @0                 ; DIVIDE FA REGISTER BY EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   DIVE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FDVF @0                 ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   DIVF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCP @0                  ; COMPARE FA REGISTER WITH SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   CP_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCPE @0                 ; COMPARE FA REGISTER WITH EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       RCALL   CPE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCPF @0                 ; COMPARE FA REGISTER WITH FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   CPF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCLR                    ; CLEAR FA REGISTER 17MAY01\r
+       RCALL   MIN_FA\r
+.ENDMACRO\r
+\r
diff --git a/src/avr/makchr.bas b/src/avr/makchr.bas
new file mode 100644 (file)
index 0000000..143c1fa
--- /dev/null
@@ -0,0 +1,650 @@
+       ' MAKCHR.BAS\r
+       ' POWERBASIC VERSION\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+$LIB VGA\r
+\r
+$LINK "PUTPCX.OBJ"\r
+DECLARE SUB PUTPCX(STRING)\r
+\r
+$LINK "CHKLIN.OBJ"\r
+DECLARE SUB CHKLIN(INTEGER)\r
+\r
+       $INCLUDE "CRCSUBX.INC"\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+       DIM BLANKT%(300),BLANKB%(300)\r
+       DIM DIG%(18,3,4)\r
+       DIM BYTES%(16),PREFIX$(255)\r
+\r
+       DEF FNH$(N%,L%)=RIGHT$("000"+HEX$(N%),L%)\r
+\r
+       FOR D%=0 TO 18\r
+         FOR Y%=0 TO 4\r
+           FOR X%=0 TO 2\r
+             READ Z%\r
+             IF Z%=0 THEN DIG%(D%,X%,Y%)=15\r
+           NEXT X%\r
+           DIG%(D%,X%,Y%)=15\r
+         NEXT Y%\r
+       NEXT D%\r
+       INDEX%=0\r
+\r
+       F$=LTRIM$(RTRIM$(COMMAND$))\r
+       I%=INSTR(F$," ")\r
+       IF I% THEN\r
+         OUTFIL$=LTRIM$(MID$(F$,I%))\r
+         F$=RTRIM$(LEFT$(F$,I%))\r
+       END IF\r
+       IF LEN(F$) THEN NO.QUESTION\r
+\r
+       CLS\r
+       INTERACTIVE%=-1\r
+       INPUT "Filename: [SET00.PCX] ",F$\r
+\r
+NO.QUESTION:\r
+       IF LEN(F$)=0 THEN F$="SET00"\r
+       I%=INSTR(F$,".")\r
+       IF I% THEN\r
+         F0$=LEFT$(F$,I%-1)\r
+         F1$=MID$(F$,I%)\r
+       ELSE\r
+         F0$=F$\r
+         F1$=".PCX"\r
+       END IF\r
+\r
+       DAT$=""\r
+       IDX$=STRING$(512,0)\r
+ OVL$="" ' OVERLAYS CHARACTERS 60-FE INCLUSIVE\r
+\r
+       IF LEN(F0$)<=5 THEN\r
+         COUNTRY$=LEFT$(UCASE$(ENVIRON$("CSC")),3)\r
+         F$=F0$+COUNTRY$+F1$\r
+         GOSUB LOAD.PCX\r
+         IF PCX.ERROR.FLAG%=0 THEN COUNTRY.SPECIFIC\r
+       END IF\r
+       F$=F0$+F1$\r
+       GOSUB LOAD.PCX\r
+       IF PCX.ERROR.FLAG% THEN\r
+         IF CSRLIN=25 THEN PRINT:LOCATE 24,1\r
+         PRINT "FILE NOT FOUND"\r
+         END\r
+       END IF\r
+COUNTRY.SPECIFIC:\r
+\r
+       ' DEFAULTS FOR HEX INFO\r
+       XCELL%=5\r
+       YCELL%=7\r
+       ICS%=1\r
+       ILS%=1\r
+       XL0%=&H4F\r
+\r
+       ' INTERPRET HEX INFO\r
+       Y%=0\r
+BODGELOOP:\r
+       BYT%=0\r
+       X%=0\r
+BYTLOOP:\r
+       FOR II%=0 TO 4\r
+         GOSUB GETHEX\r
+         IF DIGITS% THEN BYTES%(BYT%)=HEXNUM%:INCR BYT%:GOTO BYTLOOP\r
+         INCR X%\r
+       NEXT II%\r
+       IF BYT% THEN\r
+         LINE (0,Y%)-(X%-1,Y%+4),,BF\r
+         IF Y%=0 THEN\r
+           IF LEN(OUTFIL$)=0 THEN OUTFIL$="CHSET"+FNH$(BYTES%(0),2)+".WIN"\r
+           IF BYT%>1 THEN XCELL%=BYTES%(1)\r
+           IF BYT%>2 THEN YCELL%=BYTES%(2)\r
+           IF BYT%>3 THEN ICS%=BYTES%(3)\r
+           IF BYT%>4 THEN ILS%=BYTES%(4)\r
+           IF BYT%>5 THEN XL0%=BYTES%(5)\r
+         ELSE\r
+           FOR II%=1 TO BYT%-1\r
+             PREFIX$(BYTES%(0))=PREFIX$(BYTES%(0))+CHR$(BYTES%(II%))\r
+           NEXT II%\r
+         END IF\r
+         INCR Y%,6\r
+         GOTO BODGELOOP\r
+       END IF\r
+\r
+       IF INTERACTIVE% THEN K$=INPUT$(1)\r
+\r
+       ' FIND BLOCKS OF =>3 BLANK LINES IN PICTURE\r
+       BSIZ%=0\r
+       BLANKT%(0)=-3\r
+       LAST.FLAG%=0\r
+       FOR Y%=0 TO 479\r
+         FLAG%=Y%\r
+         CALL CHKLIN(FLAG%)\r
+         IF FLAG%<>LAST.FLAG% THEN\r
+           IF LAST.FLAG% THEN\r
+             BLANKT%(BSIZ%)=Y%\r
+           ELSE\r
+             BLANKB%(BSIZ%)=Y%\r
+             IF BLANKB%(BSIZ%)-BLANKT%(BSIZ%)=>3 THEN INCR BSIZ%\r
+           END IF\r
+         END IF\r
+         LAST.FLAG%=FLAG%\r
+       NEXT Y%\r
+       IF LAST.FLAG% THEN BLANKT%(BSIZ%)=480\r
+       BLANKB%(BSIZ%)=483\r
+       INCR BSIZ%\r
+\r
+       ' CHECK FOR 1 SET OF CHAR DEFINITIONS BETWEEN EACH PAIR OF BLANKS\r
+       FOR BL%=0 TO BSIZ%-3\r
+         YT%=BLANKB%(BL%)\r
+         YB%=BLANKT%(BL%+1)-1\r
+         ASCII.FLAG%=0\r
+         FOR XL%=0 TO 639\r
+           IF POINT(XL%,YT%)=0 THEN GOTL\r
+         NEXT XL%\r
+         ' SHOULD NEVER GET HERE\r
+GOTL:\r
+         IF POINT(XL%+1,YT%)=0 THEN SKIP\r
+         IF POINT(XL%,YB%) THEN\r
+           IF YB%-YT%<8 THEN SKIP              ' NO ROOM FOR ASCII\r
+           FLAG%=YB%-5\r
+           CALL CHKLIN(FLAG%)\r
+           IF FLAG% THEN SKIP                  ' NO BLANK LINE PRECEDING ASCII\r
+           FOR J%=YB%-4 TO YB%\r
+             FLAG%=J%\r
+             CALL CHKLIN(FLAG%)\r
+             IF FLAG%=0 THEN SKIP              ' BLANK LINE IN ASCII REGION\r
+           NEXT J%\r
+           YB%=YB%-6\r
+           ASCII.FLAG%=-1\r
+           XASC%=0\r
+           IF POINT(XL%,YB%) THEN SKIP\r
+         END IF\r
+         IF POINT(XL%+1,YB%)=0 THEN SKIP\r
+\r
+         FLAG%=YT%+1\r
+         CALL CHKLIN(FLAG%)\r
+         IF FLAG% THEN SKIP                    ' NO BLANK LINE BELOW TOP\r
+         FLAG%=YB%-1\r
+         CALL CHKLIN(FLAG%)\r
+         IF FLAG% THEN SKIP                    ' NO BLANK LINE ABOVE BOT\r
+\r
+         FOR XR%=639 TO 0 STEP -1\r
+           IF POINT(XR%,YT%)=0 THEN GOTR\r
+         NEXT XR%\r
+         ' SHOULD NEVER GET HERE\r
+GOTR:\r
+         IF XR%-XL%<2 THEN SKIP\r
+         FOR YY%=YT% TO YB%\r
+           IF POINT(XL%,YY%)<>POINT(XR%,YY%) THEN SKIP\r
+         NEXT YY%\r
+         BREAKS%=0\r
+         FOR YY%=YT%+2 TO YB%-2\r
+           IF POINT(XL%,YY%) THEN INCR BREAKS%\r
+         NEXT YY%\r
+         IF BREAKS%>2 THEN SKIP\r
+\r
+         ASCEND.FLAG%=0\r
+         DESCEND.FLAG%=0\r
+         IF BREAKS% THEN\r
+           FOR YY%=YB%-2 TO YT%+2 STEP -1\r
+             IF POINT(XL%,YY%) THEN DESCEND.FLAG%=YB%-YY%-1:GOTO GOTDES\r
+           NEXT YY%\r
+         END IF\r
+GOTDES:\r
+         IF BREAKS%>1 THEN\r
+           FOR YY%=YT%+2 TO YB%-2\r
+             IF POINT(XL%,YY%) THEN ASCEND.FLAG%=YY%-YT%-1:GOTO GOTAS\r
+           NEXT YY%\r
+         END IF\r
+GOTAS:\r
+         HEIGHT%=YB%-YT%-3-ASCEND.FLAG%-DESCEND.FLAG%\r
+\r
+         Y0%=YT%+2\r
+         Y1%=YB%-2\r
+         FOR XX%=XL%+2 TO XR%-2\r
+           IF POINT(XX%,YT%)=0 OR POINT(XX%,YB%)=0 THEN\r
+             X0%=XX%\r
+             FOR XX%=XX% TO XR%-3\r
+               IF POINT(XX%+1,YT%) AND POINT(XX%+1,YB%) THEN GOTX1\r
+             NEXT XX%\r
+GOTX1:\r
+             X1%=XX%\r
+             GOSUB CHAR\r
+           END IF\r
+         NEXT XX%\r
+\r
+SKIP:\r
+       NEXT BL%\r
+\r
+       IDX_20$=MID$(IDX$,&H20*2+1,2)\r
+       IDX_30$=MID$(IDX$,&H30*2+1,2)\r
+       IDX_4F$=MID$(IDX$,&H4F*2+1,2)\r
+       IDX_FF$=MID$(IDX$,&HFF*2+1,2)\r
+\r
+       FOR CHK%=0 TO 254\r
+         IDX_CHK$=MID$(IDX$,CHK%*2+1,2)\r
+         IF IDX_CHK$=MKI$(0) THEN\r
+           IF LEN(PREFIX$(CHK%)) THEN\r
+             INDEX%=CHK%\r
+             P$=""\r
+             D$=""\r
+             XB%=0\r
+             GOSUB ADDCHR\r
+           ELSE\r
+             IF CHK%=&H30 THEN IDX_CHK$=IDX_4F$\r
+             IF CHK%=&H4F THEN IDX_CHK$=IDX_30$\r
+             IF IDX_CHK$=MKI$(0) THEN IDX_CHK$=IDX_FF$\r
+             IF IDX_CHK$=MKI$(0) THEN IDX_CHK$=IDX_20$\r
+             MID$(IDX$,CHK%*2+1,2)=IDX_CHK$\r
+           END IF\r
+         END IF\r
+       NEXT CHK%\r
+\r
+ MID$(IDX$, 1+&H100)=OVL$ ' OVERLAYS CHARACTERS 80-FF INCLUSIVE\r
+\r
+       ' SEARCH FOR &H208 IF ADD ANYTHING HERE\r
+       IDX$=IDX$+CHR$(XCELL%+ICS%)+CHR$(YCELL%+ILS%)+ _\r
+                 CHR$(ICS%)+CHR$(ILS%)+ _\r
+                 CHR$(XL0%)+CHR$(0)+MKI$(0)    ' SPARE BYTE, FILE LENGTH WORD\r
+\r
+       IF LEN(OUTFIL$) THEN\r
+         L0%=LEN(IDX$)+LEN(DAT$)+16\r
+         L1%=L0% ' TSV4 (L0%+&H7F) AND &HFF80\r
+         PAD$=STRING$(L1%-L0%, &H1A)\r
+         MID$(IDX$, 1+&H206)=MKI$(L1%)\r
+\r
+         TT$=TIME$\r
+         DD$=DATE$\r
+         TD$=RIGHT$(DD$,2)+MID$(DD$,4,2)+LEFT$(DD$,2)\r
+         TD$=TD$+LEFT$(TT$,2)+MID$(TT$,4,2)+RIGHT$(TT$,2)\r
+         CRC%=-1\r
+         CRC_CALCULATE CRC%, TD$\r
+         CRC_CALCULATE CRC%, IDX$\r
+         CRC_CALCULATE CRC%, DAT$\r
+         CRC_CALCULATE CRC%, PAD$\r
+         TD$=FNH$(CRC%,4)+TD$\r
+\r
+         ON ERROR GOTO HUJ\r
+         KILL OUTFIL$\r
+         ON ERROR GOTO 0\r
+HUJU:\r
+         OPEN OUTFIL$ FOR BINARY AS #1\r
+         PUT$ #1,TD$\r
+         PUT$ #1,IDX$\r
+         PUT$ #1,DAT$\r
+         PUT$ #1,PAD$\r
+         CLOSE #1\r
+       END IF\r
+\r
+       OPEN "MAKCHR.LOG" FOR OUTPUT AS #1\r
+       FOR I%=0 TO &H5F '&HFF\r
+         P%=CVI(MID$(IDX$,I%*2+1,2))\r
+         IF P% THEN\r
+           L$="CHR="+FNH$(I%,2)+" PTR="+FNH$(P%,4)+" "\r
+           P%=P%+1 ' TSV4 -LEN(IDX$)+1\r
+           XS%=ASC(MID$(IDX$+DAT$,P%,1)) ' TSV4 DAT$,P%,1))\r
+           IF (XS% AND &H1F) THEN\r
+             L$=L$+"XB="+USING$("####",XS% AND &H1F)+" "\r
+             YS%=ASC(MID$(IDX$+DAT$,P%+1,1)) ' TSV4 DAT$,P%+1,1))\r
+             L$=L$+"YB="+USING$("####",YS%)+" "\r
+           ELSE\r
+             L$=L$+SPACE$(16)\r
+           END IF\r
+           IF (XS% AND &H80) THEN\r
+             XO%=ASC(MID$(IDX$+DAT$,P%-3,1)) ' TSV4 DAT$,P%-3,1))\r
+             L$=L$+"XO="+USING$("####",XO%)+" "\r
+           ELSE\r
+             L$=L$+SPACE$(8)\r
+           END IF\r
+           IF (XS% AND &H40) THEN\r
+             YO%=ASC(MID$(IDX$+DAT$,P%-2,1)) ' TSV4 DAT$,P%-2,1))\r
+             L$=L$+"YO="+USING$("####",YO%)+" "\r
+           ELSE\r
+             L$=L$+SPACE$(8)\r
+           END IF\r
+           IF (XS% AND &H20) THEN\r
+             PW%=ASC(MID$(IDX$+DAT$,P%-1,1)) ' TSV4 DAT$,P%-1,1))\r
+             L$=L$+"PW="+USING$("####",PW%)+" "\r
+           ELSE\r
+             L$=L$+SPACE$(8)\r
+           END IF\r
+           PRINT #1,RTRIM$(L$)\r
+         END IF\r
+       NEXT I%\r
+\r
+       IF INTERACTIVE% THEN K$=INPUT$(1)\r
+       SCREEN 0\r
+       END\r
+\r
+HUJ:\r
+       RESUME HUJU\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+CHAR:\r
+       ' CHECK FOR ASCII CODE BENEATH MATRIX\r
+       IF ASCII.FLAG% AND X0%=>XASC% THEN\r
+         X%=X0%\r
+         Y%=YB%+2\r
+         FOR YY%=Y% TO Y%+4\r
+           IF POINT(X%,YY%)=0 THEN\r
+             GOSUB GETHEX\r
+             IF DIGITS% THEN\r
+               INDEX%=HEXNUM% ':PRINT " " HEX$(INDEX%);\r
+               XASC%=X%\r
+             END IF\r
+             GOTO GOTINDEX\r
+           END IF\r
+         NEXT YY%\r
+       END IF\r
+GOTINDEX:\r
+\r
+       ' SET VERTICAL ANCHOR\r
+       IF BREAKS% THEN\r
+         YA%=Y0%+ASCEND.FLAG%+HEIGHT%-YCELL%\r
+       ELSE\r
+         YA%=Y0%\r
+       END IF\r
+\r
+       ' INTERPRET TOP GUARD BAR (FIRST PIXEL GIVES HORIZONTAL ANCHOR)\r
+       FOR XA%=X0% TO X1%\r
+         IF POINT(XA%,YT%)=0 THEN GOTANCHOR\r
+       NEXT XA%\r
+GOTANCHOR:\r
+       ' INTERPRET BOTTOM GUARD BAR (LAST PIXEL GIVES WIDTH)\r
+       FOR X%=X1% TO XA% STEP -1\r
+         IF POINT(X%,YB%)=0 THEN GOTWID\r
+       NEXT X%\r
+GOTWID:\r
+       WID%=X%+1-XA%\r
+       IF WID%>0 THEN WID%=WID%+ICS%\r
+       P$=""\r
+       D$=""\r
+\r
+       ' FIND CHAR EXTENTS\r
+       XMIN%=999:XMAX%=-1\r
+       YMIN%=999:YMAX%=-1\r
+       FOR X%=X0% TO X1%\r
+         FOR Y%=Y0% TO Y1%\r
+           IF POINT(X%,Y%)=0 THEN\r
+             IF X%<XMIN% THEN XMIN%=X%\r
+             IF X%>XMAX% THEN XMAX%=X%\r
+             IF Y%<YMIN% THEN YMIN%=Y%\r
+             IF Y%>YMAX% THEN YMAX%=Y%\r
+           END IF\r
+         NEXT Y%\r
+       NEXT X%\r
+       XS%=XMAX%+1-XMIN%\r
+       YS%=YMAX%+1-YMIN%\r
+       IF XS%<=0 OR YS%<=0 THEN XB%=0:GOTO BLANKCHR\r
+\r
+       XB%=INT((XS%+7)/8)\r
+\r
+       ' ELIMINATE X/Y OFFSETS IF MORE ECONOMICAL\r
+       FIXED%=0\r
+       IF WID%<>XCELL%+ICS% THEN FIXED%=1\r
+       ' TRY WITHOUT Y OFFSET, BUT ONLY TO SET FIXED% YMIN2% YS2%\r
+       YMIN2%=YMIN%:YS2%=YS%\r
+       IF YMIN2%>YA% THEN\r
+         YS3%=YMAX%+1-YA%\r
+         IF (XB%*YS3%+FIXED%)<=(XB%*YS%+2) THEN YMIN2%=YA%:YS2%=YS3%\r
+       END IF\r
+       IF YMIN2%<>YA% THEN FIXED%=2\r
+       ' TRY WITHOUT X OFFSET\r
+       IF XMIN%>XA% THEN\r
+         XS2%=XMAX%+1-XA%\r
+         XB2%=INT((XS2%+7)/8)\r
+         IF (XB2%*YS2%+FIXED%)<=(XB%*YS%+3) THEN XMIN%=XA%:XS%=XS2%:XB%=XB2%\r
+       END IF\r
+       IF XMIN%=XA% THEN YMIN%=YMIN2%:YS%=YS2%\r
+\r
+       ' ENCODE CHARACTER\r
+       D$=CHR$(YS%)\r
+       XMAX%=XMIN%+XB%*8-1\r
+       IF XMAX%>X1% THEN XMAX%=X1%\r
+       FOR Y%=YMIN% TO YMAX%\r
+         C%=0\r
+         O%=&H80\r
+         BG%=7 '9\r
+         FOR X%=XMIN% TO XMAX%\r
+           IF POINT(X%,Y%)=0 THEN C%=C% OR O% ELSE PSET (X%,Y%),BG%\r
+           O%=INT(O%/2)\r
+           IF O%=0 THEN\r
+             D$=D$+CHR$(C%)\r
+             C%=0\r
+             O%=&H80\r
+ '           BG%=BG% XOR 8\r
+           END IF\r
+         NEXT X%\r
+         IF O%<>&H80 THEN D$=D$+CHR$(C%)\r
+       NEXT Y%\r
+       IF XA%<>XMIN% THEN XOFF\r
+       IF YA%<>YMIN% THEN YOFF\r
+BLANKCHR:\r
+       IF WID%<>XCELL%+ICS% THEN WD\r
+       GOTO ADDCHR\r
+\r
+XOFF:\r
+       P$=CHR$((XMIN%-XA%) AND &HFF)\r
+       XB%=XB% OR &H80\r
+YOFF:\r
+       P$=P$+CHR$((YMIN%-YA%) AND &HFF)\r
+       XB%=XB% OR &H40\r
+WD:\r
+       P$=P$+CHR$(WID%)\r
+       XB%=XB% OR &H20\r
+\r
+ADDCHR:\r
+       I%=LEN(PREFIX$(INDEX%))\r
+       IF I%>LEN(P$) THEN\r
+         P$=PREFIX$(INDEX%)\r
+         XB%=XB% OR &H20\r
+         IF I%=>2 THEN XB%=XB% OR &H40\r
+         IF I%=>3 THEN XB%=XB% OR &H80\r
+       ELSEIF I%>0 THEN\r
+         P$=LEFT$(P$,LEN(P$)-I%)+PREFIX$(INDEX%)\r
+       END IF\r
+       PD$=P$+CHR$(XB%)+D$\r
+ I%=INSTR(OVL$,PD$) ' TSV4\r
+ IF I%=0 THEN\r
+   IF LEN(OVL$)+LEN(PD$)>&HFE THEN ' OVERLAYS CHARACTERS 80-FE INCLUSIVE\r
+       I%=INSTR(DAT$,PD$)\r
+       IF I%=0 THEN I%=LEN(DAT$)+1:DAT$=DAT$+PD$\r
+       MID$(IDX$,INDEX%*2+1,2)=MKI$(I%+LEN(P$)+&H208-1)\r
+       INCR INDEX%\r
+       RETURN\r
+   END IF\r
+   I%=LEN(OVL$)+1:OVL$=OVL$+PD$\r
+ END IF\r
+ MID$(IDX$,INDEX%*2+1,2)=MKI$(I%+LEN(P$)+&H100-1)\r
+ INCR INDEX%\r
+ RETURN\r
+\r
+ '     IF ASCEND.FLAG% THEN LINE (X0%,YT%+2)-(X1%,YT%+1+ASCEND.FLAG%),4,BF\r
+ '     LINE (X0%,YT%+2+ASCEND.FLAG%)-(X1%,YB%-2-DESCEND.FLAG%),12,BF\r
+ '     IF DESCEND.FLAG% THEN LINE (X0%,YB%-1-DESCEND.FLAG%)-(X1%,YB%-2),4,BF\r
+ '     RETURN\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+LOAD.PCX:\r
+       ON ERROR GOTO PCX.ERROR\r
+       OPEN F$ FOR INPUT AS #1\r
+       CLOSE #1\r
+       ON ERROR GOTO 0\r
+       OPEN F$ FOR BINARY AS #1\r
+       GET$ #1,32700,A$\r
+       CLOSE\r
+       IF LEN(A$)=0 THEN KILL F$:RETURN\r
+       SCREEN 12\r
+       CALL PUTPCX(A$)\r
+       A$=""\r
+       PCX.ERROR.FLAG%=0\r
+       RETURN\r
+\r
+PCX.ERROR:\r
+       PCX.ERROR.FLAG%=-1\r
+       RESUME PCX.ERROR.2\r
+PCX.ERROR.2:\r
+       RETURN\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
+GETHEX:\r
+       DIGITS%=0\r
+       HEXNUM%=0\r
+HEXLOOP:\r
+       FOR D%=0 TO 18\r
+         IF D%=16 THEN WID%=2 ELSE WID%=4\r
+         FOR XH%=0 TO WID%-1\r
+           FOR YH%=0 TO 4\r
+             IF POINT(X%+XH%,Y%+YH%)<>DIG%(D%,XH%,YH%) THEN NOTDIG\r
+           NEXT YH%\r
+         NEXT XH%\r
+         IF D%=16 THEN D%=1\r
+         IF D%=17 THEN D%=6\r
+         IF D%=18 THEN D%=9\r
+         HEXNUM%=HEXNUM%*16+D%\r
+         INCR DIGITS%\r
+         INCR X%,WID%\r
+         IF DIGITS%=>2 THEN RETURN             ' BYTES ONLY\r
+         GOTO HEXLOOP\r
+NOTDIG:\r
+       NEXT D%\r
+       RETURN\r
+\r
+       ' 0\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,0,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+\r
+       ' 1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+\r
+       ' 2\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 1,1,1\r
+       DATA 1,0,0\r
+       DATA 1,1,1\r
+\r
+       ' 3\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 1,1,1\r
+\r
+       ' 4\r
+       DATA 1,0,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+\r
+       ' 5\r
+       DATA 1,1,1\r
+       DATA 1,0,0\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 1,1,1\r
+\r
+       ' 6\r
+       DATA 1,0,0\r
+       DATA 1,0,0\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+\r
+       ' 7\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+\r
+       ' 8\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+\r
+       ' 9\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 0,0,1\r
+\r
+       ' A\r
+       DATA 0,1,0\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,0,1\r
+\r
+       ' B\r
+       DATA 1,1,0\r
+       DATA 1,0,1\r
+       DATA 1,1,0\r
+       DATA 1,0,1\r
+       DATA 1,1,0\r
+\r
+       ' C\r
+       DATA 0,1,0\r
+       DATA 1,0,1\r
+       DATA 1,0,0\r
+       DATA 1,0,1\r
+       DATA 0,1,0\r
+\r
+       ' D\r
+       DATA 1,1,0\r
+       DATA 1,0,1\r
+       DATA 1,0,1\r
+       DATA 1,0,1\r
+       DATA 1,1,0\r
+\r
+       ' E\r
+       DATA 1,1,1\r
+       DATA 1,0,0\r
+       DATA 1,1,1\r
+       DATA 1,0,0\r
+       DATA 1,1,1\r
+\r
+       ' F\r
+       DATA 1,1,1\r
+       DATA 1,0,0\r
+       DATA 1,1,1\r
+       DATA 1,0,0\r
+       DATA 1,0,0\r
+\r
+       ' 1 ALTERNATE\r
+       DATA 1,0,0\r
+       DATA 1,0,0\r
+       DATA 1,0,0\r
+       DATA 1,0,0\r
+       DATA 1,0,0\r
+\r
+       ' 6 ALTERNATE\r
+       DATA 1,1,1\r
+       DATA 1,0,0\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+\r
+       ' 9 ALTERNATE\r
+       DATA 1,1,1\r
+       DATA 1,0,1\r
+       DATA 1,1,1\r
+       DATA 0,0,1\r
+       DATA 1,1,1\r
+\r
+' -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/makchr.exe b/src/avr/makchr.exe
new file mode 100644 (file)
index 0000000..4386ca7
Binary files /dev/null and b/src/avr/makchr.exe differ
diff --git a/src/avr/mega8def.inc b/src/avr/mega8def.inc
new file mode 100644 (file)
index 0000000..7b09696
--- /dev/null
@@ -0,0 +1,380 @@
+;      MEGA8DEF.INC\r
+;      Register/Bit Definitions for the ATmega8\r
+;      17JUN02\r
+\r
+;      When including this file in the assembly program file, all I/O register \r
+;      names and I/O register bit names appearing in the data book can be used.\r
+;      In addition, the six registers forming the three data pointers X, Y and\r
+;      Z have been assigned names XL - ZH. Highest RAM address for Internal \r
+;      SRAM is also defined.\r
+;\r
+;      The Register names are represented by their hexadecimal address.\r
+;      The Register Bit names are represented by their bit number (0-7).\r
+;\r
+;      Please observe the difference in using the bit names with instructions\r
+;      such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" \r
+;      (skip if bit in register set/cleared). The following example illustrates\r
+;      this:\r
+;\r
+;      in      r16,PORTB               ;read PORTB latch\r
+;      sbr     r16,(1<<PB6)+(1<<PB5)   ;set PB6 and PB5 (use masks, not bit#)\r
+;      out  PORTB,r16          ;output to PORTB\r
+;\r
+;      in      r16,TIFR                ;read the Timer Interrupt Flag Register\r
+;      sbrc    r16,TOV0                ;test the overflow flag (use bit#)\r
+;      rjmp    TOV0_is_set             ;jump if set\r
+;      ...                             ;otherwise do something else\r
+\r
+;.device ATmega8\r
+.device AT90S8535                      ; fudge for old compiler\r
+\r
+.equ   SREG    =$3f\r
+.equ   SP      =$3d\r
+.equ   SPL     =$3d\r
+.equ   SPH     =$3e\r
+.equ   GIMSK   =$3b\r
+.equ   GICR    =$3b\r
+.equ   GIFR    =$3a\r
+.equ   TIMSK   =$39\r
+.equ   TIFR    =$38\r
+.equ   SPMCR   =$37\r
+.equ   TWCR    =$36\r
+.equ    MCUCR   =$35\r
+.equ    MCUSR   =$34\r
+.equ    MCUCSR  =$34\r
+.equ   TCCR0   =$33\r
+.equ   TCNT0   =$32\r
+.equ   OSCCAL  =$31\r
+.equ   SFIORL  =$30\r
+.equ   TCCR1A  =$2f\r
+.equ   TCCR1B  =$2e\r
+.equ   TCNT1H  =$2d\r
+.equ   TCNT1L  =$2c\r
+.equ   OCR1H   =$2b\r
+.equ   OCR1AH  =$2b\r
+.equ   OCR1L   =$2a\r
+.equ   OCR1AL  =$2a\r
+.equ   OCR1BH  =$29\r
+.equ   OCR1BL  =$28\r
+.equ   ICR1H   =$27\r
+.equ   ICR1L   =$26\r
+.equ   TCCR2   =$25\r
+.equ   TCNT2   =$24\r
+.equ   OCR2    =$23\r
+.equ   ASSR    =$22\r
+.equ   WDTCR   =$21\r
+.equ   UBRRH   =$20\r
+.equ   UCSRC   =$20\r
+.equ   EEARH   =$1f\r
+.equ   EEARL   =$1e\r
+.equ   EEAR    =$1e\r
+.equ   EEDR    =$1d\r
+.equ   EECR    =$1c\r
+.equ   PORTB   =$18\r
+.equ   DDRB    =$17\r
+.equ   PINB    =$16\r
+.equ   PORTC   =$15\r
+.equ   DDRC    =$14\r
+.equ   PINC    =$13\r
+.equ   PORTD   =$12\r
+.equ   DDRD    =$11\r
+.equ   PIND    =$10\r
+.equ   SPDR    =$0f\r
+.equ   SPSR    =$0e\r
+.equ   SPCR    =$0d\r
+.equ   UDR     =$0c\r
+.equ   UCSRA   =$0b\r
+.equ   UCSRB   =$0a\r
+.equ   UBRR    =$09\r
+.equ   UBRRL   =$09\r
+.equ   ACSR    =$08\r
+.equ    ADMUX   =$07\r
+.equ    ADCSR   =$06\r
+.equ    ADCH    =$05\r
+.equ    ADCL    =$04\r
+.equ   TWDR    =$03\r
+.equ   TWAR    =$02\r
+.equ   TWSR    =$01\r
+.equ   TWBR    =$00\r
+\r
+.equ   INT1    =7              ; GICR\r
+.equ   INT0    =6\r
+\r
+.equ   INTF1   =7              ; GIFR\r
+.equ   INTF0   =6\r
+\r
+.equ    OCIE2   =7             ; TIMSK\r
+.equ    TOIE2   =6\r
+.equ    TICIE1  =5\r
+.equ    OCIE1A  =4\r
+.equ    OCIE1   =4\r
+.equ    OCIE1B  =3\r
+.equ    TOIE1   =2\r
+.equ    TOIE0   =0\r
+\r
+.equ    OCF2    =7             ; TIFR\r
+.equ    TOV2    =6\r
+.equ    ICF1    =5\r
+.equ    OCF1A   =4\r
+.equ    OCF1    =4\r
+.equ    OCF1B   =3\r
+.equ    TOV1    =2\r
+.equ    TOV0    =0\r
+\r
+.equ    SPMIE   =7             ; SPMCR\r
+.equ    RWWSB   =6\r
+.equ    RWWSRE  =4\r
+.equ    BLBSET  =3\r
+.equ    PGWRT   =2\r
+.equ    PGERS   =1\r
+.equ    SPMEN   =0\r
+\r
+.equ    TWINT   =7             ; TWCR\r
+.equ    TWEA    =6\r
+.equ    TWSTA   =5\r
+.equ    TWSTO   =4\r
+.equ    TWWC    =3\r
+.equ    TWEN    =2\r
+.equ    TWIE    =0\r
+\r
+.equ    SE      =7             ; MCUCR\r
+.equ    SM2     =6\r
+.equ    SM1     =5\r
+.equ    SM0     =4\r
+.equ    SM      =4\r
+.equ    ISC11   =3\r
+.equ    ISC10   =2\r
+.equ    ISC01   =1\r
+.equ    ISC00   =0\r
+\r
+.equ   WDRF    =3              ; MCUCSR\r
+.equ   BORF    =2\r
+.equ   EXTRF   =1\r
+.equ   PORF    =0\r
+\r
+.equ   CS02    =2              ; TCCR0\r
+.equ   CS01    =1\r
+.equ   CS00    =0\r
+\r
+.equ    ADHSM   =4             ; SFIOR\r
+.equ    ACME    =3\r
+.equ    PUD     =2\r
+.equ    PSR2    =1\r
+.equ    PSR10   =0\r
+\r
+.equ   COM11   =7\r
+.equ   COM1A1  =7              ; TCCR1A\r
+.equ   COM10   =6\r
+.equ   COM1A0  =6\r
+.equ   COM1B1  =5\r
+.equ   COM1B0  =4\r
+.equ   FOC1A   =3\r
+.equ   FOC1B   =2\r
+.equ   PWM11   =1\r
+.equ   WGM11   =1\r
+.equ   PWM10   =0\r
+.equ   WGM10   =0\r
+\r
+.equ   ICNC1   =7              ; TCCR1B\r
+.equ   ICES1   =6\r
+.equ   WGM13   =4\r
+.equ   CTC1    =3\r
+.equ   WGM12   =3\r
+.equ   CS12    =2\r
+.equ   CS11    =1\r
+.equ   CS10    =0\r
+\r
+.equ   FOC2    =7              ; TCCR2\r
+.equ   WGM20   =6\r
+.equ   COM21   =5\r
+.equ   COM20   =4\r
+.equ   WGM21   =3\r
+.equ   CS22    =2\r
+.equ   CS21    =1\r
+.equ   CS20    =0\r
+\r
+.equ   AS2     =3              ; ASSR\r
+.equ   TCN2UB  =2\r
+.equ   OCR2UB  =1\r
+.equ   TCR2UB  =0\r
+\r
+.equ   WDTOE   =4\r
+.equ   WDCE    =4              ; WDTCR\r
+.equ   WDE     =3\r
+.equ   WDP2    =2\r
+.equ   WDP1    =1\r
+.equ   WDP0    =0\r
+\r
+.equ   URSEL   =7              ; UCSRC\r
+.equ   UMSEL   =6\r
+.equ   UPM1    =5\r
+.equ   UPM0    =4\r
+.equ   USBS    =3\r
+.equ   UCSZ1   =2\r
+.equ   UCSZ0   =1\r
+.equ   UCPOL   =0\r
+\r
+.equ    EERIE   =3             ; EECR\r
+.equ   EEMWE   =2\r
+.equ   EEWE    =1\r
+.equ   EERE    =0\r
+\r
+.equ   PB5     =5\r
+.equ   PB4     =4\r
+.equ   PB3     =3\r
+.equ   PB2     =2\r
+.equ   PB1     =1\r
+.equ   PB0     =0\r
+\r
+.equ   DDB5    =5\r
+.equ   DDB4    =4\r
+.equ   DDB3    =3\r
+.equ   DDB2    =2\r
+.equ   DDB1    =1\r
+.equ   DDB0    =0\r
+\r
+.equ   PINB5   =5\r
+.equ   PINB4   =4\r
+.equ   PINB3   =3\r
+.equ   PINB2   =2\r
+.equ   PINB1   =1\r
+.equ   PINB0   =0\r
+\r
+.equ   PC5     =5\r
+.equ   PC4     =4\r
+.equ   PC3     =3\r
+.equ   PC2     =2\r
+.equ   PC1     =1\r
+.equ   PC0     =0\r
+\r
+.equ   DDC5    =5\r
+.equ   DDC4    =4\r
+.equ   DDC3    =3\r
+.equ   DDC2    =2\r
+.equ   DDC1    =1\r
+.equ   DDC0    =0\r
+\r
+.equ   PINC5   =5\r
+.equ   PINC4   =4\r
+.equ   PINC3   =3\r
+.equ   PINC2   =2\r
+.equ   PINC1   =1\r
+.equ   PINC0   =0\r
+\r
+.equ   PD7     =7\r
+.equ   PD6     =6\r
+.equ   PD5     =5\r
+.equ   PD4     =4\r
+.equ   PD3     =3\r
+.equ   PD2     =2\r
+.equ   PD1     =1\r
+.equ   PD0     =0\r
+\r
+.equ   DDD7    =7\r
+.equ   DDD6    =6\r
+.equ   DDD5    =5\r
+.equ   DDD4    =4\r
+.equ   DDD3    =3\r
+.equ   DDD2    =2\r
+.equ   DDD1    =1\r
+.equ   DDD0    =0\r
+\r
+.equ   PIND7   =7\r
+.equ   PIND6   =6\r
+.equ   PIND5   =5\r
+.equ   PIND4   =4\r
+.equ   PIND3   =3\r
+.equ   PIND2   =2\r
+.equ   PIND1   =1\r
+.equ   PIND0   =0\r
+\r
+.equ   SPIF    =7              ; SPSR\r
+.equ   WCOL    =6\r
+\r
+.equ   SPIE    =7              ; SPCR\r
+.equ   SPE     =6\r
+.equ   DORD    =5\r
+.equ   MSTR    =4\r
+.equ   CPOL    =3\r
+.equ   CPHA    =2\r
+.equ   SPR1    =1\r
+.equ   SPR0    =0\r
+\r
+.equ   RXC     =7              ; UCSRA\r
+.equ   TXC     =6\r
+.equ   UDRE    =5\r
+.equ   FE      =4\r
+.equ   OR      =3\r
+.equ   DOR     =3\r
+.equ   PE      =2\r
+.equ   U2X     =1\r
+.equ    MPCM    =0\r
+\r
+.equ   RXCIE   =7              ; UCSRB\r
+.equ   TXCIE   =6\r
+.equ   UDRIE   =5\r
+.equ   RXEN    =4\r
+.equ   TXEN    =3\r
+.equ   CHR9    =2\r
+.equ   UCSZ2   =2\r
+.equ   RXB8    =1\r
+.equ   TXB8    =0\r
+\r
+.equ   ACD     =7              ; ACSR\r
+.equ   AINBG   =6\r
+.equ   ACBG    =6\r
+.equ   ACO     =5\r
+.equ   ACI     =4\r
+.equ   ACIE    =3\r
+.equ   ACIC    =2\r
+.equ   ACIS1   =1\r
+.equ   ACIS0   =0\r
+\r
+.equ   REFS1   =7              ; ADMUX\r
+.equ   ADCBG   =6\r
+.equ   REFS0   =6\r
+.equ   ADLAR   =5\r
+.equ    MUX3    =3\r
+.equ    MUX2    =2\r
+.equ    MUX1    =1\r
+.equ    MUX0    =0\r
+\r
+.equ    ADEN    =7             ; ADCSR\r
+.equ    ADSC    =6\r
+.equ    ADFR    =5\r
+.equ    ADIF    =4\r
+.equ    ADIE    =3\r
+.equ    ADPS2   =2\r
+.equ    ADPS1   =1\r
+.equ    ADPS0   =0\r
+\r
+.equ    TWGCE   =0             ; TWAR\r
+\r
+.def   XL      =r26\r
+.def   XH      =r27\r
+.def   YL      =r28\r
+.def   YH      =r29\r
+.def   ZL      =r30\r
+.def   ZH      =r31\r
+\r
+.equ   RAMEND  =$45F           ; Last On-Chip SRAM Location\r
+.equ   XRAMEND =$45F\r
+.equ   E2END   =$1FF\r
+.equ   FLASHEND=$FFF\r
+\r
+.equ   INT0addr=$001           ; External Interrupt0 Vector Address\r
+.equ   INT1addr=$002           ; External Interrupt1 Vector Address\r
+.equ   OC2addr =$003           ; Output Compare2 Interrupt Vector Address\r
+.equ   OVF2addr=$004           ; Overflow2 Interrupt Vector Address\r
+.equ   ICP1addr=$005           ; Input Capture1 Interrupt Vector Address\r
+.equ   OC1Aaddr=$006           ; Output Compare1A Interrupt Vector Address\r
+.equ   OC1Baddr=$007           ; Output Compare1B Interrupt Vector Address\r
+.equ   OVF1addr=$008           ; Overflow1 Interrupt Vector Address\r
+.equ   OVF0addr=$009           ; Overflow0 Interrupt Vector Address\r
+.equ   SPIaddr =$00a           ; SPI Interrupt Vector Address\r
+.equ   URXCaddr=$00b           ; UART Receive Complete Interrupt Vector Address\r
+.equ   UDREaddr=$00c           ; UART Data Register Empty Interrupt Vector Address\r
+.equ   UTXCaddr=$00d           ; UART Transmit Complete Interrupt Vector Address\r
+.equ   ADCCaddr=$00e           ; ADC Interrupt Vector Address\r
+.equ   ERDYaddr=$00f           ; EEPROM Interrupt Vector Address\r
+.equ   ACIaddr =$010           ; Analog Comparator Interrupt Vector Address\r
diff --git a/src/avr/mt102ter.asm b/src/avr/mt102ter.asm
new file mode 100644 (file)
index 0000000..cae99b7
--- /dev/null
@@ -0,0 +1,1752 @@
+;      MT102TER.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+;.INCLUDE "API.INC"\r
+.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =5              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =48             ; 384 / 8 = 48 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =42             ; 384 / 9 = 42 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =6              ; (42+7) / 8 = 6 WIDTH FLAG BYTES\r
+\r
+.EQU   TIME_STEP       =72             ; 72 * 25 US = APPROX 1.8 MS\r
+.EQU   TIME_CLOCK      =2              ; 2 * 25 US = APPROX 50 US\r
+\r
+.EQU   TIME_STROBE     =24             ; 24 * 25 US = APPROX 600 US\r
+.EQU   TIME_HOLD_PWM   =1              ; DELAY UNIT FOR ABOVE = APPROX 25 US\r
+\r
+.EQU   TIME_PAPER_OUT  =12             ; 12 * 25 US = APPROX 300 US\r
+\r
+.EQU   TIME_DEBOUNCE0  =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+;.EQU  TIME_DEBOUNCE1  =1              ; 10 * 100 US = APPROX 1.0 MS\r
+.EQU   TIME_SHORTING   =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+.EQU   TIME_CUTTER     =20000          ; 20000 * 100 US = APPROX 2.0 S\r
+.EQU   TIME_SAMPLE     =4              ; DELAY UNIT FOR ABOVE = APPROX 100 US\r
+\r
+;.EQU  FEED_INITIAL    =2              ; LINES WASTED STARTING MOTOR\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   MOTOR_STATE     =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   STATUS          =R14\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.DEF   DOTS_ON_LO      =R24\r
+.DEF   DOTS_ON_HI      =R25            ; COUNT OF DOTS ON FOR LINE\r
+\r
+.EQU   TX_SIZE         =1\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_IMAGE\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+SCALE_TEXT:    .BYTE   1\r
+SCALE_IMAGE:   .BYTE   1\r
+NOTIFY_COUNT:  .BYTE   1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   IMAGE           =2              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =3              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   CUT             =4              ; SET BY FG FOR BG TO OPERATE CUTTER\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+.EQU   ASCEND          =7              ; SET BY FG, ASCENDER ALLOWED NEXT LINE\r
+;.EQU  BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY BG TO NOTIFY MOTOR RUN STATUS\r
+.EQU   CUTTER          =2              ; SET BY BG TO NOTIFY CUTTER RUN STATUS\r
+.EQU   HEADUP          =3              ; SET BY BG TO NOTIFY HEAD UP STATUS\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+; UPPER 2 BITS ARE USED TO COUNT 4 * 256 * 25 US = 25.6 MS BETWEEN PAPER TESTS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','T','1','0','2'\r
+;      .DB     'A',' ','P','R','I','N','T','E'\r
+;      .DB     'R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 OVERFLOW INTERRUPT HANDLER\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+\r
+       LDI     G,-TIME_STEP\r
+       OUT     TCNT0,G                 ; DEFAULT DELAY TO NEXT STEP INTERRUPT\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+T0_DONE:\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+\r
+T0_RET:\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_FEED:\r
+       DEC     FEEDS\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT NEXT MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_ODD             ; OUTPUT NEXT MOTOR STATE\r
+\r
+T0_MAIN:\r
+       RCALL   T0_DONE\r
+\r
+T0_MAIN_ENTRY:\r
+       ;MOV    D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+       TST     FEEDS\r
+       BRNE    T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BREQ    T0_IDLE                 ; THERE IS NOTHING TO PRINT\r
+\r
+T0_PRINT:\r
+       SBRC    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_PRINT_GO             ; YES, START CLOCKING IMMEDIATELY\r
+\r
+       LDI     D,1<<MOTOR | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY MOTOR HAS BEEN STARTED, NOTIFY\r
+\r
+       RCALL   T0_STEP_SAME            ; OUTPUT SAME MOTOR STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       RCALL   T0_DONE                 ; HOLD FOR STEP TIME PRIOR TO STARTING\r
+\r
+T0_PRINT_GO:\r
+       TST     FEEDS\r
+       BRNE    T0_FEED                 ; FEED IF FEEDS WAITING\r
+\r
+       SBRS    FLAGS,TEXT\r
+       RJMP    T0_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       SBRS    FLAGS,IMAGE\r
+       RJMP    T0_PRINT_TEXT           ; PRINT IF TEXT WAITING\r
+\r
+       ; REVERSE FEED IF TEXT, IMAGE BOTH SET\r
+       MOV     E,CHAR_SAVE             ; CONVENIENT VARIABLE FOR REVERSE COUNT\r
+\r
+       CBR     FLAGS,1<<TEXT | 1<<IMAGE ; SAY WE HAVE NOW FREED UP CHAR_SAVE\r
+\r
+T0_REVERSE:\r
+       RCALL   T0_STEP_ODD             ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_REVERSE\r
+\r
+       RJMP    T0_MAIN_ENTRY\r
+\r
+T0_IDLE:\r
+       SBRS    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_STOPPED              ; NO, ALREADY STOPPED, CHECK CUTTER\r
+\r
+       RCALL   T0_DONE                 ; DELAY BEFORE STOPPING\r
+\r
+       LDI     D,~(1<<MOTOR)\r
+       AND     STATUS,D                ; SAY MOTOR HAS BEEN STOPPED\r
+       LDI     D,1<<NOTIFY\r
+       SBRS    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       OR      STATUS,D                ; NO, SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       LDI     D,$00\r
+       OUT     PORTD,D                 ; OUTPUT IDLE MOTOR STATE\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+       RJMP    T0_MAIN\r
+\r
+T0_STOPPED:\r
+       SBRC    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       RJMP    T0_CUT                  ; YES, GO AND OPERATE CUTTER\r
+\r
+       LDI     D,0\r
+       OUT     TCNT0,D                 ; FULL PERIOD = 256 * 25 US = 6.4 MS\r
+\r
+       LDI     D,1<<6\r
+       ADD     STATUS,D\r
+       BRCC    T0_MAIN                 ; COUNT 4 PERIODS, ENTER EVERY 25.6 MS\r
+\r
+;      TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+;      BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBIC    PORTC,4                 ; MOTOR ON?\r
+;      RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+;\r
+;      DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+;      BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       CBI     PORTD,2                 ; D2 = LOW TO LIGHT LED\r
+       CBI     DDRC,3                  ; C3 = TRI-STATE TO SAMPLE LED STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       LDI     D,-144                  ; TEST PAPER IN 144 * 25 US = 3.6 MS\r
+       SBRS    STATUS,PAPER\r
+       LDI     D,-128                  ; TEST PAPER IN 128 * 25 US = 3.2 MS\r
+       OUT     TCNT0,D\r
+\r
+       RCALL   T0_DONE\r
+\r
+       LDS     D,NOTIFY_COUNT\r
+       INC     D\r
+       STS     NOTIFY_COUNT,D\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       SBR     FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      E,PINC                  ; SAMPLE C3 STATE\r
+\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRC,3                  ; PRINTER DATA-IN = BACK TO OUTPUT\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+\r
+       SBRC    E,3\r
+       RJMP    T0_PAPER_IN             ; C3 = 1, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; C3 = 0, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+;T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   T0_MAIN\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       OR      STATUS,D                ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       LDI     D,~(1<<PAPER)\r
+       AND     STATUS,D                ; SAY PAPER IS OUT\r
+       RJMP    T0_HEAD\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       RJMP    T0_HEAD                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<PAPER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY PAPER IS IN, MUST SEND\r
+       ;RJMP   T0_HEAD\r
+\r
+T0_HEAD:\r
+       SBRC    E,2\r
+       RJMP    T0_HEAD_UP\r
+       ;RJMP   T0_HEAD_DOWN\r
+\r
+;T0_HEAD_DOWN:\r
+       SBRS    STATUS,HEADUP           ; IF HEAD WAS DOWN,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       SBRC    STATUS,PAPER            ; (ONLY IF WE DETECTED PAPER PRESENT)\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST NOTIFY HOST\r
+       LDI     D,~(1<<HEADUP)\r
+       AND     STATUS,D                ; SAY HEAD IS DOWN\r
+       RJMP    T0_MAIN\r
+\r
+T0_HEAD_UP:\r
+       SBRC    STATUS,HEADUP           ; IF HEAD WAS UP,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<HEADUP | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY HEAD IS UP, AND NOTIFY HOST\r
+       RJMP    T0_MAIN\r
+\r
+T0_CUT:\r
+       CBR     FLAGS,1<<CUT            ; TELL FOREGROUND TO CONTINUE\r
+       LDI     D,1<<CUTTER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY CUTTER HAS BEEN STARTED, NOTIFY\r
+\r
+;T0_REPEAT_ENTRY:\r
+       CBI     PORTC,1                 ; OUTPUT FORWARD CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_CUTTER)\r
+       LDI     XH,HIGH(TIME_CUTTER)    ; IN CASE SWITCH FAILS TO OPERATE\r
+\r
+T0_CUT_LOOP0:\r
+       LDI     E,LOW(TIME_DEBOUNCE0)\r
+       LDI     F,HIGH(TIME_DEBOUNCE0)\r
+\r
+T0_CUT_LOOP1:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIC    PINC,0\r
+       RJMP    T0_CUT_LOOP0            ; WAIT FOR SWITCH TO CLOSE\r
+\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    T0_CUT_LOOP1            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_LOOP2:\r
+;      LDI     E,TIME_DEBOUNCE1\r
+\r
+T0_CUT_LOOP3:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIS    PINC,0                  ; WAIT FOR SWITCH TO OPEN AGAIN\r
+       RJMP    T0_CUT_LOOP2\r
+\r
+;      DEC     E\r
+;      BRNE    T0_CUT_LOOP3            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_DONE:\r
+       SBI     PORTC,1                 ; OUTPUT IDLE CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_SHORTING)\r
+       LDI     XH,HIGH(TIME_SHORTING)\r
+\r
+T0_SHORT:\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_SHORTING\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIW    XL,1\r
+       BRNE    T0_SHORT\r
+\r
+;      LDI     XL,LOW(TIME_CUTTER)\r
+;      LDI     XH,HIGH(TIME_CUTTER)\r
+;\r
+;T0_REPEAT_LOOP:\r
+;      LDI     D,-TIME_SAMPLE\r
+;      OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_CUTTER\r
+;\r
+;      RCALL   T0_DONE\r
+;\r
+;      SBIW    XL,1\r
+;      BRNE    T0_REPEAT_LOOP\r
+;      RJMP    T0_REPEAT_ENTRY\r
+\r
+       LDI     D,~(1<<CUTTER)\r
+       AND     STATUS,D                ; SAY CUTTER HAS BEEN STOPPED\r
+\r
+       MOV     D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+       TST     D\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST REPORT CUTTER STATUS\r
+\r
+T0_CUT_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_STEP_ODD:\r
+       LDI     D,$A0 ;$50\r
+       RJMP    T0_STEP_NEXT\r
+T0_STEP_EVEN:\r
+       LDI     D,$50 ;$A0\r
+T0_STEP_NEXT:\r
+       EOR     MOTOR_STATE,D           ; GENERATE NEXT MOTOR STATE\r
+T0_STEP_SAME:\r
+       OUT     PORTD,MOTOR_STATE       ; OUTPUT CURRENT MOTOR STATE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_TEXT:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       ;LDI    D,0\r
+       ;MOV    TEXT_MASK,D             ; SET UP MASK FOR UPPER DOT LINE\r
+       LSL     TEXT_MASK\r
+       LSL     TEXT_MASK               ; SHIFT SPACING INTO UPPER 2 BITS\r
+       LDI     D,$C0\r
+       AND     TEXT_MASK,D             ; CLEAR REMAINING BITS\r
+\r
+       SBRS    FLAGS,ASCEND            ; READY TO PRINT IF ASCENDER ALLOWED\r
+       INC     TEXT_MASK               ; ASCENDER NOT ALLOWED, SKIP 1 SLICE\r
+\r
+T0_PRINT_TEXT_SETUP:\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; CHARACTER INDEX FOR DOT LINE\r
+\r
+T0_PRINT_TEXT_SETUP_LINE:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,E\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       MOV     G,E\r
+       ANDI    G,7\r
+       INC     G                       ; F = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+T0_PRINT_TEXT_SETUP_FLAG:\r
+       LSR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_PRINT_TEXT_SETUP_FLAG\r
+\r
+       BRCC    T0_PRINT_TEXT_SETUP_CONT\r
+       LSL     F                       ; WIDE CHARACTER, DOUBLE SCALE FACTOR\r
+       SUBI    F,-$81                  ; COMPENSATE FOR -1, BIT FLAG FOR WIDE\r
+\r
+T0_PRINT_TEXT_SETUP_CONT:\r
+       ;RCALL  LOOKUP_CHAR             ; GET D = HORIZONTAL SLICE OF CHAR\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       CLR     ZH\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 4\r
+       ;LSL    ZL\r
+       ;ROL    ZH                      ; Z = ASCII CHARACTER * 8\r
+       ;SUB    ZL,D\r
+       ;LDI    D,0\r
+       ;SBC    ZH,D                    ; Z = ASCII CHARACTER * 7\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 5\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 10\r
+\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 10 + INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*10)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*10)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       MOV     H,R0\r
+       LPM                             ; R0 = CORRECT HORIZONTAL SLICE OF CHAR\r
+       MOV     D,R0\r
+       MOV     R0,H\r
+       RJMP    LOOKUP_CHAR_DONE ;RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 5\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 10\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 11\r
+\r
+       SUBI    ZL,-(EE_COUNT*2+2) ;+3) ; PAST CRC, COUNT, CHARACTER CODE\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK         ; ZL = BASE + CHAR * 11 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      D,EEDR                  ; GET LATCHED DATA BYTE\r
+LOOKUP_CHAR_DONE:\r
+       ;RET\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; F*1 PIXELS PADDING FROM D = 0\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       SBRC    F,7\r
+       INC     E\r
+       CPI     E,WIDTH_CHARS           ; GONE PAST LAST CHARACTER FOR LINE?\r
+       ;BRLO   T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+       BRSH    T0_PRINT_TEXT_SETUP_DONE\r
+       RJMP    T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+T0_PRINT_TEXT_SETUP_DONE:\r
+\r
+       LDI     D,0\r
+       LDI     F,6\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; 6 PIXELS PADDING FROM D = 0\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+T0_PRINT_TEXT_MORE_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRLO    T0_PRINT_TEXT_MORE\r
+\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+T0_PRINT_TEXT_MORE:\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE 42*TIME_CLOCK\r
+       ; FOR PRINTING TEXT - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE\r
+\r
+       ;LDI    D,-TIME_CLOCK*WIDTH_CHARS-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+T0_PRINT_TEXT_STEP_ENTRY:\r
+       SBI     PORTD,3                 ; PRINTER STROBE = HIGH\r
+       CBI     PORTD,3                 ; PRINTER STROBE = LOW\r
+\r
+T0_PRINT_TEXT_STEP_LOOP:\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN\r
+\r
+       LDI     D,$07\r
+       OUT     PORTB,D                 ; APPLY ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_DONE\r
+\r
+       MOV     E,DOTS_ON_LO\r
+       MOV     D,DOTS_ON_HI\r
+       LSR     D\r
+       ROR     E\r
+       LSR     D\r
+       ROR     E                       ; MAXIMUM 384/4 * 25 US = 2.4 MS\r
+       SUBI    E,-TIME_STROBE\r
+\r
+       MOV     D,MOTOR_STATE           ; SAVE CURRENT MOTOR STATE\r
+\r
+T0_HOLD:\r
+       RCALL   T0_STEP_NEXT            ; PULSE WIDTH MODULATE CURRENT STATE\r
+\r
+       LDI     G,-TIME_HOLD_PWM\r
+       OUT     TCNT0,G\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_HOLD\r
+\r
+       MOV     MOTOR_STATE,D           ; RESTORE ORIGINAL MOTOR STATE\r
+\r
+       LDI     D,$00\r
+       OUT     PORTB,D                 ; REMOVE ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_STEP_ODD\r
+\r
+       SUBI    F,$10                   ; FOR (F+$10) >> 4 ITERATIONS\r
+       BRSH    T0_PRINT_TEXT_STEP_LOOP ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+T0_MAIN_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRSH    GO_T0_MAIN\r
+\r
+       INC     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       RJMP    T0_PRINT_TEXT_SETUP     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_T0_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_IMAGE:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; BYTE INDEX FOR DOT LINE\r
+\r
+T0_PRINT_IMAGE_SETUP_LINE:\r
+       PUSH    ZL\r
+\r
+       MOV     ZL,E\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; ZL = IMAGE BYTE\r
+\r
+       POP     ZL\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       CPI     E,WIDTH_IMAGE           ; GONE PAST LAST BYTE FOR LINE?\r
+       BRLO    T0_PRINT_IMAGE_SETUP_LINE ; REPEAT UNLESS ALL BYTES DONE\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE TIME_CLOCK*48\r
+       ; FOR PRINTING IMAGE - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE                 ; SHORT DELAY AFTER LAST CLOCKING INT\r
+\r
+       ;LDI    D,TIME_CLOCK*WIDTH_IMAGE-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDI     D,-1\r
+       MOV     TEXT_MASK,D             ; PRETEND THIS IS LAST DOT LINE OF TEXT\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RJMP    T0_PRINT_TEXT_STEP_ENTRY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SETUP_SLICE:                           ; SEND D = 8 HORIZONTAL BITS\r
+       LDI     H,8\r
+\r
+SETUP_SLICE_ENTRY:\r
+       TST     XL\r
+       BRNE    SETUP_SLICE_LOOP\r
+       TST     XH                      ; ANY PIXELS REMAINING FOR LINE?\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+SETUP_SLICE_LOOP:\r
+       LSL     D\r
+       BRCC    SETUP_PIXEL_LIGHT\r
+\r
+       SBI     PORTC,3                 ; PRINTER DATA-IN = HIGH\r
+\r
+SETUP_PIXEL_LIGHT:\r
+       MOV     G,F\r
+       ANDI    G,$7F                   ; REMOVE BIT FLAG INDICATING WIDE\r
+\r
+SETUP_PIXEL_LOOP:\r
+       SBI     PORTC,5                 ; PRINTER CLOCK = HIGH\r
+\r
+       SBIC    PORTC,3                 ; IF CURRENT PIXEL IS DARK,\r
+       ADIW    DOTS_ON_LO,1            ; INCREASE COUNT OF DOTS ON FOR LINE\r
+\r
+       SBIW    XL,1                    ; DECREASE COUNT OF DOTS REMAINING\r
+\r
+       CBI     PORTC,5                 ; PRINTER CLOCK = LOW\r
+\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+       SUBI    G,1                     ; FOR G+1 ITERATIONS\r
+       BRSH    SETUP_PIXEL_LOOP        ; APPLY HORIZONTAL SCALE FACTOR\r
+\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+\r
+       DEC     H                       ; NEXT PIXEL FOR CHARACTER\r
+       BRNE    SETUP_SLICE_LOOP        ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+SETUP_SLICE_DONE:\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+;      SBRC    FLAGS,BOMB\r
+;      RJMP    TEXT_RESET\r
+\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;TX_SIZE-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       LDI     A,0\r
+       STS     NOTIFY_COUNT,A          ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+\r
+       LDI     A,~(1<<NOTIFY)\r
+       AND     STATUS,A                ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       MRX_WAIT\r
+\r
+RX_CHAR:\r
+;      TST     ABORT_COUNT\r
+;      BREQ    RX_CHAR_CONT\r
+;\r
+;      LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+;      MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRD,2                  ; D2 = OUTPUT FOR PAPER SENSE LED\r
+       SBI     DDRD,4                  ; D4 = OUTPUT FOR MOTOR DRIVE B1\r
+       SBI     DDRD,5                  ; D5 = OUTPUT FOR MOTOR DRIVE A1\r
+       SBI     DDRD,6                  ; D6 = OUTPUT FOR MOTOR DRIVE A0\r
+       SBI     DDRD,7                  ; D7 = OUTPUT FOR MOTOR DRIVE B0\r
+       SBI     DDRD,3                  ; D3 = OUTPUT FOR PRINTER STROBE\r
+       SBI     DDRC,3                  ; C3 = OUTPUT FOR PRINTER DATA-IN\r
+       SBI     DDRC,5                  ; C5 = OUTPUT FOR PRINTER CLOCK\r
+       SBI     DDRB,0                  ; D5 = OUTPUT FOR PRINTER OE1 / OE4\r
+       SBI     DDRB,1                  ; D6 = OUTPUT FOR PRINTER OE2 / OE5\r
+       SBI     DDRB,2                  ; D7 = OUTPUT FOR PRINTER OE3 / OE6\r
+       SBI     DDRC,1                  ; C1 = OUTPUT FOR CUTTER DRIVE\r
+\r
+       LDI     A,3\r
+       OUT     PORTC,A                 ; IDLE STATE FOR CUTTER, C0 = PULL UP\r
+\r
+       LDI     A,0\r
+       OUT     PORTD,A                 ; IDLE STATE FOR MOTOR\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW | 1<<RXSEND | 1<<ASCEND\r
+       LDI     A,1<<PAPER\r
+       MOV     STATUS,A\r
+\r
+       LDI     A,$20\r
+       STS     SCALE_TEXT,A\r
+       ; TER MODE ONLY %\r
+       LDI     A,0\r
+       ; %\r
+       ; API BUS MODE ONLY %\r
+       ;LDI    A,$21\r
+       ; %\r
+       STS     SCALE_IMAGE,A\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A               ; SET LINE SPACING FOR TEXT MODE\r
+\r
+       ;LDI    A,FEED_INITIAL ;+30\r
+       ;MOV    FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       LDI     A,$60\r
+       MOV     MOTOR_STATE,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(T0_MAIN)\r
+       LDI     H,HIGH(T0_MAIN)         ; T0_MAIN ON FIRST STEP INTERRUPT\r
+\r
+       LDI     A,4\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 25 US\r
+\r
+       LDI     A,-TIME_STEP\r
+       OUT     TCNT0,A                 ; SET DELAY TO FIRST STEP INTERRUPT\r
+\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPT\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;TEXT_RESET:\r
+;      ; ENTRY POINT FROM RX_WAIT\r
+;      LDI     A,LOW(RAMEND)\r
+;      OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+;      CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+;      CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       LDS     A,PRINT_BUF+5\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     PRINT_BUF+5,A           ; SINCE WE SAVED ONLY 42 CHARS, NOT 48\r
+\r
+       MOV     A,SPACING\r
+       CPI     A,3+1\r
+       BRLO    TEXT_PRINT_SPACING\r
+       LDI     A,3\r
+TEXT_PRINT_SPACING:\r
+       SWAP    A\r
+       OR      TEXT_MASK,A             ; SAVE SPACING FOR DESCENDER PRINTING\r
+\r
+       SBR     FLAGS,1<<TEXT\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER PRINTING ?\r
+       BREQ    TEXT_PRINT_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,3                     ; COMPENSATE FOR ASCENDER + DESCENDER\r
+       BRLO    TEXT_PRINT_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS REMAINING AFTER DESCENDER,\r
+                                       ; EXCEPT FOR THE LAST ONE\r
+TEXT_PRINT_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+TEXT_PRINT_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       LDI     A,6                     ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       RCALL   WAIT_ADD_SPACING\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+       CPI     A,'C'\r
+       BRNE    PAPER_CUT_CONT\r
+       RJMP    PAPER_CUT\r
+PAPER_CUT_CONT:\r
+       CPI     A,'J'\r
+       BREQ    IMAGE_SCALE\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+       CPI     A,'R'\r
+       BREQ    REVERSE_FEED\r
+       CPI     A,'T'\r
+       BREQ    TEXT_SCALE\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    FEED_SETUP_DONE         ; NO FEED, NO CHANGE TO ASCEND FLAG\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       DEC     A                       ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+FEED_SETUP_DONE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+REVERSE_FEED:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    REVERSE_FEED_DONE\r
+\r
+REVERSE_FEED_AGAIN:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+REVERSE_FEED_ENTRY:\r
+       MOV     CHAR_SAVE,A             ; THIS WILL BE READ BY INTERRUPT\r
+\r
+       SBR     FLAGS,1<<TEXT | 1<<IMAGE ; SETTING BOTH INDICATES REVERSE FEED\r
+REVERSE_FEED_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    REVERSE_FEED_WAIT\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    REVERSE_FEED_ENTRY      ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       SBRC    FLAGS,ASCEND            ; NEED AN EXTRA FEED FOR ASCENDERS ?\r
+REVERSE_FEED_DONE:\r
+       RJMP    TEXT_RECEIVE            ; NO, WE ARE DONE\r
+\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+\r
+       LDI     A,1                     ; REPEAT PROCESS WITH 1 EXTRA FEED\r
+       RJMP    REVERSE_FEED_AGAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_IMAGE,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+TEXT_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_TEXT,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+\r
+       OR      A,YL\r
+       OR      A,R0\r
+       BREQ    IMAGE_DONE_NO_ASCENDER  ; ABORT IF WIDTH OR LINES = 0\r
+                                       ; (WITH NO CHANGE TO ASCENDER STATUS)\r
+       LDI     A,1\r
+       SBRC    FLAGS,ASCEND\r
+       RCALL   WAIT_ADD_FEEDS          ; PERFORM THE LAST FEED IF NOT DONE YET\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER NEXT TIME ?\r
+       BREQ    IMAGE_DONE_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,1                     ; COMPENSATE FOR ASCENDER NEXT TIME\r
+       BRLO    IMAGE_DONE_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS EXCEPT FOR THE LAST ONE\r
+\r
+IMAGE_DONE_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+IMAGE_DONE_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       LDS     B,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RCALL   WAIT_ADD_FEEDS_ENTRY\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH*2          ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     B,$21\r
+       MOV     R0,B\r
+       LDI     B,$10                   ; B:R0 = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,R0\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PAPER_CUT:\r
+       SBR     FLAGS,1<<CUT            ; SAY CUTTER MUST BE OPERATED\r
+\r
+PAPER_CUT_WAIT:\r
+       SBRC    FLAGS,CUT\r
+       RJMP    PAPER_CUT_WAIT          ; WAIT FOR COMMAND TO BE RECEIVED\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_SPACING:\r
+       MOV     A,SPACING\r
+\r
+WAIT_ADD_FEEDS:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+WAIT_ADD_FEEDS_ENTRY:\r
+       PUSH    A\r
+       ADD     A,FEEDS                 ; CAN WE ADD FEEDS YET?\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS_ENTRY\r
+\r
+       ADD     FEEDS,A                 ; SEND THE FEEDS ATOMICALLY\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    WAIT_ADD_FEEDS_ENTRY    ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-11\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; 20  \r
+       .DB     $00,$18,$18,$18,$18,$18,$00,$18,$00,$00 ; 21 !\r
+       .DB     $00,$E7,$63,$C6,$00,$00,$00,$00,$00,$00 ; 22 "\r
+       .DB     $00,$66,$66,$FF,$66,$FF,$66,$66,$00,$00 ; 23 #\r
+       .DB     $18,$7E,$DB,$D8,$7E,$1B,$DB,$7E,$18,$00 ; 24 $\r
+       .DB     $00,$E3,$E6,$0C,$18,$30,$67,$C7,$00,$00 ; 25 %\r
+       .DB     $00,$78,$CC,$D8,$73,$DE,$CC,$7B,$00,$00 ; 26 &\r
+       .DB     $00,$3C,$0C,$18,$00,$00,$00,$00,$00,$00 ; 27 '\r
+       .DB     $00,$0C,$18,$30,$30,$30,$18,$0C,$00,$00 ; 28 (\r
+       .DB     $00,$30,$18,$0C,$0C,$0C,$18,$30,$00,$00 ; 29 )\r
+       .DB     $00,$18,$DB,$7E,$3C,$7E,$DB,$18,$00,$00 ; 2A *\r
+       .DB     $00,$00,$18,$18,$FF,$18,$18,$00,$00,$00 ; 2B +\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$0C,$18,$00 ; 2C ,\r
+       .DB     $00,$00,$00,$00,$FF,$00,$00,$00,$00,$00 ; 2D -\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$3C,$00,$00 ; 2E .\r
+       .DB     $00,$03,$06,$0C,$18,$30,$60,$C0,$00,$00 ; 2F /\r
+       .DB     $00,$7E,$C7,$CF,$DB,$F3,$E3,$7E,$00,$00 ; 30 0\r
+       .DB     $00,$0C,$1C,$3C,$0C,$0C,$0C,$0C,$00,$00 ; 31 1\r
+       .DB     $00,$7E,$C3,$03,$0E,$38,$60,$FF,$00,$00 ; 32 2\r
+       .DB     $00,$7E,$C3,$03,$3E,$03,$C3,$7E,$00,$00 ; 33 3\r
+       .DB     $00,$1C,$3C,$6C,$CC,$FF,$0C,$0C,$00,$00 ; 34 4\r
+       .DB     $00,$FF,$C0,$FE,$03,$03,$C3,$7E,$00,$00 ; 35 5\r
+       .DB     $00,$3E,$60,$C0,$FE,$C3,$C3,$7E,$00,$00 ; 36 6\r
+       .DB     $00,$FF,$03,$06,$0C,$18,$18,$18,$00,$00 ; 37 7\r
+       .DB     $00,$7E,$C3,$C3,$7E,$C3,$C3,$7E,$00,$00 ; 38 8\r
+       .DB     $00,$7E,$C3,$C3,$7F,$03,$06,$7C,$00,$00 ; 39 9\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$3C,$00,$00,$00 ; 3A :\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$0C,$18,$00,$00 ; 3B ;\r
+       .DB     $00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00 ; 3C <\r
+       .DB     $00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00 ; 3D =\r
+       .DB     $00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00 ; 3E >\r
+       .DB     $00,$7E,$C3,$03,$0E,$18,$00,$18,$00,$00 ; 3F ?\r
+       .DB     $00,$7E,$C3,$DB,$DB,$DF,$C0,$7C,$00,$00 ; 40 @\r
+       .DB     $00,$3C,$66,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 41 A\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C3,$C3,$FE,$00,$00 ; 42 B\r
+       .DB     $00,$7E,$C3,$C0,$C0,$C0,$C3,$7E,$00,$00 ; 43 C\r
+       .DB     $00,$FC,$C6,$C3,$C3,$C3,$C6,$FC,$00,$00 ; 44 D\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$FF,$00,$00 ; 45 E\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$C0,$00,$00 ; 46 F\r
+       .DB     $00,$7E,$C3,$C0,$C0,$CF,$C3,$7F,$00,$00 ; 47 G\r
+       .DB     $00,$C3,$C3,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 48 H\r
+       .DB     $00,$18,$18,$18,$18,$18,$18,$18,$00,$00 ; 49 I\r
+       .DB     $00,$03,$03,$03,$03,$03,$C3,$7E,$00,$00 ; 4A J\r
+       .DB     $00,$C3,$C6,$CC,$F8,$CC,$C6,$C3,$00,$00 ; 4B K\r
+       .DB     $00,$C0,$C0,$C0,$C0,$C0,$C0,$FF,$00,$00 ; 4C L\r
+       .DB     $00,$C3,$E7,$FF,$DB,$C3,$C3,$C3,$00,$00 ; 4D M\r
+       .DB     $00,$C3,$E3,$F3,$DB,$CF,$C7,$C3,$00,$00 ; 4E N\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 4F O\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C0,$C0,$C0,$00,$00 ; 50 P\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$CF,$7E,$03,$00 ; 51 Q\r
+       .DB     $00,$FE,$C3,$C3,$FE,$CC,$C6,$C3,$00,$00 ; 52 R\r
+       .DB     $00,$7E,$C3,$C0,$7E,$03,$C3,$7E,$00,$00 ; 53 S\r
+       .DB     $00,$FF,$18,$18,$18,$18,$18,$18,$00,$00 ; 54 T\r
+       .DB     $00,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 55 U\r
+       .DB     $00,$C3,$C3,$C3,$C3,$66,$3C,$18,$00,$00 ; 56 V\r
+       .DB     $00,$C3,$C3,$C3,$C3,$DB,$FF,$66,$00,$00 ; 57 W\r
+       .DB     $00,$C3,$66,$3C,$18,$3C,$66,$C3,$00,$00 ; 58 X\r
+       .DB     $00,$C3,$C3,$66,$3C,$18,$18,$18,$00,$00 ; 59 Y\r
+       .DB     $00,$FF,$06,$0C,$18,$30,$60,$FF,$00,$00 ; 5A Z\r
+       .DB     $00,$3C,$30,$30,$30,$30,$30,$3C,$00,$00 ; 5B [\r
+       .DB     $00,$C0,$60,$30,$18,$0C,$06,$03,$00,$00 ; 5C \\r
+       .DB     $00,$3C,$0C,$0C,$0C,$0C,$0C,$3C,$00,$00 ; 5D ]\r
+       .DB     $18,$3C,$66,$C3,$00,$00,$00,$00,$00,$00 ; 5E ^\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00 ; 5F _\r
+       .DB     $0C,$18,$1E,$00,$00,$00,$00,$00,$00,$00 ; 60 `\r
+       .DB     $00,$00,$00,$7E,$03,$7F,$C3,$7F,$00,$00 ; 61 a\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$FE,$00,$00 ; 62 b\r
+       .DB     $00,$00,$00,$7E,$C3,$C0,$C3,$7E,$00,$00 ; 63 c\r
+       .DB     $00,$03,$03,$7F,$C3,$C3,$C3,$7F,$00,$00 ; 64 d\r
+       .DB     $00,$00,$00,$7E,$C3,$FF,$C0,$7E,$00,$00 ; 65 e\r
+       .DB     $00,$1E,$33,$30,$FC,$30,$30,$30,$00,$00 ; 66 f\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$7E ; 67 g\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 68 h\r
+       .DB     $00,$18,$00,$18,$18,$18,$18,$18,$00,$00 ; 69 i\r
+       .DB     $00,$06,$00,$06,$06,$06,$06,$06,$06,$7C ; 6A j\r
+       .DB     $00,$C0,$C0,$C6,$CC,$F8,$CC,$C6,$00,$00 ; 6B k\r
+       .DB     $00,$30,$30,$30,$30,$30,$30,$1C,$00,$00 ; 6C l\r
+       .DB     $00,$00,$00,$FE,$DB,$DB,$DB,$DB,$00,$00 ; 6D m\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 6E n\r
+       .DB     $00,$00,$00,$7E,$C3,$C3,$C3,$7E,$00,$00 ; 6F o\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$FE,$C0,$C0 ; 70 p\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$03 ; 71 q\r
+       .DB     $00,$00,$00,$FE,$C3,$C0,$C0,$C0,$00,$00 ; 72 r\r
+       .DB     $00,$00,$00,$7E,$C0,$7E,$03,$7E,$00,$00 ; 73 s\r
+       .DB     $00,$18,$18,$7E,$18,$18,$18,$0E,$00,$00 ; 74 t\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$00,$00 ; 75 u\r
+       .DB     $00,$00,$00,$C3,$C3,$66,$3C,$18,$00,$00 ; 76 v\r
+       .DB     $00,$00,$00,$C3,$C3,$DB,$FF,$66,$00,$00 ; 77 w\r
+       .DB     $00,$00,$00,$C3,$66,$3C,$66,$C3,$00,$00 ; 78 x\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$03,$7E ; 79 y\r
+       .DB     $00,$00,$00,$FF,$0C,$18,$30,$FF,$00,$00 ; 7A z\r
+       .DB     $00,$0E,$18,$18,$70,$18,$18,$0E,$00,$00 ; 7B {\r
+       .DB     $00,$18,$18,$18,$00,$18,$18,$18,$00,$00 ; 7C |\r
+       .DB     $00,$70,$18,$18,$0E,$18,$18,$70,$00,$00 ; 7D }\r
+       .DB     $00,$76,$DC,$00,$00,$00,$00,$00,$00,$00 ; 7E ~\r
+       .DB     $00,$00,$00,$18,$3C,$66,$C3,$FF,$00,$00 ; 7F \7f\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+       ; PAPER CUTTER DOESN'T WORK WITH BODLEVEL = 0 FOR 4.0V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4105                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACBA                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/mt102v0.asm b/src/avr/mt102v0.asm
new file mode 100644 (file)
index 0000000..a9902ea
--- /dev/null
@@ -0,0 +1,1831 @@
+;      MT102V0.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =5              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =48             ; 384 / 8 = 48 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =42             ; 384 / 9 = 42 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =6              ; (42+7) / 8 = 6 WIDTH FLAG BYTES\r
+\r
+.EQU   TIME_STEP       =72             ; 72 * 25 US = APPROX 1.8 MS\r
+.EQU   TIME_CLOCK      =2              ; 2 * 25 US = APPROX 50 US\r
+\r
+.EQU   TIME_STROBE     =24             ; 24 * 25 US = APPROX 600 US\r
+.EQU   TIME_HOLD_PWM   =1              ; DELAY UNIT FOR ABOVE = APPROX 25 US\r
+\r
+.EQU   TIME_PAPER_OUT  =12             ; 12 * 25 US = APPROX 300 US\r
+\r
+.EQU   TIME_DEBOUNCE0  =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+;.EQU  TIME_DEBOUNCE1  =1              ; 10 * 100 US = APPROX 1.0 MS\r
+.EQU   TIME_SHORTING   =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+.EQU   TIME_CUTTER     =20000          ; 20000 * 100 US = APPROX 2.0 S\r
+.EQU   TIME_SAMPLE     =4              ; DELAY UNIT FOR ABOVE = APPROX 100 US\r
+\r
+;.EQU  FEED_INITIAL    =2              ; LINES WASTED STARTING MOTOR\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   MOTOR_STATE     =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   STATUS          =R14\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.DEF   DOTS_ON_LO      =R24\r
+.DEF   DOTS_ON_HI      =R25            ; COUNT OF DOTS ON FOR LINE\r
+\r
+.EQU   TX_SIZE         =1\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_IMAGE\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+SCALE_TEXT:    .BYTE   1\r
+SCALE_IMAGE:   .BYTE   1\r
+NOTIFY_COUNT:  .BYTE   1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   IMAGE           =2              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =3              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   CUT             =4              ; SET BY FG FOR BG TO OPERATE CUTTER\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+.EQU   ASCEND          =7              ; SET BY FG, ASCENDER ALLOWED NEXT LINE\r
+;.EQU  BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY BG TO NOTIFY MOTOR RUN STATUS\r
+.EQU   CUTTER          =2              ; SET BY BG TO NOTIFY CUTTER RUN STATUS\r
+.EQU   HEADUP          =3              ; SET BY BG TO NOTIFY HEAD UP STATUS\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE PROCESSING ESC . CMD\r
+; UPPER 2 BITS ARE USED TO COUNT 4 * 256 * 25 US = 25.6 MS BETWEEN PAPER TESTS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','T','1','0','2'\r
+;      .DB     'A',' ','P','R','I','N','T','E'\r
+;      .DB     'R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 OVERFLOW INTERRUPT HANDLER\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+\r
+       LDI     G,-TIME_STEP\r
+       OUT     TCNT0,G                 ; DEFAULT DELAY TO NEXT STEP INTERRUPT\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+T0_DONE:\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+\r
+T0_RET:\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_FEED:\r
+       DEC     FEEDS\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT NEXT MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_ODD             ; OUTPUT NEXT MOTOR STATE\r
+\r
+T0_MAIN:\r
+       RCALL   T0_DONE\r
+\r
+T0_MAIN_ENTRY:\r
+       ;MOV    D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+       TST     FEEDS\r
+       BRNE    T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BREQ    T0_IDLE                 ; THERE IS NOTHING TO PRINT\r
+\r
+T0_PRINT:\r
+       SBRC    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_PRINT_GO             ; YES, START CLOCKING IMMEDIATELY\r
+\r
+       LDI     D,1<<MOTOR | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY MOTOR HAS BEEN STARTED, NOTIFY\r
+\r
+       RCALL   T0_STEP_SAME            ; OUTPUT SAME MOTOR STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       RCALL   T0_DONE                 ; HOLD FOR STEP TIME PRIOR TO STARTING\r
+\r
+T0_PRINT_GO:\r
+       TST     FEEDS\r
+       BRNE    T0_FEED                 ; FEED IF FEEDS WAITING\r
+\r
+       SBRS    FLAGS,TEXT\r
+       RJMP    T0_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       SBRS    FLAGS,IMAGE\r
+       RJMP    T0_PRINT_TEXT           ; PRINT IF TEXT WAITING\r
+\r
+       ; REVERSE FEED IF TEXT, IMAGE BOTH SET\r
+       MOV     E,CHAR_SAVE             ; CONVENIENT VARIABLE FOR REVERSE COUNT\r
+\r
+       CBR     FLAGS,1<<TEXT | 1<<IMAGE ; SAY WE HAVE NOW FREED UP CHAR_SAVE\r
+\r
+T0_REVERSE:\r
+       RCALL   T0_STEP_ODD             ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_REVERSE\r
+\r
+       RJMP    T0_MAIN_ENTRY\r
+\r
+T0_IDLE:\r
+       SBRS    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_STOPPED              ; NO, ALREADY STOPPED, CHECK CUTTER\r
+\r
+       RCALL   T0_DONE                 ; DELAY BEFORE STOPPING\r
+\r
+       LDI     D,~(1<<MOTOR)\r
+       AND     STATUS,D                ; SAY MOTOR HAS BEEN STOPPED\r
+       LDI     D,1<<NOTIFY\r
+       SBRS    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       OR      STATUS,D                ; NO, SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       LDI     D,$00\r
+       OUT     PORTD,D                 ; OUTPUT IDLE MOTOR STATE\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+       RJMP    T0_MAIN\r
+\r
+T0_STOPPED:\r
+       SBRC    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       RJMP    T0_CUT                  ; YES, GO AND OPERATE CUTTER\r
+\r
+       LDI     D,0\r
+       OUT     TCNT0,D                 ; FULL PERIOD = 256 * 25 US = 6.4 MS\r
+\r
+       LDI     D,1<<6\r
+       ADD     STATUS,D\r
+       BRCC    T0_MAIN                 ; COUNT 4 PERIODS, ENTER EVERY 25.6 MS\r
+\r
+;      TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+;      BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBIC    PORTC,4                 ; MOTOR ON?\r
+;      RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+;\r
+;      DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+;      BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       CBI     PORTD,2                 ; D2 = LOW TO LIGHT LED\r
+       CBI     DDRC,3                  ; C3 = TRI-STATE TO SAMPLE LED STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       LDI     D,-144                  ; TEST PAPER IN 144 * 25 US = 3.6 MS\r
+       SBRS    STATUS,PAPER\r
+       LDI     D,-128                  ; TEST PAPER IN 128 * 25 US = 3.2 MS\r
+       OUT     TCNT0,D\r
+\r
+       RCALL   T0_DONE\r
+\r
+       LDS     D,NOTIFY_COUNT\r
+       INC     D\r
+       STS     NOTIFY_COUNT,D\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      E,PINC                  ; SAMPLE C3 STATE\r
+\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRC,3                  ; PRINTER DATA-IN = BACK TO OUTPUT\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+\r
+       SBRC    E,3\r
+       RJMP    T0_PAPER_IN             ; C3 = 1, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; C3 = 0, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+;T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   T0_MAIN\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       OR      STATUS,D                ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       LDI     D,~(1<<PAPER)\r
+       AND     STATUS,D                ; SAY PAPER IS OUT\r
+       RJMP    T0_HEAD\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       RJMP    T0_HEAD                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<PAPER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY PAPER IS IN, MUST SEND\r
+       ;RJMP   T0_HEAD\r
+\r
+T0_HEAD:\r
+       SBRC    E,2\r
+       RJMP    T0_HEAD_UP\r
+       ;RJMP   T0_HEAD_DOWN\r
+\r
+;T0_HEAD_DOWN:\r
+       SBRS    STATUS,HEADUP           ; IF HEAD WAS DOWN,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       SBRC    STATUS,PAPER            ; (ONLY IF WE DETECTED PAPER PRESENT)\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST NOTIFY HOST\r
+       LDI     D,~(1<<HEADUP)\r
+       AND     STATUS,D                ; SAY HEAD IS DOWN\r
+       RJMP    T0_MAIN\r
+\r
+T0_HEAD_UP:\r
+       SBRC    STATUS,HEADUP           ; IF HEAD WAS UP,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<HEADUP | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY HEAD IS UP, AND NOTIFY HOST\r
+       RJMP    T0_MAIN\r
+\r
+T0_CUT:\r
+       CBR     FLAGS,1<<CUT            ; TELL FOREGROUND TO CONTINUE\r
+       LDI     D,1<<CUTTER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY CUTTER HAS BEEN STARTED, NOTIFY\r
+\r
+;T0_REPEAT_ENTRY:\r
+       CBI     PORTC,1                 ; OUTPUT FORWARD CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_CUTTER)\r
+       LDI     XH,HIGH(TIME_CUTTER)    ; IN CASE SWITCH FAILS TO OPERATE\r
+\r
+T0_CUT_LOOP0:\r
+       LDI     E,LOW(TIME_DEBOUNCE0)\r
+       LDI     F,HIGH(TIME_DEBOUNCE0)\r
+\r
+T0_CUT_LOOP1:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIC    PINC,0\r
+       RJMP    T0_CUT_LOOP0            ; WAIT FOR SWITCH TO CLOSE\r
+\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    T0_CUT_LOOP1            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_LOOP2:\r
+;      LDI     E,TIME_DEBOUNCE1\r
+\r
+T0_CUT_LOOP3:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIS    PINC,0                  ; WAIT FOR SWITCH TO OPEN AGAIN\r
+       RJMP    T0_CUT_LOOP2\r
+\r
+;      DEC     E\r
+;      BRNE    T0_CUT_LOOP3            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_DONE:\r
+       SBI     PORTC,1                 ; OUTPUT IDLE CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_SHORTING)\r
+       LDI     XH,HIGH(TIME_SHORTING)\r
+\r
+T0_SHORT:\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_SHORTING\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIW    XL,1\r
+       BRNE    T0_SHORT\r
+\r
+;      LDI     XL,LOW(TIME_CUTTER)\r
+;      LDI     XH,HIGH(TIME_CUTTER)\r
+;\r
+;T0_REPEAT_LOOP:\r
+;      LDI     D,-TIME_SAMPLE\r
+;      OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_CUTTER\r
+;\r
+;      RCALL   T0_DONE\r
+;\r
+;      SBIW    XL,1\r
+;      BRNE    T0_REPEAT_LOOP\r
+;      RJMP    T0_REPEAT_ENTRY\r
+\r
+       LDI     D,~(1<<CUTTER)\r
+       AND     STATUS,D                ; SAY CUTTER HAS BEEN STOPPED\r
+\r
+       MOV     D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+       TST     D\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST REPORT CUTTER STATUS\r
+\r
+T0_CUT_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_STEP_ODD:\r
+       LDI     D,$A0 ;$50\r
+       RJMP    T0_STEP_NEXT\r
+T0_STEP_EVEN:\r
+       LDI     D,$50 ;$A0\r
+T0_STEP_NEXT:\r
+       EOR     MOTOR_STATE,D           ; GENERATE NEXT MOTOR STATE\r
+T0_STEP_SAME:\r
+       OUT     PORTD,MOTOR_STATE       ; OUTPUT CURRENT MOTOR STATE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_TEXT:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       ;LDI    D,0\r
+       ;MOV    TEXT_MASK,D             ; SET UP MASK FOR UPPER DOT LINE\r
+       LSL     TEXT_MASK\r
+       LSL     TEXT_MASK               ; SHIFT SPACING INTO UPPER 2 BITS\r
+       LDI     D,$C0\r
+       AND     TEXT_MASK,D             ; CLEAR REMAINING BITS\r
+\r
+       SBRS    FLAGS,ASCEND            ; READY TO PRINT IF ASCENDER ALLOWED\r
+       INC     TEXT_MASK               ; ASCENDER NOT ALLOWED, SKIP 1 SLICE\r
+\r
+T0_PRINT_TEXT_SETUP:\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; CHARACTER INDEX FOR DOT LINE\r
+\r
+T0_PRINT_TEXT_SETUP_LINE:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,E\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       MOV     G,E\r
+       ANDI    G,7\r
+       INC     G                       ; F = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+T0_PRINT_TEXT_SETUP_FLAG:\r
+       LSR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_PRINT_TEXT_SETUP_FLAG\r
+\r
+       BRCC    T0_PRINT_TEXT_SETUP_CONT\r
+       LSL     F                       ; WIDE CHARACTER, DOUBLE SCALE FACTOR\r
+       SUBI    F,-$81                  ; COMPENSATE FOR -1, BIT FLAG FOR WIDE\r
+\r
+T0_PRINT_TEXT_SETUP_CONT:\r
+       ;RCALL  LOOKUP_CHAR             ; GET D = HORIZONTAL SLICE OF CHAR\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       CLR     ZH\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 4\r
+       ;LSL    ZL\r
+       ;ROL    ZH                      ; Z = ASCII CHARACTER * 8\r
+       ;SUB    ZL,D\r
+       ;LDI    D,0\r
+       ;SBC    ZH,D                    ; Z = ASCII CHARACTER * 7\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 5\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 10\r
+\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 10 + INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*10)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*10)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       MOV     H,R0\r
+       LPM                             ; R0 = CORRECT HORIZONTAL SLICE OF CHAR\r
+       MOV     D,R0\r
+       MOV     R0,H\r
+       RJMP    LOOKUP_CHAR_DONE ;RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 5\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 10\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 11\r
+\r
+       SUBI    ZL,-(EE_COUNT+2) ; 06apr03 tavrasm (EE_COUNT*2+2) ;+3)  ; PAST CRC, COUNT, CHARACTER CODE\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK         ; ZL = BASE + CHAR * 11 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      D,EEDR                  ; GET LATCHED DATA BYTE\r
+LOOKUP_CHAR_DONE:\r
+       ;RET\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; F*1 PIXELS PADDING FROM D = 0\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       SBRC    F,7\r
+       INC     E\r
+       CPI     E,WIDTH_CHARS           ; GONE PAST LAST CHARACTER FOR LINE?\r
+       ;BRLO   T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+       BRSH    T0_PRINT_TEXT_SETUP_DONE\r
+       RJMP    T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+T0_PRINT_TEXT_SETUP_DONE:\r
+\r
+       LDI     D,0\r
+       LDI     F,6\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; 6 PIXELS PADDING FROM D = 0\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+T0_PRINT_TEXT_MORE_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRLO    T0_PRINT_TEXT_MORE\r
+\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+T0_PRINT_TEXT_MORE:\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE 42*TIME_CLOCK\r
+       ; FOR PRINTING TEXT - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE\r
+\r
+       ;LDI    D,-TIME_CLOCK*WIDTH_CHARS-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+T0_PRINT_TEXT_STEP_ENTRY:\r
+       SBI     PORTD,3                 ; PRINTER STROBE = HIGH\r
+       CBI     PORTD,3                 ; PRINTER STROBE = LOW\r
+\r
+T0_PRINT_TEXT_STEP_LOOP:\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN\r
+\r
+       LDI     D,$07\r
+       OUT     PORTB,D                 ; APPLY ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_DONE\r
+\r
+       MOV     E,DOTS_ON_LO\r
+       MOV     D,DOTS_ON_HI\r
+       LSR     D\r
+       ROR     E\r
+       LSR     D\r
+       ROR     E                       ; MAXIMUM 384/4 * 25 US = 2.4 MS\r
+       SUBI    E,-TIME_STROBE\r
+\r
+       MOV     D,MOTOR_STATE           ; SAVE CURRENT MOTOR STATE\r
+\r
+T0_HOLD:\r
+       RCALL   T0_STEP_NEXT            ; PULSE WIDTH MODULATE CURRENT STATE\r
+\r
+       LDI     G,-TIME_HOLD_PWM\r
+       OUT     TCNT0,G\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_HOLD\r
+\r
+       MOV     MOTOR_STATE,D           ; RESTORE ORIGINAL MOTOR STATE\r
+\r
+       LDI     D,$00\r
+       OUT     PORTB,D                 ; REMOVE ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_STEP_ODD\r
+\r
+       SUBI    F,$10                   ; FOR (F+$10) >> 4 ITERATIONS\r
+       BRSH    T0_PRINT_TEXT_STEP_LOOP ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+T0_MAIN_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRSH    GO_T0_MAIN\r
+\r
+       INC     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       RJMP    T0_PRINT_TEXT_SETUP     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_T0_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_IMAGE:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; BYTE INDEX FOR DOT LINE\r
+\r
+T0_PRINT_IMAGE_SETUP_LINE:\r
+       PUSH    ZL\r
+\r
+       MOV     ZL,E\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; ZL = IMAGE BYTE\r
+\r
+       POP     ZL\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       CPI     E,WIDTH_IMAGE           ; GONE PAST LAST BYTE FOR LINE?\r
+       BRLO    T0_PRINT_IMAGE_SETUP_LINE ; REPEAT UNLESS ALL BYTES DONE\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE TIME_CLOCK*48\r
+       ; FOR PRINTING IMAGE - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE                 ; SHORT DELAY AFTER LAST CLOCKING INT\r
+\r
+       ;LDI    D,TIME_CLOCK*WIDTH_IMAGE-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDI     D,-1\r
+       MOV     TEXT_MASK,D             ; PRETEND THIS IS LAST DOT LINE OF TEXT\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RJMP    T0_PRINT_TEXT_STEP_ENTRY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SETUP_SLICE:                           ; SEND D = 8 HORIZONTAL BITS\r
+       LDI     H,8\r
+\r
+SETUP_SLICE_ENTRY:\r
+       TST     XL\r
+       BRNE    SETUP_SLICE_LOOP\r
+       TST     XH                      ; ANY PIXELS REMAINING FOR LINE?\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+SETUP_SLICE_LOOP:\r
+       LSL     D\r
+       BRCC    SETUP_PIXEL_LIGHT\r
+\r
+       SBI     PORTC,3                 ; PRINTER DATA-IN = HIGH\r
+\r
+SETUP_PIXEL_LIGHT:\r
+       MOV     G,F\r
+       ANDI    G,$7F                   ; REMOVE BIT FLAG INDICATING WIDE\r
+\r
+SETUP_PIXEL_LOOP:\r
+       SBI     PORTC,5                 ; PRINTER CLOCK = HIGH\r
+\r
+       SBIC    PORTC,3                 ; IF CURRENT PIXEL IS DARK,\r
+       ADIW    DOTS_ON_LO,1            ; INCREASE COUNT OF DOTS ON FOR LINE\r
+\r
+       SBIW    XL,1                    ; DECREASE COUNT OF DOTS REMAINING\r
+\r
+       CBI     PORTC,5                 ; PRINTER CLOCK = LOW\r
+\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+       SUBI    G,1                     ; FOR G+1 ITERATIONS\r
+       BRSH    SETUP_PIXEL_LOOP        ; APPLY HORIZONTAL SCALE FACTOR\r
+\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+\r
+       DEC     H                       ; NEXT PIXEL FOR CHARACTER\r
+       BRNE    SETUP_SLICE_LOOP        ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+SETUP_SLICE_DONE:\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       ; BREAK DETECTED, ASSUME WE ARE ABOUT TO TURN OFF\r
+       ; WE WILL NOW ENTER POWER DOWN MODE TO AVOID EEPROM CORRUPTION\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$30\r
+       OUT     MCUCR,D                 ; SE=1 SM=1 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+;      SBRC    FLAGS,BOMB\r
+;      RJMP    TEXT_RESET\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; SET VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$80\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,$82\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0, 1 OVERFLOW INTERRUPTS\r
+\r
+RX_WAIT_LOOP:\r
+       ; CURRENTLY DONE BY INTERRUPT, WE COULD PUT IT HERE\r
+       ;WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    RX_WAIT_CONT\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+RX_WAIT_CONT:\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;TX_SIZE-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       LDI     A,0\r
+       STS     NOTIFY_COUNT,A          ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+\r
+       LDI     A,~(1<<NOTIFY)\r
+       AND     STATUS,A                ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,$02                   ; DISABLE TIMER 1 OVERFLOW INTERRUPT\r
+       OUT     TIMSK,A                 ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+;      TST     ABORT_COUNT\r
+;      BREQ    RX_CHAR_CONT\r
+;\r
+;      LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+;      MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRD,2                  ; D2 = OUTPUT FOR PAPER SENSE LED\r
+       SBI     DDRD,4                  ; D4 = OUTPUT FOR MOTOR DRIVE B1\r
+       SBI     DDRD,5                  ; D5 = OUTPUT FOR MOTOR DRIVE A1\r
+       SBI     DDRD,6                  ; D6 = OUTPUT FOR MOTOR DRIVE A0\r
+       SBI     DDRD,7                  ; D7 = OUTPUT FOR MOTOR DRIVE B0\r
+       SBI     DDRD,3                  ; D3 = OUTPUT FOR PRINTER STROBE\r
+       SBI     DDRC,3                  ; C3 = OUTPUT FOR PRINTER DATA-IN\r
+       SBI     DDRC,5                  ; C5 = OUTPUT FOR PRINTER CLOCK\r
+       SBI     DDRB,0                  ; D5 = OUTPUT FOR PRINTER OE1 / OE4\r
+       SBI     DDRB,1                  ; D6 = OUTPUT FOR PRINTER OE2 / OE5\r
+       SBI     DDRB,2                  ; D7 = OUTPUT FOR PRINTER OE3 / OE6\r
+       SBI     DDRC,1                  ; C1 = OUTPUT FOR CUTTER DRIVE\r
+\r
+       LDI     A,3\r
+       OUT     PORTC,A                 ; IDLE STATE FOR CUTTER, C0 = PULL UP\r
+\r
+       LDI     A,0\r
+       OUT     PORTD,A                 ; IDLE STATE FOR MOTOR\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW | 1<<RXSEND | 1<<ASCEND\r
+       LDI     A,1<<PAPER | 1<<EEWR_ENABLE\r
+       MOV     STATUS,A\r
+\r
+       LDI     A,$20\r
+       STS     SCALE_TEXT,A\r
+       ; TER MODE ONLY %\r
+       ;LDI    A,0\r
+       ; %\r
+       ; API BUS MODE ONLY %\r
+       LDI     A,$21\r
+       ; %\r
+       STS     SCALE_IMAGE,A\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A               ; SET LINE SPACING FOR TEXT MODE\r
+\r
+       ;LDI    A,FEED_INITIAL ;+30\r
+       ;MOV    FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       LDI     A,$60\r
+       MOV     MOTOR_STATE,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(T0_MAIN)\r
+       LDI     H,HIGH(T0_MAIN)         ; T0_MAIN ON FIRST STEP INTERRUPT\r
+\r
+       LDI     A,4\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 25 US\r
+\r
+       LDI     A,-TIME_STEP\r
+       OUT     TCNT0,A                 ; SET DELAY TO FIRST STEP INTERRUPT\r
+\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPT\r
+\r
+       LDI     A,0\r
+       OUT     TCCR1A,A                ; TIMER1 PWM DISABLED\r
+       LDI     A,4\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 25 US\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC ; 06apr03 tavrasm *2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+BREAK_WAIT:\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    BREAK_WAIT              ; WAIT FOR API BUS MASTER TO START\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;TEXT_RESET:\r
+;      ; ENTRY POINT FROM RX_WAIT\r
+;      LDI     A,LOW(RAMEND)\r
+;      OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+;      CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+;      CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       LDS     A,PRINT_BUF+5\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     PRINT_BUF+5,A           ; SINCE WE SAVED ONLY 42 CHARS, NOT 48\r
+\r
+       MOV     A,SPACING\r
+       CPI     A,3+1\r
+       BRLO    TEXT_PRINT_SPACING\r
+       LDI     A,3\r
+TEXT_PRINT_SPACING:\r
+       SWAP    A\r
+       OR      TEXT_MASK,A             ; SAVE SPACING FOR DESCENDER PRINTING\r
+\r
+       SBR     FLAGS,1<<TEXT\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER PRINTING ?\r
+       BREQ    TEXT_PRINT_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,3                     ; COMPENSATE FOR ASCENDER + DESCENDER\r
+       BRLO    TEXT_PRINT_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS REMAINING AFTER DESCENDER,\r
+                                       ; EXCEPT FOR THE LAST ONE\r
+TEXT_PRINT_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+TEXT_PRINT_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       LDI     A,6                     ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       RCALL   WAIT_ADD_SPACING\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      STATUS,A\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+       CPI     A,'C'\r
+       BRNE    PAPER_CUT_CONT\r
+       RJMP    PAPER_CUT\r
+PAPER_CUT_CONT:\r
+       CPI     A,'J'\r
+       BREQ    IMAGE_SCALE\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+       CPI     A,'R'\r
+       BREQ    REVERSE_FEED\r
+       CPI     A,'T'\r
+       BREQ    TEXT_SCALE\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    FEED_SETUP_DONE         ; NO FEED, NO CHANGE TO ASCEND FLAG\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       DEC     A                       ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+FEED_SETUP_DONE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+REVERSE_FEED:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    REVERSE_FEED_DONE\r
+\r
+REVERSE_FEED_AGAIN:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+REVERSE_FEED_ENTRY:\r
+       MOV     CHAR_SAVE,A             ; THIS WILL BE READ BY INTERRUPT\r
+\r
+       SBR     FLAGS,1<<TEXT | 1<<IMAGE ; SETTING BOTH INDICATES REVERSE FEED\r
+REVERSE_FEED_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    REVERSE_FEED_WAIT\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    REVERSE_FEED_ENTRY      ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       SBRC    FLAGS,ASCEND            ; NEED AN EXTRA FEED FOR ASCENDERS ?\r
+REVERSE_FEED_DONE:\r
+       RJMP    TEXT_RECEIVE            ; NO, WE ARE DONE\r
+\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+\r
+       LDI     A,1                     ; REPEAT PROCESS WITH 1 EXTRA FEED\r
+       RJMP    REVERSE_FEED_AGAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_IMAGE,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+TEXT_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_TEXT,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+\r
+       OR      A,YL\r
+       OR      A,R0\r
+       BREQ    IMAGE_DONE_NO_ASCENDER  ; ABORT IF WIDTH OR LINES = 0\r
+                                       ; (WITH NO CHANGE TO ASCENDER STATUS)\r
+       LDI     A,1\r
+       SBRC    FLAGS,ASCEND\r
+       RCALL   WAIT_ADD_FEEDS          ; PERFORM THE LAST FEED IF NOT DONE YET\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER NEXT TIME ?\r
+       BREQ    IMAGE_DONE_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,1                     ; COMPENSATE FOR ASCENDER NEXT TIME\r
+       BRLO    IMAGE_DONE_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS EXCEPT FOR THE LAST ONE\r
+\r
+IMAGE_DONE_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+IMAGE_DONE_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       LDS     B,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RCALL   WAIT_ADD_FEEDS_ENTRY\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC ; 06apr03 tavrasm *2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH ; 06apr03 tavrasm *2               ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     B,$21\r
+       MOV     R0,B\r
+       LDI     B,$10                   ; B:R0 = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,R0\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PAPER_CUT:\r
+       SBR     FLAGS,1<<CUT            ; SAY CUTTER MUST BE OPERATED\r
+\r
+PAPER_CUT_WAIT:\r
+       SBRC    FLAGS,CUT\r
+       RJMP    PAPER_CUT_WAIT          ; WAIT FOR COMMAND TO BE RECEIVED\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_SPACING:\r
+       MOV     A,SPACING\r
+\r
+WAIT_ADD_FEEDS:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+WAIT_ADD_FEEDS_ENTRY:\r
+       PUSH    A\r
+       ADD     A,FEEDS                 ; CAN WE ADD FEEDS YET?\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS_ENTRY\r
+\r
+       ADD     FEEDS,A                 ; SEND THE FEEDS ATOMICALLY\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    WAIT_ADD_FEEDS_ENTRY    ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT ; 06apr03 tavrasm *2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-11\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; 20  \r
+       .DB     $00,$18,$18,$18,$18,$18,$00,$18,$00,$00 ; 21 !\r
+       .DB     $00,$E7,$63,$C6,$00,$00,$00,$00,$00,$00 ; 22 "\r
+       .DB     $00,$66,$66,$FF,$66,$FF,$66,$66,$00,$00 ; 23 #\r
+       .DB     $18,$7E,$DB,$D8,$7E,$1B,$DB,$7E,$18,$00 ; 24 $\r
+       .DB     $00,$E3,$E6,$0C,$18,$30,$67,$C7,$00,$00 ; 25 %\r
+       .DB     $00,$78,$CC,$D8,$73,$DE,$CC,$7B,$00,$00 ; 26 &\r
+       .DB     $00,$3C,$0C,$18,$00,$00,$00,$00,$00,$00 ; 27 '\r
+       .DB     $00,$0C,$18,$30,$30,$30,$18,$0C,$00,$00 ; 28 (\r
+       .DB     $00,$30,$18,$0C,$0C,$0C,$18,$30,$00,$00 ; 29 )\r
+       .DB     $00,$18,$DB,$7E,$3C,$7E,$DB,$18,$00,$00 ; 2A *\r
+       .DB     $00,$00,$18,$18,$FF,$18,$18,$00,$00,$00 ; 2B +\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$0C,$18,$00 ; 2C ,\r
+       .DB     $00,$00,$00,$00,$FF,$00,$00,$00,$00,$00 ; 2D -\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$3C,$00,$00 ; 2E .\r
+       .DB     $00,$03,$06,$0C,$18,$30,$60,$C0,$00,$00 ; 2F /\r
+       .DB     $00,$7E,$C7,$CF,$DB,$F3,$E3,$7E,$00,$00 ; 30 0\r
+       .DB     $00,$0C,$1C,$3C,$0C,$0C,$0C,$0C,$00,$00 ; 31 1\r
+       .DB     $00,$7E,$C3,$03,$0E,$38,$60,$FF,$00,$00 ; 32 2\r
+       .DB     $00,$7E,$C3,$03,$3E,$03,$C3,$7E,$00,$00 ; 33 3\r
+       .DB     $00,$1C,$3C,$6C,$CC,$FF,$0C,$0C,$00,$00 ; 34 4\r
+       .DB     $00,$FF,$C0,$FE,$03,$03,$C3,$7E,$00,$00 ; 35 5\r
+       .DB     $00,$3E,$60,$C0,$FE,$C3,$C3,$7E,$00,$00 ; 36 6\r
+       .DB     $00,$FF,$03,$06,$0C,$18,$18,$18,$00,$00 ; 37 7\r
+       .DB     $00,$7E,$C3,$C3,$7E,$C3,$C3,$7E,$00,$00 ; 38 8\r
+       .DB     $00,$7E,$C3,$C3,$7F,$03,$06,$7C,$00,$00 ; 39 9\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$3C,$00,$00,$00 ; 3A :\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$0C,$18,$00,$00 ; 3B ;\r
+       .DB     $00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00 ; 3C <\r
+       .DB     $00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00 ; 3D =\r
+       .DB     $00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00 ; 3E >\r
+       .DB     $00,$7E,$C3,$03,$0E,$18,$00,$18,$00,$00 ; 3F ?\r
+       .DB     $00,$7E,$C3,$DB,$DB,$DF,$C0,$7C,$00,$00 ; 40 @\r
+       .DB     $00,$3C,$66,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 41 A\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C3,$C3,$FE,$00,$00 ; 42 B\r
+       .DB     $00,$7E,$C3,$C0,$C0,$C0,$C3,$7E,$00,$00 ; 43 C\r
+       .DB     $00,$FC,$C6,$C3,$C3,$C3,$C6,$FC,$00,$00 ; 44 D\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$FF,$00,$00 ; 45 E\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$C0,$00,$00 ; 46 F\r
+       .DB     $00,$7E,$C3,$C0,$C0,$CF,$C3,$7F,$00,$00 ; 47 G\r
+       .DB     $00,$C3,$C3,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 48 H\r
+       .DB     $00,$18,$18,$18,$18,$18,$18,$18,$00,$00 ; 49 I\r
+       .DB     $00,$03,$03,$03,$03,$03,$C3,$7E,$00,$00 ; 4A J\r
+       .DB     $00,$C3,$C6,$CC,$F8,$CC,$C6,$C3,$00,$00 ; 4B K\r
+       .DB     $00,$C0,$C0,$C0,$C0,$C0,$C0,$FF,$00,$00 ; 4C L\r
+       .DB     $00,$C3,$E7,$FF,$DB,$C3,$C3,$C3,$00,$00 ; 4D M\r
+       .DB     $00,$C3,$E3,$F3,$DB,$CF,$C7,$C3,$00,$00 ; 4E N\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 4F O\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C0,$C0,$C0,$00,$00 ; 50 P\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$CF,$7E,$03,$00 ; 51 Q\r
+       .DB     $00,$FE,$C3,$C3,$FE,$CC,$C6,$C3,$00,$00 ; 52 R\r
+       .DB     $00,$7E,$C3,$C0,$7E,$03,$C3,$7E,$00,$00 ; 53 S\r
+       .DB     $00,$FF,$18,$18,$18,$18,$18,$18,$00,$00 ; 54 T\r
+       .DB     $00,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 55 U\r
+       .DB     $00,$C3,$C3,$C3,$C3,$66,$3C,$18,$00,$00 ; 56 V\r
+       .DB     $00,$C3,$C3,$C3,$C3,$DB,$FF,$66,$00,$00 ; 57 W\r
+       .DB     $00,$C3,$66,$3C,$18,$3C,$66,$C3,$00,$00 ; 58 X\r
+       .DB     $00,$C3,$C3,$66,$3C,$18,$18,$18,$00,$00 ; 59 Y\r
+       .DB     $00,$FF,$06,$0C,$18,$30,$60,$FF,$00,$00 ; 5A Z\r
+       .DB     $00,$3C,$30,$30,$30,$30,$30,$3C,$00,$00 ; 5B [\r
+       .DB     $00,$C0,$60,$30,$18,$0C,$06,$03,$00,$00 ; 5C \\r
+       .DB     $00,$3C,$0C,$0C,$0C,$0C,$0C,$3C,$00,$00 ; 5D ]\r
+       .DB     $18,$3C,$66,$C3,$00,$00,$00,$00,$00,$00 ; 5E ^\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00 ; 5F _\r
+       .DB     $0C,$18,$1E,$00,$00,$00,$00,$00,$00,$00 ; 60 `\r
+       .DB     $00,$00,$00,$7E,$03,$7F,$C3,$7F,$00,$00 ; 61 a\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$FE,$00,$00 ; 62 b\r
+       .DB     $00,$00,$00,$7E,$C3,$C0,$C3,$7E,$00,$00 ; 63 c\r
+       .DB     $00,$03,$03,$7F,$C3,$C3,$C3,$7F,$00,$00 ; 64 d\r
+       .DB     $00,$00,$00,$7E,$C3,$FF,$C0,$7E,$00,$00 ; 65 e\r
+       .DB     $00,$1E,$33,$30,$FC,$30,$30,$30,$00,$00 ; 66 f\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$7E ; 67 g\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 68 h\r
+       .DB     $00,$18,$00,$18,$18,$18,$18,$18,$00,$00 ; 69 i\r
+       .DB     $00,$06,$00,$06,$06,$06,$06,$06,$06,$7C ; 6A j\r
+       .DB     $00,$C0,$C0,$C6,$CC,$F8,$CC,$C6,$00,$00 ; 6B k\r
+       .DB     $00,$30,$30,$30,$30,$30,$30,$1C,$00,$00 ; 6C l\r
+       .DB     $00,$00,$00,$FE,$DB,$DB,$DB,$DB,$00,$00 ; 6D m\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 6E n\r
+       .DB     $00,$00,$00,$7E,$C3,$C3,$C3,$7E,$00,$00 ; 6F o\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$FE,$C0,$C0 ; 70 p\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$03 ; 71 q\r
+       .DB     $00,$00,$00,$FE,$C3,$C0,$C0,$C0,$00,$00 ; 72 r\r
+       .DB     $00,$00,$00,$7E,$C0,$7E,$03,$7E,$00,$00 ; 73 s\r
+       .DB     $00,$18,$18,$7E,$18,$18,$18,$0E,$00,$00 ; 74 t\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$00,$00 ; 75 u\r
+       .DB     $00,$00,$00,$C3,$C3,$66,$3C,$18,$00,$00 ; 76 v\r
+       .DB     $00,$00,$00,$C3,$C3,$DB,$FF,$66,$00,$00 ; 77 w\r
+       .DB     $00,$00,$00,$C3,$66,$3C,$66,$C3,$00,$00 ; 78 x\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$03,$7E ; 79 y\r
+       .DB     $00,$00,$00,$FF,$0C,$18,$30,$FF,$00,$00 ; 7A z\r
+       .DB     $00,$0E,$18,$18,$70,$18,$18,$0E,$00,$00 ; 7B {\r
+       .DB     $00,$18,$18,$18,$00,$18,$18,$18,$00,$00 ; 7C |\r
+       .DB     $00,$70,$18,$18,$0E,$18,$18,$70,$00,$00 ; 7D }\r
+       .DB     $00,$76,$DC,$00,$00,$00,$00,$00,$00,$00 ; 7E ~\r
+       .DB     $00,$00,$00,$18,$3C,$66,$C3,$FF,$00,$00 ; 7F \7f\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+       ; PAPER CUTTER DOESN'T WORK WITH BODLEVEL = 0 FOR 4.0V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4105                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/mt102v1.asm b/src/avr/mt102v1.asm
new file mode 100644 (file)
index 0000000..2d1247d
--- /dev/null
@@ -0,0 +1,1831 @@
+;      MT102V1.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =5              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =48             ; 384 / 8 = 48 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =42             ; 384 / 9 = 42 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =6              ; (42+7) / 8 = 6 WIDTH FLAG BYTES\r
+\r
+.EQU   TIME_STEP       =72             ; 72 * 25 US = APPROX 1.8 MS\r
+.EQU   TIME_CLOCK      =2              ; 2 * 25 US = APPROX 50 US\r
+\r
+.EQU   TIME_STROBE     =24             ; 24 * 25 US = APPROX 600 US\r
+.EQU   TIME_HOLD_PWM   =1              ; DELAY UNIT FOR ABOVE = APPROX 25 US\r
+\r
+.EQU   TIME_PAPER_OUT  =12             ; 12 * 25 US = APPROX 300 US\r
+\r
+.EQU   TIME_DEBOUNCE0  =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+;.EQU  TIME_DEBOUNCE1  =1              ; 10 * 100 US = APPROX 1.0 MS\r
+.EQU   TIME_SHORTING   =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+.EQU   TIME_CUTTER     =20000          ; 20000 * 100 US = APPROX 2.0 S\r
+.EQU   TIME_SAMPLE     =4              ; DELAY UNIT FOR ABOVE = APPROX 100 US\r
+\r
+;.EQU  FEED_INITIAL    =2              ; LINES WASTED STARTING MOTOR\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   MOTOR_STATE     =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   STATUS          =R14\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.DEF   DOTS_ON_LO      =R24\r
+.DEF   DOTS_ON_HI      =R25            ; COUNT OF DOTS ON FOR LINE\r
+\r
+.EQU   TX_SIZE         =1\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_IMAGE\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+SCALE_TEXT:    .BYTE   1\r
+SCALE_IMAGE:   .BYTE   1\r
+NOTIFY_COUNT:  .BYTE   1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   IMAGE           =2              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =3              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   CUT             =4              ; SET BY FG FOR BG TO OPERATE CUTTER\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+.EQU   ASCEND          =7              ; SET BY FG, ASCENDER ALLOWED NEXT LINE\r
+;.EQU  BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY BG TO NOTIFY MOTOR RUN STATUS\r
+.EQU   CUTTER          =2              ; SET BY BG TO NOTIFY CUTTER RUN STATUS\r
+.EQU   HEADUP          =3              ; SET BY BG TO NOTIFY HEAD UP STATUS\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE PROCESSING ESC . CMD\r
+; UPPER 2 BITS ARE USED TO COUNT 4 * 256 * 25 US = 25.6 MS BETWEEN PAPER TESTS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','T','1','0','2'\r
+;      .DB     'A',' ','P','R','I','N','T','E'\r
+;      .DB     'R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 OVERFLOW INTERRUPT HANDLER\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+\r
+       LDI     G,-TIME_STEP\r
+       OUT     TCNT0,G                 ; DEFAULT DELAY TO NEXT STEP INTERRUPT\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+T0_DONE:\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+\r
+T0_RET:\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_FEED:\r
+       DEC     FEEDS\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT NEXT MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_ODD             ; OUTPUT NEXT MOTOR STATE\r
+\r
+T0_MAIN:\r
+       RCALL   T0_DONE\r
+\r
+T0_MAIN_ENTRY:\r
+       ;MOV    D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+       TST     FEEDS\r
+       BRNE    T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BREQ    T0_IDLE                 ; THERE IS NOTHING TO PRINT\r
+\r
+T0_PRINT:\r
+       SBRC    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_PRINT_GO             ; YES, START CLOCKING IMMEDIATELY\r
+\r
+       LDI     D,1<<MOTOR | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY MOTOR HAS BEEN STARTED, NOTIFY\r
+\r
+       RCALL   T0_STEP_SAME            ; OUTPUT SAME MOTOR STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       RCALL   T0_DONE                 ; HOLD FOR STEP TIME PRIOR TO STARTING\r
+\r
+T0_PRINT_GO:\r
+       TST     FEEDS\r
+       BRNE    T0_FEED                 ; FEED IF FEEDS WAITING\r
+\r
+       SBRS    FLAGS,TEXT\r
+       RJMP    T0_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       SBRS    FLAGS,IMAGE\r
+       RJMP    T0_PRINT_TEXT           ; PRINT IF TEXT WAITING\r
+\r
+       ; REVERSE FEED IF TEXT, IMAGE BOTH SET\r
+       MOV     E,CHAR_SAVE             ; CONVENIENT VARIABLE FOR REVERSE COUNT\r
+\r
+       CBR     FLAGS,1<<TEXT | 1<<IMAGE ; SAY WE HAVE NOW FREED UP CHAR_SAVE\r
+\r
+T0_REVERSE:\r
+       RCALL   T0_STEP_ODD             ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_REVERSE\r
+\r
+       RJMP    T0_MAIN_ENTRY\r
+\r
+T0_IDLE:\r
+       SBRS    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_STOPPED              ; NO, ALREADY STOPPED, CHECK CUTTER\r
+\r
+       RCALL   T0_DONE                 ; DELAY BEFORE STOPPING\r
+\r
+       LDI     D,~(1<<MOTOR)\r
+       AND     STATUS,D                ; SAY MOTOR HAS BEEN STOPPED\r
+       LDI     D,1<<NOTIFY\r
+       SBRS    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       OR      STATUS,D                ; NO, SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       LDI     D,$00\r
+       OUT     PORTD,D                 ; OUTPUT IDLE MOTOR STATE\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+       RJMP    T0_MAIN\r
+\r
+T0_STOPPED:\r
+       SBRC    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       RJMP    T0_CUT                  ; YES, GO AND OPERATE CUTTER\r
+\r
+       LDI     D,0\r
+       OUT     TCNT0,D                 ; FULL PERIOD = 256 * 25 US = 6.4 MS\r
+\r
+       LDI     D,1<<6\r
+       ADD     STATUS,D\r
+       BRCC    T0_MAIN                 ; COUNT 4 PERIODS, ENTER EVERY 25.6 MS\r
+\r
+;      TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+;      BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBIC    PORTC,4                 ; MOTOR ON?\r
+;      RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+;\r
+;      DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+;      BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       CBI     PORTD,2                 ; D2 = LOW TO LIGHT LED\r
+       CBI     DDRC,3                  ; C3 = TRI-STATE TO SAMPLE LED STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       LDI     D,-144                  ; TEST PAPER IN 144 * 25 US = 3.6 MS\r
+       SBRS    STATUS,PAPER\r
+       LDI     D,-128                  ; TEST PAPER IN 128 * 25 US = 3.2 MS\r
+       OUT     TCNT0,D\r
+\r
+       RCALL   T0_DONE\r
+\r
+       LDS     D,NOTIFY_COUNT\r
+       INC     D\r
+       STS     NOTIFY_COUNT,D\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      E,PINC                  ; SAMPLE C3 STATE\r
+\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRC,3                  ; PRINTER DATA-IN = BACK TO OUTPUT\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+\r
+       SBRC    E,3\r
+       RJMP    T0_PAPER_IN             ; C3 = 1, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; C3 = 0, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+;T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   T0_MAIN\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       OR      STATUS,D                ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       LDI     D,~(1<<PAPER)\r
+       AND     STATUS,D                ; SAY PAPER IS OUT\r
+       RJMP    T0_HEAD\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       RJMP    T0_HEAD                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<PAPER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY PAPER IS IN, MUST SEND\r
+       ;RJMP   T0_HEAD\r
+\r
+T0_HEAD:\r
+       SBRC    E,2\r
+       RJMP    T0_HEAD_UP\r
+       ;RJMP   T0_HEAD_DOWN\r
+\r
+;T0_HEAD_DOWN:\r
+       SBRS    STATUS,HEADUP           ; IF HEAD WAS DOWN,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       SBRC    STATUS,PAPER            ; (ONLY IF WE DETECTED PAPER PRESENT)\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST NOTIFY HOST\r
+       LDI     D,~(1<<HEADUP)\r
+       AND     STATUS,D                ; SAY HEAD IS DOWN\r
+       RJMP    T0_MAIN\r
+\r
+T0_HEAD_UP:\r
+       SBRC    STATUS,HEADUP           ; IF HEAD WAS UP,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<HEADUP | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY HEAD IS UP, AND NOTIFY HOST\r
+       RJMP    T0_MAIN\r
+\r
+T0_CUT:\r
+       CBR     FLAGS,1<<CUT            ; TELL FOREGROUND TO CONTINUE\r
+       LDI     D,1<<CUTTER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY CUTTER HAS BEEN STARTED, NOTIFY\r
+\r
+;T0_REPEAT_ENTRY:\r
+       CBI     PORTC,1                 ; OUTPUT FORWARD CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_CUTTER)\r
+       LDI     XH,HIGH(TIME_CUTTER)    ; IN CASE SWITCH FAILS TO OPERATE\r
+\r
+T0_CUT_LOOP0:\r
+       LDI     E,LOW(TIME_DEBOUNCE0)\r
+       LDI     F,HIGH(TIME_DEBOUNCE0)\r
+\r
+T0_CUT_LOOP1:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIC    PINC,0\r
+       RJMP    T0_CUT_LOOP0            ; WAIT FOR SWITCH TO CLOSE\r
+\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    T0_CUT_LOOP1            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_LOOP2:\r
+;      LDI     E,TIME_DEBOUNCE1\r
+\r
+T0_CUT_LOOP3:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIS    PINC,0                  ; WAIT FOR SWITCH TO OPEN AGAIN\r
+       RJMP    T0_CUT_LOOP2\r
+\r
+;      DEC     E\r
+;      BRNE    T0_CUT_LOOP3            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_DONE:\r
+       SBI     PORTC,1                 ; OUTPUT IDLE CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_SHORTING)\r
+       LDI     XH,HIGH(TIME_SHORTING)\r
+\r
+T0_SHORT:\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_SHORTING\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIW    XL,1\r
+       BRNE    T0_SHORT\r
+\r
+;      LDI     XL,LOW(TIME_CUTTER)\r
+;      LDI     XH,HIGH(TIME_CUTTER)\r
+;\r
+;T0_REPEAT_LOOP:\r
+;      LDI     D,-TIME_SAMPLE\r
+;      OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_CUTTER\r
+;\r
+;      RCALL   T0_DONE\r
+;\r
+;      SBIW    XL,1\r
+;      BRNE    T0_REPEAT_LOOP\r
+;      RJMP    T0_REPEAT_ENTRY\r
+\r
+       LDI     D,~(1<<CUTTER)\r
+       AND     STATUS,D                ; SAY CUTTER HAS BEEN STOPPED\r
+\r
+       MOV     D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+       TST     D\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST REPORT CUTTER STATUS\r
+\r
+T0_CUT_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_STEP_ODD:\r
+       LDI     D,$A0 ;$50\r
+       RJMP    T0_STEP_NEXT\r
+T0_STEP_EVEN:\r
+       LDI     D,$50 ;$A0\r
+T0_STEP_NEXT:\r
+       EOR     MOTOR_STATE,D           ; GENERATE NEXT MOTOR STATE\r
+T0_STEP_SAME:\r
+       OUT     PORTD,MOTOR_STATE       ; OUTPUT CURRENT MOTOR STATE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_TEXT:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       ;LDI    D,0\r
+       ;MOV    TEXT_MASK,D             ; SET UP MASK FOR UPPER DOT LINE\r
+       LSL     TEXT_MASK\r
+       LSL     TEXT_MASK               ; SHIFT SPACING INTO UPPER 2 BITS\r
+       LDI     D,$C0\r
+       AND     TEXT_MASK,D             ; CLEAR REMAINING BITS\r
+\r
+       SBRS    FLAGS,ASCEND            ; READY TO PRINT IF ASCENDER ALLOWED\r
+       INC     TEXT_MASK               ; ASCENDER NOT ALLOWED, SKIP 1 SLICE\r
+\r
+T0_PRINT_TEXT_SETUP:\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; CHARACTER INDEX FOR DOT LINE\r
+\r
+T0_PRINT_TEXT_SETUP_LINE:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,E\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       MOV     G,E\r
+       ANDI    G,7\r
+       INC     G                       ; F = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+T0_PRINT_TEXT_SETUP_FLAG:\r
+       LSR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_PRINT_TEXT_SETUP_FLAG\r
+\r
+       BRCC    T0_PRINT_TEXT_SETUP_CONT\r
+       LSL     F                       ; WIDE CHARACTER, DOUBLE SCALE FACTOR\r
+       SUBI    F,-$81                  ; COMPENSATE FOR -1, BIT FLAG FOR WIDE\r
+\r
+T0_PRINT_TEXT_SETUP_CONT:\r
+       ;RCALL  LOOKUP_CHAR             ; GET D = HORIZONTAL SLICE OF CHAR\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       CLR     ZH\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 4\r
+       ;LSL    ZL\r
+       ;ROL    ZH                      ; Z = ASCII CHARACTER * 8\r
+       ;SUB    ZL,D\r
+       ;LDI    D,0\r
+       ;SBC    ZH,D                    ; Z = ASCII CHARACTER * 7\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 5\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 10\r
+\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 10 + INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*10)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*10)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       MOV     H,R0\r
+       LPM                             ; R0 = CORRECT HORIZONTAL SLICE OF CHAR\r
+       MOV     D,R0\r
+       MOV     R0,H\r
+       RJMP    LOOKUP_CHAR_DONE ;RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 5\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 10\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 11\r
+\r
+       SUBI    ZL,-(EE_COUNT+2) ; 06apr03 tavrasm (EE_COUNT*2+2) ;+3)  ; PAST CRC, COUNT, CHARACTER CODE\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK         ; ZL = BASE + CHAR * 11 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      D,EEDR                  ; GET LATCHED DATA BYTE\r
+LOOKUP_CHAR_DONE:\r
+       ;RET\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; F*1 PIXELS PADDING FROM D = 0\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       SBRC    F,7\r
+       INC     E\r
+       CPI     E,WIDTH_CHARS           ; GONE PAST LAST CHARACTER FOR LINE?\r
+       ;BRLO   T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+       BRSH    T0_PRINT_TEXT_SETUP_DONE\r
+       RJMP    T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+T0_PRINT_TEXT_SETUP_DONE:\r
+\r
+       LDI     D,0\r
+       LDI     F,6\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; 6 PIXELS PADDING FROM D = 0\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+T0_PRINT_TEXT_MORE_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRLO    T0_PRINT_TEXT_MORE\r
+\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+T0_PRINT_TEXT_MORE:\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE 42*TIME_CLOCK\r
+       ; FOR PRINTING TEXT - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE\r
+\r
+       ;LDI    D,-TIME_CLOCK*WIDTH_CHARS-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+T0_PRINT_TEXT_STEP_ENTRY:\r
+       SBI     PORTD,3                 ; PRINTER STROBE = HIGH\r
+       CBI     PORTD,3                 ; PRINTER STROBE = LOW\r
+\r
+T0_PRINT_TEXT_STEP_LOOP:\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN\r
+\r
+       LDI     D,$07\r
+       OUT     PORTB,D                 ; APPLY ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_DONE\r
+\r
+       MOV     E,DOTS_ON_LO\r
+       MOV     D,DOTS_ON_HI\r
+       LSR     D\r
+       ROR     E\r
+       LSR     D\r
+       ROR     E                       ; MAXIMUM 384/4 * 25 US = 2.4 MS\r
+       SUBI    E,-TIME_STROBE\r
+\r
+       MOV     D,MOTOR_STATE           ; SAVE CURRENT MOTOR STATE\r
+\r
+T0_HOLD:\r
+       RCALL   T0_STEP_NEXT            ; PULSE WIDTH MODULATE CURRENT STATE\r
+\r
+       LDI     G,-TIME_HOLD_PWM\r
+       OUT     TCNT0,G\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_HOLD\r
+\r
+       MOV     MOTOR_STATE,D           ; RESTORE ORIGINAL MOTOR STATE\r
+\r
+       LDI     D,$00\r
+       OUT     PORTB,D                 ; REMOVE ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_STEP_ODD\r
+\r
+       SUBI    F,$10                   ; FOR (F+$10) >> 4 ITERATIONS\r
+       BRSH    T0_PRINT_TEXT_STEP_LOOP ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+T0_MAIN_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRSH    GO_T0_MAIN\r
+\r
+       INC     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       RJMP    T0_PRINT_TEXT_SETUP     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_T0_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_IMAGE:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; BYTE INDEX FOR DOT LINE\r
+\r
+T0_PRINT_IMAGE_SETUP_LINE:\r
+       PUSH    ZL\r
+\r
+       MOV     ZL,E\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; ZL = IMAGE BYTE\r
+\r
+       POP     ZL\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       CPI     E,WIDTH_IMAGE           ; GONE PAST LAST BYTE FOR LINE?\r
+       BRLO    T0_PRINT_IMAGE_SETUP_LINE ; REPEAT UNLESS ALL BYTES DONE\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE TIME_CLOCK*48\r
+       ; FOR PRINTING IMAGE - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE                 ; SHORT DELAY AFTER LAST CLOCKING INT\r
+\r
+       ;LDI    D,TIME_CLOCK*WIDTH_IMAGE-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDI     D,-1\r
+       MOV     TEXT_MASK,D             ; PRETEND THIS IS LAST DOT LINE OF TEXT\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RJMP    T0_PRINT_TEXT_STEP_ENTRY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SETUP_SLICE:                           ; SEND D = 8 HORIZONTAL BITS\r
+       LDI     H,8\r
+\r
+SETUP_SLICE_ENTRY:\r
+       TST     XL\r
+       BRNE    SETUP_SLICE_LOOP\r
+       TST     XH                      ; ANY PIXELS REMAINING FOR LINE?\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+SETUP_SLICE_LOOP:\r
+       LSL     D\r
+       BRCC    SETUP_PIXEL_LIGHT\r
+\r
+       SBI     PORTC,3                 ; PRINTER DATA-IN = HIGH\r
+\r
+SETUP_PIXEL_LIGHT:\r
+       MOV     G,F\r
+       ANDI    G,$7F                   ; REMOVE BIT FLAG INDICATING WIDE\r
+\r
+SETUP_PIXEL_LOOP:\r
+       SBI     PORTC,5                 ; PRINTER CLOCK = HIGH\r
+\r
+       SBIC    PORTC,3                 ; IF CURRENT PIXEL IS DARK,\r
+       ADIW    DOTS_ON_LO,1            ; INCREASE COUNT OF DOTS ON FOR LINE\r
+\r
+       SBIW    XL,1                    ; DECREASE COUNT OF DOTS REMAINING\r
+\r
+       CBI     PORTC,5                 ; PRINTER CLOCK = LOW\r
+\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+       SUBI    G,1                     ; FOR G+1 ITERATIONS\r
+       BRSH    SETUP_PIXEL_LOOP        ; APPLY HORIZONTAL SCALE FACTOR\r
+\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+\r
+       DEC     H                       ; NEXT PIXEL FOR CHARACTER\r
+       BRNE    SETUP_SLICE_LOOP        ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+SETUP_SLICE_DONE:\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       ; BREAK DETECTED, ASSUME WE ARE ABOUT TO TURN OFF\r
+       ; WE WILL NOW ENTER POWER DOWN MODE TO AVOID EEPROM CORRUPTION\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$30\r
+       OUT     MCUCR,D                 ; SE=1 SM=1 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+;      SBRC    FLAGS,BOMB\r
+;      RJMP    TEXT_RESET\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; SET VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$80\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,$82\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0, 1 OVERFLOW INTERRUPTS\r
+\r
+RX_WAIT_LOOP:\r
+       ; CURRENTLY DONE BY INTERRUPT, WE COULD PUT IT HERE\r
+       ;WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    RX_WAIT_CONT\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+RX_WAIT_CONT:\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;TX_SIZE-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       LDI     A,0\r
+       STS     NOTIFY_COUNT,A          ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+\r
+       LDI     A,~(1<<NOTIFY)\r
+       AND     STATUS,A                ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,$02                   ; DISABLE TIMER 1 OVERFLOW INTERRUPT\r
+       OUT     TIMSK,A                 ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+;      TST     ABORT_COUNT\r
+;      BREQ    RX_CHAR_CONT\r
+;\r
+;      LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+;      MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRD,2                  ; D2 = OUTPUT FOR PAPER SENSE LED\r
+       SBI     DDRD,4                  ; D4 = OUTPUT FOR MOTOR DRIVE B1\r
+       SBI     DDRD,5                  ; D5 = OUTPUT FOR MOTOR DRIVE A1\r
+       SBI     DDRD,6                  ; D6 = OUTPUT FOR MOTOR DRIVE A0\r
+       SBI     DDRD,7                  ; D7 = OUTPUT FOR MOTOR DRIVE B0\r
+       SBI     DDRD,3                  ; D3 = OUTPUT FOR PRINTER STROBE\r
+       SBI     DDRC,3                  ; C3 = OUTPUT FOR PRINTER DATA-IN\r
+       SBI     DDRC,5                  ; C5 = OUTPUT FOR PRINTER CLOCK\r
+       SBI     DDRB,0                  ; D5 = OUTPUT FOR PRINTER OE1 / OE4\r
+       SBI     DDRB,1                  ; D6 = OUTPUT FOR PRINTER OE2 / OE5\r
+       SBI     DDRB,2                  ; D7 = OUTPUT FOR PRINTER OE3 / OE6\r
+       SBI     DDRC,1                  ; C1 = OUTPUT FOR CUTTER DRIVE\r
+\r
+       LDI     A,3\r
+       OUT     PORTC,A                 ; IDLE STATE FOR CUTTER, C0 = PULL UP\r
+\r
+       LDI     A,0\r
+       OUT     PORTD,A                 ; IDLE STATE FOR MOTOR\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW | 1<<RXSEND | 1<<ASCEND\r
+       LDI     A,1<<PAPER | 1<<EEWR_ENABLE\r
+       MOV     STATUS,A\r
+\r
+       LDI     A,$20\r
+       STS     SCALE_TEXT,A\r
+       ; TER MODE ONLY %\r
+       ;LDI    A,0\r
+       ; %\r
+       ; API BUS MODE ONLY %\r
+       LDI     A,$21\r
+       ; %\r
+       STS     SCALE_IMAGE,A\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A               ; SET LINE SPACING FOR TEXT MODE\r
+\r
+       ;LDI    A,FEED_INITIAL ;+30\r
+       ;MOV    FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       LDI     A,$60\r
+       MOV     MOTOR_STATE,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(T0_MAIN)\r
+       LDI     H,HIGH(T0_MAIN)         ; T0_MAIN ON FIRST STEP INTERRUPT\r
+\r
+       LDI     A,4\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 25 US\r
+\r
+       LDI     A,-TIME_STEP\r
+       OUT     TCNT0,A                 ; SET DELAY TO FIRST STEP INTERRUPT\r
+\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPT\r
+\r
+       LDI     A,0\r
+       OUT     TCCR1A,A                ; TIMER1 PWM DISABLED\r
+       LDI     A,4\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 25 US\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC ; 06apr03 tavrasm *2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+BREAK_WAIT:\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    BREAK_WAIT              ; WAIT FOR API BUS MASTER TO START\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;TEXT_RESET:\r
+;      ; ENTRY POINT FROM RX_WAIT\r
+;      LDI     A,LOW(RAMEND)\r
+;      OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+;      CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+;      CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       LDS     A,PRINT_BUF+5\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     PRINT_BUF+5,A           ; SINCE WE SAVED ONLY 42 CHARS, NOT 48\r
+\r
+       MOV     A,SPACING\r
+       CPI     A,3+1\r
+       BRLO    TEXT_PRINT_SPACING\r
+       LDI     A,3\r
+TEXT_PRINT_SPACING:\r
+       SWAP    A\r
+       OR      TEXT_MASK,A             ; SAVE SPACING FOR DESCENDER PRINTING\r
+\r
+       SBR     FLAGS,1<<TEXT\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER PRINTING ?\r
+       BREQ    TEXT_PRINT_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,3                     ; COMPENSATE FOR ASCENDER + DESCENDER\r
+       BRLO    TEXT_PRINT_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS REMAINING AFTER DESCENDER,\r
+                                       ; EXCEPT FOR THE LAST ONE\r
+TEXT_PRINT_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+TEXT_PRINT_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       LDI     A,6                     ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       RCALL   WAIT_ADD_SPACING\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      STATUS,A\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+       CPI     A,'C'\r
+       BRNE    PAPER_CUT_CONT\r
+       RJMP    PAPER_CUT\r
+PAPER_CUT_CONT:\r
+       CPI     A,'J'\r
+       BREQ    IMAGE_SCALE\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+       CPI     A,'R'\r
+       BREQ    REVERSE_FEED\r
+       CPI     A,'T'\r
+       BREQ    TEXT_SCALE\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    FEED_SETUP_DONE         ; NO FEED, NO CHANGE TO ASCEND FLAG\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       DEC     A                       ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+FEED_SETUP_DONE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+REVERSE_FEED:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    REVERSE_FEED_DONE\r
+\r
+REVERSE_FEED_AGAIN:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+REVERSE_FEED_ENTRY:\r
+       MOV     CHAR_SAVE,A             ; THIS WILL BE READ BY INTERRUPT\r
+\r
+       SBR     FLAGS,1<<TEXT | 1<<IMAGE ; SETTING BOTH INDICATES REVERSE FEED\r
+REVERSE_FEED_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    REVERSE_FEED_WAIT\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    REVERSE_FEED_ENTRY      ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       SBRC    FLAGS,ASCEND            ; NEED AN EXTRA FEED FOR ASCENDERS ?\r
+REVERSE_FEED_DONE:\r
+       RJMP    TEXT_RECEIVE            ; NO, WE ARE DONE\r
+\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+\r
+       LDI     A,1                     ; REPEAT PROCESS WITH 1 EXTRA FEED\r
+       RJMP    REVERSE_FEED_AGAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_IMAGE,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+TEXT_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_TEXT,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+\r
+       OR      A,YL\r
+       OR      A,R0\r
+       BREQ    IMAGE_DONE_NO_ASCENDER  ; ABORT IF WIDTH OR LINES = 0\r
+                                       ; (WITH NO CHANGE TO ASCENDER STATUS)\r
+       LDI     A,1\r
+       SBRC    FLAGS,ASCEND\r
+       RCALL   WAIT_ADD_FEEDS          ; PERFORM THE LAST FEED IF NOT DONE YET\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER NEXT TIME ?\r
+       BREQ    IMAGE_DONE_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,1                     ; COMPENSATE FOR ASCENDER NEXT TIME\r
+       BRLO    IMAGE_DONE_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS EXCEPT FOR THE LAST ONE\r
+\r
+IMAGE_DONE_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+IMAGE_DONE_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       LDS     B,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RCALL   WAIT_ADD_FEEDS_ENTRY\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC ; 06apr03 tavrasm *2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH ; 06apr03 tavrasm *2               ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     B,$21\r
+       MOV     R0,B\r
+       LDI     B,$10                   ; B:R0 = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,R0\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PAPER_CUT:\r
+       SBR     FLAGS,1<<CUT            ; SAY CUTTER MUST BE OPERATED\r
+\r
+PAPER_CUT_WAIT:\r
+       SBRC    FLAGS,CUT\r
+       RJMP    PAPER_CUT_WAIT          ; WAIT FOR COMMAND TO BE RECEIVED\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_SPACING:\r
+       MOV     A,SPACING\r
+\r
+WAIT_ADD_FEEDS:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+WAIT_ADD_FEEDS_ENTRY:\r
+       PUSH    A\r
+       ADD     A,FEEDS                 ; CAN WE ADD FEEDS YET?\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS_ENTRY\r
+\r
+       ADD     FEEDS,A                 ; SEND THE FEEDS ATOMICALLY\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    WAIT_ADD_FEEDS_ENTRY    ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT ; 06apr03 tavrasm *2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-11\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; 20  \r
+       .DB     $00,$18,$18,$18,$18,$18,$00,$18,$00,$00 ; 21 !\r
+       .DB     $00,$E7,$63,$C6,$00,$00,$00,$00,$00,$00 ; 22 "\r
+       .DB     $00,$66,$66,$FF,$66,$FF,$66,$66,$00,$00 ; 23 #\r
+       .DB     $18,$7E,$DB,$D8,$7E,$1B,$DB,$7E,$18,$00 ; 24 $\r
+       .DB     $00,$E3,$E6,$0C,$18,$30,$67,$C7,$00,$00 ; 25 %\r
+       .DB     $00,$78,$CC,$D8,$73,$DE,$CC,$7B,$00,$00 ; 26 &\r
+       .DB     $00,$3C,$0C,$18,$00,$00,$00,$00,$00,$00 ; 27 '\r
+       .DB     $00,$0C,$18,$30,$30,$30,$18,$0C,$00,$00 ; 28 (\r
+       .DB     $00,$30,$18,$0C,$0C,$0C,$18,$30,$00,$00 ; 29 )\r
+       .DB     $00,$18,$DB,$7E,$3C,$7E,$DB,$18,$00,$00 ; 2A *\r
+       .DB     $00,$00,$18,$18,$FF,$18,$18,$00,$00,$00 ; 2B +\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$0C,$18,$00 ; 2C ,\r
+       .DB     $00,$00,$00,$00,$FF,$00,$00,$00,$00,$00 ; 2D -\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$3C,$00,$00 ; 2E .\r
+       .DB     $00,$03,$06,$0C,$18,$30,$60,$C0,$00,$00 ; 2F /\r
+       .DB     $00,$7E,$C7,$CF,$DB,$F3,$E3,$7E,$00,$00 ; 30 0\r
+       .DB     $00,$0C,$1C,$3C,$0C,$0C,$0C,$0C,$00,$00 ; 31 1\r
+       .DB     $00,$7E,$C3,$03,$0E,$38,$60,$FF,$00,$00 ; 32 2\r
+       .DB     $00,$7E,$C3,$03,$3E,$03,$C3,$7E,$00,$00 ; 33 3\r
+       .DB     $00,$1C,$3C,$6C,$CC,$FF,$0C,$0C,$00,$00 ; 34 4\r
+       .DB     $00,$FF,$C0,$FE,$03,$03,$C3,$7E,$00,$00 ; 35 5\r
+       .DB     $00,$3E,$60,$C0,$FE,$C3,$C3,$7E,$00,$00 ; 36 6\r
+       .DB     $00,$FF,$03,$06,$0C,$18,$18,$18,$00,$00 ; 37 7\r
+       .DB     $00,$7E,$C3,$C3,$7E,$C3,$C3,$7E,$00,$00 ; 38 8\r
+       .DB     $00,$7E,$C3,$C3,$7F,$03,$06,$7C,$00,$00 ; 39 9\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$3C,$00,$00,$00 ; 3A :\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$0C,$18,$00,$00 ; 3B ;\r
+       .DB     $00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00 ; 3C <\r
+       .DB     $00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00 ; 3D =\r
+       .DB     $00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00 ; 3E >\r
+       .DB     $00,$7E,$C3,$03,$0E,$18,$00,$18,$00,$00 ; 3F ?\r
+       .DB     $00,$7E,$C3,$DB,$DB,$DF,$C0,$7C,$00,$00 ; 40 @\r
+       .DB     $00,$3C,$66,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 41 A\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C3,$C3,$FE,$00,$00 ; 42 B\r
+       .DB     $00,$7E,$C3,$C0,$C0,$C0,$C3,$7E,$00,$00 ; 43 C\r
+       .DB     $00,$FC,$C6,$C3,$C3,$C3,$C6,$FC,$00,$00 ; 44 D\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$FF,$00,$00 ; 45 E\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$C0,$00,$00 ; 46 F\r
+       .DB     $00,$7E,$C3,$C0,$C0,$CF,$C3,$7F,$00,$00 ; 47 G\r
+       .DB     $00,$C3,$C3,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 48 H\r
+       .DB     $00,$18,$18,$18,$18,$18,$18,$18,$00,$00 ; 49 I\r
+       .DB     $00,$03,$03,$03,$03,$03,$C3,$7E,$00,$00 ; 4A J\r
+       .DB     $00,$C3,$C6,$CC,$F8,$CC,$C6,$C3,$00,$00 ; 4B K\r
+       .DB     $00,$C0,$C0,$C0,$C0,$C0,$C0,$FF,$00,$00 ; 4C L\r
+       .DB     $00,$C3,$E7,$FF,$DB,$C3,$C3,$C3,$00,$00 ; 4D M\r
+       .DB     $00,$C3,$E3,$F3,$DB,$CF,$C7,$C3,$00,$00 ; 4E N\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 4F O\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C0,$C0,$C0,$00,$00 ; 50 P\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$CF,$7E,$03,$00 ; 51 Q\r
+       .DB     $00,$FE,$C3,$C3,$FE,$CC,$C6,$C3,$00,$00 ; 52 R\r
+       .DB     $00,$7E,$C3,$C0,$7E,$03,$C3,$7E,$00,$00 ; 53 S\r
+       .DB     $00,$FF,$18,$18,$18,$18,$18,$18,$00,$00 ; 54 T\r
+       .DB     $00,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 55 U\r
+       .DB     $00,$C3,$C3,$C3,$C3,$66,$3C,$18,$00,$00 ; 56 V\r
+       .DB     $00,$C3,$C3,$C3,$C3,$DB,$FF,$66,$00,$00 ; 57 W\r
+       .DB     $00,$C3,$66,$3C,$18,$3C,$66,$C3,$00,$00 ; 58 X\r
+       .DB     $00,$C3,$C3,$66,$3C,$18,$18,$18,$00,$00 ; 59 Y\r
+       .DB     $00,$FF,$06,$0C,$18,$30,$60,$FF,$00,$00 ; 5A Z\r
+       .DB     $00,$3C,$30,$30,$30,$30,$30,$3C,$00,$00 ; 5B [\r
+       .DB     $00,$C0,$60,$30,$18,$0C,$06,$03,$00,$00 ; 5C \\r
+       .DB     $00,$3C,$0C,$0C,$0C,$0C,$0C,$3C,$00,$00 ; 5D ]\r
+       .DB     $18,$3C,$66,$C3,$00,$00,$00,$00,$00,$00 ; 5E ^\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00 ; 5F _\r
+       .DB     $0C,$18,$1E,$00,$00,$00,$00,$00,$00,$00 ; 60 `\r
+       .DB     $00,$00,$00,$7E,$03,$7F,$C3,$7F,$00,$00 ; 61 a\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$FE,$00,$00 ; 62 b\r
+       .DB     $00,$00,$00,$7E,$C3,$C0,$C3,$7E,$00,$00 ; 63 c\r
+       .DB     $00,$03,$03,$7F,$C3,$C3,$C3,$7F,$00,$00 ; 64 d\r
+       .DB     $00,$00,$00,$7E,$C3,$FF,$C0,$7E,$00,$00 ; 65 e\r
+       .DB     $00,$1E,$33,$30,$FC,$30,$30,$30,$00,$00 ; 66 f\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$7E ; 67 g\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 68 h\r
+       .DB     $00,$18,$00,$18,$18,$18,$18,$18,$00,$00 ; 69 i\r
+       .DB     $00,$06,$00,$06,$06,$06,$06,$06,$06,$7C ; 6A j\r
+       .DB     $00,$C0,$C0,$C6,$CC,$F8,$CC,$C6,$00,$00 ; 6B k\r
+       .DB     $00,$30,$30,$30,$30,$30,$30,$1C,$00,$00 ; 6C l\r
+       .DB     $00,$00,$00,$FE,$DB,$DB,$DB,$DB,$00,$00 ; 6D m\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 6E n\r
+       .DB     $00,$00,$00,$7E,$C3,$C3,$C3,$7E,$00,$00 ; 6F o\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$FE,$C0,$C0 ; 70 p\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$03 ; 71 q\r
+       .DB     $00,$00,$00,$FE,$C3,$C0,$C0,$C0,$00,$00 ; 72 r\r
+       .DB     $00,$00,$00,$7E,$C0,$7E,$03,$7E,$00,$00 ; 73 s\r
+       .DB     $00,$18,$18,$7E,$18,$18,$18,$0E,$00,$00 ; 74 t\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$00,$00 ; 75 u\r
+       .DB     $00,$00,$00,$C3,$C3,$66,$3C,$18,$00,$00 ; 76 v\r
+       .DB     $00,$00,$00,$C3,$C3,$DB,$FF,$66,$00,$00 ; 77 w\r
+       .DB     $00,$00,$00,$C3,$66,$3C,$66,$C3,$00,$00 ; 78 x\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$03,$7E ; 79 y\r
+       .DB     $00,$00,$00,$FF,$0C,$18,$30,$FF,$00,$00 ; 7A z\r
+       .DB     $00,$0E,$18,$18,$70,$18,$18,$0E,$00,$00 ; 7B {\r
+       .DB     $00,$18,$18,$18,$00,$18,$18,$18,$00,$00 ; 7C |\r
+       .DB     $00,$70,$18,$18,$0E,$18,$18,$70,$00,$00 ; 7D }\r
+       .DB     $00,$76,$DC,$00,$00,$00,$00,$00,$00,$00 ; 7E ~\r
+       .DB     $00,$00,$00,$18,$3C,$66,$C3,$FF,$00,$00 ; 7F \7f\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+       ; PAPER CUTTER DOESN'T WORK WITH BODLEVEL = 0 FOR 4.0V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4105                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACBA                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/mt102v1.asm.orig b/src/avr/mt102v1.asm.orig
new file mode 100644 (file)
index 0000000..aaffef0
--- /dev/null
@@ -0,0 +1,1831 @@
+;      MT102V1.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =5              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$47            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$23            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$11            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =48             ; 384 / 8 = 48 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =42             ; 384 / 9 = 42 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =6              ; (42+7) / 8 = 6 WIDTH FLAG BYTES\r
+\r
+.EQU   TIME_STEP       =72             ; 72 * 25 US = APPROX 1.8 MS\r
+.EQU   TIME_CLOCK      =2              ; 2 * 25 US = APPROX 50 US\r
+\r
+.EQU   TIME_STROBE     =24             ; 24 * 25 US = APPROX 600 US\r
+.EQU   TIME_HOLD_PWM   =1              ; DELAY UNIT FOR ABOVE = APPROX 25 US\r
+\r
+.EQU   TIME_PAPER_OUT  =12             ; 12 * 25 US = APPROX 300 US\r
+\r
+.EQU   TIME_DEBOUNCE0  =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+;.EQU  TIME_DEBOUNCE1  =1              ; 10 * 100 US = APPROX 1.0 MS\r
+.EQU   TIME_SHORTING   =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+.EQU   TIME_CUTTER     =20000          ; 20000 * 100 US = APPROX 2.0 S\r
+.EQU   TIME_SAMPLE     =4              ; DELAY UNIT FOR ABOVE = APPROX 100 US\r
+\r
+;.EQU  FEED_INITIAL    =2              ; LINES WASTED STARTING MOTOR\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   MOTOR_STATE     =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   STATUS          =R14\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.DEF   DOTS_ON_LO      =R24\r
+.DEF   DOTS_ON_HI      =R25            ; COUNT OF DOTS ON FOR LINE\r
+\r
+.EQU   TX_SIZE         =1\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_IMAGE\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+SCALE_TEXT:    .BYTE   1\r
+SCALE_IMAGE:   .BYTE   1\r
+NOTIFY_COUNT:  .BYTE   1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   IMAGE           =2              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =3              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   CUT             =4              ; SET BY FG FOR BG TO OPERATE CUTTER\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+.EQU   ASCEND          =7              ; SET BY FG, ASCENDER ALLOWED NEXT LINE\r
+;.EQU  BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY BG TO NOTIFY MOTOR RUN STATUS\r
+.EQU   CUTTER          =2              ; SET BY BG TO NOTIFY CUTTER RUN STATUS\r
+.EQU   HEADUP          =3              ; SET BY BG TO NOTIFY HEAD UP STATUS\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE PROCESSING ESC . CMD\r
+; UPPER 2 BITS ARE USED TO COUNT 4 * 256 * 25 US = 25.6 MS BETWEEN PAPER TESTS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','T','1','0','2'\r
+;      .DB     'A',' ','P','R','I','N','T','E'\r
+;      .DB     'R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 OVERFLOW INTERRUPT HANDLER\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+\r
+       LDI     G,-TIME_STEP\r
+       OUT     TCNT0,G                 ; DEFAULT DELAY TO NEXT STEP INTERRUPT\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+T0_DONE:\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+\r
+T0_RET:\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_FEED:\r
+       DEC     FEEDS\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT NEXT MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_ODD             ; OUTPUT NEXT MOTOR STATE\r
+\r
+T0_MAIN:\r
+       RCALL   T0_DONE\r
+\r
+T0_MAIN_ENTRY:\r
+       ;MOV    D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+       TST     FEEDS\r
+       BRNE    T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BREQ    T0_IDLE                 ; THERE IS NOTHING TO PRINT\r
+\r
+T0_PRINT:\r
+       SBRC    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_PRINT_GO             ; YES, START CLOCKING IMMEDIATELY\r
+\r
+       LDI     D,1<<MOTOR | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY MOTOR HAS BEEN STARTED, NOTIFY\r
+\r
+       RCALL   T0_STEP_SAME            ; OUTPUT SAME MOTOR STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       RCALL   T0_DONE                 ; HOLD FOR STEP TIME PRIOR TO STARTING\r
+\r
+T0_PRINT_GO:\r
+       TST     FEEDS\r
+       BRNE    T0_FEED                 ; FEED IF FEEDS WAITING\r
+\r
+       SBRS    FLAGS,TEXT\r
+       RJMP    T0_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       SBRS    FLAGS,IMAGE\r
+       RJMP    T0_PRINT_TEXT           ; PRINT IF TEXT WAITING\r
+\r
+       ; REVERSE FEED IF TEXT, IMAGE BOTH SET\r
+       MOV     E,CHAR_SAVE             ; CONVENIENT VARIABLE FOR REVERSE COUNT\r
+\r
+       CBR     FLAGS,1<<TEXT | 1<<IMAGE ; SAY WE HAVE NOW FREED UP CHAR_SAVE\r
+\r
+T0_REVERSE:\r
+       RCALL   T0_STEP_ODD             ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_REVERSE\r
+\r
+       RJMP    T0_MAIN_ENTRY\r
+\r
+T0_IDLE:\r
+       SBRS    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_STOPPED              ; NO, ALREADY STOPPED, CHECK CUTTER\r
+\r
+       RCALL   T0_DONE                 ; DELAY BEFORE STOPPING\r
+\r
+       LDI     D,~(1<<MOTOR)\r
+       AND     STATUS,D                ; SAY MOTOR HAS BEEN STOPPED\r
+       LDI     D,1<<NOTIFY\r
+       SBRS    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       OR      STATUS,D                ; NO, SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       LDI     D,$00\r
+       OUT     PORTD,D                 ; OUTPUT IDLE MOTOR STATE\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+       RJMP    T0_MAIN\r
+\r
+T0_STOPPED:\r
+       SBRC    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       RJMP    T0_CUT                  ; YES, GO AND OPERATE CUTTER\r
+\r
+       LDI     D,0\r
+       OUT     TCNT0,D                 ; FULL PERIOD = 256 * 25 US = 6.4 MS\r
+\r
+       LDI     D,1<<6\r
+       ADD     STATUS,D\r
+       BRCC    T0_MAIN                 ; COUNT 4 PERIODS, ENTER EVERY 25.6 MS\r
+\r
+;      TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+;      BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBIC    PORTC,4                 ; MOTOR ON?\r
+;      RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+;\r
+;      DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+;      BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       CBI     PORTD,2                 ; D2 = LOW TO LIGHT LED\r
+       CBI     DDRC,3                  ; C3 = TRI-STATE TO SAMPLE LED STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       LDI     D,-144                  ; TEST PAPER IN 144 * 25 US = 3.6 MS\r
+       SBRS    STATUS,PAPER\r
+       LDI     D,-128                  ; TEST PAPER IN 128 * 25 US = 3.2 MS\r
+       OUT     TCNT0,D\r
+\r
+       RCALL   T0_DONE\r
+\r
+       LDS     D,NOTIFY_COUNT\r
+       INC     D\r
+       STS     NOTIFY_COUNT,D\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      E,PINC                  ; SAMPLE C3 STATE\r
+\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRC,3                  ; PRINTER DATA-IN = BACK TO OUTPUT\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+\r
+       SBRC    E,3\r
+       RJMP    T0_PAPER_IN             ; C3 = 1, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; C3 = 0, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+;T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   T0_MAIN\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       OR      STATUS,D                ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       LDI     D,~(1<<PAPER)\r
+       AND     STATUS,D                ; SAY PAPER IS OUT\r
+       RJMP    T0_HEAD\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       RJMP    T0_HEAD                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<PAPER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY PAPER IS IN, MUST SEND\r
+       ;RJMP   T0_HEAD\r
+\r
+T0_HEAD:\r
+       SBRC    E,2\r
+       RJMP    T0_HEAD_UP\r
+       ;RJMP   T0_HEAD_DOWN\r
+\r
+;T0_HEAD_DOWN:\r
+       SBRS    STATUS,HEADUP           ; IF HEAD WAS DOWN,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       SBRC    STATUS,PAPER            ; (ONLY IF WE DETECTED PAPER PRESENT)\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST NOTIFY HOST\r
+       LDI     D,~(1<<HEADUP)\r
+       AND     STATUS,D                ; SAY HEAD IS DOWN\r
+       RJMP    T0_MAIN\r
+\r
+T0_HEAD_UP:\r
+       SBRC    STATUS,HEADUP           ; IF HEAD WAS UP,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<HEADUP | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY HEAD IS UP, AND NOTIFY HOST\r
+       RJMP    T0_MAIN\r
+\r
+T0_CUT:\r
+       CBR     FLAGS,1<<CUT            ; TELL FOREGROUND TO CONTINUE\r
+       LDI     D,1<<CUTTER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY CUTTER HAS BEEN STARTED, NOTIFY\r
+\r
+;T0_REPEAT_ENTRY:\r
+       CBI     PORTC,1                 ; OUTPUT FORWARD CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_CUTTER)\r
+       LDI     XH,HIGH(TIME_CUTTER)    ; IN CASE SWITCH FAILS TO OPERATE\r
+\r
+T0_CUT_LOOP0:\r
+       LDI     E,LOW(TIME_DEBOUNCE0)\r
+       LDI     F,HIGH(TIME_DEBOUNCE0)\r
+\r
+T0_CUT_LOOP1:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIC    PINC,0\r
+       RJMP    T0_CUT_LOOP0            ; WAIT FOR SWITCH TO CLOSE\r
+\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    T0_CUT_LOOP1            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_LOOP2:\r
+;      LDI     E,TIME_DEBOUNCE1\r
+\r
+T0_CUT_LOOP3:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIS    PINC,0                  ; WAIT FOR SWITCH TO OPEN AGAIN\r
+       RJMP    T0_CUT_LOOP2\r
+\r
+;      DEC     E\r
+;      BRNE    T0_CUT_LOOP3            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_DONE:\r
+       SBI     PORTC,1                 ; OUTPUT IDLE CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_SHORTING)\r
+       LDI     XH,HIGH(TIME_SHORTING)\r
+\r
+T0_SHORT:\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_SHORTING\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIW    XL,1\r
+       BRNE    T0_SHORT\r
+\r
+;      LDI     XL,LOW(TIME_CUTTER)\r
+;      LDI     XH,HIGH(TIME_CUTTER)\r
+;\r
+;T0_REPEAT_LOOP:\r
+;      LDI     D,-TIME_SAMPLE\r
+;      OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_CUTTER\r
+;\r
+;      RCALL   T0_DONE\r
+;\r
+;      SBIW    XL,1\r
+;      BRNE    T0_REPEAT_LOOP\r
+;      RJMP    T0_REPEAT_ENTRY\r
+\r
+       LDI     D,~(1<<CUTTER)\r
+       AND     STATUS,D                ; SAY CUTTER HAS BEEN STOPPED\r
+\r
+       MOV     D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+       TST     D\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST REPORT CUTTER STATUS\r
+\r
+T0_CUT_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_STEP_ODD:\r
+       LDI     D,$A0 ;$50\r
+       RJMP    T0_STEP_NEXT\r
+T0_STEP_EVEN:\r
+       LDI     D,$50 ;$A0\r
+T0_STEP_NEXT:\r
+       EOR     MOTOR_STATE,D           ; GENERATE NEXT MOTOR STATE\r
+T0_STEP_SAME:\r
+       OUT     PORTD,MOTOR_STATE       ; OUTPUT CURRENT MOTOR STATE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_TEXT:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       ;LDI    D,0\r
+       ;MOV    TEXT_MASK,D             ; SET UP MASK FOR UPPER DOT LINE\r
+       LSL     TEXT_MASK\r
+       LSL     TEXT_MASK               ; SHIFT SPACING INTO UPPER 2 BITS\r
+       LDI     D,$C0\r
+       AND     TEXT_MASK,D             ; CLEAR REMAINING BITS\r
+\r
+       SBRS    FLAGS,ASCEND            ; READY TO PRINT IF ASCENDER ALLOWED\r
+       INC     TEXT_MASK               ; ASCENDER NOT ALLOWED, SKIP 1 SLICE\r
+\r
+T0_PRINT_TEXT_SETUP:\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; CHARACTER INDEX FOR DOT LINE\r
+\r
+T0_PRINT_TEXT_SETUP_LINE:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,E\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       MOV     G,E\r
+       ANDI    G,7\r
+       INC     G                       ; F = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+T0_PRINT_TEXT_SETUP_FLAG:\r
+       LSR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_PRINT_TEXT_SETUP_FLAG\r
+\r
+       BRCC    T0_PRINT_TEXT_SETUP_CONT\r
+       LSL     F                       ; WIDE CHARACTER, DOUBLE SCALE FACTOR\r
+       SUBI    F,-$81                  ; COMPENSATE FOR -1, BIT FLAG FOR WIDE\r
+\r
+T0_PRINT_TEXT_SETUP_CONT:\r
+       ;RCALL  LOOKUP_CHAR             ; GET D = HORIZONTAL SLICE OF CHAR\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       CLR     ZH\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 4\r
+       ;LSL    ZL\r
+       ;ROL    ZH                      ; Z = ASCII CHARACTER * 8\r
+       ;SUB    ZL,D\r
+       ;LDI    D,0\r
+       ;SBC    ZH,D                    ; Z = ASCII CHARACTER * 7\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 5\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 10\r
+\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 10 + INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*10)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*10)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       MOV     H,R0\r
+       LPM                             ; R0 = CORRECT HORIZONTAL SLICE OF CHAR\r
+       MOV     D,R0\r
+       MOV     R0,H\r
+       RJMP    LOOKUP_CHAR_DONE ;RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 5\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 10\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 11\r
+\r
+       SUBI    ZL,-(EE_COUNT*2+2) ;+3) ; PAST CRC, COUNT, CHARACTER CODE\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK         ; ZL = BASE + CHAR * 11 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      D,EEDR                  ; GET LATCHED DATA BYTE\r
+LOOKUP_CHAR_DONE:\r
+       ;RET\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; F*1 PIXELS PADDING FROM D = 0\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       SBRC    F,7\r
+       INC     E\r
+       CPI     E,WIDTH_CHARS           ; GONE PAST LAST CHARACTER FOR LINE?\r
+       ;BRLO   T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+       BRSH    T0_PRINT_TEXT_SETUP_DONE\r
+       RJMP    T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+T0_PRINT_TEXT_SETUP_DONE:\r
+\r
+       LDI     D,0\r
+       LDI     F,6\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; 6 PIXELS PADDING FROM D = 0\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+T0_PRINT_TEXT_MORE_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRLO    T0_PRINT_TEXT_MORE\r
+\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+T0_PRINT_TEXT_MORE:\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE 42*TIME_CLOCK\r
+       ; FOR PRINTING TEXT - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE\r
+\r
+       ;LDI    D,-TIME_CLOCK*WIDTH_CHARS-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+T0_PRINT_TEXT_STEP_ENTRY:\r
+       SBI     PORTD,3                 ; PRINTER STROBE = HIGH\r
+       CBI     PORTD,3                 ; PRINTER STROBE = LOW\r
+\r
+T0_PRINT_TEXT_STEP_LOOP:\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN\r
+\r
+       LDI     D,$07\r
+       OUT     PORTB,D                 ; APPLY ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_DONE\r
+\r
+       MOV     E,DOTS_ON_LO\r
+       MOV     D,DOTS_ON_HI\r
+       LSR     D\r
+       ROR     E\r
+       LSR     D\r
+       ROR     E                       ; MAXIMUM 384/4 * 25 US = 2.4 MS\r
+       SUBI    E,-TIME_STROBE\r
+\r
+       MOV     D,MOTOR_STATE           ; SAVE CURRENT MOTOR STATE\r
+\r
+T0_HOLD:\r
+       RCALL   T0_STEP_NEXT            ; PULSE WIDTH MODULATE CURRENT STATE\r
+\r
+       LDI     G,-TIME_HOLD_PWM\r
+       OUT     TCNT0,G\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_HOLD\r
+\r
+       MOV     MOTOR_STATE,D           ; RESTORE ORIGINAL MOTOR STATE\r
+\r
+       LDI     D,$00\r
+       OUT     PORTB,D                 ; REMOVE ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_STEP_ODD\r
+\r
+       SUBI    F,$10                   ; FOR (F+$10) >> 4 ITERATIONS\r
+       BRSH    T0_PRINT_TEXT_STEP_LOOP ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+T0_MAIN_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRSH    GO_T0_MAIN\r
+\r
+       INC     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       RJMP    T0_PRINT_TEXT_SETUP     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_T0_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_IMAGE:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; BYTE INDEX FOR DOT LINE\r
+\r
+T0_PRINT_IMAGE_SETUP_LINE:\r
+       PUSH    ZL\r
+\r
+       MOV     ZL,E\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; ZL = IMAGE BYTE\r
+\r
+       POP     ZL\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       CPI     E,WIDTH_IMAGE           ; GONE PAST LAST BYTE FOR LINE?\r
+       BRLO    T0_PRINT_IMAGE_SETUP_LINE ; REPEAT UNLESS ALL BYTES DONE\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE TIME_CLOCK*48\r
+       ; FOR PRINTING IMAGE - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE                 ; SHORT DELAY AFTER LAST CLOCKING INT\r
+\r
+       ;LDI    D,TIME_CLOCK*WIDTH_IMAGE-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDI     D,-1\r
+       MOV     TEXT_MASK,D             ; PRETEND THIS IS LAST DOT LINE OF TEXT\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RJMP    T0_PRINT_TEXT_STEP_ENTRY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SETUP_SLICE:                           ; SEND D = 8 HORIZONTAL BITS\r
+       LDI     H,8\r
+\r
+SETUP_SLICE_ENTRY:\r
+       TST     XL\r
+       BRNE    SETUP_SLICE_LOOP\r
+       TST     XH                      ; ANY PIXELS REMAINING FOR LINE?\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+SETUP_SLICE_LOOP:\r
+       LSL     D\r
+       BRCC    SETUP_PIXEL_LIGHT\r
+\r
+       SBI     PORTC,3                 ; PRINTER DATA-IN = HIGH\r
+\r
+SETUP_PIXEL_LIGHT:\r
+       MOV     G,F\r
+       ANDI    G,$7F                   ; REMOVE BIT FLAG INDICATING WIDE\r
+\r
+SETUP_PIXEL_LOOP:\r
+       SBI     PORTC,5                 ; PRINTER CLOCK = HIGH\r
+\r
+       SBIC    PORTC,3                 ; IF CURRENT PIXEL IS DARK,\r
+       ADIW    DOTS_ON_LO,1            ; INCREASE COUNT OF DOTS ON FOR LINE\r
+\r
+       SBIW    XL,1                    ; DECREASE COUNT OF DOTS REMAINING\r
+\r
+       CBI     PORTC,5                 ; PRINTER CLOCK = LOW\r
+\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+       SUBI    G,1                     ; FOR G+1 ITERATIONS\r
+       BRSH    SETUP_PIXEL_LOOP        ; APPLY HORIZONTAL SCALE FACTOR\r
+\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+\r
+       DEC     H                       ; NEXT PIXEL FOR CHARACTER\r
+       BRNE    SETUP_SLICE_LOOP        ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+SETUP_SLICE_DONE:\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       ; BREAK DETECTED, ASSUME WE ARE ABOUT TO TURN OFF\r
+       ; WE WILL NOW ENTER POWER DOWN MODE TO AVOID EEPROM CORRUPTION\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$30\r
+       OUT     MCUCR,D                 ; SE=1 SM=1 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+;      SBRC    FLAGS,BOMB\r
+;      RJMP    TEXT_RESET\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; SET VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$80\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,$82\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0, 1 OVERFLOW INTERRUPTS\r
+\r
+RX_WAIT_LOOP:\r
+       ; CURRENTLY DONE BY INTERRUPT, WE COULD PUT IT HERE\r
+       ;WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    RX_WAIT_CONT\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+RX_WAIT_CONT:\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;TX_SIZE-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       LDI     A,0\r
+       STS     NOTIFY_COUNT,A          ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+\r
+       LDI     A,~(1<<NOTIFY)\r
+       AND     STATUS,A                ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,$02                   ; DISABLE TIMER 1 OVERFLOW INTERRUPT\r
+       OUT     TIMSK,A                 ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+;      TST     ABORT_COUNT\r
+;      BREQ    RX_CHAR_CONT\r
+;\r
+;      LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+;      MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRD,2                  ; D2 = OUTPUT FOR PAPER SENSE LED\r
+       SBI     DDRD,4                  ; D4 = OUTPUT FOR MOTOR DRIVE B1\r
+       SBI     DDRD,5                  ; D5 = OUTPUT FOR MOTOR DRIVE A1\r
+       SBI     DDRD,6                  ; D6 = OUTPUT FOR MOTOR DRIVE A0\r
+       SBI     DDRD,7                  ; D7 = OUTPUT FOR MOTOR DRIVE B0\r
+       SBI     DDRD,3                  ; D3 = OUTPUT FOR PRINTER STROBE\r
+       SBI     DDRC,3                  ; C3 = OUTPUT FOR PRINTER DATA-IN\r
+       SBI     DDRC,5                  ; C5 = OUTPUT FOR PRINTER CLOCK\r
+       SBI     DDRB,0                  ; D5 = OUTPUT FOR PRINTER OE1 / OE4\r
+       SBI     DDRB,1                  ; D6 = OUTPUT FOR PRINTER OE2 / OE5\r
+       SBI     DDRB,2                  ; D7 = OUTPUT FOR PRINTER OE3 / OE6\r
+       SBI     DDRC,1                  ; C1 = OUTPUT FOR CUTTER DRIVE\r
+\r
+       LDI     A,3\r
+       OUT     PORTC,A                 ; IDLE STATE FOR CUTTER, C0 = PULL UP\r
+\r
+       LDI     A,0\r
+       OUT     PORTD,A                 ; IDLE STATE FOR MOTOR\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW | 1<<RXSEND | 1<<ASCEND\r
+       LDI     A,1<<PAPER | 1<<EEWR_ENABLE\r
+       MOV     STATUS,A\r
+\r
+       LDI     A,$20\r
+       STS     SCALE_TEXT,A\r
+       ; TER MODE ONLY %\r
+       ;LDI    A,0\r
+       ; %\r
+       ; API BUS MODE ONLY %\r
+       LDI     A,$21\r
+       ; %\r
+       STS     SCALE_IMAGE,A\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A               ; SET LINE SPACING FOR TEXT MODE\r
+\r
+       ;LDI    A,FEED_INITIAL ;+30\r
+       ;MOV    FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       LDI     A,$60\r
+       MOV     MOTOR_STATE,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(T0_MAIN)\r
+       LDI     H,HIGH(T0_MAIN)         ; T0_MAIN ON FIRST STEP INTERRUPT\r
+\r
+       LDI     A,4\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 25 US\r
+\r
+       LDI     A,-TIME_STEP\r
+       OUT     TCNT0,A                 ; SET DELAY TO FIRST STEP INTERRUPT\r
+\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPT\r
+\r
+       LDI     A,0\r
+       OUT     TCCR1A,A                ; TIMER1 PWM DISABLED\r
+       LDI     A,4\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 25 US\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+BREAK_WAIT:\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    BREAK_WAIT              ; WAIT FOR API BUS MASTER TO START\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;TEXT_RESET:\r
+;      ; ENTRY POINT FROM RX_WAIT\r
+;      LDI     A,LOW(RAMEND)\r
+;      OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+;      CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+;      CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       LDS     A,PRINT_BUF+5\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     PRINT_BUF+5,A           ; SINCE WE SAVED ONLY 42 CHARS, NOT 48\r
+\r
+       MOV     A,SPACING\r
+       CPI     A,3+1\r
+       BRLO    TEXT_PRINT_SPACING\r
+       LDI     A,3\r
+TEXT_PRINT_SPACING:\r
+       SWAP    A\r
+       OR      TEXT_MASK,A             ; SAVE SPACING FOR DESCENDER PRINTING\r
+\r
+       SBR     FLAGS,1<<TEXT\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER PRINTING ?\r
+       BREQ    TEXT_PRINT_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,3                     ; COMPENSATE FOR ASCENDER + DESCENDER\r
+       BRLO    TEXT_PRINT_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS REMAINING AFTER DESCENDER,\r
+                                       ; EXCEPT FOR THE LAST ONE\r
+TEXT_PRINT_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+TEXT_PRINT_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       LDI     A,6                     ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       RCALL   WAIT_ADD_SPACING\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      STATUS,A\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+       CPI     A,'C'\r
+       BRNE    PAPER_CUT_CONT\r
+       RJMP    PAPER_CUT\r
+PAPER_CUT_CONT:\r
+       CPI     A,'J'\r
+       BREQ    IMAGE_SCALE\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+       CPI     A,'R'\r
+       BREQ    REVERSE_FEED\r
+       CPI     A,'T'\r
+       BREQ    TEXT_SCALE\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    FEED_SETUP_DONE         ; NO FEED, NO CHANGE TO ASCEND FLAG\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       DEC     A                       ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+FEED_SETUP_DONE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+REVERSE_FEED:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    REVERSE_FEED_DONE\r
+\r
+REVERSE_FEED_AGAIN:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+REVERSE_FEED_ENTRY:\r
+       MOV     CHAR_SAVE,A             ; THIS WILL BE READ BY INTERRUPT\r
+\r
+       SBR     FLAGS,1<<TEXT | 1<<IMAGE ; SETTING BOTH INDICATES REVERSE FEED\r
+REVERSE_FEED_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    REVERSE_FEED_WAIT\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    REVERSE_FEED_ENTRY      ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       SBRC    FLAGS,ASCEND            ; NEED AN EXTRA FEED FOR ASCENDERS ?\r
+REVERSE_FEED_DONE:\r
+       RJMP    TEXT_RECEIVE            ; NO, WE ARE DONE\r
+\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+\r
+       LDI     A,1                     ; REPEAT PROCESS WITH 1 EXTRA FEED\r
+       RJMP    REVERSE_FEED_AGAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_IMAGE,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+TEXT_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_TEXT,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+\r
+       OR      A,YL\r
+       OR      A,R0\r
+       BREQ    IMAGE_DONE_NO_ASCENDER  ; ABORT IF WIDTH OR LINES = 0\r
+                                       ; (WITH NO CHANGE TO ASCENDER STATUS)\r
+       LDI     A,1\r
+       SBRC    FLAGS,ASCEND\r
+       RCALL   WAIT_ADD_FEEDS          ; PERFORM THE LAST FEED IF NOT DONE YET\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER NEXT TIME ?\r
+       BREQ    IMAGE_DONE_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,1                     ; COMPENSATE FOR ASCENDER NEXT TIME\r
+       BRLO    IMAGE_DONE_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS EXCEPT FOR THE LAST ONE\r
+\r
+IMAGE_DONE_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+IMAGE_DONE_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       LDS     B,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RCALL   WAIT_ADD_FEEDS_ENTRY\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH*2          ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     B,$21\r
+       MOV     R0,B\r
+       LDI     B,$10                   ; B:R0 = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,R0\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PAPER_CUT:\r
+       SBR     FLAGS,1<<CUT            ; SAY CUTTER MUST BE OPERATED\r
+\r
+PAPER_CUT_WAIT:\r
+       SBRC    FLAGS,CUT\r
+       RJMP    PAPER_CUT_WAIT          ; WAIT FOR COMMAND TO BE RECEIVED\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_SPACING:\r
+       MOV     A,SPACING\r
+\r
+WAIT_ADD_FEEDS:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+WAIT_ADD_FEEDS_ENTRY:\r
+       PUSH    A\r
+       ADD     A,FEEDS                 ; CAN WE ADD FEEDS YET?\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS_ENTRY\r
+\r
+       ADD     FEEDS,A                 ; SEND THE FEEDS ATOMICALLY\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    WAIT_ADD_FEEDS_ENTRY    ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-11\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; 20  \r
+       .DB     $00,$18,$18,$18,$18,$18,$00,$18,$00,$00 ; 21 !\r
+       .DB     $00,$E7,$63,$C6,$00,$00,$00,$00,$00,$00 ; 22 "\r
+       .DB     $00,$66,$66,$FF,$66,$FF,$66,$66,$00,$00 ; 23 #\r
+       .DB     $18,$7E,$DB,$D8,$7E,$1B,$DB,$7E,$18,$00 ; 24 $\r
+       .DB     $00,$E3,$E6,$0C,$18,$30,$67,$C7,$00,$00 ; 25 %\r
+       .DB     $00,$78,$CC,$D8,$73,$DE,$CC,$7B,$00,$00 ; 26 &\r
+       .DB     $00,$3C,$0C,$18,$00,$00,$00,$00,$00,$00 ; 27 '\r
+       .DB     $00,$0C,$18,$30,$30,$30,$18,$0C,$00,$00 ; 28 (\r
+       .DB     $00,$30,$18,$0C,$0C,$0C,$18,$30,$00,$00 ; 29 )\r
+       .DB     $00,$18,$DB,$7E,$3C,$7E,$DB,$18,$00,$00 ; 2A *\r
+       .DB     $00,$00,$18,$18,$FF,$18,$18,$00,$00,$00 ; 2B +\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$0C,$18,$00 ; 2C ,\r
+       .DB     $00,$00,$00,$00,$FF,$00,$00,$00,$00,$00 ; 2D -\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$3C,$00,$00 ; 2E .\r
+       .DB     $00,$03,$06,$0C,$18,$30,$60,$C0,$00,$00 ; 2F /\r
+       .DB     $00,$7E,$C7,$CF,$DB,$F3,$E3,$7E,$00,$00 ; 30 0\r
+       .DB     $00,$0C,$1C,$3C,$0C,$0C,$0C,$0C,$00,$00 ; 31 1\r
+       .DB     $00,$7E,$C3,$03,$0E,$38,$60,$FF,$00,$00 ; 32 2\r
+       .DB     $00,$7E,$C3,$03,$3E,$03,$C3,$7E,$00,$00 ; 33 3\r
+       .DB     $00,$1C,$3C,$6C,$CC,$FF,$0C,$0C,$00,$00 ; 34 4\r
+       .DB     $00,$FF,$C0,$FE,$03,$03,$C3,$7E,$00,$00 ; 35 5\r
+       .DB     $00,$3E,$60,$C0,$FE,$C3,$C3,$7E,$00,$00 ; 36 6\r
+       .DB     $00,$FF,$03,$06,$0C,$18,$18,$18,$00,$00 ; 37 7\r
+       .DB     $00,$7E,$C3,$C3,$7E,$C3,$C3,$7E,$00,$00 ; 38 8\r
+       .DB     $00,$7E,$C3,$C3,$7F,$03,$06,$7C,$00,$00 ; 39 9\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$3C,$00,$00,$00 ; 3A :\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$0C,$18,$00,$00 ; 3B ;\r
+       .DB     $00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00 ; 3C <\r
+       .DB     $00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00 ; 3D =\r
+       .DB     $00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00 ; 3E >\r
+       .DB     $00,$7E,$C3,$03,$0E,$18,$00,$18,$00,$00 ; 3F ?\r
+       .DB     $00,$7E,$C3,$DB,$DB,$DF,$C0,$7C,$00,$00 ; 40 @\r
+       .DB     $00,$3C,$66,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 41 A\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C3,$C3,$FE,$00,$00 ; 42 B\r
+       .DB     $00,$7E,$C3,$C0,$C0,$C0,$C3,$7E,$00,$00 ; 43 C\r
+       .DB     $00,$FC,$C6,$C3,$C3,$C3,$C6,$FC,$00,$00 ; 44 D\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$FF,$00,$00 ; 45 E\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$C0,$00,$00 ; 46 F\r
+       .DB     $00,$7E,$C3,$C0,$C0,$CF,$C3,$7F,$00,$00 ; 47 G\r
+       .DB     $00,$C3,$C3,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 48 H\r
+       .DB     $00,$18,$18,$18,$18,$18,$18,$18,$00,$00 ; 49 I\r
+       .DB     $00,$03,$03,$03,$03,$03,$C3,$7E,$00,$00 ; 4A J\r
+       .DB     $00,$C3,$C6,$CC,$F8,$CC,$C6,$C3,$00,$00 ; 4B K\r
+       .DB     $00,$C0,$C0,$C0,$C0,$C0,$C0,$FF,$00,$00 ; 4C L\r
+       .DB     $00,$C3,$E7,$FF,$DB,$C3,$C3,$C3,$00,$00 ; 4D M\r
+       .DB     $00,$C3,$E3,$F3,$DB,$CF,$C7,$C3,$00,$00 ; 4E N\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 4F O\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C0,$C0,$C0,$00,$00 ; 50 P\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$CF,$7E,$03,$00 ; 51 Q\r
+       .DB     $00,$FE,$C3,$C3,$FE,$CC,$C6,$C3,$00,$00 ; 52 R\r
+       .DB     $00,$7E,$C3,$C0,$7E,$03,$C3,$7E,$00,$00 ; 53 S\r
+       .DB     $00,$FF,$18,$18,$18,$18,$18,$18,$00,$00 ; 54 T\r
+       .DB     $00,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 55 U\r
+       .DB     $00,$C3,$C3,$C3,$C3,$66,$3C,$18,$00,$00 ; 56 V\r
+       .DB     $00,$C3,$C3,$C3,$C3,$DB,$FF,$66,$00,$00 ; 57 W\r
+       .DB     $00,$C3,$66,$3C,$18,$3C,$66,$C3,$00,$00 ; 58 X\r
+       .DB     $00,$C3,$C3,$66,$3C,$18,$18,$18,$00,$00 ; 59 Y\r
+       .DB     $00,$FF,$06,$0C,$18,$30,$60,$FF,$00,$00 ; 5A Z\r
+       .DB     $00,$3C,$30,$30,$30,$30,$30,$3C,$00,$00 ; 5B [\r
+       .DB     $00,$C0,$60,$30,$18,$0C,$06,$03,$00,$00 ; 5C \\r
+       .DB     $00,$3C,$0C,$0C,$0C,$0C,$0C,$3C,$00,$00 ; 5D ]\r
+       .DB     $18,$3C,$66,$C3,$00,$00,$00,$00,$00,$00 ; 5E ^\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00 ; 5F _\r
+       .DB     $0C,$18,$1E,$00,$00,$00,$00,$00,$00,$00 ; 60 `\r
+       .DB     $00,$00,$00,$7E,$03,$7F,$C3,$7F,$00,$00 ; 61 a\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$FE,$00,$00 ; 62 b\r
+       .DB     $00,$00,$00,$7E,$C3,$C0,$C3,$7E,$00,$00 ; 63 c\r
+       .DB     $00,$03,$03,$7F,$C3,$C3,$C3,$7F,$00,$00 ; 64 d\r
+       .DB     $00,$00,$00,$7E,$C3,$FF,$C0,$7E,$00,$00 ; 65 e\r
+       .DB     $00,$1E,$33,$30,$FC,$30,$30,$30,$00,$00 ; 66 f\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$7E ; 67 g\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 68 h\r
+       .DB     $00,$18,$00,$18,$18,$18,$18,$18,$00,$00 ; 69 i\r
+       .DB     $00,$06,$00,$06,$06,$06,$06,$06,$06,$7C ; 6A j\r
+       .DB     $00,$C0,$C0,$C6,$CC,$F8,$CC,$C6,$00,$00 ; 6B k\r
+       .DB     $00,$30,$30,$30,$30,$30,$30,$1C,$00,$00 ; 6C l\r
+       .DB     $00,$00,$00,$FE,$DB,$DB,$DB,$DB,$00,$00 ; 6D m\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 6E n\r
+       .DB     $00,$00,$00,$7E,$C3,$C3,$C3,$7E,$00,$00 ; 6F o\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$FE,$C0,$C0 ; 70 p\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$03 ; 71 q\r
+       .DB     $00,$00,$00,$FE,$C3,$C0,$C0,$C0,$00,$00 ; 72 r\r
+       .DB     $00,$00,$00,$7E,$C0,$7E,$03,$7E,$00,$00 ; 73 s\r
+       .DB     $00,$18,$18,$7E,$18,$18,$18,$0E,$00,$00 ; 74 t\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$00,$00 ; 75 u\r
+       .DB     $00,$00,$00,$C3,$C3,$66,$3C,$18,$00,$00 ; 76 v\r
+       .DB     $00,$00,$00,$C3,$C3,$DB,$FF,$66,$00,$00 ; 77 w\r
+       .DB     $00,$00,$00,$C3,$66,$3C,$66,$C3,$00,$00 ; 78 x\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$03,$7E ; 79 y\r
+       .DB     $00,$00,$00,$FF,$0C,$18,$30,$FF,$00,$00 ; 7A z\r
+       .DB     $00,$0E,$18,$18,$70,$18,$18,$0E,$00,$00 ; 7B {\r
+       .DB     $00,$18,$18,$18,$00,$18,$18,$18,$00,$00 ; 7C |\r
+       .DB     $00,$70,$18,$18,$0E,$18,$18,$70,$00,$00 ; 7D }\r
+       .DB     $00,$76,$DC,$00,$00,$00,$00,$00,$00,$00 ; 7E ~\r
+       .DB     $00,$00,$00,$18,$3C,$66,$C3,$FF,$00,$00 ; 7F \7f\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+       ; PAPER CUTTER DOESN'T WORK WITH BODLEVEL = 0 FOR 4.0V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4105                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACBA                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/mt102v2.asm b/src/avr/mt102v2.asm
new file mode 100644 (file)
index 0000000..c285aad
--- /dev/null
@@ -0,0 +1,1831 @@
+;      MT102V2.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =5              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$5F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$03            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$2F            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$17            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$0B            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$03            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =48             ; 384 / 8 = 48 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =42             ; 384 / 9 = 42 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =6              ; (42+7) / 8 = 6 WIDTH FLAG BYTES\r
+\r
+.EQU   TIME_STEP       =72             ; 72 * 25 US = APPROX 1.8 MS\r
+.EQU   TIME_CLOCK      =2              ; 2 * 25 US = APPROX 50 US\r
+\r
+.EQU   TIME_STROBE     =24             ; 24 * 25 US = APPROX 600 US\r
+.EQU   TIME_HOLD_PWM   =1              ; DELAY UNIT FOR ABOVE = APPROX 25 US\r
+\r
+.EQU   TIME_PAPER_OUT  =12             ; 12 * 25 US = APPROX 300 US\r
+\r
+.EQU   TIME_DEBOUNCE0  =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+;.EQU  TIME_DEBOUNCE1  =1              ; 10 * 100 US = APPROX 1.0 MS\r
+.EQU   TIME_SHORTING   =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+.EQU   TIME_CUTTER     =20000          ; 20000 * 100 US = APPROX 2.0 S\r
+.EQU   TIME_SAMPLE     =4              ; DELAY UNIT FOR ABOVE = APPROX 100 US\r
+\r
+;.EQU  FEED_INITIAL    =2              ; LINES WASTED STARTING MOTOR\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   MOTOR_STATE     =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   STATUS          =R14\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.DEF   DOTS_ON_LO      =R24\r
+.DEF   DOTS_ON_HI      =R25            ; COUNT OF DOTS ON FOR LINE\r
+\r
+.EQU   TX_SIZE         =1\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_IMAGE\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+SCALE_TEXT:    .BYTE   1\r
+SCALE_IMAGE:   .BYTE   1\r
+NOTIFY_COUNT:  .BYTE   1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   IMAGE           =2              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =3              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   CUT             =4              ; SET BY FG FOR BG TO OPERATE CUTTER\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+.EQU   ASCEND          =7              ; SET BY FG, ASCENDER ALLOWED NEXT LINE\r
+;.EQU  BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY BG TO NOTIFY MOTOR RUN STATUS\r
+.EQU   CUTTER          =2              ; SET BY BG TO NOTIFY CUTTER RUN STATUS\r
+.EQU   HEADUP          =3              ; SET BY BG TO NOTIFY HEAD UP STATUS\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE PROCESSING ESC . CMD\r
+; UPPER 2 BITS ARE USED TO COUNT 4 * 256 * 25 US = 25.6 MS BETWEEN PAPER TESTS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','T','1','0','2'\r
+;      .DB     'A',' ','P','R','I','N','T','E'\r
+;      .DB     'R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 OVERFLOW INTERRUPT HANDLER\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+\r
+       LDI     G,-TIME_STEP\r
+       OUT     TCNT0,G                 ; DEFAULT DELAY TO NEXT STEP INTERRUPT\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+T0_DONE:\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+\r
+T0_RET:\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_FEED:\r
+       DEC     FEEDS\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT NEXT MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_ODD             ; OUTPUT NEXT MOTOR STATE\r
+\r
+T0_MAIN:\r
+       RCALL   T0_DONE\r
+\r
+T0_MAIN_ENTRY:\r
+       ;MOV    D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+       TST     FEEDS\r
+       BRNE    T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BREQ    T0_IDLE                 ; THERE IS NOTHING TO PRINT\r
+\r
+T0_PRINT:\r
+       SBRC    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_PRINT_GO             ; YES, START CLOCKING IMMEDIATELY\r
+\r
+       LDI     D,1<<MOTOR | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY MOTOR HAS BEEN STARTED, NOTIFY\r
+\r
+       RCALL   T0_STEP_SAME            ; OUTPUT SAME MOTOR STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       RCALL   T0_DONE                 ; HOLD FOR STEP TIME PRIOR TO STARTING\r
+\r
+T0_PRINT_GO:\r
+       TST     FEEDS\r
+       BRNE    T0_FEED                 ; FEED IF FEEDS WAITING\r
+\r
+       SBRS    FLAGS,TEXT\r
+       RJMP    T0_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       SBRS    FLAGS,IMAGE\r
+       RJMP    T0_PRINT_TEXT           ; PRINT IF TEXT WAITING\r
+\r
+       ; REVERSE FEED IF TEXT, IMAGE BOTH SET\r
+       MOV     E,CHAR_SAVE             ; CONVENIENT VARIABLE FOR REVERSE COUNT\r
+\r
+       CBR     FLAGS,1<<TEXT | 1<<IMAGE ; SAY WE HAVE NOW FREED UP CHAR_SAVE\r
+\r
+T0_REVERSE:\r
+       RCALL   T0_STEP_ODD             ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_REVERSE\r
+\r
+       RJMP    T0_MAIN_ENTRY\r
+\r
+T0_IDLE:\r
+       SBRS    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_STOPPED              ; NO, ALREADY STOPPED, CHECK CUTTER\r
+\r
+       RCALL   T0_DONE                 ; DELAY BEFORE STOPPING\r
+\r
+       LDI     D,~(1<<MOTOR)\r
+       AND     STATUS,D                ; SAY MOTOR HAS BEEN STOPPED\r
+       LDI     D,1<<NOTIFY\r
+       SBRS    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       OR      STATUS,D                ; NO, SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       LDI     D,$00\r
+       OUT     PORTD,D                 ; OUTPUT IDLE MOTOR STATE\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+       RJMP    T0_MAIN\r
+\r
+T0_STOPPED:\r
+       SBRC    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       RJMP    T0_CUT                  ; YES, GO AND OPERATE CUTTER\r
+\r
+       LDI     D,0\r
+       OUT     TCNT0,D                 ; FULL PERIOD = 256 * 25 US = 6.4 MS\r
+\r
+       LDI     D,1<<6\r
+       ADD     STATUS,D\r
+       BRCC    T0_MAIN                 ; COUNT 4 PERIODS, ENTER EVERY 25.6 MS\r
+\r
+;      TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+;      BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBIC    PORTC,4                 ; MOTOR ON?\r
+;      RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+;\r
+;      DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+;      BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       CBI     PORTD,2                 ; D2 = LOW TO LIGHT LED\r
+       CBI     DDRC,3                  ; C3 = TRI-STATE TO SAMPLE LED STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       LDI     D,-144                  ; TEST PAPER IN 144 * 25 US = 3.6 MS\r
+       SBRS    STATUS,PAPER\r
+       LDI     D,-128                  ; TEST PAPER IN 128 * 25 US = 3.2 MS\r
+       OUT     TCNT0,D\r
+\r
+       RCALL   T0_DONE\r
+\r
+       LDS     D,NOTIFY_COUNT\r
+       INC     D\r
+       STS     NOTIFY_COUNT,D\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      E,PINC                  ; SAMPLE C3 STATE\r
+\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRC,3                  ; PRINTER DATA-IN = BACK TO OUTPUT\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+\r
+       SBRC    E,3\r
+       RJMP    T0_PAPER_IN             ; C3 = 1, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; C3 = 0, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+;T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   T0_MAIN\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       OR      STATUS,D                ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       LDI     D,~(1<<PAPER)\r
+       AND     STATUS,D                ; SAY PAPER IS OUT\r
+       RJMP    T0_HEAD\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       RJMP    T0_HEAD                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<PAPER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY PAPER IS IN, MUST SEND\r
+       ;RJMP   T0_HEAD\r
+\r
+T0_HEAD:\r
+       SBRC    E,2\r
+       RJMP    T0_HEAD_UP\r
+       ;RJMP   T0_HEAD_DOWN\r
+\r
+;T0_HEAD_DOWN:\r
+       SBRS    STATUS,HEADUP           ; IF HEAD WAS DOWN,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       SBRC    STATUS,PAPER            ; (ONLY IF WE DETECTED PAPER PRESENT)\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST NOTIFY HOST\r
+       LDI     D,~(1<<HEADUP)\r
+       AND     STATUS,D                ; SAY HEAD IS DOWN\r
+       RJMP    T0_MAIN\r
+\r
+T0_HEAD_UP:\r
+       SBRC    STATUS,HEADUP           ; IF HEAD WAS UP,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<HEADUP | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY HEAD IS UP, AND NOTIFY HOST\r
+       RJMP    T0_MAIN\r
+\r
+T0_CUT:\r
+       CBR     FLAGS,1<<CUT            ; TELL FOREGROUND TO CONTINUE\r
+       LDI     D,1<<CUTTER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY CUTTER HAS BEEN STARTED, NOTIFY\r
+\r
+;T0_REPEAT_ENTRY:\r
+       CBI     PORTC,1                 ; OUTPUT FORWARD CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_CUTTER)\r
+       LDI     XH,HIGH(TIME_CUTTER)    ; IN CASE SWITCH FAILS TO OPERATE\r
+\r
+T0_CUT_LOOP0:\r
+       LDI     E,LOW(TIME_DEBOUNCE0)\r
+       LDI     F,HIGH(TIME_DEBOUNCE0)\r
+\r
+T0_CUT_LOOP1:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIC    PINC,0\r
+       RJMP    T0_CUT_LOOP0            ; WAIT FOR SWITCH TO CLOSE\r
+\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    T0_CUT_LOOP1            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_LOOP2:\r
+;      LDI     E,TIME_DEBOUNCE1\r
+\r
+T0_CUT_LOOP3:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIS    PINC,0                  ; WAIT FOR SWITCH TO OPEN AGAIN\r
+       RJMP    T0_CUT_LOOP2\r
+\r
+;      DEC     E\r
+;      BRNE    T0_CUT_LOOP3            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_DONE:\r
+       SBI     PORTC,1                 ; OUTPUT IDLE CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_SHORTING)\r
+       LDI     XH,HIGH(TIME_SHORTING)\r
+\r
+T0_SHORT:\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_SHORTING\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIW    XL,1\r
+       BRNE    T0_SHORT\r
+\r
+;      LDI     XL,LOW(TIME_CUTTER)\r
+;      LDI     XH,HIGH(TIME_CUTTER)\r
+;\r
+;T0_REPEAT_LOOP:\r
+;      LDI     D,-TIME_SAMPLE\r
+;      OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_CUTTER\r
+;\r
+;      RCALL   T0_DONE\r
+;\r
+;      SBIW    XL,1\r
+;      BRNE    T0_REPEAT_LOOP\r
+;      RJMP    T0_REPEAT_ENTRY\r
+\r
+       LDI     D,~(1<<CUTTER)\r
+       AND     STATUS,D                ; SAY CUTTER HAS BEEN STOPPED\r
+\r
+       MOV     D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+       TST     D\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST REPORT CUTTER STATUS\r
+\r
+T0_CUT_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_STEP_ODD:\r
+       LDI     D,$A0 ;$50\r
+       RJMP    T0_STEP_NEXT\r
+T0_STEP_EVEN:\r
+       LDI     D,$50 ;$A0\r
+T0_STEP_NEXT:\r
+       EOR     MOTOR_STATE,D           ; GENERATE NEXT MOTOR STATE\r
+T0_STEP_SAME:\r
+       OUT     PORTD,MOTOR_STATE       ; OUTPUT CURRENT MOTOR STATE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_TEXT:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       ;LDI    D,0\r
+       ;MOV    TEXT_MASK,D             ; SET UP MASK FOR UPPER DOT LINE\r
+       LSL     TEXT_MASK\r
+       LSL     TEXT_MASK               ; SHIFT SPACING INTO UPPER 2 BITS\r
+       LDI     D,$C0\r
+       AND     TEXT_MASK,D             ; CLEAR REMAINING BITS\r
+\r
+       SBRS    FLAGS,ASCEND            ; READY TO PRINT IF ASCENDER ALLOWED\r
+       INC     TEXT_MASK               ; ASCENDER NOT ALLOWED, SKIP 1 SLICE\r
+\r
+T0_PRINT_TEXT_SETUP:\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; CHARACTER INDEX FOR DOT LINE\r
+\r
+T0_PRINT_TEXT_SETUP_LINE:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,E\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       MOV     G,E\r
+       ANDI    G,7\r
+       INC     G                       ; F = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+T0_PRINT_TEXT_SETUP_FLAG:\r
+       LSR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_PRINT_TEXT_SETUP_FLAG\r
+\r
+       BRCC    T0_PRINT_TEXT_SETUP_CONT\r
+       LSL     F                       ; WIDE CHARACTER, DOUBLE SCALE FACTOR\r
+       SUBI    F,-$81                  ; COMPENSATE FOR -1, BIT FLAG FOR WIDE\r
+\r
+T0_PRINT_TEXT_SETUP_CONT:\r
+       ;RCALL  LOOKUP_CHAR             ; GET D = HORIZONTAL SLICE OF CHAR\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       CLR     ZH\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 4\r
+       ;LSL    ZL\r
+       ;ROL    ZH                      ; Z = ASCII CHARACTER * 8\r
+       ;SUB    ZL,D\r
+       ;LDI    D,0\r
+       ;SBC    ZH,D                    ; Z = ASCII CHARACTER * 7\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 5\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 10\r
+\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 10 + INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*10)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*10)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       MOV     H,R0\r
+       LPM                             ; R0 = CORRECT HORIZONTAL SLICE OF CHAR\r
+       MOV     D,R0\r
+       MOV     R0,H\r
+       RJMP    LOOKUP_CHAR_DONE ;RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 5\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 10\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 11\r
+\r
+       SUBI    ZL,-(EE_COUNT+2) ; 06apr03 tavrasm (EE_COUNT*2+2) ;+3)  ; PAST CRC, COUNT, CHARACTER CODE\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK         ; ZL = BASE + CHAR * 11 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      D,EEDR                  ; GET LATCHED DATA BYTE\r
+LOOKUP_CHAR_DONE:\r
+       ;RET\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; F*1 PIXELS PADDING FROM D = 0\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       SBRC    F,7\r
+       INC     E\r
+       CPI     E,WIDTH_CHARS           ; GONE PAST LAST CHARACTER FOR LINE?\r
+       ;BRLO   T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+       BRSH    T0_PRINT_TEXT_SETUP_DONE\r
+       RJMP    T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+T0_PRINT_TEXT_SETUP_DONE:\r
+\r
+       LDI     D,0\r
+       LDI     F,6\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; 6 PIXELS PADDING FROM D = 0\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+T0_PRINT_TEXT_MORE_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRLO    T0_PRINT_TEXT_MORE\r
+\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+T0_PRINT_TEXT_MORE:\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE 42*TIME_CLOCK\r
+       ; FOR PRINTING TEXT - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE\r
+\r
+       ;LDI    D,-TIME_CLOCK*WIDTH_CHARS-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+T0_PRINT_TEXT_STEP_ENTRY:\r
+       SBI     PORTD,3                 ; PRINTER STROBE = HIGH\r
+       CBI     PORTD,3                 ; PRINTER STROBE = LOW\r
+\r
+T0_PRINT_TEXT_STEP_LOOP:\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN\r
+\r
+       LDI     D,$07\r
+       OUT     PORTB,D                 ; APPLY ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_DONE\r
+\r
+       MOV     E,DOTS_ON_LO\r
+       MOV     D,DOTS_ON_HI\r
+       LSR     D\r
+       ROR     E\r
+       LSR     D\r
+       ROR     E                       ; MAXIMUM 384/4 * 25 US = 2.4 MS\r
+       SUBI    E,-TIME_STROBE\r
+\r
+       MOV     D,MOTOR_STATE           ; SAVE CURRENT MOTOR STATE\r
+\r
+T0_HOLD:\r
+       RCALL   T0_STEP_NEXT            ; PULSE WIDTH MODULATE CURRENT STATE\r
+\r
+       LDI     G,-TIME_HOLD_PWM\r
+       OUT     TCNT0,G\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_HOLD\r
+\r
+       MOV     MOTOR_STATE,D           ; RESTORE ORIGINAL MOTOR STATE\r
+\r
+       LDI     D,$00\r
+       OUT     PORTB,D                 ; REMOVE ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_STEP_ODD\r
+\r
+       SUBI    F,$10                   ; FOR (F+$10) >> 4 ITERATIONS\r
+       BRSH    T0_PRINT_TEXT_STEP_LOOP ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+T0_MAIN_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRSH    GO_T0_MAIN\r
+\r
+       INC     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       RJMP    T0_PRINT_TEXT_SETUP     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_T0_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_IMAGE:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; BYTE INDEX FOR DOT LINE\r
+\r
+T0_PRINT_IMAGE_SETUP_LINE:\r
+       PUSH    ZL\r
+\r
+       MOV     ZL,E\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; ZL = IMAGE BYTE\r
+\r
+       POP     ZL\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       CPI     E,WIDTH_IMAGE           ; GONE PAST LAST BYTE FOR LINE?\r
+       BRLO    T0_PRINT_IMAGE_SETUP_LINE ; REPEAT UNLESS ALL BYTES DONE\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE TIME_CLOCK*48\r
+       ; FOR PRINTING IMAGE - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE                 ; SHORT DELAY AFTER LAST CLOCKING INT\r
+\r
+       ;LDI    D,TIME_CLOCK*WIDTH_IMAGE-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDI     D,-1\r
+       MOV     TEXT_MASK,D             ; PRETEND THIS IS LAST DOT LINE OF TEXT\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RJMP    T0_PRINT_TEXT_STEP_ENTRY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SETUP_SLICE:                           ; SEND D = 8 HORIZONTAL BITS\r
+       LDI     H,8\r
+\r
+SETUP_SLICE_ENTRY:\r
+       TST     XL\r
+       BRNE    SETUP_SLICE_LOOP\r
+       TST     XH                      ; ANY PIXELS REMAINING FOR LINE?\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+SETUP_SLICE_LOOP:\r
+       LSL     D\r
+       BRCC    SETUP_PIXEL_LIGHT\r
+\r
+       SBI     PORTC,3                 ; PRINTER DATA-IN = HIGH\r
+\r
+SETUP_PIXEL_LIGHT:\r
+       MOV     G,F\r
+       ANDI    G,$7F                   ; REMOVE BIT FLAG INDICATING WIDE\r
+\r
+SETUP_PIXEL_LOOP:\r
+       SBI     PORTC,5                 ; PRINTER CLOCK = HIGH\r
+\r
+       SBIC    PORTC,3                 ; IF CURRENT PIXEL IS DARK,\r
+       ADIW    DOTS_ON_LO,1            ; INCREASE COUNT OF DOTS ON FOR LINE\r
+\r
+       SBIW    XL,1                    ; DECREASE COUNT OF DOTS REMAINING\r
+\r
+       CBI     PORTC,5                 ; PRINTER CLOCK = LOW\r
+\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+       SUBI    G,1                     ; FOR G+1 ITERATIONS\r
+       BRSH    SETUP_PIXEL_LOOP        ; APPLY HORIZONTAL SCALE FACTOR\r
+\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+\r
+       DEC     H                       ; NEXT PIXEL FOR CHARACTER\r
+       BRNE    SETUP_SLICE_LOOP        ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+SETUP_SLICE_DONE:\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       ; BREAK DETECTED, ASSUME WE ARE ABOUT TO TURN OFF\r
+       ; WE WILL NOW ENTER POWER DOWN MODE TO AVOID EEPROM CORRUPTION\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$30\r
+       OUT     MCUCR,D                 ; SE=1 SM=1 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+;      SBRC    FLAGS,BOMB\r
+;      RJMP    TEXT_RESET\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; SET VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$80\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,$82\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0, 1 OVERFLOW INTERRUPTS\r
+\r
+RX_WAIT_LOOP:\r
+       ; CURRENTLY DONE BY INTERRUPT, WE COULD PUT IT HERE\r
+       ;WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    RX_WAIT_CONT\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+RX_WAIT_CONT:\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;TX_SIZE-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       LDI     A,0\r
+       STS     NOTIFY_COUNT,A          ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+\r
+       LDI     A,~(1<<NOTIFY)\r
+       AND     STATUS,A                ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,$02                   ; DISABLE TIMER 1 OVERFLOW INTERRUPT\r
+       OUT     TIMSK,A                 ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+;      TST     ABORT_COUNT\r
+;      BREQ    RX_CHAR_CONT\r
+;\r
+;      LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+;      MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRD,2                  ; D2 = OUTPUT FOR PAPER SENSE LED\r
+       SBI     DDRD,4                  ; D4 = OUTPUT FOR MOTOR DRIVE B1\r
+       SBI     DDRD,5                  ; D5 = OUTPUT FOR MOTOR DRIVE A1\r
+       SBI     DDRD,6                  ; D6 = OUTPUT FOR MOTOR DRIVE A0\r
+       SBI     DDRD,7                  ; D7 = OUTPUT FOR MOTOR DRIVE B0\r
+       SBI     DDRD,3                  ; D3 = OUTPUT FOR PRINTER STROBE\r
+       SBI     DDRC,3                  ; C3 = OUTPUT FOR PRINTER DATA-IN\r
+       SBI     DDRC,5                  ; C5 = OUTPUT FOR PRINTER CLOCK\r
+       SBI     DDRB,0                  ; D5 = OUTPUT FOR PRINTER OE1 / OE4\r
+       SBI     DDRB,1                  ; D6 = OUTPUT FOR PRINTER OE2 / OE5\r
+       SBI     DDRB,2                  ; D7 = OUTPUT FOR PRINTER OE3 / OE6\r
+       SBI     DDRC,1                  ; C1 = OUTPUT FOR CUTTER DRIVE\r
+\r
+       LDI     A,3\r
+       OUT     PORTC,A                 ; IDLE STATE FOR CUTTER, C0 = PULL UP\r
+\r
+       LDI     A,0\r
+       OUT     PORTD,A                 ; IDLE STATE FOR MOTOR\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW | 1<<RXSEND | 1<<ASCEND\r
+       LDI     A,1<<PAPER | 1<<EEWR_ENABLE\r
+       MOV     STATUS,A\r
+\r
+       LDI     A,$20\r
+       STS     SCALE_TEXT,A\r
+       ; TER MODE ONLY %\r
+       ;LDI    A,0\r
+       ; %\r
+       ; API BUS MODE ONLY %\r
+       LDI     A,$21\r
+       ; %\r
+       STS     SCALE_IMAGE,A\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A               ; SET LINE SPACING FOR TEXT MODE\r
+\r
+       ;LDI    A,FEED_INITIAL ;+30\r
+       ;MOV    FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       LDI     A,$60\r
+       MOV     MOTOR_STATE,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(T0_MAIN)\r
+       LDI     H,HIGH(T0_MAIN)         ; T0_MAIN ON FIRST STEP INTERRUPT\r
+\r
+       LDI     A,4\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 25 US\r
+\r
+       LDI     A,-TIME_STEP\r
+       OUT     TCNT0,A                 ; SET DELAY TO FIRST STEP INTERRUPT\r
+\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPT\r
+\r
+       LDI     A,0\r
+       OUT     TCCR1A,A                ; TIMER1 PWM DISABLED\r
+       LDI     A,4\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 25 US\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC ; 06apr03 tavrasm *2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+BREAK_WAIT:\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    BREAK_WAIT              ; WAIT FOR API BUS MASTER TO START\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;TEXT_RESET:\r
+;      ; ENTRY POINT FROM RX_WAIT\r
+;      LDI     A,LOW(RAMEND)\r
+;      OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+;      CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+;      CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       LDS     A,PRINT_BUF+5\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     PRINT_BUF+5,A           ; SINCE WE SAVED ONLY 42 CHARS, NOT 48\r
+\r
+       MOV     A,SPACING\r
+       CPI     A,3+1\r
+       BRLO    TEXT_PRINT_SPACING\r
+       LDI     A,3\r
+TEXT_PRINT_SPACING:\r
+       SWAP    A\r
+       OR      TEXT_MASK,A             ; SAVE SPACING FOR DESCENDER PRINTING\r
+\r
+       SBR     FLAGS,1<<TEXT\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER PRINTING ?\r
+       BREQ    TEXT_PRINT_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,3                     ; COMPENSATE FOR ASCENDER + DESCENDER\r
+       BRLO    TEXT_PRINT_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS REMAINING AFTER DESCENDER,\r
+                                       ; EXCEPT FOR THE LAST ONE\r
+TEXT_PRINT_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+TEXT_PRINT_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       LDI     A,6                     ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       RCALL   WAIT_ADD_SPACING\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      STATUS,A\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+       CPI     A,'C'\r
+       BRNE    PAPER_CUT_CONT\r
+       RJMP    PAPER_CUT\r
+PAPER_CUT_CONT:\r
+       CPI     A,'J'\r
+       BREQ    IMAGE_SCALE\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+       CPI     A,'R'\r
+       BREQ    REVERSE_FEED\r
+       CPI     A,'T'\r
+       BREQ    TEXT_SCALE\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    FEED_SETUP_DONE         ; NO FEED, NO CHANGE TO ASCEND FLAG\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       DEC     A                       ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+FEED_SETUP_DONE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+REVERSE_FEED:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    REVERSE_FEED_DONE\r
+\r
+REVERSE_FEED_AGAIN:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+REVERSE_FEED_ENTRY:\r
+       MOV     CHAR_SAVE,A             ; THIS WILL BE READ BY INTERRUPT\r
+\r
+       SBR     FLAGS,1<<TEXT | 1<<IMAGE ; SETTING BOTH INDICATES REVERSE FEED\r
+REVERSE_FEED_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    REVERSE_FEED_WAIT\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    REVERSE_FEED_ENTRY      ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       SBRC    FLAGS,ASCEND            ; NEED AN EXTRA FEED FOR ASCENDERS ?\r
+REVERSE_FEED_DONE:\r
+       RJMP    TEXT_RECEIVE            ; NO, WE ARE DONE\r
+\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+\r
+       LDI     A,1                     ; REPEAT PROCESS WITH 1 EXTRA FEED\r
+       RJMP    REVERSE_FEED_AGAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_IMAGE,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+TEXT_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_TEXT,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+\r
+       OR      A,YL\r
+       OR      A,R0\r
+       BREQ    IMAGE_DONE_NO_ASCENDER  ; ABORT IF WIDTH OR LINES = 0\r
+                                       ; (WITH NO CHANGE TO ASCENDER STATUS)\r
+       LDI     A,1\r
+       SBRC    FLAGS,ASCEND\r
+       RCALL   WAIT_ADD_FEEDS          ; PERFORM THE LAST FEED IF NOT DONE YET\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER NEXT TIME ?\r
+       BREQ    IMAGE_DONE_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,1                     ; COMPENSATE FOR ASCENDER NEXT TIME\r
+       BRLO    IMAGE_DONE_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS EXCEPT FOR THE LAST ONE\r
+\r
+IMAGE_DONE_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+IMAGE_DONE_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       LDS     B,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RCALL   WAIT_ADD_FEEDS_ENTRY\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC ; 06apr03 tavrasm *2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC ; 06apr03 tavrasm *2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH ; 06apr03 tavrasm *2               ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     B,$21\r
+       MOV     R0,B\r
+       LDI     B,$10                   ; B:R0 = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,R0\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PAPER_CUT:\r
+       SBR     FLAGS,1<<CUT            ; SAY CUTTER MUST BE OPERATED\r
+\r
+PAPER_CUT_WAIT:\r
+       SBRC    FLAGS,CUT\r
+       RJMP    PAPER_CUT_WAIT          ; WAIT FOR COMMAND TO BE RECEIVED\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_SPACING:\r
+       MOV     A,SPACING\r
+\r
+WAIT_ADD_FEEDS:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+WAIT_ADD_FEEDS_ENTRY:\r
+       PUSH    A\r
+       ADD     A,FEEDS                 ; CAN WE ADD FEEDS YET?\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS_ENTRY\r
+\r
+       ADD     FEEDS,A                 ; SEND THE FEEDS ATOMICALLY\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    WAIT_ADD_FEEDS_ENTRY    ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT ; 06apr03 tavrasm *2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-11\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; 20  \r
+       .DB     $00,$18,$18,$18,$18,$18,$00,$18,$00,$00 ; 21 !\r
+       .DB     $00,$E7,$63,$C6,$00,$00,$00,$00,$00,$00 ; 22 "\r
+       .DB     $00,$66,$66,$FF,$66,$FF,$66,$66,$00,$00 ; 23 #\r
+       .DB     $18,$7E,$DB,$D8,$7E,$1B,$DB,$7E,$18,$00 ; 24 $\r
+       .DB     $00,$E3,$E6,$0C,$18,$30,$67,$C7,$00,$00 ; 25 %\r
+       .DB     $00,$78,$CC,$D8,$73,$DE,$CC,$7B,$00,$00 ; 26 &\r
+       .DB     $00,$3C,$0C,$18,$00,$00,$00,$00,$00,$00 ; 27 '\r
+       .DB     $00,$0C,$18,$30,$30,$30,$18,$0C,$00,$00 ; 28 (\r
+       .DB     $00,$30,$18,$0C,$0C,$0C,$18,$30,$00,$00 ; 29 )\r
+       .DB     $00,$18,$DB,$7E,$3C,$7E,$DB,$18,$00,$00 ; 2A *\r
+       .DB     $00,$00,$18,$18,$FF,$18,$18,$00,$00,$00 ; 2B +\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$0C,$18,$00 ; 2C ,\r
+       .DB     $00,$00,$00,$00,$FF,$00,$00,$00,$00,$00 ; 2D -\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$3C,$00,$00 ; 2E .\r
+       .DB     $00,$03,$06,$0C,$18,$30,$60,$C0,$00,$00 ; 2F /\r
+       .DB     $00,$7E,$C7,$CF,$DB,$F3,$E3,$7E,$00,$00 ; 30 0\r
+       .DB     $00,$0C,$1C,$3C,$0C,$0C,$0C,$0C,$00,$00 ; 31 1\r
+       .DB     $00,$7E,$C3,$03,$0E,$38,$60,$FF,$00,$00 ; 32 2\r
+       .DB     $00,$7E,$C3,$03,$3E,$03,$C3,$7E,$00,$00 ; 33 3\r
+       .DB     $00,$1C,$3C,$6C,$CC,$FF,$0C,$0C,$00,$00 ; 34 4\r
+       .DB     $00,$FF,$C0,$FE,$03,$03,$C3,$7E,$00,$00 ; 35 5\r
+       .DB     $00,$3E,$60,$C0,$FE,$C3,$C3,$7E,$00,$00 ; 36 6\r
+       .DB     $00,$FF,$03,$06,$0C,$18,$18,$18,$00,$00 ; 37 7\r
+       .DB     $00,$7E,$C3,$C3,$7E,$C3,$C3,$7E,$00,$00 ; 38 8\r
+       .DB     $00,$7E,$C3,$C3,$7F,$03,$06,$7C,$00,$00 ; 39 9\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$3C,$00,$00,$00 ; 3A :\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$0C,$18,$00,$00 ; 3B ;\r
+       .DB     $00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00 ; 3C <\r
+       .DB     $00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00 ; 3D =\r
+       .DB     $00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00 ; 3E >\r
+       .DB     $00,$7E,$C3,$03,$0E,$18,$00,$18,$00,$00 ; 3F ?\r
+       .DB     $00,$7E,$C3,$DB,$DB,$DF,$C0,$7C,$00,$00 ; 40 @\r
+       .DB     $00,$3C,$66,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 41 A\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C3,$C3,$FE,$00,$00 ; 42 B\r
+       .DB     $00,$7E,$C3,$C0,$C0,$C0,$C3,$7E,$00,$00 ; 43 C\r
+       .DB     $00,$FC,$C6,$C3,$C3,$C3,$C6,$FC,$00,$00 ; 44 D\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$FF,$00,$00 ; 45 E\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$C0,$00,$00 ; 46 F\r
+       .DB     $00,$7E,$C3,$C0,$C0,$CF,$C3,$7F,$00,$00 ; 47 G\r
+       .DB     $00,$C3,$C3,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 48 H\r
+       .DB     $00,$18,$18,$18,$18,$18,$18,$18,$00,$00 ; 49 I\r
+       .DB     $00,$03,$03,$03,$03,$03,$C3,$7E,$00,$00 ; 4A J\r
+       .DB     $00,$C3,$C6,$CC,$F8,$CC,$C6,$C3,$00,$00 ; 4B K\r
+       .DB     $00,$C0,$C0,$C0,$C0,$C0,$C0,$FF,$00,$00 ; 4C L\r
+       .DB     $00,$C3,$E7,$FF,$DB,$C3,$C3,$C3,$00,$00 ; 4D M\r
+       .DB     $00,$C3,$E3,$F3,$DB,$CF,$C7,$C3,$00,$00 ; 4E N\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 4F O\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C0,$C0,$C0,$00,$00 ; 50 P\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$CF,$7E,$03,$00 ; 51 Q\r
+       .DB     $00,$FE,$C3,$C3,$FE,$CC,$C6,$C3,$00,$00 ; 52 R\r
+       .DB     $00,$7E,$C3,$C0,$7E,$03,$C3,$7E,$00,$00 ; 53 S\r
+       .DB     $00,$FF,$18,$18,$18,$18,$18,$18,$00,$00 ; 54 T\r
+       .DB     $00,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 55 U\r
+       .DB     $00,$C3,$C3,$C3,$C3,$66,$3C,$18,$00,$00 ; 56 V\r
+       .DB     $00,$C3,$C3,$C3,$C3,$DB,$FF,$66,$00,$00 ; 57 W\r
+       .DB     $00,$C3,$66,$3C,$18,$3C,$66,$C3,$00,$00 ; 58 X\r
+       .DB     $00,$C3,$C3,$66,$3C,$18,$18,$18,$00,$00 ; 59 Y\r
+       .DB     $00,$FF,$06,$0C,$18,$30,$60,$FF,$00,$00 ; 5A Z\r
+       .DB     $00,$3C,$30,$30,$30,$30,$30,$3C,$00,$00 ; 5B [\r
+       .DB     $00,$C0,$60,$30,$18,$0C,$06,$03,$00,$00 ; 5C \\r
+       .DB     $00,$3C,$0C,$0C,$0C,$0C,$0C,$3C,$00,$00 ; 5D ]\r
+       .DB     $18,$3C,$66,$C3,$00,$00,$00,$00,$00,$00 ; 5E ^\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00 ; 5F _\r
+       .DB     $0C,$18,$1E,$00,$00,$00,$00,$00,$00,$00 ; 60 `\r
+       .DB     $00,$00,$00,$7E,$03,$7F,$C3,$7F,$00,$00 ; 61 a\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$FE,$00,$00 ; 62 b\r
+       .DB     $00,$00,$00,$7E,$C3,$C0,$C3,$7E,$00,$00 ; 63 c\r
+       .DB     $00,$03,$03,$7F,$C3,$C3,$C3,$7F,$00,$00 ; 64 d\r
+       .DB     $00,$00,$00,$7E,$C3,$FF,$C0,$7E,$00,$00 ; 65 e\r
+       .DB     $00,$1E,$33,$30,$FC,$30,$30,$30,$00,$00 ; 66 f\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$7E ; 67 g\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 68 h\r
+       .DB     $00,$18,$00,$18,$18,$18,$18,$18,$00,$00 ; 69 i\r
+       .DB     $00,$06,$00,$06,$06,$06,$06,$06,$06,$7C ; 6A j\r
+       .DB     $00,$C0,$C0,$C6,$CC,$F8,$CC,$C6,$00,$00 ; 6B k\r
+       .DB     $00,$30,$30,$30,$30,$30,$30,$1C,$00,$00 ; 6C l\r
+       .DB     $00,$00,$00,$FE,$DB,$DB,$DB,$DB,$00,$00 ; 6D m\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 6E n\r
+       .DB     $00,$00,$00,$7E,$C3,$C3,$C3,$7E,$00,$00 ; 6F o\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$FE,$C0,$C0 ; 70 p\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$03 ; 71 q\r
+       .DB     $00,$00,$00,$FE,$C3,$C0,$C0,$C0,$00,$00 ; 72 r\r
+       .DB     $00,$00,$00,$7E,$C0,$7E,$03,$7E,$00,$00 ; 73 s\r
+       .DB     $00,$18,$18,$7E,$18,$18,$18,$0E,$00,$00 ; 74 t\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$00,$00 ; 75 u\r
+       .DB     $00,$00,$00,$C3,$C3,$66,$3C,$18,$00,$00 ; 76 v\r
+       .DB     $00,$00,$00,$C3,$C3,$DB,$FF,$66,$00,$00 ; 77 w\r
+       .DB     $00,$00,$00,$C3,$66,$3C,$66,$C3,$00,$00 ; 78 x\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$03,$7E ; 79 y\r
+       .DB     $00,$00,$00,$FF,$0C,$18,$30,$FF,$00,$00 ; 7A z\r
+       .DB     $00,$0E,$18,$18,$70,$18,$18,$0E,$00,$00 ; 7B {\r
+       .DB     $00,$18,$18,$18,$00,$18,$18,$18,$00,$00 ; 7C |\r
+       .DB     $00,$70,$18,$18,$0E,$18,$18,$70,$00,$00 ; 7D }\r
+       .DB     $00,$76,$DC,$00,$00,$00,$00,$00,$00,$00 ; 7E ~\r
+       .DB     $00,$00,$00,$18,$3C,$66,$C3,$FF,$00,$00 ; 7F \7f\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+       ; PAPER CUTTER DOESN'T WORK WITH BODLEVEL = 0 FOR 4.0V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4105                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/mt102v2.asm.orig b/src/avr/mt102v2.asm.orig
new file mode 100644 (file)
index 0000000..84db6f9
--- /dev/null
@@ -0,0 +1,1831 @@
+;      MT102V2.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.INCLUDE "4433DEF.INC"\r
+.INCLUDE "API.INC"\r
+;.INCLUDE "TER.INC"\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_ADDRESS     =5              ; MY ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 US = APPROX 5.0 MS\r
+.EQU   API_RATE_SLOW   =$5F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$03            ; DIVISOR FOR 115200 BPS\r
+;.EQU  TER_RATE        =$2F            ; DIVISOR FOR 9600 BPS\r
+;.EQU  TER_RATE        =$17            ; DIVISOR FOR 19200 BPS\r
+;.EQU  TER_RATE        =$0B            ; DIVISOR FOR 38400 BPS\r
+.EQU   TER_RATE        =$03            ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.EQU   DEFINABLE_CHARS =32             ; REALLY ONLY 22\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+.EQU   WIDTH_IMAGE     =48             ; 384 / 8 = 48 IMAGE BYTES ACROSS\r
+.EQU   WIDTH_CHARS     =42             ; 384 / 9 = 42 TEXT CHARACTERS ACROSS\r
+.EQU   WIDTH_FLAGS     =6              ; (42+7) / 8 = 6 WIDTH FLAG BYTES\r
+\r
+.EQU   TIME_STEP       =72             ; 72 * 25 US = APPROX 1.8 MS\r
+.EQU   TIME_CLOCK      =2              ; 2 * 25 US = APPROX 50 US\r
+\r
+.EQU   TIME_STROBE     =24             ; 24 * 25 US = APPROX 600 US\r
+.EQU   TIME_HOLD_PWM   =1              ; DELAY UNIT FOR ABOVE = APPROX 25 US\r
+\r
+.EQU   TIME_PAPER_OUT  =12             ; 12 * 25 US = APPROX 300 US\r
+\r
+.EQU   TIME_DEBOUNCE0  =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+;.EQU  TIME_DEBOUNCE1  =1              ; 10 * 100 US = APPROX 1.0 MS\r
+.EQU   TIME_SHORTING   =1000           ; 1000 * 100 US = APPROX 100.0 MS\r
+.EQU   TIME_CUTTER     =20000          ; 20000 * 100 US = APPROX 2.0 S\r
+.EQU   TIME_SAMPLE     =4              ; DELAY UNIT FOR ABOVE = APPROX 100 US\r
+\r
+;.EQU  FEED_INITIAL    =2              ; LINES WASTED STARTING MOTOR\r
+.EQU   FEED_SPACING    =3              ; LINES TO FEED BETWEEN TEXT LINES\r
+.EQU   FEED_TAKE_UP    =120            ; LINES TO FEED WHEN PAPER INSERTED\r
+\r
+.DEF   RX_PTR          =R01\r
+.DEF   RX_COUNT        =R02\r
+.DEF   TX_PTR          =R03\r
+.DEF   TX_COUNT        =R04\r
+.DEF   API_STATE       =R05\r
+.DEF   API_REMAIN      =R06\r
+.DEF   API_WATCHDOG    =R07\r
+.DEF   CHAR_SAVE       =R08\r
+.DEF   BUF_PTR         =R09            ; BYTES NOT YET COMMITTED FOR PRINT\r
+.DEF   MOTOR_STATE     =R10            ; TIMING PULSE COUNT\r
+.DEF   FEEDS           =R11            ; INTERNAL FEED COUNT\r
+.DEF   SPACING         =R12            ; SET WITH ESC A\r
+.DEF   TEXT_MASK       =R13            ; MASK FOR CURRENT DOT LINE\r
+.DEF   STATUS          =R14\r
+.DEF   SR              =R15\r
+\r
+.DEF   A               =R16            ; GLOBAL REGISTERS\r
+.DEF   B               =R17\r
+.DEF   D               =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R20\r
+.DEF   G               =R21\r
+.DEF   H               =R22\r
+.DEF   FLAGS           =R23\r
+\r
+.DEF   DOTS_ON_LO      =R24\r
+.DEF   DOTS_ON_HI      =R25            ; COUNT OF DOTS ON FOR LINE\r
+\r
+.EQU   TX_SIZE         =1\r
+.EQU   RX_SIZE         =$40\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+PRINT_BUF:     .BYTE   WIDTH_IMAGE\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+SCALE_TEXT:    .BYTE   1\r
+SCALE_IMAGE:   .BYTE   1\r
+NOTIFY_COUNT:  .BYTE   1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               .ESEG\r
+\r
+               .DB     0,0             ; DON'T USE ADDRESS 0\r
+EE_CRC:                .DB     0,0\r
+EE_LENGTH:     .DB     0,0\r
+EE_COUNT:      .DB     0,0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; FLAGS DEFINITIONS\r
+.EQU   NARROW          =0              ; SET IF SAVING NARROW CHARACTERS\r
+.EQU   WHITE           =1              ; SET IF LINE IS WHITE SPACE SO FAR\r
+.EQU   IMAGE           =2              ; SET BY FG FOR BG TO PRINT IMAGE LINE\r
+.EQU   TEXT            =3              ; SET BY FG FOR BG TO PRINT TEXT LINE\r
+.EQU   CUT             =4              ; SET BY FG FOR BG TO OPERATE CUTTER\r
+.EQU   RXFULL          =5              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =6              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+.EQU   ASCEND          =7              ; SET BY FG, ASCENDER ALLOWED NEXT LINE\r
+;.EQU  BOMB            =7              ; SET BY BG FOR FG TO BOMB OUT / RESET\r
+\r
+; STATUS DEFINITIONS\r
+.EQU   PAPER           =0              ; SET BY BG TO DETECT CHANGE IN STATUS\r
+.EQU   MOTOR           =1              ; SET BY BG TO NOTIFY MOTOR RUN STATUS\r
+.EQU   CUTTER          =2              ; SET BY BG TO NOTIFY CUTTER RUN STATUS\r
+.EQU   HEADUP          =3              ; SET BY BG TO NOTIFY HEAD UP STATUS\r
+.EQU   NOTIFY          =4              ; SET BY BG FOR FG TO REPORT STATUS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE PROCESSING ESC . CMD\r
+; UPPER 2 BITS ARE USED TO COUNT 4 * 256 * 25 US = 25.6 MS BETWEEN PAPER TESTS\r
+\r
+; NARROW\r
+\r
+; FLAG SET BY FOREGROUND WHEN COMPRESSED COMMAND RECEIVED.\r
+; FLAG RESET BY FOREGROUND WHEN DOUBLE-WIDTH COMMAND RECEIVED.\r
+\r
+; WHITE\r
+\r
+; FLAG SET BY FOREGROUND AT START OF PROCESSING FOR TEXT OR IMAGE LINE.\r
+; FLAG RESET BY FOREGROUND IF NON-BLANK BYTE ENCOUNTERED DURING PROCESSING.\r
+; IF FLAG STILL SET WHEN READY TO PRINT, FEEDING INITIATED INSTEAD.\r
+\r
+; IMAGE\r
+\r
+; FLAG SET BY FOREGROUND IF BUFFER CONTAINS IMAGE DATA, RESET IF TEXT DATA\r
+; FLAG SAMPLED AT PRINTABLE AREA TO INSTALL FIRST PRINT INTERRUPT HANDLER\r
+; FLAG MUST BE SET UP BEFORE COMMITTING DATA FOR PRINT.\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF1ADDR\r
+       RJMP    T1_OVERFLOW     ; TIMER1 OVERFLOW HANDLER\r
+       RJMP    T0_OVERFLOW     ; TIMER0 OVERFLOW HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       INT_HANDLERS            ; API BUS\r
+\r
+;IDENTIFY_MESS:\r
+;      .DB      17,$1B,'I','M','T','1','0','2'\r
+;      .DB     'A',' ','P','R','I','N','T','E'\r
+;      .DB     'R',$0D\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 OVERFLOW INTERRUPT HANDLER\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; SAVE FLAGS\r
+\r
+       PUSH    G\r
+       PUSH    H                       ; SAVE INTERRUPT SERVICE VECTOR\r
+\r
+       LDI     G,-TIME_STEP\r
+       OUT     TCNT0,G                 ; DEFAULT DELAY TO NEXT STEP INTERRUPT\r
+\r
+       WDR                             ; FEED WATCHDOG\r
+       RET                             ; VECTOR TO INTERRUPT SERVICE ROUTINE\r
+\r
+T0_DONE:\r
+       POP     H\r
+       POP     G                       ; RETRIEVE INTERRUPT SERVICE VECTOR\r
+\r
+T0_RET:\r
+       OUT     SREG,SR                 ; RESTORE FLAGS\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_FEED:\r
+       DEC     FEEDS\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT NEXT MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_ODD             ; OUTPUT NEXT MOTOR STATE\r
+\r
+T0_MAIN:\r
+       RCALL   T0_DONE\r
+\r
+T0_MAIN_ENTRY:\r
+       ;MOV    D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+       TST     FEEDS\r
+       BRNE    T0_PRINT                ; WE HAVE SOMETHING TO PRINT\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BREQ    T0_IDLE                 ; THERE IS NOTHING TO PRINT\r
+\r
+T0_PRINT:\r
+       SBRC    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_PRINT_GO             ; YES, START CLOCKING IMMEDIATELY\r
+\r
+       LDI     D,1<<MOTOR | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY MOTOR HAS BEEN STARTED, NOTIFY\r
+\r
+       RCALL   T0_STEP_SAME            ; OUTPUT SAME MOTOR STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       RCALL   T0_DONE                 ; HOLD FOR STEP TIME PRIOR TO STARTING\r
+\r
+T0_PRINT_GO:\r
+       TST     FEEDS\r
+       BRNE    T0_FEED                 ; FEED IF FEEDS WAITING\r
+\r
+       SBRS    FLAGS,TEXT\r
+       RJMP    T0_PRINT_IMAGE          ; PRINT IF GRAPHICS WAITING\r
+\r
+       SBRS    FLAGS,IMAGE\r
+       RJMP    T0_PRINT_TEXT           ; PRINT IF TEXT WAITING\r
+\r
+       ; REVERSE FEED IF TEXT, IMAGE BOTH SET\r
+       MOV     E,CHAR_SAVE             ; CONVENIENT VARIABLE FOR REVERSE COUNT\r
+\r
+       CBR     FLAGS,1<<TEXT | 1<<IMAGE ; SAY WE HAVE NOW FREED UP CHAR_SAVE\r
+\r
+T0_REVERSE:\r
+       RCALL   T0_STEP_ODD             ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN            ; OUTPUT PREVIOUS MOTOR STATE\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_REVERSE\r
+\r
+       RJMP    T0_MAIN_ENTRY\r
+\r
+T0_IDLE:\r
+       SBRS    STATUS,MOTOR            ; MOTOR RUNNING?\r
+       RJMP    T0_STOPPED              ; NO, ALREADY STOPPED, CHECK CUTTER\r
+\r
+       RCALL   T0_DONE                 ; DELAY BEFORE STOPPING\r
+\r
+       LDI     D,~(1<<MOTOR)\r
+       AND     STATUS,D                ; SAY MOTOR HAS BEEN STOPPED\r
+       LDI     D,1<<NOTIFY\r
+       SBRS    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       OR      STATUS,D                ; NO, SAY WE MUST REPORT MOTOR STATUS\r
+\r
+       LDI     D,$00\r
+       OUT     PORTD,D                 ; OUTPUT IDLE MOTOR STATE\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+       RJMP    T0_MAIN\r
+\r
+T0_STOPPED:\r
+       SBRC    FLAGS,CUT               ; CUTTER REQUESTED?\r
+       RJMP    T0_CUT                  ; YES, GO AND OPERATE CUTTER\r
+\r
+       LDI     D,0\r
+       OUT     TCNT0,D                 ; FULL PERIOD = 256 * 25 US = 6.4 MS\r
+\r
+       LDI     D,1<<6\r
+       ADD     STATUS,D\r
+       BRCC    T0_MAIN                 ; COUNT 4 PERIODS, ENTER EVERY 25.6 MS\r
+\r
+;      TST     ABORT_COUNT             ; ESC SEQUENCE CURRENTLY ACTIVE ?\r
+;      BREQ    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBIC    PORTC,4                 ; MOTOR ON?\r
+;      RJMP    T0_PAPER                ; YES, DO NOT START COUNTING DOWN YET\r
+;\r
+;      DEC     ABORT_COUNT             ; TIMEOUT FOR ESC SEQUENCE EXPIRED ?\r
+;      BRNE    T0_PAPER                ; NO, GO AND TEST PAPER\r
+;\r
+;      SBR     FLAGS,1<<BOMB           ; TELL FOREGROUND TO BOMB OUT / RESET\r
+\r
+T0_PAPER:\r
+       CBI     PORTD,2                 ; D2 = LOW TO LIGHT LED\r
+       CBI     DDRC,3                  ; C3 = TRI-STATE TO SAMPLE LED STATE\r
+\r
+       CBI     DDRC,2                  ; C2 = TRISTATE\r
+       SBI     PORTC,2                 ; C2 = PULL UP FOR BC548 DRIVING G\r
+\r
+       LDI     D,-144                  ; TEST PAPER IN 144 * 25 US = 3.6 MS\r
+       SBRS    STATUS,PAPER\r
+       LDI     D,-128                  ; TEST PAPER IN 128 * 25 US = 3.2 MS\r
+       OUT     TCNT0,D\r
+\r
+       RCALL   T0_DONE\r
+\r
+       LDS     D,NOTIFY_COUNT\r
+       INC     D\r
+       STS     NOTIFY_COUNT,D\r
+       BRNE    T0_PAPER_CONT           ; TESTED PAPER STATUS 256 TIMES ?\r
+\r
+       ; TER MODE ONLY %\r
+       ;SBR    FLAGS,1<<RXSEND         ; SAY WE MUST SEND REDUNDANT XON/XOFF\r
+       ;SBI    UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       ; %\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SEND REDUNDANT STATUS NOTIFICATION\r
+\r
+T0_PAPER_CONT:\r
+       IN      E,PINC                  ; SAMPLE C3 STATE\r
+\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRC,3                  ; PRINTER DATA-IN = BACK TO OUTPUT\r
+\r
+       CBI     PORTC,2                 ; C2 = TRISTATE\r
+       SBI     DDRC,2                  ; C2 = LOW FOR BC548 DRIVING G\r
+\r
+       SBRC    E,3\r
+       RJMP    T0_PAPER_IN             ; C3 = 1, LIGHT RECEIVED, PAPER IN\r
+       ;RJMP   T0_PAPER_OUT            ; C3 = 0, NO LIGHT RECEIVED, PAPER OUT\r
+\r
+;T0_PAPER_OUT:\r
+       ;SBRS   STATUS,PAPER\r
+       ;RJMP   T0_MAIN\r
+\r
+       ;LDI    D,FEED_INITIAL          ; STOP, UNLESS WE HAVE TEXT/IMAGE,\r
+       ;SBIC   PORTC,4                 ; ONLY IF WE WERE PRINTING,\r
+       ;MOV    FEEDS,D                 ; KILLING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       OR      STATUS,D                ; SAY WE MUST SEND PAPER STATUS TO HOST\r
+       LDI     D,~(1<<PAPER)\r
+       AND     STATUS,D                ; SAY PAPER IS OUT\r
+       RJMP    T0_HEAD\r
+\r
+T0_PAPER_IN:\r
+       SBRC    STATUS,PAPER            ; IF PAPER WAS IN,\r
+       RJMP    T0_HEAD                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<PAPER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY PAPER IS IN, MUST SEND\r
+       ;RJMP   T0_HEAD\r
+\r
+T0_HEAD:\r
+       SBRC    E,2\r
+       RJMP    T0_HEAD_UP\r
+       ;RJMP   T0_HEAD_DOWN\r
+\r
+;T0_HEAD_DOWN:\r
+       SBRS    STATUS,HEADUP           ; IF HEAD WAS DOWN,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+\r
+       LDI     D,FEED_TAKE_UP          ; FEED PAPER PAST PRINT POSITION\r
+       SBRC    STATUS,PAPER            ; (ONLY IF WE DETECTED PAPER PRESENT)\r
+       MOV     FEEDS,D                 ; REPLACING ANY EXISTING FEEDS\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST NOTIFY HOST\r
+       LDI     D,~(1<<HEADUP)\r
+       AND     STATUS,D                ; SAY HEAD IS DOWN\r
+       RJMP    T0_MAIN\r
+\r
+T0_HEAD_UP:\r
+       SBRC    STATUS,HEADUP           ; IF HEAD WAS UP,\r
+       RJMP    T0_MAIN                 ; THERE HAS BEEN NO CHANGE\r
+       LDI     D,1<<HEADUP | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY HEAD IS UP, AND NOTIFY HOST\r
+       RJMP    T0_MAIN\r
+\r
+T0_CUT:\r
+       CBR     FLAGS,1<<CUT            ; TELL FOREGROUND TO CONTINUE\r
+       LDI     D,1<<CUTTER | 1<<NOTIFY\r
+       OR      STATUS,D                ; SAY CUTTER HAS BEEN STARTED, NOTIFY\r
+\r
+;T0_REPEAT_ENTRY:\r
+       CBI     PORTC,1                 ; OUTPUT FORWARD CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_CUTTER)\r
+       LDI     XH,HIGH(TIME_CUTTER)    ; IN CASE SWITCH FAILS TO OPERATE\r
+\r
+T0_CUT_LOOP0:\r
+       LDI     E,LOW(TIME_DEBOUNCE0)\r
+       LDI     F,HIGH(TIME_DEBOUNCE0)\r
+\r
+T0_CUT_LOOP1:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIC    PINC,0\r
+       RJMP    T0_CUT_LOOP0            ; WAIT FOR SWITCH TO CLOSE\r
+\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    T0_CUT_LOOP1            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_LOOP2:\r
+;      LDI     E,TIME_DEBOUNCE1\r
+\r
+T0_CUT_LOOP3:\r
+       SBIW    XL,1\r
+       BREQ    T0_CUT_DONE\r
+\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAMPLE SWITCH EVERY 0.1 MS\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIS    PINC,0                  ; WAIT FOR SWITCH TO OPEN AGAIN\r
+       RJMP    T0_CUT_LOOP2\r
+\r
+;      DEC     E\r
+;      BRNE    T0_CUT_LOOP3            ; CONTINUOUSLY FOR DEBOUNCE TIME\r
+\r
+T0_CUT_DONE:\r
+       SBI     PORTC,1                 ; OUTPUT IDLE CUTTER STATE\r
+\r
+       LDI     XL,LOW(TIME_SHORTING)\r
+       LDI     XH,HIGH(TIME_SHORTING)\r
+\r
+T0_SHORT:\r
+       LDI     D,-TIME_SAMPLE\r
+       OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_SHORTING\r
+\r
+       RCALL   T0_DONE\r
+\r
+       SBIW    XL,1\r
+       BRNE    T0_SHORT\r
+\r
+;      LDI     XL,LOW(TIME_CUTTER)\r
+;      LDI     XH,HIGH(TIME_CUTTER)\r
+;\r
+;T0_REPEAT_LOOP:\r
+;      LDI     D,-TIME_SAMPLE\r
+;      OUT     TCNT0,D                 ; SAME DELAY UNITS FOR TIME_CUTTER\r
+;\r
+;      RCALL   T0_DONE\r
+;\r
+;      SBIW    XL,1\r
+;      BRNE    T0_REPEAT_LOOP\r
+;      RJMP    T0_REPEAT_ENTRY\r
+\r
+       LDI     D,~(1<<CUTTER)\r
+       AND     STATUS,D                ; SAY CUTTER HAS BEEN STOPPED\r
+\r
+       MOV     D,FEEDS\r
+       ;CPI    D,1+FEED_INITIAL\r
+       ;BRSH   T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+       TST     D\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       MOV     D,FLAGS\r
+       ANDI    D,(1<<TEXT) | (1<<IMAGE)\r
+       BRNE    T0_CUT_MAIN             ; WE HAVE SOMETHING TO PRINT, NO NOTIFY\r
+\r
+       LDI     D,1<<NOTIFY\r
+       OR      STATUS,D                ; SAY WE MUST REPORT CUTTER STATUS\r
+\r
+T0_CUT_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_STEP_ODD:\r
+       LDI     D,$A0 ;$50\r
+       RJMP    T0_STEP_NEXT\r
+T0_STEP_EVEN:\r
+       LDI     D,$50 ;$A0\r
+T0_STEP_NEXT:\r
+       EOR     MOTOR_STATE,D           ; GENERATE NEXT MOTOR STATE\r
+T0_STEP_SAME:\r
+       OUT     PORTD,MOTOR_STATE       ; OUTPUT CURRENT MOTOR STATE\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_TEXT:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       ;LDI    D,0\r
+       ;MOV    TEXT_MASK,D             ; SET UP MASK FOR UPPER DOT LINE\r
+       LSL     TEXT_MASK\r
+       LSL     TEXT_MASK               ; SHIFT SPACING INTO UPPER 2 BITS\r
+       LDI     D,$C0\r
+       AND     TEXT_MASK,D             ; CLEAR REMAINING BITS\r
+\r
+       SBRS    FLAGS,ASCEND            ; READY TO PRINT IF ASCENDER ALLOWED\r
+       INC     TEXT_MASK               ; ASCENDER NOT ALLOWED, SKIP 1 SLICE\r
+\r
+T0_PRINT_TEXT_SETUP:\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; CHARACTER INDEX FOR DOT LINE\r
+\r
+T0_PRINT_TEXT_SETUP_LINE:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,E\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       MOV     G,E\r
+       ANDI    G,7\r
+       INC     G                       ; F = BUF POSITION MODULO 8, BIT 1-8\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+T0_PRINT_TEXT_SETUP_FLAG:\r
+       LSR     D                       ; AT LEAST ONCE\r
+       DEC     G\r
+       BRNE    T0_PRINT_TEXT_SETUP_FLAG\r
+\r
+       BRCC    T0_PRINT_TEXT_SETUP_CONT\r
+       LSL     F                       ; WIDE CHARACTER, DOUBLE SCALE FACTOR\r
+       SUBI    F,-$81                  ; COMPENSATE FOR -1, BIT FLAG FOR WIDE\r
+\r
+T0_PRINT_TEXT_SETUP_CONT:\r
+       ;RCALL  LOOKUP_CHAR             ; GET D = HORIZONTAL SLICE OF CHAR\r
+LOOKUP_CHAR:\r
+       MOV     ZL,E\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; D = ASCII CHARACTER\r
+\r
+       CPI     D,DEFINABLE_CHARS\r
+       BRLO    LOOKUP_EEPROM\r
+\r
+       MOV     ZL,D\r
+       CLR     ZH\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 2\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 4\r
+       ;LSL    ZL\r
+       ;ROL    ZH                      ; Z = ASCII CHARACTER * 8\r
+       ;SUB    ZL,D\r
+       ;LDI    D,0\r
+       ;SBC    ZH,D                    ; Z = ASCII CHARACTER * 7\r
+       ADD     ZL,D\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 5\r
+       LSL     ZL\r
+       ROL     ZH                      ; Z = ASCII CHARACTER * 10\r
+\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK\r
+       LDI     D,0\r
+       ADC     ZH,D                    ; Z = ASCII CHARACTER * 10 + INDEX\r
+\r
+       LDI     D,LOW(CHARACTER_SET*2-$20*10)\r
+       ADD     ZL,D\r
+       LDI     D,HIGH(CHARACTER_SET*2-$20*10)\r
+       ADC     ZH,D                    ; Z -> CHARACTER SET SLICE IN FLASH\r
+\r
+       MOV     H,R0\r
+       LPM                             ; R0 = CORRECT HORIZONTAL SLICE OF CHAR\r
+       MOV     D,R0\r
+       MOV     R0,H\r
+       RJMP    LOOKUP_CHAR_DONE ;RET\r
+\r
+LOOKUP_EEPROM:\r
+       MOV     ZL,D\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 2\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 4\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 5\r
+       LSL     ZL                      ; ZL = CHARACTER DEFINITION * 10\r
+       ADD     ZL,D                    ; ZL = CHARACTER DEFINITION * 11\r
+\r
+       SUBI    ZL,-(EE_COUNT*2+2) ;+3) ; PAST CRC, COUNT, CHARACTER CODE\r
+       MOV     D,TEXT_MASK\r
+       ANDI    D,$0F\r
+       ADD     ZL,D ;TEXT_MASK         ; ZL = BASE + CHAR * 11 + SLICE INDEX\r
+\r
+LOOKUP_EEPROM_WAIT:\r
+       SBIC    EECR,EEWE\r
+       RJMP    LOOKUP_EEPROM_WAIT      ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      D,EEDR                  ; GET LATCHED DATA BYTE\r
+LOOKUP_CHAR_DONE:\r
+       ;RET\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; F*1 PIXELS PADDING FROM D = 0\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       SBRC    F,7\r
+       LDI     G,-TIME_CLOCK\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       SBRC    F,7\r
+       INC     E\r
+       CPI     E,WIDTH_CHARS           ; GONE PAST LAST CHARACTER FOR LINE?\r
+       ;BRLO   T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+       BRSH    T0_PRINT_TEXT_SETUP_DONE\r
+       RJMP    T0_PRINT_TEXT_SETUP_LINE ; REPEAT UNLESS ALL CHARACTERS DONE\r
+T0_PRINT_TEXT_SETUP_DONE:\r
+\r
+       LDI     D,0\r
+       LDI     F,6\r
+       LDI     H,1\r
+       RCALL   SETUP_SLICE_ENTRY       ; 6 PIXELS PADDING FROM D = 0\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_PRINT_TEXT_MORE_TEST\r
+       INC     D\r
+T0_PRINT_TEXT_MORE_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRLO    T0_PRINT_TEXT_MORE\r
+\r
+       CBR     FLAGS,1<<TEXT           ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+T0_PRINT_TEXT_MORE:\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE 42*TIME_CLOCK\r
+       ; FOR PRINTING TEXT - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE\r
+\r
+       ;LDI    D,-TIME_CLOCK*WIDTH_CHARS-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDS     F,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+T0_PRINT_TEXT_STEP_ENTRY:\r
+       SBI     PORTD,3                 ; PRINTER STROBE = HIGH\r
+       CBI     PORTD,3                 ; PRINTER STROBE = LOW\r
+\r
+T0_PRINT_TEXT_STEP_LOOP:\r
+       RCALL   T0_DONE\r
+\r
+       RCALL   T0_STEP_EVEN\r
+\r
+       LDI     D,$07\r
+       OUT     PORTB,D                 ; APPLY ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_DONE\r
+\r
+       MOV     E,DOTS_ON_LO\r
+       MOV     D,DOTS_ON_HI\r
+       LSR     D\r
+       ROR     E\r
+       LSR     D\r
+       ROR     E                       ; MAXIMUM 384/4 * 25 US = 2.4 MS\r
+       SUBI    E,-TIME_STROBE\r
+\r
+       MOV     D,MOTOR_STATE           ; SAVE CURRENT MOTOR STATE\r
+\r
+T0_HOLD:\r
+       RCALL   T0_STEP_NEXT            ; PULSE WIDTH MODULATE CURRENT STATE\r
+\r
+       LDI     G,-TIME_HOLD_PWM\r
+       OUT     TCNT0,G\r
+\r
+       RCALL   T0_DONE\r
+\r
+       DEC     E\r
+       BRNE    T0_HOLD\r
+\r
+       MOV     MOTOR_STATE,D           ; RESTORE ORIGINAL MOTOR STATE\r
+\r
+       LDI     D,$00\r
+       OUT     PORTB,D                 ; REMOVE ALL PRINT HEAD OUTPUT ENABLES\r
+\r
+       RCALL   T0_STEP_ODD\r
+\r
+       SUBI    F,$10                   ; FOR (F+$10) >> 4 ITERATIONS\r
+       BRSH    T0_PRINT_TEXT_STEP_LOOP ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       MOV     D,TEXT_MASK\r
+       CPI     D,$C0\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+       CPI     D,$80\r
+       BRSH    T0_MAIN_TEST\r
+       INC     D\r
+T0_MAIN_TEST:\r
+       ANDI    D,$0F\r
+       CPI     D,9 ;6\r
+       BRSH    GO_T0_MAIN\r
+\r
+       INC     TEXT_MASK               ; UPDATE MASK FOR NEXT LOWER DOT LINE\r
+       RJMP    T0_PRINT_TEXT_SETUP     ; REPEAT UNLESS ALL DOT LINES DONE\r
+\r
+GO_T0_MAIN:\r
+       RJMP    T0_MAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+T0_PRINT_IMAGE:\r
+       LDI     D,-TIME_CLOCK/2\r
+       OUT     TCNT0,D                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       LDI     XL,LOW(384)\r
+       LDI     XH,HIGH(384)            ; COUNT OF DOTS REMAINING\r
+       LDI     DOTS_ON_LO,0\r
+       LDI     DOTS_ON_HI,0            ; COUNT OF DOTS ON FOR LINE\r
+\r
+       LDI     E,0                     ; BYTE INDEX FOR DOT LINE\r
+\r
+T0_PRINT_IMAGE_SETUP_LINE:\r
+       PUSH    ZL\r
+\r
+       MOV     ZL,E\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       LD      D,Z                     ; ZL = IMAGE BYTE\r
+\r
+       POP     ZL\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       ANDI    F,$0F                   ; EXTRACT HORIZONTAL SCALE FACTOR-1\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       RCALL   SETUP_SLICE             ; F*8 PIXELS DATA FROM D\r
+\r
+       RCALL   T0_DONE                 ; BREAK TO ALLOW COMMS TRAFFIC\r
+\r
+       LDI     G,-TIME_CLOCK/2\r
+       OUT     TCNT0,G                 ; SHORT DELAY TO NEXT CLOCKING INT\r
+\r
+       INC     E\r
+       CPI     E,WIDTH_IMAGE           ; GONE PAST LAST BYTE FOR LINE?\r
+       BRLO    T0_PRINT_IMAGE_SETUP_LINE ; REPEAT UNLESS ALL BYTES DONE\r
+\r
+       CBR     FLAGS,1<<IMAGE          ; SAY WE HAVE FINISHED WITH THE BUFFER\r
+\r
+       ; SLIGHTLY BODGY, WE WILL NOW USE TIME_CLOCK*48\r
+       ; FOR PRINTING IMAGE - IT IS VERY CLOSE TO TIME_STEP\r
+\r
+       ;RCALL  T0_DONE                 ; SHORT DELAY AFTER LAST CLOCKING INT\r
+\r
+       ;LDI    D,TIME_CLOCK*WIDTH_IMAGE-TIME_STEP\r
+       ;OUT    TCNT0,D                 ; LONGER DELAY TO UPCOMING STEP INT\r
+\r
+       LDI     D,-1\r
+       MOV     TEXT_MASK,D             ; PRETEND THIS IS LAST DOT LINE OF TEXT\r
+\r
+       LDS     F,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RJMP    T0_PRINT_TEXT_STEP_ENTRY\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SETUP_SLICE:                           ; SEND D = 8 HORIZONTAL BITS\r
+       LDI     H,8\r
+\r
+SETUP_SLICE_ENTRY:\r
+       TST     XL\r
+       BRNE    SETUP_SLICE_LOOP\r
+       TST     XH                      ; ANY PIXELS REMAINING FOR LINE?\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+SETUP_SLICE_LOOP:\r
+       LSL     D\r
+       BRCC    SETUP_PIXEL_LIGHT\r
+\r
+       SBI     PORTC,3                 ; PRINTER DATA-IN = HIGH\r
+\r
+SETUP_PIXEL_LIGHT:\r
+       MOV     G,F\r
+       ANDI    G,$7F                   ; REMOVE BIT FLAG INDICATING WIDE\r
+\r
+SETUP_PIXEL_LOOP:\r
+       SBI     PORTC,5                 ; PRINTER CLOCK = HIGH\r
+\r
+       SBIC    PORTC,3                 ; IF CURRENT PIXEL IS DARK,\r
+       ADIW    DOTS_ON_LO,1            ; INCREASE COUNT OF DOTS ON FOR LINE\r
+\r
+       SBIW    XL,1                    ; DECREASE COUNT OF DOTS REMAINING\r
+\r
+       CBI     PORTC,5                 ; PRINTER CLOCK = LOW\r
+\r
+       BREQ    SETUP_SLICE_DONE        ; SKIP CLOCKING OUTSIDE PRINTABLE AREA\r
+\r
+       SUBI    G,1                     ; FOR G+1 ITERATIONS\r
+       BRSH    SETUP_PIXEL_LOOP        ; APPLY HORIZONTAL SCALE FACTOR\r
+\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+\r
+       DEC     H                       ; NEXT PIXEL FOR CHARACTER\r
+       BRNE    SETUP_SLICE_LOOP        ; REPEAT UNLESS ALL PIXELS DONE\r
+\r
+SETUP_SLICE_DONE:\r
+       CBI     PORTC,3                 ; PRINTER DATA-IN = LOW\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 1 OVERFLOW INTERRUPT HANDLER\r
+\r
+T1_OVERFLOW:\r
+       ; BREAK DETECTED, ASSUME WE ARE ABOUT TO TURN OFF\r
+       ; WE WILL NOW ENTER POWER DOWN MODE TO AVOID EEPROM CORRUPTION\r
+\r
+       LDI     D,$1F                   ; WATCHDOG TURN OFF ENABLE = 1\r
+       OUT     WDTCR,D\r
+       LDI     D,$17                   ; WATCHDOG ENABLE = 0\r
+       OUT     WDTCR,D\r
+\r
+       LDI     D,$30\r
+       OUT     MCUCR,D                 ; SE=1 SM=1 FOR POWER DOWN MODE\r
+       SLEEP                           ; WE WILL NEVER WAKE UP\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR API BUS\r
+\r
+RX_WAIT:\r
+;      SBRC    FLAGS,BOMB\r
+;      RJMP    TEXT_RESET\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; SET VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$80\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 1 OVERFLOW PENDING\r
+       LDI     A,$82\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0, 1 OVERFLOW INTERRUPTS\r
+\r
+RX_WAIT_LOOP:\r
+       ; CURRENTLY DONE BY INTERRUPT, WE COULD PUT IT HERE\r
+       ;WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    RX_WAIT_CONT\r
+\r
+       LDI     A,HIGH(-$100)\r
+       OUT     TCNT1H,A                ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+       LDI     A,LOW(-$100)\r
+       OUT     TCNT1L,A\r
+\r
+RX_WAIT_CONT:\r
+       SBRS    STATUS,NOTIFY\r
+       RJMP    RX_WAIT_TEST\r
+\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE ;TX_SIZE-2\r
+       BRSH    RX_WAIT_TEST\r
+\r
+       LDI     A,0\r
+       STS     NOTIFY_COUNT,A          ; 6.5536 SECONDS TO NEXT NOTIFICATION\r
+\r
+       LDI     A,~(1<<NOTIFY)\r
+       AND     STATUS,A                ; SAY WE HAVE SENT THIS NOTIFICATION\r
+\r
+       ;LDI    A,$1B\r
+       ;RCALL  TX_CHAR\r
+       ;LDI    A,'P'\r
+       ;RCALL  TX_CHAR\r
+       MOV     A,STATUS\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    RX_WAIT_SEND\r
+       SUBI    A,-7\r
+RX_WAIT_SEND:\r
+       RCALL   TX_CHAR\r
+\r
+RX_WAIT_TEST:\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,$02                   ; DISABLE TIMER 1 OVERFLOW INTERRUPT\r
+       OUT     TIMSK,A                 ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+;      TST     ABORT_COUNT\r
+;      BREQ    RX_CHAR_CONT\r
+;\r
+;      LDI     A,21                    ; 20 * 25.6 MS = 512 MS\r
+;      MOV     ABORT_COUNT,A           ; ABORT ESC SEQUENCE AFTER TIMEOUT\r
+\r
+RX_CHAR_CONT:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+; INTERRUPT HANDLERS FOR API BUS\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+;T0_OVERFLOW:\r
+;      IN      SR,SREG\r
+;      PUSH    F\r
+;      ;MAPI_TIMER\r
+;      RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE PORTS\r
+       SBI     PORTD,2                 ; D2 = HIGH TO EXTINGUISH LED\r
+       SBI     DDRD,2                  ; D2 = OUTPUT FOR PAPER SENSE LED\r
+       SBI     DDRD,4                  ; D4 = OUTPUT FOR MOTOR DRIVE B1\r
+       SBI     DDRD,5                  ; D5 = OUTPUT FOR MOTOR DRIVE A1\r
+       SBI     DDRD,6                  ; D6 = OUTPUT FOR MOTOR DRIVE A0\r
+       SBI     DDRD,7                  ; D7 = OUTPUT FOR MOTOR DRIVE B0\r
+       SBI     DDRD,3                  ; D3 = OUTPUT FOR PRINTER STROBE\r
+       SBI     DDRC,3                  ; C3 = OUTPUT FOR PRINTER DATA-IN\r
+       SBI     DDRC,5                  ; C5 = OUTPUT FOR PRINTER CLOCK\r
+       SBI     DDRB,0                  ; D5 = OUTPUT FOR PRINTER OE1 / OE4\r
+       SBI     DDRB,1                  ; D6 = OUTPUT FOR PRINTER OE2 / OE5\r
+       SBI     DDRB,2                  ; D7 = OUTPUT FOR PRINTER OE3 / OE6\r
+       SBI     DDRC,1                  ; C1 = OUTPUT FOR CUTTER DRIVE\r
+\r
+       LDI     A,3\r
+       OUT     PORTC,A                 ; IDLE STATE FOR CUTTER, C0 = PULL UP\r
+\r
+       LDI     A,0\r
+       OUT     PORTD,A                 ; IDLE STATE FOR MOTOR\r
+\r
+       ; INITIALISE VARIABLES\r
+       INIT_API_BUS\r
+\r
+       LDI     FLAGS,1<<NARROW | 1<<RXSEND | 1<<ASCEND\r
+       LDI     A,1<<PAPER | 1<<EEWR_ENABLE\r
+       MOV     STATUS,A\r
+\r
+       LDI     A,$20\r
+       STS     SCALE_TEXT,A\r
+       ; TER MODE ONLY %\r
+       ;LDI    A,0\r
+       ; %\r
+       ; API BUS MODE ONLY %\r
+       LDI     A,$21\r
+       ; %\r
+       STS     SCALE_IMAGE,A\r
+\r
+       LDI     A,FEED_SPACING\r
+       MOV     SPACING,A               ; SET LINE SPACING FOR TEXT MODE\r
+\r
+       ;LDI    A,FEED_INITIAL ;+30\r
+       ;MOV    FEEDS,A                 ; AMOUNT TO FEED BEFORE PRINTING\r
+       CLR     FEEDS\r
+\r
+       LDI     A,$60\r
+       MOV     MOTOR_STATE,A\r
+\r
+       ; START BACKGROUND TASK\r
+       LDI     G,LOW(T0_MAIN)\r
+       LDI     H,HIGH(T0_MAIN)         ; T0_MAIN ON FIRST STEP INTERRUPT\r
+\r
+       LDI     A,4\r
+       OUT     TCCR0,A                 ; TIMER0 TICK = APPROX 25 US\r
+\r
+       LDI     A,-TIME_STEP\r
+       OUT     TCNT0,A                 ; SET DELAY TO FIRST STEP INTERRUPT\r
+\r
+       LDI     A,$02\r
+       OUT     TIFR,A                  ; CLEAR ANY TIMER 0 OVERFLOW PENDING\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPT\r
+\r
+       LDI     A,0\r
+       OUT     TCCR1A,A                ; TIMER1 PWM DISABLED\r
+       LDI     A,4\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 25 US\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z -> STORED CRC WORD FROM EEPROM\r
+       RCALL   EE_READ\r
+       CP      A,YL\r
+       BRNE    CHARACTER_SET_INIT\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       CP      A,YH\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+       DEC     ZL\r
+\r
+CHARACTER_SET_INIT:\r
+       LDI     A,$AC\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,$FB\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,1\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       LDI     A,0\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+       RCALL   EE_WRITE\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+BREAK_WAIT:\r
+       SBIS    PIND,0                  ; RXD HIGH?\r
+       RJMP    BREAK_WAIT              ; WAIT FOR API BUS MASTER TO START\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;TEXT_RESET:\r
+;      ; ENTRY POINT FROM RX_WAIT\r
+;      LDI     A,LOW(RAMEND)\r
+;      OUT     SPL,A                   ; INIT STACK POINTER\r
+\r
+TEXT_RECEIVE:\r
+       ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       CLR     CHAR_SAVE\r
+\r
+;      CLR     ABORT_COUNT             ; NO NEED TO ABORT ESC SEQUENCE\r
+;      CBR     FLAGS,1<<BOMB\r
+\r
+TEXT_RECEIVE_CONT:\r
+       ; NEXT LINE STARTS WITH CHAR_SAVE\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+TEXT_RECEIVE_LOOP:\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     STATUS,A                ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEAR,A                  ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+\r
+       MOV     A,CHAR_SAVE\r
+\r
+       CPI     A,$20\r
+       BRSH    TEXT_PRINTABLE\r
+\r
+       CPI     A,$1B\r
+       BREQ    TEXT_ESC\r
+\r
+       CPI     A,$18\r
+       BREQ    TEXT_RECEIVE            ; ^X CANCEL CURRENT BUFFER\r
+\r
+       CPI     A,$14\r
+       BREQ    TEXT_NARROW\r
+\r
+       CPI     A,$0E\r
+       BREQ    TEXT_WIDE\r
+\r
+       CPI     A,$0D\r
+       BREQ    TEXT_CR\r
+\r
+TEXT_RECEIVE_LOOPE:\r
+       ; WAIT TO RECEIVE SINGLE CHARACTER\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       RJMP    TEXT_RECEIVE_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_WIDE:\r
+       CBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_NARROW:\r
+       SBR     FLAGS,1<<NARROW\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_PRINTABLE:\r
+       SBRC    FLAGS,NARROW\r
+       RJMP    TEXT_IS_NARROW\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS-1         ; IF ON LAST BUFFER ENTRY\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH CHAR_SAVE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE\r
+       ORI     A,$80                   ; CHAR IS WIDE\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+TEXT_IS_NARROW:\r
+       LDI     A,$20\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS           ; IF JUST DONE LAST BUFFER ENTRY\r
+       BRSH    TEXT_DONE               ; WE ARE READY TO PRINT LINE\r
+\r
+       RJMP    TEXT_RECEIVE_LOOPE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_ESC:\r
+       MOV     A,BUF_PTR\r
+       CPI     A,1\r
+       BRSH    TEXT_PAD                ; NEXT LINE STARTS WITH ESC\r
+\r
+       RJMP    ESC_SEQUENCE            ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_CR:\r
+       CLR     CHAR_SAVE               ; NEXT LINE STARTS WITH RECEIVED CHAR\r
+       SBR     FLAGS,1<<NARROW\r
+\r
+TEXT_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PAD_LOOP:\r
+       LDI     A,$20\r
+       RCALL   TEXT_SAVE               ; CHAR IS NARROW\r
+       ST      Z,A                     ; SAVE WIDE FLAGS\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_CHARS\r
+       BRLO    TEXT_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+TEXT_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    TEXT_BLANK\r
+\r
+TEXT_PRINT:\r
+       LDS     A,PRINT_BUF+5\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     PRINT_BUF+5,A           ; SINCE WE SAVED ONLY 42 CHARS, NOT 48\r
+\r
+       MOV     A,SPACING\r
+       CPI     A,3+1\r
+       BRLO    TEXT_PRINT_SPACING\r
+       LDI     A,3\r
+TEXT_PRINT_SPACING:\r
+       SWAP    A\r
+       OR      TEXT_MASK,A             ; SAVE SPACING FOR DESCENDER PRINTING\r
+\r
+       SBR     FLAGS,1<<TEXT\r
+TEXT_PRINT_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    TEXT_PRINT_WAIT\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER PRINTING ?\r
+       BREQ    TEXT_PRINT_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,3                     ; COMPENSATE FOR ASCENDER + DESCENDER\r
+       BRLO    TEXT_PRINT_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS REMAINING AFTER DESCENDER,\r
+                                       ; EXCEPT FOR THE LAST ONE\r
+TEXT_PRINT_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+TEXT_PRINT_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_BLANK:\r
+       LDI     A,7\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       LDI     A,6                     ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       RCALL   WAIT_ADD_SPACING\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+       RJMP    TEXT_RECEIVE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+\r
+;      CPI     A,'I'\r
+;      BREQ    IDENTIFY\r
+       CPI     A,'.'\r
+       BRNE    CHARACTER_SET_DOWNLOAD_CONT\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      STATUS,A\r
+       RJMP    CHARACTER_SET_DOWNLOAD\r
+CHARACTER_SET_DOWNLOAD_CONT:\r
+       CPI     A,'?'\r
+       BRNE    CHARACTER_SET_QUERY_CONT\r
+       RJMP    CHARACTER_SET_QUERY\r
+CHARACTER_SET_QUERY_CONT:\r
+       CPI     A,'A'\r
+       BREQ    SPACING_SETUP\r
+       CPI     A,'B'\r
+       BREQ    FEED_SETUP\r
+       CPI     A,'C'\r
+       BRNE    PAPER_CUT_CONT\r
+       RJMP    PAPER_CUT\r
+PAPER_CUT_CONT:\r
+       CPI     A,'J'\r
+       BREQ    IMAGE_SCALE\r
+       CPI     A,'K'\r
+       BREQ    IMAGE_SETUP\r
+       CPI     A,'R'\r
+       BREQ    REVERSE_FEED\r
+       CPI     A,'T'\r
+       BREQ    TEXT_SCALE\r
+\r
+       RCALL   RX_WAIT\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SPACING_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     SPACING,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+FEED_SETUP:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    FEED_SETUP_DONE         ; NO FEED, NO CHANGE TO ASCEND FLAG\r
+       SBRS    FLAGS,ASCEND            ; IF ALL FEEDS HAVE BEEN PERFORMED,\r
+       DEC     A                       ; SUBTRACT THE LAST FEED\r
+       RCALL   WAIT_ADD_FEEDS\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+FEED_SETUP_DONE:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+REVERSE_FEED:\r
+       RCALL   RX_WAIT\r
+       TST     A\r
+       BREQ    REVERSE_FEED_DONE\r
+\r
+REVERSE_FEED_AGAIN:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+REVERSE_FEED_ENTRY:\r
+       MOV     CHAR_SAVE,A             ; THIS WILL BE READ BY INTERRUPT\r
+\r
+       SBR     FLAGS,1<<TEXT | 1<<IMAGE ; SETTING BOTH INDICATES REVERSE FEED\r
+REVERSE_FEED_WAIT:\r
+       SBRC    FLAGS,TEXT\r
+       RJMP    REVERSE_FEED_WAIT\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    REVERSE_FEED_ENTRY      ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       SBRC    FLAGS,ASCEND            ; NEED AN EXTRA FEED FOR ASCENDERS ?\r
+REVERSE_FEED_DONE:\r
+       RJMP    TEXT_RECEIVE            ; NO, WE ARE DONE\r
+\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+\r
+       LDI     A,1                     ; REPEAT PROCESS WITH 1 EXTRA FEED\r
+       RJMP    REVERSE_FEED_AGAIN\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_IMAGE,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+TEXT_SCALE:\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       MOV     B,A\r
+       RCALL   RX_WAIT\r
+       DEC     A\r
+       ANDI    A,$0F\r
+       SWAP    A\r
+       OR      A,B\r
+       STS     SCALE_TEXT,A\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IDENTIFY:\r
+;      ; SEND IDENTIFY MESSAGE\r
+;      LDI     ZL,LOW(IDENTIFY_MESS*2)\r
+;      CLR     ZH\r
+;\r
+;      LPM\r
+;      MOV     B,R0            ; CHARACTER COUNT\r
+;      INC     ZL\r
+;\r
+;NEXT_CHAR:\r
+;      MOV     A,TX_COUNT\r
+;      CPI     A,TX_SIZE\r
+;      BRSH    NEXT_CHAR\r
+;\r
+;      CLR     ZH\r
+;      LPM\r
+;      MOV     A,R0\r
+;      PUSH    ZL\r
+;      RCALL   TX_CHAR\r
+;      POP     ZL\r
+;\r
+;      INC     ZL\r
+;      DEC     B\r
+;      BRNE    NEXT_CHAR\r
+;\r
+;      RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SETUP:\r
+       RCALL   RX_WAIT\r
+       MOV     R0,A                    ; IMAGE COLUMNS SAVED IN R0\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A                    ; IMAGE LINES SAVED IN YL/YH\r
+\r
+       OR      A,YL\r
+       OR      A,R0\r
+       BREQ    IMAGE_DONE_NO_ASCENDER  ; ABORT IF WIDTH OR LINES = 0\r
+                                       ; (WITH NO CHANGE TO ASCENDER STATUS)\r
+       LDI     A,1\r
+       SBRC    FLAGS,ASCEND\r
+       RCALL   WAIT_ADD_FEEDS          ; PERFORM THE LAST FEED IF NOT DONE YET\r
+\r
+IMAGE_RECEIVE:\r
+       SBR     FLAGS,1<<WHITE\r
+       CLR     BUF_PTR\r
+\r
+IMAGE_RECEIVE_LOOP:\r
+       RCALL   RX_WAIT\r
+       MOV     CHAR_SAVE,A\r
+\r
+       LDI     A,0\r
+       CPSE    A,CHAR_SAVE\r
+       CBR     FLAGS,1<<WHITE\r
+\r
+       MOV     A,CHAR_SAVE\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRSH    IMAGE_DONE\r
+       CP      A,R0                    ; USER SELECTED WIDTH\r
+       BRLO    IMAGE_RECEIVE_LOOP\r
+\r
+IMAGE_PAD:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PAD_LOOP:\r
+       LDI     A,0\r
+       RCALL   IMAGE_SAVE\r
+\r
+       MOV     A,BUF_PTR\r
+       CPI     A,WIDTH_IMAGE\r
+       BRLO    IMAGE_PAD_LOOP\r
+\r
+       ; WE WILL REDUNDANTLY TEST FLAGS,WHITE AGAIN TO AVOID RJMP\r
+\r
+IMAGE_DONE:\r
+       SBRC    FLAGS,WHITE\r
+       RJMP    IMAGE_BLANK\r
+\r
+IMAGE_PRINT:\r
+       SBR     FLAGS,1<<IMAGE\r
+IMAGE_PRINT_WAIT:\r
+       SBRC    FLAGS,IMAGE\r
+       RJMP    IMAGE_PRINT_WAIT\r
+\r
+IMAGE_CONT:\r
+       SBIW    YL,1                    ; DONE 1 LINE\r
+       MOV     A,YL\r
+       OR      A,YH                    ; MORE LINES TO DO?\r
+       BRNE    IMAGE_RECEIVE\r
+\r
+       CBR     FLAGS,1<<ASCEND         ; SAY ALL FEEDS HAVE BEEN PERFORMED\r
+\r
+       TST     SPACING                 ; HAVE WE ROOM FOR ASCENDER NEXT TIME ?\r
+       BREQ    IMAGE_DONE_NO_ASCENDER\r
+\r
+       MOV     A,SPACING\r
+       SUBI    A,1                     ; COMPENSATE FOR ASCENDER NEXT TIME\r
+       BRLO    IMAGE_DONE_ASCENDER_OK\r
+\r
+       RCALL   WAIT_ADD_FEEDS          ; SAVE FEEDS EXCEPT FOR THE LAST ONE\r
+\r
+IMAGE_DONE_ASCENDER_OK:\r
+       SBR     FLAGS,1<<ASCEND         ; SAY WE DID NOT PERFORM THE LAST FEED\r
+IMAGE_DONE_NO_ASCENDER:\r
+       RJMP    TEXT_RECEIVE\r
+\r
+IMAGE_BLANK:\r
+       LDI     A,1\r
+       LDS     B,SCALE_IMAGE           ; IMAGE X/Y SCALE FACTORS\r
+       RCALL   WAIT_ADD_FEEDS_ENTRY\r
+\r
+       RJMP    IMAGE_CONT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH                      ; Z = DESTINATION PTR FOR DOWNLOAD\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; CRC HIGH BYTE\r
+       INC     ZL\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     ZH,A                    ; ZH = BYTE COUNT FOR DOWNLOAD\r
+       RCALL   EE_WRITE                ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE                ; COUNT HIGH BYTE\r
+       INC     ZL\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+       RCALL   EE_WRITE\r
+       INC     ZL\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_DOWNLOAD_LOOP\r
+\r
+ ;RCALL CHARACTER_SET_CRC\r
+ ;LDI ZL,EE_CRC*2\r
+ ;MOV A,YL\r
+ ;RCALL EE_WRITE\r
+ ;INC ZL\r
+ ;MOV A,YH\r
+ ;RCALL EE_WRITE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT                 ; DUMMY SET NO\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       LDI     A,'0'\r
+       RCALL   TX_WAIT\r
+\r
+       LDI     ZL,EE_CRC*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; CRC HIGH BYTE\r
+\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT LOW BYTE\r
+       INC     ZL\r
+       RCALL   EE_READ\r
+       RCALL   TX_WAIT                 ; COUNT HIGH BYTE\r
+       RJMP    TEXT_RECEIVE\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     ZL,EE_LENGTH*2          ; ZL -> LENGTH FOLLOWED BY DATA BLOCK\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = DATA LENGTH\r
+       SUBI    ZH,-2                   ; ZH = DATA LENGTH INCL LENGTH WORD\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       LDI     B,$21\r
+       MOV     R0,B\r
+       LDI     B,$10                   ; B:R0 = CRC POLYNOMIAL\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   EE_READ\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+       INC     ZL\r
+\r
+       LDI     A,8\r
+CHARACTER_SET_CRC_BIT:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,R0\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       DEC     A\r
+       BRNE    CHARACTER_SET_CRC_BIT\r
+\r
+       DEC     ZH\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+       RET\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       OUT     EEAR,ZL\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RETI\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       CLI                             ; IN CASE ACCESSED VIA INTERRUPT\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEAR,ZL\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       SBRS    STATUS,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PAPER_CUT:\r
+       SBR     FLAGS,1<<CUT            ; SAY CUTTER MUST BE OPERATED\r
+\r
+PAPER_CUT_WAIT:\r
+       SBRC    FLAGS,CUT\r
+       RJMP    PAPER_CUT_WAIT          ; WAIT FOR COMMAND TO BE RECEIVED\r
+\r
+       RJMP    TEXT_RECEIVE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+WAIT_ADD_SPACING:\r
+       MOV     A,SPACING\r
+\r
+WAIT_ADD_FEEDS:\r
+       LDS     B,SCALE_TEXT            ; TEXT X/Y SCALE FACTORS\r
+\r
+WAIT_ADD_FEEDS_ENTRY:\r
+       PUSH    A\r
+       ADD     A,FEEDS                 ; CAN WE ADD FEEDS YET?\r
+       POP     A\r
+       BRCS    WAIT_ADD_FEEDS_ENTRY\r
+\r
+       ADD     FEEDS,A                 ; SEND THE FEEDS ATOMICALLY\r
+\r
+       SUBI    B,$10                   ; FOR (B+$10) >> 4 ITERATIONS\r
+       BRSH    WAIT_ADD_FEEDS_ENTRY    ; APPLY VERTICAL SCALE FACTOR\r
+\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TEXT_SAVE:\r
+       MOV     YL,A\r
+       LDI     YH,0\r
+\r
+       LDI     ZL,EE_COUNT*2\r
+       ;CLR    ZH\r
+       RCALL   EE_READ\r
+       MOV     ZH,A                    ; ZH = COUNT OF CHARACTER DEFINITIONS\r
+       INC     ZL\r
+\r
+TEXT_SAVE_SEARCH:\r
+       RCALL   EE_READ                 ; READ CHARACTER CODE FOR DEFINITION\r
+       CP      A,YL\r
+       BREQ    TEXT_SAVE_FOUND         ; WITH YL = CHARACTER CODE, TRANSLATED\r
+       SUBI    ZL,-11\r
+\r
+       INC     YH\r
+       DEC     ZH\r
+       BRNE    TEXT_SAVE_SEARCH\r
+\r
+       MOV     YH,YL                   ; YL = CHARACTER CODE, NOT TRANSLATED\r
+\r
+TEXT_SAVE_FOUND:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-(PRINT_BUF+WIDTH_FLAGS)\r
+       ;CLR    ZH\r
+       ST      Z,YH\r
+\r
+       MOV     ZL,BUF_PTR\r
+       LSR     ZL\r
+       LSR     ZL\r
+       LSR     ZL\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH                      ; Z -> ONE OF WIDTH_FLAGS FLAG BYTES\r
+\r
+       INC     BUF_PTR\r
+\r
+       LD      A,Z\r
+       LSR     A                       ; PREPARE TO STORE WIDE FLAG\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+IMAGE_SAVE:\r
+       MOV     ZL,BUF_PTR\r
+       SUBI    ZL,-PRINT_BUF\r
+       ;CLR    ZH\r
+       ST      Z,A\r
+\r
+       INC     BUF_PTR\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHARACTER_SET:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; 20  \r
+       .DB     $00,$18,$18,$18,$18,$18,$00,$18,$00,$00 ; 21 !\r
+       .DB     $00,$E7,$63,$C6,$00,$00,$00,$00,$00,$00 ; 22 "\r
+       .DB     $00,$66,$66,$FF,$66,$FF,$66,$66,$00,$00 ; 23 #\r
+       .DB     $18,$7E,$DB,$D8,$7E,$1B,$DB,$7E,$18,$00 ; 24 $\r
+       .DB     $00,$E3,$E6,$0C,$18,$30,$67,$C7,$00,$00 ; 25 %\r
+       .DB     $00,$78,$CC,$D8,$73,$DE,$CC,$7B,$00,$00 ; 26 &\r
+       .DB     $00,$3C,$0C,$18,$00,$00,$00,$00,$00,$00 ; 27 '\r
+       .DB     $00,$0C,$18,$30,$30,$30,$18,$0C,$00,$00 ; 28 (\r
+       .DB     $00,$30,$18,$0C,$0C,$0C,$18,$30,$00,$00 ; 29 )\r
+       .DB     $00,$18,$DB,$7E,$3C,$7E,$DB,$18,$00,$00 ; 2A *\r
+       .DB     $00,$00,$18,$18,$FF,$18,$18,$00,$00,$00 ; 2B +\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$0C,$18,$00 ; 2C ,\r
+       .DB     $00,$00,$00,$00,$FF,$00,$00,$00,$00,$00 ; 2D -\r
+       .DB     $00,$00,$00,$00,$00,$00,$3C,$3C,$00,$00 ; 2E .\r
+       .DB     $00,$03,$06,$0C,$18,$30,$60,$C0,$00,$00 ; 2F /\r
+       .DB     $00,$7E,$C7,$CF,$DB,$F3,$E3,$7E,$00,$00 ; 30 0\r
+       .DB     $00,$0C,$1C,$3C,$0C,$0C,$0C,$0C,$00,$00 ; 31 1\r
+       .DB     $00,$7E,$C3,$03,$0E,$38,$60,$FF,$00,$00 ; 32 2\r
+       .DB     $00,$7E,$C3,$03,$3E,$03,$C3,$7E,$00,$00 ; 33 3\r
+       .DB     $00,$1C,$3C,$6C,$CC,$FF,$0C,$0C,$00,$00 ; 34 4\r
+       .DB     $00,$FF,$C0,$FE,$03,$03,$C3,$7E,$00,$00 ; 35 5\r
+       .DB     $00,$3E,$60,$C0,$FE,$C3,$C3,$7E,$00,$00 ; 36 6\r
+       .DB     $00,$FF,$03,$06,$0C,$18,$18,$18,$00,$00 ; 37 7\r
+       .DB     $00,$7E,$C3,$C3,$7E,$C3,$C3,$7E,$00,$00 ; 38 8\r
+       .DB     $00,$7E,$C3,$C3,$7F,$03,$06,$7C,$00,$00 ; 39 9\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$3C,$00,$00,$00 ; 3A :\r
+       .DB     $00,$00,$3C,$3C,$00,$3C,$0C,$18,$00,$00 ; 3B ;\r
+       .DB     $00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00 ; 3C <\r
+       .DB     $00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00 ; 3D =\r
+       .DB     $00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00 ; 3E >\r
+       .DB     $00,$7E,$C3,$03,$0E,$18,$00,$18,$00,$00 ; 3F ?\r
+       .DB     $00,$7E,$C3,$DB,$DB,$DF,$C0,$7C,$00,$00 ; 40 @\r
+       .DB     $00,$3C,$66,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 41 A\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C3,$C3,$FE,$00,$00 ; 42 B\r
+       .DB     $00,$7E,$C3,$C0,$C0,$C0,$C3,$7E,$00,$00 ; 43 C\r
+       .DB     $00,$FC,$C6,$C3,$C3,$C3,$C6,$FC,$00,$00 ; 44 D\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$FF,$00,$00 ; 45 E\r
+       .DB     $00,$FF,$C0,$C0,$FE,$C0,$C0,$C0,$00,$00 ; 46 F\r
+       .DB     $00,$7E,$C3,$C0,$C0,$CF,$C3,$7F,$00,$00 ; 47 G\r
+       .DB     $00,$C3,$C3,$C3,$FF,$C3,$C3,$C3,$00,$00 ; 48 H\r
+       .DB     $00,$18,$18,$18,$18,$18,$18,$18,$00,$00 ; 49 I\r
+       .DB     $00,$03,$03,$03,$03,$03,$C3,$7E,$00,$00 ; 4A J\r
+       .DB     $00,$C3,$C6,$CC,$F8,$CC,$C6,$C3,$00,$00 ; 4B K\r
+       .DB     $00,$C0,$C0,$C0,$C0,$C0,$C0,$FF,$00,$00 ; 4C L\r
+       .DB     $00,$C3,$E7,$FF,$DB,$C3,$C3,$C3,$00,$00 ; 4D M\r
+       .DB     $00,$C3,$E3,$F3,$DB,$CF,$C7,$C3,$00,$00 ; 4E N\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 4F O\r
+       .DB     $00,$FE,$C3,$C3,$FE,$C0,$C0,$C0,$00,$00 ; 50 P\r
+       .DB     $00,$7E,$C3,$C3,$C3,$C3,$CF,$7E,$03,$00 ; 51 Q\r
+       .DB     $00,$FE,$C3,$C3,$FE,$CC,$C6,$C3,$00,$00 ; 52 R\r
+       .DB     $00,$7E,$C3,$C0,$7E,$03,$C3,$7E,$00,$00 ; 53 S\r
+       .DB     $00,$FF,$18,$18,$18,$18,$18,$18,$00,$00 ; 54 T\r
+       .DB     $00,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$00,$00 ; 55 U\r
+       .DB     $00,$C3,$C3,$C3,$C3,$66,$3C,$18,$00,$00 ; 56 V\r
+       .DB     $00,$C3,$C3,$C3,$C3,$DB,$FF,$66,$00,$00 ; 57 W\r
+       .DB     $00,$C3,$66,$3C,$18,$3C,$66,$C3,$00,$00 ; 58 X\r
+       .DB     $00,$C3,$C3,$66,$3C,$18,$18,$18,$00,$00 ; 59 Y\r
+       .DB     $00,$FF,$06,$0C,$18,$30,$60,$FF,$00,$00 ; 5A Z\r
+       .DB     $00,$3C,$30,$30,$30,$30,$30,$3C,$00,$00 ; 5B [\r
+       .DB     $00,$C0,$60,$30,$18,$0C,$06,$03,$00,$00 ; 5C \\r
+       .DB     $00,$3C,$0C,$0C,$0C,$0C,$0C,$3C,$00,$00 ; 5D ]\r
+       .DB     $18,$3C,$66,$C3,$00,$00,$00,$00,$00,$00 ; 5E ^\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00 ; 5F _\r
+       .DB     $0C,$18,$1E,$00,$00,$00,$00,$00,$00,$00 ; 60 `\r
+       .DB     $00,$00,$00,$7E,$03,$7F,$C3,$7F,$00,$00 ; 61 a\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$FE,$00,$00 ; 62 b\r
+       .DB     $00,$00,$00,$7E,$C3,$C0,$C3,$7E,$00,$00 ; 63 c\r
+       .DB     $00,$03,$03,$7F,$C3,$C3,$C3,$7F,$00,$00 ; 64 d\r
+       .DB     $00,$00,$00,$7E,$C3,$FF,$C0,$7E,$00,$00 ; 65 e\r
+       .DB     $00,$1E,$33,$30,$FC,$30,$30,$30,$00,$00 ; 66 f\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$7E ; 67 g\r
+       .DB     $00,$C0,$C0,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 68 h\r
+       .DB     $00,$18,$00,$18,$18,$18,$18,$18,$00,$00 ; 69 i\r
+       .DB     $00,$06,$00,$06,$06,$06,$06,$06,$06,$7C ; 6A j\r
+       .DB     $00,$C0,$C0,$C6,$CC,$F8,$CC,$C6,$00,$00 ; 6B k\r
+       .DB     $00,$30,$30,$30,$30,$30,$30,$1C,$00,$00 ; 6C l\r
+       .DB     $00,$00,$00,$FE,$DB,$DB,$DB,$DB,$00,$00 ; 6D m\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$C3,$00,$00 ; 6E n\r
+       .DB     $00,$00,$00,$7E,$C3,$C3,$C3,$7E,$00,$00 ; 6F o\r
+       .DB     $00,$00,$00,$FE,$C3,$C3,$C3,$FE,$C0,$C0 ; 70 p\r
+       .DB     $00,$00,$00,$7F,$C3,$C3,$C3,$7F,$03,$03 ; 71 q\r
+       .DB     $00,$00,$00,$FE,$C3,$C0,$C0,$C0,$00,$00 ; 72 r\r
+       .DB     $00,$00,$00,$7E,$C0,$7E,$03,$7E,$00,$00 ; 73 s\r
+       .DB     $00,$18,$18,$7E,$18,$18,$18,$0E,$00,$00 ; 74 t\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$00,$00 ; 75 u\r
+       .DB     $00,$00,$00,$C3,$C3,$66,$3C,$18,$00,$00 ; 76 v\r
+       .DB     $00,$00,$00,$C3,$C3,$DB,$FF,$66,$00,$00 ; 77 w\r
+       .DB     $00,$00,$00,$C3,$66,$3C,$66,$C3,$00,$00 ; 78 x\r
+       .DB     $00,$00,$00,$C3,$C3,$C3,$C3,$7F,$03,$7E ; 79 y\r
+       .DB     $00,$00,$00,$FF,$0C,$18,$30,$FF,$00,$00 ; 7A z\r
+       .DB     $00,$0E,$18,$18,$70,$18,$18,$0E,$00,$00 ; 7B {\r
+       .DB     $00,$18,$18,$18,$00,$18,$18,$18,$00,$00 ; 7C |\r
+       .DB     $00,$70,$18,$18,$0E,$18,$18,$70,$00,$00 ; 7D }\r
+       .DB     $00,$76,$DC,$00,$00,$00,$00,$00,$00,$00 ; 7E ~\r
+       .DB     $00,$00,$00,$18,$3C,$66,$C3,$FF,$00,$00 ; 7F \7f\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+       ; PAPER CUTTER DOESN'T WORK WITH BODLEVEL = 0 FOR 4.0V\r
+\r
+       ; CKSEL = 010 FOR 64 MS R/C + 16K * 11 MHZ STARTUP DELAY\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4105                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB2                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/prm.inc b/src/avr/prm.inc
new file mode 100644 (file)
index 0000000..f4efc1b
--- /dev/null
@@ -0,0 +1,104 @@
+SN:    .DB     6,0,$1B,'#'\r
+       .DW     3               ; THE EVENT COUNTER, IT WILL BE < 1000\r
+       .DW     5594            ; THE SERIAL NUMBER, IT WILL BE => 1000\r
+\r
+SEGS1:                         ; NUMBER OF PARABOLIC SEGMENTS-1\r
+DEGS:  .DB     $03,$06         ; POLYNOMIAL DEGREE FOR THERMAL CORRECTION\r
+\r
+SEG1:  .DB     $2F,$BE,$B1,$B6 ;-5.2971513E-06 POLY SEGS FOR CONV TO GMS\r
+D21:   .DB     $F5,$02,$FB,$D1 ;-1.3476080E+11\r
+D11:   .DB     $BE,$0C,$A1,$CD ;-3.3774586E+08\r
+D01:   .DB     $16,$D8,$8B,$BF ;-1.0925319E+00\r
+SEG2:  .DB     $D3,$4F,$8B,$B8 ;-6.6429049E-05\r
+D22:   .DB     $C7,$16,$E6,$D1 ;-1.2352808E+11\r
+D12:   .DB     $6B,$EF,$A0,$CD ;-3.3750563E+08\r
+D02:   .DB     $E6,$8C,$0A,$BE ;-1.3530311E-01\r
+SEG3:  .DB     $7F,$45,$BB,$B8 ;-8.9297995E-05\r
+D23:   .DB     $1F,$46,$EE,$D1 ;-1.2792233E+11\r
+D13:   .DB     $80,$85,$A1,$CD ;-3.3873510E+08\r
+D03:   .DB     $8B,$A9,$79,$C2 ;-6.2415569E+01\r
+D24:   .DB     $22,$DA,$52,$D3 ;-9.0560279E+11\r
+D14:   .DB     $08,$2D,$E6,$CD ;-4.8271386E+08\r
+D04:   .DB     $D7,$F0,$D1,$C5 ;-6.7181050E+03\r
+\r
+       .ESEG\r
+\r
+CAL3:  .DB     $00,$00,$00,$00 ; 0.0000000E+00 RECALIBRATION COEFFICENTS\r
+CAL2:  .DB     $00,$00,$00,$00 ; 0.0000000E+00\r
+CAL1:  .DB     $00,$00,$80,$3F ; 1.0000000E+00\r
+CAL0:  .DB     $00,$00,$00,$00 ; 0.0000000E+00\r
+\r
+A11:   .DB     $FF,$A8,$22,$C3 ;-1.6266014E+02 THERMAL COMP AT 0 GMS\r
+A10:   .DB     $45,$5F,$32,$43 ; 1.7837215E+02\r
+A9:    .DB     $34,$A9,$0E,$42 ; 3.5665237E+01\r
+A8:    .DB     $51,$4F,$93,$C2 ;-7.3654915E+01\r
+A7:    .DB     $62,$52,$E3,$C1 ;-2.8415226E+01\r
+A6:    .DB     $C1,$3D,$A2,$41 ; 2.0280153E+01\r
+A5:    .DB     $00,$00,$94,$29 ; 6.5725203E-14\r
+\r
+K500:  .DB     $00,$00,$FA,$43 ; 5.0000000E+02\r
+A18:   .DB     $9F,$B9,$4C,$42 ; 5.1181271E+01 THERMAL COMP AT 500 GMS\r
+A17:   .DB     $5C,$B2,$02,$C2 ;-3.2674179E+01\r
+A16:   .DB     $02,$A1,$97,$C1 ;-1.8953617E+01\r
+A15:   .DB     $BD,$21,$42,$41 ; 1.2133237E+01\r
+A14:   .DB     $E4,$90,$A5,$3F ; 1.2934842E+00\r
+A13:   .DB     $54,$F9,$87,$3D ; 6.6393524E-02\r
+A12:   .DB     $00,$00,$40,$A6 ;-6.6613381E-16\r
+\r
+K1K5:  .DB     $00,$80,$BB,$44 ; 1.5000000E+03\r
+K2K:   .DB     $00,$00,$FA,$44 ; 2.0000000E+03\r
+A25:   .DB     $8F,$4B,$D5,$41 ; 2.6661894E+01 THERMAL COMP AT 2000 GMS\r
+A24:   .DB     $C0,$A3,$3D,$42 ; 4.7409912E+01\r
+A23:   .DB     $26,$A4,$1F,$C2 ;-3.9910301E+01\r
+A22:   .DB     $BA,$57,$BE,$C0 ;-5.9482088E+00\r
+A21:   .DB     $6C,$2E,$A9,$40 ; 5.2869167E+00\r
+A20:   .DB     $C5,$29,$14,$40 ; 2.3150494E+00\r
+A19:   .DB     $00,$00,$00,$25 ; 1.1102230E-16\r
+\r
+K8K:   .DB     $00,$00,$FA,$45 ; 8.0000000E+03\r
+K10K:  .DB     $00,$40,$1C,$46 ; 1.0000000E+04\r
+A32:   .DB     $A5,$41,$8B,$43 ; 2.7851285E+02 THERMAL COMP AT 10000 GMS\r
+A31:   .DB     $5F,$55,$E3,$C2 ;-1.1366674E+02\r
+A30:   .DB     $3F,$41,$25,$C3 ;-1.6525487E+02\r
+A29:   .DB     $9E,$B2,$6B,$42 ; 5.8924431E+01\r
+A28:   .DB     $72,$A6,$E6,$41 ; 2.8831272E+01\r
+A27:   .DB     $AC,$22,$0C,$41 ; 8.7584648E+00\r
+A26:   .DB     $00,$00,$40,$A9 ;-4.2632564E-14\r
+\r
+K15K:  .DB     $00,$60,$6A,$46 ; 1.5000000E+04\r
+_WREF: .DB     $E7,$60,$84,$BA ;-1.0099680E-03\r
+A39:   .DB     $AD,$CA,$1B,$C3 ;-1.5579170E+02 THERMAL COMP AT 15000 GMS\r
+A38:   .DB     $B6,$D9,$C8,$41 ; 2.5106304E+01\r
+A37:   .DB     $6B,$3F,$5F,$42 ; 5.5811932E+01\r
+A36:   .DB     $CE,$F9,$45,$41 ; 1.2373487E+01\r
+A35:   .DB     $D1,$75,$2E,$40 ; 2.7259409E+00\r
+A34:   .DB     $3F,$0E,$06,$42 ; 3.3513912E+01\r
+A33:   .DB     $00,$00,$30,$A8 ;-9.7699626E-15\r
+\r
+C3:    .DB     $F6,$CC,$B3,$58 ; 1.5815431E+15 POLY CONV TO NORM TEMP\r
+C2:    .DB     $C0,$DE,$18,$D1 ;-4.1035760E+10\r
+C1:    .DB     $BD,$2F,$D5,$48 ; 4.3660591E+05\r
+C0:    .DB     $51,$2F,$9E,$BF ;-1.2358190E+00\r
+\r
+       .CSEG\r
+\r
+TLTA21:        .DB     $D8,$E1,$CB,$49 ; 1.6702030E+06 TILT FB POSITION\r
+TLTA11:        .DB     $56,$84,$21,$C5 ;-2.5842710E+03\r
+TLTA01:        .DB     $12,$F5,$49,$3F ; 7.8889573E-01\r
+TLTA31:        .DB     $2F,$FD,$86,$42 ; 6.7494499E+01\r
+\r
+TLTA20:        .DB     $36,$91,$56,$49 ; 8.7886738E+05 TILT LR POSITION\r
+TLTA10:        .DB     $2D,$62,$79,$43 ; 2.4938350E+02\r
+TLTA00:        .DB     $BF,$60,$87,$BE ;-2.6440999E-01\r
+TLTA30:        .DB     $8B,$5A,$C8,$41 ; 2.5044210E+01\r
+\r
+TLTC21:        .DB     $9F,$05,$FC,$3E ; 4.9223039E-01 TILT SPAN\r
+TLTC11:        .DB     $61,$B7,$E9,$3A ; 1.7831140E-03\r
+TLTC20:        .DB     $F0,$0C,$02,$3F ; 5.0800991E-01\r
+TLTC10:        .DB     $82,$F3,$C8,$3B ; 6.1325440E-03\r
+\r
+TLTB21:        .DB     $1B,$23,$90,$44 ; 1.1530970E+03 TILT ZERO\r
+TLTB11:        .DB     $82,$A9,$5B,$C0 ;-3.4322209E+00\r
+TLTB20:        .DB     $B0,$AA,$96,$44 ; 1.2053340E+03\r
+TLTB10:        .DB     $0A,$92,$DE,$C0 ;-6.9553270E+00\r
+\r
diff --git a/src/avr/prm0.inc b/src/avr/prm0.inc
new file mode 100644 (file)
index 0000000..7dcae6c
--- /dev/null
@@ -0,0 +1,103 @@
+SN:    .DB     4,0,$1B,'#'\r
+       .DW     5594            ; THE SERIAL NUMBER, IT WILL BE => 1000\r
+\r
+SEGS1:                         ; NUMBER OF PARABOLIC SEGMENTS-1\r
+DEGS:  .DB     $03,$06         ; POLYNOMIAL DEGREE FOR THERMAL CORRECTION\r
+\r
+SEG1:  .DB     $2F,$BE,$B1,$B6 ;-5.2971513E-06 POLY SEGS FOR CONV TO GMS\r
+D21:   .DB     $F5,$02,$FB,$D1 ;-1.3476080E+11\r
+D11:   .DB     $BE,$0C,$A1,$CD ;-3.3774586E+08\r
+D01:   .DB     $16,$D8,$8B,$BF ;-1.0925319E+00\r
+SEG2:  .DB     $D3,$4F,$8B,$B8 ;-6.6429049E-05\r
+D22:   .DB     $C7,$16,$E6,$D1 ;-1.2352808E+11\r
+D12:   .DB     $6B,$EF,$A0,$CD ;-3.3750563E+08\r
+D02:   .DB     $E6,$8C,$0A,$BE ;-1.3530311E-01\r
+SEG3:  .DB     $7F,$45,$BB,$B8 ;-8.9297995E-05\r
+D23:   .DB     $1F,$46,$EE,$D1 ;-1.2792233E+11\r
+D13:   .DB     $80,$85,$A1,$CD ;-3.3873510E+08\r
+D03:   .DB     $8B,$A9,$79,$C2 ;-6.2415569E+01\r
+D24:   .DB     $22,$DA,$52,$D3 ;-9.0560279E+11\r
+D14:   .DB     $08,$2D,$E6,$CD ;-4.8271386E+08\r
+D04:   .DB     $D7,$F0,$D1,$C5 ;-6.7181050E+03\r
+\r
+       .ESEG\r
+\r
+CAL3:  .DB     $00,$00,$00,$00 ; 0.0000000E+00 RECALIBRATION COEFFICENTS\r
+CAL2:  .DB     $00,$00,$00,$00 ; 0.0000000E+00\r
+CAL1:  .DB     $00,$00,$80,$3F ; 1.0000000E+00\r
+CAL0:  .DB     $00,$00,$00,$00 ; 0.0000000E+00\r
+\r
+A11:   .DB     $FF,$A8,$22,$C3 ;-1.6266014E+02 THERMAL COMP AT 0 GMS\r
+A10:   .DB     $45,$5F,$32,$43 ; 1.7837215E+02\r
+A9:    .DB     $34,$A9,$0E,$42 ; 3.5665237E+01\r
+A8:    .DB     $51,$4F,$93,$C2 ;-7.3654915E+01\r
+A7:    .DB     $62,$52,$E3,$C1 ;-2.8415226E+01\r
+A6:    .DB     $C1,$3D,$A2,$41 ; 2.0280153E+01\r
+A5:    .DB     $00,$00,$94,$29 ; 6.5725203E-14\r
+\r
+K500:  .DB     $00,$00,$FA,$43 ; 5.0000000E+02\r
+A18:   .DB     $9F,$B9,$4C,$42 ; 5.1181271E+01 THERMAL COMP AT 500 GMS\r
+A17:   .DB     $5C,$B2,$02,$C2 ;-3.2674179E+01\r
+A16:   .DB     $02,$A1,$97,$C1 ;-1.8953617E+01\r
+A15:   .DB     $BD,$21,$42,$41 ; 1.2133237E+01\r
+A14:   .DB     $E4,$90,$A5,$3F ; 1.2934842E+00\r
+A13:   .DB     $54,$F9,$87,$3D ; 6.6393524E-02\r
+A12:   .DB     $00,$00,$40,$A6 ;-6.6613381E-16\r
+\r
+K1K5:  .DB     $00,$80,$BB,$44 ; 1.5000000E+03\r
+K2K:   .DB     $00,$00,$FA,$44 ; 2.0000000E+03\r
+A25:   .DB     $8F,$4B,$D5,$41 ; 2.6661894E+01 THERMAL COMP AT 2000 GMS\r
+A24:   .DB     $C0,$A3,$3D,$42 ; 4.7409912E+01\r
+A23:   .DB     $26,$A4,$1F,$C2 ;-3.9910301E+01\r
+A22:   .DB     $BA,$57,$BE,$C0 ;-5.9482088E+00\r
+A21:   .DB     $6C,$2E,$A9,$40 ; 5.2869167E+00\r
+A20:   .DB     $C5,$29,$14,$40 ; 2.3150494E+00\r
+A19:   .DB     $00,$00,$00,$25 ; 1.1102230E-16\r
+\r
+K8K:   .DB     $00,$00,$FA,$45 ; 8.0000000E+03\r
+K10K:  .DB     $00,$40,$1C,$46 ; 1.0000000E+04\r
+A32:   .DB     $A5,$41,$8B,$43 ; 2.7851285E+02 THERMAL COMP AT 10000 GMS\r
+A31:   .DB     $5F,$55,$E3,$C2 ;-1.1366674E+02\r
+A30:   .DB     $3F,$41,$25,$C3 ;-1.6525487E+02\r
+A29:   .DB     $9E,$B2,$6B,$42 ; 5.8924431E+01\r
+A28:   .DB     $72,$A6,$E6,$41 ; 2.8831272E+01\r
+A27:   .DB     $AC,$22,$0C,$41 ; 8.7584648E+00\r
+A26:   .DB     $00,$00,$40,$A9 ;-4.2632564E-14\r
+\r
+K15K:  .DB     $00,$60,$6A,$46 ; 1.5000000E+04\r
+_WREF: .DB     $E7,$60,$84,$BA ;-1.0099680E-03\r
+A39:   .DB     $AD,$CA,$1B,$C3 ;-1.5579170E+02 THERMAL COMP AT 15000 GMS\r
+A38:   .DB     $B6,$D9,$C8,$41 ; 2.5106304E+01\r
+A37:   .DB     $6B,$3F,$5F,$42 ; 5.5811932E+01\r
+A36:   .DB     $CE,$F9,$45,$41 ; 1.2373487E+01\r
+A35:   .DB     $D1,$75,$2E,$40 ; 2.7259409E+00\r
+A34:   .DB     $3F,$0E,$06,$42 ; 3.3513912E+01\r
+A33:   .DB     $00,$00,$30,$A8 ;-9.7699626E-15\r
+\r
+C3:    .DB     $F6,$CC,$B3,$58 ; 1.5815431E+15 POLY CONV TO NORM TEMP\r
+C2:    .DB     $C0,$DE,$18,$D1 ;-4.1035760E+10\r
+C1:    .DB     $BD,$2F,$D5,$48 ; 4.3660591E+05\r
+C0:    .DB     $51,$2F,$9E,$BF ;-1.2358190E+00\r
+\r
+       .CSEG\r
+\r
+TLTA21:        .DB     $D8,$E1,$CB,$49 ; 1.6702030E+06 TILT FB POSITION\r
+TLTA11:        .DB     $56,$84,$21,$C5 ;-2.5842710E+03\r
+TLTA01:        .DB     $12,$F5,$49,$3F ; 7.8889573E-01\r
+TLTA31:        .DB     $2F,$FD,$86,$42 ; 6.7494499E+01\r
+\r
+TLTA20:        .DB     $36,$91,$56,$49 ; 8.7886738E+05 TILT LR POSITION\r
+TLTA10:        .DB     $2D,$62,$79,$43 ; 2.4938350E+02\r
+TLTA00:        .DB     $BF,$60,$87,$BE ;-2.6440999E-01\r
+TLTA30:        .DB     $8B,$5A,$C8,$41 ; 2.5044210E+01\r
+\r
+TLTC21:        .DB     $9F,$05,$FC,$3E ; 4.9223039E-01 TILT SPAN\r
+TLTC11:        .DB     $61,$B7,$E9,$3A ; 1.7831140E-03\r
+TLTC20:        .DB     $F0,$0C,$02,$3F ; 5.0800991E-01\r
+TLTC10:        .DB     $82,$F3,$C8,$3B ; 6.1325440E-03\r
+\r
+TLTB21:        .DB     $1B,$23,$90,$44 ; 1.1530970E+03 TILT ZERO\r
+TLTB11:        .DB     $82,$A9,$5B,$C0 ;-3.4322209E+00\r
+TLTB20:        .DB     $B0,$AA,$96,$44 ; 1.2053340E+03\r
+TLTB10:        .DB     $0A,$92,$DE,$C0 ;-6.9553270E+00\r
+\r
diff --git a/src/avr/product/CFLASHV0.HEX b/src/avr/product/CFLASHV0.HEX
new file mode 100644 (file)
index 0000000..30751b3
--- /dev/null
@@ -0,0 +1,76 @@
+:020000020000FC\r
+:02000000C7C077\r
+:02000C0004C02E\r
+:1000100071C05BC0ACC0FFB67460FFBE1895A895F8\r
+:1000200072FF23C07B7FEE2019F0EA94F1F4DEC06A\r
+:10003000DA9409F4726017E0A5D107FF04C070FDDF\r
+:1000400072607E7F07C070FD05C082D18AD111F435\r
+:1000500093D1736071FF09C0042D003430F4DD24A6\r
+:100060007D7F072F017000631BD02220C1F2EE209C\r
+:1000700011F005E1E02ECF93DF93C12DC056DD27AF\r
+:100080000881F8942A941394CFE11C227894DF918C\r
+:10009000CF9108950F93A895042D0034E0F70F91A8\r
+:1000A000EE2021F00F9305E1E02E0F91CF93DF9327\r
+:1000B000DFB7F894C42DC30DDFBFCF73C05ADD275F\r
+:1000C00008834394DF91CF910895FFB64F934EEC90\r
+:1000D000742EEF93FF93E32DE05AFF274081FF91A9\r
+:1000E000EF914CB94A9433944FE334226A940AF066\r
+:1000F00046C04BC0FFB64F934EEC742E4CB15C998A\r
+:1001000038C057FC26C056FC08C0473029F445E0EB\r
+:1001100049B9539A40E4542A38C0642E40E2421947\r
+:100120000AF44FE7662012F4442D40684CB9461596\r
+:1001300008F4642E462D4F7739F040EC542A6A9427\r
+:1001400022F55798559A21C04FEB5422569A5E9A41\r
+:100150001CC0EF93FF93E22DE10DEF71E056FF27F6\r
+:100160004083FF91EF9123946A947AF40CC0FFB618\r
+:100170004F9353984FE849B94FEB54227724559841\r
+:100180005698579A4CB14FE754224F91FFBE18959D\r
+:100190000FED0DBF00E808B9A8950FE001BD929AD8\r
+:1001A0008A9A939A8B9AAC9AA49AAD9AA59AB89A7D\r
+:1001B000B99ABA9AA89AA99AAA9AAB9A949A959A2D\r
+:1001C000969A979A0FE809B900E90AB933244424AA\r
+:1001D00011242224552466247724772705E1D02E84\r
+:1001E00005E003BF22E028BF29BF78940FED0DBFC3\r
+:1001F000EE2415DF0B3109F0FBCF05E1E02E0FDF18\r
+:10020000093439F0043499F0023521F1073581F7CA\r
+:1002100045C09ED0A6D031F4AFD00BE13BDF09E45E\r
+:1002200039DFE6CF0BE136DF09E634DFE1CF00E06E\r
+:1002300016E0C7D00CEE17E0C4D093D031F40BE138\r
+:1002400029DF04E427DF2FEF14C00BE123DF04E6EE\r
+:1002500021DFCECF51D0E3DE0213CACF68D000E257\r
+:1002600017E0AFD07ED081F40BE114DF02E512DF9E\r
+:1002700051D0E0E0F2E010E085D0201B0BDF319799\r
+:10028000D1F7022F07DFB4CF0BE104DF02E702DF73\r
+:1002900041D000E0FFDE022FFDDEAACF2DD047D0F7\r
+:1002A00000E317E08ED05DD079F7EFEFF1E0B7DE35\r
+:1002B000201B10E086D03197D1F7B1DE201B102F24\r
+:1002C000AEDE02137E7F021391CF012F10E079D0B2\r
+:1002D00048D041F40BE1DEDE07E5DCDE1BD0022F67\r
+:1002E000D9DE86CF0BE1D6DE07E7D4DE13D000E0FF\r
+:1002F000D1DE022FCFDE7CCF2FEF91DE201BA02F8F\r
+:100300008EDE201BB02F8BDE201BC02F88DE201B33\r
+:10031000D02F08950A2F2FEF201BBCDE0B2F201BA0\r
+:10032000B9DE0C2F201BB6DE0D2F201BB3CE01E053\r
+:1003300012E047D00A2F13E044D00B2F14E041D035\r
+:100340000C2F15E03ED00D2F0F70006E16E039C057\r
+:100350000EE016E065D000E00A95F1F70AE016E03D\r
+:100360005FC0E0E0F0E017E00DD007FF02C031977A\r
+:10037000D1F7007C0034089501E011E022D00FEEA7\r
+:1003800017E01FC018BB1FE215BB000000000000F3\r
+:100390000000000000000000000014EF12BB00008D\r
+:1003A000000000000000000000000000000003B397\r
+:1003B00010B301270F7001271CEF12BB1FE315BB01\r
+:1003C000089518BB102F1F70106215BB1FE314BBDC\r
+:1003D000102F107F1C6012BB1CEF11BB000000002F\r
+:1003E00000000000000000000000000092980000E3\r
+:1003F0000000000000000000000000000000929AD1\r
+:1004000000000000000000000000000000000000EC\r
+:1004100012BB1CE011BB1FE315BB10E314BB089516\r
+:1004200018BB102F1F70106115BB1FE314BB102FDA\r
+:10043000107F1C6012BB1CEF11BB0000000000000D\r
+:100440000000000000000000000092980000000082\r
+:10045000000000000000000000000000929A000070\r
+:10046000000000000000000000000000000012BBBF\r
+:0E0470001CE011BB1FE315BB10E314BB089585\r
+:0620000006410742B2ACEC\r
+:00000001FF\r
diff --git a/src/avr/product/CFLASHV1.HEX b/src/avr/product/CFLASHV1.HEX
new file mode 100644 (file)
index 0000000..be960cc
--- /dev/null
@@ -0,0 +1,76 @@
+:020000020000FC\r
+:02000000C7C077\r
+:02000C0004C02E\r
+:1000100071C05BC0ACC0FFB67460FFBE1895A895F8\r
+:1000200072FF23C07B7FEE2019F0EA94F1F4DEC06A\r
+:10003000DA9409F4726017E0A5D107FF04C070FDDF\r
+:1000400072607E7F07C070FD05C082D18AD111F435\r
+:1000500093D1736071FF09C0042D003430F4DD24A6\r
+:100060007D7F072F017000631BD02220C1F2EE209C\r
+:1000700011F005E1E02ECF93DF93C12DC056DD27AF\r
+:100080000881F8942A941394CFE11C227894DF918C\r
+:10009000CF9108950F93A895042D0034E0F70F91A8\r
+:1000A000EE2021F00F9305E1E02E0F91CF93DF9327\r
+:1000B000DFB7F894C42DC30DDFBFCF73C05ADD275F\r
+:1000C00008834394DF91CF910895FFB64F934EEC90\r
+:1000D000742EEF93FF93E32DE05AFF274081FF91A9\r
+:1000E000EF914CB94A9433944FE334226A940AF066\r
+:1000F00046C04BC0FFB64F934EEC742E4CB15C998A\r
+:1001000038C057FC26C056FC08C0473029F445E0EB\r
+:1001100049B9539A40E4542A38C0642E40E2421947\r
+:100120000AF44FE7662012F4442D40684CB9461596\r
+:1001300008F4642E462D4F7739F040EC542A6A9427\r
+:1001400022F55798559A21C04FEB5422569A5E9A41\r
+:100150001CC0EF93FF93E22DE10DEF71E056FF27F6\r
+:100160004083FF91EF9123946A947AF40CC0FFB618\r
+:100170004F9353984FE849B94FEB54227724559841\r
+:100180005698579A4CB14FE754224F91FFBE18959D\r
+:100190000FED0DBF00E808B9A8950FE001BD929AD8\r
+:1001A0008A9A939A8B9AAC9AA49AAD9AA59AB89A7D\r
+:1001B000B99ABA9AA89AA99AAA9AAB9A949A959A2D\r
+:1001C000969A979A0FE809B900E90AB933244424AA\r
+:1001D00011242224552466247724772705E1D02E84\r
+:1001E00005E003BF22E028BF29BF78940FED0DBFC3\r
+:1001F000EE2415DF0B3109F0FBCF05E1E02E0FDF18\r
+:10020000093439F0043499F0023521F1073581F7CA\r
+:1002100045C09ED0A6D031F4AFD00BE13BDF09E45E\r
+:1002200039DFE6CF0BE136DF09E634DFE1CF00E06E\r
+:1002300016E0C7D00CEE17E0C4D093D031F40BE138\r
+:1002400029DF04E427DF2FEF14C00BE123DF04E6EE\r
+:1002500021DFCECF51D0E3DE0213CACF68D000E257\r
+:1002600017E0AFD07ED081F40BE114DF02E512DF9E\r
+:1002700051D0E0E0F2E010E085D0201B0BDF319799\r
+:10028000D1F7022F07DFB4CF0BE104DF02E702DF73\r
+:1002900041D000E0FFDE022FFDDEAACF2DD047D0F7\r
+:1002A00000E317E08ED05DD079F7EFEFF1E0B7DE35\r
+:1002B000201B10E086D03197D1F7B1DE201B102F24\r
+:1002C000AEDE02137E7F021391CF012F10E079D0B2\r
+:1002D00048D041F40BE1DEDE07E5DCDE1BD0022F67\r
+:1002E000D9DE86CF0BE1D6DE07E7D4DE13D000E0FF\r
+:1002F000D1DE022FCFDE7CCF2FEF91DE201BA02F8F\r
+:100300008EDE201BB02F8BDE201BC02F88DE201B33\r
+:10031000D02F08950A2F2FEF201BBCDE0B2F201BA0\r
+:10032000B9DE0C2F201BB6DE0D2F201BB3CE01E053\r
+:1003300012E047D00A2F13E044D00B2F14E041D035\r
+:100340000C2F15E03ED00D2F0F70006E16E039C057\r
+:100350000EE016E065D000E00A95F1F70AE016E03D\r
+:100360005FC0E0E0F0E017E00DD007FF02C031977A\r
+:10037000D1F7007C0034089501E011E022D00FEEA7\r
+:1003800017E01FC018BB1FE215BB000000000000F3\r
+:100390000000000000000000000014EF12BB00008D\r
+:1003A000000000000000000000000000000003B397\r
+:1003B00010B301270F7001271CEF12BB1FE315BB01\r
+:1003C000089518BB102F1F70106215BB1FE314BBDC\r
+:1003D000102F107F1C6012BB1CEF11BB000000002F\r
+:1003E00000000000000000000000000092980000E3\r
+:1003F0000000000000000000000000000000929AD1\r
+:1004000000000000000000000000000000000000EC\r
+:1004100012BB1CE011BB1FE315BB10E314BB089516\r
+:1004200018BB102F1F70106115BB1FE314BB102FDA\r
+:10043000107F1C6012BB1CEF11BB0000000000000D\r
+:100440000000000000000000000092980000000082\r
+:10045000000000000000000000000000929A000070\r
+:10046000000000000000000000000000000012BBBF\r
+:0E0470001CE011BB1FE315BB10E314BB089585\r
+:0620000006410742BAACE4\r
+:00000001FF\r
diff --git a/src/avr/product/CFLASHV2.HEX b/src/avr/product/CFLASHV2.HEX
new file mode 100644 (file)
index 0000000..a62f478
--- /dev/null
@@ -0,0 +1,76 @@
+:020000020000FC\r
+:02000000C7C077\r
+:02000C0004C02E\r
+:1000100071C05BC0ACC0FFB67460FFBE1895A895F8\r
+:1000200072FF23C07B7FEE2019F0EA94F1F4DEC06A\r
+:10003000DA9409F4726017E0A5D107FF04C070FDDF\r
+:1000400072607E7F07C070FD05C082D18AD111F435\r
+:1000500093D1736071FF09C0042D003430F4DD24A6\r
+:100060007D7F072F017000631BD02220C1F2EE209C\r
+:1000700011F005E1E02ECF93DF93C12DC056DD27AF\r
+:100080000881F8942A941394CFE11C227894DF918C\r
+:10009000CF9108950F93A895042D0034E0F70F91A8\r
+:1000A000EE2021F00F9305E1E02E0F91CF93DF9327\r
+:1000B000DFB7F894C42DC30DDFBFCF73C05ADD275F\r
+:1000C00008834394DF91CF910895FFB64F934EEC90\r
+:1000D000742EEF93FF93E32DE05AFF274081FF91A9\r
+:1000E000EF914CB94A9433944FE334226A940AF066\r
+:1000F00046C04BC0FFB64F934EEC742E4CB15C998A\r
+:1001000038C057FC26C056FC08C0473029F443E0ED\r
+:1001100049B9539A40E4542A38C0642E40E2421947\r
+:100120000AF44FE7662012F4442D40684CB9461596\r
+:1001300008F4642E462D4F7739F040EC542A6A9427\r
+:1001400022F55798559A21C04FEB5422569A5E9A41\r
+:100150001CC0EF93FF93E22DE10DEF71E056FF27F6\r
+:100160004083FF91EF9123946A947AF40CC0FFB618\r
+:100170004F9353984FE549B94FEB54227724559844\r
+:100180005698579A4CB14FE754224F91FFBE18959D\r
+:100190000FED0DBF00E808B9A8950FE001BD929AD8\r
+:1001A0008A9A939A8B9AAC9AA49AAD9AA59AB89A7D\r
+:1001B000B99ABA9AA89AA99AAA9AAB9A949A959A2D\r
+:1001C000969A979A0FE509B900E90AB933244424AD\r
+:1001D00011242224552466247724772705E1D02E84\r
+:1001E00005E003BF22E028BF29BF78940FED0DBFC3\r
+:1001F000EE2415DF0B3109F0FBCF05E1E02E0FDF18\r
+:10020000093439F0043499F0023521F1073581F7CA\r
+:1002100045C09ED0A6D031F4AFD00BE13BDF09E45E\r
+:1002200039DFE6CF0BE136DF09E634DFE1CF00E06E\r
+:1002300016E0C7D00CEE17E0C4D093D031F40BE138\r
+:1002400029DF04E427DF2FEF14C00BE123DF04E6EE\r
+:1002500021DFCECF51D0E3DE0213CACF68D000E257\r
+:1002600017E0AFD07ED081F40BE114DF02E512DF9E\r
+:1002700051D0E0E0F2E010E085D0201B0BDF319799\r
+:10028000D1F7022F07DFB4CF0BE104DF02E702DF73\r
+:1002900041D000E0FFDE022FFDDEAACF2DD047D0F7\r
+:1002A00000E317E08ED05DD079F7EFEFF1E0B7DE35\r
+:1002B000201B10E086D03197D1F7B1DE201B102F24\r
+:1002C000AEDE02137E7F021391CF012F10E079D0B2\r
+:1002D00048D041F40BE1DEDE07E5DCDE1BD0022F67\r
+:1002E000D9DE86CF0BE1D6DE07E7D4DE13D000E0FF\r
+:1002F000D1DE022FCFDE7CCF2FEF91DE201BA02F8F\r
+:100300008EDE201BB02F8BDE201BC02F88DE201B33\r
+:10031000D02F08950A2F2FEF201BBCDE0B2F201BA0\r
+:10032000B9DE0C2F201BB6DE0D2F201BB3CE01E053\r
+:1003300012E047D00A2F13E044D00B2F14E041D035\r
+:100340000C2F15E03ED00D2F0F70006E16E039C057\r
+:100350000EE016E065D000E00A95F1F70AE016E03D\r
+:100360005FC0E0E0F0E017E00DD007FF02C031977A\r
+:10037000D1F7007C0034089501E011E022D00FEEA7\r
+:1003800017E01FC018BB1FE215BB000000000000F3\r
+:100390000000000000000000000014EF12BB00008D\r
+:1003A000000000000000000000000000000003B397\r
+:1003B00010B301270F7001271CEF12BB1FE315BB01\r
+:1003C000089518BB102F1F70106215BB1FE314BBDC\r
+:1003D000102F107F1C6012BB1CEF11BB000000002F\r
+:1003E00000000000000000000000000092980000E3\r
+:1003F0000000000000000000000000000000929AD1\r
+:1004000000000000000000000000000000000000EC\r
+:1004100012BB1CE011BB1FE315BB10E314BB089516\r
+:1004200018BB102F1F70106115BB1FE314BB102FDA\r
+:10043000107F1C6012BB1CEF11BB0000000000000D\r
+:100440000000000000000000000092980000000082\r
+:10045000000000000000000000000000929A000070\r
+:10046000000000000000000000000000000012BBBF\r
+:0E0470001CE011BB1FE315BB10E314BB089585\r
+:0620000006410742B2ACEC\r
+:00000001FF\r
diff --git a/src/avr/product/CS64V4.HEX b/src/avr/product/CS64V4.HEX
new file mode 100644 (file)
index 0000000..e5b357b
--- /dev/null
@@ -0,0 +1,385 @@
+:020000020000FC\r
+:100000000DC087C387C3189518951895189518952E\r
+:1000100082C31895189527C711C762C702E00EBFA3\r
+:100020000FE50DBF10E818B9A8951FE011BD00E05D\r
+:1000300009BF0BBF08EF01BB08EB02BB0FE107BB19\r
+:100040000FEF0ABB04BB00270BBB03E008BB00E0BB\r
+:1000500005BB00E2B02E1FE519B910E91AB9442416\r
+:10006000552422243324EE246624CC24552750938F\r
+:100070000101509323015093430150934401509345\r
+:100080004501969AE0E0F0E0A8953197E9F7979856\r
+:1000900000E0B8D0B7D002E4B1D000E2B3D000E0C5\r
+:1000A000B1D003E4ABD000E8A9D000E9A7D000E0CC\r
+:1000B000A9D0A8D004E2A2D000EBA0D0E0E0F8E004\r
+:1000C00000E0A2D03197E1F702EB9AD008E996D090\r
+:1000D000979A789410E3B9D2CF93DF93C4D2BF91AB\r
+:1000E000AF911BD5212F1D2F12950DD31217B1F4EF\r
+:1000F000119613D5212F1D2F06D3121779F41196BF\r
+:100100000CD5212F1C2F1295FED2121739F41196FF\r
+:1001100004D5212F1C2FF7D2121749F1E6E7F2E19F\r
+:10012000A6E6B3E0D8E1D0930201C0D0D0E8C0E0A9\r
+:10013000DBBBC39AC398D0930101F89435B33C2735\r
+:1001400030783C27789435BBC8950BBAC29ABA98D8\r
+:10015000C1980000C19AC298BA9A119741F031969D\r
+:10016000C3951C2F1F7349F7C054D395E1CF20E1ED\r
+:100170002093F30020E22093F40028E12093F5007F\r
+:1001800021D6112710935101EE27FF271EEF109360\r
+:10019000FD001BEA1093FC0022E01BD21C7F109391\r
+:1001A000FE0023E016D21093FF001091FE00209174\r
+:1001B000FF001A380DEF200720F01B3A0FEF200741\r
+:1001C00030F01EEF1093FF0010E41093FE001EEFBE\r
+:1001D00019BD1BEA18BD1CEF1DBD1EEC1CBD10E5B2\r
+:1001E0001FBD11E01EBD00E003BF04E008BF09BF52\r
+:1001F0000AE005BF00EC0ABF0BBF92C219D006C0CF\r
+:1002000011D004C015D001C00DD0A8980BBB0000C0\r
+:1002100000000000F894C1980000000000007894ED\r
+:10022000C19A08950F930BD003FFFDCF0F9108954E\r
+:100230000F9305D000FD01FFFCCF0F910895A89A00\r
+:1002400000E00ABBF894C098000000000000000025\r
+:10025000C09A09B378940F930FEF0ABB0F910895DA\r
+:1002600002E00EBF0FE50DBF1FE7B122AF98C498A3\r
+:10027000409101014BBBC39AC39850E05FBD5EBD86\r
+:1002800094989598C298BA9A96989798C098C19859\r
+:100290005FEF5ABB50E05BBB50E059BF5BBF5FE113\r
+:1002A00051BD57E151BD5AE655BF889508957894E0\r
+:1002B0001FEDE12210E01EBB1FBB62D21B3129F1F2\r
+:1002C000B3FC0DC0103258F4183009F4FEC01D30D4\r
+:1002D00009F40DC11A3009F48BC0173041F7B2FC94\r
+:1002E00012C0103381F4C091F300D091F40020913A\r
+:1002F000F500CC5FDD4FF89435B320FB36F97894E8\r
+:1003000035BBF1D4102D72D2D2CF3AD21B3139F392\r
+:100310001E3209F475C11F3209F44FC01F3309F4AE\r
+:1003200084C1113409F4A6C0123409F427C213346D\r
+:1003300009F404C1133609F451C9143409F4EBC0AB\r
+:10034000153409F4D8C0163409F408C1163609F476\r
+:1003500051C9173409F49EC0183409F463C918361A\r
+:1003600009F454C91B3409F461C01C3409F4D4C124\r
+:100370001D3409F42BC01E3409F4FCC0103509F4F7\r
+:1003800097C0123509F4DCC0133509F4D2C0153515\r
+:1003900009F4F4C1163519F410E2E12AF7C0173553\r
+:1003A00009F4ECC1183509F4B8C11A3509F4E2C1F1\r
+:1003B000103310F01A3398F07ACFE2D110FF03C057\r
+:1003C00014E0B12A74CF1BEFB12271CFD9D1103311\r
+:1003D00021F4F89400E4B02A43CF69CFD1D135D1CC\r
+:1003E000C0E1C093F300D093F4002093F5005FCFF9\r
+:1003F00001D05DCF0F92C091F300D091F400209115\r
+:10040000F500DE5FC395F89435B320FB36F9789498\r
+:1004100035BB69D4182F100D100D1A95103418F033\r
+:10042000EED00F900895800D0F900895979800E0FA\r
+:10043000E9DEE8DE02E4E2DE00E2E4DE00E0E2DE45\r
+:1004400003E4DCDE00E8DADE00E9D8DE00E0DADE34\r
+:10045000D9DE04E2D3DE00EBD1DEE0E0F8E000E03C\r
+:10046000D3DE3197E1F702EBCBDE08E9C7DE979ADE\r
+:10047000A9D41DCF85D1117051F41FE7B122AF98D7\r
+:10048000C498409101014BBBC39AC39810CF10E8A8\r
+:10049000B12A0DCF75D1103309F404C0113309F41A\r
+:1004A00004C005CF07EFB02202CF08E0B02AFFCE8C\r
+:1004B00067D1103309F403C0113309F403C00FEE00\r
+:1004C000B022F5CE00E1B02AF2CEC091F300D09177\r
+:1004D000F4002091F500DE5FF89435B320FB36F987\r
+:1004E000789435BB00D470191FB712FFE0CE01D04D\r
+:1004F000DECE7727089544D111FD07C010FD03C05B\r
+:100500000FEDB022D4CE00E2B02A002700932301E1\r
+:1005100082D2F1F7CCCE34D1103309F404C01133B8\r
+:1005200009F404C0C4CE0EEFB022C1CE01E0B02A5F\r
+:10053000BECE26D1712F24D1812FB9CE02E0B02AB0\r
+:1005400070933401809335011BD11093360118D17B\r
+:1005500010933701E5D20DEFB022A9CE7093380188\r
+:10056000809339010DD110933A010AD110933B01C8\r
+:100570002CD39DCE709338018093390101D1109313\r
+:100580003A01FED010933B0145D391CEF9D010FF34\r
+:100590000BC01091FE002091FF001C5F2F4F1B3AF3\r
+:1005A0000FEF2007A8F40AC01091FE002091FF0071\r
+:1005B000145020401A380DEF200750F01093FE0021\r
+:1005C0002093FF0022E00DD01091FF0023E009D01E\r
+:1005D0006ECEE199FECF2EBB22272FBBE09A1DB332\r
+:1005E0000895E199FECFE5FEFFCF2EBB22272FBB5A\r
+:1005F0001DBBF894E5FEFFCFE29AE19A18951AC563\r
+:10060000BFD023D0BDD0A12FBBD0B12FB9D0F8948B\r
+:1006100035B320FB36F9789435BB80D221961197FB\r
+:100620001A2F1B2B09F0F2CF42CEAAD00ED01F9367\r
+:100630001AD01BE1C6D01FE3C4D01F91105DC1D0FA\r
+:100640001D2F5AD01C2F58D032CEC0E0D0E022E669\r
+:100650001F70163008F4210F2695D7952695D7954B\r
+:10066000D695D6950895A6E1B2E0AC0FBD1FF894DB\r
+:1006700035B320FB36F9789435BB4FD2E12F119674\r
+:100680004CD2F12FAC2FBD2F1496CFEFDFEF319767\r
+:10069000FF70349780F1319640D2119601E220E14B\r
+:1006A000D127CC0FDD1F10F4C027D227CC0FDD1FC0\r
+:1006B00010F4C027D227CC0FDD1F10F4C027D2279B\r
+:1006C000CC0FDD1F10F4C027D227CC0FDD1F10F494\r
+:1006D000C027D227CC0FDD1F10F4C027D227CC0FA4\r
+:1006E000DD1F10F4C027D227CC0FDD1F10F4C02768\r
+:1006F000D227319789F608951F93129504D061D0BF\r
+:100700001F9101D05EC01F7010631A3308F0195F8B\r
+:100710000895F7C3FFC307C4AAC432D010FD13C0A5\r
+:100720007093460180934701B09248011091F30005\r
+:10073000109349011091F40010934A011091F500B3\r
+:1007400010934B01B4CD709146018091470110EC9C\r
+:10075000B122109148011F73B12A109149011093E1\r
+:10076000F30010914A011093F40010914B01109383\r
+:10077000F5009DCD05D004D003D002D001D097CD97\r
+:1007800010EC10934401A89510E01EBB1FBB10ECA9\r
+:10079000809910934401B5FC3ED13320A1F310E0C1\r
+:1007A00010934401CF93DF93C22DC059DD271881E8\r
+:1007B000F8943A942394CFE72C227894DF91CF9148\r
+:1007C00008951F93A895152D1031E0F71F91CF9331\r
+:1007D000DF93DFB7F894C52DC40DDFBFCF70C05ACB\r
+:1007E000DD2718835394DF91CF91089578940027E3\r
+:1007F00000930001982E672F6AD26093F200A092B6\r
+:10080000F000C12FDD27CC0FDD1F1091F300C10FC9\r
+:100810001091F400D11F1091F50026D564D22196D5\r
+:10082000F02C61D2CF2DD02D1091F300C10F10917B\r
+:10083000F400D11F58D2802C1C2F2D2F219785FC1E\r
+:1008400007C0C091F300D091F400DE5F4CD21DC010\r
+:100850004AD2B4FC1AC0C091F300D091F400DE5F1C\r
+:10086000F02C41D20F1808F40024069400920001E5\r
+:10087000672F600D2CD26093F200A092F000C0911F\r
+:10088000F300D091F400DE5F2ED2B3FC1AC0072F24\r
+:10089000000D08F016C01F932F932BDEABDD0091E7\r
+:1008A0000001700F982E672F12D26093F200A09271\r
+:1008B000F00000910001701B1091F500D5D42F912C\r
+:1008C0001F91700D86FE05C0C12FD22F22970BD22B\r
+:1008D000900CC12FD22F219606D2702C0FEF0ABB9D\r
+:1008E000C09A0FE180228092F1000027801201C09F\r
+:1008F00087C0AA27B92DB695A795B695A795B05FDD\r
+:1009000007C09394A05CBF4F8090F100A090F000CE\r
+:10091000AA2A222721961091F500A6D4E4D1112706\r
+:100920006091F200662339F08894079417956A95D0\r
+:10093000E1F7022A212F08E1F89435B300FB36F9DC\r
+:10094000789435BBF89435B33A25307C3A257894C1\r
+:1009500035BB3B2F330F330FA7FA31F9A6FA30F925\r
+:100960003BBBF894C39AC398789430930101002755\r
+:100970000ABBF894C29ABA98C0980000C09A09B30A\r
+:100980000026B0FC002A0FEF0ABB0BBAC19800008A\r
+:10099000C19A7894C298BA9AA3948A9409F0BACF6B\r
+:1009A000222351F1F89435B33A25307C3A257894D6\r
+:1009B00035BB3B2F330F330FA7FA31F9A6FA30F9C5\r
+:1009C0003BBBF894C39AC3987894309301010027F5\r
+:1009D0000ABBF894C29ABA98C0980000C09A09B3AA\r
+:1009E0002027B0FC202B0FEF0ABB2BBBC1980000C7\r
+:1009F000C19A7894C298BA9A04D07A9409F081CFB7\r
+:100A00000895CF93DF93192D78D01881122B188376\r
+:100A1000DF91CF9108952F93CF93DF93109123010E\r
+:100A20006CD01881122309F45EC028812127288305\r
+:100A300010E010934401AF93BF93A3E0B1E0CC2743\r
+:100A4000D0912301D695C795D695C795D05F18E16B\r
+:100A50000BD42EE1F89435B33C27307C3C277894B6\r
+:100A600035BB3D2F330F330FC7FB31F9C6FB30F9D0\r
+:100A70003BBBF894C39AC398789430930101002744\r
+:100A80000ABBF894C29ABA98C0980000C09A19B3E9\r
+:100A90007894C298BA9A0FEF0ABB1D93C3952A9512\r
+:100AA00009F0D8CFBF91AF91CC27D0912301D69533\r
+:100AB000C795D695C795D695C79597980C2FA2DB65\r
+:100AC0000D2FA0DB04E29ADB00EB98DB2EE1C3E004\r
+:100AD000D1E0099199DB2A95E1F702EB91DB979A36\r
+:100AE00010EC109344011091230113951F73109380\r
+:100AF0002301DF91CF912F910895C4E2D1E0212FFE\r
+:100B0000269526952695C20F20E0D21F21E017706A\r
+:100B100019F0220F1A95E9F7089562C385C3C7CB70\r
+:100B200078949090350160913401D1D06093F200B7\r
+:100B3000A092F00070903701CC27D92DD695C7959B\r
+:100B4000D695C795D05F18E18FD307C0C05CDF4F43\r
+:100B500093946091F200A090F000AC2A1FEF809077\r
+:100B6000360100E0801641F008E08016B8F06623F8\r
+:100B700019F016956A95E9F7DAD008E01091F200BD\r
+:100B8000011B801AA3941FEF08E0801638F0B1F023\r
+:100B9000CED01FEF08E0801AA394F6CF882079F01A\r
+:100BA00016958A94E9F71095662341F02227169549\r
+:100BB00027956A95E1F7BBD0A394122FB8D021DF17\r
+:100BC0007A9400277012C2CF089500913A010A95D5\r
+:100BD0000230D0F300913B010330B0F300913801B3\r
+:100BE0000395009334010091390100933501809001\r
+:100BF0003A018A948A948092360101E00093370189\r
+:100C00008FDF009138010093340180903A01809287\r
+:100C100036013AC000913A010A950230A8F20091DB\r
+:100C20003B01033088F200913801039500933401B1\r
+:100C3000009139010093350180903A018A948A9499\r
+:100C40008092360101E0009337016ADF009138019C\r
+:100C500000933401009139010395009335017090A0\r
+:100C60003B017A947A947092370101E00093360147\r
+:100C700057DF80903A0100913801080D0A950093E2\r
+:100C8000340101E00093360100913901039500938E\r
+:100C9000350170903B017A947A947092370140DF6D\r
+:100CA0000091380103950093340180903A018A94B1\r
+:100CB0008A948092360170903B0100913901070DB2\r
+:100CC0000A950093350101E00093370129CFAA244A\r
+:100CD00000EFA01A67FFAA246F77685014F0A3945E\r
+:100CE000FCCF685F0895F89435B33C27307C3C27EF\r
+:100CF000789435BB3D2F330F330FC7FB31F9C6FB5B\r
+:100D000030F93BBBF894C39AC398789430930101AF\r
+:100D100000270ABBF894C29ABA98C0980000C09AFB\r
+:100D200009B27894C298BA9A0FEF0ABB0895F89462\r
+:100D300035B33A25307C3A25789435BB3D2F330FB7\r
+:100D4000330FA7FA31F9A6FA30F93BBBF894C39AEE\r
+:100D5000C39878943093010100270ABBF894C29A93\r
+:100D6000BA98C0980000C09AF9B27894C298BA9A1A\r
+:100D70000FEF0ABBB1FE03C01095F12203C0F126AC\r
+:100D8000B0FCF12AF89435B33A25307C3A257894B2\r
+:100D900035BB3D2F330F330FA7FA31F9A6FA30F9DF\r
+:100DA0003BBBF894C39AC398789430930101FBBA83\r
+:100DB000F894C29ABA98C1980000C19A7894C298DF\r
+:100DC000BA9A08959924C0E0D0E118E14DD2AA243E\r
+:100DD000A092F0001091F0001C2BF89435B331274D\r
+:100DE000307C3127789435BB3D2F330F330F17FB01\r
+:100DF00031F916FB30F93BBBF894C39AC398789449\r
+:100E00003093010100E00BBBF894C29ABA98C198E4\r
+:100E10000000C19A7894C298BA9AA39400E2A016EE\r
+:100E200019F0A092F000D6CFECDD9394C05CDF4FB8\r
+:100E3000D03209F0CCCF7727882708951FB60F93BB\r
+:100E40000FEDC02EEF93FF93E42DE05AFF270081B2\r
+:100E5000FF91EF910CB95A9443940FE040226A94A9\r
+:100E60000AF046C04BC01FB60F930FEDC02E0CB159\r
+:100E70005C9938C0E7FC26C0E6FC08C0033029F4C2\r
+:100E800003E009B9539A00E4E02A38C0602E00E874\r
+:100E900003190AF40FE7662012F4052D00680CB957\r
+:100EA000061508F4602E062D0F7739F000ECE02AC5\r
+:100EB0006A9422F55798559A21C00FEBE022569A72\r
+:100EC0005E9A1CC0EF93FF93E32DE20DEF77E0599C\r
+:100ED000FF270083FF91EF9133946A947AF40CC05A\r
+:100EE0001FB60F9353980FE509B90FEBE022CC24FE\r
+:100EF00055985698579A0CB10FE7E0220F911FBEF4\r
+:100F000018951FB68A9A4CB55DB55093FB00409377\r
+:100F1000FA008EC01FB68B9A4CB55DB55093F900A0\r
+:100F20004093F80085C01FB65AB35F935BB35F93DD\r
+:100F30005FEF5ABBB7FE14C0509151015395553223\r
+:100F400028F4523159F4AF98C49A03C0AF9AC498A8\r
+:100F500050E0409101014BBBC39AC398509351019B\r
+:100F600055B35F93509101015F9350914501505CDF\r
+:100F70005093450149F450914401539550934401D5\r
+:100F800019F45FEBB5226CC950EB5FBD4CB55DB594\r
+:100F9000485F5F4F5BBD4ABD59BD48BD8A9A929A72\r
+:100FA0008B9A939A8D9895985091FD004091FC00F2\r
+:100FB0008D9A859907C040389DEF59074AF04150F6\r
+:100FC000504006C0453D9FEF590712F44F5F5F4FF9\r
+:100FD0005093FD004093FC005BBD4ABD9091FE0024\r
+:100FE000491B9091FF00590B1AF445EF5FEF02C0C7\r
+:100FF00040E85DEF59BD48BD000000000000000062\r
+:10100000000000005DEF5DBD55E75CBD8A989298D9\r
+:101010008B98939850EE5FBD5F915BBBC39AC3986A\r
+:10102000509301015F9155BB5F915BBB5F915ABBD0\r
+:101030001FBE18959924C0E0D0E1A0E0B0E118E10E\r
+:1010400013D1A05CBF4F0A94E1F720E22F93C8D0E0\r
+:10105000EBD0A395C3952F912A9509F0F7CFD1DC5A\r
+:101060009394A0969096B03209F0EFCFB0CE88DB83\r
+:101070001F9386DB10934C0183DB1695169516950E\r
+:1010800009F410E210934F017BDB10935001172FEE\r
+:1010900016951695169510934D0180934E0118E103\r
+:1010A000E3D01F9110FD46C0CC27D0914E019D2E5C\r
+:1010B000D695C795D695C79510914D01C10FD05FB4\r
+:1010C0002091500110914C01121720F5211BAA27E5\r
+:1010D000B0914E01B10FB695A795B695A795109111\r
+:1010E0004D01A10FB05F2F93AF93BF93CF93DF93C9\r
+:1010F00020914F0168D085DCDF91CF91BF91AF91F6\r
+:101100002F919394A05CBF4FC05CDF4F2A9559F795\r
+:1011100020914C012F93CF93DF9320914F015AD010\r
+:1011200070DCDF91CF912F919394C05CDF4F2A95B3\r
+:1011300089F7F5CCCC27D0914E0100915001D00F0A\r
+:101140009D2ED695C795D695C79510914D01C10F87\r
+:10115000D05F202F10914C01121728F5211BAA27D0\r
+:10116000B0914E01B00FB11BB695A795B695A79556\r
+:1011700010914D01A10FB05F9A94A054B040C0549B\r
+:10118000D0402F93AF93BF93CF93DF9320914F0124\r
+:101190001AD037DCDF91CF91BF91AF912F912A9573\r
+:1011A00059F720914C019A94C054D0402F93CF937B\r
+:1011B000DF9320914F010ED024DCDF91CF912F914E\r
+:1011C0002A9589F7ACCC0CD011962ED021962A9571\r
+:1011D000D1F7089510E028D021962A95E1F70895D7\r
+:1011E000F89435B33A27307C3A27789435BB3B2FB7\r
+:1011F000330F330FA7FB31F9A6FB30F93BBBF89453\r
+:10120000C39AC39878943093010100270ABBF894DD\r
+:10121000C29ABA98C0980000C09A19B37894C2983C\r
+:10122000BA9A0FEF0ABB0895F89435B33C27307C87\r
+:101230003C27789435BB3D2F330F330FC7FB31F973\r
+:10124000C6FB30F93BBBF894C39AC39878943093AB\r
+:1012500001011BBBF894C29ABA98C1980000C19AC8\r
+:101260007894C298BA9A0895F89435B310FB36F979\r
+:10127000789435BB089546323444303331393033B5\r
+:101280003132313730394C034C034C034C034C039F\r
+:101290004C034C034C034C034C034C034C034C03D6\r
+:1012A0004C034C034C034C034C034C034C034C03C6\r
+:1012B0004C034C034C034C034C034C034C034C03B6\r
+:1012C0004C034C034C0300014C034C034C034C03F4\r
+:1012D0004C034C034C034C034C034C034C034C0396\r
+:1012E00003014C034C0306010F01180121012A01DF\r
+:1012F00033013C0145014E0157014C034C034C03A3\r
+:101300004C034C034C034C036001690172017B01E7\r
+:1013100084018D0196019F01A901B201BB01C401A5\r
+:10132000CD01D601DF01E801F101080211021A0224\r
+:1013300023022C0235023E02470250024C034C03AA\r
+:101340004C034C034C034C03590262026B027402BF\r
+:101350007D0286028F029902A302AD02B802C20288\r
+:10136000CB02D402DD02E602F002FC0203030C030E\r
+:1013700015031E0327033003390343034C034C03B7\r
+:101380004C034C034C030003066101F8010770880D\r
+:1013900098A8C888700107206020202020700107CD\r
+:1013A000708808102040F80107F810201008887095\r
+:1013B000010710305090F810100107F880F008086D\r
+:1013C00088700107304080F08888700107F80810A5\r
+:1013D000204040400107708888708888700107703D\r
+:1013E000888878081060010770888888F8888801E4\r
+:1013F00007F08888F08888F00107708880808088EE\r
+:10140000700107E09088888890E00107F88080F0FC\r
+:101410008080F80107F88080F08080800107708864\r
+:1014200080B88888780107888888F88888880221A9\r
+:10143000078080808080808001070808080808886D\r
+:101440007001078890A0C0A09088010780808080EC\r
+:101450008080F8010788D8A8A8888888010788882C\r
+:10146000C8A89888880107708888888888700107CC\r
+:10147000F08888F0808080010770888888A890684C\r
+:101480004C034C034C03060801014F0065030107A0\r
+:10149000F08888F0A09088010770888070088870B4\r
+:1014A0000107F820202020202001078888888888CC\r
+:1014B0008870010788888888885020010788888874\r
+:1014C000A8A8A8500107888850205088880107885C\r
+:1014D0008888502020200107F80810204080F8015B\r
+:1014E000070000700878887801078080F088888875\r
+:1014F000F00107000078808080780107080878886C\r
+:10150000888878010700007088F88070010718202B\r
+:10151000F8202020200108000078888878087001D1\r
+:10152000078080B0C888888802210780008080807A\r
+:101530008080052108100010101010906005210710\r
+:10154000808090A0C0A090032107C0404040404050\r
+:101550004001070000F0A8A8A8A801070000B0C833\r
+:10156000888888010700007088888870010800005A\r
+:10157000F08888F080800108000078888878080862\r
+:1015800002056105B0C0808080010700007880708E\r
+:1015900008F001072020F82020201801070000880B\r
+:1015A0008888986801070000888888502001070013\r
+:1015B000008888A8A85001070000885020508801A2\r
+:1015C00008000088888878087001070000F810205B\r
+:1015D00040F80107F8F8F8F8F8F8F80070933801C7\r
+:1015E00080933901CDD810933A01CAD810933B01AA\r
+:1015F00026D05DC67093380180933901C1D810930D\r
+:101600003A01BED810933B012FD051C670933401DC\r
+:1016100080933501B5D810933601B2D810933701B5\r
+:1016200078D045C67093340180933501A9D81093C2\r
+:101630003601A6D81093370171D039C608950091AC\r
+:101640003801009334010091390100933501009174\r
+:101650003A010093360100913B010093370102E00B\r
+:10166000B02A5EDA0DEFB02200913A010A950230FD\r
+:1016700028F300913B01033008F3009138010093F7\r
+:101680003401009139010093350100913A01009332\r
+:10169000360101E00093370143DA009138010093ED\r
+:1016A00034010091390103950093350100913B010C\r
+:1016B00002500093370101E00093360131DA809047\r
+:1016C0003A0100913801080D0A950093340101E0B8\r
+:1016D0000093360100913901039500933501009183\r
+:1016E0003B010250009337011BDA0091380100934F\r
+:1016F000340100913A010093360170903B01009152\r
+:101700003901070D0A950093350101E00093370177\r
+:1017100007CA02E0B02A04DA0DEFB0227894909064\r
+:10172000350160913401D3DA6093F200A092F000A9\r
+:1017300070903701CC27D92D15E5D0FF1AEA012E7C\r
+:10174000D695C795D695C795D05F18E18DDD07C0B2\r
+:10175000C05CDF4F93946091F200A090F000AC2A3F\r
+:101760001FEF8090360100E0801641F008E08016FF\r
+:10177000C8F0662319F016956A95E9F71021D7DAB3\r
+:1017800008E01091F200011B801AA3941FEF08E0FB\r
+:10179000801640F0C1F01021CADA1FEF08E0801A6D\r
+:1017A000A394F5CF882089F016958A94E9F71095CF\r
+:1017B000662349F02227169527956A95E1F71021AF\r
+:1017C000B6DAA394122F1021B2DA00941AD97A94BF\r
+:0817D00000277012BDCF08953F\r
+:0220000003419A\r
+:00000001FF\r
diff --git a/src/avr/product/MT102V0.HEX b/src/avr/product/MT102V0.HEX
new file mode 100644 (file)
index 0000000..6263fea
--- /dev/null
@@ -0,0 +1,191 @@
+:020000020000FC\r
+:0200000033C209\r
+:04000A007CC104C0F1\r
+:10001000DDC1C7C118C2FFB65F936F9358EB52BFE3\r
+:10002000A89508956F915F91FFBE1895BA9494D0EA\r
+:10003000F9DF90D0F7DFBB2019F4272F2C70B9F02F\r
+:10004000E1FC06C022E1E22A89D0A298AA9AEADF5E\r
+:10005000BB2061F773FF20C172FF82C0382D737F10\r
+:1000600079D0E0DF79D0DEDF3A95D1F7E4CFE1FE59\r
+:100070000BC0D8DF2DEFE22220E174FFE22A20E05E\r
+:1000800022BBAA98A29AD6CF74FD38C020E022BF26\r
+:1000900020E4E20E78F69298A398A298AA9A20E714\r
+:1000A000E0FE20E822BFBEDF2091D30023952093FD\r
+:1000B000D30011F420E1E22A33B3929AA39AAA98CA\r
+:1000C000A29A33FD06C020E1E0FCE22A2EEFE222F4\r
+:1000D00004C0E0FC02C021E1E22A32FD0AC0E3FED6\r
+:1000E000A9CF28E7E0FCB22E20E1E22A27EFE222A6\r
+:1000F000A1CFE3FC9FCF28E1E22A9CCF7F7E24E1C1\r
+:10010000E22AA998A0E2BEE438EE43E0119779F024\r
+:100110002CEF22BF87DF9899F7CF31504040B1F7DD\r
+:10012000119729F02CEF22BF7DDF989BF9CFA99A78\r
+:10013000A8EEB3E02CEF22BF75DF1197D9F72BEFB4\r
+:10014000E2222B2D222329F4272F2C7011F420E1F9\r
+:10015000E22A70CF20EA01C020E5A226A2BA0895C3\r
+:100160002FEF22BFDD0CDD0C20ECD22277FFD394E1\r
+:10017000A0E8B1E080E090E030E0EF93FF93E32F60\r
+:10018000E695E695E695E05A2081532F57705395F2\r
+:100190004091D1004F7026955A95E9F710F4440F1D\r
+:1001A0004F57E32FEA5920812032C8F0E22FFF2772\r
+:1001B000EE0FFF1FEE0FFF1FE20F20E0F21FEE0F0A\r
+:1001C000FF1F2D2D2F70E20F20E0F21F20EBE20F1A\r
+:1001D00026E0F21F602DC895202D062E0FC0E22FBD\r
+:1001E000EE0FEE0FE20FEE0FE20FE85F2D2D2F70F6\r
+:1001F000E20FE199FECFEEBBE09A2DB3FF91EF91B4\r
+:1002000011DF5FEF47FD5EEF52BF65D061E064D064\r
+:1002100009DF5FEF47FD5EEF52BF339547FD339532\r
+:100220003A3208F4AACF20E046E061E055D02D2D07\r
+:10023000203C20F42395203808F423952F70293092\r
+:1002400008F0777F4091D100939A9398EBDE84DF9A\r
+:1002500027E028BBE7DE382F292F269537952695EE\r
+:100260003795385E2A2D79DF5FEF52BFDBDE3A9596\r
+:10027000D1F7A22E20E028BB6DDF405138F72D2D9D\r
+:10028000203C20F42395203808F423952F70293042\r
+:1002900010F4D3946DCFCECE2FEF22BFA0E8B1E003\r
+:1002A00080E090E030E0EF93E32FE05A2081EF917F\r
+:1002B0004091D2004F70B6DE5FEF52BF0CD0B2DE7D\r
+:1002C0005FEF52BF3395303370F37B7F2FEFD22E29\r
+:1002D0004091D200B9CF68E0AA2311F4BB2381F08A\r
+:1002E000220F08F4AB9A542F5F77AD9AAB99019621\r
+:1002F0001197AD9829F05150C0F7AB986A9581F7E6\r
+:10030000AB9808952FE121BD27E121BD20E325BF52\r
+:1003100088950FEF0DBD00E00CBD00E808BF02E8B6\r
+:1003200009BF00E00EBB809B04C00FEF0DBD00E0D5\r
+:100330000CBDE4FE0FC0042D013060F400E000931A\r
+:10034000D3000FEEE0220E2D0F7000630A3308F089\r
+:10035000095F18D0222029F302E009BFCF93DF9371\r
+:10036000C12DCF56DD270881F8942A941394CFE34A\r
+:100370001C227894DF91CF9108950F93042D0130C2\r
+:10038000E8F70F91CF93DF93DFB7F894C42DC30D37\r
+:10039000DFBFC070C057DD2708834394DF91CF9142\r
+:1003A0000895FFB64F934EEC742EEF93FF93E32D19\r
+:1003B000E057FF274081FF91EF914CB94A94339465\r
+:1003C00040E034226A940AF046C04BC0FFB64F9317\r
+:1003D0004EEC742E4CB15C9938C057FC26C056FCCC\r
+:1003E00008C0453029F445E049B9539A40E4542AFD\r
+:1003F00038C0642E40E442190AF44FE7662012F434\r
+:10040000442D40684CB9461508F4642E462D4F77AC\r
+:1004100039F040EC542A6A9422F55798559A21C035\r
+:100420004FEB5422569A5E9A1CC0EF93FF93E22D35\r
+:10043000E10DEF73EF56FF274083FF91EF91239477\r
+:100440006A947AF40CC0FFB64F9353984FE849B9B9\r
+:100450004FEB5422772455985698579A4CB14FE752\r
+:1004600054224F91FFBE18950FED0DBF00E808B95B\r
+:10047000A8950FE001BD929A8A9A8C9A8D9A8E9ACD\r
+:100480008F9A8B9AA39AA59AB89AB99ABA9AA19A6E\r
+:1004900003E005BB00E002BB0FE809B900E90AB9B7\r
+:1004A000332444241124222455246624772471EC17\r
+:1004B00001E2E02E00E20093D10001E20093D200BD\r
+:1004C00003E0C02EBB2400E6A02E5AE160E004E069\r
+:1004D00003BF08EB02BF02E008BF09BF00E00FBD89\r
+:1004E00004E00EBD78942CD1E2E041D10C1729F440\r
+:1004F000E3953DD10D1771F0EA950CEA3FD1E395F4\r
+:100500000BEF3CD1E39501E039D1E39500E036D122\r
+:10051000E39534D10FEDE02200E00EBB809BFECFCF\r
+:100520008824726099240FEDE02200E00EBB082DB4\r
+:10053000003288F40B3119F1083191F3043149F09C\r
+:100540000E3029F00D30F9F0E4DE802EECCF7E7F06\r
+:10055000FBCF7160F9CF70FD07C0092D0932A8F4F7\r
+:10056000082D27D10068008300E208117D7F082D47\r
+:1005700020D100838824092D0A3278F4E5CF092D93\r
+:10058000013018F42FC08824716071FD24C000E28E\r
+:1005900010D10083092D0A32D0F371FD1CC00091E7\r
+:1005A00065000695069506950695069506950093B1\r
+:1005B00065000C2D043008F003E00295D02A786025\r
+:1005C00073FDFECF7F77CC2029F00C2D035008F06F\r
+:1005D000E6D07068A6CF07E077FF06E0E0D0DED077\r
+:1005E00070689FCF96DE0E3219F400E2E02A7FC0D9\r
+:1005F0000F3309F491C0013479F0023481F00334EF\r
+:1006000009F4C8C00A3419F10B34C9F1023579F084\r
+:10061000043549F17EDE84CF7CDEC02E81CF79DEC9\r
+:10062000002321F077FF0A95BAD0706879CF71DE88\r
+:10063000002349F01091D100802E7C6073FDFECF25\r
+:100640001051D0F777FD6CCF706801E0F3CF61DE19\r
+:100650000A950F70102F5DDE0A950F700295012B21\r
+:100660000093D2005DCF55DE0A950F70102F51DE3A\r
+:100670000A950F700295012B0093D10051CF49DEEE\r
+:10068000002E47DEC02F45DED02F0C2B002949F16C\r
+:1006900001E077FD84D0726099243BDE802E00E07B\r
+:1006A00008117D7F082D9FD0092D003348F40015D7\r
+:1006B000A0F371FD17C000E096D0092D0033D8F3E8\r
+:1006C00071FD10C0746072FDFECF21970C2F0D2BB1\r
+:1006D00011F77F77CC2029F00C2D015008F05FD066\r
+:1006E00070681ECF01E01091D2005BD0EECF11DE1A\r
+:1006F000E2E00FDE43D0E3950CDE40D0E39509DE67\r
+:10070000F02F3CD0E39505DE39D0E39502DE36D0FC\r
+:10071000E395FA95D9F704CFFCDD0BE12EDE0FE36C\r
+:100720002CDE00E32ADEE2E022D027DEE3951FD0B4\r
+:1007300024DEE3951CD021DEE39519D01EDEF0CE39\r
+:10074000E4E015D0F02FFE5FCFEFDFEF11E2012ED6\r
+:1007500010E10DD0D027E39508E0CC0FDD1F10F499\r
+:10076000C025D1270A95C9F7FA9599F70895E19917\r
+:10077000FECFF894EEBBE09A0DB31895E199FECF49\r
+:10078000F894E5FEFFCFEEBB0DBBE5FEFFCFE29A8E\r
+:10079000E19A1895706174FDFECFC2CE0C2D1091B8\r
+:1007A000D1000F930B0D0F91E0F3B00E1051C8F76D\r
+:1007B0000895C02FD0E0E6E0DADFF02FE395D7DF31\r
+:1007C0000C1729F0E55FD395FA95C9F7DC2FE92DD1\r
+:1007D000EA59D083E92DE695E695E695E05A93949B\r
+:1007E000008106950895E92DE05A008393940895B9\r
+:1007F0000000000000000000000000181818181881\r
+:100800000018000000E763C600000000000000665A\r
+:1008100066FF66FF66660000187EDBD87E1BDB7E07\r
+:10082000180000E3E60C183067C700000078CCD849\r
+:1008300073DECC7B0000003C0C18000000000000C0\r
+:10084000000C18303030180C00000030180C0C0C64\r
+:10085000183000000018DB7E3C7EDB180000000032\r
+:100860001818FF18180000000000000000003C0CE1\r
+:10087000180000000000FF00000000000000000061\r
+:1008800000003C3C00000003060C183060C0000073\r
+:10089000007EC7CFDBF3E37E0000000C1C3C0C0C99\r
+:1008A0000C0C0000007EC3030E3860FF0000007EC9\r
+:1008B000C3033E03C37E0000001C3C6CCCFF0C0C49\r
+:1008C000000000FFC0FE0303C37E0000003E60C0C6\r
+:1008D000FEC3C37E000000FF03060C1818180000BA\r
+:1008E000007EC3C37EC3C37E0000007EC3C37F03FC\r
+:1008F000067C000000003C3C003C3C000000000086\r
+:100900003C3C003C0C180000000C18306030180C07\r
+:100910000000000000FF00FF000000000030180C85\r
+:10092000060C18300000007EC3030E1800180000EB\r
+:10093000007EC3DBDBDFC07C0000003C66C3FFC37E\r
+:10094000C3C3000000FEC3C3FEC3C3FE0000007E9D\r
+:10095000C3C0C0C0C37E000000FCC6C3C3C3C6FC86\r
+:10096000000000FFC0C0FEC0C0FF000000FFC0C00C\r
+:10097000FEC0C0C00000007EC3C0C0CFC37F000067\r
+:1009800000C3C3C3FFC3C3C300000018181818185E\r
+:1009900018180000000303030303C37E000000C314\r
+:1009A000C6CCF8CCC6C3000000C0C0C0C0C0C0FFE9\r
+:1009B000000000C3E7FFDBC3C3C3000000C3E3F3D1\r
+:1009C000DBCFC7C30000007EC3C3C3C3C37E000028\r
+:1009D00000FEC3C3FEC0C0C00000007EC3C3C3C3CB\r
+:1009E000CF7E030000FEC3C3FECCC6C30000007E62\r
+:1009F000C3C07E03C37E000000FF18181818181823\r
+:100A0000000000C3C3C3C3C3C37E000000C3C3C38D\r
+:100A1000C3663C18000000C3C3C3C3DBFF6600000D\r
+:100A200000C3663C183C66C3000000C3C3663C18A4\r
+:100A30001818000000FF060C183060FF0000003C92\r
+:100A400030303030303C000000C06030180C0603FD\r
+:100A50000000003C0C0C0C0C0C3C0000183C66C365\r
+:100A600000000000000000000000000000FF000087\r
+:100A70000C181E000000000000000000007E037F34\r
+:100A8000C37F000000C0C0FEC3C3C3FE000000005F\r
+:100A9000007EC3C0C37E00000003037FC3C3C37FC7\r
+:100AA00000000000007EC3FFC07E0000001E333047\r
+:100AB000FC30303000000000007FC3C3C37F037EE2\r
+:100AC00000C0C0FEC3C3C3C300000018001818183C\r
+:100AD000181800000006000606060606067C00C080\r
+:100AE000C0C6CCF8CCC60000003030303030301CEE\r
+:100AF0000000000000FEDBDBDBDB0000000000FE8E\r
+:100B0000C3C3C3C300000000007EC3C3C37E000094\r
+:100B1000000000FEC3C3C3FEC0C00000007FC3C30B\r
+:100B2000C37F0303000000FEC3C0C0C0000000007C\r
+:100B3000007EC07E037E00000018187E1818180E74\r
+:100B40000000000000C3C3C3C37F0000000000C357\r
+:100B5000C3663C180000000000C3C3DBFF66000052\r
+:100B6000000000C3663C66C30000000000C3C3C3AE\r
+:100B7000C37F037E000000FF0C1830FF0000000E52\r
+:100B800018187018180E00000018181800181818F7\r
+:100B90000000007018180E18187000000076DC00B5\r
+:100BA000000000000000000000183C66C3FF0000C9\r
+:042000000541B2AC38\r
+:00000001FF\r
diff --git a/src/avr/product/MT102V1.HEX b/src/avr/product/MT102V1.HEX
new file mode 100644 (file)
index 0000000..1e074a5
--- /dev/null
@@ -0,0 +1,191 @@
+:020000020000FC\r
+:0200000033C209\r
+:04000A007CC104C0F1\r
+:10001000DDC1C7C118C2FFB65F936F9358EB52BFE3\r
+:10002000A89508956F915F91FFBE1895BA9494D0EA\r
+:10003000F9DF90D0F7DFBB2019F4272F2C70B9F02F\r
+:10004000E1FC06C022E1E22A89D0A298AA9AEADF5E\r
+:10005000BB2061F773FF20C172FF82C0382D737F10\r
+:1000600079D0E0DF79D0DEDF3A95D1F7E4CFE1FE59\r
+:100070000BC0D8DF2DEFE22220E174FFE22A20E05E\r
+:1000800022BBAA98A29AD6CF74FD38C020E022BF26\r
+:1000900020E4E20E78F69298A398A298AA9A20E714\r
+:1000A000E0FE20E822BFBEDF2091D30023952093FD\r
+:1000B000D30011F420E1E22A33B3929AA39AAA98CA\r
+:1000C000A29A33FD06C020E1E0FCE22A2EEFE222F4\r
+:1000D00004C0E0FC02C021E1E22A32FD0AC0E3FED6\r
+:1000E000A9CF28E7E0FCB22E20E1E22A27EFE222A6\r
+:1000F000A1CFE3FC9FCF28E1E22A9CCF7F7E24E1C1\r
+:10010000E22AA998A0E2BEE438EE43E0119779F024\r
+:100110002CEF22BF87DF9899F7CF31504040B1F7DD\r
+:10012000119729F02CEF22BF7DDF989BF9CFA99A78\r
+:10013000A8EEB3E02CEF22BF75DF1197D9F72BEFB4\r
+:10014000E2222B2D222329F4272F2C7011F420E1F9\r
+:10015000E22A70CF20EA01C020E5A226A2BA0895C3\r
+:100160002FEF22BFDD0CDD0C20ECD22277FFD394E1\r
+:10017000A0E8B1E080E090E030E0EF93FF93E32F60\r
+:10018000E695E695E695E05A2081532F57705395F2\r
+:100190004091D1004F7026955A95E9F710F4440F1D\r
+:1001A0004F57E32FEA5920812032C8F0E22FFF2772\r
+:1001B000EE0FFF1FEE0FFF1FE20F20E0F21FEE0F0A\r
+:1001C000FF1F2D2D2F70E20F20E0F21F20EBE20F1A\r
+:1001D00026E0F21F602DC895202D062E0FC0E22FBD\r
+:1001E000EE0FEE0FE20FEE0FE20FE85F2D2D2F70F6\r
+:1001F000E20FE199FECFEEBBE09A2DB3FF91EF91B4\r
+:1002000011DF5FEF47FD5EEF52BF65D061E064D064\r
+:1002100009DF5FEF47FD5EEF52BF339547FD339532\r
+:100220003A3208F4AACF20E046E061E055D02D2D07\r
+:10023000203C20F42395203808F423952F70293092\r
+:1002400008F0777F4091D100939A9398EBDE84DF9A\r
+:1002500027E028BBE7DE382F292F269537952695EE\r
+:100260003795385E2A2D79DF5FEF52BFDBDE3A9596\r
+:10027000D1F7A22E20E028BB6DDF405138F72D2D9D\r
+:10028000203C20F42395203808F423952F70293042\r
+:1002900010F4D3946DCFCECE2FEF22BFA0E8B1E003\r
+:1002A00080E090E030E0EF93E32FE05A2081EF917F\r
+:1002B0004091D2004F70B6DE5FEF52BF0CD0B2DE7D\r
+:1002C0005FEF52BF3395303370F37B7F2FEFD22E29\r
+:1002D0004091D200B9CF68E0AA2311F4BB2381F08A\r
+:1002E000220F08F4AB9A542F5F77AD9AAB99019621\r
+:1002F0001197AD9829F05150C0F7AB986A9581F7E6\r
+:10030000AB9808952FE121BD27E121BD20E325BF52\r
+:1003100088950FEF0DBD00E00CBD00E808BF02E8B6\r
+:1003200009BF00E00EBB809B04C00FEF0DBD00E0D5\r
+:100330000CBDE4FE0FC0042D013060F400E000931A\r
+:10034000D3000FEEE0220E2D0F7000630A3308F089\r
+:10035000095F18D0222029F302E009BFCF93DF9371\r
+:10036000C12DCF56DD270881F8942A941394CFE34A\r
+:100370001C227894DF91CF9108950F93042D0130C2\r
+:10038000E8F70F91CF93DF93DFB7F894C42DC30D37\r
+:10039000DFBFC070C057DD2708834394DF91CF9142\r
+:1003A0000895FFB64F934EEC742EEF93FF93E32D19\r
+:1003B000E057FF274081FF91EF914CB94A94339465\r
+:1003C00040E034226A940AF046C04BC0FFB64F9317\r
+:1003D0004EEC742E4CB15C9938C057FC26C056FCCC\r
+:1003E00008C0453029F445E049B9539A40E4542AFD\r
+:1003F00038C0642E40E442190AF44FE7662012F434\r
+:10040000442D40684CB9461508F4642E462D4F77AC\r
+:1004100039F040EC542A6A9422F55798559A21C035\r
+:100420004FEB5422569A5E9A1CC0EF93FF93E22D35\r
+:10043000E10DEF73EF56FF274083FF91EF91239477\r
+:100440006A947AF40CC0FFB64F9353984FE849B9B9\r
+:100450004FEB5422772455985698579A4CB14FE752\r
+:1004600054224F91FFBE18950FED0DBF00E808B95B\r
+:10047000A8950FE001BD929A8A9A8C9A8D9A8E9ACD\r
+:100480008F9A8B9AA39AA59AB89AB99ABA9AA19A6E\r
+:1004900003E005BB00E002BB0FE809B900E90AB9B7\r
+:1004A000332444241124222455246624772471EC17\r
+:1004B00001E2E02E00E20093D10001E20093D200BD\r
+:1004C00003E0C02EBB2400E6A02E5AE160E004E069\r
+:1004D00003BF08EB02BF02E008BF09BF00E00FBD89\r
+:1004E00004E00EBD78942CD1E2E041D10C1729F440\r
+:1004F000E3953DD10D1771F0EA950CEA3FD1E395F4\r
+:100500000BEF3CD1E39501E039D1E39500E036D122\r
+:10051000E39534D10FEDE02200E00EBB809BFECFCF\r
+:100520008824726099240FEDE02200E00EBB082DB4\r
+:10053000003288F40B3119F1083191F3043149F09C\r
+:100540000E3029F00D30F9F0E4DE802EECCF7E7F06\r
+:10055000FBCF7160F9CF70FD07C0092D0932A8F4F7\r
+:10056000082D27D10068008300E208117D7F082D47\r
+:1005700020D100838824092D0A3278F4E5CF092D93\r
+:10058000013018F42FC08824716071FD24C000E28E\r
+:1005900010D10083092D0A32D0F371FD1CC00091E7\r
+:1005A00065000695069506950695069506950093B1\r
+:1005B00065000C2D043008F003E00295D02A786025\r
+:1005C00073FDFECF7F77CC2029F00C2D035008F06F\r
+:1005D000E6D07068A6CF07E077FF06E0E0D0DED077\r
+:1005E00070689FCF96DE0E3219F400E2E02A7FC0D9\r
+:1005F0000F3309F491C0013479F0023481F00334EF\r
+:1006000009F4C8C00A3419F10B34C9F1023579F084\r
+:10061000043549F17EDE84CF7CDEC02E81CF79DEC9\r
+:10062000002321F077FF0A95BAD0706879CF71DE88\r
+:10063000002349F01091D100802E7C6073FDFECF25\r
+:100640001051D0F777FD6CCF706801E0F3CF61DE19\r
+:100650000A950F70102F5DDE0A950F700295012B21\r
+:100660000093D2005DCF55DE0A950F70102F51DE3A\r
+:100670000A950F700295012B0093D10051CF49DEEE\r
+:10068000002E47DEC02F45DED02F0C2B002949F16C\r
+:1006900001E077FD84D0726099243BDE802E00E07B\r
+:1006A00008117D7F082D9FD0092D003348F40015D7\r
+:1006B000A0F371FD17C000E096D0092D0033D8F3E8\r
+:1006C00071FD10C0746072FDFECF21970C2F0D2BB1\r
+:1006D00011F77F77CC2029F00C2D015008F05FD066\r
+:1006E00070681ECF01E01091D2005BD0EECF11DE1A\r
+:1006F000E2E00FDE43D0E3950CDE40D0E39509DE67\r
+:10070000F02F3CD0E39505DE39D0E39502DE36D0FC\r
+:10071000E395FA95D9F704CFFCDD0BE12EDE0FE36C\r
+:100720002CDE00E32ADEE2E022D027DEE3951FD0B4\r
+:1007300024DEE3951CD021DEE39519D01EDEF0CE39\r
+:10074000E4E015D0F02FFE5FCFEFDFEF11E2012ED6\r
+:1007500010E10DD0D027E39508E0CC0FDD1F10F499\r
+:10076000C025D1270A95C9F7FA9599F70895E19917\r
+:10077000FECFF894EEBBE09A0DB31895E199FECF49\r
+:10078000F894E5FEFFCFEEBB0DBBE5FEFFCFE29A8E\r
+:10079000E19A1895706174FDFECFC2CE0C2D1091B8\r
+:1007A000D1000F930B0D0F91E0F3B00E1051C8F76D\r
+:1007B0000895C02FD0E0E6E0DADFF02FE395D7DF31\r
+:1007C0000C1729F0E55FD395FA95C9F7DC2FE92DD1\r
+:1007D000EA59D083E92DE695E695E695E05A93949B\r
+:1007E000008106950895E92DE05A008393940895B9\r
+:1007F0000000000000000000000000181818181881\r
+:100800000018000000E763C600000000000000665A\r
+:1008100066FF66FF66660000187EDBD87E1BDB7E07\r
+:10082000180000E3E60C183067C700000078CCD849\r
+:1008300073DECC7B0000003C0C18000000000000C0\r
+:10084000000C18303030180C00000030180C0C0C64\r
+:10085000183000000018DB7E3C7EDB180000000032\r
+:100860001818FF18180000000000000000003C0CE1\r
+:10087000180000000000FF00000000000000000061\r
+:1008800000003C3C00000003060C183060C0000073\r
+:10089000007EC7CFDBF3E37E0000000C1C3C0C0C99\r
+:1008A0000C0C0000007EC3030E3860FF0000007EC9\r
+:1008B000C3033E03C37E0000001C3C6CCCFF0C0C49\r
+:1008C000000000FFC0FE0303C37E0000003E60C0C6\r
+:1008D000FEC3C37E000000FF03060C1818180000BA\r
+:1008E000007EC3C37EC3C37E0000007EC3C37F03FC\r
+:1008F000067C000000003C3C003C3C000000000086\r
+:100900003C3C003C0C180000000C18306030180C07\r
+:100910000000000000FF00FF000000000030180C85\r
+:10092000060C18300000007EC3030E1800180000EB\r
+:10093000007EC3DBDBDFC07C0000003C66C3FFC37E\r
+:10094000C3C3000000FEC3C3FEC3C3FE0000007E9D\r
+:10095000C3C0C0C0C37E000000FCC6C3C3C3C6FC86\r
+:10096000000000FFC0C0FEC0C0FF000000FFC0C00C\r
+:10097000FEC0C0C00000007EC3C0C0CFC37F000067\r
+:1009800000C3C3C3FFC3C3C300000018181818185E\r
+:1009900018180000000303030303C37E000000C314\r
+:1009A000C6CCF8CCC6C3000000C0C0C0C0C0C0FFE9\r
+:1009B000000000C3E7FFDBC3C3C3000000C3E3F3D1\r
+:1009C000DBCFC7C30000007EC3C3C3C3C37E000028\r
+:1009D00000FEC3C3FEC0C0C00000007EC3C3C3C3CB\r
+:1009E000CF7E030000FEC3C3FECCC6C30000007E62\r
+:1009F000C3C07E03C37E000000FF18181818181823\r
+:100A0000000000C3C3C3C3C3C37E000000C3C3C38D\r
+:100A1000C3663C18000000C3C3C3C3DBFF6600000D\r
+:100A200000C3663C183C66C3000000C3C3663C18A4\r
+:100A30001818000000FF060C183060FF0000003C92\r
+:100A400030303030303C000000C06030180C0603FD\r
+:100A50000000003C0C0C0C0C0C3C0000183C66C365\r
+:100A600000000000000000000000000000FF000087\r
+:100A70000C181E000000000000000000007E037F34\r
+:100A8000C37F000000C0C0FEC3C3C3FE000000005F\r
+:100A9000007EC3C0C37E00000003037FC3C3C37FC7\r
+:100AA00000000000007EC3FFC07E0000001E333047\r
+:100AB000FC30303000000000007FC3C3C37F037EE2\r
+:100AC00000C0C0FEC3C3C3C300000018001818183C\r
+:100AD000181800000006000606060606067C00C080\r
+:100AE000C0C6CCF8CCC60000003030303030301CEE\r
+:100AF0000000000000FEDBDBDBDB0000000000FE8E\r
+:100B0000C3C3C3C300000000007EC3C3C37E000094\r
+:100B1000000000FEC3C3C3FEC0C00000007FC3C30B\r
+:100B2000C37F0303000000FEC3C0C0C0000000007C\r
+:100B3000007EC07E037E00000018187E1818180E74\r
+:100B40000000000000C3C3C3C37F0000000000C357\r
+:100B5000C3663C180000000000C3C3DBFF66000052\r
+:100B6000000000C3663C66C30000000000C3C3C3AE\r
+:100B7000C37F037E000000FF0C1830FF0000000E52\r
+:100B800018187018180E00000018181800181818F7\r
+:100B90000000007018180E18187000000076DC00B5\r
+:100BA000000000000000000000183C66C3FF0000C9\r
+:042000000541BAAC30\r
+:00000001FF\r
diff --git a/src/avr/product/MT102V2.HEX b/src/avr/product/MT102V2.HEX
new file mode 100644 (file)
index 0000000..9d5f9c2
--- /dev/null
@@ -0,0 +1,191 @@
+:020000020000FC\r
+:0200000033C209\r
+:04000A007CC104C0F1\r
+:10001000DDC1C7C118C2FFB65F936F9358EB52BFE3\r
+:10002000A89508956F915F91FFBE1895BA9494D0EA\r
+:10003000F9DF90D0F7DFBB2019F4272F2C70B9F02F\r
+:10004000E1FC06C022E1E22A89D0A298AA9AEADF5E\r
+:10005000BB2061F773FF20C172FF82C0382D737F10\r
+:1000600079D0E0DF79D0DEDF3A95D1F7E4CFE1FE59\r
+:100070000BC0D8DF2DEFE22220E174FFE22A20E05E\r
+:1000800022BBAA98A29AD6CF74FD38C020E022BF26\r
+:1000900020E4E20E78F69298A398A298AA9A20E714\r
+:1000A000E0FE20E822BFBEDF2091D30023952093FD\r
+:1000B000D30011F420E1E22A33B3929AA39AAA98CA\r
+:1000C000A29A33FD06C020E1E0FCE22A2EEFE222F4\r
+:1000D00004C0E0FC02C021E1E22A32FD0AC0E3FED6\r
+:1000E000A9CF28E7E0FCB22E20E1E22A27EFE222A6\r
+:1000F000A1CFE3FC9FCF28E1E22A9CCF7F7E24E1C1\r
+:10010000E22AA998A0E2BEE438EE43E0119779F024\r
+:100110002CEF22BF87DF9899F7CF31504040B1F7DD\r
+:10012000119729F02CEF22BF7DDF989BF9CFA99A78\r
+:10013000A8EEB3E02CEF22BF75DF1197D9F72BEFB4\r
+:10014000E2222B2D222329F4272F2C7011F420E1F9\r
+:10015000E22A70CF20EA01C020E5A226A2BA0895C3\r
+:100160002FEF22BFDD0CDD0C20ECD22277FFD394E1\r
+:10017000A0E8B1E080E090E030E0EF93FF93E32F60\r
+:10018000E695E695E695E05A2081532F57705395F2\r
+:100190004091D1004F7026955A95E9F710F4440F1D\r
+:1001A0004F57E32FEA5920812032C8F0E22FFF2772\r
+:1001B000EE0FFF1FEE0FFF1FE20F20E0F21FEE0F0A\r
+:1001C000FF1F2D2D2F70E20F20E0F21F20EBE20F1A\r
+:1001D00026E0F21F602DC895202D062E0FC0E22FBD\r
+:1001E000EE0FEE0FE20FEE0FE20FE85F2D2D2F70F6\r
+:1001F000E20FE199FECFEEBBE09A2DB3FF91EF91B4\r
+:1002000011DF5FEF47FD5EEF52BF65D061E064D064\r
+:1002100009DF5FEF47FD5EEF52BF339547FD339532\r
+:100220003A3208F4AACF20E046E061E055D02D2D07\r
+:10023000203C20F42395203808F423952F70293092\r
+:1002400008F0777F4091D100939A9398EBDE84DF9A\r
+:1002500027E028BBE7DE382F292F269537952695EE\r
+:100260003795385E2A2D79DF5FEF52BFDBDE3A9596\r
+:10027000D1F7A22E20E028BB6DDF405138F72D2D9D\r
+:10028000203C20F42395203808F423952F70293042\r
+:1002900010F4D3946DCFCECE2FEF22BFA0E8B1E003\r
+:1002A00080E090E030E0EF93E32FE05A2081EF917F\r
+:1002B0004091D2004F70B6DE5FEF52BF0CD0B2DE7D\r
+:1002C0005FEF52BF3395303370F37B7F2FEFD22E29\r
+:1002D0004091D200B9CF68E0AA2311F4BB2381F08A\r
+:1002E000220F08F4AB9A542F5F77AD9AAB99019621\r
+:1002F0001197AD9829F05150C0F7AB986A9581F7E6\r
+:10030000AB9808952FE121BD27E121BD20E325BF52\r
+:1003100088950FEF0DBD00E00CBD00E808BF02E8B6\r
+:1003200009BF00E00EBB809B04C00FEF0DBD00E0D5\r
+:100330000CBDE4FE0FC0042D013060F400E000931A\r
+:10034000D3000FEEE0220E2D0F7000630A3308F089\r
+:10035000095F18D0222029F302E009BFCF93DF9371\r
+:10036000C12DCF56DD270881F8942A941394CFE34A\r
+:100370001C227894DF91CF9108950F93042D0130C2\r
+:10038000E8F70F91CF93DF93DFB7F894C42DC30D37\r
+:10039000DFBFC070C057DD2708834394DF91CF9142\r
+:1003A0000895FFB64F934EEC742EEF93FF93E32D19\r
+:1003B000E057FF274081FF91EF914CB94A94339465\r
+:1003C00040E034226A940AF046C04BC0FFB64F9317\r
+:1003D0004EEC742E4CB15C9938C057FC26C056FCCC\r
+:1003E00008C0453029F443E049B9539A40E4542AFF\r
+:1003F00038C0642E40E442190AF44FE7662012F434\r
+:10040000442D40684CB9461508F4642E462D4F77AC\r
+:1004100039F040EC542A6A9422F55798559A21C035\r
+:100420004FEB5422569A5E9A1CC0EF93FF93E22D35\r
+:10043000E10DEF73EF56FF274083FF91EF91239477\r
+:100440006A947AF40CC0FFB64F9353984FE549B9BC\r
+:100450004FEB5422772455985698579A4CB14FE752\r
+:1004600054224F91FFBE18950FED0DBF00E808B95B\r
+:10047000A8950FE001BD929A8A9A8C9A8D9A8E9ACD\r
+:100480008F9A8B9AA39AA59AB89AB99ABA9AA19A6E\r
+:1004900003E005BB00E002BB0FE509B900E90AB9BA\r
+:1004A000332444241124222455246624772471EC17\r
+:1004B00001E2E02E00E20093D10001E20093D200BD\r
+:1004C00003E0C02EBB2400E6A02E5AE160E004E069\r
+:1004D00003BF08EB02BF02E008BF09BF00E00FBD89\r
+:1004E00004E00EBD78942CD1E2E041D10C1729F440\r
+:1004F000E3953DD10D1771F0EA950CEA3FD1E395F4\r
+:100500000BEF3CD1E39501E039D1E39500E036D122\r
+:10051000E39534D10FEDE02200E00EBB809BFECFCF\r
+:100520008824726099240FEDE02200E00EBB082DB4\r
+:10053000003288F40B3119F1083191F3043149F09C\r
+:100540000E3029F00D30F9F0E4DE802EECCF7E7F06\r
+:10055000FBCF7160F9CF70FD07C0092D0932A8F4F7\r
+:10056000082D27D10068008300E208117D7F082D47\r
+:1005700020D100838824092D0A3278F4E5CF092D93\r
+:10058000013018F42FC08824716071FD24C000E28E\r
+:1005900010D10083092D0A32D0F371FD1CC00091E7\r
+:1005A00065000695069506950695069506950093B1\r
+:1005B00065000C2D043008F003E00295D02A786025\r
+:1005C00073FDFECF7F77CC2029F00C2D035008F06F\r
+:1005D000E6D07068A6CF07E077FF06E0E0D0DED077\r
+:1005E00070689FCF96DE0E3219F400E2E02A7FC0D9\r
+:1005F0000F3309F491C0013479F0023481F00334EF\r
+:1006000009F4C8C00A3419F10B34C9F1023579F084\r
+:10061000043549F17EDE84CF7CDEC02E81CF79DEC9\r
+:10062000002321F077FF0A95BAD0706879CF71DE88\r
+:10063000002349F01091D100802E7C6073FDFECF25\r
+:100640001051D0F777FD6CCF706801E0F3CF61DE19\r
+:100650000A950F70102F5DDE0A950F700295012B21\r
+:100660000093D2005DCF55DE0A950F70102F51DE3A\r
+:100670000A950F700295012B0093D10051CF49DEEE\r
+:10068000002E47DEC02F45DED02F0C2B002949F16C\r
+:1006900001E077FD84D0726099243BDE802E00E07B\r
+:1006A00008117D7F082D9FD0092D003348F40015D7\r
+:1006B000A0F371FD17C000E096D0092D0033D8F3E8\r
+:1006C00071FD10C0746072FDFECF21970C2F0D2BB1\r
+:1006D00011F77F77CC2029F00C2D015008F05FD066\r
+:1006E00070681ECF01E01091D2005BD0EECF11DE1A\r
+:1006F000E2E00FDE43D0E3950CDE40D0E39509DE67\r
+:10070000F02F3CD0E39505DE39D0E39502DE36D0FC\r
+:10071000E395FA95D9F704CFFCDD0BE12EDE0FE36C\r
+:100720002CDE00E32ADEE2E022D027DEE3951FD0B4\r
+:1007300024DEE3951CD021DEE39519D01EDEF0CE39\r
+:10074000E4E015D0F02FFE5FCFEFDFEF11E2012ED6\r
+:1007500010E10DD0D027E39508E0CC0FDD1F10F499\r
+:10076000C025D1270A95C9F7FA9599F70895E19917\r
+:10077000FECFF894EEBBE09A0DB31895E199FECF49\r
+:10078000F894E5FEFFCFEEBB0DBBE5FEFFCFE29A8E\r
+:10079000E19A1895706174FDFECFC2CE0C2D1091B8\r
+:1007A000D1000F930B0D0F91E0F3B00E1051C8F76D\r
+:1007B0000895C02FD0E0E6E0DADFF02FE395D7DF31\r
+:1007C0000C1729F0E55FD395FA95C9F7DC2FE92DD1\r
+:1007D000EA59D083E92DE695E695E695E05A93949B\r
+:1007E000008106950895E92DE05A008393940895B9\r
+:1007F0000000000000000000000000181818181881\r
+:100800000018000000E763C600000000000000665A\r
+:1008100066FF66FF66660000187EDBD87E1BDB7E07\r
+:10082000180000E3E60C183067C700000078CCD849\r
+:1008300073DECC7B0000003C0C18000000000000C0\r
+:10084000000C18303030180C00000030180C0C0C64\r
+:10085000183000000018DB7E3C7EDB180000000032\r
+:100860001818FF18180000000000000000003C0CE1\r
+:10087000180000000000FF00000000000000000061\r
+:1008800000003C3C00000003060C183060C0000073\r
+:10089000007EC7CFDBF3E37E0000000C1C3C0C0C99\r
+:1008A0000C0C0000007EC3030E3860FF0000007EC9\r
+:1008B000C3033E03C37E0000001C3C6CCCFF0C0C49\r
+:1008C000000000FFC0FE0303C37E0000003E60C0C6\r
+:1008D000FEC3C37E000000FF03060C1818180000BA\r
+:1008E000007EC3C37EC3C37E0000007EC3C37F03FC\r
+:1008F000067C000000003C3C003C3C000000000086\r
+:100900003C3C003C0C180000000C18306030180C07\r
+:100910000000000000FF00FF000000000030180C85\r
+:10092000060C18300000007EC3030E1800180000EB\r
+:10093000007EC3DBDBDFC07C0000003C66C3FFC37E\r
+:10094000C3C3000000FEC3C3FEC3C3FE0000007E9D\r
+:10095000C3C0C0C0C37E000000FCC6C3C3C3C6FC86\r
+:10096000000000FFC0C0FEC0C0FF000000FFC0C00C\r
+:10097000FEC0C0C00000007EC3C0C0CFC37F000067\r
+:1009800000C3C3C3FFC3C3C300000018181818185E\r
+:1009900018180000000303030303C37E000000C314\r
+:1009A000C6CCF8CCC6C3000000C0C0C0C0C0C0FFE9\r
+:1009B000000000C3E7FFDBC3C3C3000000C3E3F3D1\r
+:1009C000DBCFC7C30000007EC3C3C3C3C37E000028\r
+:1009D00000FEC3C3FEC0C0C00000007EC3C3C3C3CB\r
+:1009E000CF7E030000FEC3C3FECCC6C30000007E62\r
+:1009F000C3C07E03C37E000000FF18181818181823\r
+:100A0000000000C3C3C3C3C3C37E000000C3C3C38D\r
+:100A1000C3663C18000000C3C3C3C3DBFF6600000D\r
+:100A200000C3663C183C66C3000000C3C3663C18A4\r
+:100A30001818000000FF060C183060FF0000003C92\r
+:100A400030303030303C000000C06030180C0603FD\r
+:100A50000000003C0C0C0C0C0C3C0000183C66C365\r
+:100A600000000000000000000000000000FF000087\r
+:100A70000C181E000000000000000000007E037F34\r
+:100A8000C37F000000C0C0FEC3C3C3FE000000005F\r
+:100A9000007EC3C0C37E00000003037FC3C3C37FC7\r
+:100AA00000000000007EC3FFC07E0000001E333047\r
+:100AB000FC30303000000000007FC3C3C37F037EE2\r
+:100AC00000C0C0FEC3C3C3C300000018001818183C\r
+:100AD000181800000006000606060606067C00C080\r
+:100AE000C0C6CCF8CCC60000003030303030301CEE\r
+:100AF0000000000000FEDBDBDBDB0000000000FE8E\r
+:100B0000C3C3C3C300000000007EC3C3C37E000094\r
+:100B1000000000FEC3C3C3FEC0C00000007FC3C30B\r
+:100B2000C37F0303000000FEC3C0C0C0000000007C\r
+:100B3000007EC07E037E00000018187E1818180E74\r
+:100B40000000000000C3C3C3C37F0000000000C357\r
+:100B5000C3663C180000000000C3C3DBFF66000052\r
+:100B6000000000C3663C66C30000000000C3C3C3AE\r
+:100B7000C37F037E000000FF0C1830FF0000000E52\r
+:100B800018187018180E00000018181800181818F7\r
+:100B90000000007018180E18187000000076DC00B5\r
+:100BA000000000000000000000183C66C3FF0000C9\r
+:042000000541B2AC38\r
+:00000001FF\r
diff --git a/src/avr/product/TSV3.HEX b/src/avr/product/TSV3.HEX
new file mode 100644 (file)
index 0000000..0b6e310
--- /dev/null
@@ -0,0 +1,504 @@
+:020000020000FC\r
+:100000000DC006C606C6189505C61895189518950C\r
+:1000100002C602C61895EDC6D7C62EC702E00EBFAF\r
+:100020000FE50DBF10E818B9A8951FE011BD00E05D\r
+:1000300000935F01009360010093610100936201EE\r
+:10004000009363010093640101E000936501009354\r
+:10005000660104E10093670108E002BD03E005BD0D\r
+:1000600000E409BF00E00BBF08EB01BB02BB0FE1DE\r
+:1000700007BB0FEF0ABB04BB00270BBB03E008BBA9\r
+:1000800000E105BBC29AC2980093190100E2B02EAC\r
+:100090001FE519B910E91AB9442455242224332440\r
+:1000A000EE246624CC2458E15BBBC49AC4985093D8\r
+:1000B000170155275093180150933B0150936A0143\r
+:1000C00050936B0150931001DD24D0921401D09213\r
+:1000D0001501D092160154EF509369015BBB50910A\r
+:1000E000190155BBA89AC29AC298A898C29AC298F8\r
+:1000F0007894E2E0F9E1A2EEB0E0DBE1D0931A01FE\r
+:1001000008D1D0E8C0ECDBBBC39AC398D0931801E8\r
+:10011000C5BBC89500240BBAC198C0980000C09A0E\r
+:10012000C19AAA9541F03196C3951C2F1F7381F790\r
+:10013000C054D395E8CF10E3D9D2CF93DF93E4D264\r
+:10014000BF91AF915FD5212F1D2F129533D3121779\r
+:10015000B1F4119657D5212F1D2F2CD3121779F4F6\r
+:10016000119650D5212F1C2F129524D3121739F434\r
+:10017000119648D5212F1C2F1DD3121709F1E4EE3B\r
+:10018000F9E1A6E6B3E0D9E1D0931A01C2D0D0E0FC\r
+:10019000C0E4DBBBC39AC398D0931801C5BBC89514\r
+:1001A0000BBAC198C0980000C09AC19A119741F04B\r
+:1001B0003196C3951C2F1F7389F7C054D395E9CF8F\r
+:1001C00020E12093030120E42093040129E12093FE\r
+:1001D0000501C0E0D0E218E118D520E82F93CF93B5\r
+:1001E000DF9320E211D5269622E00ED5DF91CF9144\r
+:1001F0002F91C05CDF4F2A9589F7B4D610E0109399\r
+:10020000110116E31093100110E01093680110E043\r
+:1002100010934C0110934D011EEF10930D011CEA39\r
+:1002200010930C0122E020D21C7F10930E0123E0DA\r
+:100230001BD210930F0110910E0120910F011A3360\r
+:100240000DEF200720F01C3B0DEF200730F01DEFD5\r
+:1002500010930F0110E810930E011FEF19BD18E362\r
+:1002600018BD1CEF1DBD1EEC1CBD10E51FBD11E02F\r
+:100270001EBD00E003BF05E008BF05E409BF0AE0BA\r
+:1002800005BF00EC0ABF0BBF9EC202E00EBF0FE528\r
+:100290000DBF50E05FBD5EBD949A959850911701D7\r
+:1002A0005F7B5BBBC49AC4985093170154E7B6FEBA\r
+:1002B00054E3509369015BBB5091190155BBA89A57\r
+:1002C000C29AC298A898C29AC29851E459BF50E005\r
+:1002D00053BF5BBF04E000936A011FE519B910E941\r
+:1002E0001AB94424552422243324EE246624CC2431\r
+:1002F000F89403B700230AE411F4809B0AE705BFD2\r
+:1003000078948895A89500916A01002389F7F8945C\r
+:10031000A3CED0911A01C0911701C07EDC2BDBBBAC\r
+:10032000C49AC498D0931701089578941FEDE122E0\r
+:1003300010E01EBB1FBBE2D21B3159F1B3FC0DC054\r
+:10034000103258F4183009F407C11D3009F41CC1EB\r
+:100350001A3009F4C0C0173041F7B2FC18C010338E\r
+:10036000B1F4C0910301D091040120910501CC5F4B\r
+:10037000DD4FF894309117013227307E32273BBB96\r
+:10038000C49AC49878943093170193D5102DECD269\r
+:10039000CCCFB4D21B3109F31E3209F47CC11F3219\r
+:1003A00009F452C01F3309F491C1123409F45EC03C\r
+:1003B000123609F45FC0133409F40BC1133609F483\r
+:1003C000C4CC143409F4F2C0153409F4DFC0163477\r
+:1003D00009F40FC1163609F4C4CC173409F4A1C0CE\r
+:1003E000183409F4D6CC183609F4C7CC1B3409F4F8\r
+:1003F00096C01C3409F40AC41D3409F42EC01E34FE\r
+:1004000009F403C1103509F49AC0123509F4E3C0A8\r
+:10041000133509F4D9C0143509F440C0153509F471\r
+:100420006BC2163519F410E2E12AFBC0173509F446\r
+:1004300063C2183509F4C4C11A3509F4EEC110338A\r
+:1004400010F01A3310F171CF59D210FF03C014E02D\r
+:10045000B12A6BCF1BEFB12268CF50D2103329F4F1\r
+:10046000F89400E4B02A8A9A10CF5FCF47D21F9346\r
+:1004700010E004C043D21F9341D21F7010931101AA\r
+:100480001F911093100151CF39D230D1C0E1C093E8\r
+:100490000301D09304012093050147CF10E015BD5F\r
+:1004A00010935F01109360011093610127D21093A4\r
+:1004B000640124D21093630121D2109362011ED2F1\r
+:1004C000109366011BD21093650118D21093670137\r
+:1004D00013E015BD2ACF01D028CF0F92C0910301A0\r
+:1004E000D091040120910501DE5FC395F89430910D\r
+:1004F00017013227307E32273BBBC49AC4987894C8\r
+:1005000030931701D6D4182F100D100D1A951038EE\r
+:1005100018F0C0D00F900895800D0F90089522D547\r
+:1005200004CFECD1103309F404C0113309F404C032\r
+:10053000FCCE07EFB022F9CE08E0B02AF6CEDED12D\r
+:10054000103309F403C0113309F403C00FEEB022D5\r
+:10055000ECCE00E1B02AE9CEC0910301D0910401B4\r
+:1005600020910501DE5FF894309117013227307E2B\r
+:1005700032273BBBC49AC49878943093170199D41E\r
+:1005800070191FB712FFD1CE7727CFCEB7D111FD8B\r
+:1005900007C010FD03C00FEDB022C7CE00E2B02AA5\r
+:1005A000002700933B01EAD2F1F7BFCEA7D1103369\r
+:1005B00009F404C0113309F404C0B7CE0EEFB02221\r
+:1005C000B4CE01E0B02AB1CE99D1712F97D1812F4D\r
+:1005D000ACCE02E0B02A70935201809353018ED1C9\r
+:1005E000109354018BD11093550117D30DEFB02206\r
+:1005F0009CCE709356018093570180D1109358017F\r
+:100600007DD1109359015ED390CE709356018093A3\r
+:10061000570174D11093580171D11093590177D3B8\r
+:1006200084CE6CD110FF0BC010910E0120910F01F0\r
+:100630001C5F2F4F1C3B0DEF2007A8F40AC0109140\r
+:100640000E0120910F01145020401A330DEF2007A6\r
+:1006500050F010930E0120930F0122E00DD0109165\r
+:100660000F0123E009D061CEE199FECF2EBB2227F6\r
+:100670002FBBE09A1DB30895E199FECFE5FEFFCFB1\r
+:100680002EBB22272FBB1DBBF894E5FEFFCFE29ABD\r
+:10069000E19A189536C732D129D030D1A12F2ED169\r
+:1006A000B12F2CD1F894309117013227307E3227A8\r
+:1006B0003BBBC49AC498789430931701A4D2219676\r
+:1006C00011971A2F1B2B09F0ECCF2FCE17D10ED07C\r
+:1006D0001F931AD01BE133D11FE331D11F91105D5D\r
+:1006E0002ED11D2F60D01C2F5ED01FCEC0E0D0E0D9\r
+:1006F00024E61F701A3008F4210F2695D795269509\r
+:10070000D795D695D6950895A6E1B2E0AC0FBD1F5A\r
+:10071000F894309117013227307E32273BBBC49AC0\r
+:10072000C4987894309317016DD2E12F11966AD254\r
+:10073000F12FAC2FBD2F1496CFEFDFEF3197FF7065\r
+:10074000349780F131965ED2119601E220E1D127F3\r
+:10075000CC0FDD1F10F4C027D227CC0FDD1F10F403\r
+:10076000C027D227CC0FDD1F10F4C027D227CC0F13\r
+:10077000DD1F10F4C027D227CC0FDD1F10F4C027D7\r
+:10078000D227CC0FDD1F10F4C027D227CC0FDD1FDE\r
+:1007900010F4C027D227CC0FDD1F10F4C027D227BA\r
+:1007A000319789F608951F93129504D0C8D01F91F0\r
+:1007B00001D0C5C01F7010631A3308F0195F089587\r
+:1007C0009DD010FD13C070936C0180936D01B092A9\r
+:1007D0006E011091030110936F01109104011093A9\r
+:1007E000700110910501109371019FCD70916C0102\r
+:1007F00080916D0110ECB12210916E011F73B12A2E\r
+:1008000010916F0110930301109170011093040176\r
+:10081000109171011093050188CD70D010935A0189\r
+:100820006DD0C12F175F5DD020935B0167D0D12FB2\r
+:100830001C5F5CD020935C0161D01C0F1F5051D015\r
+:1008400020935D015BD01D0F115150D020935E01AC\r
+:10085000D0915C0110915E011D1B08F441C0C09154\r
+:100860005B011C2F1D0F2D2F220F220F220F120FA5\r
+:10087000220F120FA0E0B0EE20E0A10FB21F2BE17B\r
+:10088000F894309117013227307E32273BBBC49A4F\r
+:10089000C49878943093170110915D011C1BF0F0FF\r
+:1008A0003A2F3F7335BB3B2F330F330FA7FB31F983\r
+:1008B000A6FB30F93BBBF894C39AC3987894309365\r
+:1008C000180110915A011BBBF894C198C098000000\r
+:1008D000C09A7894C19A1196C395DECFD395BACFBA\r
+:1008E00024CD2FEF23951A50E8F708952FEF239585\r
+:1008F0001D50E8F7089502D001D017CD10EC1093E9\r
+:100900006B01A89510E01EBB1FBB10EC80991093E3\r
+:100910006B01B5FC33D13320A1F310E010936B01D0\r
+:10092000CF93DF93C22DC058DD271881F8943A94F5\r
+:100930002394CFE72C227894DF91CF9108951F93D1\r
+:10094000A895152D1032E0F71F91CF93DF93DFB7F5\r
+:10095000F894C52DC40DDFBFCF71C05ADD271883B1\r
+:100960005394DF91CF910895D2D0EFD00027009318\r
+:100970001201B4FC0FC0C0910301D0910401DE5FED\r
+:10098000F02C97D20F920F1808F4002406940092CE\r
+:1009900012010F90B3FC08C0072F000D28F4772731\r
+:1009A0009CDD10910501B9D600911201070F00934B\r
+:1009B0004E0180934F01700D60914E0190904F0158\r
+:1009C00086FE07C0C0915001D0915101229771D28B\r
+:1009D000900C87FE07C0C0915001D0915101239720\r
+:1009E00068D2600D5AD260930201A0920001C091BA\r
+:1009F0005001D091510121965CD2702C0FEF0ABBAF\r
+:100A0000C09A0FE18022809201010027801201C06C\r
+:100A10007DC0AA27B92DB695A795B695A795B05EC6\r
+:100A200007C09394A05CBF4F80900101A09000018B\r
+:100A3000AA2A22272196109105016FD63AD21127B2\r
+:100A400060910201662339F08894079417956A959E\r
+:100A5000E1F7022A212F08E1F8943091170130279D\r
+:100A6000307E30273BBBC49AC498789430931701EA\r
+:100A70003A2D3F7335BB3B2F330F330FA7FA31F9B4\r
+:100A8000A6FA30F93BBBF894C39AC3987894309394\r
+:100A9000180100270ABBF894C0980000C19809B358\r
+:100AA0000026B0FC002A0FEF0ABB0BBA0000C09A68\r
+:100AB0007894C19AA3948A9409F0BCCF222311F1AF\r
+:100AC0003A2D3F7335BB3B2F330F330FA7FA31F964\r
+:100AD000A6FA30F93BBBF894C39AC3987894309344\r
+:100AE000180100270ABBF894C0980000C19809B308\r
+:100AF0002027B0FC202B0FEF0ABB2BBB0000C09AB5\r
+:100B00007894C19A31D07A9409F08BCF0895C12F8F\r
+:100B1000DD27CC0FDD1F10910301C10F10910401DF\r
+:100B2000D11F10910501F9D5C4D12196F02CC1D166\r
+:100B3000CF2DD02D10910301C10F10910401D11FB1\r
+:100B4000C0935001D09351010895C0915001D091AC\r
+:100B50005101AFD1802C219785FCABC1C09103011D\r
+:100B6000D0910401DE5FA5C1CF93DF93192D39D059\r
+:100B70001881122B1883DF91CF9108952F93CF9373\r
+:100B8000DF9310913B012DD01881122309F41FC06F\r
+:100B900028812127288310E010936B01AF93BF9326\r
+:100BA000CC27D0913B01D695C795D695C795AC2F4C\r
+:100BB000BD2FB05E18E1B1D520E26CD51297269614\r
+:100BC00022E068D5BF91AF9110EC10936B011091AA\r
+:100BD0003B0113951F7710933B01DF91CF912F912C\r
+:100BE0000895CCE3D1E01F77212F269526952695F1\r
+:100BF000C20F20E0D21F21E0177019F0220F1A95C2\r
+:100C0000E9F7089554C56FC54CC587C597C48DCB0A\r
+:100C1000DFC1DFC18FC5E6C1C6C278949090530191\r
+:100C2000609152013AD160930201A092000170904C\r
+:100C30005501CC27D92DD695C795D695C795D05EA9\r
+:100C400018E16BD507C0C05CDF4F9394609102013F\r
+:100C5000A0900001AC2A1FEF8090540100E08016A4\r
+:100C600041F008E08016B8F0662319F016956A95F1\r
+:100C7000E9F73BD108E010910201011B801AA3940F\r
+:100C80001FEF08E0801638F0B1F02FD11FEF08E019\r
+:100C9000801AA394F6CF882079F016958A94E9F704\r
+:100CA0001095662341F02227169527956A95E1F75E\r
+:100CB0001CD1A394122F19D157DF7A9400277012F8\r
+:100CC000C2CF0895009158010A950230D0F30091E7\r
+:100CD00059010330B0F3009156010395009352017E\r
+:100CE0000091570100935301809058018A948A948F\r
+:100CF0008092540101E0009355018FDF009156016D\r
+:100D00000093520180905801809254013AC00091A2\r
+:100D100058010A950230A8F200915901033088F277\r
+:100D200000915601039500935201009157010093E1\r
+:100D30005301809058018A948A948092540101E072\r
+:100D4000009355016ADF0091560100935201009112\r
+:100D50005701039500935301709059017A947A9446\r
+:100D60007092550101E00093540157DF80905801C3\r
+:100D700000915601080D0A950093520101E000937D\r
+:100D8000540100915701039500935301709059014C\r
+:100D90007A947A947092550140DF00915601039540\r
+:100DA00000935201809058018A948A948092540151\r
+:100DB0007090590100915701070D0A950093530156\r
+:100DC00001E00093550129CF1FB60F930FEDC02E00\r
+:100DD000EF93FF93E42DE05AFF270081FF91EF91FD\r
+:100DE0000CB95A9443940FE140226A940AF04CC023\r
+:100DF00051C01FB60F930FEDC02E0CB15C993EC0D1\r
+:100E0000E7FC2CC0E6FC0EC0023031F403E009B967\r
+:100E1000539A00E4E02A3EC00A3A19F400E0009335\r
+:100E20006A0138C0602E00E803190AF40FE7662053\r
+:100E300012F4052D00680CB9061508F4602E062D75\r
+:100E40000F7739F000ECE02A6A9422F55798559A0A\r
+:100E500021C00FEBE022569A5E9A1CC0EF93FF93DD\r
+:100E6000E32DE20DEF77E058FF270083FF91EF912C\r
+:100E700033946A947AF40CC01FB60F9353980FE51D\r
+:100E800009B90FEBE022CC2455985698579A0CB12B\r
+:100E90000FE7E0220F911FBE1895AA2400EFA01AB9\r
+:100EA00067FFAA246F77685014F0A394FCCF685FA3\r
+:100EB00008953C2F3F7335BB3D2F330F330FC7FBD6\r
+:100EC00031F9C6FB30F93BBBF894C39AC3987894C8\r
+:100ED0003093180100270ABBF894C0980000C09A0C\r
+:100EE00009B278940FEF0ABB08953A2D3F7335BBD2\r
+:100EF0003D2F330F330FA7FA31F9A6FA30F93BBB78\r
+:100F0000F894C39AC39878943093180100270ABBC9\r
+:100F1000F894C0980000C09AF9B278940FEF0ABB19\r
+:100F2000B1FE03C01095F12203C0F126B0FCF12AF6\r
+:100F30003A2D3F7335BB3D2F330F330FA7FA31F9ED\r
+:100F4000A6FA30F93BBBF894C39AC39878943093CF\r
+:100F50001801FBBAF894C198C0980000C09A789420\r
+:100F6000C19A0895772788279924C0E0D0E218E134\r
+:100F7000D4D3AA24A0920001109100011C2B312F80\r
+:100F80003F7335BB3D2F330F330F17FB31F916FB82\r
+:100F900030F93BBBF894C39AC39878943093180106\r
+:100FA00000E00BBBF894C198C0980000C09A7894F8\r
+:100FB000C19AA39400E2A01619F0A0920001DCCF20\r
+:100FC000D3DD9394C05CDF4FD03409F0D2CF0895C5\r
+:100FD00018951FB68B9A4CB55DB550930901409397\r
+:100FE000080114C11FB65AB35F935BB35F9355B347\r
+:100FF0005F93509118015F935FEF5ABB50E75FBD5D\r
+:101000004CB55DB5485F5F4F5BBD4ABD59BD48BD3E\r
+:1010100040914C0150914D015170452B49F4509134\r
+:101020006B01539550936B0151F45FEBB5222DC9C1\r
+:1010300000000000000000000000000000008B9A8B\r
+:10104000939A55275EBD5DBD5CBD50914D01542BFB\r
+:1010500071F0509117015BBBC49ADD9ADD98C4987A\r
+:101060000000000000000000000000000EC05091D1\r
+:101070001701506850625BBBC49A40E654275BBBC3\r
+:101080005F775BBBC49850931701509117015F9332\r
+:10109000EF93FF93E0914C01F0914D01E05CFF4F25\r
+:1010A000FF713F933E2F3F7335BB3F2F330F330FFD\r
+:1010B000E7FB31F9E6FB30F93BBBC39AC398F093E9\r
+:1010C000180130911701F7FB31F9F6FB30F93BBB02\r
+:1010D000C49AC498309317013F91C198C19A9798C8\r
+:1010E00044274ABB40EC44BBC09855275BBD5ABD62\r
+:1010F00059E05EBDE0934C01F0934D01FF91EF91FB\r
+:101100005CE35A95F1F7C09A5FEF5ABB979A54BBCC\r
+:101110008D98959851E000005EBD5BE05A95F1F71F\r
+:1011200050910D0140910C018D9A859907C04A3369\r
+:101130009DEF590752F0415050400BC0453D9FEF85\r
+:1011400059071AF44F5F5F4F04C000000000000011\r
+:10115000000050930D0140930C015BBD4ABD4091CE\r
+:101160000C0150910D0190910E01491B90910F01BE\r
+:10117000590B1AF445ED5FEF04C04CEA5EEF000036\r
+:10118000000059BD48BD52E053BF5DEE52BF51E073\r
+:10119000509368015DEF5DBD54E35CBD8B989398FF\r
+:1011A00050EE5FBD21C01FB65AB35F935BB35F9330\r
+:1011B00055B35F93509118015F93509117015F935E\r
+:1011C000FF93EF930F925FEF5ABB509168015395D5\r
+:1011D000509368015A95E1F05A9511F15A9509F426\r
+:1011E00089C00F90EF91FF915F915BBBC49AC49847\r
+:1011F000509317015F915BBBC39AC398509318013A\r
+:101200005F9155BB5F915BBB5F915ABB1FBE189549\r
+:1012100053E053BF50EF52BF51E05093680153C1A8\r
+:1012200050911001552399F150911101505118F02E\r
+:10123000509311012CC0452F429554235093110116\r
+:101240004091190143FF10C0509110015A955093DD\r
+:101250001001A1F050911901577F546055BBC29AFB\r
+:10126000C2985093190113C05091190158605B7FC7\r
+:1012700055BBC29AC2985093190109C050911901E7\r
+:10128000577F5B7F55BBC29AC2985093190150910A\r
+:10129000690157FF06C050E8B5261AF4552753BF19\r
+:1012A000A0CF52E053BF52EF52BFEAE3F8E1552717\r
+:1012B000ED0DF51FC89554E3D51648F4509119016A\r
+:1012C0005F7E55BBC29AC2985093190108C05091D5\r
+:1012D0001901506155BBC29AC298509319010BBABB\r
+:1012E0000090190105BAA99AC29AC298A998C29AFF\r
+:1012F000C29877CF50B340EE4BBB4091190145BB2C\r
+:10130000A99AC29AC298A998C29AC298889456FD7E\r
+:1013100008C050911301552319F054E05093130164\r
+:1013200008944FB754E3D51660F44FBFE091150110\r
+:10133000F0911601EE1FFF1FE0931501F0931601C7\r
+:101340007BC04FBF08F078C050911301552321F0A6\r
+:1013500054E05093130170C0F0911601E091150113\r
+:1013600050911401552329F0452FF795E7954450E6\r
+:10137000E1F75C5FF795E79518F05433D0F35CC064\r
+:101380005093140144E3451BECE3F8E15527E40FC7\r
+:10139000F51FC895402D000C000C000C400D000CF2\r
+:1013A000400DECE3F8E15527ED0DF51FC895400D14\r
+:1013B000E0E0F0EE5527E40FF51F3F933E2F3F731B\r
+:1013C00035BB3F2F330F330FE7FB31F9E6FB30F925\r
+:1013D0003BBBC39AC398F093180130911701F7FBF8\r
+:1013E00031F9F6FB30F93BBBC49AC498309317012E\r
+:1013F0003F910F9300270ABBC0980000C09A09B222\r
+:101400000FEF0ABB0F91002029F4509114015433BF\r
+:1014100098F45EC054E0509313010092070156E324\r
+:1014200050931001552D5F3138F41F93102D8DDA34\r
+:101430001B3109F48ADA1F9154E0D50E50916901ED\r
+:1014400057FD27C053E053BF50EF52BF51E05093B8\r
+:10145000680144E3D416E8F250E053BF50911601FE\r
+:1014600040911501452B50916A01543018F45130C8\r
+:1014700028F4B7CE442329F055E003C0442309F4EF\r
+:1014800054E05A9550936A01A1F75FEBB5228A9810\r
+:10149000CECD50E053BF5093140148ECD416C0F0A9\r
+:1014A00050911301552379F05A955093130159F433\r
+:1014B00050910701552339F0552D503220F41F93D8\r
+:1014C00010E043DA1F91DD24D0921501D09216016D\r
+:1014D000EAE3F8E131965527ED0DF51FC8955091D7\r
+:1014E0006901507850645029509369015BBB509159\r
+:1014F000190155BBA89AC29AC298A898C29AC298D4\r
+:1015000070CE9924C0E0D0E2A0E0B0E218E105D1AD\r
+:10151000A05CBF4F0A94E1F720E22F93C8D0E3D03C\r
+:10152000A395C3952F912A9509F0F7CF1DDB9394CE\r
+:10153000A0969096B03409F0EFCF1BCDDFD91F9362\r
+:10154000DDD910937201DAD916951695169509F41E\r
+:1015500010E210937501D2D910937601172F1695CA\r
+:1015600016951695109373018093740118E1D5D0E8\r
+:101570001F9110FD46C0CC27D09174019D2ED695A9\r
+:10158000C795D695C79510917301C10FD05E209174\r
+:10159000760110917201121720F5211BAA27B09134\r
+:1015A0007401B10FB695A795B695A79510917301E3\r
+:1015B000A10FB05E2F93AF93BF93CF93DF93209192\r
+:1015C000750168D0D1DADF91CF91BF91AF912F91A2\r
+:1015D0009394A05CBF4FC05CDF4F2A9559F72091D0\r
+:1015E00072012F93CF93DF93209175015AD0BCDA0B\r
+:1015F000DF91CF912F919394C05CDF4F2A9589F7AB\r
+:1016000006CBCC27D091740100917601D00F9D2E8E\r
+:10161000D695C795D695C79510917301C10FD05E29\r
+:10162000202F10917201121728F5211BAA27B091C3\r
+:101630007401B00FB11BB695A795B695A7951091FB\r
+:101640007301A10FB05E9A94A054B040C054D04032\r
+:101650002F93AF93BF93CF93DF93209175011AD04F\r
+:1016600083DADF91CF91BF91AF912F912A9559F7EE\r
+:10167000209172019A94C054D0402F93CF93DF935E\r
+:10168000209175010ED070DADF91CF912F912A95BC\r
+:1016900089F7BDCA0CD0119626D021962A95D1F78C\r
+:1016A000089510E020D021962A95E1F708953A2F69\r
+:1016B0003F7335BB3B2F330F330FA7FB31F9A6FB2D\r
+:1016C00030F93BBBF894C39AC398789430931801CF\r
+:1016D00000270ABBF894C0980000C09A19B3789408\r
+:1016E0000FEF0ABB08953C2F3F7335BB3D2F330FDF\r
+:1016F000330FC7FB31F9C6FB30F93BBBF894C39AF3\r
+:10170000C3987894309318011BBBF894C198C09883\r
+:101710000000C09A7894C19A0895F8943091170106\r
+:101720003127307E31273BBBC49AC49878943093DC\r
+:10173000170108951FB650915F015C5550935F01EA\r
+:10174000509160015F4F5093600150916101564E7E\r
+:10175000543650F4509361011FBEB6FE189550E008\r
+:101760005093680120CDF1C850E050936101509131\r
+:10177000620153955C33E8F15091630153955C33FA\r
+:10178000A8F1509164015395583168F1EF93FF939C\r
+:101790000F92EDE2F8E190916601E90F90E0F91FF8\r
+:1017A000C895902D9C3131F49091670193709CE124\r
+:1017B00009F49DE10F90FF91EF9150916501591748\r
+:1017C00070F0509166015C3030F050916701539594\r
+:1017D00050936701552753955093660155275395AC\r
+:1017E0005093650155275093640155275093630129\r
+:1017F000552750936201552D5931C0F41F931BE1B9\r
+:10180000A4D814E5A2D810916401ADDF1091630152\r
+:10181000AADF10916201A7DF10916601A4DF109189\r
+:101820006501A1DF109167019EDF1F9195CF1F1CFD\r
+:101830001F1E1F1E1F1F1E1F1E1FF0340000E83436\r
+:101840000100F0330100E8330200E4330300E83222\r
+:101850000300E4320400E2320500E4310500E23125\r
+:101860000600E1310700E2300700E1300800C12A3C\r
+:101870000000C22A0100C12B0100C22B0200C42BB0\r
+:101880000300C22C0300C42C0400C82C0500C4189B\r
+:101890000500C8180600D0180700C8190700D0199D\r
+:1018A0000800A1190900D01A0900A11A0A00A21AF9\r
+:1018B0000B00A11B0B00A21B0C00A41B0D00A21C03\r
+:1018C0000D00A41C0E00A81C0F00A41D0F00A81DD5\r
+:1018D0001000B01D1100A81E1100B01E1200611EE4\r
+:1018E0001300B01F1300611F1400621F1500612850\r
+:1018F0001500622816006428170062291700642961\r
+:1019000018000000000000000000000000000000BF\r
+:1019100000000000000000000808080000000000AF\r
+:1019200000000000000000000000000000000000B7\r
+:10193000000000007E00310032003300340035002A\r
+:10194000360037003800390030002D003D0000001F\r
+:101950000000000000000000000000000000000087\r
+:1019600000000000000051005700450052005400E4\r
+:101970005900550049004F0050005B005D005C00BD\r
+:101980000000000000000000000000000000000057\r
+:101990000000000000000000410053004400460029\r
+:1019A000470048004A004B004C003B0027000D0D4B\r
+:1019B0000D0000000000000000000000000000001A\r
+:1019C0000000000000000000000000005A00580065\r
+:1019D0004300560042004E004D002C002E002F0008\r
+:1019E0000000000046323444303331393033313274\r
+:1019F000313730394C034C034C034C034C034C033C\r
+:101A00004C034C034C034C034C034C034C034C035E\r
+:101A10004C034C034C034C034C034C034C034C034E\r
+:101A20004C034C034C034C034C034C034C034C033E\r
+:101A30004C034C0300014C034C034C034C034C037C\r
+:101A40004C034C034C034C034C034C034C03030169\r
+:101A50004C034C0306010F01180121012A01330137\r
+:101A60003C0145014E0157014C034C034C034C0310\r
+:101A70004C034C034C036001690172017B0184013A\r
+:101A80008D0196019F01A901B201BB01C401CD01E5\r
+:101A9000D601DF01E801F101080211021A02230256\r
+:101AA0002C0235023E02470250024C034C034C0309\r
+:101AB0004C034C034C03590262026B0274027D0218\r
+:101AC00086028F029902A302AD02B802C202CB02C3\r
+:101AD000D402DD02E602F002FC0203030C0315034C\r
+:101AE0001E0327033003390343034C034C034C0309\r
+:101AF0004C034C030003066101F80107708898A8A5\r
+:101B0000C88870010720602020202070010770889D\r
+:101B100008102040F80107F810201008887001070D\r
+:101B200010305090F810100107F880F00808887005\r
+:101B30000107304080F08888700107F808102040C5\r
+:101B40004040010770888870888870010770888815\r
+:101B500078081060010770888888F888880107F085\r
+:101B60008888F08888F001077088808080887001FC\r
+:101B700007E09088888890E00107F88080F08080F6\r
+:101B8000F80107F88080F08080800107708880B8B5\r
+:101B90008888780107888888F888888802210780E3\r
+:101BA000808080808080010708080808088870010C\r
+:101BB000078890A0C0A090880107808080808080E6\r
+:101BC000F8010788D8A8A888888801078888C8A845\r
+:101BD0009888880107708888888888700107F0884D\r
+:101BE00088F0808080010770888888A890684C03FE\r
+:101BF0004C034C03060801014F0065030107F08800\r
+:101C000088F0A090880107708880700888700107AC\r
+:101C1000F820202020202001078888888888887064\r
+:101C20000107888888888850200107888888A8A8A4\r
+:101C3000A850010788885020508888010788888824\r
+:101C4000502020200107F80810204080F8010700EC\r
+:101C500000700878887801078080F0888888F00113\r
+:101C600007000078808080780107080878888888D5\r
+:101C700078010700007088F8807001071820F820AC\r
+:101C800020202001080000788888780870010780EB\r
+:101C900080B0C8888888022107800080808080808A\r
+:101CA0000521081000101010109060052107808099\r
+:101CB00090A0C0A090032107C04040404040400198\r
+:101CC000070000F0A8A8A8A801070000B0C88888ED\r
+:101CD0008801070000708888887001080000F0887B\r
+:101CE00088F080800108000078888878080802055C\r
+:101CF0006105B0C08080800107000078807008F026\r
+:101D000001072020F820202018010700008888887B\r
+:101D10009868010700008888885020010700008823\r
+:101D200088A8A850010700008850205088010800AA\r
+:101D30000088888878087001070000F8102040F8B3\r
+:101D40000107F8F8F8F8F8F8F80070935601809356\r
+:101D50005701D4D510935801D1D51093590126D0ED\r
+:101D6000E4C27093560180935701C8D5109358016F\r
+:101D7000C5D5109359012FD0D8C2709352018093CA\r
+:101D80005301BCD510935401B9D51093550178D0A7\r
+:101D9000CCC27093520180935301B0D5109354017B\r
+:101DA000ADD51093550171D0C0C208950091560170\r
+:101DB0000093520100915701009353010091580183\r
+:101DC00000935401009159010093550102E0B02A9B\r
+:101DD00024D70DEFB022009158010A95023028F364\r
+:101DE00000915901033008F300915601009352010C\r
+:101DF0000091570100935301009158010093540141\r
+:101E000001E00093550109D700915601009352015A\r
+:101E1000009157010395009353010091590102501D\r
+:101E20000093550101E000935401F7D680905801CA\r
+:101E300000915601080D0A950093520101E00093AC\r
+:101E400054010091570103950093530100915901EA\r
+:101E5000025000935501E1D60091560100935201C2\r
+:101E6000009158010093540170905901009157015D\r
+:101E7000070D0A950093530101E000935501CDC66B\r
+:101E800002E0B02ACAD60DEFB022789490905301A8\r
+:101E90006091520102D860930201A09200017090FB\r
+:101EA0005501CC27D92D15E5D0FF1AEA012ED6957C\r
+:101EB000C795D695C795D05E18E12FDC07C0C05CEA\r
+:101EC000DF4F939460910201A0900001AC2A1FEFB4\r
+:101ED0008090540100E0801641F008E08016C8F0C0\r
+:101EE000662319F016956A95E9F71021FED708E0E8\r
+:101EF00010910201011B801AA3941FEF08E08016C5\r
+:101F000040F0C1F01021F1D71FEF08E0801AA39430\r
+:101F1000F5CF882089F016958A94E9F71095662305\r
+:101F200049F02227169527956A95E1F71021DDD70C\r
+:101F3000A394122F1021D9D7009416D67A94002793\r
+:061F40007012BDCF0895F0\r
+:0220000002419B\r
+:00000001FF\r
diff --git a/src/avr/product/WPO15V1.HEX b/src/avr/product/WPO15V1.HEX
new file mode 100644 (file)
index 0000000..4f579fb
--- /dev/null
@@ -0,0 +1,132 @@
+:020000020000FC\r
+:020000000EC030\r
+:06001200DCC1A3C270C1B5\r
+:10001C0064C302E00EBF0FE50DBF00E808B9A89558\r
+:10002C000FE001BD0AE50093CC0000E00DB90AB960\r
+:10003C000FEF04BBC79ABE9AD79A8E9A929A939A4C\r
+:10004C00959A8D9ADE98D69897988F9A94988C9AC0\r
+:10005C00C398BB9A9198899A07E00DD106E00BD111\r
+:10006C0005E009D104E007D101E005D100E003D19E\r
+:10007C000FE509B908E10AB92AD10AEA0CB90CB999\r
+:10008C0029D1949A27D1949825D1949A0027E0E607\r
+:10009C00FF27019301930193EFEB019301930193DC\r
+:1000AC00019301930193019301930093BC0000937E\r
+:1000BC00CA000093BD000093BE0000E4008300E082\r
+:1000CC000093C80004E00093C9004427662711245C\r
+:1000DC0088249924AA2455246624772402E00093CA\r
+:1000EC00B70001E00093B3000093B4000093B50097\r
+:1000FC000093B6000093B8000093B9000093CB00B6\r
+:10010C0000E00093BA000093BB0000EF202E00EF3C\r
+:10011C00402E02E003BF01E009BF0EB10FB108EEA3\r
+:10012C000DB900E00DBD0CBD0BBD0ABD01EC0FBD42\r
+:10013C0001E00EBD05E007B90EED06B9789402E0BA\r
+:10014C001EE1E2E6F7E0A8D00091CC000A3509F0F8\r
+:10015C0066C041FD6FC043FD7AC040FFF5CF0091F2\r
+:10016C00CB00033041F0023091F002E01FE0EEE9E9\r
+:10017C00F7E092D006C002E01FE0EEEDF7E08CD085\r
+:10018C0000C003E01EE1E0E8F7E086D00FC002E01B\r
+:10019C001CE0EEEAF7E080D003E01EE1E2E6F7E0D7\r
+:1001AC007BD003E01CE0EEEAF7E076D01CD00B31FC\r
+:1001BC0009F0FCCF18D0043409F0F8CF14D0037038\r
+:1001CC0039F0013039F0023039F0033039F0EECF2C\r
+:1001DC00969A05C0969803C0DF9A01C0DF9810E389\r
+:1001EC00100FE4CF78940091CC000A35C1F441FD96\r
+:1001FC0021C043FD2CC0F8949920A1F30091B300C9\r
+:10020C00093081F7EF93FF93E82DED59FF2700811B\r
+:10021C009A948394EFE38E22FF91EF91189502E06C\r
+:10022C001EE1E2E6F7E038D002E01FE0EEEEF7E088\r
+:10023C0033D00AC002E01EE1E2E6F7E02DD002E086\r
+:10024C001FE0EAEBF7E028D043FD01C0FDCF02E050\r
+:10025C001EE1E2E6F7E020D002E01FE0EAECF7E076\r
+:10026C001BD00AEF37D00A95E9F702E013E0EAED6C\r
+:10027C00F7E012D0F6CFC39802FF919802FD919A45\r
+:10028C0029D001FF919801FD919A26D000FF9198F9\r
+:10029C0000FD919AC39A22C078940000F894AA2089\r
+:1002AC00D9F70093B400C895002D04D031961A9557\r
+:1002BC00D1F71895EF93FF93E92DEA0DE80DEF7345\r
+:1002CC00ED59FF270083FF91EF91A3940895E0EF80\r
+:1002DC00FAE006C0E8EC03C0E4E101C0E2E0F0E0C3\r
+:1002EC0020E02A95F1F73197E1F70895FFB666FD06\r
+:1002FC0022C03CB13125F2F0312552F0EF93FF933F\r
+:10030C00EEEBF091B300EF0FFF273083FF91EF91ED\r
+:10031C00131608F0132E6F7E6064312D3F7741F079\r
+:10032C0011202AF157986F7D3FEF232E606146C054\r
+:10033C0038EF40C03EC03091B600313019F031E09A\r
+:10034C003093BB003CB1EF93FF93E62DE70DE50D29\r
+:10035C00EF70ED55FF273083E091B500F091B600BA\r
+:10036C00EF1711F4639401C07394FF91EF913FEF79\r
+:10037C00232E1A940AF530EF232E60611FC0EF93E1\r
+:10038C00FF93EEEBF091B300EF0FFF2730813A951E\r
+:10039C003083E82DED59FF273081FF91EF913CB967\r
+:1003AC003FEF232E9A9483943FE383221A9431F4E3\r
+:1003BC0003C030EF232E6F7E57986F79FFBE1895D0\r
+:1003CC00FFB63091BD007091BE00732B49F03150D7\r
+:1003DC003093BD003091BE0030403093BE0091F0A0\r
+:1003EC00442051F0439441F430E03DB93EB13FB16B\r
+:1003FC0038EE3DB9D69A687F222011F02394B9F0DB\r
+:10040C00FFBE189506CE67FD18C0890C3FE383220A\r
+:10041C0099249092BA00EF93FF93EEEBF091B30016\r
+:10042C00EF0FFF2730E43083FF91EF9106C065FD9D\r
+:10043C00EACF66FDA4CF64FD7AC038EF232E30914D\r
+:10044C00BC00332359F03A953093BC0031F0C3987B\r
+:10045C009198899A30E03AB9B1CFDBCD57983FE506\r
+:10046C0039B93091BA0039293A2939F43091B800A8\r
+:10047C003A9549F03093B80037C03091B9003A95AD\r
+:10048C0091F03093B90030E13093B800992030915D\r
+:10049C00B30041F4AA2041F09A2CAA243091B40064\r
+:1004AC003093B300393001F16F779920B9F4AA2059\r
+:1004BC0059F43091BA003A9542F43091B300339527\r
+:1004CC00393048F031E007C031E03093BA009A2C53\r
+:1004DC00AA243091B4003093B30025C031E030939E\r
+:1004EC00BA003091B3001FC030E13093B90060689E\r
+:1004FC003091BB00332331F03A953093BB003091EF\r
+:10050C00B60011C03091B600772069F47091B70035\r
+:10051C003093B700372F313021F03395393008F054\r
+:10052C0032E03093B6003CB960616F7947CF30EF61\r
+:10053C00232E33E039B9392D67FF04C030E1361969\r
+:10054C00371930683CB9132E579A3CB1606236CFDC\r
+:10055C00FFB6D6983FB162FD8EC060FD5EC061FDF6\r
+:10056C0057C03A3090F1303899F0313899F0313930\r
+:10057C00A1F0323991F0333981F0353A99F03A3AA9\r
+:10058C00E1F0353CD9F030E03DB944244260A3C0E1\r
+:10059C0097989FC04160979A9CC030593093CB007C\r
+:1005AC00416097C03FEF3093BC0030E03DB9949868\r
+:1005BC003FEF70E07BBD3ABD8CC02BCD38EE309355\r
+:1005CC00BD0033E03093BE0084C0332379F46860FF\r
+:1005DC00662049F47720C1F0672C77243090B60060\r
+:1005EC003092B50012C03090B5000FC0677F332E2B\r
+:1005FC00AA2021F03091B400331531F431E030935E\r
+:10060C00BA003092B40001C033243FB8626061C0BC\r
+:10061C006D7F332009F061605CC0332E6E7F332018\r
+:10062C0063FF05C05AF5362D30681FC051C0F2F378\r
+:10063C00EF93FF93EEEBF091B400EF0FFF273081B7\r
+:10064C00E091B300F091B400EF1731F0E0E4E91958\r
+:10065C003E1730F03E2F04C0303408F030E4391926\r
+:10066C003A19FF91EF910AF43FE7331508F4332E52\r
+:10067C003FB964602EC033208AF43A944AF5616025\r
+:10068C00EF93FF93E52DED55FF2730813FB9FF9197\r
+:10069C00EF916A9453943FE053221BC060FF14C047\r
+:1006AC00EF93FF93E92DEA0DE80DEF73ED59FF275A\r
+:1006BC003083E091B300F091B400EF1711F49394F0\r
+:1006CC0001C0A394FF91EF913A9412F0616001C0C4\r
+:1006DC006B7F30EF432EFFBE1895FFB6A89534B153\r
+:1006EC00532F35B1379557953795579544FD12C013\r
+:1006FC0040613091BC00332331F530E070E05C5147\r
+:10070C0000F130E670E05038E0F45695352F5695F0\r
+:10071C00350F17C04F7E5093CA00583A30E074E042\r
+:10072C0058F43091C8007091C9003150704021F4D8\r
+:10073C0030E03DB9442448603093C8007093C90040\r
+:10074C0002C07BBD3ABD34E044FF35E037B93EED25\r
+:10075C0036B9FFBE18951B44301B47301B50311B5C\r
+:10076C0045301B4B1B301B2F301B5300001B4E0006\r
+:10077C00801B45311B44301B47301B50311B45300F\r
+:10078C001B4B1B301B2F301B5300001B4EF0401B10\r
+:10079C0045311B53100D48595445434820313030D6\r
+:1007AC0030001B53100D57504F33302056351B5310\r
+:1007BC00100D42414420434F4D4D414E44001B53BC\r
+:1007CC00100D42415454455259204C4F57001B4D6B\r
+:1007DC0030001B53100D48595445434820313530D7\r
+:1007EC0030001B53100D535441434B204F56455270\r
+:0407FC00464C4F57C1\r
+:042000000041BFAC30\r
+:00000001FF\r
diff --git a/src/avr/product/WPOV0.HEX b/src/avr/product/WPOV0.HEX
new file mode 100644 (file)
index 0000000..ef6e47f
--- /dev/null
@@ -0,0 +1,135 @@
+:020000020000FC\r
+:020000000BC033\r
+:06000C00DBC1A2C26DC1C0\r
+:1000160063C30FED0DBF00E808B9A8950FE001BD59\r
+:100026000AE50093CD0000E00DB90AB9C59ABC9A5D\r
+:100036008D9A8E9AAC9A929A939AC19AB99AC098C6\r
+:10004600B89897988F9A94988C9AAA98A29A919809\r
+:10005600899A07E00CD106E00AD105E008D104E050\r
+:1000660006D101E004D100E002D10FE809B908E1A8\r
+:100076000AB929D10AEA0CB90CB928D1949A0027F1\r
+:10008600E0E6FF27019301930193EFEB01930193C0\r
+:100096000193019301930193019301930093BC0093\r
+:1000A6000093CB000093BD000093BE0000E40083E4\r
+:1000B60000E00093C80004E00093C90000E100934B\r
+:1000C600CA0044276627112488249924AA24552483\r
+:1000D6006624772402E00093B70001E00093B300A2\r
+:1000E6000093B4000093B5000093B6000093B800E7\r
+:1000F6000093B9000093CC0000E00093BA0000938F\r
+:10010600BB0007EE202E07EE402E02E003BF02E002\r
+:1001160009BF0EB10FB108EE0DB900E00DBD0CBD63\r
+:100126000BBD0ABD01EC0FBD01E00EBD05E007B930\r
+:100136000EED06B9789402E01EE1EEE8F7E0A8D0ED\r
+:100146000091CD000A3509F066C041FD6FC043FD40\r
+:100156007AC040FFF5CF0091CC00033041F0023069\r
+:1001660091F002E01FE0EAECF7E092D006C002E070\r
+:100176001FE0EAE0F8E08CD000C003E01EE1ECEA04\r
+:10018600F7E086D00FC002E01CE0EAEDF7E080D091\r
+:1001960003E01EE1EEE8F7E07BD003E01CE0EAEDC9\r
+:1001A600F7E076D01CD00B3109F0FCCF18D0043420\r
+:1001B60009F0F8CF14D0037039F0013039F002306D\r
+:1001C60039F0033039F0EECF969A05C0969803C001\r
+:1001D600959A01C0959810E3100FE4CF789400919A\r
+:1001E600CD000A35C1F441FD21C043FD2CC0F89471\r
+:1001F6009920A1F30091B300093081F7EF93FF93A3\r
+:10020600E82DED59FF2700819A948394EFE38E221F\r
+:10021600FF91EF91189502E01EE1EEE8F7E038D085\r
+:1002260002E01FE0EAE1F8E033D00AC002E01EE196\r
+:10023600EEE8F7E02DD002E01FE0E6EEF7E028D08A\r
+:1002460043FD01C0FDCF02E01EE1EEE8F7E020D05D\r
+:1002560002E01FE0E6EFF7E01BD00AEF37D00A9581\r
+:10026600E9F702E013E0E6E0F8E012D0F6CFAA984C\r
+:1002760002FF919802FD919A29D001FF919801FD04\r
+:10028600919A27D000FF919800FD919AAA9A23C0CF\r
+:1002960078940000F894AA20D9F70093B400C89582\r
+:1002A600002D04D031961A95D1F71895EF93FF9348\r
+:1002B600E92DEA0DE80DEF73ED59FF270083FF9155\r
+:1002C600EF91A3940895ECEDFFE007C0E2E2F1E0C0\r
+:1002D60004C0EDE101C0E3E0F0E020E02A95F1F78B\r
+:1002E6003197E1F70895FFB666FD22C03CB131258E\r
+:1002F600F2F0312552F0EF93FF93EEEBF091B3005D\r
+:10030600EF0FFF273083FF91EF91131608F0132E9E\r
+:100316006F7E6064312D3F7741F011202AF15798A6\r
+:100326006F7D3FEF232E606148C033EF42C040C06F\r
+:100336003091B600313019F031E03093BB003CB15A\r
+:10034600EF93FF93E62DE70DE50DEF70ED55FF27D3\r
+:100356003083E091B500F091B600EF1711F4639485\r
+:1003660001C07394FF91EF913EEF232E1A941AF574\r
+:1003760037EE232E606121C0EF93FF93EEEBF091F1\r
+:10038600B300EF0FFF2730813A953083E82DED5902\r
+:10039600FF273081FF91EF913CB93695330B3A95A3\r
+:1003A600232E9A9483943FE383221A9431F403C054\r
+:1003B60037EE232E6F7E57986F79FFBE1895FFB6DE\r
+:1003C6003091BD007091BE00732B49F031503093CF\r
+:1003D600BD003091BE0030403093BE0091F0442005\r
+:1003E60051F0439441F430E03DB93EB13FB138EEAF\r
+:1003F6003DB9B89A687F222011F02394B9F0FFBE68\r
+:10040600189507CE67FD18C0890C3FE3832299240F\r
+:100416009092BA00EF93FF93EEEBF091B300EF0FDB\r
+:10042600FF2730E43083FF91EF9106C065FDEACFE8\r
+:1004360066FDA2CF64FD7AC033EF232E3091BC0057\r
+:10044600332359F03A953093BC0031F0AA9891982D\r
+:10045600899A30E03AB9B1CFDCCD57983FE839B93F\r
+:100466003091BA0039293A2939F43091B8003A95D1\r
+:1004760049F03093B80037C03091B9003A9591F001\r
+:100486003093B90030E13093B80099203091B30031\r
+:1004960041F4AA2041F09A2CAA243091B40030935A\r
+:1004A600B300393001F16F779920B9F4AA2059F4D5\r
+:1004B6003091BA003A9542F43091B3003395393011\r
+:1004C60048F031E007C031E03093BA009A2CAA24F4\r
+:1004D6003091B4003093B30025C031E03093BA00B8\r
+:1004E6003091B3001FC030E13093B900606830919D\r
+:1004F600BB00332331F03A953093BB003091B60000\r
+:1005060011C03091B600772069F47091B70030932E\r
+:10051600B700372F313021F03395393008F032E00B\r
+:100526003093B6003CB960616F7947CF37EE232E22\r
+:1005360035E039B9392D67FF04C030E1361937196E\r
+:1005460030683CB9132E579A3CB1606236CFFFB67D\r
+:10055600B8983FB162FD8EC060FD5EC061FD57C0B8\r
+:100566003A3090F1303899F0313899F03139A1F0BC\r
+:10057600323991F0333981F0353A99F03A3AE1F06F\r
+:10058600353CD9F030E03DB944244260A3C0979889\r
+:100596009FC04160979A9CC030593093CC0041600F\r
+:1005A60097C03FEF3093BC0030E03DB994983FEFE1\r
+:1005B60070E07BBD3ABD8CC02CCD38EE3093BD00CB\r
+:1005C60033E03093BE0084C0332379F4686066203C\r
+:1005D60049F47720C1F0672C77243090B60030922A\r
+:1005E600B50012C03090B5000FC0677F332EAA2029\r
+:1005F60021F03091B400331531F431E03093BA0074\r
+:100606003092B40001C033243FB8626061C06D7F90\r
+:10061600332009F061605CC0332E6E7F332063FFA8\r
+:1006260005C05AF5362D30681FC051C0F2F3EF935E\r
+:10063600FF93EEEBF091B400EF0FFF273081E091CE\r
+:10064600B300F091B400EF1731F0E0E4E9193E177A\r
+:1006560030F03E2F04C0303408F030E439193A192E\r
+:10066600FF91EF910AF43FE7331508F4332E3FB9B3\r
+:1006760064602EC033208AF43A944AF56160EF93A1\r
+:10068600FF93E52DED55FF2730813FB9FF91EF919F\r
+:100696006A9453943FE053221BC060FF14C0EF934B\r
+:1006A600FF93E92DEA0DE80DEF73ED59FF2730832F\r
+:1006B600E091B300F091B400EF1711F4939401C0E8\r
+:1006C600A394FF91EF913A9412F0616001C06B7FA1\r
+:1006D60037EE432EFFBE1895FFB6A89534B1532FBB\r
+:1006E60035B1379557953795579544FD12C04061FA\r
+:1006F6003091BC003323C9F430E070E05C51C0F1A6\r
+:1007060030E670E05038A0F55695352F5695350FE2\r
+:100716002FC04F7E45FD0DC0583F40F03091CA00B6\r
+:100726003A953093CA0031F5406224C030E13093E7\r
+:10073600CA005093CB00593330E074E058F0309142\r
+:10074600C8007091C9003150704021F430E03DB9C5\r
+:10075600442448603093C8007093C900563450F062\r
+:100766003FEF3093BC0030E03DB994983FEF70E026\r
+:100776007BBD3ABD35E445FF34E044FF35E037B98B\r
+:100786003EED36B9FFBE18951B44301B47301B5053\r
+:10079600311B45301B4B1B301B2F301B5300001BDE\r
+:1007A6004E00801B45311B44301B47301B50311B0C\r
+:1007B60045301B4B1B301B2F301B5300001B4EF0CC\r
+:1007C600401B45311B53100D4859544543482031B1\r
+:1007D600303030001B53100D57504F3330205635F4\r
+:1007E6001B53100D42414420434F4D4D414E440092\r
+:1007F6001B53100D42415454455259204C4F57003B\r
+:100806001B4D30001B53100D4859544543482031A9\r
+:10081600353030001B53100D535441434B204F5677\r
+:060826004552464C4F57FD\r
+:042000000041B4AC3B\r
+:00000001FF\r
diff --git a/src/avr/product/WPOV1.HEX b/src/avr/product/WPOV1.HEX
new file mode 100644 (file)
index 0000000..52ed13d
--- /dev/null
@@ -0,0 +1,135 @@
+:020000020000FC\r
+:020000000BC033\r
+:06000C00DBC1A2C26DC1C0\r
+:1000160063C30FED0DBF00E808B9A8950FE001BD59\r
+:100026000AE50093CD0000E00DB90AB9C59ABC9A5D\r
+:100036008D9A8E9AAC9A929A939AC19AB99AC098C6\r
+:10004600B89897988F9A94988C9AAA98A29A919809\r
+:10005600899A07E00CD106E00AD105E008D104E050\r
+:1000660006D101E004D100E002D10FE809B908E1A8\r
+:100076000AB929D10AEA0CB90CB928D1949A0027F1\r
+:10008600E0E6FF27019301930193EFEB01930193C0\r
+:100096000193019301930193019301930093BC0093\r
+:1000A6000093CB000093BD000093BE0000E40083E4\r
+:1000B60000E00093C80004E00093C90000E100934B\r
+:1000C600CA0044276627112488249924AA24552483\r
+:1000D6006624772402E00093B70001E00093B300A2\r
+:1000E6000093B4000093B5000093B6000093B800E7\r
+:1000F6000093B9000093CC0000E00093BA0000938F\r
+:10010600BB0007EE202E07EE402E02E003BF02E002\r
+:1001160009BF0EB10FB108EE0DB900E00DBD0CBD63\r
+:100126000BBD0ABD01EC0FBD01E00EBD05E007B930\r
+:100136000EED06B9789402E01EE1EEE8F7E0A8D0ED\r
+:100146000091CD000A3509F066C041FD6FC043FD40\r
+:100156007AC040FFF5CF0091CC00033041F0023069\r
+:1001660091F002E01FE0EAECF7E092D006C002E070\r
+:100176001FE0EAE0F8E08CD000C003E01EE1ECEA04\r
+:10018600F7E086D00FC002E01CE0EAEDF7E080D091\r
+:1001960003E01EE1EEE8F7E07BD003E01CE0EAEDC9\r
+:1001A600F7E076D01CD00B3109F0FCCF18D0043420\r
+:1001B60009F0F8CF14D0037039F0013039F002306D\r
+:1001C60039F0033039F0EECF969A05C0969803C001\r
+:1001D600959A01C0959810E3100FE4CF789400919A\r
+:1001E600CD000A35C1F441FD21C043FD2CC0F89471\r
+:1001F6009920A1F30091B300093081F7EF93FF93A3\r
+:10020600E82DED59FF2700819A948394EFE38E221F\r
+:10021600FF91EF91189502E01EE1EEE8F7E038D085\r
+:1002260002E01FE0EAE1F8E033D00AC002E01EE196\r
+:10023600EEE8F7E02DD002E01FE0E6EEF7E028D08A\r
+:1002460043FD01C0FDCF02E01EE1EEE8F7E020D05D\r
+:1002560002E01FE0E6EFF7E01BD00AEF37D00A9581\r
+:10026600E9F702E013E0E6E0F8E012D0F6CFAA984C\r
+:1002760002FF919802FD919A29D001FF919801FD04\r
+:10028600919A27D000FF919800FD919AAA9A23C0CF\r
+:1002960078940000F894AA20D9F70093B400C89582\r
+:1002A600002D04D031961A95D1F71895EF93FF9348\r
+:1002B600E92DEA0DE80DEF73ED59FF270083FF9155\r
+:1002C600EF91A3940895ECEDFFE007C0E2E2F1E0C0\r
+:1002D60004C0EDE101C0E3E0F0E020E02A95F1F78B\r
+:1002E6003197E1F70895FFB666FD22C03CB131258E\r
+:1002F600F2F0312552F0EF93FF93EEEBF091B3005D\r
+:10030600EF0FFF273083FF91EF91131608F0132E9E\r
+:100316006F7E6064312D3F7741F011202AF15798A6\r
+:100326006F7D3FEF232E606148C033EF42C040C06F\r
+:100336003091B600313019F031E03093BB003CB15A\r
+:10034600EF93FF93E62DE70DE50DEF70ED55FF27D3\r
+:100356003083E091B500F091B600EF1711F4639485\r
+:1003660001C07394FF91EF913EEF232E1A941AF574\r
+:1003760037EE232E606121C0EF93FF93EEEBF091F1\r
+:10038600B300EF0FFF2730813A953083E82DED5902\r
+:10039600FF273081FF91EF913CB93695330B3A95A3\r
+:1003A600232E9A9483943FE383221A9431F403C054\r
+:1003B60037EE232E6F7E57986F79FFBE1895FFB6DE\r
+:1003C6003091BD007091BE00732B49F031503093CF\r
+:1003D600BD003091BE0030403093BE0091F0442005\r
+:1003E60051F0439441F430E03DB93EB13FB138EEAF\r
+:1003F6003DB9B89A687F222011F02394B9F0FFBE68\r
+:10040600189507CE67FD18C0890C3FE3832299240F\r
+:100416009092BA00EF93FF93EEEBF091B300EF0FDB\r
+:10042600FF2730E43083FF91EF9106C065FDEACFE8\r
+:1004360066FDA2CF64FD7AC033EF232E3091BC0057\r
+:10044600332359F03A953093BC0031F0AA9891982D\r
+:10045600899A30E03AB9B1CFDCCD57983FE839B93F\r
+:100466003091BA0039293A2939F43091B8003A95D1\r
+:1004760049F03093B80037C03091B9003A9591F001\r
+:100486003093B90030E13093B80099203091B30031\r
+:1004960041F4AA2041F09A2CAA243091B40030935A\r
+:1004A600B300393001F16F779920B9F4AA2059F4D5\r
+:1004B6003091BA003A9542F43091B3003395393011\r
+:1004C60048F031E007C031E03093BA009A2CAA24F4\r
+:1004D6003091B4003093B30025C031E03093BA00B8\r
+:1004E6003091B3001FC030E13093B900606830919D\r
+:1004F600BB00332331F03A953093BB003091B60000\r
+:1005060011C03091B600772069F47091B70030932E\r
+:10051600B700372F313021F03395393008F032E00B\r
+:100526003093B6003CB960616F7947CF37EE232E22\r
+:1005360035E039B9392D67FF04C030E1361937196E\r
+:1005460030683CB9132E579A3CB1606236CFFFB67D\r
+:10055600B8983FB162FD8EC060FD5EC061FD57C0B8\r
+:100566003A3090F1303899F0313899F03139A1F0BC\r
+:10057600323991F0333981F0353A99F03A3AE1F06F\r
+:10058600353CD9F030E03DB944244260A3C0979889\r
+:100596009FC04160979A9CC030593093CC0041600F\r
+:1005A60097C03FEF3093BC0030E03DB994983FEFE1\r
+:1005B60070E07BBD3ABD8CC02CCD38EE3093BD00CB\r
+:1005C60033E03093BE0084C0332379F4686066203C\r
+:1005D60049F47720C1F0672C77243090B60030922A\r
+:1005E600B50012C03090B5000FC0677F332EAA2029\r
+:1005F60021F03091B400331531F431E03093BA0074\r
+:100606003092B40001C033243FB8626061C06D7F90\r
+:10061600332009F061605CC0332E6E7F332063FFA8\r
+:1006260005C05AF5362D30681FC051C0F2F3EF935E\r
+:10063600FF93EEEBF091B400EF0FFF273081E091CE\r
+:10064600B300F091B400EF1731F0E0E4E9193E177A\r
+:1006560030F03E2F04C0303408F030E439193A192E\r
+:10066600FF91EF910AF43FE7331508F4332E3FB9B3\r
+:1006760064602EC033208AF43A944AF56160EF93A1\r
+:10068600FF93E52DED55FF2730813FB9FF91EF919F\r
+:100696006A9453943FE053221BC060FF14C0EF934B\r
+:1006A600FF93E92DEA0DE80DEF73ED59FF2730832F\r
+:1006B600E091B300F091B400EF1711F4939401C0E8\r
+:1006C600A394FF91EF913A9412F0616001C06B7FA1\r
+:1006D60037EE432EFFBE1895FFB6A89534B1532FBB\r
+:1006E60035B1379557953795579544FD12C04061FA\r
+:1006F6003091BC003323C9F430E070E05C51C0F1A6\r
+:1007060030E670E05038A0F55695352F5695350FE2\r
+:100716002FC04F7E45FD0DC0583F40F03091CA00B6\r
+:100726003A953093CA0031F5406224C030E13093E7\r
+:10073600CA005093CB00593330E074E058F0309142\r
+:10074600C8007091C9003150704021F430E03DB9C5\r
+:10075600442448603093C8007093C900563450F062\r
+:100766003FEF3093BC0030E03DB994983FEF70E026\r
+:100776007BBD3ABD35E445FF34E044FF35E037B98B\r
+:100786003EED36B9FFBE18951B44301B47301B5053\r
+:10079600311B45301B4B1B301B2F301B5300001BDE\r
+:1007A6004E00801B45311B44301B47301B50311B0C\r
+:1007B60045301B4B1B301B2F301B5300001B4EF0CC\r
+:1007C600401B45311B53100D4859544543482031B1\r
+:1007D600303030001B53100D57504F3330205635F4\r
+:1007E6001B53100D42414420434F4D4D414E440092\r
+:1007F6001B53100D42415454455259204C4F57003B\r
+:100806001B4D30001B53100D4859544543482031A9\r
+:10081600353030001B53100D535441434B204F5677\r
+:060826004552464C4F57FD\r
+:042000000041BCAC33\r
+:00000001FF\r
diff --git a/src/avr/product/WPOV2.HEX b/src/avr/product/WPOV2.HEX
new file mode 100644 (file)
index 0000000..3a2161e
--- /dev/null
@@ -0,0 +1,131 @@
+:020000020000FC\r
+:020000000BC033\r
+:06000C00D8C19FC26CC1C7\r
+:1000160060C30FED0DBF00E808B9A8950FE001BD5C\r
+:100026000AE50093CC0000E00DB90AB9C59ABC9A5E\r
+:100036008D9A8E9A929A939AC19AB99AC098B898BC\r
+:1000460097988F9A94988C9AAA98A29A9198899A36\r
+:1000560007E00DD106E00BD105E009D104E007D198\r
+:1000660001E005D100E003D10FE509B908E10AB9BD\r
+:100076002AD10AEA0CB90CB929D1949A27D19498B5\r
+:1000860025D1949A0027E0E6FF2701930193019377\r
+:10009600EFEB019301930193019301930193019374\r
+:1000A60001930093BC000093CA000093BD00009327\r
+:1000B600BE0000E4008300E00093C80004E0009363\r
+:1000C600C90044276627112488249924AA24552484\r
+:1000D6006624772402E00093B70001E00093B300A2\r
+:1000E6000093B4000093B5000093B6000093B800E7\r
+:1000F6000093B9000093CB0000E00093BA00009390\r
+:10010600BB0000EF202E00EF402E02E003BF02E00E\r
+:1001160009BF0EB10FB108EE0DB900E00DBD0CBD63\r
+:100126000BBD0ABD01EC0FBD01E00EBD05E007B930\r
+:100136000EED06B9789402E01EE1E4E5F7E0A8D0FA\r
+:100146000091CC000A3509F066C041FD6FC043FD41\r
+:100156007AC040FFF5CF0091CB00033041F002306A\r
+:1001660091F002E01FE0E0E9F7E092D006C002E07D\r
+:100176001FE0E0EDF7E08CD000C003E01EE1E2E70F\r
+:10018600F7E086D00FC002E01CE0E0EAF7E080D09E\r
+:1001960003E01EE1E4E5F7E07BD003E01CE0E0EAE3\r
+:1001A600F7E076D01CD00B3109F0FCCF18D0043420\r
+:1001B60009F0F8CF14D0037039F0013039F002306D\r
+:1001C60039F0033039F0EECF969A05C0969803C001\r
+:1001D600959A01C0959810E3100FE4CF789400919A\r
+:1001E600CC000A35C1F441FD21C043FD2CC0F89472\r
+:1001F6009920A1F30091B300093081F7EF93FF93A3\r
+:10020600E82DED59FF2700819A948394EFE38E221F\r
+:10021600FF91EF91189502E01EE1E4E5F7E038D092\r
+:1002260002E01FE0E0EEF7E033D00AC002E01EE194\r
+:10023600E4E5F7E02DD002E01FE0ECEAF7E028D095\r
+:1002460043FD01C0FDCF02E01EE1E4E5F7E020D06A\r
+:1002560002E01FE0ECEBF7E01BD00AEF37D00A957F\r
+:10026600E9F702E013E0ECECF7E012D0F6CFAA983B\r
+:1002760002FF919802FD919A29D001FF919801FD04\r
+:10028600919A26D000FF919800FD919AAA9A22C0D1\r
+:1002960078940000F894AA20D9F70093B400C89582\r
+:1002A600002D04D031961A95D1F71895EF93FF9348\r
+:1002B600E92DEA0DE80DEF73ED59FF270083FF9155\r
+:1002C600EF91A3940895E0EFFAE006C0E8EC03C0CE\r
+:1002D600E4E101C0E2E0F0E020E02A95F1F7319791\r
+:1002E600E1F70895FFB666FD22C03CB13125F2F074\r
+:1002F600312552F0EF93FF93EEEBF091B300EF0F41\r
+:10030600FF273083FF91EF91131608F0132E6F7EAF\r
+:100316006064312D3F7741F011202AF157986F7DA7\r
+:100326003FEF232E606146C038EF40C03EC030919B\r
+:10033600B600313019F031E03093BB003CB1EF9399\r
+:10034600FF93E62DE70DE50DEF70ED55FF273083A2\r
+:10035600E091B500F091B600EF1711F4639401C077\r
+:100366007394FF91EF913FEF232E1A940AF530EF25\r
+:10037600232E60611FC0EF93FF93EEEBF091B30065\r
+:10038600EF0FFF2730813A953083E82DED59FF278F\r
+:100396003081FF91EF913CB93FEF232E9A948394DD\r
+:1003A6003FE383221A9431F403C030EF232E6F7E8D\r
+:1003B60057986F79FFBE1895FFB63091BD007091C2\r
+:1003C600BE00732B49F031503093BD003091BE0012\r
+:1003D60030403093BE0091F0442051F0439441F4F4\r
+:1003E60030E03DB93EB13FB138EE3DB9B89A687FCD\r
+:1003F600222011F02394B9F0FFBE18950ACE67FDAE\r
+:1004060018C0890C3FE3832299249092BA00EF9397\r
+:10041600FF93EEEBF091B300EF0FFF2730E430834C\r
+:10042600FF91EF9106C065FDEACF66FDA4CF64FD9E\r
+:100436007AC038EF232E3091BC00332359F03A9519\r
+:100446003093BC0031F0AA989198899A30E03AB975\r
+:10045600B1CFDFCD57983FE539B93091BA00392988\r
+:100466003A2939F43091B8003A9549F03093B800FA\r
+:1004760037C03091B9003A9591F03093B90030E128\r
+:100486003093B80099203091B30041F4AA2041F08E\r
+:100496009A2CAA243091B4003093B300393001F17C\r
+:1004A6006F779920B9F4AA2059F43091BA003A9599\r
+:1004B60042F43091B3003395393048F031E007C04B\r
+:1004C60031E03093BA009A2CAA243091B4003093CC\r
+:1004D600B30025C031E03093BA003091B3001FC09D\r
+:1004E60030E13093B90060683091BB00332331F0BE\r
+:1004F6003A953093BB003091B60011C03091B600EA\r
+:10050600772069F47091B7003093B700372F3130F8\r
+:1005160021F03395393008F032E03093B6003CB91B\r
+:1005260060616F7947CF30EF232E33E039B9392D2B\r
+:1005360067FF04C030E13619371930683CB9132E0D\r
+:10054600579A3CB1606236CFFFB6B8983FB162FDAC\r
+:100556008EC060FD5EC061FD57C03A3090F1303804\r
+:1005660099F0313899F03139A1F0323991F03339B7\r
+:1005760081F0353A99F03A3AE1F0353CD9F030E07D\r
+:100586003DB944244260A3C097989FC04160979AA2\r
+:100596009CC030593093CB00416097C03FEF3093F9\r
+:1005A600BC0030E03DB994983FEF70E07BBD3ABDAA\r
+:1005B6008CC02FCD38EE3093BD0033E03093BE00B3\r
+:1005C60084C0332379F46860662049F47720C1F04B\r
+:1005D600672C77243090B6003092B50012C0309068\r
+:1005E600B5000FC0677F332EAA2021F03091B400EA\r
+:1005F600331531F431E03093BA003092B40001C0C3\r
+:1006060033243FB8626061C06D7F332009F06160BA\r
+:100616005CC0332E6E7F332063FF05C05AF5362D3E\r
+:1006260030681FC051C0F2F3EF93FF93EEEBF091E9\r
+:10063600B400EF0FFF273081E091B300F091B400D2\r
+:10064600EF1731F0E0E4E9193E1730F03E2F04C011\r
+:10065600303408F030E439193A19FF91EF910AF471\r
+:100666003FE7331508F4332E3FB964602EC03320BC\r
+:100676008AF43A944AF56160EF93FF93E52DED55C0\r
+:10068600FF2730813FB9FF91EF916A9453943FE081\r
+:1006960053221BC060FF14C0EF93FF93E92DEA0DB0\r
+:1006A600E80DEF73ED59FF273083E091B300F09129\r
+:1006B600B400EF1711F4939401C0A394FF91EF9146\r
+:1006C6003A9412F0616001C06B7F30EF432EFFBE9B\r
+:1006D6001895FFB6A89534B1532F35B13795579570\r
+:1006E6003795579544FD12C040613091BC003323C5\r
+:1006F60031F530E070E05C5100F130E670E05038E2\r
+:10070600E0F45695352F5695350F17C04F7E50930A\r
+:10071600CA00583A30E074E058F43091C80070913D\r
+:10072600C9003150704021F430E03DB9442448609E\r
+:100736003093C8007093C90002C07BBD3ABD34E057\r
+:1007460044FF35E037B93EED36B9FFBE18951B4478\r
+:10075600301B47301B50311B45301B4B1B301B2FAA\r
+:10076600301B5300001B4E00801B45311B44301BC1\r
+:1007760047301B50311B45301B4B1B301B2F301B8A\r
+:100786005300001B4EF0401B45311B53100D4859BA\r
+:10079600544543482031303030001B53100D57501C\r
+:1007A6004F33302056351B53100D42414420434FE2\r
+:1007B6004D4D414E44001B53100D42415454455279\r
+:1007C60059204C4F57001B4D30001B53100D4859F4\r
+:1007D600544543482031353030001B53100D5354D7\r
+:0C07E60041434B204F564552464C4F57A4\r
+:042000000041BCAC33\r
+:00000001FF\r
diff --git a/src/avr/putpcx.asm b/src/avr/putpcx.asm
new file mode 100644 (file)
index 0000000..fb026e1
--- /dev/null
@@ -0,0 +1,79 @@
+; PUTPCX.ASM\r
+\r
+EXTRN  GETSTRLOC:FAR\r
+\r
+CODE   SEGMENT\r
+\r
+       ASSUME  CS:CODE,DS:CODE\r
+\r
+B      EQU     BYTE PTR\r
+W      EQU     WORD PTR\r
+D      EQU     DWORD PTR\r
+\r
+       LOCALS\r
+\r
+MISC_ADDR      EQU     3C2H\r
+SEQU_ADDR      EQU     3C4H\r
+CRTC_ADDR      EQU     3D4H\r
+\r
+;      GET$ #1,32700,F$\r
+;      CALL PUTPCX(F$)\r
+\r
+PUBLIC PUTPCX\r
+\r
+PUTPCX:        PUSH    BP\r
+       MOV     BP,SP\r
+       PUSH    SI\r
+       PUSH    DI\r
+       PUSH    DS\r
+       PUSH    ES\r
+       PUSHF\r
+\r
+       LDS     SI,[BP+6]               ; DS:SI -> F$ DESCRIPTOR\r
+       LODSW\r
+       PUSH    AX\r
+       CALL    GETSTRLOC\r
+       XCHG    SI,AX\r
+       MOV     DS,DX                   ; DS:SI -> F$ DATA\r
+\r
+       MOV     DX,SEQU_ADDR\r
+       MOV     AX,0F02H\r
+       OUT     DX,AX\r
+       MOV     AX,0A000H\r
+       MOV     ES,AX\r
+       SUB     DI,DI\r
+\r
+       MOV     DX,[SI+10]              ; YMAX\r
+       SUB     DX,[SI+6]               ; -YMIN\r
+       MOV     BP,[SI+66]              ; BYTES PER LINE\r
+       ADD     SI,80H\r
+\r
+@@LINE:        MOV     BX,BP\r
+@@PCX: LODSB\r
+       MOV     CX,1\r
+       CMP     AL,0C0H\r
+       JB      @@SNGL\r
+       AND     AX,3FH\r
+       XCHG    CX,AX\r
+       LODSB\r
+@@SNGL:        SUB     BX,CX\r
+       REP     STOSB\r
+       JA      @@PCX\r
+       MOV     CX,640/8\r
+       SUB     CX,BP\r
+       MOV     AL,0FFH\r
+       REP     STOSB\r
+       DEC     DX\r
+       JNZ     @@LINE\r
+\r
+       POPF\r
+       POP     ES\r
+       POP     DS\r
+       POP     DI\r
+       POP     SI\r
+       POP     BP\r
+       RETF    4\r
+\r
+CODE   ENDS\r
+       END\r
+\1a
\ No newline at end of file
diff --git a/src/avr/set00.pcx b/src/avr/set00.pcx
new file mode 100644 (file)
index 0000000..33bf29d
Binary files /dev/null and b/src/avr/set00.pcx differ
diff --git a/src/avr/ter.inc b/src/avr/ter.inc
new file mode 100644 (file)
index 0000000..c566b9f
--- /dev/null
@@ -0,0 +1,211 @@
+; TER.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER FOREGROUND TASK\r
+\r
+.MACRO INT_HANDLERS\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       ; THIS WILL CRASH IF INVOKED:\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+.ENDMACRO\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,TER_RATE              ; 9600 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$98                   ; ENABLE TX, AND RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT\r
+\r
+       ;CLR    API_STATE\r
+       ;CLR    API_REMAIN\r
+       ;CLR    API_WATCHDOG\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER FOREGROUND ROUTINES\r
+\r
+.MACRO MRX_WAIT\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       DEC     RX_COUNT\r
+       INC     RX_PTR\r
+       LDI     YL,RX_SIZE-1\r
+       AND     RX_PTR,YL\r
+\r
+       MOV     YL,RX_COUNT\r
+       CPI     YL,RX_SIZE-42\r
+       BRSH    MAY_BE_FULL\r
+       SBRC    FLAGS,RXFULL            ; IF BUFFER WAS FULL,\r
+       SBR     FLAGS,1<<RXSEND         ; SAY WE MUST SEND IMMEDIATE XON\r
+       SBRC    FLAGS,RXFULL            ; IF BUFFER WAS FULL,\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       CBR     FLAGS,1<<RXFULL         ; >42 BYTES LEFT, BUFFER IS NOT FULL\r
+MAY_BE_FULL:\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       PUSH    A\r
+TX_WAIT_LOOP:\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       BRSH    TX_WAIT_LOOP\r
+       POP     A\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+ IN YH,SREG\r
+       CLI\r
+       MOV     YL,TX_COUNT\r
+       ADD     YL,TX_PTR\r
+ OUT SREG,YH   ;SEI\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+ IN YH,SREG\r
+       CLI\r
+       INC     TX_COUNT\r
+\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+ OUT SREG,YH   ;SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER BACKGROUND ROUTINES\r
+\r
+.MACRO MTX_EMPTY\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       SBRS    FLAGS,RXSEND\r
+       RJMP    TX_TEST\r
+\r
+       CBR     FLAGS,1<<RXSEND         ; SAY WE HAVE SENT THIS XON/XOFF\r
+\r
+       LDI     F,$13                   ; XOFF, IF BUFFER IS FULL\r
+       SBRS    FLAGS,RXFULL\r
+       LDI     F,$11                   ; XON, IF BUFFER HAS ROOM\r
+       OUT     UDR,F\r
+       RJMP    API_DONE\r
+\r
+TX_TEST:\r
+       TST     TX_COUNT\r
+       BREQ    TX_SKIP\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      F,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,F\r
+\r
+       DEC     TX_COUNT\r
+       INC     TX_PTR\r
+       LDI     F,TX_SIZE-1\r
+       AND     TX_PTR,F\r
+       RJMP    API_DONE\r
+\r
+TX_SKIP:\r
+       CBI     UCR,UDRIE               ; DISABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       IN      F,UDR\r
+\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,RX_COUNT\r
+       CPI     ZL,RX_SIZE\r
+       BRSH    RX_SKIP\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+\r
+       INC     RX_COUNT\r
+\r
+       MOV     ZL,RX_COUNT\r
+       CPI     ZL,RX_SIZE-21\r
+       BRLO    MAY_BE_ROOM             ; IF <=21 BYTES LEFT, BUFFER IS FULL\r
+       SBR     FLAGS,1<<RXFULL | 1<<RXSEND ; NOW FULL, AND SEND IMMEDIATE XOFF\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+MAY_BE_ROOM:\r
+\r
+RX_SKIP:\r
+       POP     ZH\r
+       POP     ZL\r
+       ; FALL INTO API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_TIMEOUT_ERROR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_FRAMING_ERROR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REINIT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     F\r
+       OUT     SREG,SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER TIMER INTERRUPT\r
+\r
+.MACRO MAPI_TIMER\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/terlc.inc b/src/avr/terlc.inc
new file mode 100644 (file)
index 0000000..c9f01ca
--- /dev/null
@@ -0,0 +1,196 @@
+; TERLC.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS INITIALISATION ROUTINES\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,TER_RATE              ; 9600 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$98                   ; ENABLE TX, AND RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+\r
+       CLR     FLAGS\r
+\r
+       CLR     A\r
+       STS     TX_PTR,A\r
+       STS     TX_COUNT,A\r
+       STS     RX_PTR,A\r
+       STS     RX_COUNT,A\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+.MACRO MRX_WAIT\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+;;     PUSH    YH\r
+\r
+       LDS     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+;;     CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       LDS     YL,RX_COUNT\r
+       DEC     YL\r
+       STS     RX_COUNT,YL\r
+       LDS     YL,RX_PTR\r
+       INC     YL\r
+       ANDI    YL,RX_SIZE-1\r
+       STS     RX_PTR,YL\r
+       SEI\r
+\r
+;;     POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+; 22DEC00 FOR LCCHARA.ASM\r
+;      CP      CYC_1,E\r
+;      BRSH    TX_CHAR_RET\r
+\r
+       PUSH    A\r
+       LDS     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       POP     A\r
+       BRSH    TX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       CLI\r
+       LDS     YL,TX_COUNT\r
+       LDS     YH,TX_PTR\r
+       ADD     YL,YH\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+;;     CLR     YH\r
+       ST      Y,A\r
+\r
+       LDS     A,TX_COUNT\r
+       INC     A\r
+       STS     TX_COUNT,A\r
+                                       ; 17MAY01\r
+;      SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR_RET\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+.MACRO MTX_EMPTY\r
+       PUSH    A\r
+       IN      A,SREG\r
+       PUSH    A\r
+;      PUSH    SR                      ; 17MAY01 MINIMISE REGISTER USAGE\r
+;      IN      SR,SREG\r
+;      PUSH    A\r
+\r
+       LDS     A,TX_COUNT\r
+       TST     A\r
+       BREQ    TX_SKIP\r
+\r
+       PUSH    ZL\r
+;;     PUSH    ZH\r
+       LDS     ZL,TX_PTR\r
+       ; REMOVED 06MAR01, THIS CAN'T BE RIGHT\r
+       ;BREQ   TX_SKIP\r
+       SUBI    ZL,-TX_BUF\r
+;;     CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+;;     POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,A\r
+\r
+       LDS     A,TX_COUNT\r
+       DEC     A\r
+       STS     TX_COUNT,A\r
+       LDS     A,TX_PTR\r
+       INC     A\r
+       ANDI    A,TX_SIZE-1\r
+       STS     TX_PTR,A\r
+       RJMP    API_DONE\r
+\r
+TX_SKIP:\r
+       CBI     UCR,UDRIE               ; DISABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       PUSH    A\r
+       IN      A,SREG\r
+       PUSH    A\r
+;      PUSH    SR                      ; 17MAY01\r
+;      IN      SR,SREG\r
+;      PUSH    A\r
+\r
+       IN      A,UDR\r
+\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       LDS     ZL,RX_COUNT\r
+       CPI     ZL,RX_SIZE\r
+       BRSH    RX_SKIP\r
+       LDS     ZH,RX_PTR\r
+       ADD     ZL,ZH\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+;;     CLR     ZH\r
+       ST      Z,A                     ; SAVE CHARACTER IN RX BUFFER\r
+\r
+       ; MOVED 06MAR01, THIS WAS FORMERLY DONE AFTER RX_SKIP\r
+       LDS     A,RX_COUNT\r
+       INC     A\r
+       STS     RX_COUNT,A\r
+\r
+RX_SKIP:\r
+       POP     ZH\r
+       POP     ZL\r
+       RJMP    API_DONE                ; ADDED 17MAY01\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       PUSH    A                       ; ADDED 17MAY01 %\r
+       IN      A,SREG\r
+       PUSH    A                       ;               %\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_ERROR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     A\r
+       OUT     SREG,A\r
+       POP     A\r
+;      POP     A                       ; 17MAY01\r
+;      OUT     SREG,SR\r
+;      POP     SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/terlc8.inc b/src/avr/terlc8.inc
new file mode 100644 (file)
index 0000000..266b0a4
--- /dev/null
@@ -0,0 +1,208 @@
+;      TERLC8.INC\r
+\r
+;      15JUN02\r
+;      ATmega8 VERSION\r
+; -----------------------------------------------------------------------------\r
+; API BUS INITIALISATION ROUTINES\r
+\r
+.MACRO INIT_API_BUS\r
+;      ATmega8:\r
+;      LDI     A,$86                   ; NO PARITY, 8 DATA BITS\r
+;      OUT     UCSRC,A\r
+       LDI     A,TER_RATE              ; SET UART RATE TO 9600 BD\r
+       OUT     UBRRL,A\r
+       LDI     A,$98                   ; ENABLE TX, AND RX WITH INTERRUPTS\r
+       OUT     UCSRB,A\r
+\r
+       CLR     FLAGS\r
+\r
+       CLR     A\r
+       STS     TX_PTR,A\r
+       STS     TX_COUNT,A\r
+       STS     RX_PTR,A\r
+       STS     RX_COUNT,A\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND ROUTINES\r
+\r
+.MACRO MRX_WAIT\r
+       LDS     A,RX_COUNT\r
+       TST     A\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+;      ATmega8:\r
+       PUSH    YH\r
+\r
+       LDS     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+;      ATmega8:\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       LDS     YL,RX_COUNT\r
+       DEC     YL\r
+       STS     RX_COUNT,YL\r
+       LDS     YL,RX_PTR\r
+       INC     YL\r
+       ANDI    YL,RX_SIZE-1\r
+       STS     RX_PTR,YL\r
+       SEI\r
+\r
+;      ATmega8:\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+; 22DEC00 FOR LCCHARA.ASM\r
+;      CP      CYC_1,E\r
+;      BRSH    TX_CHAR_RET\r
+\r
+       PUSH    A\r
+       LDS     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       POP     A\r
+       BRSH    TX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       CLI\r
+       LDS     YL,TX_COUNT\r
+       LDS     YH,TX_PTR\r
+       ADD     YL,YH\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+;      ATmega8:\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       LDS     A,TX_COUNT\r
+       INC     A\r
+       STS     TX_COUNT,A\r
+                                       ; 17MAY01\r
+;      SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR_RET\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND ROUTINES\r
+\r
+.MACRO MTX_EMPTY\r
+       PUSH    A\r
+       IN      A,SREG\r
+       PUSH    A\r
+;      PUSH    SR                      ; 17MAY01 MINIMISE REGISTER USAGE\r
+;      IN      SR,SREG\r
+;      PUSH    A\r
+\r
+       LDS     A,TX_COUNT\r
+       TST     A\r
+       BREQ    TX_SKIP\r
+\r
+       PUSH    ZL\r
+;      ATmega8:\r
+       PUSH    ZH\r
+       LDS     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+;      ATmega8:\r
+       CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+;      ATmega8:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,A\r
+\r
+       LDS     A,TX_COUNT\r
+       DEC     A\r
+       STS     TX_COUNT,A\r
+       LDS     A,TX_PTR\r
+       INC     A\r
+       ANDI    A,TX_SIZE-1\r
+       STS     TX_PTR,A\r
+       RJMP    API_DONE\r
+\r
+TX_SKIP:\r
+;      ATmega8:\r
+       CBI     UCSRB,UDRIE             ; DISABLE UART DATA REGISTER EMPTY INT\r
+;      CBI     UCR,UDRIE               ; DISABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       PUSH    A\r
+       IN      A,SREG\r
+       PUSH    A\r
+;      PUSH    SR                      ; 17MAY01\r
+;      IN      SR,SREG\r
+;      PUSH    A\r
+\r
+       IN      A,UDR\r
+\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       LDS     ZL,RX_COUNT\r
+       CPI     ZL,RX_SIZE\r
+       BRSH    RX_SKIP\r
+       LDS     ZH,RX_PTR\r
+       ADD     ZL,ZH\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+;      ATmega8:\r
+       CLR     ZH\r
+       ST      Z,A                     ; SAVE CHARACTER IN RX BUFFER\r
+\r
+       ; MOVED 06MAR01, THIS WAS FORMERLY DONE AFTER RX_SKIP\r
+       LDS     A,RX_COUNT\r
+       INC     A\r
+       STS     RX_COUNT,A\r
+\r
+RX_SKIP:\r
+       POP     ZH\r
+       POP     ZL\r
+       RJMP    API_DONE                ; ADDED 17MAY01\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       PUSH    A                       ; ADDED 17MAY01 %\r
+       IN      A,SREG\r
+       PUSH    A                       ;               %\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_ERROR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     A\r
+       OUT     SREG,A\r
+       POP     A\r
+;      POP     A                       ; 17MAY01\r
+;      OUT     SREG,SR\r
+;      POP     SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/terts.inc b/src/avr/terts.inc
new file mode 100644 (file)
index 0000000..109eae0
--- /dev/null
@@ -0,0 +1,215 @@
+; TERTS.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER FOREGROUND TASK\r
+\r
+.MACRO INT_HANDLERS\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       ; THIS WILL CRASH IF INVOKED:\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+.ENDMACRO\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,TER_RATE              ; 9600 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$98                   ; ENABLE TX, AND RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT\r
+\r
+       ;CLR    API_STATE\r
+       ;CLR    API_REMAIN\r
+       ;CLR    API_WATCHDOG\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER FOREGROUND ROUTINES\r
+\r
+.MACRO MRX_WAIT\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       DEC     RX_COUNT\r
+       INC     RX_PTR\r
+       LDI     YL,RX_SIZE-1\r
+       AND     RX_PTR,YL\r
+\r
+       MOV     YL,RX_COUNT\r
+       CPI     YL,RX_SIZE-42\r
+       BRSH    MAY_BE_FULL\r
+       LDI     YL,1<<RXSEND\r
+       SBRC    FLAGS,RXFULL            ; IF BUFFER WAS FULL,\r
+       OR      FLAGS,YL                ; SAY WE MUST SEND IMMEDIATE XON\r
+       SBRC    FLAGS,RXFULL            ; IF BUFFER WAS FULL,\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       LDI     YL,~(1<<RXFULL)\r
+       AND     FLAGS,YL                ; >42 BYTES LEFT, BUFFER IS NOT FULL\r
+MAY_BE_FULL:\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       PUSH    A\r
+TX_WAIT_LOOP:\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       BRSH    TX_WAIT_LOOP\r
+       POP     A\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+ IN YH,SREG\r
+       CLI\r
+       MOV     YL,TX_COUNT\r
+       ADD     YL,TX_PTR\r
+ OUT SREG,YH   ;SEI\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+ IN YH,SREG\r
+       CLI\r
+       INC     TX_COUNT\r
+\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+ OUT SREG,YH   ;SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER BACKGROUND ROUTINES\r
+\r
+.MACRO MTX_EMPTY\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       SBRS    FLAGS,RXSEND\r
+       RJMP    TX_TEST\r
+\r
+       LDI     F,~(1<<RXSEND)\r
+       AND     FLAGS,F                 ; SAY WE HAVE SENT THIS XON/XOFF\r
+\r
+       LDI     F,$13                   ; XOFF, IF BUFFER IS FULL\r
+       SBRS    FLAGS,RXFULL\r
+       LDI     F,$11                   ; XON, IF BUFFER HAS ROOM\r
+       OUT     UDR,F\r
+       RJMP    API_DONE\r
+\r
+TX_TEST:\r
+       TST     TX_COUNT\r
+       BREQ    TX_SKIP\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      F,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,F\r
+\r
+       DEC     TX_COUNT\r
+       INC     TX_PTR\r
+       LDI     F,TX_SIZE-1\r
+       AND     TX_PTR,F\r
+       RJMP    API_DONE\r
+\r
+TX_SKIP:\r
+       CBI     UCR,UDRIE               ; DISABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       IN      F,UDR\r
+\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,RX_COUNT\r
+       CPI     ZL,RX_SIZE\r
+       BRSH    RX_SKIP\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+\r
+       INC     RX_COUNT\r
+\r
+       MOV     ZL,RX_COUNT\r
+       CPI     ZL,RX_SIZE-21\r
+       BRLO    MAY_BE_ROOM             ; IF <=21 BYTES LEFT, BUFFER IS FULL\r
+       LDI     ZL,1<<RXFULL | 1<<RXSEND\r
+       OR      FLAGS,ZL                ; NOW FULL, AND SEND IMMEDIATE XOFF\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+MAY_BE_ROOM:\r
+\r
+RX_SKIP:\r
+       POP     ZH\r
+       POP     ZL\r
+       ; FALL INTO API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_TIMEOUT_ERROR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_FRAMING_ERROR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REINIT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     F\r
+       OUT     SREG,SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; TER TIMER INTERRUPT\r
+\r
+.MACRO MAPI_TIMER\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/tster.asm b/src/avr/tster.asm
new file mode 100644 (file)
index 0000000..5696161
--- /dev/null
@@ -0,0 +1,3507 @@
+;      TSTER.ASM\r
+;       22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;               TO WORK WITH REV E PARTS\r
+;              ;!! INDICATES CHANGES\r
+\r
+;**    INDICATES CHANGES FOR LOW VCC AVR MOD\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+;.INCLUDE "APITS.INC" ; NOT API.INC BECAUSE APITS.INC ALSO HAS TURNON COMMAND\r
+.INCLUDE "TERTS.INC" ; NOT TER.INC BECAUSE FLAGS IN LOWER HALF OF REGISTER SET\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     PAGE,YH\r
+       RCALL   ADRYP                   ; AND SET PAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+       OUT     PORTC,@0                ; SET L ADDRESS FOR DSPRAM\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       EOR     R19,@0\r
+       ANDI    R19,$E0\r
+       EOR     R19,@0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       SEI\r
+       STS     LATCH10_SAV,R19         ; MUST BE ATOMIC DUE TO TOGGLING M\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@1\r
+       ;POP    @1\r
+\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       BST     @1,7                    ; A15\r
+       BLD     R19,1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,0\r
+       NOP\r
+       CBI     PORTB,1\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+       OUT     PORTA,@0                ; SELECT PHOTODIODE CHANNEL\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+       OUT     PORTA,@0                ; MAIN LED DRIVE PORT\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON LO\r
+       CBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON HI\r
+       SBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER HI\r
+       SBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER LO\r
+       CBR     D,1<<3\r
+       SBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER OFF\r
+       CBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =$FB35\r
+.EQU   T1_FULL_SCALE   =$FC2F\r
+\r
+.EQU   VEE_MIN         =$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         =$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =$FE00\r
+\r
+.EQU   CONTRAST_LONG   =$FE00 ; ALL LONG PULSES IS FULLY DARK\r
+;!!.EQU        CONTRAST_LONG   =$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  =$FFC0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =$FE00\r
+\r
+.EQU   VCC_NOMINAL     =$FCC4\r
+\r
+; WHEN VCC = $FCC4 FOR 6.0V:\r
+.EQU   CONTRAST_MIN    =$FCA0 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MAX    =$FD00 ; MAX IS FULLY LIGHT\r
+.EQU   CONTRAST_INIT   =$FCD0\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+;.EQU  CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FF80 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FE10\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$80\r
+.EQU   CHARACTER_SETS  =10\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$20\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   TK_LED_PULSE    =$1E            ; 22US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_0      =$38            ; 54US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_1      =$28            ; CLOCKS OF /64, CHANNEL SELECT DELAY\r
+.EQU   TK_DELAY_2      =$00            ; CLOCKS OF /1024, VDD POWER ON DELAY\r
+                                       ; $D0 IS TOO SHORT, $E0 SEEMS TO WORK\r
+\r
+.EQU   API_ADDRESS     =$02            ; TOUCHSCREEN ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   TER_RATE        =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   UNUSED\r
+.EQU   RXFULL          =6              ; PROVIDES HYSTERESIS FOR BUFFER FULL\r
+.EQU   RXSEND          =7              ; SET WHEN IMMEDIATE XON/XOFF REQUIRED\r
+\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+BUZZ_TIME:     .BYTE   1       ; 10B\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+DEBOUNCE:      .BYTE   1\r
+ROW_INDEX:     .BYTE   1\r
+ROW_BITMAP:    .BYTE   2\r
+LATCH10_SAV:   .BYTE   1\r
+LATCH11_SAV:   .BYTE   1\r
+LATCH12_SAV:   .BYTE   1\r
+PAGE:          .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+CLOCKING_PTR:  .BYTE   2\r
+\r
+CHAR_X:                .BYTE   1\r
+CHAR_Y:                .BYTE   1\r
+CHAR_PTR:      .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TOUCH_KEY:     .BYTE   1\r
+TOUCH_X:       .BYTE   1\r
+TOUCH_Y:       .BYTE   1\r
+TOUCH_XX:      .BYTE   1\r
+TOUCH_YY:      .BYTE   1\r
+\r
+TIME_HSEC_64K: .BYTE   1\r
+TIME_HSEC_256: .BYTE   1\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+SCAN_STATE:    .BYTE   1\r
+LATCH5_SAV:    .BYTE   1\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   1\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RJMP    GO_TIM2_OVF             ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_T1_OVERFLOW\r
+       RJMP    GO_T0_OVERFLOW\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       LDI     F,0\r
+       STS     TIME_HSEC_64K,F\r
+       STS     TIME_HSEC_256,F\r
+       STS     TIME_HSEC,F\r
+       STS     TIME_SECOND,F\r
+       STS     TIME_MINUTE,F\r
+       STS     TIME_HOUR,F\r
+       LDI     F,1\r
+       STS     DATE_DAY,F\r
+       STS     DATE_MONTH,F\r
+       LDI     F,20\r
+       STS     DATE_YEAR,F\r
+\r
+RESTART_ENTRY:\r
+;**:\r
+       LDI     F,8                     ; TIMER 2 CLOCKED BY 32 KHZ\r
+;**    LDI     F,0                     ; TIMER 2 CLOCKED BY 11 MHZ\r
+       OUT     ASSR,F\r
+;**:\r
+       ; MUST MATCH SET_TIME ROUTINE %\r
+       LDI     F,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;!!    LDI     F,$11                   ; DIVIDE BY 2, TOGGLE OC2 (PIN 21)\r
+                                       ; (RTC DIAGNOSTIC)\r
+;**    LDI     F,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,F\r
+       ; %\r
+       LDI     F,$40\r
+       OUT     TIMSK,F                 ; TIMER 2 OVERFLOW INTERRUPTS ENABLED\r
+       LDI     F,$00\r
+       OUT     GIMSK,F\r
+\r
+       LDI     F,$B8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       OUT     PORTD,F                 ; D2 = TRI-STATE, VSWT ON\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$03                   ; CS, WE HI, LEs ALL LO\r
+       OUT     PORTB,F\r
+\r
+       LDI     F,$10                   ; LED COMMON OFF, SPEAKER OFF\r
+       OUT     PORTC,F\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,F\r
+\r
+       LDI     F,$20\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ENABLED\r
+\r
+       INIT_API_BUS\r
+\r
+       LDI     D,$18                   ; A18|A17|A16|A15|A14=11000\r
+       OUT     PORTA,D                 ; CL1=M=FLM=0\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+\r
+       CLR     SCAN\r
+       STS     ROW_INDEX,SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+       LDI     D,$F4                   ; BIT 6 = 1 VDD ON, BIT 7 = 1 LCD ON\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       ; INITIALISE ACTIVE KEYS\r
+RTNCDE:        LDIZ    RTN_CODE                ; POINT Z TO FLASH\r
+       LDIX    RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+       LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET PAGE\r
+CDE0:  ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CDE1:  ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+ CLR R0 ; TEMPORARY CLEAR KB\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       DEC     XL\r
+       BREQ    RTNCDE_END              ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CDE1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CDE0\r
+RTNCDE_END:\r
+\r
+       ; INITIALISE DEFAULT CHARACTER SET\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       ; CLEAR REFRESH BUFFER TO AVOID A BRIEF FLICKER\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   GO_SELECT_PAGE\r
+\r
+       LDI     B,DISPLAY_LINES         ; B = LINES TO CLEAR\r
+\r
+CLEAR_REFRESH:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDI     B,32\r
+       RCALL   GO_CLEAR_BYTES          ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   GO_CLEAR_BYTES          ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    CLEAR_REFRESH\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       LDI     A,$40 ;$10\r
+       STS     BUZZ_TIME,A             ; SHORT BEEP ON STARTUP\r
+\r
+       LDI     A,0\r
+       STS     SCAN_STATE,A            ; START ON FIRST LED / PHOTODIODE PAIR\r
+\r
+       LDI     A,0\r
+       STS     CLOCKING_PTR,A\r
+       STS     CLOCKING_PTR+1,A        ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       LDI     F,$45\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1, 2 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  HELLO_DISPLAY           ; SHOW EXAMPLE DISPLAY\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       SBI     PORTD,4                 ; TURN TRANSISTOR OFF\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,LATCH10_SAV\r
+       ANDI    D,$BF                   ; DROP M\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       LDI     D,$74                   ; BIT 6 = 1 VDD ON, BIT 7 = 0 LCD OFF\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       ;LDI    D,$34                   ; BIT 6 = 0 VDD OFF, BIT 7 = 0 LCD OFF\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       LDI     D,$41\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 INTERRUPTS\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; DISABLE TIMER 0 TEMPORARILY ONLY\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+       LDI     F,4\r
+       STS     TURNON_COUNT,F          ; .25 SEC TO BREAK, .75 SEC TO MAKE\r
+\r
+       INIT_API_BUS                    ; RESET UART TO RECEIVE TURNON COMMAND\r
+\r
+SLEEP_LOOP:\r
+       CLI\r
+       IN      F,TCCR0\r
+       TST     F\r
+       LDI     F,$4A                   ; SE=1 SM1:SM0=00 FOR IDLE MODE\r
+       BRNE    SLEEP_SETUP             ; TIMER 0 RUNNING, STAY IN IDLE MODE\r
+       SBIS    PIND,0                  ; BREAK OFF, UART ACTIVE, STAY IN IDLE\r
+       LDI     F,$7A                   ; SE=1 SM1:SM0=11 FOR POWER SAVE MODE\r
+SLEEP_SETUP:\r
+       OUT     MCUCR,F\r
+       SEI\r
+       SLEEP\r
+\r
+       LDS     F,TURNON_COUNT\r
+       TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       ;SBIS   PIND,0                  ; AND BREAK HAS DISAPPEARED, WAKE UP\r
+       BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+\r
+       CLI\r
+       RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP: LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
+       LDS     YL,LATCH10_SAV\r
+       ANDI    YL,$E0\r
+       OR      YH,YL\r
+       OUT     PORTA,YH\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,PAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     PAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;HELLO_DISPLAY:\r
+;      LDI     A,0\r
+;      STS     RECTNC_X,A\r
+;      STS     RECTNC_Y,A\r
+;      STS     RECTNC_XX,A\r
+;      LDI     A,$80\r
+;      STS     RECTNC_YY,A\r
+;      RCALL   DRAW_RECTNC\r
+;\r
+;      LDI     A,16\r
+;      STS     CHAR_X,A\r
+;      STS     CHAR_Y,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;      RCALL   STRING_DRAW\r
+;\r
+;      LDI     A,240\r
+;      STS     CHAR_X,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;\r
+;STRING_RIGHT_JUST:\r
+;      PUSH    B\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   STRING_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     B\r
+;      LDS     A,CHAR_X\r
+;      SUB     A,R0\r
+;      STS     CHAR_X,A\r
+;\r
+;STRING_DRAW:\r
+;      PUSH    B\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      PUSH    R0\r
+;      RCALL   DRAW_CHAR\r
+;      POP     R0\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      LDS     A,CHAR_X\r
+;      ADD     A,R0\r
+;      STS     CHAR_X,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_DRAW\r
+;      RET\r
+;\r
+;STRING_WIDTH:\r
+;      CLR     R0\r
+;STRING_WIDTH_LOOP:\r
+;      PUSH    B\r
+;      PUSH    R0\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     A\r
+;      ADD     R0,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_WIDTH_LOOP\r
+;      RET\r
+;\r
+;HELLO_MESSAGE:        .DB     'H','E','L','L','O',0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+;L0132:\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+;L0135:\r
+       CPI     A,$0A\r
+       BRNE    TEST_BELL\r
+       RJMP    LF\r
+TEST_BELL:\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'B'\r
+       RJEQ    BUZZER\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'T'\r
+       RJEQ    SET_TIME\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       RJEQ    CONTRAST_CONTROL\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+;      BRNE    MOSFET_CONTROL_DONE\r
+;      CLI\r
+;      LDI     F,1<<6\r
+;      OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+;      SBI     DDRD,2                  ; D2 = LOW, VSWT OFF\r
+;      RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+;MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+BUZZER:        RCALL   RX_WAIT\r
+       STS     BUZZ_TIME,A             ; SAVE REQUESTED DURATION\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_TIME:\r
+       LDI     A,0\r
+       OUT     TCCR2,A                 ; STOP COUNTING WHILE SETTING CLOCK\r
+       STS     TIME_HSEC_64K,A\r
+       STS     TIME_HSEC_256,A\r
+       STS     TIME_HSEC,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_HOUR,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_MINUTE,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_SECOND,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_MONTH,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_DAY,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_YEAR,A\r
+       LDI     A,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;**    LDI     A,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+;L01A3:\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    CLR     CURSORX\r
+       RJMP    MAIN_LOOP\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+       CLI\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       STS     TOUCH_KEY,A\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       SUBI    A,-9\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_X,B\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A\r
+       SUBI    A,-4\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_Y,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YL\r
+       SUBI    A,15\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_XX,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YH\r
+       SUBI    A,17\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_YY,B\r
+\r
+       LDS     YH,TOUCH_Y\r
+TOUCH_ZONE_Y:\r
+       LDS     A,TOUCH_YY\r
+       SUB     A,YH\r
+       BRSH    TOUCH_ZONE_Y_CONT\r
+       RJMP    TOUCH_ZONE_Y_END\r
+TOUCH_ZONE_Y_CONT:\r
+\r
+       LDS     YL,TOUCH_X\r
+       MOV     A,YL\r
+       ADD     A,YH\r
+       MOV     B,YH\r
+       LSL     B\r
+       LSL     B\r
+       LSL     B\r
+       ADD     A,B\r
+       LSL     B\r
+       ADD     A,B\r
+\r
+       LDI     XL,LOW(RTN_DSPRAM)\r
+       LDI     XH,HIGH(RTN_DSPRAM) ;<<2\r
+       LDI     B,0\r
+       ADD     XL,A\r
+       ADC     XH,B\r
+\r
+       LDI     B,HIGH(RTN_DSPRAM>>6)   ; B:X -> RETURN CODE TABLE\r
+       A14_A18 B\r
+\r
+TOUCH_ZONE_X:\r
+       LDS     A,TOUCH_XX\r
+       SUB     A,YL\r
+       BRLO    TOUCH_ZONE_X_END\r
+\r
+       A0_A13  XL,XH\r
+       LDS     A,TOUCH_KEY\r
+       RAMWR   A                       ; WRITE DATA TO DSPRAM\r
+\r
+       ADIW    XL,1\r
+       INC     YL\r
+       RJMP    TOUCH_ZONE_X\r
+\r
+TOUCH_ZONE_X_END:\r
+       INC     YH\r
+       RJMP    TOUCH_ZONE_Y\r
+\r
+TOUCH_ZONE_Y_END:\r
+       RJMP    MAIN_LOOP\r
+\r
+DIVIDE_10:\r
+       LDI     B,-1\r
+DIVIDE_10_LOOP:\r
+       INC     B\r
+       SUBI    A,10\r
+       BRCC    DIVIDE_10_LOOP\r
+       RET\r
+\r
+DIVIDE_13:\r
+       LDI     B,-1\r
+DIVIDE_13_LOOP:\r
+       INC     B\r
+       SUBI    A,13\r
+       BRCC    DIVIDE_13_LOOP\r
+       RET\r
+\r
+NULLSUB2:\r
+       RCALL   RX_WAIT\r
+\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       RCALL   FIND_CHAR               ; SET UP CHAR_PTR FROM A = CHAR\r
+       RCALL   CHAR_WIDTH              ; SET UP R0 = PROP WIDTH FROM CHAR PTR\r
+\r
+       CLR     F\r
+       STS     TEMP,F                  ; NUDGE FOR FIXED SPACING MODE\r
+\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE               ; FORCED TO FIXED SPACING MODE?\r
+\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS                    ; GET R0 = CELL WIDTH FOR CHARACTER SET\r
+       PUSH    R0\r
+       SUB     R0,W\r
+       BRCC    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       POP     R0                      ; RESTORE R0 = FIXED CELL WIDTH\r
+\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE                 ; FORCED TO GRAPHICS MODE?\r
+\r
+       MOV     F,CURSORX\r
+       ADD     F,R0                    ; CHECK IF CHAR WILL FIT ON THIS LINE\r
+       BRCC    OK_LINE\r
+\r
+       CLR     CURSORX\r
+       RCALL   LINE_FEED               ; NO, WRAP CURSOR PRIOR TO DRAWING CHAR\r
+\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE             ; IN CASE WE SCROLLED THE DISPLAY\r
+\r
+OK_LINE:\r
+       LDS     F,TEMP\r
+       ADD     F,CURSORX\r
+       STS     CHAR_X,F\r
+       STS     CHAR_Y,CURSORY          ; SET UP TOP LEFT COORDINATES\r
+\r
+       ADD     CURSORX,R0              ; ADVANCE CURSOR\r
+\r
+DRAW_CHAR:\r
+       LDS     XPIXEL,CHAR_X\r
+       LDS     LINE_CNT,CHAR_Y\r
+\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE           ; Y OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+\r
+Y_OFFSET_DONE:\r
+       SBRS    X_SIZE,7\r
+       RJMP    X_OFFSET_DONE           ; X OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$03\r
+       RCALL   LPMS\r
+       ADD     XPIXEL,R0\r
+\r
+X_OFFSET_DONE:\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       ADIW    YL,$01\r
+       RCALL   LPMS                    ; GET R0 = Y LINES FOR CHARACTER\r
+       MOV     Y_SIZE,R0\r
+\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0                 ; REMOVE_CS\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+FIND_CHAR:\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       STS     CHAR_PTR,YL\r
+       STS     CHAR_PTR+1,YH\r
+       RET\r
+\r
+CHAR_WIDTH:\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    LPMS                    ; PROPORTIONAL WIDTH IS PRESENT\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RJMP    LPMS                    ; NO PROPORTIONAL WIDTH, USE CELL WIDTH\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> DISPLAY BUFFER\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       LDI     B,32\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       SBIW    XL,2\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   COPY_BYTES              ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+ ; LET'S BE SAFE\r
+ ANDI A,$7F\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_CLEAR_BYTES:\r
+       RJMP    CLEAR_BYTES\r
+\r
+GO_SELECT_PAGE:\r
+       RJMP    SELECT_PAGE\r
+\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+\r
+GO_TIM2_OVF:\r
+       RJMP    TIM2_OVF\r
+\r
+GO_T1_OVERFLOW:\r
+       RJMP    T1_OVERFLOW\r
+\r
+GO_T0_OVERFLOW:\r
+       RJMP    T0_OVERFLOW\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+CLEAR_DISPLAY_LOOP:\r
+       CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    CLEAR_DISPLAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXT_INT0:\r
+;**:\r
+RETI\r
+;**    IN      SR,SREG                 ; MEASURE VCC\r
+;**    SBI     DDRD,2\r
+;**    IN      C,TCNT1L\r
+;**    IN      D,TCNT1H\r
+;**    STS     VCCH,D\r
+;**    STS     VCCL,C\r
+;**    RJMP    EXT_INT_RET\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    EXT_INT_RET\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+       ; REDUNDANT, NOW DONE IN TIMER 2 OVERFLOW HANDLER\r
+       ;WDR\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+        LDI     D,$70                  ; FORCE DUMMY COMPARE MATCH\r
+        OUT     TCCR1A,D                ; TO SET OC1B, TOGGLE OC1A\r
+        IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+        IN      D,TCNT1H                ; READ CURRENT COUNT\r
+        SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+        SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+        OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+        OUT     OCR1AL,C\r
+        OUT     OCR1BH,D\r
+        OUT     OCR1BL,C\r
+\r
+       LDS     C,CLOCKING_PTR\r
+       TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+;      LDI     D,~(1<<6)\r
+;      AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+GO_SLEEP_ENTRY:\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+;**    SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+;**    SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CLR     D\r
+       OUT     TCCR1B,D                ; STOP TIMER1\r
+       OUT     TCNT1H,D                ; AND CLEAR COUNT\r
+       OUT     TCNT1L,D\r
+;!!    CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,CLOCKING_PTR+1\r
+       OR      D,C                     ; START OF FRAME?  (REALLY LINE 1)\r
+       BREQ    L04E6                   ; YES, GO AND TOGGLE M ETC\r
+\r
+       LDS     D,LATCH10_SAV\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       SBI     PORTA,5                 ; PULSE CL1\r
+       CBI     PORTA,5\r
+       CBI     PORTB,4\r
+       RJMP    L04F9\r
+\r
+L04E6: LDS     D,LATCH10_SAV\r
+       ORI     D,$80                   ; RAISE FLM\r
+       ORI     D,$20                   ; RAISE CL1\r
+       OUT     PORTA,D\r
+\r
+       SBI     PORTB,4\r
+       LDI     C,$60                   ; TOGGLE M AND CL1\r
+       EOR     D,C\r
+       OUT     PORTA,D\r
+       ANDI    D,$7F                   ; DROP FLM\r
+       OUT     PORTA,D\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+L04F9: LDS     D,LATCH10_SAV           ; SAVE STATE\r
+       PUSH    D\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDS     ZL,CLOCKING_PTR\r
+       LDS     ZH,CLOCKING_PTR+1\r
+\r
+       SUBI    ZL,LOW(-$40)\r
+       SBCI    ZH,HIGH(-$40)\r
+       ANDI    ZH,HIGH(DISPLAY_LINES*$40-1)\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       CBI     PORTB,1                 ; CLR HC590\r
+       SBI     PORTB,1\r
+       CBI     PORTD,7                 ; DROP OE FOR HC590\r
+       CLR     C\r
+       OUT     DDRA,C                  ; PORTA HI Z\r
+       LDI     C,$C0\r
+       OUT     DDRC,C                  ; PORTC HI Z\r
+       CBI     PORTB,0                 ; DROP CS FOR DSPRAM\r
+\r
+       CLR     D\r
+       OUT     OCR1AH,D\r
+;**:\r
+       LDI     D,1                     ; TO CLOCK AT 5.5/2 MHZ\r
+       OUT     OCR1AL,D\r
+       LDI     D,$09\r
+       OUT     TCCR1B,D                ; START CL2 CLOCKING WITH CLR ON MATCH\r
+\r
+       STS     CLOCKING_PTR,ZL\r
+       STS     CLOCKING_PTR+1,ZH\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;**:\r
+       LDI     D,$7A                   ; WAIT FOR 32uSEC\r
+;!!    LDI     D,$80                   ; WAIT FOR 32uSEC\r
+;**    LDI     D,$39                   ; WAIT FOR 16uSEC\r
+L050E: DEC     D\r
+       BRNE    L050E\r
+\r
+;!!    LDI     D,$01\r
+;!!    OUT     TCCR1B,D                ; KILL CLR ON COMPARE MATCH\r
+;!!    SBI     PORTD,5                 ; SET CL2 HI (FOR REV E DOES NOTHING)\r
+       SBI     PORTB,0                 ; RAISE CS FOR DSPRAM\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+       SBI     PORTD,7                 ; RAISE OE FOR HC590\r
+       OUT     DDRC,D                  ; PORTC OUTPUT\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+;!!:\r
+       LDI     D,$01                   ; KILL CLR ON COMPARE MATCH\r
+       OUT     TCCR1B,D                ; WITH OC1A LEFT IN HIGH STATE\r
+\r
+       LDI     D,$0B                   ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+;**    LDS     C,VCCL\r
+;**    LDS     D,VCCH\r
+;**    LDI     E,LOW(VCC_NOMINAL)\r
+;**    SUB     C,E\r
+;**    LDI     E,HIGH(VCC_NOMINAL)\r
+;**    SBC     D,E\r
+\r
+;**    ROR     D\r
+;**    ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;**    PUSH    D\r
+;**    PUSH    C\r
+;**    ASR     D\r
+;**    ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;**    POP     E\r
+;**    ADD     C,E\r
+;**    POP     E\r
+;**    ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+\r
+;**:\r
+       LDS     C,VEEL\r
+       LDS     D,VEEH\r
+;**    LDS     E,VEEL\r
+;**    ADD     C,E\r
+;**    LDS     E,VEEH\r
+;**    ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       LDI     D,2\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_DELAY_0           ; 54uSEC\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+;**    CBI     DDRD,2                  ; START VCC AND\r
+;**    CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+;!!:\r
+        LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+        OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+       RJMP    T1_OVERFLOW_RET\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; LED/PHOTODIODE SCANNING\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+       LDS     D,LATCH10_SAV\r
+       PUSH    D\r
+\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       LDS     D,SCAN_STATE\r
+       INC     D\r
+       STS     SCAN_STATE,D\r
+       DEC     D\r
+       BREQ    SCAN_START              ; IF SCAN_STATE WAS = 0\r
+       DEC     D\r
+       BREQ    SCAN_BEEPER             ; IF SCAN_STATE WAS = 1\r
+ ; IMPLEMENT ENTRY POINT FOR SCAN_PULSE_LED HERE\r
+       DEC     D\r
+       RJEQ    SCAN_PHOTO              ; IF SCAN_STATE WAS = 2\r
+\r
+T0_OVERFLOW_RET:\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+\r
+T1_OVERFLOW_RET:\r
+       POP     D                       ; RESTORE STATE OF THE WORLD\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+EXT_INT_RET:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCAN_START:\r
+       LDI     D,3 ;5\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/1024\r
+       LDI     D,-TK_DELAY_1 ;TK_DELAY_2\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+       RJMP    L0617_RESET\r
+\r
+SCAN_BEEPER:\r
+       LDS     D,BUZZ_TIME\r
+       TST     D\r
+       BREQ    SCAN_PULSE_LED\r
+       LDS     C,LATCH12_SAV\r
+       SBRS    C,3\r
+       RJMP    BEEPER_SPKHI\r
+       DEC     D\r
+       STS     BUZZ_TIME,D\r
+       BREQ    BEEPER_SPKOFF\r
+;BEEPER_SPKLO:\r
+       SPKLO\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKHI:\r
+       SPKHI\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKOFF:\r
+       SPKOFF\r
+\r
+SCAN_PULSE_LED:\r
+       LDS     D,LATCH5_SAV\r
+;**:\r
+       SBRS    D,7                     ; ARE WE INSIDE SLEEP_LOOP?\r
+;**    SBRC    D,7\r
+       RJMP    SCAN_PULSE_LED_OK       ; YES, KEEP TIMER 0 TO RETAIN CONTROL\r
+\r
+       LDI     D,1<<7\r
+       EOR     FLAGS,D\r
+       BRPL    SCAN_PULSE_LED_OK       ; PULSE LED EVERY 2ND CYCLE\r
+\r
+       CLR     D\r
+       OUT     TCCR0,D                 ; STOP TIMER\r
+       RJMP    T0_OVERFLOW_RET         ; AND WASTE EVERY REMAINING CYCLE\r
+\r
+SCAN_PULSE_LED_OK:\r
+       LDI     D,2\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_LED_PULSE         ; 22uSEC\r
+       OUT     TCNT0,D\r
+\r
+       LDIZ    SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM                             ; R0 = LED DRIVE VALUE\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L0570\r
+       LEDLO                           ; ENABLE HORIZ LED DRIVE\r
+       RJMP    L0574\r
+L0570: LEDHI                           ; DISABLE HORIZ LED DRIVE\r
+L0574: LED     R0\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCAN_PHOTO:\r
+       IN      D,PIND                  ; PHOTODIODE STATUS IN BIT 6,D\r
+       LDI     C,$E0\r
+       LED     C                       ; TURN OFF LED ??\r
+\r
+       CLC\r
+       SBRC    D,6\r
+       RJMP    L0593                   ; ROW/COLUMN IS INACTIVE\r
+\r
+       ; ROW/COLUMN IS ACTIVE\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0591\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+L0591: SEC\r
+\r
+L0593: ; WE HAVE A ROW/COLUMN STATUS IN CF\r
+       IN      C,SREG\r
+\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L05A8\r
+\r
+       ; WE HAVE A ROW STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       LDS     ZL,ROW_BITMAP\r
+       LDS     ZH,ROW_BITMAP+1\r
+       ROL     ZL\r
+       ROL     ZH\r
+       STS     ROW_BITMAP,ZL\r
+       STS     ROW_BITMAP+1,ZH\r
+       RJMP    L05F9\r
+\r
+L05A8: ; WE HAVE A COLUMN STATUS\r
+;      LDS     D,LATCH5_SAV\r
+;;**:\r
+;      SBRS    D,7                     ; TURNED OFF?\r
+;;**   SBRC    D,7\r
+;      RJMP    L05F9                   ; YES, NO FURTHER PROCESSING\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       BRCS    L05AB\r
+       RJMP    L05F9\r
+\r
+L05AB: ; WE HAVE AN ACTIVE COLUMN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L05B3\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       RJMP    L05F9\r
+\r
+L05B3: ; LOOK FOR ANY ACTIVE ROW\r
+       LDS     ZH,ROW_BITMAP+1\r
+       LDS     ZL,ROW_BITMAP\r
+\r
+       LDS     D,ROW_INDEX\r
+       TST     D\r
+       BREQ    ROW_BITMAP_LOOP\r
+\r
+       MOV     C,D\r
+ROW_BITMAP_SKIP:\r
+       ROR     ZH\r
+       ROR     ZL\r
+       SUBI    C,4\r
+       BRNE    ROW_BITMAP_SKIP\r
+\r
+ROW_BITMAP_LOOP:\r
+       SUBI    D,-4\r
+       ROR     ZH\r
+       ROR     ZL\r
+       BRCS    FOUND_INTERSECTION\r
+ROW_BITMAP_LOOPE:\r
+       CPI     D,13*4\r
+       BRLO    ROW_BITMAP_LOOP\r
+\r
+       ; NO FURTHER INTERSECTING ROWS FOUND\r
+       RJMP    L05F9\r
+\r
+FOUND_INTERSECTION:\r
+       ; FOUND AN INTERSECTING ROW FOR COLUMN\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,$34                   ; BECAUSE ROW_BITMAP IS BEING TESTED\r
+       SUB     C,D                     ; IN THE REVERSE ORDER TO ITS CREATION\r
+\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+       LPM\r
+       MOV     C,R0\r
+       LSL     R0\r
+       LSL     R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       ADD     C,R0\r
+       LDI     ZL,LOW(RTN_DSPRAM)      ; RETURN CODE TABLE\r
+       LDI     ZH,HIGH(RTN_DSPRAM)\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       PUSH    F\r
+       RAMRDX  R0\r
+       POP     F\r
+\r
+       TST     R0\r
+       BRNE    VALID_INTERSECTION\r
+\r
+       ; INTERSECTION IS NULL, GO ON TO NEXT\r
+       LDS     D,ROW_INDEX\r
+       CPI     D,13*4\r
+       BRSH    L05F9                   ; DONE LAST ROW, GO ON TO NEXT COLUMN\r
+GO_L0617:\r
+       RJMP    L0617                   ; GO ON TO NEXT ROW, SAME COLUMN\r
+\r
+VALID_INTERSECTION:\r
+       ; INTERSECTION IS VALID, WE HAVE KEY MAKE\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       STS     ACTIVE_ZONE,R0\r
+       LDI     D,$40 ;$10\r
+       STS     BUZZ_TIME,D             ; SHORT BEEP ON MAKE\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-1\r
+       BRSH    L05F9\r
+\r
+       PUSH    A\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       CPI     A,$1B\r
+       BRNE    TX_CONT\r
+       RCALL   TX_CHAR\r
+TX_CONT:\r
+       POP     A\r
+\r
+L05F9: ; SCAN TO NEXT LED / PHOTODIODE PAIR\r
+       LDI     D,4\r
+       ADD     SCAN,D\r
+\r
+       LDS     D,LATCH5_SAV\r
+;**:\r
+       SBRC    D,7\r
+;**    SBRS    D,7\r
+       RJMP    TURNED_ON\r
+\r
+       LDI     D,3\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/64\r
+       LDI     D,-TK_DELAY_1\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     C,13*4\r
+       CP      SCAN,C\r
+       BRLO    GO_L0617\r
+\r
+       ; KEEP VDD ON, TO AVOID THE LONG TK_DELAY_2\r
+       ;LDS    D,LATCH5_SAV\r
+       ;ANDI   D,$BF                   ; BIT 6 = 0 VDD OFF\r
+       ;STS    LATCH5_SAV,D\r
+       ;PHOTO  D                       ; READY TO SLEEP FOR ANOTHER 0.25 SEC\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; STOP TIMER SINCE COMPLETE SCAN DONE\r
+ ;RJMP T0_OVERFLOW_RET\r
+\r
+ ;LDI D,$05\r
+ ;OUT UBRR,D\r
+ ;LDI D,$18\r
+ ;OUT UCR,D\r
+       LDS     D,ROW_BITMAP+1\r
+       LDS     C,ROW_BITMAP\r
+ ;OUT UDR,C\r
+ ;OUT UDR,D\r
+       OR      C,D                     ; HAVE WE SOME ACTIVITY?\r
+\r
+       LDS     D,TURNON_COUNT\r
+       CPI     D,4\r
+       BRSH    TURNON_BREAK            ; WAITING FOR BREAK\r
+       CPI     D,1\r
+       BRSH    TURNON_MAKE             ; WAITING FOR MAKE\r
+GO_T0_OVERFLOW_RET:\r
+       RJMP    T0_OVERFLOW_RET         ; ALREADY HAD MAKE, NOT TURNED ON YET\r
+\r
+TURNON_BREAK:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BREQ    TURNON_SAVE             ; NO, COUNT DOWN TO BREAK\r
+       LDI     D,4+1                   ; YES, RESTART COUNTDOWN TO BREAK\r
+       RJMP    TURNON_SAVE\r
+TURNON_MAKE:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BRNE    TURNON_SAVE             ; YES, COUNT DOWN TO MAKE\r
+       LDI     D,3+1                   ; NO, RESTART COUNTDOWN TO MAKE\r
+TURNON_SAVE:\r
+       DEC     D                       ; COUNT DOWN TO MAKE OR BREAK\r
+       STS     TURNON_COUNT,D\r
+       BRNE    GO_T0_OVERFLOW_RET      ; NOT READY TO TRY TURNON YET\r
+\r
+;      LDI     D,~(1<<6)\r
+;      AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       CBI     DDRD,2                  ; D2 = TRI-STATE, VSWT ON\r
+       RJMP    GO_SLEEP_ENTRY          ; WE WILL NOW WAIT FOR TURNON COMMAND\r
+\r
+TURNED_ON:\r
+       LDI     D,0                     ; STOP TIMER, WE WILL REGAIN\r
+       OUT     TCCR0,D                 ; CONTROL VIA NEXT CLOCKING INTERRUPT\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,50*4\r
+       CP      SCAN,C\r
+       BRLO    L0617\r
+\r
+       ; COMPLETED ENTIRE SCAN, START NEW SCAN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+       DEC     D\r
+       STS     DEBOUNCE,D\r
+       BRNE    L0617_RESET\r
+\r
+       LDS     D,ACTIVE_ZONE\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE\r
+       BRSH    L0617_RESET\r
+\r
+       PUSH    A\r
+       LDI     A,0\r
+       RCALL   TX_CHAR\r
+       POP     A\r
+\r
+L0617_RESET:\r
+       CLR     SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+L0617: ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+       LDIZ    SCAN_TBL\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDS     D,LATCH5_SAV\r
+       ANDI    D,$80                   ; BIT 7 = PRESERVED, LCD ON/OFF STATUS\r
+       ORI     D,$40                   ; BIT 6 = 1 VDD ON\r
+       OR      D,R0\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    CLEAR_DISPLAY_LOOP\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_PAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; HOW MANY SECS/6553600 PER 4HZ INTERRUPT ?\r
+; EACH TIME THROUGH ADD 1638400 SECS/6553600 = 1/4 SEC\r
+; OSCILLATOR IS SLOW SO WE WILL ADD 1 PART IN 10000\r
+; HENCE EACH TIME THROUGH ADD 1638400+164 = 1638564 UNITS TO COUNT\r
+\r
+TIM2_OVF:\r
+       IN      SR,SREG\r
+\r
+        WDR                    ; BETTER TO HAVE THIS NOT IN AN INTERRUPT??\r
+;!!    LDI     A,$10                   ; DIAGNOSTIC\r
+;!!    STS     BUZZ_TIME,A             ; SHORT BEEP\r
+\r
+       LDS     D,TIME_HSEC_64K\r
+       SUBI    D,LOW(-1638564)\r
+       STS     TIME_HSEC_64K,D\r
+\r
+       LDS     D,TIME_HSEC_256\r
+       SBCI    D,HIGH(-1638564)\r
+       STS     TIME_HSEC_256,D\r
+\r
+       LDS     D,TIME_HSEC\r
+       SBCI    D,HIGH(-1638564>>8)\r
+       CPI     D,100\r
+       BRSH    TIM2_CARRY\r
+       STS     TIME_HSEC,D\r
+\r
+TIM2_END:\r
+       OUT     SREG,SR\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA COMMAND,\r
+       ;RETI                           ; START A NEW SCAN, OTHERWISE DONE\r
+\r
+       LDI     D,0\r
+       STS     SCAN_STATE,D            ; WE WILL EXECUTE SCAN_START ROUTINE\r
+       RJMP    T0_OVERFLOW             ; GO AND TURN VDD ON\r
+\r
+GO_TX_CHAR:\r
+       RJMP    TX_CHAR\r
+\r
+TIM2_CARRY:\r
+       LDI     D,0\r
+       STS     TIME_HSEC,D\r
+\r
+       LDS     D,TIME_SECOND\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_SECOND\r
+\r
+       LDS     D,TIME_MINUTE\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_MINUTE\r
+\r
+       LDS     D,TIME_HOUR\r
+       INC     D\r
+       CPI     D,24\r
+       BRLO    TIM2_HOUR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+       LDI     ZL,LOW(MONTH_TABLE*2-1)\r
+       LDI     ZH,HIGH(MONTH_TABLE*2-1)\r
+       LDS     E,DATE_MONTH\r
+       ADD     ZL,E\r
+       LDI     E,0\r
+       ADC     ZH,E\r
+       LPM\r
+       MOV     E,R0\r
+       CPI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDS     E,DATE_YEAR\r
+       ANDI    E,3\r
+       LDI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDI     E,29\r
+FEBRUARY_OK:\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDS     D,DATE_DAY\r
+       CP      D,E\r
+       BRLO    TIM2_DAY\r
+\r
+       LDS     D,DATE_MONTH\r
+       CPI     D,12\r
+       BRLO    TIM2_MONTH\r
+\r
+       LDS     D,DATE_YEAR\r
+       INC     D\r
+       STS     DATE_YEAR,D\r
+       CLR     D\r
+TIM2_MONTH:\r
+       INC     D\r
+       STS     DATE_MONTH,D\r
+       CLR     D\r
+TIM2_DAY:\r
+       INC     D\r
+       STS     DATE_DAY,D\r
+       CLR     D\r
+TIM2_HOUR:\r
+       STS     TIME_HOUR,D\r
+       CLR     D\r
+TIM2_MINUTE:\r
+       STS     TIME_MINUTE,D\r
+       CLR     D\r
+TIM2_SECOND:\r
+       STS     TIME_SECOND,D\r
+\r
+TIM2_SEND:\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-7\r
+       BRSH    TIM2_SEND_SKIP\r
+\r
+       PUSH    A\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'T'\r
+       RCALL   TX_CHAR\r
+; LDS A,VCCL\r
+; RCALL TX_CHAR\r
+; LDS A,VCCH\r
+; RCALL TX_CHAR\r
+; LDS A,VEEL\r
+; RCALL TX_CHAR\r
+; LDS A,VEEH\r
+; RCALL TX_CHAR\r
+; LDI A,$0D\r
+; RCALL TX_CHAR\r
+       LDS     A,TIME_HOUR\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_MINUTE\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_SECOND\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_MONTH\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_DAY\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_YEAR\r
+       RCALL   GO_TX_CHAR\r
+       POP     A\r
+\r
+TIM2_SEND_SKIP:\r
+       RJMP    TIM2_END\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MONTH_TABLE:\r
+       .DB     31,28,31,30,31,30,31,31,30,31,30,31\r
+\r
+; 1ST BYTE = LED\r
+; 2ND BYTE = PHOTO\r
+; 3RD BYTE = TOUCH CHANNEL\r
+\r
+SCAN_TBL:\r
+       .DB     $F0,$34,$00,$00,$E8,$34,$01,$00,$F0,$33,$01,$00,$E8,$33,$02,$00\r
+       .DB     $E4,$33,$03,$00,$E8,$32,$03,$00,$E4,$32,$04,$00,$E2,$32,$05,$00\r
+       .DB     $E4,$31,$05,$00,$E2,$31,$06,$00,$E1,$31,$07,$00,$E2,$30,$07,$00\r
+       .DB     $E1,$30,$08,$00,$C1,$2A,$00,$00,$C2,$2A,$01,$00,$C1,$2B,$01,$00\r
+       .DB     $C2,$2B,$02,$00,$C4,$2B,$03,$00,$C2,$2C,$03,$00,$C4,$2C,$04,$00\r
+       .DB     $C8,$2C,$05,$00,$C4,$18,$05,$00,$C8,$18,$06,$00,$D0,$18,$07,$00\r
+       .DB     $C8,$19,$07,$00,$D0,$19,$08,$00,$A1,$19,$09,$00,$D0,$1A,$09,$00\r
+       .DB     $A1,$1A,$0A,$00,$A2,$1A,$0B,$00,$A1,$1B,$0B,$00,$A2,$1B,$0C,$00\r
+       .DB     $A4,$1B,$0D,$00,$A2,$1C,$0D,$00,$A4,$1C,$0E,$00,$A8,$1C,$0F,$00\r
+       .DB     $A4,$1D,$0F,$00,$A8,$1D,$10,$00,$B0,$1D,$11,$00,$A8,$1E,$11,$00\r
+       .DB     $B0,$1E,$12,$00,$61,$1E,$13,$00,$B0,$1F,$13,$00,$61,$1F,$14,$00\r
+       .DB     $62,$1F,$15,$00,$61,$28,$15,$00,$62,$28,$16,$00,$64,$28,$17,$00\r
+       .DB     $62,$29,$17,$00,$64,$29,$18,$00\r
+\r
+RTN_CODE:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$08,$08,$08,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$7E,$00,$31,$00,$32,$00,$33,$00,$34,$00,$35,$00,$36,$00\r
+       .DB     $37,$00,$38,$00,$39,$00,$30,$00,$2D,$00,$3D,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$51,$00,$57,$00,$45,$00,$52,$00,$54,$00,$59,$00\r
+       .DB     $55,$00,$49,$00,$4F,$00,$50,$00,$5B,$00,$5D,$00,$5C,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$41,$00,$53,$00,$44,$00,$46,$00,$47,$00\r
+       .DB     $48,$00,$4A,$00,$4B,$00,$4C,$00,$3B,$00,$27,$00,$0D,$0D,$0D,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5A,$00,$58,$00,$43,$00\r
+       .DB     $56,$00,$42,$00,$4E,$00,$4D,$00,$2C,$00,$2E,$00,$2F,$00,$00,$00\r
+       .DB     $00,$00\r
+RTN_CODE_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+       .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+       .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+       .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+       .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+       .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+       .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+       .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+       .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+       .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+       .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+       .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+       .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+       .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+       .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+       .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+       .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+       .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+       .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+       .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+       .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+       .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+       .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+       .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+       .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+       .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+       .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+       .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+       .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+       .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+       .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+       .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+       .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+       .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+       .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+       .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+       .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+       .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+       .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+       .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+       .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+       .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+       .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+       .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+       .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+       .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+       .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+       .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+       .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+       .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+       .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+       .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+       .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+       .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+       .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+       .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+       .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+       .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+       .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+       .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+       .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+       .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+       .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+       .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4102                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/tsv0.asm b/src/avr/tsv0.asm
new file mode 100644 (file)
index 0000000..ae4fda1
--- /dev/null
@@ -0,0 +1,3568 @@
+;      TSV0.ASM\r
+;       22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;               TO WORK WITH REV E PARTS\r
+;              ;!! INDICATES CHANGES\r
+\r
+;**    INDICATES CHANGES FOR LOW VCC AVR MOD\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APITS.INC" ; NOT API.INC BECAUSE APITS.INC ALSO HAS TURNON COMMAND\r
+;.INCLUDE "TERTS.INC" ; NOT TER.INC BECAUSE FLAGS IN LOWER HALF OF REGISTER SET\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     PAGE,YH\r
+       RCALL   ADRYP                   ; AND SET PAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+       OUT     PORTC,@0                ; SET L ADDRESS FOR DSPRAM\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19\r
+       ;POP    @1\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       EOR     R19,@0\r
+       ANDI    R19,$E0\r
+       EOR     R19,@0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       SEI\r
+       STS     LATCH10_SAV,R19         ; MUST BE ATOMIC DUE TO TOGGLING M\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       ;LDS    R19,LATCH11_SAV         ; ALL THIS IS A TOTAL KLUDGE\r
+       ;BST    @0,7                    ; A7\r
+       ;BLD    R19,1\r
+       ;BST    @0,6                    ; A6\r
+       ;BLD    R19,0\r
+       ;OUT    PORTA,R19\r
+       ;NOP\r
+       ;SBI    PORTB,3\r
+       ;NOP\r
+       ;CBI    PORTB,3\r
+       ;STS    LATCH11_SAV,R19\r
+\r
+       MOV     R19,@1 ;PUSH @1\r
+       LSL     R19 ;@1\r
+       LSL     R19 ;@1\r
+       ;LDS    R19,LATCH11_SAV\r
+       BST     @0,7 ;R19,1             ; A7\r
+       BLD     R19,1 ;@1,1\r
+       BST     @0,6 ;R19,0             ; A6\r
+       BLD     R19,0 ;@1,0\r
+       OUT     PORTA,R19 ;@1\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@1\r
+       ;POP    @1\r
+\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       BST     @1,7                    ; A15\r
+       BLD     R19,1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,0\r
+       NOP\r
+       CBI     PORTB,1\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+       OUT     PORTA,@0                ; SELECT PHOTODIODE CHANNEL\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+       OUT     PORTA,@0                ; MAIN LED DRIVE PORT\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON LO\r
+       CBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON HI\r
+       SBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER HI\r
+       SBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER LO\r
+       CBR     D,1<<3\r
+       SBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER OFF\r
+       CBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =$FB35\r
+.EQU   T1_FULL_SCALE   =$FC2F\r
+\r
+.EQU   VEE_MIN         =$FC40 ; MIN IS FULLY DARK\r
+.EQU   VEE_MAX         =$FFC0 ; MAX IS FULLY LIGHT\r
+.EQU   VEE_INIT        =$FE00\r
+\r
+.EQU   CONTRAST_LONG   =$FE00 ; ALL LONG PULSES IS FULLY DARK\r
+;!!.EQU        CONTRAST_LONG   =$FC40 ; ALL LONG PULSES IS FULLY DARK\r
+.EQU   CONTRAST_SHORT  =$FFC0 ; ALL SHORT PULSES IS FULLY LIGHT\r
+.EQU   CONTRAST_MID    =$FE00\r
+\r
+.EQU   VCC_NOMINAL     =$FCC4\r
+\r
+; WHEN VCC = $FCC4 FOR 6.0V:\r
+;.EQU  CONTRAST_MIN    =$FCA0 ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK FOR ALBERT'S LCDS\r
+.EQU   CONTRAST_MAX    =$FD00 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FCD0\r
+.EQU   CONTRAST_INIT   =$FCB0 ; FOR ALBERT'S\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+;.EQU  CONTRAST_MIN    =$FC80 ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FF80 ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FE10\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$80\r
+.EQU   CHARACTER_SETS  =10\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$20\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   TK_LED_PULSE    =$1E            ; 22US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_0      =$38            ; 54US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_1      =$28            ; CLOCKS OF /64, CHANNEL SELECT DELAY\r
+.EQU   TK_DELAY_2      =$00            ; CLOCKS OF /1024, VDD POWER ON DELAY\r
+                                       ; $D0 IS TOO SHORT, $E0 SEEMS TO WORK\r
+\r
+.EQU   API_ADDRESS     =$02            ; TOUCHSCREEN ADDRESS\r
+.EQU   API_TIMEOUT     =50             ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$8F            ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05            ; DIVISOR FOR 115200 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   USED TO CONTROL LED PULSING FOR TOUCHSCREEN EVERY 2ND CYCLE\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+BUZZ_TIME:     .BYTE   1       ; 10B\r
+BUZZ_PERIOD:   .BYTE   1\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+DEBOUNCE:      .BYTE   1\r
+ROW_INDEX:     .BYTE   1\r
+ROW_BITMAP:    .BYTE   2\r
+LATCH10_SAV:   .BYTE   1\r
+LATCH11_SAV:   .BYTE   1\r
+LATCH12_SAV:   .BYTE   1\r
+PAGE:          .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+CLOCKING_PTR:  .BYTE   2\r
+\r
+CHAR_X:                .BYTE   1\r
+CHAR_Y:                .BYTE   1\r
+CHAR_PTR:      .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TOUCH_KEY:     .BYTE   1\r
+TOUCH_X:       .BYTE   1\r
+TOUCH_Y:       .BYTE   1\r
+TOUCH_XX:      .BYTE   1\r
+TOUCH_YY:      .BYTE   1\r
+\r
+TIME_HSEC_64K: .BYTE   1\r
+TIME_HSEC_256: .BYTE   1\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+SCAN_STATE:    .BYTE   1\r
+LATCH5_SAV:    .BYTE   1\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   1\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RJMP    GO_TIM2_OVF             ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_T1_OVERFLOW\r
+       RJMP    GO_T0_OVERFLOW\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       LDI     F,0\r
+       STS     TIME_HSEC_64K,F\r
+       STS     TIME_HSEC_256,F\r
+       STS     TIME_HSEC,F\r
+       STS     TIME_SECOND,F\r
+       STS     TIME_MINUTE,F\r
+       STS     TIME_HOUR,F\r
+       LDI     F,1\r
+       STS     DATE_DAY,F\r
+       STS     DATE_MONTH,F\r
+       LDI     F,20\r
+       STS     DATE_YEAR,F\r
+\r
+RESTART_ENTRY:\r
+;**:\r
+       LDI     F,8                     ; TIMER 2 CLOCKED BY 32 KHZ\r
+;**    LDI     F,0                     ; TIMER 2 CLOCKED BY 11 MHZ\r
+       OUT     ASSR,F\r
+;**:\r
+       ; MUST MATCH SET_TIME ROUTINE %\r
+       LDI     F,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;!!    LDI     F,$11                   ; DIVIDE BY 2, TOGGLE OC2 (PIN 21)\r
+                                       ; (RTC DIAGNOSTIC)\r
+;**    LDI     F,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,F\r
+       ; %\r
+       LDI     F,$40\r
+       OUT     TIMSK,F                 ; TIMER 2 OVERFLOW INTERRUPTS ENABLED\r
+       LDI     F,$00\r
+       OUT     GIMSK,F\r
+\r
+       LDI     F,$B8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       OUT     PORTD,F                 ; D2 = TRI-STATE, VSWT ON\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$03                   ; CS, WE HI, LEs ALL LO\r
+       OUT     PORTB,F\r
+\r
+       LDI     F,$10                   ; LED COMMON OFF, SPEAKER OFF\r
+       OUT     PORTC,F\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,F\r
+\r
+       LDI     F,$20\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ENABLED\r
+\r
+       INIT_API_BUS\r
+\r
+       LDI     D,$18                   ; A18|A17|A16|A15|A14=11000\r
+       OUT     PORTA,D                 ; CL1=M=FLM=0\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BUZZ_TIME,D             ; NOT BUZZING (SHORT BEEP COMES LATER)\r
+\r
+       CLR     SCAN\r
+       STS     ROW_INDEX,SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+       LDI     D,$F4                   ; BIT 6 = 1 VDD ON, BIT 7 = 1 LCD ON\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       ; INITIALISE ACTIVE KEYS\r
+RTNCDE:        LDIZ    RTN_CODE                ; POINT Z TO FLASH\r
+       LDIX    RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+       LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET PAGE\r
+CDE0:  ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CDE1:  ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+ CLR R0 ; TEMPORARY CLEAR KB\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       DEC     XL\r
+       BREQ    RTNCDE_END              ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CDE1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CDE0\r
+RTNCDE_END:\r
+\r
+       ; INITIALISE DEFAULT CHARACTER SET\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+       LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       ; CLEAR REFRESH BUFFER TO AVOID A BRIEF FLICKER\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   GO_SELECT_PAGE\r
+\r
+       LDI     B,DISPLAY_LINES         ; B = LINES TO CLEAR\r
+\r
+CLEAR_REFRESH:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDI     B,32\r
+       RCALL   GO_CLEAR_BYTES          ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   GO_CLEAR_BYTES          ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    CLEAR_REFRESH\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       LDI     A,0\r
+       STS     BUZZ_PERIOD,A           ; HIGHEST FREQUENCY\r
+       LDI     A,$40 ;$10\r
+       STS     BUZZ_TIME,A             ; SHORT BEEP ON STARTUP\r
+\r
+       LDI     A,0\r
+       STS     SCAN_STATE,A            ; START ON FIRST LED / PHOTODIODE PAIR\r
+\r
+       LDI     A,0\r
+       STS     CLOCKING_PTR,A\r
+       STS     CLOCKING_PTR+1,A        ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       LDI     F,$45\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1, 2 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  HELLO_DISPLAY           ; SHOW EXAMPLE DISPLAY\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       SBI     PORTD,4                 ; TURN TRANSISTOR OFF\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,LATCH10_SAV\r
+       ANDI    D,$BF                   ; DROP M\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       LDI     D,$74                   ; BIT 6 = 1 VDD ON, BIT 7 = 0 LCD OFF\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       LDI     D,$34                   ; BIT 6 = 0 VDD OFF, BIT 7 = 0 LCD OFF\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       LDI     D,$41\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 INTERRUPTS\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; DISABLE TIMER 0 TEMPORARILY ONLY\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+       LDI     F,4\r
+       STS     TURNON_COUNT,F          ; .25 SEC TO BREAK, .75 SEC TO MAKE\r
+\r
+       INIT_API_BUS                    ; RESET UART TO RECEIVE TURNON COMMAND\r
+\r
+SLEEP_LOOP:\r
+       CLI\r
+       IN      F,TCCR0\r
+       TST     F\r
+       LDI     F,$4A                   ; SE=1 SM1:SM0=00 FOR IDLE MODE\r
+       BRNE    SLEEP_SETUP             ; TIMER 0 RUNNING, STAY IN IDLE MODE\r
+       SBIS    PIND,0                  ; BREAK OFF, UART ACTIVE, STAY IN IDLE\r
+       LDI     F,$7A                   ; SE=1 SM1:SM0=11 FOR POWER SAVE MODE\r
+SLEEP_SETUP:\r
+       OUT     MCUCR,F\r
+       SEI\r
+       SLEEP\r
+\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDS     F,TURNON_COUNT\r
+       TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       ;SBIS   PIND,0                  ; AND BREAK HAS DISAPPEARED, WAKE UP\r
+       BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+\r
+       CLI\r
+       RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP: LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
+       LDS     YL,LATCH10_SAV\r
+       ANDI    YL,$E0\r
+       OR      YH,YL\r
+       OUT     PORTA,YH\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,PAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     PAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;HELLO_DISPLAY:\r
+;      LDI     A,0\r
+;      STS     RECTNC_X,A\r
+;      STS     RECTNC_Y,A\r
+;      STS     RECTNC_XX,A\r
+;      LDI     A,$80\r
+;      STS     RECTNC_YY,A\r
+;      RCALL   DRAW_RECTNC\r
+;\r
+;      LDI     A,16\r
+;      STS     CHAR_X,A\r
+;      STS     CHAR_Y,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;      RCALL   STRING_DRAW\r
+;\r
+;      LDI     A,240\r
+;      STS     CHAR_X,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;\r
+;STRING_RIGHT_JUST:\r
+;      PUSH    B\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   STRING_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     B\r
+;      LDS     A,CHAR_X\r
+;      SUB     A,R0\r
+;      STS     CHAR_X,A\r
+;\r
+;STRING_DRAW:\r
+;      PUSH    B\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      PUSH    R0\r
+;      RCALL   DRAW_CHAR\r
+;      POP     R0\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      LDS     A,CHAR_X\r
+;      ADD     A,R0\r
+;      STS     CHAR_X,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_DRAW\r
+;      RET\r
+;\r
+;STRING_WIDTH:\r
+;      CLR     R0\r
+;STRING_WIDTH_LOOP:\r
+;      PUSH    B\r
+;      PUSH    R0\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     A\r
+;      ADD     R0,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_WIDTH_LOOP\r
+;      RET\r
+;\r
+;HELLO_MESSAGE:        .DB     'H','E','L','L','O',0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+;L0132:\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+;L0135:\r
+       CPI     A,$0A\r
+       BRNE    TEST_BELL\r
+       RJMP    LF\r
+TEST_BELL:\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'B'\r
+       RJEQ    BUZZER\r
+       CPI     A,'b'\r
+       RJEQ    BUZZ_AT_FREQ\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'T'\r
+       RJEQ    SET_TIME\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       SBI     DDRD,2                  ; D2 = LOW, VSWT OFF\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+BUZZER:        RCALL   RX_WAIT\r
+       PUSH    A\r
+       LDI     A,0                     ; HIGHEST FREQUENCY\r
+       RJMP    BUZZ_AT_FREQ_A\r
+\r
+BUZZ_AT_FREQ:\r
+       RCALL   RX_WAIT\r
+       PUSH    A\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$0F\r
+BUZZ_AT_FREQ_A:\r
+       STS     BUZZ_PERIOD,A           ; SAVE REQUESTED PERIOD\r
+       POP     A\r
+       STS     BUZZ_TIME,A             ; SAVE REQUESTED DURATION\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_TIME:\r
+       LDI     A,0\r
+       OUT     TCCR2,A                 ; STOP COUNTING WHILE SETTING CLOCK\r
+       STS     TIME_HSEC_64K,A\r
+       STS     TIME_HSEC_256,A\r
+       STS     TIME_HSEC,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_HOUR,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_MINUTE,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_SECOND,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_MONTH,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_DAY,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_YEAR,A\r
+       LDI     A,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;**    LDI     A,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+;L01A3:\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    CLR     CURSORX\r
+       RJMP    MAIN_LOOP\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       STS     TOUCH_KEY,A\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       SUBI    A,-9\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_X,B\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A\r
+       SUBI    A,-4\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_Y,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YL\r
+       SUBI    A,15\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_XX,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YH\r
+       SUBI    A,17\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_YY,B\r
+\r
+       LDS     YH,TOUCH_Y\r
+TOUCH_ZONE_Y:\r
+       LDS     A,TOUCH_YY\r
+       SUB     A,YH\r
+       BRSH    TOUCH_ZONE_Y_CONT\r
+       RJMP    TOUCH_ZONE_Y_END\r
+TOUCH_ZONE_Y_CONT:\r
+\r
+       LDS     YL,TOUCH_X\r
+       MOV     A,YL\r
+       ADD     A,YH\r
+       MOV     B,YH\r
+       LSL     B\r
+       LSL     B\r
+       LSL     B\r
+       ADD     A,B\r
+       LSL     B\r
+       ADD     A,B\r
+\r
+       LDI     XL,LOW(RTN_DSPRAM)\r
+       LDI     XH,HIGH(RTN_DSPRAM) ;<<2\r
+       LDI     B,0\r
+       ADD     XL,A\r
+       ADC     XH,B\r
+\r
+       LDI     B,HIGH(RTN_DSPRAM>>6)   ; B:X -> RETURN CODE TABLE\r
+       A14_A18 B\r
+\r
+TOUCH_ZONE_X:\r
+       LDS     A,TOUCH_XX\r
+       SUB     A,YL\r
+       BRLO    TOUCH_ZONE_X_END\r
+\r
+       A0_A13  XL,XH\r
+       LDS     A,TOUCH_KEY\r
+       RAMWR   A                       ; WRITE DATA TO DSPRAM\r
+\r
+       ADIW    XL,1\r
+       INC     YL\r
+       RJMP    TOUCH_ZONE_X\r
+\r
+TOUCH_ZONE_X_END:\r
+       INC     YH\r
+       RJMP    TOUCH_ZONE_Y\r
+\r
+TOUCH_ZONE_Y_END:\r
+       RJMP    MAIN_LOOP\r
+\r
+DIVIDE_10:\r
+       LDI     B,-1\r
+DIVIDE_10_LOOP:\r
+       INC     B\r
+       SUBI    A,10\r
+       BRCC    DIVIDE_10_LOOP\r
+       RET\r
+\r
+DIVIDE_13:\r
+       LDI     B,-1\r
+DIVIDE_13_LOOP:\r
+       INC     B\r
+       SUBI    A,13\r
+       BRCC    DIVIDE_13_LOOP\r
+       RET\r
+\r
+NULLSUB2:\r
+       RCALL   RX_WAIT\r
+\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       RCALL   FIND_CHAR               ; SET UP CHAR_PTR FROM A = CHAR\r
+       RCALL   CHAR_WIDTH              ; SET UP R0 = PROP WIDTH FROM CHAR PTR\r
+\r
+       CLR     F\r
+       STS     TEMP,F                  ; NUDGE FOR FIXED SPACING MODE\r
+\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE               ; FORCED TO FIXED SPACING MODE?\r
+\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS                    ; GET R0 = CELL WIDTH FOR CHARACTER SET\r
+       PUSH    R0\r
+       SUB     R0,W\r
+       BRCC    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       POP     R0                      ; RESTORE R0 = FIXED CELL WIDTH\r
+\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE                 ; FORCED TO GRAPHICS MODE?\r
+\r
+       MOV     F,CURSORX\r
+       ADD     F,R0                    ; CHECK IF CHAR WILL FIT ON THIS LINE\r
+       BRCC    OK_LINE\r
+\r
+       CLR     CURSORX\r
+       RCALL   LINE_FEED               ; NO, WRAP CURSOR PRIOR TO DRAWING CHAR\r
+\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE             ; IN CASE WE SCROLLED THE DISPLAY\r
+\r
+OK_LINE:\r
+       LDS     F,TEMP\r
+       ADD     F,CURSORX\r
+       STS     CHAR_X,F\r
+       STS     CHAR_Y,CURSORY          ; SET UP TOP LEFT COORDINATES\r
+\r
+       ADD     CURSORX,R0              ; ADVANCE CURSOR\r
+\r
+DRAW_CHAR:\r
+       LDS     XPIXEL,CHAR_X\r
+       LDS     LINE_CNT,CHAR_Y\r
+\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE           ; Y OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+\r
+Y_OFFSET_DONE:\r
+       SBRS    X_SIZE,7\r
+       RJMP    X_OFFSET_DONE           ; X OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$03\r
+       RCALL   LPMS\r
+       ADD     XPIXEL,R0\r
+\r
+X_OFFSET_DONE:\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       ADIW    YL,$01\r
+       RCALL   LPMS                    ; GET R0 = Y LINES FOR CHARACTER\r
+       MOV     Y_SIZE,R0\r
+\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0                 ; REMOVE_CS\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+FIND_CHAR:\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_PAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       STS     CHAR_PTR,YL\r
+       STS     CHAR_PTR+1,YH\r
+       RET\r
+\r
+CHAR_WIDTH:\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    LPMS                    ; PROPORTIONAL WIDTH IS PRESENT\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RJMP    LPMS                    ; NO PROPORTIONAL WIDTH, USE CELL WIDTH\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> DISPLAY BUFFER\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       LDI     B,32\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       SBIW    XL,2\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   COPY_BYTES              ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+ ; LET'S BE SAFE\r
+ ANDI A,$7F\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_CLEAR_BYTES:\r
+       RJMP    CLEAR_BYTES\r
+\r
+GO_SELECT_PAGE:\r
+       RJMP    SELECT_PAGE\r
+\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+\r
+GO_TIM2_OVF:\r
+       RJMP    TIM2_OVF\r
+\r
+GO_T1_OVERFLOW:\r
+       RJMP    T1_OVERFLOW\r
+\r
+GO_T0_OVERFLOW:\r
+       RJMP    T0_OVERFLOW\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+CLEAR_DISPLAY_LOOP:\r
+       CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    CLEAR_DISPLAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXT_INT0:\r
+;**:\r
+RETI\r
+;**    IN      SR,SREG                 ; MEASURE VCC\r
+;**    SBI     DDRD,2\r
+;**    IN      C,TCNT1L\r
+;**    IN      D,TCNT1H\r
+;**    STS     VCCH,D\r
+;**    STS     VCCL,C\r
+;**    RJMP    EXT_INT_RET\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    EXT_INT_RET\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+       ; REDUNDANT, NOW DONE IN TIMER 2 OVERFLOW HANDLER\r
+       ;WDR\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+        LDI     D,$70                  ; FORCE DUMMY COMPARE MATCH\r
+        OUT     TCCR1A,D                ; TO SET OC1B, TOGGLE OC1A\r
+        IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+        IN      D,TCNT1H                ; READ CURRENT COUNT\r
+        SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+        SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+        OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+        OUT     OCR1AL,C\r
+        OUT     OCR1BH,D\r
+        OUT     OCR1BL,C\r
+\r
+       LDS     C,CLOCKING_PTR\r
+       TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
+       BRNE    BREAK_CONT              ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK_CONT              ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+GO_SLEEP_ENTRY:\r
+       RJMP    SLEEP_ENTRY\r
+BREAK_CONT:\r
+\r
+;**    SBI     DDRD,2                  ; PRECHARGE VCC AND\r
+;**    SBI     PORTD,2\r
+       SBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CLR     D\r
+       OUT     TCCR1B,D                ; STOP TIMER1\r
+       OUT     TCNT1H,D                ; AND CLEAR COUNT\r
+       OUT     TCNT1L,D\r
+;!!    CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,CLOCKING_PTR+1\r
+       OR      D,C                     ; START OF FRAME?  (REALLY LINE 1)\r
+       BREQ    L04E6                   ; YES, GO AND TOGGLE M ETC\r
+\r
+       LDS     D,LATCH10_SAV\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       SBI     PORTA,5                 ; PULSE CL1\r
+       CBI     PORTA,5\r
+       CBI     PORTB,4\r
+       RJMP    L04F9\r
+\r
+L04E6: LDS     D,LATCH10_SAV\r
+       ORI     D,$80                   ; RAISE FLM\r
+       ORI     D,$20                   ; RAISE CL1\r
+       OUT     PORTA,D\r
+\r
+       SBI     PORTB,4\r
+       LDI     C,$60                   ; TOGGLE M AND CL1\r
+       EOR     D,C\r
+       OUT     PORTA,D\r
+       ANDI    D,$7F                   ; DROP FLM\r
+       OUT     PORTA,D\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+L04F9: LDS     D,LATCH10_SAV           ; SAVE STATE\r
+       PUSH    D\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDS     ZL,CLOCKING_PTR\r
+       LDS     ZH,CLOCKING_PTR+1\r
+\r
+       SUBI    ZL,LOW(-$40)\r
+       SBCI    ZH,HIGH(-$40)\r
+       ANDI    ZH,HIGH(DISPLAY_LINES*$40-1)\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       CBI     PORTB,1                 ; CLR HC590\r
+       SBI     PORTB,1\r
+       CBI     PORTD,7                 ; DROP OE FOR HC590\r
+       CLR     C\r
+       OUT     DDRA,C                  ; PORTA HI Z\r
+       LDI     C,$C0\r
+       OUT     DDRC,C                  ; PORTC HI Z\r
+       CBI     PORTB,0                 ; DROP CS FOR DSPRAM\r
+\r
+       CLR     D\r
+       OUT     OCR1AH,D\r
+;**:\r
+       LDI     D,1                     ; TO CLOCK AT 5.5/2 MHZ\r
+       OUT     OCR1AL,D\r
+       LDI     D,$09\r
+       OUT     TCCR1B,D                ; START CL2 CLOCKING WITH CLR ON MATCH\r
+\r
+       STS     CLOCKING_PTR,ZL\r
+       STS     CLOCKING_PTR+1,ZH\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;**:\r
+       LDI     D,$7A                   ; WAIT FOR 32uSEC\r
+;!!    LDI     D,$80                   ; WAIT FOR 32uSEC\r
+;**    LDI     D,$39                   ; WAIT FOR 16uSEC\r
+L050E: DEC     D\r
+       BRNE    L050E\r
+\r
+;!!    LDI     D,$01\r
+;!!    OUT     TCCR1B,D                ; KILL CLR ON COMPARE MATCH\r
+;!!    SBI     PORTD,5                 ; SET CL2 HI (FOR REV E DOES NOTHING)\r
+       SBI     PORTB,0                 ; RAISE CS FOR DSPRAM\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+       SBI     PORTD,7                 ; RAISE OE FOR HC590\r
+       OUT     DDRC,D                  ; PORTC OUTPUT\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+;!!:\r
+       LDI     D,$01                   ; KILL CLR ON COMPARE MATCH\r
+       OUT     TCCR1B,D                ; WITH OC1A LEFT IN HIGH STATE\r
+\r
+       LDI     D,$0B                   ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0535\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+\r
+L0535: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+;**    LDS     C,VCCL\r
+;**    LDS     D,VCCH\r
+;**    LDI     E,LOW(VCC_NOMINAL)\r
+;**    SUB     C,E\r
+;**    LDI     E,HIGH(VCC_NOMINAL)\r
+;**    SBC     D,E\r
+\r
+;**    ROR     D\r
+;**    ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.5\r
+;**    PUSH    D\r
+;**    PUSH    C\r
+;**    ASR     D\r
+;**    ROR     C                       ; ALL CORRECTION VALUES, SLOPE=0.25\r
+;**    POP     E\r
+;**    ADD     C,E\r
+;**    POP     E\r
+;**    ADC     C,D                     ; ALL CORRECTION VALUES, SLOPE=0.75\r
+\r
+;**:\r
+       LDS     C,VEEL\r
+       LDS     D,VEEH\r
+;**    LDS     E,VEEL\r
+;**    ADD     C,E\r
+;**    LDS     E,VEEH\r
+;**    ADC     D,E\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       LDI     D,2\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_DELAY_0           ; 54uSEC\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+;**    CBI     DDRD,2                  ; START VCC AND\r
+;**    CBI     PORTD,2\r
+       CBI     DDRD,3                  ; TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+;!!:\r
+        LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+        OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+       RJMP    T1_OVERFLOW_RET\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; LED/PHOTODIODE SCANNING\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+       LDS     D,LATCH10_SAV\r
+       PUSH    D\r
+\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       LDS     D,SCAN_STATE\r
+       INC     D\r
+       STS     SCAN_STATE,D\r
+       DEC     D\r
+       BREQ    SCAN_START              ; IF SCAN_STATE WAS = 0\r
+       DEC     D\r
+       BREQ    SCAN_BEEPER             ; IF SCAN_STATE WAS = 1\r
+ ; IMPLEMENT ENTRY POINT FOR SCAN_PULSE_LED HERE\r
+       DEC     D\r
+       RJEQ    SCAN_PHOTO              ; IF SCAN_STATE WAS = 2\r
+\r
+T0_OVERFLOW_RET:\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+\r
+T1_OVERFLOW_RET:\r
+       POP     D                       ; RESTORE STATE OF THE WORLD\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+EXT_INT_RET:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCAN_START:\r
+       LDI     D,3 ;5\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/1024\r
+       LDI     D,-TK_DELAY_1 ;TK_DELAY_2\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+       RJMP    L0617_RESET\r
+\r
+SCAN_BEEPER:\r
+       LDS     D,BUZZ_TIME\r
+       TST     D\r
+       BREQ    SCAN_PULSE_LED\r
+       LDS     D,BUZZ_PERIOD\r
+       SUBI    D,$10\r
+       BRLO    BUZZ_TOGGLE\r
+       STS     BUZZ_PERIOD,D\r
+       RJMP    SCAN_PULSE_LED\r
+BUZZ_TOGGLE:                           ; ASSUME D = $F0 + PERIOD-1\r
+       MOV     C,D                     ; EG. C = $F3 FOR PERIOD = 4\r
+       SWAP    C                       ; EG. C = $3F FOR PERIOD = 4\r
+       AND     D,C                     ; EG. D = $33 FOR PERIOD = 4\r
+       STS     BUZZ_PERIOD,D\r
+       LDS     C,LATCH12_SAV\r
+       SBRS    C,3                     ; TEST PREVIOUS SPEAKER STATE\r
+       RJMP    BEEPER_SPKHI\r
+       LDS     D,BUZZ_TIME\r
+       DEC     D\r
+       STS     BUZZ_TIME,D\r
+       BREQ    BEEPER_SPKOFF\r
+;BEEPER_SPKLO:\r
+       SPKLO\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKHI:\r
+       SPKHI\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKOFF:\r
+       SPKOFF\r
+\r
+SCAN_PULSE_LED:\r
+       LDS     D,LATCH5_SAV\r
+;**:\r
+       SBRS    D,7                     ; ARE WE INSIDE SLEEP_LOOP?\r
+;**    SBRC    D,7\r
+       RJMP    SCAN_PULSE_LED_OK       ; YES, KEEP TIMER 0 TO RETAIN CONTROL\r
+\r
+       LDI     D,1<<7\r
+       EOR     FLAGS,D\r
+       BRPL    SCAN_PULSE_LED_OK       ; PULSE LED EVERY 2ND CYCLE\r
+\r
+       CLR     D\r
+       OUT     TCCR0,D                 ; STOP TIMER\r
+       RJMP    T0_OVERFLOW_RET         ; AND WASTE EVERY REMAINING CYCLE\r
+\r
+SCAN_PULSE_LED_OK:\r
+       LDI     D,2\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_LED_PULSE         ; 22uSEC\r
+       OUT     TCNT0,D\r
+\r
+       LDIZ    SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM                             ; R0 = LED DRIVE VALUE\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L0570\r
+       LEDLO                           ; ENABLE HORIZ LED DRIVE\r
+       RJMP    L0574\r
+L0570: LEDHI                           ; DISABLE HORIZ LED DRIVE\r
+L0574: LED     R0\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCAN_PHOTO:\r
+       IN      D,PIND                  ; PHOTODIODE STATUS IN BIT 6,D\r
+       LDI     C,$E0\r
+       LED     C                       ; TURN OFF LED ??\r
+\r
+       CLC\r
+       SBRC    D,6\r
+       RJMP    L0593                   ; ROW/COLUMN IS INACTIVE\r
+\r
+       ; ROW/COLUMN IS ACTIVE\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0591\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+L0591: SEC\r
+\r
+L0593: ; WE HAVE A ROW/COLUMN STATUS IN CF\r
+       IN      C,SREG\r
+\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L05A8\r
+\r
+       ; WE HAVE A ROW STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       LDS     ZL,ROW_BITMAP\r
+       LDS     ZH,ROW_BITMAP+1\r
+       ROL     ZL\r
+       ROL     ZH\r
+       STS     ROW_BITMAP,ZL\r
+       STS     ROW_BITMAP+1,ZH\r
+       RJMP    L05F9\r
+\r
+L05A8: ; WE HAVE A COLUMN STATUS\r
+;      LDS     D,LATCH5_SAV\r
+;;**:\r
+;      SBRS    D,7                     ; TURNED OFF?\r
+;;**   SBRC    D,7\r
+;      RJMP    L05F9                   ; YES, NO FURTHER PROCESSING\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       BRCS    L05AB\r
+       RJMP    L05F9\r
+\r
+L05AB: ; WE HAVE AN ACTIVE COLUMN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L05B3\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       RJMP    L05F9\r
+\r
+L05B3: ; LOOK FOR ANY ACTIVE ROW\r
+       LDS     ZH,ROW_BITMAP+1\r
+       LDS     ZL,ROW_BITMAP\r
+\r
+       LDS     D,ROW_INDEX\r
+       TST     D\r
+       BREQ    ROW_BITMAP_LOOP\r
+\r
+       MOV     C,D\r
+ROW_BITMAP_SKIP:\r
+       ROR     ZH\r
+       ROR     ZL\r
+       SUBI    C,4\r
+       BRNE    ROW_BITMAP_SKIP\r
+\r
+ROW_BITMAP_LOOP:\r
+       SUBI    D,-4\r
+       ROR     ZH\r
+       ROR     ZL\r
+       BRCS    FOUND_INTERSECTION\r
+ROW_BITMAP_LOOPE:\r
+       CPI     D,13*4\r
+       BRLO    ROW_BITMAP_LOOP\r
+\r
+       ; NO FURTHER INTERSECTING ROWS FOUND\r
+       RJMP    L05F9\r
+\r
+FOUND_INTERSECTION:\r
+       ; FOUND AN INTERSECTING ROW FOR COLUMN\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,$34                   ; BECAUSE ROW_BITMAP IS BEING TESTED\r
+       SUB     C,D                     ; IN THE REVERSE ORDER TO ITS CREATION\r
+\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+       LPM\r
+       MOV     C,R0\r
+       LSL     R0\r
+       LSL     R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       ADD     C,R0\r
+       LDI     ZL,LOW(RTN_DSPRAM)      ; RETURN CODE TABLE\r
+       LDI     ZH,HIGH(RTN_DSPRAM)\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       PUSH    F\r
+       RAMRDX  R0\r
+       POP     F\r
+\r
+       TST     R0\r
+       BRNE    VALID_INTERSECTION\r
+\r
+       ; INTERSECTION IS NULL, GO ON TO NEXT\r
+       LDS     D,ROW_INDEX\r
+       CPI     D,13*4\r
+       BRSH    L05F9                   ; DONE LAST ROW, GO ON TO NEXT COLUMN\r
+GO_L0617:\r
+       RJMP    L0617                   ; GO ON TO NEXT ROW, SAME COLUMN\r
+\r
+VALID_INTERSECTION:\r
+       ; INTERSECTION IS VALID, WE HAVE KEY MAKE\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       STS     ACTIVE_ZONE,R0\r
+       LDI     D,$40 ;$10\r
+       STS     BUZZ_TIME,D             ; SHORT BEEP ON MAKE\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-1\r
+       BRSH    L05F9\r
+\r
+       PUSH    A\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       CPI     A,$1B\r
+       BRNE    TX_CONT\r
+       RCALL   TX_CHAR\r
+TX_CONT:\r
+       POP     A\r
+\r
+L05F9: ; SCAN TO NEXT LED / PHOTODIODE PAIR\r
+       LDI     D,4\r
+       ADD     SCAN,D\r
+\r
+       LDS     D,LATCH5_SAV\r
+;**:\r
+       SBRC    D,7\r
+;**    SBRS    D,7\r
+       RJMP    TURNED_ON\r
+\r
+       LDI     D,3\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/64\r
+       LDI     D,-TK_DELAY_1\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     C,13*4\r
+       CP      SCAN,C\r
+       BRLO    GO_L0617\r
+\r
+       ; KEEP VDD ON, TO AVOID THE LONG TK_DELAY_2\r
+       ;LDS    D,LATCH5_SAV\r
+       ;ANDI   D,$BF                   ; BIT 6 = 0 VDD OFF\r
+       ;STS    LATCH5_SAV,D\r
+       ;PHOTO  D                       ; READY TO SLEEP FOR ANOTHER 0.25 SEC\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; STOP TIMER SINCE COMPLETE SCAN DONE\r
+ ;RJMP T0_OVERFLOW_RET\r
+\r
+ ;LDI D,$05\r
+ ;OUT UBRR,D\r
+ ;LDI D,$18\r
+ ;OUT UCR,D\r
+       LDS     D,ROW_BITMAP+1\r
+       LDS     C,ROW_BITMAP\r
+ ;OUT UDR,C\r
+ ;OUT UDR,D\r
+       OR      C,D                     ; HAVE WE SOME ACTIVITY?\r
+\r
+       LDS     D,TURNON_COUNT\r
+       CPI     D,4\r
+       BRSH    TURNON_BREAK            ; WAITING FOR BREAK\r
+       CPI     D,1\r
+       BRSH    TURNON_MAKE             ; WAITING FOR MAKE\r
+GO_T0_OVERFLOW_RET:\r
+       RJMP    T0_OVERFLOW_RET         ; ALREADY HAD MAKE, NOT TURNED ON YET\r
+\r
+TURNON_BREAK:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BREQ    TURNON_SAVE             ; NO, COUNT DOWN TO BREAK\r
+       LDI     D,4+1                   ; YES, RESTART COUNTDOWN TO BREAK\r
+       RJMP    TURNON_SAVE\r
+TURNON_MAKE:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BRNE    TURNON_SAVE             ; YES, COUNT DOWN TO MAKE\r
+       LDI     D,3+1                   ; NO, RESTART COUNTDOWN TO MAKE\r
+TURNON_SAVE:\r
+       DEC     D                       ; COUNT DOWN TO MAKE OR BREAK\r
+       STS     TURNON_COUNT,D\r
+       BRNE    GO_T0_OVERFLOW_RET      ; NOT READY TO TRY TURNON YET\r
+\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       CBI     DDRD,2                  ; D2 = TRI-STATE, VSWT ON\r
+       RJMP    GO_SLEEP_ENTRY          ; WE WILL NOW WAIT FOR TURNON COMMAND\r
+\r
+TURNED_ON:\r
+       LDI     D,0                     ; STOP TIMER, WE WILL REGAIN\r
+       OUT     TCCR0,D                 ; CONTROL VIA NEXT CLOCKING INTERRUPT\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,50*4\r
+       CP      SCAN,C\r
+       BRLO    L0617\r
+\r
+       ; COMPLETED ENTIRE SCAN, START NEW SCAN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+       DEC     D\r
+       STS     DEBOUNCE,D\r
+       BRNE    L0617_RESET\r
+\r
+       LDS     D,ACTIVE_ZONE\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE\r
+       BRSH    L0617_RESET\r
+\r
+       PUSH    A\r
+       LDI     A,0\r
+       RCALL   TX_CHAR\r
+       POP     A\r
+\r
+L0617_RESET:\r
+       CLR     SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+L0617: ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+       LDIZ    SCAN_TBL\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDS     D,LATCH5_SAV\r
+       ANDI    D,$80                   ; BIT 7 = PRESERVED, LCD ON/OFF STATUS\r
+       ORI     D,$40                   ; BIT 6 = 1 VDD ON\r
+       OR      D,R0\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    CLEAR_DISPLAY_LOOP\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_PAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_PAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; HOW MANY SECS/6553600 PER 4HZ INTERRUPT ?\r
+; EACH TIME THROUGH ADD 1638400 SECS/6553600 = 1/4 SEC\r
+; OSCILLATOR IS SLOW SO WE WILL ADD 1 PART IN 10000\r
+; HENCE EACH TIME THROUGH ADD 1638400+164 = 1638564 UNITS TO COUNT\r
+\r
+TIM2_OVF:\r
+       IN      SR,SREG\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+;!!    LDI     A,$10                   ; DIAGNOSTIC\r
+;!!    STS     BUZZ_TIME,A             ; SHORT BEEP\r
+\r
+       LDS     D,TIME_HSEC_64K\r
+       SUBI    D,LOW(-1638564)\r
+       STS     TIME_HSEC_64K,D\r
+\r
+       LDS     D,TIME_HSEC_256\r
+       SBCI    D,HIGH(-1638564)\r
+       STS     TIME_HSEC_256,D\r
+\r
+       LDS     D,TIME_HSEC\r
+       SBCI    D,HIGH(-1638564>>8)\r
+       CPI     D,100\r
+       BRSH    TIM2_CARRY\r
+       STS     TIME_HSEC,D\r
+\r
+TIM2_END:\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA COMMAND,\r
+       RETI                            ; START A NEW SCAN, OTHERWISE DONE\r
+\r
+       LDI     D,0\r
+       STS     SCAN_STATE,D            ; WE WILL EXECUTE SCAN_START ROUTINE\r
+       RJMP    T0_OVERFLOW             ; GO AND TURN VDD ON\r
+\r
+GO_TX_CHAR:\r
+       RJMP    TX_CHAR\r
+\r
+TIM2_CARRY:\r
+       LDI     D,0\r
+       STS     TIME_HSEC,D\r
+\r
+       LDS     D,TIME_SECOND\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_SECOND\r
+\r
+       LDS     D,TIME_MINUTE\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_MINUTE\r
+\r
+       LDS     D,TIME_HOUR\r
+       INC     D\r
+       CPI     D,24\r
+       BRLO    TIM2_HOUR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+       LDI     ZL,LOW(MONTH_TABLE*2-1)\r
+       LDI     ZH,HIGH(MONTH_TABLE*2-1)\r
+       LDS     E,DATE_MONTH\r
+       ADD     ZL,E\r
+       LDI     E,0\r
+       ADC     ZH,E\r
+       LPM\r
+       MOV     E,R0\r
+       CPI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDS     E,DATE_YEAR\r
+       ANDI    E,3\r
+       LDI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDI     E,29\r
+FEBRUARY_OK:\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDS     D,DATE_DAY\r
+       CP      D,E\r
+       BRLO    TIM2_DAY\r
+\r
+       LDS     D,DATE_MONTH\r
+       CPI     D,12\r
+       BRLO    TIM2_MONTH\r
+\r
+       LDS     D,DATE_YEAR\r
+       INC     D\r
+       STS     DATE_YEAR,D\r
+       CLR     D\r
+TIM2_MONTH:\r
+       INC     D\r
+       STS     DATE_MONTH,D\r
+       CLR     D\r
+TIM2_DAY:\r
+       INC     D\r
+       STS     DATE_DAY,D\r
+       CLR     D\r
+TIM2_HOUR:\r
+       STS     TIME_HOUR,D\r
+       CLR     D\r
+TIM2_MINUTE:\r
+       STS     TIME_MINUTE,D\r
+       CLR     D\r
+TIM2_SECOND:\r
+       STS     TIME_SECOND,D\r
+\r
+TIM2_SEND:\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-7\r
+       BRSH    TIM2_SEND_SKIP\r
+\r
+       PUSH    A\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'T'\r
+       RCALL   TX_CHAR\r
+; LDS A,VCCL\r
+; RCALL TX_CHAR\r
+; LDS A,VCCH\r
+; RCALL TX_CHAR\r
+; LDS A,VEEL\r
+; RCALL TX_CHAR\r
+; LDS A,VEEH\r
+; RCALL TX_CHAR\r
+; LDI A,$0D\r
+; RCALL TX_CHAR\r
+       LDS     A,TIME_HOUR\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_MINUTE\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_SECOND\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_MONTH\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_DAY\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_YEAR\r
+       RCALL   GO_TX_CHAR\r
+       POP     A\r
+\r
+TIM2_SEND_SKIP:\r
+       RJMP    TIM2_END\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MONTH_TABLE:\r
+       .DB     31,28,31,30,31,30,31,31,30,31,30,31\r
+\r
+; 1ST BYTE = LED\r
+; 2ND BYTE = PHOTO\r
+; 3RD BYTE = TOUCH CHANNEL\r
+\r
+SCAN_TBL:\r
+       .DB     $F0,$34,$00,$00,$E8,$34,$01,$00,$F0,$33,$01,$00,$E8,$33,$02,$00\r
+       .DB     $E4,$33,$03,$00,$E8,$32,$03,$00,$E4,$32,$04,$00,$E2,$32,$05,$00\r
+       .DB     $E4,$31,$05,$00,$E2,$31,$06,$00,$E1,$31,$07,$00,$E2,$30,$07,$00\r
+       .DB     $E1,$30,$08,$00,$C1,$2A,$00,$00,$C2,$2A,$01,$00,$C1,$2B,$01,$00\r
+       .DB     $C2,$2B,$02,$00,$C4,$2B,$03,$00,$C2,$2C,$03,$00,$C4,$2C,$04,$00\r
+       .DB     $C8,$2C,$05,$00,$C4,$18,$05,$00,$C8,$18,$06,$00,$D0,$18,$07,$00\r
+       .DB     $C8,$19,$07,$00,$D0,$19,$08,$00,$A1,$19,$09,$00,$D0,$1A,$09,$00\r
+       .DB     $A1,$1A,$0A,$00,$A2,$1A,$0B,$00,$A1,$1B,$0B,$00,$A2,$1B,$0C,$00\r
+       .DB     $A4,$1B,$0D,$00,$A2,$1C,$0D,$00,$A4,$1C,$0E,$00,$A8,$1C,$0F,$00\r
+       .DB     $A4,$1D,$0F,$00,$A8,$1D,$10,$00,$B0,$1D,$11,$00,$A8,$1E,$11,$00\r
+       .DB     $B0,$1E,$12,$00,$61,$1E,$13,$00,$B0,$1F,$13,$00,$61,$1F,$14,$00\r
+       .DB     $62,$1F,$15,$00,$61,$28,$15,$00,$62,$28,$16,$00,$64,$28,$17,$00\r
+       .DB     $62,$29,$17,$00,$64,$29,$18,$00\r
+\r
+RTN_CODE:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$08,$08,$08,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$7E,$00,$31,$00,$32,$00,$33,$00,$34,$00,$35,$00,$36,$00\r
+       .DB     $37,$00,$38,$00,$39,$00,$30,$00,$2D,$00,$3D,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$51,$00,$57,$00,$45,$00,$52,$00,$54,$00,$59,$00\r
+       .DB     $55,$00,$49,$00,$4F,$00,$50,$00,$5B,$00,$5D,$00,$5C,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$41,$00,$53,$00,$44,$00,$46,$00,$47,$00\r
+       .DB     $48,$00,$4A,$00,$4B,$00,$4C,$00,$3B,$00,$27,$00,$0D,$0D,$0D,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5A,$00,$58,$00,$43,$00\r
+       .DB     $56,$00,$42,$00,$4E,$00,$4D,$00,$2C,$00,$2E,$00,$2F,$00,$00,$00\r
+       .DB     $00,$00\r
+RTN_CODE_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+       .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+       .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+       .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+       .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+       .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+       .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+       .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+       .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+       .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+       .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+       .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+       .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+       .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+       .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+       .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+       .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+       .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+       .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+       .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+       .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+       .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+       .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+       .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+       .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+       .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+       .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+       .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+       .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+       .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+       .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+       .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+       .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+       .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+       .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+       .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+       .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+       .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+       .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+       .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+       .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+       .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+       .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+       .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+       .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+       .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+       .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+       .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+       .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+       .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+       .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+       .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+       .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+       .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+       .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+       .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+       .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+       .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+       .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+       .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+       .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+       .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+       .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+       .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+       .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+       .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+       .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+       .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+       .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+       .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+       .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+       .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4102                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/tsv3-tsv4.diff b/src/avr/tsv3-tsv4.diff
new file mode 100644 (file)
index 0000000..b0c020a
--- /dev/null
@@ -0,0 +1,666 @@
+--- tsv3.asm   2003-03-18 12:26:48.000000000 +1100
++++ tsv4.asm   2003-03-20 16:55:02.000000000 +1100
+@@ -1,4 +1,4 @@
+-;     TSV3.ASM\r
++;     TSV4.ASM\r
\r
+ ;     19FEB02 REVISE FOR GREATER CONTRAST VOLTAGE FOR ALBERT'S 2ND BATCH -15V\r
+ ;     01FEB02 REVISE FOR 7.3728MHz XTAL (SEE !!!)\r
+@@ -17,8 +17,8 @@
+ .LISTMAC\r
+ .MACRO        LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+-      STS     PAGE,YH\r
+-      RCALL   ADRYP                   ; AND SET PAGE\r
++      STS     XPAGE,YH\r
++      RCALL   ADRYP                   ; AND SET XPAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+ .ENDMACRO\r
+@@ -289,12 +289,13 @@
\r
+ .EQU  API_ADDRESS     =$02            ; TOUCHSCREEN ADDRESS\r
+ .EQU  API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+-.EQU  API_RATE_SLOW   =$5F ;$8F       ; DIVISOR FOR 4800 BPS\r
+-.EQU  API_RATE_FAST   =$03 ;$05       ; DIVISOR FOR 115200 BPS\r
++.EQU  API_RATE_SLOW   =$17 ;$5F       ; DIVISOR FOR 19200 BPS\r
++.EQU  API_RATE_FAST   =$00 ;$03       ; DIVISOR FOR 460800 BPS\r
+ .EQU  EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+ .EQU  APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+ .EQU  APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
\r
++.DEF  PATTERN         =R0             ; FOR HALFTONE_RECT ROUTINE\r
+ .DEF  SR              =R1\r
+ .DEF  RX_PTR          =R2\r
+ .DEF  RX_COUNT        =R3\r
+@@ -332,6 +333,14 @@
+ .DEF  CURSORX         =R23\r
+ .DEF  CURSORY         =R24\r
\r
++; for AVRA / TAVRASM:\r
++;.def XL              =R26\r
++;.def XH              =R27\r
++;.def YL              =R28\r
++;.def YH              =R29\r
++;.def ZL              =R30\r
++;.def ZH              =R31\r
++\r
+ .DSEG\r
+ .ORG  RAM\r
\r
+@@ -364,7 +373,7 @@
+ LATCH10_SAV:  .BYTE   1\r
+ LATCH11_SAV:  .BYTE   1\r
+ LATCH12_SAV:  .BYTE   1\r
+-PAGE:         .BYTE   1\r
++XPAGE:                .BYTE   1\r
+ ROWBUF:               .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
\r
+ LINE_COUNT:   .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+@@ -535,9 +544,15 @@
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
\r
+       ; INITIALISE ACTIVE KEYS\r
+-RTNCDE:       LDIZ    RTN_CODE                ; POINT Z TO FLASH\r
+-      LDIX    RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+-      LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET PAGE\r
++RTNCDE:       ;LDIZ   RTN_CODE                ; POINT Z TO FLASH\r
++      LDI     ZL,LOW((RTN_CODE)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
++      LDI     ZH,HIGH((RTN_CODE)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
++      ;LDIX   RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
++      LDI     XL,LOW((RTN_CODE_END-RTN_CODE)*2)       ; USE AS BYTE COUNTER\r
++      LDI     XH,HIGH((RTN_CODE_END-RTN_CODE)*2)      ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
++      LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET XPAGE\r
+ CDE0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+ CDE1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+@@ -598,9 +613,15 @@
+       BREQ    CHARACTER_SET_INIT_DONE\r
\r
+ CHARACTER_SET_INIT:\r
+-      LDIZ    CHSET00                 ; POINT Z TO FLASH\r
+-      LDIX    CHSET00_END-CHSET00     ; BYTE COUNTER\r
+-      LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET PAGE\r
++      ;LDIZ   CHSET00                 ; POINT Z TO FLASH\r
++      LDI     ZL,LOW((CHSET00)*2)     ; USE PRIOR TO LPM INSTRUCTION\r
++      LDI     ZH,HIGH((CHSET00)*2)    ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
++      ;LDIX   CHSET00_END-CHSET00     ; BYTE COUNTER\r
++      LDI     XL,LOW((CHSET00_END-CHSET00)*2) ; USE AS BYTE COUNTER\r
++      LDI     XH,HIGH((CHSET00_END-CHSET00)*2)        ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
++      LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET XPAGE\r
+ CHST0:        ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+ CHST1:        ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+@@ -628,7 +649,7 @@
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   GO_SELECT_PAGE\r
++      RCALL   GO_SELECT_XPAGE\r
\r
+       LDI     B,DISPLAY_LINES         ; B = LINES TO CLEAR\r
\r
+@@ -672,11 +693,11 @@
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
\r
+-      LDI     B,EE_CONTRAST*2\r
++      LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+-      LDI     B,EE_CONTRAST*2+1\r
++      LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
\r
+@@ -802,7 +823,7 @@
\r
+ ; -----------------------------------------------------------------------------\r
\r
+-ADRYP:        LDS     YH,PAGE                 ; SET PAGE ADDRESS FOR DSPRAM\r
++ADRYP:        LDS     YH,XPAGE                        ; SET XPAGE ADDRESS FOR DSPRAM\r
+       LDS     YL,LATCH10_SAV\r
+       ANDI    YL,$E0\r
+       OR      YH,YL\r
+@@ -816,10 +837,10 @@
+ ;     CLR     YL\r
+ ;     INC     YH\r
+ ;     BRNE    INCRET\r
+-;     LDS     YH,PAGE\r
++;     LDS     YH,XPAGE\r
+ ;     INC     YH\r
+ ;     ANDI    YH,$1F\r
+-;     STS     PAGE,YH\r
++;     STS     XPAGE,YH\r
+ ;     CLR     YH\r
+ ;INCRET:      RET\r
\r
+@@ -972,14 +993,22 @@
+       RJEQ    BUZZ_AT_FREQ\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
++      CPI     A,'c'\r
++      RJEQ    GET_CLEAR_FRAME_RECT_SIZE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
++      CPI     A,'f'\r
++      RJEQ    GET_FRAME_RECT_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
++      CPI     A,'H'\r
++      RJEQ    GET_HALFTONE_RECT_SIZE\r
++      CPI     A,'h'\r
++      RJEQ    GET_CLEAR_HALFTONE_RECT_SIZE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+@@ -1292,10 +1321,10 @@
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
\r
+-      LDI     B,EE_CONTRAST*2\r
++      LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+-      LDI     B,EE_CONTRAST*2+1\r
++      LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_WRITE\r
\r
+ CONTRAST_DONE:\r
+@@ -1706,7 +1735,7 @@
+       RCALL   LINE_FEED               ; NO, WRAP CURSOR PRIOR TO DRAWING CHAR\r
\r
+       LDS     A,PTR+2\r
+-      RCALL   SELECT_PAGE             ; IN CASE WE SCROLLED THE DISPLAY\r
++      RCALL   SELECT_XPAGE            ; IN CASE WE SCROLLED THE DISPLAY\r
\r
+ OK_LINE:\r
+       LDS     F,TEMP\r
+@@ -1783,7 +1812,7 @@
\r
+ MORE_X:       ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
\r
+       CLR     A\r
+@@ -1833,7 +1862,7 @@
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+@@ -1909,7 +1938,7 @@
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
\r
+       LDI     B,32\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+@@ -2043,8 +2072,8 @@
+ GO_CLEAR_BYTES:\r
+       RJMP    CLEAR_BYTES\r
\r
+-GO_SELECT_PAGE:\r
+-      RJMP    SELECT_PAGE\r
++GO_SELECT_XPAGE:\r
++      RJMP    SELECT_XPAGE\r
\r
+ GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+@@ -2083,7 +2112,7 @@
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+       RJMP    L03A3\r
+ L039A:        SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+@@ -2305,7 +2334,7 @@
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
+ CLEAR_DISPLAY_LOOP:\r
+       CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+@@ -2376,7 +2405,11 @@
+         OUT     OCR1BL,C\r
\r
+       LDS     C,CLOCKING_PTR\r
+-      TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
++;     TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
++ lds d,CLOCKING_PTR+1\r
++ andi d,1\r
++ or c,d ; checks for start of an 8 line block\r
++; rjmp BREAK0 ; temporary (prevents switching off via power switch)\r
+       BRNE    BREAK0                  ; NO, BREAK COUNTER IS OK FOR NOW\r
\r
+       LDS     D,BREAK_COUNT\r
+@@ -2689,7 +2722,10 @@
+       LDI     D,-TK_LED_PULSE         ; 22uSEC\r
+       OUT     TCNT0,D\r
\r
+-      LDIZ    SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
++      ;LDIZ   SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
++      LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
++      LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+@@ -2789,7 +2825,10 @@
+       LDI     C,$34                   ; BECAUSE ROW_BITMAP IS BEING TESTED\r
+       SUB     C,D                     ; IN THE REVERSE ORDER TO ITS CREATION\r
\r
+-      LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
++      ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
++      LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
++      LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+@@ -2801,7 +2840,11 @@
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+-      LDIZ    SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
++\r
++      ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
++      LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
++      LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+@@ -2951,7 +2994,10 @@
+       STS     ROW_BITMAP+1,SCAN\r
\r
+ L0617:        ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+-      LDIZ    SCAN_TBL\r
++      ;LDIZ   SCAN_TBL\r
++      LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
++      LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
++\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+@@ -2973,7 +3019,7 @@
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
\r
+ L0628:        SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+@@ -3025,7 +3071,7 @@
+       STS     SCROLL_Y,CURSORY\r
\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+-      RCALL   SELECT_PAGE\r
++      RCALL   SELECT_XPAGE\r
\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+@@ -3226,7 +3272,7 @@
+       RAMWR   A\r
+       RET\r
\r
+-SELECT_PAGE:\r
++SELECT_XPAGE:\r
+       A14_A18 A\r
+       RET\r
\r
+@@ -3423,106 +3469,237 @@
+ ; -----------------------------------------------------------------------------\r
\r
+ CHSET00:\r
+-      .DB     $34,$32,$43,$46,$30,$30,$31,$30,$31,$31,$31,$37,$35,$36,$30,$37\r
+-      .DB     $6B,$05,$75,$05,$77,$05,$39,$04,$79,$05,$7B,$05,$7D,$05,$7F,$05\r
+-      .DB     $81,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$83,$05,$85,$05,$0A,$02,$15,$02\r
+-      .DB     $17,$02,$1F,$02,$29,$02,$2E,$02,$37,$02,$40,$02,$49,$02,$53,$02\r
+-      .DB     $59,$02,$63,$02,$6C,$02,$74,$02,$7E,$02,$85,$02,$8A,$02,$8E,$02\r
+-      .DB     $96,$02,$9F,$02,$A8,$02,$B1,$02,$BA,$02,$C3,$02,$CC,$02,$D5,$02\r
+-      .DB     $DE,$02,$E7,$02,$F1,$02,$FA,$02,$04,$03,$0D,$03,$15,$03,$1E,$03\r
+-      .DB     $27,$03,$30,$03,$39,$03,$42,$03,$4B,$03,$54,$03,$5D,$03,$66,$03\r
+-      .DB     $6F,$03,$79,$03,$82,$03,$8B,$03,$94,$03,$9D,$03,$A6,$03,$AF,$03\r
+-      .DB     $B8,$03,$C1,$03,$CA,$03,$D3,$03,$DC,$03,$E5,$03,$EE,$03,$F7,$03\r
+-      .DB     $00,$04,$09,$04,$12,$04,$1C,$04,$25,$04,$2E,$04,$37,$04,$3E,$04\r
+-      .DB     $41,$04,$46,$04,$4F,$04,$58,$04,$61,$04,$6A,$04,$73,$04,$7C,$04\r
+-      .DB     $86,$04,$90,$04,$9A,$04,$A5,$04,$AF,$04,$B8,$04,$C1,$04,$CA,$04\r
+-      .DB     $D3,$04,$DD,$04,$E9,$04,$F0,$04,$F9,$04,$02,$05,$0B,$05,$14,$05\r
+-      .DB     $1D,$05,$26,$05,$30,$05,$3A,$05,$44,$05,$4E,$05,$59,$05,$5D,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $66,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05,$6B,$05\r
+-      .DB     $06,$08,$01,$01,$4F,$00,$00,$06,$FF,$06,$61,$09,$20,$70,$A8,$A0\r
+-      .DB     $70,$28,$A8,$70,$20,$01,$07,$00,$20,$70,$80,$80,$70,$20,$02,$21\r
+-      .DB     $07,$80,$80,$80,$80,$00,$00,$80,$04,$21,$03,$A0,$A0,$A0,$01,$07\r
+-      .DB     $50,$50,$F8,$50,$F8,$50,$50,$01,$07,$20,$78,$A0,$70,$28,$F0,$20\r
+-      .DB     $01,$07,$C0,$C8,$10,$20,$40,$98,$18,$01,$07,$60,$90,$A0,$40,$A8\r
+-      .DB     $90,$68,$03,$21,$03,$C0,$40,$80,$04,$21,$07,$20,$40,$80,$80,$80\r
+-      .DB     $40,$20,$04,$21,$07,$80,$40,$20,$20,$20,$40,$80,$01,$06,$00,$20\r
+-      .DB     $A8,$70,$A8,$20,$01,$06,$00,$20,$20,$F8,$20,$20,$05,$03,$61,$03\r
+-      .DB     $C0,$40,$80,$03,$06,$61,$01,$F8,$05,$03,$61,$02,$C0,$C0,$01,$06\r
+-      .DB     $00,$08,$10,$20,$40,$80,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01\r
+-      .DB     $07,$20,$60,$20,$20,$20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40\r
+-      .DB     $F8,$01,$07,$F8,$10,$20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90\r
+-      .DB     $F8,$10,$10,$01,$07,$F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40\r
+-      .DB     $80,$F0,$88,$88,$70,$01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07\r
+-      .DB     $70,$88,$88,$70,$88,$88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60\r
+-      .DB     $03,$21,$06,$00,$C0,$C0,$00,$C0,$C0,$03,$21,$07,$00,$C0,$C0,$00\r
+-      .DB     $C0,$40,$80,$05,$21,$07,$10,$20,$40,$80,$40,$20,$10,$01,$05,$00\r
+-      .DB     $00,$F8,$00,$F8,$05,$21,$07,$80,$40,$20,$10,$20,$40,$80,$01,$07\r
+-      .DB     $70,$88,$08,$10,$20,$00,$20,$01,$07,$70,$88,$B8,$A8,$B8,$80,$70\r
+-      .DB     $01,$07,$70,$88,$88,$88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88\r
+-      .DB     $88,$F0,$01,$07,$70,$88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88\r
+-      .DB     $88,$88,$90,$E0,$01,$07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8\r
+-      .DB     $80,$80,$F0,$80,$80,$80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01\r
+-      .DB     $07,$88,$88,$88,$F8,$88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80\r
+-      .DB     $80,$80,$01,$07,$08,$08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0\r
+-      .DB     $C0,$A0,$90,$88,$01,$07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88\r
+-      .DB     $D8,$A8,$A8,$88,$88,$88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01\r
+-      .DB     $07,$70,$88,$88,$88,$88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80\r
+-      .DB     $80,$01,$07,$70,$88,$88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0\r
+-      .DB     $A0,$90,$88,$01,$07,$70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20\r
+-      .DB     $20,$20,$20,$20,$20,$01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07\r
+-      .DB     $88,$88,$88,$88,$88,$50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50\r
+-      .DB     $01,$07,$88,$88,$50,$20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20\r
+-      .DB     $20,$20,$01,$07,$F8,$08,$10,$20,$40,$80,$F8,$04,$21,$07,$E0,$80\r
+-      .DB     $80,$80,$80,$80,$E0,$01,$06,$00,$80,$40,$20,$10,$08,$04,$21,$07\r
+-      .DB     $E0,$20,$20,$20,$20,$20,$E0,$01,$03,$20,$50,$88,$06,$06,$61,$01\r
+-      .DB     $F8,$01,$03,$30,$20,$10,$01,$07,$00,$00,$70,$08,$78,$88,$78,$01\r
+-      .DB     $07,$80,$80,$F0,$88,$88,$88,$F0,$01,$07,$00,$00,$78,$80,$80,$80\r
+-      .DB     $78,$01,$07,$08,$08,$78,$88,$88,$88,$78,$01,$07,$00,$00,$70,$88\r
+-      .DB     $F8,$80,$70,$01,$07,$18,$20,$F8,$20,$20,$20,$20,$01,$08,$00,$00\r
+-      .DB     $78,$88,$88,$78,$08,$70,$01,$07,$80,$80,$B0,$C8,$88,$88,$88,$02\r
+-      .DB     $21,$07,$80,$00,$80,$80,$80,$80,$80,$05,$21,$08,$10,$00,$10,$10\r
+-      .DB     $10,$10,$90,$60,$05,$21,$07,$80,$80,$90,$A0,$C0,$A0,$90,$03,$21\r
+-      .DB     $07,$C0,$40,$40,$40,$40,$40,$40,$01,$07,$00,$00,$F0,$A8,$A8,$A8\r
+-      .DB     $A8,$01,$07,$00,$00,$B0,$C8,$88,$88,$88,$01,$07,$00,$00,$70,$88\r
+-      .DB     $88,$88,$70,$01,$08,$00,$00,$F0,$88,$88,$F0,$80,$80,$01,$08,$00\r
+-      .DB     $00,$78,$88,$88,$78,$08,$08,$02,$05,$61,$05,$B0,$C0,$80,$80,$80\r
+-      .DB     $01,$07,$00,$00,$78,$80,$70,$08,$F0,$01,$07,$20,$20,$F8,$20,$20\r
+-      .DB     $20,$18,$01,$07,$00,$00,$88,$88,$88,$98,$68,$01,$07,$00,$00,$88\r
+-      .DB     $88,$88,$50,$20,$01,$07,$00,$00,$88,$88,$A8,$A8,$50,$01,$07,$00\r
+-      .DB     $00,$88,$50,$20,$50,$88,$01,$08,$00,$00,$88,$88,$88,$78,$08,$70\r
+-      .DB     $01,$07,$00,$00,$F8,$10,$20,$40,$F8,$05,$21,$07,$30,$40,$40,$80\r
+-      .DB     $40,$40,$30,$02,$21,$07,$80,$80,$80,$00,$80,$80,$80,$05,$21,$07\r
+-      .DB     $C0,$20,$20,$10,$20,$20,$C0,$02,$07,$61,$02,$64,$98,$01,$07,$00\r
+-      .DB     $00,$20,$50,$88,$88,$F8,$01,$03,$E0,$A0,$E0,$01,$07,$F8,$F8,$F8\r
+-      .DB     $F8,$F8,$F8,$F8,$01,$20,$02,$20,$04,$20,$FC,$20,$FD,$20,$FE,$20\r
+-      .DB     $FF,$20,$0C,$20,$F4,$20,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
+-      .DB     $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A\r
++.INCLUDE "CHSET00.INC"\r
+ CHSET00_END:\r
\r
+ ; -----------------------------------------------------------------------------\r
\r
++GET_CLEAR_FRAME_RECT_SIZE:\r
++      STS     RECTNC_X,CURSORX\r
++      STS     RECTNC_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_YY,A\r
++      RCALL   CLEAR_FRAME_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++GET_FRAME_RECT_SIZE:\r
++      STS     RECTNC_X,CURSORX\r
++      STS     RECTNC_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECTNC_YY,A\r
++      RCALL   FRAME_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++GET_CLEAR_HALFTONE_RECT_SIZE:\r
++      STS     RECT_X,CURSORX\r
++      STS     RECT_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECT_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECT_YY,A\r
++      RCALL   CLEAR_HALFTONE_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++GET_HALFTONE_RECT_SIZE:\r
++      STS     RECT_X,CURSORX\r
++      STS     RECT_Y,CURSORY\r
++      RCALL   RX_WAIT\r
++      STS     RECT_XX,A\r
++      RCALL   RX_WAIT\r
++      STS     RECT_YY,A\r
++      RCALL   HALFTONE_RECT\r
++      RJMP    MAIN_LOOP\r
++\r
++NO_GOX:       RET\r
++\r
++CLEAR_FRAME_RECT:\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_Y\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_XX\r
++      STS     RECT_XX,F\r
++      LDS     F,RECTNC_YY\r
++      STS     RECT_YY,F\r
++\r
++      LDI     F,$02\r
++      OR      FLAGS,F\r
++\r
++      RCALL   DRAW_RECT\r
++\r
++      LDI     F,$FD\r
++      AND     FLAGS,F\r
++\r
++FRAME_RECT:\r
++      LDS     F,RECTNC_XX\r
++      DEC     F\r
++      CPI     F,2\r
++      BRLO    NO_GOX\r
++      LDS     F,RECTNC_YY\r
++      CPI     F,3\r
++      BRLO    NO_GOX\r
++\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_Y\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_XX\r
++      STS     RECT_XX,F\r
++      LDI     F,$01\r
++      STS     RECT_YY,F\r
++      RCALL   DRAW_RECT\r
++\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_Y\r
++      INC     F\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_YY\r
++      SUBI    F,2\r
++      STS     RECT_YY,F\r
++      LDI     F,$01\r
++      STS     RECT_XX,F\r
++      RCALL   DRAW_RECT\r
++\r
++      LDS     X_SIZE,RECTNC_XX\r
++      LDS     F,RECTNC_X\r
++      ADD     F,X_SIZE\r
++      DEC     F\r
++      STS     RECT_X,F\r
++      LDI     F,$01\r
++      STS     RECT_XX,F\r
++      LDS     F,RECTNC_Y\r
++      INC     F\r
++      STS     RECT_Y,F\r
++      LDS     F,RECTNC_YY\r
++      SUBI    F,2\r
++      STS     RECT_YY,F\r
++      RCALL   DRAW_RECT\r
++\r
++      LDS     F,RECTNC_X\r
++      STS     RECT_X,F\r
++      LDS     F,RECTNC_XX\r
++      STS     RECT_XX,F\r
++      LDS     Y_SIZE,RECTNC_YY\r
++      LDS     F,RECTNC_Y\r
++      ADD     F,Y_SIZE\r
++      DEC     F\r
++      STS     RECT_Y,F\r
++      LDI     F,$01\r
++      STS     RECT_YY,F\r
++      RJMP    DRAW_RECT\r
++\r
++CLEAR_HALFTONE_RECT:\r
++;     LDS     F,RECTNC_X\r
++;     STS     RECT_X,F\r
++;     LDS     F,RECTNC_Y\r
++;     STS     RECT_Y,F\r
++;     LDS     F,RECTNC_XX\r
++;     STS     RECT_XX,F\r
++;     LDS     F,RECTNC_YY\r
++;     STS     RECT_YY,F\r
++\r
++      LDI     F,$02\r
++      OR      FLAGS,F\r
++\r
++      RCALL   DRAW_RECT\r
++\r
++      LDI     F,$FD\r
++      AND     FLAGS,F\r
++\r
++HALFTONE_RECT:\r
++      SEI\r
++      LDS     LINE_CNT,RECT_Y\r
++      LDS     XPIXEL,RECT_X\r
++      RCALL   CALCULATE_XBYTE\r
++      STS     XPIXEL_SAV,XPIXEL\r
++      STS     XBYTE_SAV,XBYTE\r
++      LDS     Y_SIZE,RECT_YY\r
++      CLR     YL\r
++      MOV     YH,LINE_CNT\r
++      LDI     A,$55\r
++      SBRS    YH,0\r
++      LDI     A,$AA\r
++      MOV     PATTERN,A\r
++      LSR     YH\r
++      ROR     YL\r
++      LSR     YH\r
++      ROR     YL\r
++      SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
++      LDI     A,HIGH(DRAW_DSPRAM>>6)\r
++      RCALL   SELECT_XPAGE\r
++      RJMP    X03A3\r
++X039A:        SUBI    YL,LOW(-$40)\r
++      SBCI    YH,HIGH(-$40)\r
++      INC     LINE_CNT\r
++      LDS     XPIXEL,XPIXEL_SAV\r
++      LDS     XBYTE,XBYTE_SAV\r
++X03A3:        OR      XBYTE,YL\r
++      LDI     A,$FF\r
++      LDS     X_SIZE,RECT_XX\r
++      LDI     F,$00\r
++      CP      X_SIZE,F\r
++      BREQ    X03B0\r
++      LDI     F,$08\r
++      CP      X_SIZE,F\r
++      BRLO    X03C2\r
++      TST     XPIXEL\r
++      BREQ    X03B0\r
++X03AD:        LSR     A\r
++      DEC     XPIXEL\r
++      BRNE    X03AD\r
++X03B0:        AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++      LDI     F,$08\r
++      LDS     A,XPIXEL_SAV\r
++      SUB     F,A\r
++      SUB     X_SIZE,F\r
++      INC     XBYTE\r
++      LDI     A,$FF\r
++X03B8:        LDI     F,$08\r
++      CP      X_SIZE,F\r
++      BRLO    X03C2\r
++      BREQ    X03D2\r
++      AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++      LDI     A,$FF\r
++      LDI     F,$08\r
++      SUB     X_SIZE,F\r
++      INC     XBYTE\r
++      RJMP    X03B8\r
++X03C2:        TST     X_SIZE\r
++      BREQ    X03D3\r
++X03C4:        LSR     A\r
++      DEC     X_SIZE\r
++      BRNE    X03C4\r
++      COM     A\r
++      TST     XPIXEL\r
++      BREQ    X03D2\r
++      CLR     B\r
++X03CB:        LSR     A\r
++      ROR     B\r
++      DEC     XPIXEL\r
++      BRNE    X03CB\r
++      AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++      INC     XBYTE\r
++      MOV     A,B\r
++X03D2:        AND     A,PATTERN\r
++      RCALL   WR_DISP_MEM\r
++X03D3:        COM     PATTERN\r
++      RCALL   NICK_SUB1\r
++      DEC     Y_SIZE\r
++      CLR     F\r
++      CPSE    Y_SIZE,F\r
++      RJMP    X039A\r
++      RET\r
++\r
++; -----------------------------------------------------------------------------\r
++\r
+       .ORG    $1000\r
\r
+       .DW     $4102                   ; SELECT ADDRESS COMMAND\r
diff --git a/src/avr/tsv3.asm b/src/avr/tsv3.asm
new file mode 100644 (file)
index 0000000..7a71ddb
--- /dev/null
@@ -0,0 +1,3708 @@
+;      TSV3.ASM\r
+\r
+;      19FEB02 REVISE FOR GREATER CONTRAST VOLTAGE FOR ALBERT'S 2ND BATCH -15V\r
+;      01FEB02 REVISE FOR 7.3728MHz XTAL (SEE !!!)\r
+\r
+;       22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;               TO WORK WITH REV E PARTS\r
+;              ;!! INDICATES CHANGES\r
+\r
+;**    INDICATES CHANGES FOR LOW VCC AVR MOD\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APITS.INC" ; NOT API.INC BECAUSE APITS.INC ALSO HAS TURNON COMMAND\r
+;.INCLUDE "TERTS.INC" ; NOT TER.INC BECAUSE FLAGS IN LOWER HALF OF REGISTER SET\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     XPAGE,YH\r
+       RCALL   ADRYP                   ; AND SET XPAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+       OUT     PORTC,@0                ; SET L ADDRESS FOR DSPRAM\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       MOV     R19,@1\r
+       LSL     R19\r
+       LSL     R19\r
+       BST     @0,7                    ; A7\r
+       BLD     R19,1\r
+       BST     @0,6                    ; A6\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       EOR     R19,@0\r
+       ANDI    R19,$E0\r
+       EOR     R19,@0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       SEI\r
+       STS     LATCH10_SAV,R19         ; MUST BE ATOMIC DUE TO TOGGLING M\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       MOV     R19,@1\r
+       LSL     R19\r
+       LSL     R19\r
+       BST     @0,7                    ; A7\r
+       BLD     R19,1\r
+       BST     @0,6                    ; A6\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@1\r
+\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       BST     @1,7                    ; A15\r
+       BLD     R19,1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,0\r
+       NOP\r
+       CBI     PORTB,1\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+       OUT     PORTA,@0                ; SELECT PHOTODIODE CHANNEL\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+       OUT     PORTA,@0                ; MAIN LED DRIVE PORT\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON LO\r
+       CBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON HI\r
+       SBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER HI\r
+       SBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER LO\r
+       CBR     D,1<<3\r
+       SBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER OFF\r
+       CBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =-818 ;$FB35\r
+.EQU   T1_FULL_SCALE   =-716 ;50.0HZ   ; SETS LCD FRAME RATE TEMPORARY TO STOP FLIKER\r
+;.EQU  T1_FULL_SCALE   =-651 ;53.5HZ   ; SETS LCD FRAME RATE\r
+;.EQU  T1_FULL_SCALE   =-600 ;54.8HZ   ; SETS LCD FRAME RATE\r
+\r
+.EQU   CONTRAST_LONG   =-340           ; ALL LONG PULSES IS FULLY DARK (DON'T SATURATE)\r
+;.EQU  CONTRAST_LONG   =-250           ; ALL LONG PULSES IS FULLY DARK (DON'T SATURATE)\r
+.EQU   CONTRAST_MID    =-200\r
+.EQU   CONTRAST_SHORT  = -43           ; ALL SHORT PULSES IS FULLY LIGHT\r
+\r
+.EQU   VCC_NOMINAL     =-552 ;$FCC4\r
+\r
+.EQU   VEE_MIN         =-710           ; MIN IS FULLY DARK\r
+.EQU   VEE_INIT        =-340\r
+.EQU   VEE_MAX         = -43           ; MAX IS FULLY LIGHT\r
+\r
+; WHEN VCC = $FCC4 FOR 6.0V:\r
+.EQU   CONTRAST_MIN    =-710           ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_INIT   =-640\r
+.EQU   CONTRAST_MAX    =-580           ; MAX IS FULLY LIGHT\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+;.EQU  CONTRAST_MIN    =$FC80          ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FF80          ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FE10\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$80\r
+.EQU   CHARACTER_SETS  =10\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$20\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   TK_LED_PULSE    =14             ; 18US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_0      =19             ; ??US DELAY TILL START OF LED PULSE (/8)\r
+;.EQU  TK_DELAY_0      =$20 ;$38       ; ??US DELAY TILL START OF LED PULSE\r
+;.EQU  TK_DELAY_0      =$25 ;$38       ; 54US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_1      =$10 ;$28       ; CLOCKS OF /64, CHANNEL SELECT DELAY\r
+.EQU   TK_DELAY_2      =$00            ; CLOCKS OF /1024, VDD POWER ON DELAY\r
+                                       ; $D0 IS TOO SHORT, $E0 SEEMS TO WORK\r
+\r
+.EQU   API_ADDRESS     =$02            ; TOUCHSCREEN ADDRESS\r
+.EQU   API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$5F ;$8F       ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$03 ;$05       ; DIVISOR FOR 115200 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   PATTERN         =R0             ; FOR HALFTONE_RECT ROUTINE\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   USED TO CONTROL LED PULSING FOR TOUCHSCREEN EVERY 2ND CYCLE\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+; for AVRA / TAVRASM:\r
+;.def  XL              =R26\r
+;.def  XH              =R27\r
+;.def  YL              =R28\r
+;.def  YH              =R29\r
+;.def  ZL              =R30\r
+;.def  ZH              =R31\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+BUZZ_TIME:     .BYTE   1       ; 10B\r
+BUZZ_PERIOD:   .BYTE   1\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+DEBOUNCE:      .BYTE   1\r
+ROW_INDEX:     .BYTE   1\r
+ROW_BITMAP:    .BYTE   2\r
+LATCH10_SAV:   .BYTE   1\r
+LATCH11_SAV:   .BYTE   1\r
+LATCH12_SAV:   .BYTE   1\r
+XPAGE:         .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+CLOCKING_PTR:  .BYTE   2\r
+\r
+CHAR_X:                .BYTE   1\r
+CHAR_Y:                .BYTE   1\r
+CHAR_PTR:      .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TOUCH_KEY:     .BYTE   1\r
+TOUCH_X:       .BYTE   1\r
+TOUCH_Y:       .BYTE   1\r
+TOUCH_XX:      .BYTE   1\r
+TOUCH_YY:      .BYTE   1\r
+\r
+TIME_HSEC_64K: .BYTE   1\r
+TIME_HSEC_256: .BYTE   1\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+SCAN_STATE:    .BYTE   1\r
+LATCH5_SAV:    .BYTE   1\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   1\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RJMP    GO_TIM2_OVF             ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_T1_OVERFLOW\r
+       RJMP    GO_T0_OVERFLOW\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       LDI     F,0\r
+       STS     TIME_HSEC_64K,F\r
+       STS     TIME_HSEC_256,F\r
+       STS     TIME_HSEC,F\r
+       STS     TIME_SECOND,F\r
+       STS     TIME_MINUTE,F\r
+       STS     TIME_HOUR,F\r
+       LDI     F,1\r
+       STS     DATE_DAY,F\r
+       STS     DATE_MONTH,F\r
+       LDI     F,20\r
+       STS     DATE_YEAR,F\r
+\r
+RESTART_ENTRY:\r
+;**:\r
+       LDI     F,8                     ; TIMER 2 CLOCKED BY 32 KHZ\r
+;**    LDI     F,0                     ; TIMER 2 CLOCKED BY 11 MHZ\r
+       OUT     ASSR,F\r
+;**:\r
+       ; MUST MATCH SET_TIME ROUTINE %\r
+       LDI     F,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;!!    LDI     F,$11                   ; DIVIDE BY 2, TOGGLE OC2 (PIN 21)\r
+                                       ; (RTC DIAGNOSTIC)\r
+;**    LDI     F,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,F\r
+       ; %\r
+       LDI     F,$40\r
+       OUT     TIMSK,F                 ; TIMER 2 OVERFLOW INTERRUPTS ENABLED\r
+       LDI     F,$00\r
+       OUT     GIMSK,F\r
+\r
+       LDI     F,$B8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       OUT     PORTD,F                 ; D2 = TRI-STATE, VSWT ON\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$03                   ; CS, WE HI, LEs ALL LO\r
+       OUT     PORTB,F\r
+\r
+       LDI     F,$10                   ; LED COMMON OFF, SPEAKER OFF\r
+       OUT     PORTC,F\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,F\r
+\r
+       LDI     F,$20\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ENABLED\r
+\r
+       INIT_API_BUS\r
+\r
+       LDI     D,$18                   ; A18|A17|A16|A15|A14=11000\r
+       OUT     PORTA,D                 ; CL1=M=FLM=0\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BUZZ_TIME,D             ; NOT BUZZING (SHORT BEEP COMES LATER)\r
+\r
+       CLR     SCAN\r
+       STS     ROW_INDEX,SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+       LDI     D,$F4                   ; BIT 6 = 1 VDD ON, BIT 7 = 1 LCD ON\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       ; INITIALISE ACTIVE KEYS\r
+RTNCDE:        ;LDIZ   RTN_CODE                ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((RTN_CODE)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((RTN_CODE)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ;LDIX   RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+       LDI     XL,LOW((RTN_CODE_END-RTN_CODE)*2)       ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((RTN_CODE_END-RTN_CODE)*2)      ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET XPAGE\r
+CDE0:  ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CDE1:  ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+ CLR R0 ; TEMPORARY CLEAR KB\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       DEC     XL\r
+       BREQ    RTNCDE_END              ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CDE1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CDE0\r
+RTNCDE_END:\r
+\r
+       ; INITIALISE DEFAULT CHARACTER SET\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       ;LDIZ   CHSET00                 ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((CHSET00)*2)     ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((CHSET00)*2)    ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ;LDIX   CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDI     XL,LOW((CHSET00_END-CHSET00)*2) ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((CHSET00_END-CHSET00)*2)        ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET XPAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       ; CLEAR REFRESH BUFFER TO AVOID A BRIEF FLICKER\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   GO_SELECT_XPAGE\r
+\r
+       LDI     B,DISPLAY_LINES         ; B = LINES TO CLEAR\r
+\r
+CLEAR_REFRESH:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDI     B,32\r
+       RCALL   GO_CLEAR_BYTES          ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   GO_CLEAR_BYTES          ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    CLEAR_REFRESH\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       LDI     A,0\r
+       STS     BUZZ_PERIOD,A           ; HIGHEST FREQUENCY\r
+       LDI     A,54 ;$40\r
+       STS     BUZZ_TIME,A             ; SHORT BEEP ON STARTUP\r
+\r
+       LDI     A,0\r
+       STS     SCAN_STATE,A            ; START ON FIRST LED / PHOTODIODE PAIR\r
+\r
+       LDI     A,0\r
+       STS     CLOCKING_PTR,A\r
+       STS     CLOCKING_PTR+1,A        ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       LDI     F,$45\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1, 2 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  HELLO_DISPLAY           ; SHOW EXAMPLE DISPLAY\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       SBI     PORTD,4                 ; TURN TRANSISTOR OFF\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,LATCH10_SAV\r
+       ANDI    D,$BF                   ; DROP M\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       LDI     D,$74                   ; BIT 6 = 1 VDD ON, BIT 7 = 0 LCD OFF\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       LDI     D,$34                   ; BIT 6 = 0 VDD OFF, BIT 7 = 0 LCD OFF\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       LDI     D,$41\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 INTERRUPTS\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; DISABLE TIMER 0 TEMPORARILY ONLY\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+       LDI     F,4\r
+       STS     TURNON_COUNT,F          ; .25 SEC TO BREAK, .75 SEC TO MAKE\r
+\r
+       INIT_API_BUS                    ; RESET UART TO RECEIVE TURNON COMMAND\r
+\r
+SLEEP_LOOP:\r
+       CLI\r
+       IN      F,TCCR0\r
+       TST     F\r
+       LDI     F,$4A                   ; SE=1 SM1:SM0=00 FOR IDLE MODE\r
+       BRNE    SLEEP_SETUP             ; TIMER 0 RUNNING, STAY IN IDLE MODE\r
+       SBIS    PIND,0                  ; BREAK OFF, UART ACTIVE, STAY IN IDLE\r
+       LDI     F,$7A                   ; SE=1 SM1:SM0=11 FOR POWER SAVE MODE\r
+SLEEP_SETUP:\r
+       OUT     MCUCR,F\r
+       SEI\r
+       SLEEP\r
+\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDS     F,TURNON_COUNT\r
+       TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       ;SBIS   PIND,0                  ; AND BREAK HAS DISAPPEARED, WAKE UP\r
+       BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+\r
+       CLI\r
+       RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP: LDS     YH,XPAGE                        ; SET XPAGE ADDRESS FOR DSPRAM\r
+       LDS     YL,LATCH10_SAV\r
+       ANDI    YL,$E0\r
+       OR      YH,YL\r
+       OUT     PORTA,YH\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,XPAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     XPAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;HELLO_DISPLAY:\r
+;      LDI     A,0\r
+;      STS     RECTNC_X,A\r
+;      STS     RECTNC_Y,A\r
+;      STS     RECTNC_XX,A\r
+;      LDI     A,$80\r
+;      STS     RECTNC_YY,A\r
+;      RCALL   DRAW_RECTNC\r
+;\r
+;      LDI     A,16\r
+;      STS     CHAR_X,A\r
+;      STS     CHAR_Y,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;      RCALL   STRING_DRAW\r
+;\r
+;      LDI     A,240\r
+;      STS     CHAR_X,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;\r
+;STRING_RIGHT_JUST:\r
+;      PUSH    B\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   STRING_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     B\r
+;      LDS     A,CHAR_X\r
+;      SUB     A,R0\r
+;      STS     CHAR_X,A\r
+;\r
+;STRING_DRAW:\r
+;      PUSH    B\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      PUSH    R0\r
+;      RCALL   DRAW_CHAR\r
+;      POP     R0\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      LDS     A,CHAR_X\r
+;      ADD     A,R0\r
+;      STS     CHAR_X,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_DRAW\r
+;      RET\r
+;\r
+;STRING_WIDTH:\r
+;      CLR     R0\r
+;STRING_WIDTH_LOOP:\r
+;      PUSH    B\r
+;      PUSH    R0\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     A\r
+;      ADD     R0,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_WIDTH_LOOP\r
+;      RET\r
+;\r
+;HELLO_MESSAGE:        .DB     'H','E','L','L','O',0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+;L0132:\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+;L0135:\r
+       CPI     A,$0A\r
+       BRNE    TEST_BELL\r
+       RJMP    LF\r
+TEST_BELL:\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'B'\r
+       RJEQ    BUZZER\r
+       CPI     A,'b'\r
+       RJEQ    BUZZ_AT_FREQ\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'c'\r
+       RJEQ    GET_CLEAR_FRAME_RECT_SIZE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'f'\r
+       RJEQ    GET_FRAME_RECT_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'H'\r
+       RJEQ    GET_HALFTONE_RECT_SIZE\r
+       CPI     A,'h'\r
+       RJEQ    GET_CLEAR_HALFTONE_RECT_SIZE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'T'\r
+       RJEQ    SET_TIME\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       SBI     DDRD,2                  ; D2 = LOW, VSWT OFF\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+BUZZER:        RCALL   RX_WAIT\r
+       PUSH    A\r
+       LDI     A,0                     ; HIGHEST FREQUENCY\r
+       RJMP    BUZZ_AT_FREQ_A\r
+\r
+BUZZ_AT_FREQ:\r
+       RCALL   RX_WAIT\r
+       PUSH    A\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$0F\r
+BUZZ_AT_FREQ_A:\r
+       STS     BUZZ_PERIOD,A           ; SAVE REQUESTED PERIOD\r
+       POP     A\r
+       STS     BUZZ_TIME,A             ; SAVE REQUESTED DURATION\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_TIME:\r
+       LDI     A,0\r
+       OUT     TCCR2,A                 ; STOP COUNTING WHILE SETTING CLOCK\r
+       STS     TIME_HSEC_64K,A\r
+       STS     TIME_HSEC_256,A\r
+       STS     TIME_HSEC,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_HOUR,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_MINUTE,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_SECOND,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_MONTH,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_DAY,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_YEAR,A\r
+       LDI     A,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;**    LDI     A,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+;L01A3:\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    CLR     CURSORX\r
+       RJMP    MAIN_LOOP\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+       LDI     B,EE_CONTRAST ; 20mar03 tavrasm *2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST+1 ; 20mar03 tavrasm *2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       STS     TOUCH_KEY,A\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       SUBI    A,-9\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_X,B\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A\r
+       SUBI    A,-4\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_Y,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YL\r
+       SUBI    A,15\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_XX,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YH\r
+       SUBI    A,17\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_YY,B\r
+\r
+       LDS     YH,TOUCH_Y\r
+TOUCH_ZONE_Y:\r
+       LDS     A,TOUCH_YY\r
+       SUB     A,YH\r
+       BRSH    TOUCH_ZONE_Y_CONT\r
+       RJMP    TOUCH_ZONE_Y_END\r
+TOUCH_ZONE_Y_CONT:\r
+\r
+       LDS     YL,TOUCH_X\r
+       MOV     A,YL\r
+       ADD     A,YH\r
+       MOV     B,YH\r
+       LSL     B\r
+       LSL     B\r
+       LSL     B\r
+       ADD     A,B\r
+       LSL     B\r
+       ADD     A,B\r
+\r
+       LDI     XL,LOW(RTN_DSPRAM)\r
+       LDI     XH,HIGH(RTN_DSPRAM) ;<<2\r
+       LDI     B,0\r
+       ADD     XL,A\r
+       ADC     XH,B\r
+\r
+       LDI     B,HIGH(RTN_DSPRAM>>6)   ; B:X -> RETURN CODE TABLE\r
+       A14_A18 B\r
+\r
+TOUCH_ZONE_X:\r
+       LDS     A,TOUCH_XX\r
+       SUB     A,YL\r
+       BRLO    TOUCH_ZONE_X_END\r
+\r
+       A0_A13  XL,XH\r
+       LDS     A,TOUCH_KEY\r
+       RAMWR   A                       ; WRITE DATA TO DSPRAM\r
+\r
+       ADIW    XL,1\r
+       INC     YL\r
+       RJMP    TOUCH_ZONE_X\r
+\r
+TOUCH_ZONE_X_END:\r
+       INC     YH\r
+       RJMP    TOUCH_ZONE_Y\r
+\r
+TOUCH_ZONE_Y_END:\r
+       RJMP    MAIN_LOOP\r
+\r
+DIVIDE_10:\r
+       LDI     B,-1\r
+DIVIDE_10_LOOP:\r
+       INC     B\r
+       SUBI    A,10\r
+       BRCC    DIVIDE_10_LOOP\r
+       RET\r
+\r
+DIVIDE_13:\r
+       LDI     B,-1\r
+DIVIDE_13_LOOP:\r
+       INC     B\r
+       SUBI    A,13\r
+       BRCC    DIVIDE_13_LOOP\r
+       RET\r
+\r
+NULLSUB2:\r
+       RCALL   RX_WAIT\r
+\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       RCALL   FIND_CHAR               ; SET UP CHAR_PTR FROM A = CHAR\r
+       RCALL   CHAR_WIDTH              ; SET UP R0 = PROP WIDTH FROM CHAR PTR\r
+\r
+       CLR     F\r
+       STS     TEMP,F                  ; NUDGE FOR FIXED SPACING MODE\r
+\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE               ; FORCED TO FIXED SPACING MODE?\r
+\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS                    ; GET R0 = CELL WIDTH FOR CHARACTER SET\r
+       PUSH    R0\r
+       SUB     R0,W\r
+       BRCC    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       POP     R0                      ; RESTORE R0 = FIXED CELL WIDTH\r
+\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE                 ; FORCED TO GRAPHICS MODE?\r
+\r
+       MOV     F,CURSORX\r
+       ADD     F,R0                    ; CHECK IF CHAR WILL FIT ON THIS LINE\r
+       BRCC    OK_LINE\r
+\r
+       CLR     CURSORX\r
+       RCALL   LINE_FEED               ; NO, WRAP CURSOR PRIOR TO DRAWING CHAR\r
+\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE            ; IN CASE WE SCROLLED THE DISPLAY\r
+\r
+OK_LINE:\r
+       LDS     F,TEMP\r
+       ADD     F,CURSORX\r
+       STS     CHAR_X,F\r
+       STS     CHAR_Y,CURSORY          ; SET UP TOP LEFT COORDINATES\r
+\r
+       ADD     CURSORX,R0              ; ADVANCE CURSOR\r
+\r
+DRAW_CHAR:\r
+       LDS     XPIXEL,CHAR_X\r
+       LDS     LINE_CNT,CHAR_Y\r
+\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE           ; Y OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+\r
+Y_OFFSET_DONE:\r
+       SBRS    X_SIZE,7\r
+       RJMP    X_OFFSET_DONE           ; X OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$03\r
+       RCALL   LPMS\r
+       ADD     XPIXEL,R0\r
+\r
+X_OFFSET_DONE:\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       ADIW    YL,$01\r
+       RCALL   LPMS                    ; GET R0 = Y LINES FOR CHARACTER\r
+       MOV     Y_SIZE,R0\r
+\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0                 ; REMOVE_CS\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+FIND_CHAR:\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       STS     CHAR_PTR,YL\r
+       STS     CHAR_PTR+1,YH\r
+       RET\r
+\r
+CHAR_WIDTH:\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    LPMS                    ; PROPORTIONAL WIDTH IS PRESENT\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RJMP    LPMS                    ; NO PROPORTIONAL WIDTH, USE CELL WIDTH\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> DISPLAY BUFFER\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       LDI     B,32\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       SBIW    XL,2\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   COPY_BYTES              ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+ ; LET'S BE SAFE\r
+ ANDI A,$7F\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_CLEAR_BYTES:\r
+       RJMP    CLEAR_BYTES\r
+\r
+GO_SELECT_XPAGE:\r
+       RJMP    SELECT_XPAGE\r
+\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+\r
+GO_TIM2_OVF:\r
+       RJMP    TIM2_OVF\r
+\r
+GO_T1_OVERFLOW:\r
+       RJMP    T1_OVERFLOW\r
+\r
+GO_T0_OVERFLOW:\r
+       RJMP    T0_OVERFLOW\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+CLEAR_DISPLAY_LOOP:\r
+       CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    CLEAR_DISPLAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXT_INT0:\r
+;**:\r
+RETI\r
+;**    IN      SR,SREG                 ; MEASURE VCC\r
+;**    SBI     DDRD,2\r
+;**    IN      C,TCNT1L\r
+;**    IN      D,TCNT1H\r
+;**    STS     VCCH,D\r
+;**    STS     VCCL,C\r
+;**    RJMP    EXT_INT_RET\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    EXT_INT_RET\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+        LDI     D,$70                  ; FORCE DUMMY COMPARE MATCH\r
+        OUT     TCCR1A,D                ; TO SET OC1B, TOGGLE OC1A\r
+        IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+        IN      D,TCNT1H                ; READ CURRENT COUNT\r
+        SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+        SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+        OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+        OUT     OCR1AL,C\r
+        OUT     OCR1BH,D\r
+        OUT     OCR1BL,C\r
+\r
+       LDS     C,CLOCKING_PTR\r
+;      TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
+ lds d,CLOCKING_PTR+1\r
+ andi d,1\r
+ or c,d ; checks for start of an 8 line block\r
+; rjmp BREAK0 ; temporary (prevents switching off via power switch)\r
+       BRNE    BREAK0                  ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK1                  ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+GO_SLEEP_ENTRY:\r
+       RJMP    SLEEP_ENTRY\r
+\r
+BREAK0:        NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+BREAK1:        SBI     DDRD,3                  ; PRECHARGE TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CLR     D\r
+       OUT     TCCR1B,D                ; STOP TIMER1\r
+       OUT     TCNT1H,D                ; AND CLEAR COUNT\r
+       OUT     TCNT1L,D\r
+\r
+       LDS     D,CLOCKING_PTR+1\r
+       OR      D,C                     ; START OF FRAME?  (REALLY LINE 1)\r
+       BREQ    L04E6                   ; YES, GO AND TOGGLE M ETC\r
+\r
+       LDS     D,LATCH10_SAV\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       SBI     PORTA,5                 ; PULSE CL1\r
+       CBI     PORTA,5\r
+       CBI     PORTB,4\r
+       NOP                             ; EQUALIZE DELAY\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       RJMP    L04F9\r
+\r
+L04E6: LDS     D,LATCH10_SAV\r
+       ORI     D,$80                   ; RAISE FLM\r
+       ORI     D,$20                   ; RAISE CL1\r
+       OUT     PORTA,D\r
+\r
+       SBI     PORTB,4\r
+       LDI     C,$60                   ; TOGGLE M AND CL1\r
+       EOR     D,C\r
+       OUT     PORTA,D\r
+       ANDI    D,$7F                   ; DROP FLM\r
+       OUT     PORTA,D\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+L04F9: LDS     D,LATCH10_SAV           ; SAVE STATE\r
+       PUSH    D\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDS     ZL,CLOCKING_PTR\r
+       LDS     ZH,CLOCKING_PTR+1\r
+\r
+       SUBI    ZL,LOW(-$40)\r
+       SBCI    ZH,HIGH(-$40)\r
+       ANDI    ZH,HIGH(DISPLAY_LINES*$40-1)\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       CBI     PORTB,1                 ; CLR HC590\r
+       SBI     PORTB,1\r
+       CBI     PORTD,7                 ; DROP OE FOR HC590\r
+       CLR     C\r
+       OUT     DDRA,C                  ; PORTA HI Z\r
+       LDI     C,$C0\r
+       OUT     DDRC,C                  ; PORTC HI Z\r
+       CBI     PORTB,0                 ; DROP CS FOR DSPRAM\r
+\r
+       CLR     D\r
+       OUT     OCR1AH,D\r
+\r
+;      LDI     D,1                     ; TO CLOCK AT 5.5/2 MHZ\r
+       OUT     OCR1AL,D                ; TO CLOCK AT 7.3/2 MHZ\r
+       LDI     D,$09\r
+       OUT     TCCR1B,D                ; START CL2 CLOCKING WITH CLR ON MATCH\r
+\r
+       STS     CLOCKING_PTR,ZL\r
+       STS     CLOCKING_PTR+1,ZH\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;!!!   LDI     D,$7A                   ; WAIT FOR 32uSEC\r
+;      LDI     D,58 ;$7A                       ; WAIT FOR 32uSEC GOOD\r
+       LDI     D,60                    ; WAIT FOR 32uSEC\r
+;      LDI     D,61 ;$7A                       ; WAIT FOR 32uSEC\r
+;      LDI     D,62 ;$7A                       ; WAIT FOR 32uSEC GOOD\r
+\r
+L050E: DEC     D\r
+       BRNE    L050E\r
+\r
+       SBI     PORTB,0                 ; RAISE CS FOR DSPRAM\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+       SBI     PORTD,7                 ; RAISE OE FOR HC590\r
+       OUT     DDRC,D                  ; PORTC OUTPUT\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       LDI     D,$01                   ; KILL CLR ON COMPARE MATCH\r
+       NOP                             ; !WITH OC1A LEFT IN LOW STATE\r
+       OUT     TCCR1B,D\r
+\r
+       LDI     D,$0B                   ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0536\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+       RJMP    L0536\r
+\r
+L0535: NOP                             ; EQUALIZE DELAYS\r
+       NOP\r
+       NOP\r
+       NOP\r
+L0536: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VEEL\r
+       LDS     D,VEEH\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+       NOP\r
+       NOP\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       LDI     D,2                     ; SET TIME FOR START OF LED PULSE\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_DELAY_0           ; 54uSEC\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,3                  ; START TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+        LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+        OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+       RJMP    T1_OVERFLOW_RET\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; LED/PHOTODIODE SCANNING\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+       LDS     D,LATCH10_SAV\r
+       PUSH    D\r
+\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       LDS     D,SCAN_STATE\r
+       INC     D\r
+       STS     SCAN_STATE,D\r
+       DEC     D\r
+       BREQ    SCAN_START              ; IF SCAN_STATE WAS = 0\r
+       DEC     D\r
+       BREQ    SCAN_BEEPER             ; IF SCAN_STATE WAS = 1\r
+ ; IMPLEMENT ENTRY POINT FOR SCAN_PULSE_LED HERE\r
+       DEC     D\r
+       RJEQ    SCAN_PHOTO              ; IF SCAN_STATE WAS = 2\r
+\r
+T0_OVERFLOW_RET:\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+\r
+T1_OVERFLOW_RET:\r
+       POP     D                       ; RESTORE STATE OF THE WORLD\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+EXT_INT_RET:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCAN_START:\r
+       LDI     D,3 ;5\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/1024\r
+       LDI     D,-TK_DELAY_1 ;TK_DELAY_2\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+       RJMP    L0617_RESET\r
+\r
+SCAN_BEEPER:\r
+       LDS     D,BUZZ_TIME\r
+       TST     D\r
+       BREQ    SCAN_PULSE_LED\r
+       LDS     D,BUZZ_PERIOD\r
+       SUBI    D,$10\r
+       BRLO    BUZZ_TOGGLE\r
+       STS     BUZZ_PERIOD,D\r
+       RJMP    SCAN_PULSE_LED\r
+BUZZ_TOGGLE:                           ; ASSUME D = $F0 + PERIOD-1\r
+       MOV     C,D                     ; EG. C = $F3 FOR PERIOD = 4\r
+       SWAP    C                       ; EG. C = $3F FOR PERIOD = 4\r
+       AND     D,C                     ; EG. D = $33 FOR PERIOD = 4\r
+       STS     BUZZ_PERIOD,D\r
+       LDS     C,LATCH12_SAV\r
+       SBRS    C,3                     ; TEST PREVIOUS SPEAKER STATE\r
+       RJMP    BEEPER_SPKHI\r
+       LDS     D,BUZZ_TIME\r
+       DEC     D\r
+       STS     BUZZ_TIME,D\r
+       BREQ    BEEPER_SPKOFF\r
+;BEEPER_SPKLO:\r
+       SPKLO\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKHI:\r
+       SPKHI\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKOFF:\r
+       SPKOFF\r
+\r
+SCAN_PULSE_LED:\r
+       LDS     D,LATCH5_SAV\r
+;**:\r
+       SBRS    D,7                     ; ARE WE INSIDE SLEEP_LOOP?\r
+;**    SBRC    D,7\r
+       RJMP    SCAN_PULSE_LED_OK       ; YES, KEEP TIMER 0 TO RETAIN CONTROL\r
+\r
+       LDI     D,1<<7\r
+       EOR     FLAGS,D\r
+       BRPL    SCAN_PULSE_LED_OK       ; PULSE LED EVERY 2ND CYCLE\r
+\r
+       CLR     D\r
+       OUT     TCCR0,D                 ; STOP TIMER\r
+       RJMP    T0_OVERFLOW_RET         ; AND WASTE EVERY REMAINING CYCLE\r
+\r
+SCAN_PULSE_LED_OK:\r
+       LDI     D,2\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_LED_PULSE         ; 22uSEC\r
+       OUT     TCNT0,D\r
+\r
+       ;LDIZ   SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM                             ; R0 = LED DRIVE VALUE\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L0570\r
+       LEDLO                           ; ENABLE HORIZ LED DRIVE\r
+       RJMP    L0574\r
+L0570: LEDHI                           ; DISABLE HORIZ LED DRIVE\r
+L0574: LED     R0\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCAN_PHOTO:\r
+       IN      D,PIND                  ; PHOTODIODE STATUS IN BIT 6,D\r
+       LDI     C,$E0\r
+       LED     C                       ; TURN OFF LED ??\r
+\r
+       CLC\r
+       SBRC    D,6\r
+       RJMP    L0593                   ; ROW/COLUMN IS INACTIVE\r
+\r
+       ; ROW/COLUMN IS ACTIVE\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0591\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+L0591: SEC\r
+\r
+L0593: ; WE HAVE A ROW/COLUMN STATUS IN CF\r
+       IN      C,SREG\r
+\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L05A8\r
+\r
+       ; WE HAVE A ROW STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       LDS     ZL,ROW_BITMAP\r
+       LDS     ZH,ROW_BITMAP+1\r
+       ROL     ZL\r
+       ROL     ZH\r
+       STS     ROW_BITMAP,ZL\r
+       STS     ROW_BITMAP+1,ZH\r
+       RJMP    L05F9\r
+\r
+L05A8: ; WE HAVE A COLUMN STATUS\r
+;      LDS     D,LATCH5_SAV\r
+;;**:\r
+;      SBRS    D,7                     ; TURNED OFF?\r
+;;**   SBRC    D,7\r
+;      RJMP    L05F9                   ; YES, NO FURTHER PROCESSING\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       BRCS    L05AB\r
+       RJMP    L05F9\r
+\r
+L05AB: ; WE HAVE AN ACTIVE COLUMN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L05B3\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       RJMP    L05F9\r
+\r
+L05B3: ; LOOK FOR ANY ACTIVE ROW\r
+       LDS     ZH,ROW_BITMAP+1\r
+       LDS     ZL,ROW_BITMAP\r
+\r
+       LDS     D,ROW_INDEX\r
+       TST     D\r
+       BREQ    ROW_BITMAP_LOOP\r
+\r
+       MOV     C,D\r
+ROW_BITMAP_SKIP:\r
+       ROR     ZH\r
+       ROR     ZL\r
+       SUBI    C,4\r
+       BRNE    ROW_BITMAP_SKIP\r
+\r
+ROW_BITMAP_LOOP:\r
+       SUBI    D,-4\r
+       ROR     ZH\r
+       ROR     ZL\r
+       BRCS    FOUND_INTERSECTION\r
+ROW_BITMAP_LOOPE:\r
+       CPI     D,13*4\r
+       BRLO    ROW_BITMAP_LOOP\r
+\r
+       ; NO FURTHER INTERSECTING ROWS FOUND\r
+       RJMP    L05F9\r
+\r
+FOUND_INTERSECTION:\r
+       ; FOUND AN INTERSECTING ROW FOR COLUMN\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,$34                   ; BECAUSE ROW_BITMAP IS BEING TESTED\r
+       SUB     C,D                     ; IN THE REVERSE ORDER TO ITS CREATION\r
+\r
+       ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+       LPM\r
+       MOV     C,R0\r
+       LSL     R0\r
+       LSL     R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+\r
+       ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       ADD     C,R0\r
+       LDI     ZL,LOW(RTN_DSPRAM)      ; RETURN CODE TABLE\r
+       LDI     ZH,HIGH(RTN_DSPRAM)\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       PUSH    F\r
+       RAMRDX  R0\r
+       POP     F\r
+\r
+       TST     R0\r
+       BRNE    VALID_INTERSECTION\r
+\r
+       ; INTERSECTION IS NULL, GO ON TO NEXT\r
+       LDS     D,ROW_INDEX\r
+       CPI     D,13*4\r
+       BRSH    L05F9                   ; DONE LAST ROW, GO ON TO NEXT COLUMN\r
+GO_L0617:\r
+       RJMP    L0617                   ; GO ON TO NEXT ROW, SAME COLUMN\r
+\r
+VALID_INTERSECTION:\r
+       ; INTERSECTION IS VALID, WE HAVE KEY MAKE\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       STS     ACTIVE_ZONE,R0\r
+       LDI     D,54 ;43\r
+       STS     BUZZ_TIME,D             ; SHORT BEEP ON MAKE\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-1\r
+       BRSH    L05F9\r
+\r
+       PUSH    A\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       CPI     A,$1B\r
+       BRNE    TX_CONT\r
+       RCALL   TX_CHAR\r
+TX_CONT:\r
+       POP     A\r
+\r
+L05F9:\r
+       LDI     D,4                     ; SCAN TO NEXT LED / PHOTODIODE PAIR\r
+       ADD     SCAN,D\r
+\r
+       LDS     D,LATCH5_SAV\r
+       SBRC    D,7\r
+       RJMP    TURNED_ON\r
+\r
+       LDI     D,3\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/64\r
+       LDI     D,-TK_DELAY_1\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     C,13*4\r
+       CP      SCAN,C\r
+       BRLO    GO_L0617\r
+\r
+       ; KEEP VDD ON, TO AVOID THE LONG TK_DELAY_2\r
+       ;LDS    D,LATCH5_SAV\r
+       ;ANDI   D,$BF                   ; BIT 6 = 0 VDD OFF\r
+       ;STS    LATCH5_SAV,D\r
+       ;PHOTO  D                       ; READY TO SLEEP FOR ANOTHER 0.25 SEC\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; STOP TIMER SINCE COMPLETE SCAN DONE\r
+ ;RJMP T0_OVERFLOW_RET\r
+\r
+ ;LDI D,$05\r
+ ;OUT UBRR,D\r
+ ;LDI D,$18\r
+ ;OUT UCR,D\r
+       LDS     D,ROW_BITMAP+1\r
+       LDS     C,ROW_BITMAP\r
+ ;OUT UDR,C\r
+ ;OUT UDR,D\r
+       OR      C,D                     ; HAVE WE SOME ACTIVITY?\r
+\r
+       LDS     D,TURNON_COUNT\r
+       CPI     D,4\r
+       BRSH    TURNON_BREAK            ; WAITING FOR BREAK\r
+       CPI     D,1\r
+       BRSH    TURNON_MAKE             ; WAITING FOR MAKE\r
+GO_T0_OVERFLOW_RET:\r
+       RJMP    T0_OVERFLOW_RET         ; ALREADY HAD MAKE, NOT TURNED ON YET\r
+\r
+TURNON_BREAK:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BREQ    TURNON_SAVE             ; NO, COUNT DOWN TO BREAK\r
+       LDI     D,4+1                   ; YES, RESTART COUNTDOWN TO BREAK\r
+       RJMP    TURNON_SAVE\r
+TURNON_MAKE:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BRNE    TURNON_SAVE             ; YES, COUNT DOWN TO MAKE\r
+       LDI     D,3+1                   ; NO, RESTART COUNTDOWN TO MAKE\r
+TURNON_SAVE:\r
+       DEC     D                       ; COUNT DOWN TO MAKE OR BREAK\r
+       STS     TURNON_COUNT,D\r
+       BRNE    GO_T0_OVERFLOW_RET      ; NOT READY TO TRY TURNON YET\r
+\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       CBI     DDRD,2                  ; D2 = TRI-STATE, VSWT ON\r
+       RJMP    GO_SLEEP_ENTRY          ; WE WILL NOW WAIT FOR TURNON COMMAND\r
+\r
+TURNED_ON:\r
+       LDI     D,0                     ; STOP TIMER, WE WILL REGAIN\r
+       OUT     TCCR0,D                 ; CONTROL VIA NEXT CLOCKING INTERRUPT\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,50*4\r
+       CP      SCAN,C\r
+       BRLO    L0617\r
+\r
+       LDS     D,DEBOUNCE              ; COMPLETED ENTIRE SCAN, START NEW SCAN\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+       DEC     D\r
+       STS     DEBOUNCE,D\r
+       BRNE    L0617_RESET\r
+\r
+       LDS     D,ACTIVE_ZONE\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE\r
+       BRSH    L0617_RESET\r
+\r
+       PUSH    A\r
+       LDI     A,0\r
+       RCALL   TX_CHAR\r
+       POP     A\r
+\r
+L0617_RESET:\r
+       CLR     SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+L0617: ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+       ;LDIZ   SCAN_TBL\r
+       LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDS     D,LATCH5_SAV\r
+       ANDI    D,$80                   ; BIT 7 = PRESERVED, LCD ON/OFF STATUS\r
+       ORI     D,$40                   ; BIT 6 = 1 VDD ON\r
+       OR      D,R0\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    CLEAR_DISPLAY_LOOP\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_XPAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; HOW MANY SECS/6553600 PER 4HZ INTERRUPT ?\r
+; EACH TIME THROUGH ADD 1638400 SECS/6553600 = 1/4 SEC\r
+; OSCILLATOR IS SLOW SO WE WILL ADD 1 PART IN 10000\r
+; HENCE EACH TIME THROUGH ADD 1638400+164 = 1638564 UNITS TO COUNT\r
+\r
+TIM2_OVF:\r
+       IN      SR,SREG\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+;!!    LDI     A,$10                   ; DIAGNOSTIC\r
+;!!    STS     BUZZ_TIME,A             ; SHORT BEEP\r
+\r
+       LDS     D,TIME_HSEC_64K\r
+       SUBI    D,LOW(-1638564)\r
+       STS     TIME_HSEC_64K,D\r
+\r
+       LDS     D,TIME_HSEC_256\r
+       SBCI    D,HIGH(-1638564)\r
+       STS     TIME_HSEC_256,D\r
+\r
+       LDS     D,TIME_HSEC\r
+       SBCI    D,HIGH(-1638564>>8)\r
+       CPI     D,100\r
+       BRSH    TIM2_CARRY\r
+       STS     TIME_HSEC,D\r
+\r
+TIM2_END:\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA COMMAND,\r
+       RETI                            ; START A NEW SCAN, OTHERWISE DONE\r
+\r
+       LDI     D,0\r
+       STS     SCAN_STATE,D            ; WE WILL EXECUTE SCAN_START ROUTINE\r
+       RJMP    T0_OVERFLOW             ; GO AND TURN VDD ON\r
+\r
+GO_TX_CHAR:\r
+       RJMP    TX_CHAR\r
+\r
+TIM2_CARRY:\r
+       LDI     D,0\r
+       STS     TIME_HSEC,D\r
+\r
+       LDS     D,TIME_SECOND\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_SECOND\r
+\r
+       LDS     D,TIME_MINUTE\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_MINUTE\r
+\r
+       LDS     D,TIME_HOUR\r
+       INC     D\r
+       CPI     D,24\r
+       BRLO    TIM2_HOUR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+       LDI     ZL,LOW(MONTH_TABLE*2-1)\r
+       LDI     ZH,HIGH(MONTH_TABLE*2-1)\r
+       LDS     E,DATE_MONTH\r
+       ADD     ZL,E\r
+       LDI     E,0\r
+       ADC     ZH,E\r
+       LPM\r
+       MOV     E,R0\r
+       CPI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDS     E,DATE_YEAR\r
+       ANDI    E,3\r
+       LDI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDI     E,29\r
+FEBRUARY_OK:\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDS     D,DATE_DAY\r
+       CP      D,E\r
+       BRLO    TIM2_DAY\r
+\r
+       LDS     D,DATE_MONTH\r
+       CPI     D,12\r
+       BRLO    TIM2_MONTH\r
+\r
+       LDS     D,DATE_YEAR\r
+       INC     D\r
+       STS     DATE_YEAR,D\r
+       CLR     D\r
+TIM2_MONTH:\r
+       INC     D\r
+       STS     DATE_MONTH,D\r
+       CLR     D\r
+TIM2_DAY:\r
+       INC     D\r
+       STS     DATE_DAY,D\r
+       CLR     D\r
+TIM2_HOUR:\r
+       STS     TIME_HOUR,D\r
+       CLR     D\r
+TIM2_MINUTE:\r
+       STS     TIME_MINUTE,D\r
+       CLR     D\r
+TIM2_SECOND:\r
+       STS     TIME_SECOND,D\r
+\r
+TIM2_SEND:\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-7\r
+       BRSH    TIM2_SEND_SKIP\r
+\r
+       PUSH    A\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'T'\r
+       RCALL   TX_CHAR\r
+; LDS A,VCCL\r
+; RCALL TX_CHAR\r
+; LDS A,VCCH\r
+; RCALL TX_CHAR\r
+; LDS A,VEEL\r
+; RCALL TX_CHAR\r
+; LDS A,VEEH\r
+; RCALL TX_CHAR\r
+; LDI A,$0D\r
+; RCALL TX_CHAR\r
+       LDS     A,TIME_HOUR\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_MINUTE\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_SECOND\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_MONTH\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_DAY\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_YEAR\r
+       RCALL   GO_TX_CHAR\r
+       POP     A\r
+\r
+TIM2_SEND_SKIP:\r
+       RJMP    TIM2_END\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MONTH_TABLE:\r
+       .DB     31,28,31,30,31,30,31,31,30,31,30,31\r
+\r
+; 1ST BYTE = LED\r
+; 2ND BYTE = PHOTO\r
+; 3RD BYTE = TOUCH CHANNEL\r
+\r
+SCAN_TBL:\r
+       .DB     $F0,$34,$00,$00,$E8,$34,$01,$00,$F0,$33,$01,$00,$E8,$33,$02,$00\r
+       .DB     $E4,$33,$03,$00,$E8,$32,$03,$00,$E4,$32,$04,$00,$E2,$32,$05,$00\r
+       .DB     $E4,$31,$05,$00,$E2,$31,$06,$00,$E1,$31,$07,$00,$E2,$30,$07,$00\r
+       .DB     $E1,$30,$08,$00,$C1,$2A,$00,$00,$C2,$2A,$01,$00,$C1,$2B,$01,$00\r
+       .DB     $C2,$2B,$02,$00,$C4,$2B,$03,$00,$C2,$2C,$03,$00,$C4,$2C,$04,$00\r
+       .DB     $C8,$2C,$05,$00,$C4,$18,$05,$00,$C8,$18,$06,$00,$D0,$18,$07,$00\r
+       .DB     $C8,$19,$07,$00,$D0,$19,$08,$00,$A1,$19,$09,$00,$D0,$1A,$09,$00\r
+       .DB     $A1,$1A,$0A,$00,$A2,$1A,$0B,$00,$A1,$1B,$0B,$00,$A2,$1B,$0C,$00\r
+       .DB     $A4,$1B,$0D,$00,$A2,$1C,$0D,$00,$A4,$1C,$0E,$00,$A8,$1C,$0F,$00\r
+       .DB     $A4,$1D,$0F,$00,$A8,$1D,$10,$00,$B0,$1D,$11,$00,$A8,$1E,$11,$00\r
+       .DB     $B0,$1E,$12,$00,$61,$1E,$13,$00,$B0,$1F,$13,$00,$61,$1F,$14,$00\r
+       .DB     $62,$1F,$15,$00,$61,$28,$15,$00,$62,$28,$16,$00,$64,$28,$17,$00\r
+       .DB     $62,$29,$17,$00,$64,$29,$18,$00\r
+\r
+RTN_CODE:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$08,$08,$08,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$7E,$00,$31,$00,$32,$00,$33,$00,$34,$00,$35,$00,$36,$00\r
+       .DB     $37,$00,$38,$00,$39,$00,$30,$00,$2D,$00,$3D,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$51,$00,$57,$00,$45,$00,$52,$00,$54,$00,$59,$00\r
+       .DB     $55,$00,$49,$00,$4F,$00,$50,$00,$5B,$00,$5D,$00,$5C,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$41,$00,$53,$00,$44,$00,$46,$00,$47,$00\r
+       .DB     $48,$00,$4A,$00,$4B,$00,$4C,$00,$3B,$00,$27,$00,$0D,$0D,$0D,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5A,$00,$58,$00,$43,$00\r
+       .DB     $56,$00,$42,$00,$4E,$00,$4D,$00,$2C,$00,$2E,$00,$2F,$00,$00,$00\r
+       .DB     $00,$00\r
+RTN_CODE_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+.INCLUDE "CHSET00.INC"\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+GET_CLEAR_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   CLEAR_FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FRAME_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FRAME_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_CLEAR_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   CLEAR_HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_HALFTONE_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   HALFTONE_RECT\r
+       RJMP    MAIN_LOOP\r
+\r
+NO_GOX:        RET\r
+\r
+CLEAR_FRAME_RECT:\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_YY\r
+       STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+FRAME_RECT:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GOX\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GOX\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     F,RECTNC_YY\r
+       SUBI    F,2\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_XX\r
+       STS     RECT_XX,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+CLEAR_HALFTONE_RECT:\r
+;      LDS     F,RECTNC_X\r
+;      STS     RECT_X,F\r
+;      LDS     F,RECTNC_Y\r
+;      STS     RECT_Y,F\r
+;      LDS     F,RECTNC_XX\r
+;      STS     RECT_XX,F\r
+;      LDS     F,RECTNC_YY\r
+;      STS     RECT_YY,F\r
+\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+       RCALL   DRAW_RECT\r
+\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+\r
+HALFTONE_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LDI     A,$55\r
+       SBRS    YH,0\r
+       LDI     A,$AA\r
+       MOV     PATTERN,A\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    X03A3\r
+X039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+X03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    X03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       TST     XPIXEL\r
+       BREQ    X03B0\r
+X03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    X03AD\r
+X03B0: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+X03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       BREQ    X03D2\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    X03B8\r
+X03C2: TST     X_SIZE\r
+       BREQ    X03D3\r
+X03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    X03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    X03D2\r
+       CLR     B\r
+X03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    X03CB\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+X03D2: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+X03D3: COM     PATTERN\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    X039A\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4102                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/wpo15v1.asm b/src/avr/wpo15v1.asm
new file mode 100644 (file)
index 0000000..c717da5
--- /dev/null
@@ -0,0 +1,2186 @@
+;      WPO15V1.ASM\r
+\r
+;      LOOK FOR BIGBODGE TO SEE CEC'S CHANGES TO FIX STARTUP PROBLEM\r
+;      AND TO SKIP VOLTAGE MEASURING\r
+\r
+;      REVISED 17DEC01 TO SUPPORT NEW HARDWARE TYPE 3 FOR HYT1500\r
+\r
+;      REVISED 18DEC01 TO TRY A CONSERVATIVE 4.5 VOLT SHUTDOWN, LOW BATTERY\r
+;      THIS DOESN'T PROTECT AGAINST REBOOTING WHILE PRINTING, TOO BAD\r
+\r
+;      REVISED 18DEC01 TO TRY AN AGGRESSIVE 5.5 VOLT SHUTDOWN, LOW BATTERY\r
+;      ALSO ENABLED THE 4.5 VOLT IMMEDIATE RESET, DUE TO UNRELIABLE OPERATION\r
+;      NOW TRYING 5.0 VOLT IMMEDIATE RESET, CEC SAYS IT WAS MARGINAL ANYWAY\r
+\r
+;      NOW DISABLED THE IMMEDIATE RESET DUE TO TESTING RESULTS OF 08JAN02\r
+;      NOT SURE IF THAT WAS REALLY THE PROBLEM - BUT WISH TO BE CONSERVATIVE\r
+\r
+;      REVISED 01FEB02 FOR NEW 7.3728 MHZ XTAL, PREVIOUSLY 11.0592 MHZ, 2/3\r
+;      LOOK FOR ;! TO SEE CHANGES FOR 7.3728 MHZ XTAL, ADDED COMMENTS ALSO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   LARGE           =1\r
+\r
+;IF LARGE\r
+.INCLUDE "8535DEF.INC"\r
+;ELSE\r
+;.INCLUDE "4433DEF.INC"\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMING CALCULATIONS:\r
+\r
+; 115200 BITS/SEC = 11520 BYTES/SEC = 86.8 US/BYTE\r
+\r
+; FOR MASTER API BUS TX, SEND 1 BYTE PER 9+12 BIT-TIMES, 24 TO BE SAFE\r
+; SO THE CORRECT TX RATE = 86.8 * 2.4 = 200.8 US/BYTE = 4980 BYTES/SEC\r
+\r
+; A SUBTLE OPTIMISATION IS POSSIBLE WHEN THE PREVIOUS TRANSMITTED LSB IS 0,\r
+; AS WE CAN THEN GUARANTEE THE 4800 BPS RECEIVERS WILL SEE FALSE START BIT:\r
+\r
+; FOR MASTER API BUS TX EVEN, SEND 1 BYTE PER 2+12 BIT-TIMES, 16 TO BE SAFE\r
+; SO THE CORRECT TX RATE EVEN = 86.8 * 1.6 = 138.9 US/BYTE = 7199 BYTES/SEC\r
+\r
+; OLD: TCK0 ROLLOVER = 256 * 8 / 11.0592 MHZ = APPROX 185 US\r
+; NEW: TCK0 ROLLOVER = 256 * 8 /  7.3728 MHZ = APPROX 278 US\r
+; THUS ALL THE TIMEOUT VALUES BELOW HAVE BEEN DECREASED TO 2/3 ORIGINAL\r
+\r
+; NEW: THE EVEN/ODD TX RATE OPTIMISATION HAS BEEN DISABLED AS WE DON'T\r
+; HAVE ENOUGH RESOLUTION WITH THE 7.3728 MHZ XTAL / 8 TO GENERATE 138.9\r
+; US/BYTE DELAY, BECAUSE MINIMUM UNIT IS NOW 278 US INSTEAD OF 185 US,\r
+; THIS COULD BE IMPROVED LATER, BUT FOR NOW, WE GENERATE AN INTERRUPT\r
+; EVERY 278 US, AND THE NEXT AVAILABLE TCK0 DIVIDER IS /1 SO THIS WOULD\r
+; BECOME 34.8 US, THIS WOULD BE UNACCEPTABLE, SO REVISIT THE ISSUE LATER\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_TIMEOUT     =16 ;!25        ; 25 * 0.185 MS = 4.6 MS\r
+.EQU   API_TIME_IDLE   =8 ;!13         ; 13 * 0.185 MS = 2.4 MS\r
+.EQU   API_TIME_SLOW   =8 ;!13         ; 25 * 0.185 MS = 2.4 MS\r
+.EQU   API_TIME_FAST   =1 ;!2          ; 2 * 185 US = 370 US, NOW 1 * 278 US\r
+.EQU   API_RATE_SLOW   =$5F ;!$8F      ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$03 ;!$05      ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   SPI_TIMEOUT     =16 ;!25        ; 100 * 100 US = APPROX 10.0 MS\r
+\r
+;.def  drem16uL        =R0             ; remainder low\r
+;.def  drem16uH        =R1             ; remainder high\r
+;.def  dres16uL        =R2             ; result low    DON'T use as general purpose\r
+;.def  dres16uH        =R3             ; result high   DON'T use as general purpose\r
+;.def  dd16uL          =R2             ; dividend low\r
+;.def  dd16uH          =R3             ; dividend high\r
+;.def  dv16uL          =R4             ; divisor low\r
+;.def  dv16uH          =R5             ; divisor high\r
+;\r
+;.DEF  SPI_REMAIN      =R6\r
+;\r
+;.def  mc16uL          =R7             ;multiplicand low byte\r
+;.def  mc16uH          =R8             ;multiplicand high byte\r
+;.def  mp16uL          =R9             ;multiplier low byte\r
+;.def  mp16uH          =R10            ;multiplier high byte\r
+;.def  m16u0           =R9             ;result byte 0 (LSB)\r
+;.def  m16u1           =R10            ;result byte 1\r
+;.def  m16u2           =R11            ;result byte 2\r
+;.def  m16u3           =R12            ;result byte 3 (MSB)\r
+;\r
+;.DEF  RX_PTR          =R13\r
+;.DEF  RX_COUNT0       =R14\r
+\r
+.DEF   API_REMAIN      =R1\r
+.DEF   API_WATCHDOG    =R2\r
+.DEF   SPI_REMAIN      =R3\r
+.DEF   SPI_WATCHDOG    =R4\r
+.DEF   RX_PTR          =R5\r
+.DEF   RX_COUNT0       =R6\r
+.DEF   RX_COUNT1       =R7\r
+.DEF   TX_PTR          =R8\r
+.DEF   TX_COUNT0       =R9\r
+.DEF   TX_COUNT1       =R10\r
+\r
+.DEF   SR              =R15\r
+.DEF    A              =R16            ; GLOBAL REGISTERS\r
+.DEF    B              =R17\r
+.DEF    D              =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R23\r
+.DEF   G               =R24\r
+\r
+.DEF   FLAGS           =R20\r
+;.def  counter         =R20            ;loop counter\r
+\r
+.DEF   ATOD            =R21            ; SO YOU CAN USE SBCI, SUBI, CPI ETC\r
+\r
+.DEF   API_STATE       =R22\r
+\r
+;.DEF  TX_PTR          =R25\r
+;.DEF  API_WATCHDOG    =R26\r
+;.DEF  API_REMAIN      =R27\r
+;.DEF  SPI_WATCHDOG    =R28\r
+;.DEF  TX_COUNT0       =R29\r
+\r
+.EQU   TX_SIZE         =$40\r
+.EQU   RX_SIZE         =$10\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+VSWTS:         .BYTE   1               ; RETAIN ORDERING %\r
+VCHGS:         .BYTE   1\r
+NEGVS:         .BYTE   1\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+TX_ADDRESS0:   .BYTE   1               ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+TX_ADDRESS1:   .BYTE   1               ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS0:   .BYTE   1               ; SOURCE FOR RX_COUNT0 BYTES AT HEAD\r
+RX_ADDRESS1:   .BYTE   1               ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS2:   .BYTE   1               ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+                                       ; SCAN IS 1,2,1,3,1,4,1,5,1,6,1,7,1,8\r
+\r
+TX_OVERRIDE:   .BYTE   1               ; COUNTER TO TRANSMIT 1 TIME IN 16\r
+RX_OVERRIDE:   .BYTE   1               ; COUNTER TO RECEIVE 1 TIME IN 16\r
+\r
+TX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME TX DEVICE\r
+RX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME RX DEVICE\r
+\r
+;ABSENT_COUNT: .BYTE   1\r
+\r
+TURNOFF_COUNT: .BYTE   1\r
+WATCHDOG_COUNT:        .BYTE   2\r
+\r
+TX_LIMIT:      .BYTE   9               ; MAX Z180 BYTES TO ACCEPT, PER DEVICE\r
+\r
+BATTERY_COUNT: .BYTE   2               ; COUNT 1024 ADC READINGS TO POWER DOWN\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;LM385_COUNT:  .BYTE   1               ; COUNT $10 ADC READINGS TO MISSING REF\r
+VOLTAGE_VSWT:  .BYTE   1               ; MOST RECENT ADC READING FROM REF\r
+\r
+HARDWARE_TYPE: .BYTE   1               ; COMES SOMEWHAT BEFORE RSEL HI COMMAND\r
+\r
+STACK_GUARD:   .BYTE   1               ; DETECTS IF STACK COMES DOWN TO HERE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; API_STATE DEFINITIONS\r
+.EQU   SPISIZE         =0              ; SET IF EXPECTING SPI DATA SIZE CMD\r
+.EQU   SPIWAIT         =1              ; SET IF SENDING SPI ADDRESS RESPONSE\r
+.EQU   SPIDATA         =2              ; SET IF TRANSFERRING SPI DATA TX/RX\r
+.EQU   SPIDIRN         =3              ; SET IF TX, BASED ON ADDRESS COMMAND\r
+.EQU   APISIZE         =4              ; SET IF NEED TO SEND API DATA SIZE CMD\r
+.EQU   APIWAIT         =5              ; SET IF WAITING FOR API DATA SIZE RESP\r
+.EQU   APIDATA         =6              ; SET IF TRANSFERRING API DATA TX/RX\r
+.EQU   APIDIRN         =7              ; SET IF TX, TOGGLED ON NULL TRANSFER\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IF LARGE\r
+\r
+.EQU   IRQ             =6\r
+.EQU   IRQ_PORT        =PORTA\r
+.EQU   IRQ_DDR         =DDRA\r
+\r
+.EQU   PRG             =3\r
+.EQU   PRG_PORT        =PORTB\r
+.EQU   PRG_DDR         =DDRB\r
+\r
+.EQU   OC1             =5\r
+.EQU   OC1_PORT        =PORTD\r
+.EQU   OC1_DDR         =DDRD\r
+\r
+.EQU   OCR1H           =OCR1AH\r
+.EQU   OCR1L           =OCR1AL\r
+\r
+.EQU   COM10           =COM1A0\r
+.EQU   COM11           =COM1A1\r
+\r
+;ELSE\r
+;\r
+;.EQU  IRQ             =0\r
+;.EQU  IRQ_PORT        =PORTB\r
+;.EQU  IRQ_DDR         =DDRB\r
+;\r
+;.EQU  PRG             =2\r
+;.EQU  PRG_PORT        =PORTC\r
+;.EQU  PRG_DDR         =DDRC\r
+;\r
+;.EQU  OC1             =1\r
+;.EQU  OC1_PORT        =PORTB\r
+;.EQU  OC1_DDR         =DDRB\r
+;\r
+;.EQU  USR             =UCSRA\r
+;.EQU  UCR             =UCSRB\r
+;\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER 0 OVERFLOW HANDLER\r
+\r
+       .ORG    SPIADDR\r
+       RJMP    SPI_COMPLETE            ; SPI TRANSFER COMPLETE HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+\r
+       .ORG    ADCCaddr\r
+       RJMP    ADC_COMPLETE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+;IF LARGE\r
+       LDI     A,HIGH(RAMEND)\r
+       OUT     SPH,A\r
+;ENDIF\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE STACK GUARD\r
+       LDI     A,$5A\r
+       STS     STACK_GUARD,A\r
+\r
+       ; INITIALISE PORTS\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       LDI     A,0\r
+       OUT     SPCR,A                  ; DISABLE SPI WHILE RESETTING Z180\r
+       OUT     UCR,A                   ; DISABLE UART WHILE RESETTING SLAVES\r
+\r
+;IF LARGE\r
+       LDI     A,$FF\r
+       OUT     DDRC,A                  ; PORTC CONFIGURED AS OUTPUT\r
+\r
+       SBI     PORTB,7                 ; PB7/SCK CONFIGURED AS PULLED UP INPUT\r
+       SBI     DDRB,6                  ; PB6/MISO CONFIGURED AS OUTPUT\r
+\r
+       SBI     DDRA,7                  ; A7 CONFIGURED AS OUTPUT FOR DTR1\r
+       SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+\r
+; 18DEC01 NOT PULLED UP, DON'T WANT TO CORRUPT 100K/100K DIVIDER\r
+;      SBI     PORTA,4                 ; A4 PULLED UP TO DETECT MISSING LM385\r
+;ELSE\r
+;      SBI     PORTB,5                 ; PB5/SCK CONFIGURED AS PULLED UP INPUT\r
+;      SBI     DDRB,4                  ; PB4/MISO CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     DDRD,5                  ; D5 CONFIGURED AS OUTPUT FOR DTR1\r
+;      SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+;\r
+;      SBI     PORTC,4                 ; C4 PULLED UP TO DETECT MISSING LM385\r
+;ENDIF\r
+\r
+       SBI     PORTD,2                 ; D2 CONFIGURED AS PULL UP FOR IBM CLK\r
+       SBI     PORTD,3                 ; D3 CONFIGURED AS PULL UP FOR IBM DATA\r
+\r
+       SBI     OC1_PORT,OC1\r
+       SBI     OC1_DDR,OC1             ; OUTPUT OC1 = 1, PWM TRANSISTOR OFF\r
+\r
+       CBI     IRQ_PORT,IRQ\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       CBI     PORTD,7\r
+       SBI     DDRD,7                  ; OUTPUT RSEL = 0\r
+\r
+       CBI     PORTD,4\r
+       SBI     DDRD,4                  ; OUTPUT RES = 0\r
+\r
+       ; HARD RESET API BUS DEVICES\r
+       CBI     PRG_PORT,PRG\r
+       SBI     PRG_DDR,PRG             ; OUTPUT PRG = 0\r
+\r
+       CBI     PORTD,1\r
+       SBI     DDRD,1                  ; OUTPUT TXD = 0\r
+\r
+       LDI     A,7\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET SPARE\r
+\r
+       LDI     A,6\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 RECEIPT PRINTER\r
+\r
+       LDI     A,5\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 LABEL PRINTER\r
+\r
+       LDI     A,4\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET MT102 RECEIPT PRINTER\r
+\r
+       ;LDI    A,3\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET SPARE\r
+       ; THE ABOVE SHOULD BE OK - WHY NOT ??  16FEB01\r
+\r
+       ;LDI    A,2\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET TOUCHSCREEN\r
+\r
+       LDI     A,1\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET CUSTOMER DISPLAY\r
+\r
+       LDI     A,0\r
+       RCALL   PRG_RESET               ; REMOVE RESET PULSE\r
+\r
+       ; LOADCELL HAS BEEN IN RESET UNTIL NOW, AND WILL START IN 10 MS\r
+\r
+       ;SBI    PORTD,1                 ; OUTPUT TXD = 1\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BAUD\r
+       OUT     UBRR,A                  ; SET BAUD RATE\r
+       LDI     A,$18\r
+       OUT     UCR,A                   ; ENABLE TX AND RX (OUTPUTS TXD = 1)\r
+\r
+       RCALL   PRG_DELAY_280_MS        ; DELAY FOR TOUCHSCREEN TO REENTER IDLE\r
+\r
+       LDI     A,$AA\r
+       OUT     UDR,A                   ; SEND SLOW TURNON COMMAND\r
+       OUT     UDR,A                   ; AND AGAIN FOR EXTRA SAFETY\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO ALLOW DEVICES TO INITIALISE\r
+\r
+       ; ALLOW Z180 TO START\r
+       SBI     PORTD,4                 ; OUTPUT RES = 1\r
+       ;CBI    DDRD,4                  ; OUTPUT RES = TRI-STATE\r
+\r
+; BIGBODGE FOR ANOTHER RESET PULSE!!!!\r
+RCALL   PRG_DELAY_20_MS\r
+CBI     PORTD,4                 ; RES=0\r
+RCALL   PRG_DELAY_20_MS\r
+SBI     PORTD,4                 ; OUTPUT RES = 1\r
+\r
+       ; INITIALISE VARIABLES\r
+       CLR     A\r
+       LDI     ZL,VSWTS\r
+       CLR     ZH\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       LDI     ZL,TX_LIMIT\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A                    ; CAREFUL - Z WILL BE USED AGAIN BELOW\r
+       STS     TURNOFF_COUNT,A\r
+       STS     VOLTAGE_VSWT,A\r
+\r
+       ;LDI    A,LOW(1000)\r
+       STS     WATCHDOG_COUNT,A\r
+       ;LDI    A,HIGH(1000)            ; 100 MS\r
+       STS     WATCHDOG_COUNT+1,A\r
+\r
+       LDI     A,TX_SIZE\r
+       ST      Z,A                     ; RX_LIMIT FOR 9TH (INTERNAL) DEVICE\r
+\r
+       LDI     A,LOW(1024)\r
+       STS     BATTERY_COUNT,A\r
+       LDI     A,HIGH(1024)\r
+       STS     BATTERY_COUNT+1,A\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      LDI     A,$10                   ; START COUNTDOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,A\r
+\r
+       CLR     FLAGS\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT0\r
+       CLR     TX_COUNT1\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT0\r
+       CLR     RX_COUNT1\r
+\r
+;      LDI     A,4\r
+;      STS     ABSENT_COUNT,A          ; TOP UP ABSENT COUNTER FOR TX_ADDRESS\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,2\r
+       STS     RX_ADDRESS2,A           ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+\r
+       LDI     A,1\r
+       STS     TX_ADDRESS0,A\r
+       STS     TX_ADDRESS1,A\r
+       STS     RX_ADDRESS0,A\r
+       STS     RX_ADDRESS1,A\r
+       STS     TX_OVERRIDE,A\r
+       STS     RX_OVERRIDE,A\r
+       STS     HARDWARE_TYPE,A         ; AS FOR OLD ALGORITHM WITH FLAGS,2 = 0\r
+\r
+       LDI     A,0\r
+       STS     TX_STICKY,A\r
+       STS     RX_STICKY,A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,A          ; SET UP TIME TO FIRST API BUS POLL\r
+       LDI     A,-SPI_TIMEOUT\r
+       MOV     SPI_WATCHDOG,A          ; SET UP TIME TO FIRST SPI BUS POLL\r
+\r
+       LDI     A,$02                   ; TCK0 = CK/8\r
+       OUT     TCCR0,A                 ; TCK0 ROLLOVER = 256 * 8 / 7.3728 MHZ\r
+                                       ;               = APPROX 278 US\r
+                                       ;!TCK0 ROLLOVER = 256 * 8 / 11.0592 MHZ\r
+                                       ;!              = APPROX 185 US\r
+;IF LARGE\r
+       LDI     A,$01\r
+;ELSE\r
+;      LDI     A,$02\r
+;ENDIF\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       IN      A,SPSR\r
+       IN      A,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     A,$E8\r
+       OUT     SPCR,A                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       ; START -5V GENERATOR TASK\r
+       LDI     A,0\r
+       OUT     TCNT1H,A\r
+       OUT     TCNT1L,A\r
+       OUT     OCR1H,A\r
+       OUT     OCR1L,A                 ; ASSUME NO LOAD TO BEGIN WITH\r
+\r
+       LDI     A,1<<COM11 | 1<<COM10 | 1<<PWM10 ;1<<PWM11 | 1<<PWM10\r
+       OUT     TCCR1A,A                ; 8 BIT PWM ENABLE, INVERTING PWM\r
+       LDI     A,1<<CS10\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 US\r
+\r
+       LDI     A,$05\r
+       OUT     ADMUX,A                 ; USE CHANNEL 5 FOR A/D (A5 OR C5)\r
+       LDI     A,$DE\r
+       OUT     ADCSR,A                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;VOLTAGE_SHOW:\r
+; LDI A,2\r
+; LDS B,VOLTAGE_VSWT\r
+; RCALL TX_HEX\r
+; RJMP VOLTAGE_SHOW\r
+\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+ACTIVITY_LOOP:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BREQ    NO_ERROR_STACK_OVERFLOW\r
+       RJMP    ERROR_STACK_OVERFLOW\r
+NO_ERROR_STACK_OVERFLOW:\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       SBRS    FLAGS,0                 ; READY TO SHOW HARDWARE TYPE MESSAGE ?\r
+       RJMP    ACTIVITY_LOOP\r
+\r
+       ;SBRC   FLAGS,2\r
+       ;RJMP   HARDWARE_TYPE_WPO30\r
+       LDS     A,HARDWARE_TYPE\r
+       CPI     A,3\r
+       BREQ    HARDWARE_TYPE_HYT1500\r
+       CPI     A,2\r
+       BREQ    HARDWARE_TYPE_WPO30\r
+\r
+;HARDWARE_TYPE_HYT1000:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_2*2)\r
+       LDI     ZH,HIGH(MESSAGE_2*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_HYT1500:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_7*2)\r
+       LDI     ZH,HIGH(MESSAGE_7*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_CUSTOMER_64:\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_1*2)\r
+       LDI     ZH,HIGH(MESSAGE_1*2)    ; 240 X 64 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+       RJMP    MAIN_LOOP\r
+\r
+HARDWARE_TYPE_WPO30:\r
+       LDI     A,2\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON CUSTOMER SIDE\r
+\r
+MAIN_LOOP:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+       RJMP    MAIN_LOOP\r
+\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,'D'\r
+       BREQ    DTR_COMMAND\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR_COMMAND:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$03\r
+       BREQ    DTR0_LO\r
+       CPI     A,1\r
+       BREQ    DTR0_HI\r
+       CPI     A,2\r
+       BREQ    DTR1_LO\r
+       CPI     A,3\r
+       BREQ    DTR1_HI\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR0_LO:\r
+       SBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR0_HI:\r
+       CBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_LO:\r
+;IF LARGE\r
+       SBI     PORTA,7\r
+;ELSE\r
+;      SBI     PORTD,5\r
+;ENDIF\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_HI:\r
+;IF LARGE\r
+       CBI     PORTA,7\r
+;ELSE\r
+;      CBI     PORTD,5\r
+;ENDIF\r
+       ;RJMP   DTR_DONE ;MAIN_LOOP\r
+DTR_DONE:\r
+       LDI     B,$30\r
+       ADD     B,A\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'D'\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,B\r
+;      RCALL   TX_WAIT\r
+; %\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RX_WAIT_LOOP:\r
+       SEI\r
+\r
+RX_WAIT:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BRNE    ERROR_STACK_OVERFLOW\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       CLI\r
+\r
+       TST     TX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+       BREQ    RX_WAIT_LOOP\r
+;      BRNE    RX_WAIT_CONT            ; YES, GO AND TEST ADDRESS\r
+;\r
+;      TST     TX_COUNT1               ; ANY DATA WAITING AT TAIL ?\r
+;      BREQ    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE RECEIVED\r
+;\r
+;RX_WAIT_ADOPT:\r
+;      MOV     TX_COUNT0,TX_COUNT1\r
+;      CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;\r
+;      LDS     A,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+;      STS     TX_ADDRESS0,A           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+\r
+RX_WAIT_CONT:\r
+       LDS     A,TX_ADDRESS0\r
+       CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+       BRNE    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+\r
+RX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     ZL,TX_SIZE-1\r
+       AND     TX_PTR,ZL\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;TX_WAIT_LOOP:\r
+;      SEI\r
+;\r
+;TX_WAIT:\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      CLI\r
+;\r
+;      PUSH    A\r
+;      MOV     A,RX_COUNT0\r
+;      ADD     A,RX_COUNT1\r
+;      CPI     A,RX_SIZE-1             ; ROOM TO INSERT 1 BYTE ?\r
+;      POP     A\r
+;      BRSH    TX_WAIT_LOOP\r
+;\r
+;      PUSH    A\r
+;      LDI     A,9\r
+;      STS     RX_ADDRESS1,A\r
+;      POP     A\r
+;      RJMP    TX_CHAR\r
+;\r
+;;     TST     RX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+;;     BREQ    TX_WAIT_LOOP            ; NO, BUT THIS WOULD BE AN OPTIMISATION\r
+;;\r
+;;TX_WAIT_ADOPT:\r
+;;     MOV     RX_COUNT0,RX_COUNT1\r
+;;     CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;;\r
+;;     LDS     A,RX_ADDRESS1           ; DEST FOR RX_COUNT1 BYTES AT HEAD\r
+;;     STS     RX_ADDRESS0,A           ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+;\r
+;TX_WAIT_CONT:\r
+;      PUSH    A\r
+;      LDS     A,RX_ADDRESS1\r
+;      CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+;      POP     A\r
+;      BRNE    TX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+;\r
+;;TX_CHAR: ; DON'T USE THE OTHER TX_CHAR AS IT DOESN'T FINISH WITH RETI\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RETI\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_STACK_OVERFLOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_8*2)\r
+       LDI     ZH,HIGH(MESSAGE_8*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+ERROR_BAD_COMMAND:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_4*2)\r
+       LDI     ZH,HIGH(MESSAGE_4*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BAD_COMMAND_LOOP:\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_BATTERY_LOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_5*2)\r
+       LDI     ZH,HIGH(MESSAGE_5*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BATTERY_LOW_LOOP:\r
+       LDI     A,250\r
+\r
+ERROR_BATTERY_LOW_DELAY:\r
+       RCALL   PRG_DELAY_20_MS         ; 20 MS * 250 = 5 SECONDS\r
+       DEC     A\r
+       BRNE    ERROR_BATTERY_LOW_DELAY\r
+\r
+       LDI     A,2\r
+       LDI     B,3\r
+       LDI     ZL,LOW(MESSAGE_6*2)\r
+       LDI     ZH,HIGH(MESSAGE_6*2)\r
+       RCALL   TX_MESSAGE              ; TURN VSWT OFF VIA TOUCHSCREEN COMMAND\r
+\r
+       RJMP    ERROR_BATTERY_LOW_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PRG_RESET:\r
+       CBI     PRG_PORT,PRG            ; OUTPUT PRG = 0\r
+\r
+       SBRS    A,2\r
+       CBI     PORTD,1\r
+       SBRC    A,2\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 2\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO GENERATE C INPUT TO HC137\r
+\r
+       SBRS    A,1\r
+       CBI     PORTD,1\r
+       SBRC    A,1\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 1\r
+\r
+       RCALL   PRG_DELAY_2_MS          ; DELAY TO GENERATE B INPUT TO HC137\r
+\r
+       SBRS    A,0\r
+       CBI     PORTD,1\r
+       SBRC    A,0\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 0\r
+\r
+       SBI     PRG_PORT,PRG            ; OUTPUT PRG = 1\r
+\r
+       RJMP    PRG_DELAY_200_US        ; WIDTH OF RESET PULSE TO AVR\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR SPI BUS\r
+\r
+;TX_HEX:\r
+;      SEI\r
+;      NOP\r
+;      CLI\r
+;\r
+;      TST     TX_COUNT1\r
+;      BRNE    TX_HEX\r
+;\r
+;      STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+;\r
+;      MOV     A,B\r
+;      SWAP    A\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_HI_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_HI_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      MOV     A,B\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_LO_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_LO_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      LDI     A,' '\r
+;      RCALL   TX_CHAR\r
+;\r
+;      RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_MESSAGE:\r
+       SEI\r
+       NOP\r
+       CLI\r
+\r
+       TST     TX_COUNT1\r
+       BRNE    TX_MESSAGE\r
+\r
+       STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+TX_MESSAGE_LOOP:\r
+       LPM\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       ADIW    ZL,1\r
+       DEC     B\r
+       BRNE    TX_MESSAGE_LOOP\r
+\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     TX_COUNT1\r
+       RET\r
+\r
+;RX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,TX_PTR\r
+;      SUBI    ZL,-TX_BUF\r
+;      CLR     ZH\r
+;      LD      A,Z\r
+;\r
+;      DEC     TX_COUNT0\r
+;      INC     TX_PTR\r
+;      LDI     ZL,TX_SIZE-1\r
+;      AND     TX_PTR,ZL\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      RET\r
+\r
+;TX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;! THESE ROUTINES ARE UPDATED FOR 7.3728 MHZ XTAL, TO AVOID A POTENTIAL\r
+;! ISSUE WITH A/B/C ADDRESS SELECT INPUTS TO HC137, THE PREVIOUS TIMINGS\r
+;! INCLUDED A 2* MARGIN SO THE NEW XTAL WOULD GIVE A 3* MARGIN, THIS IS\r
+;! A LITTLE TOO CLOSE, AS THE TIME CONSTANTS FOR A/B/C ARE ONLY 10* APART\r
+\r
+PRG_DELAY_280_MS:\r
+       LDI     ZL,LOW(140*20) ;! LOW(140*29) ; WHY 140 ??  SOME BIGBODGE ?\r
+       LDI     ZH,HIGH(140*20) ;! HIGH(140*29) ; 125 * 29 * 69.4 US = 281 MS\r
+       RJMP    PRG_DELAY_ENTRY\r
+PRG_DELAY_20_MS:\r
+       ;!LDI   ZL,LOW(10*29)\r
+       ;!LDI   ZH,HIGH(10*29)          ; 10 * 29 * 69.4 US = 20.1 MS\r
+       ;!RJMP  PRG_DELAY_ENTRY\r
+       LDI     ZL,200 ;!\r
+       RJMP    PRG_DELAY_ENTRY_ZL ;!\r
+PRG_DELAY_2_MS:\r
+       LDI     ZL,20 ;!29              ; 29 * 69.4 US = 2.01 MS\r
+       RJMP    PRG_DELAY_ENTRY_ZL\r
+PRG_DELAY_200_US:\r
+       LDI     ZL,2 ;!3                ; 3 * 69.4 US = 208 US\r
+PRG_DELAY_ENTRY_ZL:\r
+       LDI     ZH,0\r
+PRG_DELAY_ENTRY:\r
+       LDI     D,0                     ; 256 * 3 = 768 T-STATES = 69.4 US\r
+PRG_DELAY_LOOP:\r
+       DEC     D\r
+       BRNE    PRG_DELAY_LOOP\r
+       SBIW    ZL,1\r
+       BRNE    PRG_DELAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; UART RX COMPLETE INTERRUPT HANDLER FOR API BUS\r
+\r
+RX_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       SBRC    API_STATE,APIDATA       ; TRANSFER ALREADY IN PROGRESS?\r
+       RJMP    API_RX_DATA             ; YES, SAVE CHARACTER\r
+\r
+;      ; RECEIVED DATA SIZE RESPONSE\r
+;      SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+;      RJMP    API_RX_RESPONSE         ; NO, PRESERVE ABSENT COUNT\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNT FOR TX_ADDRESS\r
+;\r
+;API_RX_RESPONSE:\r
+       IN      E,UDR\r
+\r
+       EOR     E,API_REMAIN            ; TEST FOR WRONG DIRECTION OF RESPONSE\r
+       BRMI    GO_API_ERROR\r
+\r
+       EOR     E,API_REMAIN            ; RESTORE ORIGINAL DATA SIZE RESPONSE\r
+       BRMI    API_RESPONSE_RX         ; DIRECTION IS TX?\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+API_RESPONSE_RX:\r
+       CP      API_REMAIN,E\r
+       BRLO    API_RESPONSE_OK\r
+       MOV     API_REMAIN,E            ; API_REMAIN = LESSER OUR / SLAVE MAX\r
+\r
+API_RESPONSE_OK:\r
+       CBR     API_STATE,1<<APISIZE    ; IN CASE NO DATA TRANSFERRED\r
+       SBR     API_STATE,1<<APIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       MOV     E,API_REMAIN\r
+       ANDI    E,$7F\r
+       BREQ    API_NULL\r
+\r
+       TST     API_REMAIN              ; ABOUT TO RECEIVE?\r
+       BRMI    API_RX_SETUP            ; YES, AWAIT FURTHER RX INTERRUPTS\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIWAIT    ; ENSURE TIMER INT DOES NOT CAUSE ABORT\r
+       ; WE CAN'T GO STRAIGHT INTO API_TX_DATA BECAUSE WE DON'T KNOW THE\r
+       ; STATUS OF THE TIMER PRESCALER THAT CONTROLS TRANSMISSION.  HERE,\r
+       ; WE WILL NOW WAIT FOR THE NEXT TIMER INTERRUPT TO GET SYNCHRONISED.\r
+       ;RJMP   API_TX_DATA\r
+\r
+       LDI     E,-1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     E,-API_TIME_IDLE\r
+       RJMP    API_ERROR_ENTRY\r
+\r
+GO_API_ERROR:\r
+       RJMP    API_ERROR\r
+\r
+API_RX_DATA:\r
+\r
+ LDS E,RX_ADDRESS1\r
+ CPI E,1 ; DON'T GO STICKY ON THE LOADCELL, BECAUSE IT ALWAYS HAS SOME DATA\r
+ BREQ API_RX_DATA_NONSTICK\r
+ LDI E,1\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+API_RX_DATA_NONSTICK:\r
+\r
+       ; RECEIVING, SAVE CHARACTER\r
+       IN      E,UDR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT0\r
+       ADD     ZL,RX_COUNT1\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,RX_ADDRESS0\r
+       LDS     ZH,RX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    API_RX_COUNT1\r
+       INC     RX_COUNT0\r
+       RJMP    API_RX_COUNT2\r
+API_RX_COUNT1:\r
+       INC     RX_COUNT1\r
+API_RX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ;LDI    E,-API_TIMEOUT\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+API_RX_SETUP:\r
+       LDI     E,-API_TIME_FAST ;FORMERLY -1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     API_REMAIN              ; STILL RECEIVING?\r
+       BRPL    API_REVERT              ; NO, RECEIVED ENTIRE PACKET\r
+\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA:\r
+       ; SENDING DATA, READY FOR NEW BYTE\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET MAX BYTES TO ACCEPT, PER DEVICE\r
+       DEC     E                       ; DECREASE\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,E\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;MOV E,TX_PTR\r
+ ;ORI E,$80\r
+ ;RCALL TWAT\r
+\r
+       ; FOR EVEN CHARACTERS, BIT 0 + START BIT MAKES A DOUBLE BIT, DELAY -1\r
+       ; FOR ODD CHARACTERS, START BIT MAY BE MISSED, SO DELAY -2 TO BE SAFE\r
+;!     LSR     E                       ; CF = 0 EVEN, 1 ODD\r
+;!     SBC     E,E                     ; E = $00 EVEN, $FF ODD\r
+;!     DEC     E                       ; E = $FF EVEN, $FE ODD\r
+ LDI E,-API_TIME_FAST ;! SEE DISCUSSION JUST PRIOR TO API_TIME_FAST DEFINITION\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       ; NOW DONE EARLIER, BEFORE CLOBBERING THE TRANSMITTED CHAR IN E\r
+       ;LDI    E,-API_TIME_FAST\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       ; THIS IS NOW DONE EARLIER WHEN WE SYNCHRONISE TO THE TIMER\r
+       ;SBR    API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       DEC     API_REMAIN              ; SAY WE TRANSMITTED 1 BYTE\r
+       BRNE    API_DONE                ; IF THERE IS MORE TO SEND\r
+       RJMP    API_REVERT\r
+\r
+API_ERROR:\r
+       LDI     E,-API_TIMEOUT\r
+API_ERROR_ENTRY:\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT ADDRESS COMMAND\r
+\r
+       CBR     API_STATE,1<<APISIZE    ; WE WILL SEND ADDRESS COMMAND\r
+\r
+API_REVERT:\r
+       CBI     UCR,RXCIE               ; DISABLE RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; WE WILL SEND ADDR OR DATA SIZE\r
+\r
+API_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 INTERRUPT HANDLER FOR API/SPI BUS\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+       LDS     E,WATCHDOG_COUNT\r
+       LDS     F,WATCHDOG_COUNT+1\r
+       OR      F,E\r
+       BREQ    WATCHDOG_SKIP\r
+       SUBI    E,LOW(1)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDS     E,WATCHDOG_COUNT+1\r
+       SBCI    E,HIGH(1)\r
+       STS     WATCHDOG_COUNT+1,E\r
+       BREQ    WATCHDOG_RESET\r
+WATCHDOG_SKIP:\r
+\r
+       TST     SPI_WATCHDOG\r
+       BREQ    SPI_TIMER_OK\r
+       INC     SPI_WATCHDOG\r
+       BRNE    SPI_TIMER_OK\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI\r
+       IN      E,SPSR\r
+       IN      E,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     E,$E8\r
+       OUT     SPCR,E                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       SBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = 0\r
+\r
+       CBR     API_STATE,1<<SPIDATA | 1<<SPISIZE | 1<<SPIWAIT\r
+SPI_TIMER_OK:\r
+\r
+       TST     API_WATCHDOG\r
+       BREQ    API_TIMER_OK\r
+       INC     API_WATCHDOG\r
+       BREQ    API_TIMED_OUT\r
+API_TIMER_OK:\r
+\r
+T0_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+WATCHDOG_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_RX_TIMEOUT:\r
+       SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+       RJMP    API_TX_ADDRESS          ; NO, PRESERVE ABSENT COUNT\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      DEC     E\r
+; brne api_device_present\r
+       ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+       STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+ LDI E,TX_SIZE\r
+ ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;      LDI     E,4\r
+;api_device_present:\r
+;      STS     ABSENT_COUNT,E          ; DECREMENT ABSENT COUNT FOR TX_ADDRESS\r
+       RJMP    API_TX_ADDRESS\r
+\r
+API_TIMED_OUT:\r
+       SBRC    API_STATE,APIWAIT\r
+       RJMP    API_RX_TIMEOUT\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_TX_DATA\r
+\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_TX_DATA_SIZE\r
+\r
+API_TX_ADDRESS:\r
+       ; SEND ADDRESS COMMAND\r
+       LDI     E,-API_TIME_SLOW\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO DATA SIZE COMMAND\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E                       ; TURNOFF REQUESTED?\r
+       BREQ    API_TURNOFF_OK\r
+       DEC     E                       ; STILL WAITING FOR TURNOFF?\r
+       STS     TURNOFF_COUNT,E\r
+       BREQ    API_TURNOFF_RESET       ; GAVE UP WAITING FOR TURNOFF\r
+\r
+       CBI     PRG_PORT,PRG            ; PRG LOW\r
+       CBI     PORTD,1                 ; TXD LOW\r
+       SBI     DDRD,1                  ; TXD OUTPUT\r
+       LDI     E,0\r
+       OUT     UCR,E                   ; DISABLE UART\r
+       RJMP    API_DONE\r
+\r
+API_TURNOFF_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_TURNOFF_OK:\r
+       CBI     UCR,RXCIE               ; DISABLE RX INTS, FOR APIWAIT ENTRY\r
+\r
+       LDI     E,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       OR      E,TX_COUNT0\r
+       OR      E,TX_COUNT1\r
+       BRNE    API_TRY_TX\r
+\r
+;API_TRY_RX:\r
+       LDS     E,TX_OVERRIDE\r
+       DEC     E\r
+       BREQ    API_DIRECTION_TX        ; FORCED TRANSMIT EVERY SO OFTEN\r
+       STS     TX_OVERRIDE,E\r
+       RJMP    API_DIRECTION_RX\r
+\r
+API_TRY_TX:\r
+       LDS     E,RX_OVERRIDE\r
+       DEC     E\r
+       BREQ    BREQ_API_DIRECTION_RX   ; FORCED RECEIVE EVERY SO OFTEN\r
+       STS     RX_OVERRIDE,E\r
+\r
+API_DIRECTION_TX:\r
+       LDI     E,$10\r
+       STS     TX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       ; SUSPEND TX OPERATIONS WHEN 9TH (INTERNAL) DEVICE ADDRESSED %\r
+       TST     TX_COUNT0               ; ANY BYTES AT HEAD ?\r
+       LDS     E,TX_ADDRESS0\r
+       BRNE    API_SUSPEND_TX0         ; YES, GO AND CHECK HEAD DEVICE\r
+\r
+       TST     TX_COUNT1               ; ANY BYTES AT TAIL ?\r
+       BREQ    API_SUSPEND_TX1         ; NO, GO AND PERFORM TX OPERATION\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE TX_COUNT1 BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1\r
+       STS     TX_ADDRESS0,E           ; ADOPT TAIL DEVICE FOR BYTES AT HEAD\r
+\r
+API_SUSPEND_TX0:\r
+       CPI     E,9\r
+BREQ_API_DIRECTION_RX:\r
+       BREQ    API_DIRECTION_RX\r
+\r
+API_SUSPEND_TX1:\r
+       ; %\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      TST     E\r
+;      BRNE    API_DEVICE_PRESENT\r
+;\r
+;;API_DEVICE_ABSENT:\r
+;      ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+;      LDI     E,TX_SIZE-1\r
+;      AND     TX_PTR,E\r
+;\r
+;      CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+;      STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+;\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      LDI     ZL,TX_LIMIT-1\r
+;      LDS     ZH,TX_ADDRESS0\r
+;      ADD     ZL,ZH\r
+;      CLR     ZH\r
+;      ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+; LDI E,TX_SIZE\r
+; ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNTER FOR NEXT DEVICE\r
+;\r
+;API_DEVICE_PRESENT:\r
+       CBR     API_STATE,1<<APIDIRN    ; SAY WE WILL TRANSMIT\r
+\r
+       TST     TX_COUNT0\r
+       BRNE    API_TX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       ; THIS ROUTINE WILL MOVE BYTES AT TAIL TO HEAD,\r
+       ; REDUNDANTLY, BECAUSE WE HAVE NOW DONE IT EARLIER\r
+       TST     TX_COUNT1\r
+       BRNE    API_TX_ADDRESS_ADOPT    ; BYTES AT TAIL, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       DEC     E\r
+       BRPL    API_TX_ADDRESS_STICKY   ; STAYING STICKY, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_ADDRESS0\r
+       INC     E                       ; BUMP TX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_TX_ADDRESS_SAVE\r
+       LDI     E,1\r
+       RJMP    API_TX_ADDRESS_SAVE\r
+\r
+API_TX_ADDRESS_ADOPT:\r
+       LDI     E,1\r
+API_TX_ADDRESS_STICKY:\r
+       STS     TX_STICKY,E             ; DECREMENT, OR TOP UP, STICKY COUNT\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+API_TX_ADDRESS_SAVE:\r
+       STS     TX_ADDRESS0,E           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_TX_ADDRESS_SAME:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; TOP UP STICKY COUNT\r
+\r
+       LDS     E,TX_ADDRESS0           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_DIRECTION_RX:\r
+       LDI     E,$10\r
+       STS     RX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       SBR     API_STATE,1<<APIDIRN    ; SAY WE WILL RECEIVE\r
+\r
+ LDS E,RX_STICKY\r
+ TST E\r
+ BREQ API_DIRECTION_RX_NEW\r
+ DEC E\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+ LDS E,RX_ADDRESS1\r
+ RJMP API_ADDRESS_SEND\r
+API_DIRECTION_RX_NEW:\r
+\r
+       LDS     E,RX_ADDRESS1           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+       TST     RX_COUNT1\r
+       BRNE    API_ADDRESS_SEND        ; BYTES AT TAIL, PRESERVE DEVICE\r
+\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDS     F,RX_ADDRESS2\r
+       STS     RX_ADDRESS2,E\r
+       MOV     E,F\r
+       CPI     E,1\r
+       BREQ    API_RX_ADDRESS_SAVE\r
+       ; %\r
+\r
+       INC     E                       ; BUMP RX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_RX_ADDRESS_SAVE\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDI     E,2\r
+       ; ELSE\r
+       ;LDI    E,1\r
+       ; %\r
+API_RX_ADDRESS_SAVE:\r
+       STS     RX_ADDRESS1,E           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+API_ADDRESS_SEND:\r
+       OUT     UDR,E                   ; SEND ADDRESS COMMAND\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE WILL SEND DATA SIZE COMMAND\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; RESET, FOR APIWAIT ENTRY\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA_SIZE:\r
+       ; SEND DATA SIZE COMMAND\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       LDI     E,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       MOV     E,TX_COUNT0             ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+\r
+       SBRS    API_STATE,APIDIRN       ; TEST DIRECTION\r
+       RJMP    API_COMMAND_OK          ; DIRECTION IS TX, ASK TO TRANSMIT\r
+\r
+       LDI     E,RX_SIZE\r
+       SUB     E,RX_COUNT0\r
+       SUB     E,RX_COUNT1             ; E = MAXIMUM AMOUNT WE CAN RECEIVE\r
+       ORI     E,$80                   ; ASK TO RECEIVE\r
+\r
+API_COMMAND_OK:\r
+       OUT     UDR,E                   ; SEND DATA SIZE COMMAND\r
+       MOV     API_REMAIN,E            ; SAVE COMMAND FOR MINIMUM CALCULATION\r
+\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      E,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+\r
+       SBR     API_STATE,1<<APIWAIT    ; SAY WE ARE WAITING FOR DATA SIZE RESP\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+; SPI TRANSFER COMPLETE HANDLER FOR Z180 BUS\r
+\r
+SPI_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       IN      E,SPDR\r
+\r
+       SBRC    API_STATE,SPIDATA\r
+       RJMP    SPI_DATA\r
+\r
+       SBRC    API_STATE,SPISIZE\r
+       RJMP    SPI_RESPOND\r
+\r
+       SBRC    API_STATE,SPIWAIT\r
+       RJMP    SPI_WAIT\r
+\r
+;SPI_ADDRESS:\r
+       CPI     E,10                    ; VALID ADDRESSES ARE 1-9\r
+       BRLO    SPI_SELECT\r
+       CPI     E,$80\r
+       BREQ    SPI_RSEL_LO\r
+       CPI     E,$81\r
+       BREQ    SPI_RSEL_HI\r
+       CPI     E,$91\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1000\r
+       CPI     E,$92\r
+       BREQ    SPI_HARDWARE            ; WPO30 V5\r
+       CPI     E,$93\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1500\r
+       CPI     E,$A5\r
+       BREQ    SPI_TURNOFF\r
+       CPI     E,$AA\r
+       BREQ    SPI_RESET\r
+       CPI     E,$C5\r
+       BREQ    SPI_WATCHDOG_RESET\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<1              ; HAD WRONG COMMAND\r
+       RJMP    SPI_DONE_ENTRY          ; RETURN LEAVING SPI_WATCHDOG = 0\r
+\r
+SPI_RSEL_LO:\r
+       CBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RSEL_HI:\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE - FOR COMPATIBILITY\r
+       SBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_HARDWARE: ;_HYT1000\r
+       SUBI    E,$90                   ; THE MAGIC CRACKER\r
+       STS     HARDWARE_TYPE,E         ; IT WAS PREVIOUSLY 1 FOR COMPATIBILITY\r
+\r
+       ;CBR    FLAGS,1<<2              ; HARDWARE TYPE IS HYTECH 1000\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE\r
+       RJMP    SPI_DONE\r
+\r
+;SPI_HARDWARE_WPO30:\r
+;      SBR     FLAGS,1<<2 | 1<<0       ; HARDWARE TYPE IS WPO30, SHOW MESSAGE\r
+;      RJMP    SPI_DONE\r
+\r
+SPI_TURNOFF:\r
+       LDI     E,$FF\r
+       STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+\r
+       CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+\r
+       LDI     E,$FF\r
+       LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+SPI_WATCHDOG_RESET:\r
+       LDI     E,LOW(1000)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDI     E,HIGH(1000)            ; 0.1 SECOND\r
+       STS     WATCHDOG_COUNT+1,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_SELECT:\r
+       ; RECEIVED ADDRESS COMMAND\r
+       TST     E                       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       BRNE    SPI_SELECT_TX\r
+\r
+;SPI_SELECT_RX:\r
+       ; HAD ENQUIRY, SEND ACTIVE DEVICE\r
+       SBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS RX\r
+\r
+       TST     RX_COUNT0\r
+       BRNE    SPI_RX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       TST     RX_COUNT1\r
+       BREQ    SPI_SELECT_NULL         ; NO BYTES AT TAIL, REPORT NULL DEVICE\r
+\r
+;SPI_RX_ADDRESS_ADOPT:\r
+       MOV     RX_COUNT0,RX_COUNT1\r
+       CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     SPI_REMAIN,RX_ADDRESS1  ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+       STS     RX_ADDRESS0,SPI_REMAIN  ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_RX_ADDRESS_SAME:\r
+       LDS     SPI_REMAIN,RX_ADDRESS0  ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_TX:\r
+       ; HAD SELECT, SAVE NEW ACTIVE DEVICE\r
+       CBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS TX\r
+       MOV     SPI_REMAIN,E\r
+\r
+       TST     TX_COUNT1\r
+       BREQ    SPI_TX_ADDRESS_CONT     ; QUEUE IS EMPTY, ALLOW ANY DEVICE\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       CP      E,SPI_REMAIN\r
+       BRNE    SPI_SELECT_NULL         ; ALLOW CURRENTLY SELECTED DEVICE ONLY\r
+\r
+SPI_TX_ADDRESS_CONT:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; FORCE TX_ADDRESS1 TO BE POLLED FOR TX\r
+\r
+       STS     TX_ADDRESS1,SPI_REMAIN  ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_NULL:\r
+       CLR     SPI_REMAIN              ; TX BUSY, REPORT NULL DEVICE\r
+SPI_SELECT_SEND:\r
+       OUT     SPDR,SPI_REMAIN         ; ADDRESS RESPONSE\r
+\r
+       SBR     API_STATE,1<<SPIWAIT    ; SAY WE ARE SENDING ADDRESS RESPONSE\r
+       RJMP    SPI_DONE\r
+\r
+SPI_WAIT:\r
+       CBR     API_STATE,1<<SPIWAIT\r
+\r
+       TST     SPI_REMAIN              ; DID WE SEND NULL ADDRESS RESPONSE?\r
+       BREQ    GO_SPI_DONE             ; YES, ABORT TRANSFER\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE ARE RECEIVING DATA SIZE CMD\r
+GO_SPI_DONE:\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESPOND:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     SPI_REMAIN,E            ; SAVE DATA SIZE COMMAND FOR MIN CALC\r
+\r
+       CBR     API_STATE,1<<SPISIZE    ; IN CASE ERROR, OR NO DATA TRANSFERRED\r
+\r
+       TST     SPI_REMAIN              ; TEST DIRECTION FROM DATA SIZE COMMAND\r
+       SBRS    API_STATE,SPIDIRN       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       RJMP    SPI_RESPOND_RX\r
+\r
+;SPI_RESPOND_TX:\r
+       ; WE HAD ADDRESS ENQUIRY EARLIER\r
+       BRPL    BRPL_SPI_REVERT         ; ENSURE DATA SIZE DIRECTION IS TX\r
+\r
+       MOV     E,RX_COUNT0\r
+       ORI     E,$80                   ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+       RJMP    SPI_RESPOND_CONT\r
+\r
+GO_SPI_REVERT:\r
+       RJMP    SPI_REVERT\r
+\r
+SPI_RESPOND_RX:\r
+       ; WE HAD ADDRESS SELECT EARLIER\r
+       BRMI    GO_SPI_REVERT           ; ENSURE DATA SIZE DIRECTION IS RX\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS1\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = MAX BYTES TO ACCEPT, PER DEVICE\r
+\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BREQ    SPI_DEVICE_SAME\r
+\r
+;SPI_DEVICE_DELTA:\r
+       LDI     ZL,TX_SIZE\r
+       SUB     ZL,TX_COUNT0\r
+       CP      E,ZL\r
+       BRLO    SPI_DEVICE_DELTA_CONT\r
+       MOV     E,ZL\r
+       RJMP    SPI_DEVICE_DELTA_CONT\r
+\r
+SPI_DEVICE_SAME:\r
+       CPI     E,TX_SIZE\r
+       BRLO    SPI_DEVICE_SAME_CONT\r
+       LDI     E,TX_SIZE\r
+SPI_DEVICE_SAME_CONT:\r
+       SUB     E,TX_COUNT0\r
+SPI_DEVICE_DELTA_CONT:\r
+       SUB     E,TX_COUNT1\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       BRPL    SPI_RESPOND_CONT\r
+       LDI     E,$7F                   ; E = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+SPI_RESPOND_CONT:\r
+       ; START SENDING DATA SIZE RESPONSE\r
+       ; SPI_REMAIN = HOST MAX, E = OUR MAX\r
+       CP      E,SPI_REMAIN\r
+       BRSH    SPI_RESPOND_SEND\r
+       MOV     SPI_REMAIN,E            ; SPI_REMAIN = LOWER OF HOST / OUR MAX\r
+SPI_RESPOND_SEND:\r
+       OUT     SPDR,E\r
+\r
+       SBR     API_STATE,1<<SPIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_DATA:\r
+       TST     SPI_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    SPI_RX_DATA             ; GO AND SEND OR RECEIVE 1 BYTE\r
+\r
+;SPI_TX_DATA:\r
+       DEC     SPI_REMAIN\r
+BRPL_SPI_REVERT:\r
+       BRPL    SPI_REVERT              ; SKIP ONE INTERRUPT AT COMPLETION\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_PTR\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       OUT     SPDR,E\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       DEC     RX_COUNT0\r
+       INC     RX_PTR\r
+       LDI     E,RX_SIZE-1\r
+       AND     RX_PTR,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RX_DATA:\r
+       SBRS    API_STATE,SPISIZE\r
+       RJMP    SPI_RX_SKIP             ; SKIP ONE INTERRUPT AT START\r
+\r
+ ; EAT DATA FOR UNCORRUPTED HEX DUMP OUTPUT\r
+ ;RJMP SPI_RX_SKIP\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;RCALL TWAT\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    SPI_TX_COUNT1\r
+       INC     TX_COUNT0\r
+       RJMP    SPI_TX_COUNT2\r
+SPI_TX_COUNT1:\r
+       INC     TX_COUNT1\r
+SPI_TX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+SPI_RX_SKIP:\r
+       DEC     SPI_REMAIN              ; SENT OR RECEIVED 1 CHARACTER\r
+       BRMI    SPI_REVERT\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_REVERT:\r
+       CBR     API_STATE,1<<SPIDATA    ; EXPECTING ADDRESS OR DATA SIZE COMMAND\r
+\r
+       ;LDI    E,0                     ; NO TIMEOUT IF API BUS IS NOW IDLE\r
+       ;SBRC   API_STATE,1<<SPISIZE    ; TRANSACTION STILL OPEN?\r
+SPI_DONE:\r
+       LDI     E,-SPI_TIMEOUT          ; TIMEOUT TO RESET SPI BUS\r
+       MOV     SPI_WATCHDOG,E\r
+\r
+SPI_DONE_ENTRY:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;TWAT:\r
+ ;PUSH ZL\r
+ ;PUSH ZH\r
+ ;LDS ZL,TX_ADDRESS0 ;TX_ADDRESS1\r
+ ;CPI ZL,1\r
+ ;BRNE SKIP_LOOPBACK\r
+ ;MOV ZL,RX_COUNT0\r
+ ;ADD ZL,RX_PTR\r
+ ;ANDI ZL,RX_SIZE-1\r
+ ;SUBI ZL,-RX_BUF\r
+ ;CLR ZH\r
+ ;ST Z,E\r
+ ;INC RX_COUNT0\r
+ ;SKIP_LOOPBACK:\r
+ ;POP ZH\r
+ ;POP ZL\r
+ ;RET\r
+\r
+;---------------- ANALOG TO DIGITAL INTERRUPT ROUTINE ----------------------\r
+\r
+ADC_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       WDR\r
+\r
+       IN      E,ADCL\r
+       MOV     ATOD,E\r
+       IN      E,ADCH\r
+\r
+       ROR     E\r
+       ROR     ATOD\r
+       ROR     E\r
+       ROR     ATOD                    ; CONTAINS THE 8 MSB OF CONVERTER VALUE\r
+\r
+       SBRC    FLAGS,4                 ; CURRENT RESULT IS FROM REFERENCE ?\r
+       RJMP    ADC_REFERENCE\r
+\r
+       ; CURRENT RESULT IS FROM -5V GENERATOR\r
+       SBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE REFERENCE\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E\r
+       ; REVISED 18DEC01 FOR HYT1500\r
+       ;BRNE   GO_ADC_DONE             ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+       BRNE    ADC_DONE                ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+\r
+       LDI     E,$00\r
+       LDI     F,$00\r
+       SUBI    ATOD,92-$40 ;1          ; 256-512*47/147 = ABOUT 33% FULL SCALE\r
+       BRLO    ADC_PULSE               ; FAR TOO NEGATIVE, APPLY MINIMUM PULSE\r
+\r
+       LDI     E,$60\r
+       LDI     F,$00\r
+       CPI     ATOD,$80 ;2\r
+       BRSH    ADC_PULSE               ; FAR TOO POSITIVE, APPLY MAXIMUM PULSE\r
+\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $10\r
+       ;MOV    E,ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $20\r
+       ;ADD    E,ATOD                  ; $01 HALF SCALE -> $30 HALF WIDTH\r
+\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $20\r
+       MOV     E,ATOD\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $10\r
+       ADD     E,ATOD                  ; $40 HALF SCALE -> $30 HALF WIDTH\r
+       RJMP    ADC_PULSE\r
+\r
+ADC_REFERENCE:\r
+       CBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE -5V GENERATOR\r
+\r
+ ;STS VOLTAGE_VSWT,ATOD\r
+ ;RJMP ADC_DONE\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      SBRC    FLAGS,5                 ; CURRENT REFERENCE IS BANDGAP ?\r
+;      RJMP    ADC_BANDGAP\r
+;\r
+;      ; CURRENT REFERENCE IS LM385 (18DEC01 IT'S NOW A 100K/100K DIVIDER)\r
+;      CPI     ATOD,$F8                ; IF =>$F8 ASSUME WE HAVE PULLUP ONLY\r
+;      BRLO    ADC_LM385\r
+;\r
+;      LDS     E,LM385_COUNT\r
+;      DEC     E                       ; COUNT DOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,E\r
+;      BRNE    ADC_DONE                ; KEEP TRYING LM385\r
+;\r
+;      SBR     FLAGS,1<<5              ; SAY WE HAVE SWITCHED TO BANDGAP\r
+;GO_ADC_DONE:\r
+;      RJMP    ADC_DONE\r
+;\r
+;ADC_LM385:\r
+;      LDI     E,$10                   ; TOP UP COUNTDOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,E\r
+;\r
+;;     LSR     ATOD                    ; LM385 VOLTAGE = APPROX 2*BANDGAP\r
+;                                      ; USE LM385Z-1.2\r
+;\r
+;ADC_BANDGAP:\r
+       STS     VOLTAGE_VSWT,ATOD\r
+\r
+       ; 18DEC01 USE 5.5 VOLTS AS FOR THE ORIGINAL HYTECH 1000 SYSTEM\r
+       ; IT MUST BE A BIT > 4.2 VOLTS BECAUSE OTHERWISE AVR VCC = Z180 VCC\r
+       ;CPI    ATOD,137                ; 256*0.5*4.5/4.2\r
+       ;CPI    ATOD,152                ; 256*0.5*5.0/4.2\r
+       CPI     ATOD,168                ; 256*0.5*5.5/4.2\r
+\r
+;      ;CPI    ATOD,70                 ; 256*1.22/4.5\r
+;      ;CPI    ATOD,63                 ; 256*1.22/5.0\r
+;      CPI     ATOD,57                 ; 256*1.22/5.5\r
+\r
+       LDI     E,LOW(1024)\r
+       LDI     F,HIGH(1024)\r
+       ; 18DEC01 FOR HYT1500 REVERSED THE SENSE DUE TO NEW 100K/100K DIVIDER\r
+       ;BRLO   ADC_BATTERY_SAVE\r
+       BRSH    ADC_BATTERY_SAVE\r
+\r
+; BIGBODGE TO SKIP SHUT DOWN DUE TO VOLTAGE MEASURING\r
+; 17DEC01 THIS IS NOW DONE FURTHER DOWN, AFTER LOW BATTERY TEST\r
+;RJMP  ADC_DONE                ; SKIP VOLTAGE TEST FOR NOW\r
+\r
+       ; VSWT < 5.5 VOLTS, STABILISE READING FOR BATTERY LOW\r
+       LDS     E,BATTERY_COUNT\r
+       LDS     F,BATTERY_COUNT+1\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    ADC_BATTERY_SAVE        ; COUNT 1024 LOW BATTERY READINGS\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<3              ; SHOW BATTERY MESSAGE AND POWER DOWN\r
+\r
+ADC_BATTERY_SAVE:\r
+       STS     BATTERY_COUNT,E\r
+       STS     BATTERY_COUNT+1,F\r
+\r
+; BIGBODGE TO SKIP SHUT DOWN DUE TO VOLTAGE MEASURING\r
+; 17DEC01 WE'LL ALSO COMMENT THE WHOLE THING OUT FOR NEATNESS\r
+RJMP   ADC_DONE                ; SKIP VOLTAGE TEST FOR NOW\r
+\r
+;      ; 18DEC01 USE 5.0 VOLTS, MORE AGGRESSIVE THAN HYTECH 1000 SYSTEM\r
+;      ; IT MUST BE A BIT > 4.2 VOLTS BECAUSE OTHERWISE AVR VCC = Z180 VCC\r
+;      ;CPI    ATOD,137                ; 256*0.5*4.5/4.2\r
+;      CPI     ATOD,152                ; 256*0.5*5.0/4.2\r
+;      ;CPI    ATOD,168                ; 256*0.5*5.5/4.2\r
+;      BRSH    ADC_DONE\r
+;\r
+;;     ;CPI    ATOD,90                 ; 256*1.22/3.5\r
+;;     ;CPI    ATOD,79                 ; 256*1.22/4.0\r
+;;     CPI     ATOD,70                 ; 256*1.22/4.5\r
+;;     BRLO    ADC_DONE\r
+;\r
+;      ; 18DEC01 VSWT < 5.0 VOLTS, RESET MAIN PROCESSOR IMMEDIATELY\r
+;      LDI     E,$FF\r
+;      STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+;\r
+;      LDI     E,0\r
+;      OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+;\r
+;      CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+;\r
+;      LDI     E,$FF\r
+;      LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+\r
+ADC_PULSE:\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+\r
+ADC_DONE:\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      LDI     E,$45                   ; START MEASURING BANDGAP\r
+;      SBRS    FLAGS,5\r
+       LDI     E,$04                   ; START MEASURING LM385\r
+       SBRS    FLAGS,4\r
+       LDI     E,$05                   ; START MEASURING -5V GENERATOR\r
+       OUT     ADMUX,E\r
+       LDI     E,$DE\r
+       OUT     ADCSR,E                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 5\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLTS_AT_A5:\r
+;      ;OUT    PORTC,M16U1     ; res in byte 2(ignore ls,byte),volts pin 5\r
+;      MOV     A,B             ; get saved VSWT\r
+;      SUB     A,M16U1         ; voltage 47K = VSWT-Voltage at pin 35\r
+;      MOV     D,A             ; which is 1/3 of total supply ie +V+(-V)\r
+;      ADD     A,D\r
+;      ADD     A,D             ; TOTAL SUPPLY\r
+;      SUB     A,B             ; TOTAL SUPPLY-VSWT=NEG SUPPLY\r
+;DIAG_NEG:\r
+;      ;OUT    PORTC,A\r
+;\r
+;      LDI     A,4\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;ADC_DONE:\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+\r
+;VSWT: ;OUT    PORTC,ATOD      ; count value for 2.5 V ref\r
+;      LDI     A,$FF\r
+;      MOV     DD16UH,A        ; divide by full scale ie VSWT\r
+;      SUB     DD16UL,DD16UL   ; clear low reg\r
+;      SUB     DV16UH,DV16UH   ; clear high reg divisor\r
+;      MOV     DV16UL,ATOD     ; use ATOD value as divisor\r
+;      ;OUT    PORTC,ATOD\r
+;      RCALL   DIVIDE          ; ***** NOTE AN FF RESULT IS NO INPUT *******\r
+;      MOV     MC16UH,DRES16UH ; load multiplicand high from result high\r
+;      MOV     MC16UL,DRES16UL ; load multiplicand low from result low\r
+;      SUB     MP16UH,MP16UH   ; clear high byte in multiplier reg\r
+;       LDI     A,25\r
+;       MOV     MP16UL,A        ; mult by zener ref voltage (2.5V)\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLT_VSWT:\r
+;xi:\r
+;      LDS     A,VSWTS         ; previous value of VSWT\r
+;      MOV     B,MP16UL        ; new value of VSWT\r
+;      ;RCALL  SMOOTH\r
+;      STS     VSWTS,B\r
+;      LDS     B,VSWTS\r
+;\r
+;      ;OUT    PORTC,B;M16U1   ; VSWT IN 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;\r
+;      ;STS    VSWTS,B         ; SAVE NEW SMOOTHED VALUE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      MOV     B,M16U1         ; save copy of VSWT for neg 5V routine\r
+;      MOV     DD16UH,M16U1\r
+;      SUB     DD16UL,DD16UL\r
+;      LDI     A,255           ; calculate the atod volts per division\r
+;      MOV     DV16UL,A\r
+;      SUB     DV16UH,DV16UH\r
+;      RCALL   DIVIDE          ; result to be found in dres high & low\r
+;\r
+;      LDI     A,3\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;VCHG:\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 37 (1/3 VCHG)\r
+;      RCALL   MULTIPLY\r
+;      MOV     A,M16U1\r
+;      ADD     M16U1,A         ; B\C A3 IS 1/3 VCHG\r
+;      ADD     M16U1,A\r
+;DIAG_VOLT_VHG:\r
+;      ;OUT    PORTC,M16U1     ; REUSULT 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      LDI     A,5\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VSWT\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;;***************************************************************************\r
+;;*\r
+;;* "div16u" - 16/16 Bit Unsigned Division\r
+;;*\r
+;;* This subroutine divides the two 16-bit numbers\r
+;;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).\r
+;;* The result is placed in "dres16uH:dres16uL" and the remainder in\r
+;;* "drem16uH:drem16uL".\r
+;;*\r
+;;* Number of words    :19\r
+;;* Number of cycles   :235/251 (Min/Max)\r
+;;* Low registers used :2 (drem16uL,drem16uH)\r
+;;* High registers used  :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,\r
+;;*                        dcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;divide:\r
+;div16u:       clr     drem16uL        ;clear remainder Low byte\r
+;      sub     drem16uH,drem16uH       ;clear remainder High byte and carry\r
+;      ldi     counter,17      ;init loop counter\r
+;d16u_1:       rol     dd16uL          ;shift left dividend\r
+;      rol     dd16uH\r
+;      dec     counter         ;decrement counter\r
+;      brne    d16u_2          ;if done\r
+;      ret                     ;    return\r
+;d16u_2:       rol     drem16uL        ;shift dividend into remainder\r
+;      rol     drem16uH\r
+;      sub     drem16uL,dv16uL ;remainder = remainder - divisor\r
+;      sbc     drem16uH,dv16uH ;\r
+;      brcc    d16u_3          ;if result negative\r
+;      add     drem16uL,dv16uL ;    restore remainder\r
+;      adc     drem16uH,dv16uH\r
+;      clc                     ;    clear carry to be shifted into result\r
+;      rjmp    d16u_1          ;else\r
+;d16u_3:       sec                     ;    set carry to be shifted into result\r
+;      rjmp    d16u_1\r
+;\r
+;;********* 16 X 16 multiplication routine from app note avr200 *************\r
+;;*\r
+;;* "mpy16u" - 16x16 Bit Unsigned Multiplication\r
+;;*\r
+;;* This subroutine multiplies the two 16-bit register variables\r
+;;* mp16uH:mp16uL and mc16uH:mc16uL.\r
+;;* The result is placed in m16u3:m16u2:m16u1:m16u0.\r
+;;*\r
+;;* Number of words    :14 + return\r
+;;* Number of cycles   :153 + return\r
+;;* Low registers used :None\r
+;;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,\r
+;;*                          m16u3,mcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;multiply:\r
+;mpy16u:       clr     m16u3           ;clear high byte of result\r
+;      sub     m16u2,m16u2     ;clear result byte 2 and carry\r
+;      clr     m16u2\r
+;      ldi     counter,16      ;init loop counter\r
+;      lsr     mp16uH\r
+;      ror     mp16uL\r
+;\r
+;m16u_1:       brcc    noad8           ;if bit 0 of multiplier set\r
+;      add     m16u2,mc16uL    ;add multiplicand Low to byte 2 of res\r
+;      adc     m16u3,mc16uH    ;add multiplicand high to byte 3 of res\r
+;noad8:        ror     m16u3           ;shift right result byte 3\r
+;      ror     m16u2           ;rotate right result byte 2\r
+;      ror     m16u1           ;rotate result byte 1 and multiplier High\r
+;      ror     m16u0           ;rotate result byte 0 and multiplier Low\r
+;      dec     counter         ;decrement loop counter\r
+;      brne    m16u_1          ;if not done, loop more\r
+;      ret\r
+;;************************* Exponential smoothing routine ********************\r
+;;Receives : Previous value in A\r
+;;       : New value in B\r
+;;Passes   : Smoothed result back in B reg\r
+;;Uses   : d reg\r
+;\r
+;Smooth:\r
+;      mov     d,a             ; save a copy of previous value\r
+;      lsr     a\r
+;      lsr     a\r
+;      lsr     b\r
+;      lsr     b               ; prev.ave  -  prev.ave  +  new.data\r
+;      sub     d,a             ;              --------     --------\r
+;      add     b,d             ;                  n            n\r
+;      ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MESSAGE_0:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',0,128,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_1:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',240,64,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_2:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','0','0','0',0\r
+\r
+MESSAGE_3:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'W','P','O','3','0',' ','V','5'\r
+\r
+MESSAGE_4:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','D',' ','C','O','M','M','A','N','D',0\r
+\r
+MESSAGE_5:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','T','T','E','R','Y',' ','L','O','W',0\r
+\r
+MESSAGE_6:\r
+       .DB     $1B,'M','0',0\r
+\r
+MESSAGE_7:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','5','0','0',0\r
+\r
+MESSAGE_8:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'S','T','A','C','K',' ','O','V','E','R','F','L','O','W'\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+       ; FSTRT = 0 FOR 1.1 MS R/C STARTUP DELAY\r
+       ;.DW    $ACBE                   ; WRITE FUSE BITS COMMAND\r
+; BIGBODGE (NOT REALLY - JUST IN CASE TYPE OF CHANGE)\r
+;       FSTRT = 1 FOR 16 MS R/C STARTUP DELAY\r
+        .DW     $ACBF                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/wpov0.asm b/src/avr/wpov0.asm
new file mode 100644 (file)
index 0000000..740fde6
--- /dev/null
@@ -0,0 +1,2116 @@
+;      WPOV0.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   LARGE           =0\r
+\r
+;IF LARGE\r
+;.INCLUDE "8535DEFX.INC"\r
+;ELSE\r
+.INCLUDE "4433DEF.INC"\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_TIMEOUT     =25 ;50 ;100    ; 100 * 100 US = APPROX 10.0 MS\r
+.EQU   API_TIME_IDLE   =13 ;25         ; 25 * 100 US = APPROX 2.5 MS\r
+.EQU   API_TIME_SLOW   =13 ;25         ; 25 * 100 US = APPROX 2.5 MS\r
+.EQU   API_TIME_FAST   =2 ;1 ;2                ; 2 * 100 US = APPROX 200 US\r
+.EQU   API_RATE_SLOW   =$8F ;$11               ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05 ;$11               ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   SPI_TIMEOUT     =25 ;50 ;100    ; 100 * 100 US = APPROX 10.0 MS\r
+\r
+;.def  drem16uL        =R0             ; remainder low\r
+;.def  drem16uH        =R1             ; remainder high\r
+;.def  dres16uL        =R2             ; result low    DON'T use as general purpose\r
+;.def  dres16uH        =R3             ; result high   DON'T use as general purpose\r
+;.def  dd16uL          =R2             ; dividend low\r
+;.def  dd16uH          =R3             ; dividend high\r
+;.def  dv16uL          =R4             ; divisor low\r
+;.def  dv16uH          =R5             ; divisor high\r
+;\r
+;.DEF  SPI_REMAIN      =R6\r
+;\r
+;.def  mc16uL          =R7             ;multiplicand low byte\r
+;.def  mc16uH          =R8             ;multiplicand high byte\r
+;.def  mp16uL          =R9             ;multiplier low byte\r
+;.def  mp16uH          =R10            ;multiplier high byte\r
+;.def  m16u0           =R9             ;result byte 0 (LSB)\r
+;.def  m16u1           =R10            ;result byte 1\r
+;.def  m16u2           =R11            ;result byte 2\r
+;.def  m16u3           =R12            ;result byte 3 (MSB)\r
+;\r
+;.DEF  RX_PTR          =R13\r
+;.DEF  RX_COUNT0       =R14\r
+\r
+.DEF   API_REMAIN      =R1\r
+.DEF   API_WATCHDOG    =R2\r
+.DEF   SPI_REMAIN      =R3\r
+.DEF   SPI_WATCHDOG    =R4\r
+.DEF   RX_PTR          =R5\r
+.DEF   RX_COUNT0       =R6\r
+.DEF   RX_COUNT1       =R7\r
+.DEF   TX_PTR          =R8\r
+.DEF   TX_COUNT0       =R9\r
+.DEF   TX_COUNT1       =R10\r
+\r
+.DEF   SR              =R15\r
+.DEF    A              =R16            ; GLOBAL REGISTERS\r
+.DEF    B              =R17\r
+.DEF    D              =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R23\r
+.DEF   G               =R24\r
+\r
+.DEF   FLAGS           =R20\r
+;.def  counter         =R20            ;loop counter\r
+\r
+.DEF   ATOD            =R21            ; SO YOU CAN USE SBCI, SUBI, CPI ETC\r
+\r
+.DEF   API_STATE       =R22\r
+\r
+;.DEF  TX_PTR          =R25\r
+;.DEF  API_WATCHDOG    =R26\r
+;.DEF  API_REMAIN      =R27\r
+;.DEF  SPI_WATCHDOG    =R28\r
+;.DEF  TX_COUNT0       =R29\r
+\r
+.EQU   TX_SIZE         =$40\r
+.EQU   RX_SIZE         =$10\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+VSWTS:         .BYTE   1               ; RETAIN ORDERING %\r
+VCHGS:         .BYTE   1\r
+NEGVS:         .BYTE   1\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+TX_ADDRESS0:   .BYTE   1               ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+TX_ADDRESS1:   .BYTE   1               ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS0:   .BYTE   1               ; SOURCE FOR RX_COUNT0 BYTES AT HEAD\r
+RX_ADDRESS1:   .BYTE   1               ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS2:   .BYTE   1               ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+                                       ; SCAN IS 1,2,1,3,1,4,1,5,1,6,1,7,1,8\r
+\r
+TX_OVERRIDE:   .BYTE   1               ; COUNTER TO TRANSMIT 1 TIME IN 16\r
+RX_OVERRIDE:   .BYTE   1               ; COUNTER TO RECEIVE 1 TIME IN 16\r
+\r
+TX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME TX DEVICE\r
+RX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME RX DEVICE\r
+\r
+;ABSENT_COUNT: .BYTE   1\r
+\r
+TURNOFF_COUNT: .BYTE   1\r
+WATCHDOG_COUNT:        .BYTE   2\r
+\r
+TX_LIMIT:      .BYTE   9               ; MAX Z180 BYTES TO ACCEPT, PER DEVICE\r
+\r
+BATTERY_COUNT: .BYTE   2               ; COUNT 1024 ADC READINGS TO POWER DOWN\r
+\r
+LM385_COUNT:   .BYTE   1               ; COUNT $10 ADC READINGS TO MISSING REF\r
+VOLTAGE_VSWT:  .BYTE   1               ; MOST RECENT ADC READING FROM REF\r
+\r
+HARDWARE_TYPE: .BYTE   1               ; COMES SOMEWHAT BEFORE RSEL HI COMMAND\r
+\r
+STACK_GUARD:   .BYTE   1               ; DETECTS IF STACK COMES DOWN TO HERE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; API_STATE DEFINITIONS\r
+.EQU   SPISIZE         =0              ; SET IF EXPECTING SPI DATA SIZE CMD\r
+.EQU   SPIWAIT         =1              ; SET IF SENDING SPI ADDRESS RESPONSE\r
+.EQU   SPIDATA         =2              ; SET IF TRANSFERRING SPI DATA TX/RX\r
+.EQU   SPIDIRN         =3              ; SET IF TX, BASED ON ADDRESS COMMAND\r
+.EQU   APISIZE         =4              ; SET IF NEED TO SEND API DATA SIZE CMD\r
+.EQU   APIWAIT         =5              ; SET IF WAITING FOR API DATA SIZE RESP\r
+.EQU   APIDATA         =6              ; SET IF TRANSFERRING API DATA TX/RX\r
+.EQU   APIDIRN         =7              ; SET IF TX, TOGGLED ON NULL TRANSFER\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IF LARGE\r
+;\r
+;.EQU  IRQ             =6\r
+;.EQU  IRQ_PORT        =PORTA\r
+;.EQU  IRQ_DDR         =DDRA\r
+;\r
+;.EQU  PRG             =3\r
+;.EQU  PRG_PORT        =PORTB\r
+;.EQU  PRG_DDR         =DDRB\r
+;\r
+;.EQU  OC1             =5\r
+;.EQU  OC1_PORT        =PORTD\r
+;.EQU  OC1_DDR         =DDRD\r
+;\r
+;.EQU  OCR1H           =OCR1AH\r
+;.EQU  OCR1L           =OCR1AL\r
+;\r
+;.EQU  COM10           =COM1A0\r
+;.EQU  COM11           =COM1A1\r
+;\r
+;ELSE\r
+\r
+.EQU   IRQ             =0\r
+.EQU   IRQ_PORT        =PORTB\r
+.EQU   IRQ_DDR         =DDRB\r
+;\r
+.EQU   PRG             =2\r
+.EQU   PRG_PORT        =PORTC\r
+.EQU   PRG_DDR         =DDRC\r
+\r
+.EQU   OC1             =1\r
+.EQU   OC1_PORT        =PORTB\r
+.EQU   OC1_DDR         =DDRB\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER 0 OVERFLOW HANDLER\r
+\r
+       .ORG    SPIADDR\r
+       RJMP    SPI_COMPLETE            ; SPI TRANSFER COMPLETE HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+\r
+       .ORG    ADCCaddr\r
+       RJMP    ADC_COMPLETE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+;IF LARGE\r
+;      LDI     A,HIGH(RAMEND)\r
+;      OUT     SPH,A\r
+;ENDIF\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE STACK GUARD\r
+       LDI     A,$5A\r
+       STS     STACK_GUARD,A\r
+\r
+       ; INITIALISE PORTS\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       LDI     A,0\r
+       OUT     SPCR,A                  ; DISABLE SPI WHILE RESETTING Z180\r
+       OUT     UCR,A                   ; DISABLE UART WHILE RESETTING SLAVES\r
+\r
+;IF LARGE\r
+;      LDI     A,$FF\r
+;      OUT     DDRC,A                  ; PORTC CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     PORTB,7                 ; PB7/SCK CONFIGURED AS PULLED UP INPUT\r
+;      SBI     DDRB,6                  ; PB6/MISO CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     DDRA,7                  ; A7 CONFIGURED AS OUTPUT FOR DTR1\r
+;      SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+;\r
+;; 18DEC01 NOT PULLED UP, DON'T WANT TO CORRUPT 100K/100K DIVIDER\r
+;;     SBI     PORTA,4                 ; A4 PULLED UP TO DETECT MISSING LM385\r
+;ELSE\r
+       SBI     PORTB,5                 ; PB5/SCK CONFIGURED AS PULLED UP INPUT\r
+       SBI     DDRB,4                  ; PB4/MISO CONFIGURED AS OUTPUT\r
+\r
+       SBI     DDRD,5                  ; D5 CONFIGURED AS OUTPUT FOR DTR1\r
+       SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+\r
+       SBI     PORTC,4                 ; C4 PULLED UP TO DETECT MISSING LM385\r
+;ENDIF\r
+\r
+       SBI     PORTD,2                 ; D2 CONFIGURED AS PULL UP FOR IBM CLK\r
+       SBI     PORTD,3                 ; D3 CONFIGURED AS PULL UP FOR IBM DATA\r
+\r
+       SBI     OC1_PORT,OC1\r
+       SBI     OC1_DDR,OC1             ; OUTPUT OC1 = 1, PWM TRANSISTOR OFF\r
+\r
+       CBI     IRQ_PORT,IRQ\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       CBI     PORTD,7\r
+       SBI     DDRD,7                  ; OUTPUT RSEL = 0\r
+\r
+       CBI     PORTD,4\r
+       SBI     DDRD,4                  ; OUTPUT RES = 0\r
+\r
+       ; HARD RESET API BUS DEVICES\r
+       CBI     PRG_PORT,PRG\r
+       SBI     PRG_DDR,PRG             ; OUTPUT PRG = 0\r
+\r
+       CBI     PORTD,1\r
+       SBI     DDRD,1                  ; OUTPUT TXD = 0\r
+\r
+       LDI     A,7\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET SPARE\r
+\r
+       LDI     A,6\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 RECEIPT PRINTER\r
+\r
+       LDI     A,5\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 LABEL PRINTER\r
+\r
+       LDI     A,4\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET MT102 RECEIPT PRINTER\r
+\r
+       ;LDI    A,3\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET SPARE\r
+       ; THE ABOVE SHOULD BE OK - WHY NOT ??  16FEB01\r
+\r
+       ;LDI    A,2\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET TOUCHSCREEN\r
+\r
+       LDI     A,1\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET CUSTOMER DISPLAY\r
+\r
+       LDI     A,0\r
+       RCALL   PRG_RESET               ; REMOVE RESET PULSE\r
+\r
+       ; LOADCELL HAS BEEN IN RESET UNTIL NOW, AND WILL START IN 10 MS\r
+\r
+       ;SBI    PORTD,1                 ; OUTPUT TXD = 1\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BAUD\r
+       OUT     UBRR,A                  ; SET BAUD RATE\r
+       LDI     A,$18\r
+       OUT     UCR,A                   ; ENABLE TX AND RX (OUTPUTS TXD = 1)\r
+\r
+       RCALL   PRG_DELAY_280_MS        ; DELAY FOR TOUCHSCREEN TO REENTER IDLE\r
+\r
+       LDI     A,$AA\r
+       OUT     UDR,A                   ; SEND SLOW TURNON COMMAND\r
+       OUT     UDR,A                   ; AND AGAIN FOR EXTRA SAFETY\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO ALLOW DEVICES TO INITIALISE\r
+\r
+       ; ALLOW Z180 TO START\r
+       SBI     PORTD,4                 ; OUTPUT RES = 1\r
+       ;CBI    DDRD,4                  ; OUTPUT RES = TRI-STATE\r
+\r
+; BIGBODGE FOR ANOTHER RESET PULSE!!!! (LARGE AVR ONLY, AT THE MOMENT)\r
+;RCALL   PRG_DELAY_20_MS\r
+;CBI     PORTD,4                 ; RES=0\r
+;RCALL   PRG_DELAY_20_MS\r
+;SBI     PORTD,4                 ; OUTPUT RES = 1\r
+\r
+       ; INITIALISE VARIABLES\r
+       CLR     A\r
+       LDI     ZL,VSWTS\r
+       CLR     ZH\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       LDI     ZL,TX_LIMIT\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A                    ; CAREFUL - Z WILL BE USED AGAIN BELOW\r
+       STS     TURNOFF_COUNT,A\r
+       STS     VOLTAGE_VSWT,A\r
+\r
+       ;LDI    A,LOW(1000)\r
+       STS     WATCHDOG_COUNT,A\r
+       ;LDI    A,HIGH(1000)            ; 100 MS\r
+       STS     WATCHDOG_COUNT+1,A\r
+\r
+       LDI     A,TX_SIZE\r
+       ST      Z,A                     ; RX_LIMIT FOR 9TH (INTERNAL) DEVICE\r
+\r
+       LDI     A,LOW(1024)\r
+       STS     BATTERY_COUNT,A\r
+       LDI     A,HIGH(1024)\r
+       STS     BATTERY_COUNT+1,A\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION %\r
+       LDI     A,$10                   ; START COUNTDOWN TO MISSING LM385\r
+       STS     LM385_COUNT,A\r
+; (BUT REMAINS FOR HYT1000) %\r
+       CLR     FLAGS\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT0\r
+       CLR     TX_COUNT1\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT0\r
+       CLR     RX_COUNT1\r
+\r
+;      LDI     A,4\r
+;      STS     ABSENT_COUNT,A          ; TOP UP ABSENT COUNTER FOR TX_ADDRESS\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,2\r
+       STS     RX_ADDRESS2,A           ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+\r
+       LDI     A,1\r
+       STS     TX_ADDRESS0,A\r
+       STS     TX_ADDRESS1,A\r
+       STS     RX_ADDRESS0,A\r
+       STS     RX_ADDRESS1,A\r
+       STS     TX_OVERRIDE,A\r
+       STS     RX_OVERRIDE,A\r
+       STS     HARDWARE_TYPE,A         ; AS FOR OLD ALGORITHM WITH FLAGS,2 = 0\r
+\r
+       LDI     A,0\r
+       STS     TX_STICKY,A\r
+       STS     RX_STICKY,A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,A          ; SET UP TIME TO FIRST API BUS POLL\r
+       LDI     A,-SPI_TIMEOUT\r
+       MOV     SPI_WATCHDOG,A          ; SET UP TIME TO FIRST SPI BUS POLL\r
+\r
+       LDI     A,$02                   ; TCK0 = CK/8\r
+       OUT     TCCR0,A                 ; TCK0 ROLLOVER = 256 * 8 / 7.3728 MHZ\r
+                                       ;               = APPROX 278 US\r
+                                       ;!TCK0 ROLLOVER = 256 * 8 / 11.0592 MHZ\r
+                                       ;!              = APPROX 185 US\r
+;IF LARGE\r
+;      LDI     A,$01\r
+;ELSE\r
+       LDI     A,$02\r
+;ENDIF\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       IN      A,SPSR\r
+       IN      A,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     A,$E8\r
+       OUT     SPCR,A                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       ; START -5V GENERATOR TASK\r
+       LDI     A,0\r
+       OUT     TCNT1H,A\r
+       OUT     TCNT1L,A\r
+       OUT     OCR1H,A\r
+       OUT     OCR1L,A                 ; ASSUME NO LOAD TO BEGIN WITH\r
+\r
+       LDI     A,1<<COM11 | 1<<COM10 | 1<<PWM10 ;1<<PWM11 | 1<<PWM10\r
+       OUT     TCCR1A,A                ; 8 BIT PWM ENABLE, INVERTING PWM\r
+       LDI     A,1<<CS10\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 US\r
+\r
+       LDI     A,$05\r
+       OUT     ADMUX,A                 ; USE CHANNEL 5 FOR A/D (A5 OR C5)\r
+       LDI     A,$DE\r
+       OUT     ADCSR,A                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;VOLTAGE_SHOW:\r
+; LDI A,2\r
+; LDS B,VOLTAGE_VSWT\r
+; RCALL TX_HEX\r
+; RJMP VOLTAGE_SHOW\r
+\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+ACTIVITY_LOOP:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BREQ    NO_ERROR_STACK_OVERFLOW\r
+       RJMP    ERROR_STACK_OVERFLOW\r
+NO_ERROR_STACK_OVERFLOW:\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       SBRS    FLAGS,0                 ; READY TO SHOW HARDWARE TYPE MESSAGE ?\r
+       RJMP    ACTIVITY_LOOP\r
+\r
+       ;SBRC   FLAGS,2\r
+       ;RJMP   HARDWARE_TYPE_WPO30\r
+       LDS     A,HARDWARE_TYPE\r
+       CPI     A,3\r
+       BREQ    HARDWARE_TYPE_HYT1500\r
+       CPI     A,2\r
+       BREQ    HARDWARE_TYPE_WPO30\r
+\r
+;HARDWARE_TYPE_HYT1000:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+\r
+       LDI     ZL,LOW(MESSAGE_2*2)\r
+       LDI     ZH,HIGH(MESSAGE_2*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_HYT1500:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_7*2)\r
+       LDI     ZH,HIGH(MESSAGE_7*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_CUSTOMER_64:\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_1*2)\r
+       LDI     ZH,HIGH(MESSAGE_1*2)    ; 240 X 64 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+       RJMP    MAIN_LOOP\r
+\r
+HARDWARE_TYPE_WPO30:\r
+       LDI     A,2\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON CUSTOMER SIDE\r
+\r
+MAIN_LOOP:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+       RJMP    MAIN_LOOP\r
+\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,'D'\r
+       BREQ    DTR_COMMAND\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR_COMMAND:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$03\r
+       BREQ    DTR0_LO\r
+       CPI     A,1\r
+       BREQ    DTR0_HI\r
+       CPI     A,2\r
+       BREQ    DTR1_LO\r
+       CPI     A,3\r
+       BREQ    DTR1_HI\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR0_LO:\r
+       SBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR0_HI:\r
+       CBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_LO:\r
+;IF LARGE\r
+;      SBI     PORTA,7\r
+;ELSE\r
+       SBI     PORTD,5\r
+;ENDIF\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_HI:\r
+;IF LARGE\r
+;      CBI     PORTA,7\r
+;ELSE\r
+       CBI     PORTD,5\r
+;ENDIF\r
+       ;RJMP   DTR_DONE ;MAIN_LOOP\r
+DTR_DONE:\r
+       LDI     B,$30\r
+       ADD     B,A\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'D'\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,B\r
+;      RCALL   TX_WAIT\r
+; %\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RX_WAIT_LOOP:\r
+       SEI\r
+\r
+RX_WAIT:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BRNE    ERROR_STACK_OVERFLOW\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       CLI\r
+\r
+       TST     TX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+       BREQ    RX_WAIT_LOOP\r
+;      BRNE    RX_WAIT_CONT            ; YES, GO AND TEST ADDRESS\r
+;\r
+;      TST     TX_COUNT1               ; ANY DATA WAITING AT TAIL ?\r
+;      BREQ    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE RECEIVED\r
+;\r
+;RX_WAIT_ADOPT:\r
+;      MOV     TX_COUNT0,TX_COUNT1\r
+;      CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;\r
+;      LDS     A,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+;      STS     TX_ADDRESS0,A           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+\r
+RX_WAIT_CONT:\r
+       LDS     A,TX_ADDRESS0\r
+       CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+       BRNE    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+\r
+RX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     ZL,TX_SIZE-1\r
+       AND     TX_PTR,ZL\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;TX_WAIT_LOOP:\r
+;      SEI\r
+;\r
+;TX_WAIT:\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      CLI\r
+;\r
+;      PUSH    A\r
+;      MOV     A,RX_COUNT0\r
+;      ADD     A,RX_COUNT1\r
+;      CPI     A,RX_SIZE-1             ; ROOM TO INSERT 1 BYTE ?\r
+;      POP     A\r
+;      BRSH    TX_WAIT_LOOP\r
+;\r
+;      PUSH    A\r
+;      LDI     A,9\r
+;      STS     RX_ADDRESS1,A\r
+;      POP     A\r
+;      RJMP    TX_CHAR\r
+;\r
+;;     TST     RX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+;;     BREQ    TX_WAIT_LOOP            ; NO, BUT THIS WOULD BE AN OPTIMISATION\r
+;;\r
+;;TX_WAIT_ADOPT:\r
+;;     MOV     RX_COUNT0,RX_COUNT1\r
+;;     CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;;\r
+;;     LDS     A,RX_ADDRESS1           ; DEST FOR RX_COUNT1 BYTES AT HEAD\r
+;;     STS     RX_ADDRESS0,A           ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+;\r
+;TX_WAIT_CONT:\r
+;      PUSH    A\r
+;      LDS     A,RX_ADDRESS1\r
+;      CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+;      POP     A\r
+;      BRNE    TX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+;\r
+;;TX_CHAR: ; DON'T USE THE OTHER TX_CHAR AS IT DOESN'T FINISH WITH RETI\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RETI\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_STACK_OVERFLOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_8*2)\r
+       LDI     ZH,HIGH(MESSAGE_8*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+ERROR_BAD_COMMAND:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_4*2)\r
+       LDI     ZH,HIGH(MESSAGE_4*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BAD_COMMAND_LOOP:\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_BATTERY_LOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_5*2)\r
+       LDI     ZH,HIGH(MESSAGE_5*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BATTERY_LOW_LOOP:\r
+       LDI     A,250\r
+\r
+ERROR_BATTERY_LOW_DELAY:\r
+       RCALL   PRG_DELAY_20_MS         ; 20 MS * 250 = 5 SECONDS\r
+       DEC     A\r
+       BRNE    ERROR_BATTERY_LOW_DELAY\r
+\r
+       LDI     A,2\r
+       LDI     B,3\r
+       LDI     ZL,LOW(MESSAGE_6*2)\r
+       LDI     ZH,HIGH(MESSAGE_6*2)\r
+       RCALL   TX_MESSAGE              ; TURN VSWT OFF VIA TOUCHSCREEN COMMAND\r
+\r
+       RJMP    ERROR_BATTERY_LOW_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PRG_RESET:\r
+       CBI     PRG_PORT,PRG            ; OUTPUT PRG = 0\r
+\r
+       SBRS    A,2\r
+       CBI     PORTD,1\r
+       SBRC    A,2\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 2\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO GENERATE C INPUT TO HC137\r
+\r
+       SBRS    A,1\r
+       CBI     PORTD,1\r
+       SBRC    A,1\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 1\r
+\r
+       RCALL   PRG_DELAY_2_MS          ; DELAY TO GENERATE B INPUT TO HC137\r
+\r
+       SBRS    A,0\r
+       CBI     PORTD,1\r
+       SBRC    A,0\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 0\r
+\r
+       SBI     PRG_PORT,PRG            ; OUTPUT PRG = 1\r
+\r
+       RJMP    PRG_DELAY_200_US        ; WIDTH OF RESET PULSE TO AVR\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR SPI BUS\r
+\r
+;TX_HEX:\r
+;      SEI\r
+;      NOP\r
+;      CLI\r
+;\r
+;      TST     TX_COUNT1\r
+;      BRNE    TX_HEX\r
+;\r
+;      STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+;\r
+;      MOV     A,B\r
+;      SWAP    A\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_HI_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_HI_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      MOV     A,B\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_LO_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_LO_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      LDI     A,' '\r
+;      RCALL   TX_CHAR\r
+;\r
+;      RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_MESSAGE:\r
+       SEI\r
+       NOP\r
+       CLI\r
+\r
+       TST     TX_COUNT1\r
+       BRNE    TX_MESSAGE\r
+\r
+       STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+TX_MESSAGE_LOOP:\r
+       LPM\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       ADIW    ZL,1\r
+       DEC     B\r
+       BRNE    TX_MESSAGE_LOOP\r
+\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     TX_COUNT1\r
+       RET\r
+\r
+;RX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,TX_PTR\r
+;      SUBI    ZL,-TX_BUF\r
+;      CLR     ZH\r
+;      LD      A,Z\r
+;\r
+;      DEC     TX_COUNT0\r
+;      INC     TX_PTR\r
+;      LDI     ZL,TX_SIZE-1\r
+;      AND     TX_PTR,ZL\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      RET\r
+\r
+;TX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PRG_DELAY_280_MS:\r
+       LDI     ZL,LOW(140*29)\r
+       LDI     ZH,HIGH(140*29)         ; 125 * 29 * 69.4 US = 281 MS\r
+       RJMP    PRG_DELAY_ENTRY\r
+PRG_DELAY_20_MS:\r
+       LDI     ZL,LOW(10*29)\r
+       LDI     ZH,HIGH(10*29)          ; 10 * 29 * 69.4 US = 20.1 MS\r
+       RJMP    PRG_DELAY_ENTRY\r
+PRG_DELAY_2_MS:\r
+       LDI     ZL,29                   ; 29 * 69.4 US = 2.01 MS\r
+       RJMP    PRG_DELAY_ENTRY_ZL\r
+PRG_DELAY_200_US:\r
+       LDI     ZL,3                    ; 3 * 69.4 US = 208 US\r
+PRG_DELAY_ENTRY_ZL:\r
+       LDI     ZH,0\r
+PRG_DELAY_ENTRY:\r
+       LDI     D,0                     ; 256 * 3 = 768 T-STATES = 69.4 US\r
+PRG_DELAY_LOOP:\r
+       DEC     D\r
+       BRNE    PRG_DELAY_LOOP\r
+       SBIW    ZL,1\r
+       BRNE    PRG_DELAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; UART RX COMPLETE INTERRUPT HANDLER FOR API BUS\r
+\r
+RX_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       SBRC    API_STATE,APIDATA       ; TRANSFER ALREADY IN PROGRESS?\r
+       RJMP    API_RX_DATA             ; YES, SAVE CHARACTER\r
+\r
+;      ; RECEIVED DATA SIZE RESPONSE\r
+;      SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+;      RJMP    API_RX_RESPONSE         ; NO, PRESERVE ABSENT COUNT\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNT FOR TX_ADDRESS\r
+;\r
+;API_RX_RESPONSE:\r
+       IN      E,UDR\r
+\r
+       EOR     E,API_REMAIN            ; TEST FOR WRONG DIRECTION OF RESPONSE\r
+       BRMI    GO_API_ERROR\r
+\r
+       EOR     E,API_REMAIN            ; RESTORE ORIGINAL DATA SIZE RESPONSE\r
+       BRMI    API_RESPONSE_RX         ; DIRECTION IS TX?\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+API_RESPONSE_RX:\r
+       CP      API_REMAIN,E\r
+       BRLO    API_RESPONSE_OK\r
+       MOV     API_REMAIN,E            ; API_REMAIN = LESSER OUR / SLAVE MAX\r
+\r
+API_RESPONSE_OK:\r
+       CBR     API_STATE,1<<APISIZE    ; IN CASE NO DATA TRANSFERRED\r
+       SBR     API_STATE,1<<APIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       MOV     E,API_REMAIN\r
+       ANDI    E,$7F\r
+       BREQ    API_NULL\r
+\r
+       TST     API_REMAIN              ; ABOUT TO RECEIVE?\r
+       BRMI    API_RX_SETUP            ; YES, AWAIT FURTHER RX INTERRUPTS\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIWAIT    ; ENSURE TIMER INT DOES NOT CAUSE ABORT\r
+       ; WE CAN'T GO STRAIGHT INTO API_TX_DATA BECAUSE WE DON'T KNOW THE\r
+       ; STATUS OF THE TIMER PRESCALER THAT CONTROLS TRANSMISSION.  HERE,\r
+       ; WE WILL NOW WAIT FOR THE NEXT TIMER INTERRUPT TO GET SYNCHRONISED.\r
+       ;RJMP   API_TX_DATA\r
+\r
+       LDI     E,-1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     E,-API_TIME_IDLE\r
+       RJMP    API_ERROR_ENTRY\r
+\r
+GO_API_ERROR:\r
+       RJMP    API_ERROR\r
+\r
+API_RX_DATA:\r
+\r
+ LDS E,RX_ADDRESS1\r
+ CPI E,1 ; DON'T GO STICKY ON THE LOADCELL, BECAUSE IT ALWAYS HAS SOME DATA\r
+ BREQ API_RX_DATA_NONSTICK\r
+ LDI E,1\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+API_RX_DATA_NONSTICK:\r
+\r
+       ; RECEIVING, SAVE CHARACTER\r
+       IN      E,UDR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT0\r
+       ADD     ZL,RX_COUNT1\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,RX_ADDRESS0\r
+       LDS     ZH,RX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    API_RX_COUNT1\r
+       INC     RX_COUNT0\r
+       RJMP    API_RX_COUNT2\r
+API_RX_COUNT1:\r
+       INC     RX_COUNT1\r
+API_RX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ;LDI    E,-API_TIMEOUT\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+API_RX_SETUP:\r
+       LDI     E,-API_TIME_FAST ;FORMERLY -1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     API_REMAIN              ; STILL RECEIVING?\r
+       BRPL    API_REVERT              ; NO, RECEIVED ENTIRE PACKET\r
+\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA:\r
+       ; SENDING DATA, READY FOR NEW BYTE\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET MAX BYTES TO ACCEPT, PER DEVICE\r
+       DEC     E                       ; DECREASE\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,E\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;MOV E,TX_PTR\r
+ ;ORI E,$80\r
+ ;RCALL TWAT\r
+\r
+       ; FOR EVEN CHARACTERS, BIT 0 + START BIT MAKES A DOUBLE BIT, DELAY -1\r
+       ; FOR ODD CHARACTERS, START BIT MAY BE MISSED, SO DELAY -2 TO BE SAFE\r
+       LSR     E ;!                    ; CF = 0 EVEN, 1 ODD\r
+       SBC     E,E ;!                  ; E = $00 EVEN, $FF ODD\r
+       DEC     E ;!                    ; E = $FF EVEN, $FE ODD\r
+; LDI E,-API_TIME_FAST ;! SEE DISCUSSION JUST PRIOR TO API_TIME_FAST DEFINITION\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       ; NOW DONE EARLIER, BEFORE CLOBBERING THE TRANSMITTED CHAR IN E\r
+       ;LDI    E,-API_TIME_FAST\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       ; THIS IS NOW DONE EARLIER WHEN WE SYNCHRONISE TO THE TIMER\r
+       ;SBR    API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       DEC     API_REMAIN              ; SAY WE TRANSMITTED 1 BYTE\r
+       BRNE    API_DONE                ; IF THERE IS MORE TO SEND\r
+       RJMP    API_REVERT\r
+\r
+API_ERROR:\r
+       LDI     E,-API_TIMEOUT\r
+API_ERROR_ENTRY:\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT ADDRESS COMMAND\r
+\r
+       CBR     API_STATE,1<<APISIZE    ; WE WILL SEND ADDRESS COMMAND\r
+\r
+API_REVERT:\r
+       CBI     UCR,RXCIE               ; DISABLE RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; WE WILL SEND ADDR OR DATA SIZE\r
+\r
+API_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 INTERRUPT HANDLER FOR API/SPI BUS\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+       LDS     E,WATCHDOG_COUNT\r
+       LDS     F,WATCHDOG_COUNT+1\r
+       OR      F,E\r
+       BREQ    WATCHDOG_SKIP\r
+       SUBI    E,LOW(1)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDS     E,WATCHDOG_COUNT+1\r
+       SBCI    E,HIGH(1)\r
+       STS     WATCHDOG_COUNT+1,E\r
+       BREQ    WATCHDOG_RESET\r
+WATCHDOG_SKIP:\r
+\r
+       TST     SPI_WATCHDOG\r
+       BREQ    SPI_TIMER_OK\r
+       INC     SPI_WATCHDOG\r
+       BRNE    SPI_TIMER_OK\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI\r
+       IN      E,SPSR\r
+       IN      E,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     E,$E8\r
+       OUT     SPCR,E                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       SBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = 0\r
+\r
+       CBR     API_STATE,1<<SPIDATA | 1<<SPISIZE | 1<<SPIWAIT\r
+SPI_TIMER_OK:\r
+\r
+       TST     API_WATCHDOG\r
+       BREQ    API_TIMER_OK\r
+       INC     API_WATCHDOG\r
+       BREQ    API_TIMED_OUT\r
+API_TIMER_OK:\r
+\r
+T0_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+WATCHDOG_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_RX_TIMEOUT:\r
+       SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+       RJMP    API_TX_ADDRESS          ; NO, PRESERVE ABSENT COUNT\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      DEC     E\r
+; brne api_device_present\r
+       ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+       STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+ LDI E,TX_SIZE\r
+ ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;      LDI     E,4\r
+;api_device_present:\r
+;      STS     ABSENT_COUNT,E          ; DECREMENT ABSENT COUNT FOR TX_ADDRESS\r
+       RJMP    API_TX_ADDRESS\r
+\r
+API_TIMED_OUT:\r
+       SBRC    API_STATE,APIWAIT\r
+       RJMP    API_RX_TIMEOUT\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_TX_DATA\r
+\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_TX_DATA_SIZE\r
+\r
+API_TX_ADDRESS:\r
+       ; SEND ADDRESS COMMAND\r
+       LDI     E,-API_TIME_SLOW\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO DATA SIZE COMMAND\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E                       ; TURNOFF REQUESTED?\r
+       BREQ    API_TURNOFF_OK\r
+       DEC     E                       ; STILL WAITING FOR TURNOFF?\r
+       STS     TURNOFF_COUNT,E\r
+       BREQ    API_TURNOFF_RESET       ; GAVE UP WAITING FOR TURNOFF\r
+\r
+       CBI     PRG_PORT,PRG            ; PRG LOW\r
+       CBI     PORTD,1                 ; TXD LOW\r
+       SBI     DDRD,1                  ; TXD OUTPUT\r
+       LDI     E,0\r
+       OUT     UCR,E                   ; DISABLE UART\r
+       RJMP    API_DONE\r
+\r
+API_TURNOFF_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_TURNOFF_OK:\r
+       CBI     UCR,RXCIE               ; DISABLE RX INTS, FOR APIWAIT ENTRY\r
+\r
+       LDI     E,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       OR      E,TX_COUNT0\r
+       OR      E,TX_COUNT1\r
+       BRNE    API_TRY_TX\r
+\r
+;API_TRY_RX:\r
+       LDS     E,TX_OVERRIDE\r
+       DEC     E\r
+       BREQ    API_DIRECTION_TX        ; FORCED TRANSMIT EVERY SO OFTEN\r
+       STS     TX_OVERRIDE,E\r
+       RJMP    API_DIRECTION_RX\r
+\r
+API_TRY_TX:\r
+       LDS     E,RX_OVERRIDE\r
+       DEC     E\r
+       BREQ    BREQ_API_DIRECTION_RX   ; FORCED RECEIVE EVERY SO OFTEN\r
+       STS     RX_OVERRIDE,E\r
+\r
+API_DIRECTION_TX:\r
+       LDI     E,$10\r
+       STS     TX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       ; SUSPEND TX OPERATIONS WHEN 9TH (INTERNAL) DEVICE ADDRESSED %\r
+       TST     TX_COUNT0               ; ANY BYTES AT HEAD ?\r
+       LDS     E,TX_ADDRESS0\r
+       BRNE    API_SUSPEND_TX0         ; YES, GO AND CHECK HEAD DEVICE\r
+\r
+       TST     TX_COUNT1               ; ANY BYTES AT TAIL ?\r
+       BREQ    API_SUSPEND_TX1         ; NO, GO AND PERFORM TX OPERATION\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE TX_COUNT1 BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1\r
+       STS     TX_ADDRESS0,E           ; ADOPT TAIL DEVICE FOR BYTES AT HEAD\r
+\r
+API_SUSPEND_TX0:\r
+       CPI     E,9\r
+BREQ_API_DIRECTION_RX:\r
+       BREQ    API_DIRECTION_RX\r
+\r
+API_SUSPEND_TX1:\r
+       ; %\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      TST     E\r
+;      BRNE    API_DEVICE_PRESENT\r
+;\r
+;;API_DEVICE_ABSENT:\r
+;      ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+;      LDI     E,TX_SIZE-1\r
+;      AND     TX_PTR,E\r
+;\r
+;      CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+;      STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+;\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      LDI     ZL,TX_LIMIT-1\r
+;      LDS     ZH,TX_ADDRESS0\r
+;      ADD     ZL,ZH\r
+;      CLR     ZH\r
+;      ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+; LDI E,TX_SIZE\r
+; ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNTER FOR NEXT DEVICE\r
+;\r
+;API_DEVICE_PRESENT:\r
+       CBR     API_STATE,1<<APIDIRN    ; SAY WE WILL TRANSMIT\r
+\r
+       TST     TX_COUNT0\r
+       BRNE    API_TX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       ; THIS ROUTINE WILL MOVE BYTES AT TAIL TO HEAD,\r
+       ; REDUNDANTLY, BECAUSE WE HAVE NOW DONE IT EARLIER\r
+       TST     TX_COUNT1\r
+       BRNE    API_TX_ADDRESS_ADOPT    ; BYTES AT TAIL, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       DEC     E\r
+       BRPL    API_TX_ADDRESS_STICKY   ; STAYING STICKY, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_ADDRESS0\r
+       INC     E                       ; BUMP TX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_TX_ADDRESS_SAVE\r
+       LDI     E,1\r
+       RJMP    API_TX_ADDRESS_SAVE\r
+\r
+API_TX_ADDRESS_ADOPT:\r
+       LDI     E,1\r
+API_TX_ADDRESS_STICKY:\r
+       STS     TX_STICKY,E             ; DECREMENT, OR TOP UP, STICKY COUNT\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+API_TX_ADDRESS_SAVE:\r
+       STS     TX_ADDRESS0,E           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_TX_ADDRESS_SAME:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; TOP UP STICKY COUNT\r
+\r
+       LDS     E,TX_ADDRESS0           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_DIRECTION_RX:\r
+       LDI     E,$10\r
+       STS     RX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       SBR     API_STATE,1<<APIDIRN    ; SAY WE WILL RECEIVE\r
+\r
+ LDS E,RX_STICKY\r
+ TST E\r
+ BREQ API_DIRECTION_RX_NEW\r
+ DEC E\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+ LDS E,RX_ADDRESS1\r
+ RJMP API_ADDRESS_SEND\r
+API_DIRECTION_RX_NEW:\r
+\r
+       LDS     E,RX_ADDRESS1           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+       TST     RX_COUNT1\r
+       BRNE    API_ADDRESS_SEND        ; BYTES AT TAIL, PRESERVE DEVICE\r
+\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDS     F,RX_ADDRESS2\r
+       STS     RX_ADDRESS2,E\r
+       MOV     E,F\r
+       CPI     E,1\r
+       BREQ    API_RX_ADDRESS_SAVE\r
+       ; %\r
+\r
+       INC     E                       ; BUMP RX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_RX_ADDRESS_SAVE\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDI     E,2\r
+       ; ELSE\r
+       ;LDI    E,1\r
+       ; %\r
+API_RX_ADDRESS_SAVE:\r
+       STS     RX_ADDRESS1,E           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+API_ADDRESS_SEND:\r
+       OUT     UDR,E                   ; SEND ADDRESS COMMAND\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE WILL SEND DATA SIZE COMMAND\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; RESET, FOR APIWAIT ENTRY\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA_SIZE:\r
+       ; SEND DATA SIZE COMMAND\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       LDI     E,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       MOV     E,TX_COUNT0             ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+\r
+       SBRS    API_STATE,APIDIRN       ; TEST DIRECTION\r
+       RJMP    API_COMMAND_OK          ; DIRECTION IS TX, ASK TO TRANSMIT\r
+\r
+       LDI     E,RX_SIZE\r
+       SUB     E,RX_COUNT0\r
+       SUB     E,RX_COUNT1             ; E = MAXIMUM AMOUNT WE CAN RECEIVE\r
+       ORI     E,$80                   ; ASK TO RECEIVE\r
+\r
+API_COMMAND_OK:\r
+       OUT     UDR,E                   ; SEND DATA SIZE COMMAND\r
+       MOV     API_REMAIN,E            ; SAVE COMMAND FOR MINIMUM CALCULATION\r
+\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      E,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+\r
+       SBR     API_STATE,1<<APIWAIT    ; SAY WE ARE WAITING FOR DATA SIZE RESP\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+; SPI TRANSFER COMPLETE HANDLER FOR Z180 BUS\r
+\r
+SPI_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       IN      E,SPDR\r
+\r
+       SBRC    API_STATE,SPIDATA\r
+       RJMP    SPI_DATA\r
+\r
+       SBRC    API_STATE,SPISIZE\r
+       RJMP    SPI_RESPOND\r
+\r
+       SBRC    API_STATE,SPIWAIT\r
+       RJMP    SPI_WAIT\r
+\r
+;SPI_ADDRESS:\r
+       CPI     E,10                    ; VALID ADDRESSES ARE 1-9\r
+       BRLO    SPI_SELECT\r
+       CPI     E,$80\r
+       BREQ    SPI_RSEL_LO\r
+       CPI     E,$81\r
+       BREQ    SPI_RSEL_HI\r
+       CPI     E,$91\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1000\r
+       CPI     E,$92\r
+       BREQ    SPI_HARDWARE            ; WPO30 V5\r
+       CPI     E,$93\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1500\r
+       CPI     E,$A5\r
+       BREQ    SPI_TURNOFF\r
+       CPI     E,$AA\r
+       BREQ    SPI_RESET\r
+       CPI     E,$C5\r
+       BREQ    SPI_WATCHDOG_RESET\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<1              ; HAD WRONG COMMAND\r
+       RJMP    SPI_DONE_ENTRY          ; RETURN LEAVING SPI_WATCHDOG = 0\r
+\r
+SPI_RSEL_LO:\r
+       CBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RSEL_HI:\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE - FOR COMPATIBILITY\r
+       SBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_HARDWARE: ;_HYT1000\r
+       SUBI    E,$90                   ; THE MAGIC CRACKER\r
+       STS     HARDWARE_TYPE,E         ; IT WAS PREVIOUSLY 1 FOR COMPATIBILITY\r
+\r
+       ;CBR    FLAGS,1<<2              ; HARDWARE TYPE IS HYTECH 1000\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE\r
+       RJMP    SPI_DONE\r
+\r
+;SPI_HARDWARE_WPO30:\r
+;      SBR     FLAGS,1<<2 | 1<<0       ; HARDWARE TYPE IS WPO30, SHOW MESSAGE\r
+;      RJMP    SPI_DONE\r
+\r
+SPI_TURNOFF:\r
+       LDI     E,$FF\r
+       STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+\r
+       CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+\r
+       LDI     E,$FF\r
+       LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+SPI_WATCHDOG_RESET:\r
+       LDI     E,LOW(1000)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDI     E,HIGH(1000)            ; 0.1 SECOND\r
+       STS     WATCHDOG_COUNT+1,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_SELECT:\r
+       ; RECEIVED ADDRESS COMMAND\r
+       TST     E                       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       BRNE    SPI_SELECT_TX\r
+\r
+;SPI_SELECT_RX:\r
+       ; HAD ENQUIRY, SEND ACTIVE DEVICE\r
+       SBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS RX\r
+\r
+       TST     RX_COUNT0\r
+       BRNE    SPI_RX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       TST     RX_COUNT1\r
+       BREQ    SPI_SELECT_NULL         ; NO BYTES AT TAIL, REPORT NULL DEVICE\r
+\r
+;SPI_RX_ADDRESS_ADOPT:\r
+       MOV     RX_COUNT0,RX_COUNT1\r
+       CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     SPI_REMAIN,RX_ADDRESS1  ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+       STS     RX_ADDRESS0,SPI_REMAIN  ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_RX_ADDRESS_SAME:\r
+       LDS     SPI_REMAIN,RX_ADDRESS0  ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_TX:\r
+       ; HAD SELECT, SAVE NEW ACTIVE DEVICE\r
+       CBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS TX\r
+       MOV     SPI_REMAIN,E\r
+\r
+       TST     TX_COUNT1\r
+       BREQ    SPI_TX_ADDRESS_CONT     ; QUEUE IS EMPTY, ALLOW ANY DEVICE\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       CP      E,SPI_REMAIN\r
+       BRNE    SPI_SELECT_NULL         ; ALLOW CURRENTLY SELECTED DEVICE ONLY\r
+\r
+SPI_TX_ADDRESS_CONT:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; FORCE TX_ADDRESS1 TO BE POLLED FOR TX\r
+\r
+       STS     TX_ADDRESS1,SPI_REMAIN  ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_NULL:\r
+       CLR     SPI_REMAIN              ; TX BUSY, REPORT NULL DEVICE\r
+SPI_SELECT_SEND:\r
+       OUT     SPDR,SPI_REMAIN         ; ADDRESS RESPONSE\r
+\r
+       SBR     API_STATE,1<<SPIWAIT    ; SAY WE ARE SENDING ADDRESS RESPONSE\r
+       RJMP    SPI_DONE\r
+\r
+SPI_WAIT:\r
+       CBR     API_STATE,1<<SPIWAIT\r
+\r
+       TST     SPI_REMAIN              ; DID WE SEND NULL ADDRESS RESPONSE?\r
+       BREQ    GO_SPI_DONE             ; YES, ABORT TRANSFER\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE ARE RECEIVING DATA SIZE CMD\r
+GO_SPI_DONE:\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESPOND:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     SPI_REMAIN,E            ; SAVE DATA SIZE COMMAND FOR MIN CALC\r
+\r
+       CBR     API_STATE,1<<SPISIZE    ; IN CASE ERROR, OR NO DATA TRANSFERRED\r
+\r
+       TST     SPI_REMAIN              ; TEST DIRECTION FROM DATA SIZE COMMAND\r
+       SBRS    API_STATE,SPIDIRN       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       RJMP    SPI_RESPOND_RX\r
+\r
+;SPI_RESPOND_TX:\r
+       ; WE HAD ADDRESS ENQUIRY EARLIER\r
+       BRPL    BRPL_SPI_REVERT         ; ENSURE DATA SIZE DIRECTION IS TX\r
+\r
+       MOV     E,RX_COUNT0\r
+       ORI     E,$80                   ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+       RJMP    SPI_RESPOND_CONT\r
+\r
+GO_SPI_REVERT:\r
+       RJMP    SPI_REVERT\r
+\r
+SPI_RESPOND_RX:\r
+       ; WE HAD ADDRESS SELECT EARLIER\r
+       BRMI    GO_SPI_REVERT           ; ENSURE DATA SIZE DIRECTION IS RX\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS1\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = MAX BYTES TO ACCEPT, PER DEVICE\r
+\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BREQ    SPI_DEVICE_SAME\r
+\r
+;SPI_DEVICE_DELTA:\r
+       ; IN THIS CASE TX_COUNT0 SHOULD NOT BE INCLUDED IN MAX BYTES (E)\r
+       LDI     ZL,TX_SIZE\r
+       SUB     ZL,TX_COUNT0\r
+       CP      E,ZL\r
+       BRLO    SPI_DEVICE_DELTA_CONT\r
+       MOV     E,ZL\r
+       RJMP    SPI_DEVICE_DELTA_CONT\r
+\r
+SPI_DEVICE_SAME:\r
+       ; IN THIS CASE TX_COUNT0 SHOULD BE INCLUDED IN MAX BYTES (E)\r
+       CPI     E,TX_SIZE\r
+       BRLO    SPI_DEVICE_SAME_CONT\r
+       LDI     E,TX_SIZE\r
+SPI_DEVICE_SAME_CONT:\r
+       ; SHOULD NOT OVERFLOW BECAUSE IF SO, WE ALREADY RECEIVED MORE THAN MAX\r
+       SUB     E,TX_COUNT0\r
+;TWAT0:        BRLO    TWAT0\r
+SPI_DEVICE_DELTA_CONT:\r
+       ; SHOULD NOT OVERFLOW BECAUSE IF SO, WE ALREADY RECEIVED MORE THAN MAX\r
+       SUB     E,TX_COUNT1\r
+;TWAT1:        BRLO    TWAT1\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       BRPL    SPI_RESPOND_CONT\r
+       LDI     E,$7F                   ; E = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+SPI_RESPOND_CONT:\r
+       ; START SENDING DATA SIZE RESPONSE\r
+       ; SPI_REMAIN = HOST MAX, E = OUR MAX\r
+       CP      E,SPI_REMAIN\r
+       BRSH    SPI_RESPOND_SEND\r
+       MOV     SPI_REMAIN,E            ; SPI_REMAIN = LOWER OF HOST / OUR MAX\r
+SPI_RESPOND_SEND:\r
+       OUT     SPDR,E\r
+\r
+       SBR     API_STATE,1<<SPIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_DATA:\r
+       TST     SPI_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    SPI_RX_DATA             ; GO AND SEND OR RECEIVE 1 BYTE\r
+\r
+;SPI_TX_DATA:\r
+       DEC     SPI_REMAIN\r
+BRPL_SPI_REVERT:\r
+       BRPL    SPI_REVERT              ; SKIP ONE INTERRUPT AT COMPLETION\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_PTR\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       OUT     SPDR,E\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       DEC     RX_COUNT0\r
+       INC     RX_PTR\r
+       LDI     E,RX_SIZE-1\r
+       AND     RX_PTR,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RX_DATA:\r
+       SBRS    API_STATE,SPISIZE\r
+       RJMP    SPI_RX_SKIP             ; SKIP ONE INTERRUPT AT START\r
+\r
+ ; EAT DATA FOR UNCORRUPTED HEX DUMP OUTPUT\r
+ ;RJMP SPI_RX_SKIP\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;RCALL TWAT\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    SPI_TX_COUNT1\r
+       INC     TX_COUNT0\r
+       RJMP    SPI_TX_COUNT2\r
+SPI_TX_COUNT1:\r
+       INC     TX_COUNT1\r
+SPI_TX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+SPI_RX_SKIP:\r
+       DEC     SPI_REMAIN              ; SENT OR RECEIVED 1 CHARACTER\r
+       BRMI    SPI_REVERT\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_REVERT:\r
+       CBR     API_STATE,1<<SPIDATA    ; EXPECTING ADDRESS OR DATA SIZE COMMAND\r
+\r
+       ;LDI    E,0                     ; NO TIMEOUT IF API BUS IS NOW IDLE\r
+       ;SBRC   API_STATE,1<<SPISIZE    ; TRANSACTION STILL OPEN?\r
+SPI_DONE:\r
+       LDI     E,-SPI_TIMEOUT          ; TIMEOUT TO RESET SPI BUS\r
+       MOV     SPI_WATCHDOG,E\r
+\r
+SPI_DONE_ENTRY:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;TWAT:\r
+ ;PUSH ZL\r
+ ;PUSH ZH\r
+ ;LDS ZL,TX_ADDRESS0 ;TX_ADDRESS1\r
+ ;CPI ZL,1\r
+ ;BRNE SKIP_LOOPBACK\r
+ ;MOV ZL,RX_COUNT0\r
+ ;ADD ZL,RX_PTR\r
+ ;ANDI ZL,RX_SIZE-1\r
+ ;SUBI ZL,-RX_BUF\r
+ ;CLR ZH\r
+ ;ST Z,E\r
+ ;INC RX_COUNT0\r
+ ;SKIP_LOOPBACK:\r
+ ;POP ZH\r
+ ;POP ZL\r
+ ;RET\r
+\r
+;---------------- ANALOG TO DIGITAL INTERRUPT ROUTINE ----------------------\r
+\r
+ADC_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       WDR\r
+\r
+       IN      E,ADCL\r
+       MOV     ATOD,E\r
+       IN      E,ADCH\r
+\r
+       ROR     E\r
+       ROR     ATOD\r
+       ROR     E\r
+       ROR     ATOD                    ; CONTAINS THE 8 MSB OF CONVERTER VALUE\r
+\r
+       SBRC    FLAGS,4                 ; CURRENT RESULT IS FROM REFERENCE ?\r
+       RJMP    ADC_REFERENCE\r
+\r
+       ; CURRENT RESULT IS FROM -5V GENERATOR\r
+       SBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE REFERENCE\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E\r
+       BRNE    GO_ADC_DONE             ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+\r
+       LDI     E,$00\r
+       LDI     F,$00\r
+       SUBI    ATOD,92-$40 ;1          ; 256-512*47/147 = ABOUT 33% FULL SCALE\r
+       BRLO    ADC_PULSE               ; FAR TOO NEGATIVE, APPLY MINIMUM PULSE\r
+\r
+       LDI     E,$60\r
+       LDI     F,$00\r
+       CPI     ATOD,$80 ;2\r
+       BRSH    ADC_PULSE               ; FAR TOO POSITIVE, APPLY MAXIMUM PULSE\r
+\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $10\r
+       ;MOV    E,ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $20\r
+       ;ADD    E,ATOD                  ; $01 HALF SCALE -> $30 HALF WIDTH\r
+\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $20\r
+       MOV     E,ATOD\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $10\r
+       ADD     E,ATOD                  ; $40 HALF SCALE -> $30 HALF WIDTH\r
+       RJMP    ADC_PULSE\r
+\r
+ADC_REFERENCE:\r
+       CBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE -5V GENERATOR\r
+\r
+ ;STS VOLTAGE_VSWT,ATOD\r
+ ;RJMP ADC_DONE\r
+\r
+       SBRC    FLAGS,5                 ; CURRENT REFERENCE IS BANDGAP ?\r
+       RJMP    ADC_BANDGAP\r
+\r
+       ; CURRENT REFERENCE IS LM385\r
+       CPI     ATOD,$F8                ; IF =>$F8 ASSUME WE HAVE PULLUP ONLY\r
+       BRLO    ADC_LM385\r
+\r
+       LDS     E,LM385_COUNT\r
+       DEC     E                       ; COUNT DOWN TO MISSING LM385\r
+       STS     LM385_COUNT,E\r
+       BRNE    ADC_DONE                ; KEEP TRYING LM385\r
+\r
+       SBR     FLAGS,1<<5              ; SAY WE HAVE SWITCHED TO BANDGAP\r
+GO_ADC_DONE:\r
+       RJMP    ADC_DONE\r
+\r
+ADC_LM385:\r
+       LDI     E,$10                   ; TOP UP COUNTDOWN TO MISSING LM385\r
+       STS     LM385_COUNT,E\r
+\r
+;      LSR     ATOD                    ; LM385 VOLTAGE = APPROX 2*BANDGAP\r
+                                       ; USE LM385Z-1.2\r
+\r
+ADC_BANDGAP:\r
+       STS     VOLTAGE_VSWT,ATOD\r
+\r
+       ;CPI    ATOD,70                 ; 256*1.22/4.5\r
+       ;CPI    ATOD,63                 ; 256*1.22/5.0\r
+       CPI     ATOD,57                 ; 256*1.22/5.5\r
+       LDI     E,LOW(1024)\r
+       LDI     F,HIGH(1024)\r
+       BRLO    ADC_BATTERY_SAVE\r
+\r
+       ; VSWT < 5.5 VOLTS, STABILISE READING FOR BATTERY LOW\r
+       LDS     E,BATTERY_COUNT\r
+       LDS     F,BATTERY_COUNT+1\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    ADC_BATTERY_SAVE        ; COUNT 1024 LOW BATTERY READINGS\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<3              ; SHOW BATTERY MESSAGE AND POWER DOWN\r
+\r
+ADC_BATTERY_SAVE:\r
+       STS     BATTERY_COUNT,E\r
+       STS     BATTERY_COUNT+1,F\r
+\r
+       ;CPI    ATOD,90                 ; 256*1.22/3.5\r
+       ;CPI    ATOD,79                 ; 256*1.22/4.0\r
+       CPI     ATOD,70                 ; 256*1.22/4.5\r
+       BRLO    ADC_DONE\r
+\r
+       ; VSWT < 4.5 VOLTS, RESET MAIN PROCESSOR IMMEDIATELY\r
+       LDI     E,$FF\r
+       STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+\r
+       CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+\r
+       LDI     E,$FF\r
+       LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+ADC_PULSE:\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+\r
+ADC_DONE:\r
+       LDI     E,$45                   ; START MEASURING BANDGAP\r
+       SBRS    FLAGS,5\r
+       LDI     E,$04                   ; START MEASURING LM385\r
+       SBRS    FLAGS,4\r
+       LDI     E,$05                   ; START MEASURING -5V GENERATOR\r
+       OUT     ADMUX,E\r
+       LDI     E,$DE\r
+       OUT     ADCSR,E                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 5\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLTS_AT_A5:\r
+;      ;OUT    PORTC,M16U1     ; res in byte 2(ignore ls,byte),volts pin 5\r
+;      MOV     A,B             ; get saved VSWT\r
+;      SUB     A,M16U1         ; voltage 47K = VSWT-Voltage at pin 35\r
+;      MOV     D,A             ; which is 1/3 of total supply ie +V+(-V)\r
+;      ADD     A,D\r
+;      ADD     A,D             ; TOTAL SUPPLY\r
+;      SUB     A,B             ; TOTAL SUPPLY-VSWT=NEG SUPPLY\r
+;DIAG_NEG:\r
+;      ;OUT    PORTC,A\r
+;\r
+;      LDI     A,4\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;ADC_DONE:\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+\r
+;VSWT: ;OUT    PORTC,ATOD      ; count value for 2.5 V ref\r
+;      LDI     A,$FF\r
+;      MOV     DD16UH,A        ; divide by full scale ie VSWT\r
+;      SUB     DD16UL,DD16UL   ; clear low reg\r
+;      SUB     DV16UH,DV16UH   ; clear high reg divisor\r
+;      MOV     DV16UL,ATOD     ; use ATOD value as divisor\r
+;      ;OUT    PORTC,ATOD\r
+;      RCALL   DIVIDE          ; ***** NOTE AN FF RESULT IS NO INPUT *******\r
+;      MOV     MC16UH,DRES16UH ; load multiplicand high from result high\r
+;      MOV     MC16UL,DRES16UL ; load multiplicand low from result low\r
+;      SUB     MP16UH,MP16UH   ; clear high byte in multiplier reg\r
+;       LDI     A,25\r
+;       MOV     MP16UL,A        ; mult by zener ref voltage (2.5V)\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLT_VSWT:\r
+;xi:\r
+;      LDS     A,VSWTS         ; previous value of VSWT\r
+;      MOV     B,MP16UL        ; new value of VSWT\r
+;      ;RCALL  SMOOTH\r
+;      STS     VSWTS,B\r
+;      LDS     B,VSWTS\r
+;\r
+;      ;OUT    PORTC,B;M16U1   ; VSWT IN 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;\r
+;      ;STS    VSWTS,B         ; SAVE NEW SMOOTHED VALUE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      MOV     B,M16U1         ; save copy of VSWT for neg 5V routine\r
+;      MOV     DD16UH,M16U1\r
+;      SUB     DD16UL,DD16UL\r
+;      LDI     A,255           ; calculate the atod volts per division\r
+;      MOV     DV16UL,A\r
+;      SUB     DV16UH,DV16UH\r
+;      RCALL   DIVIDE          ; result to be found in dres high & low\r
+;\r
+;      LDI     A,3\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;VCHG:\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 37 (1/3 VCHG)\r
+;      RCALL   MULTIPLY\r
+;      MOV     A,M16U1\r
+;      ADD     M16U1,A         ; B\C A3 IS 1/3 VCHG\r
+;      ADD     M16U1,A\r
+;DIAG_VOLT_VHG:\r
+;      ;OUT    PORTC,M16U1     ; REUSULT 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      LDI     A,5\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VSWT\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;;***************************************************************************\r
+;;*\r
+;;* "div16u" - 16/16 Bit Unsigned Division\r
+;;*\r
+;;* This subroutine divides the two 16-bit numbers\r
+;;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).\r
+;;* The result is placed in "dres16uH:dres16uL" and the remainder in\r
+;;* "drem16uH:drem16uL".\r
+;;*\r
+;;* Number of words    :19\r
+;;* Number of cycles   :235/251 (Min/Max)\r
+;;* Low registers used :2 (drem16uL,drem16uH)\r
+;;* High registers used  :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,\r
+;;*                        dcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;divide:\r
+;div16u:       clr     drem16uL        ;clear remainder Low byte\r
+;      sub     drem16uH,drem16uH       ;clear remainder High byte and carry\r
+;      ldi     counter,17      ;init loop counter\r
+;d16u_1:       rol     dd16uL          ;shift left dividend\r
+;      rol     dd16uH\r
+;      dec     counter         ;decrement counter\r
+;      brne    d16u_2          ;if done\r
+;      ret                     ;    return\r
+;d16u_2:       rol     drem16uL        ;shift dividend into remainder\r
+;      rol     drem16uH\r
+;      sub     drem16uL,dv16uL ;remainder = remainder - divisor\r
+;      sbc     drem16uH,dv16uH ;\r
+;      brcc    d16u_3          ;if result negative\r
+;      add     drem16uL,dv16uL ;    restore remainder\r
+;      adc     drem16uH,dv16uH\r
+;      clc                     ;    clear carry to be shifted into result\r
+;      rjmp    d16u_1          ;else\r
+;d16u_3:       sec                     ;    set carry to be shifted into result\r
+;      rjmp    d16u_1\r
+;\r
+;;********* 16 X 16 multiplication routine from app note avr200 *************\r
+;;*\r
+;;* "mpy16u" - 16x16 Bit Unsigned Multiplication\r
+;;*\r
+;;* This subroutine multiplies the two 16-bit register variables\r
+;;* mp16uH:mp16uL and mc16uH:mc16uL.\r
+;;* The result is placed in m16u3:m16u2:m16u1:m16u0.\r
+;;*\r
+;;* Number of words    :14 + return\r
+;;* Number of cycles   :153 + return\r
+;;* Low registers used :None\r
+;;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,\r
+;;*                          m16u3,mcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;multiply:\r
+;mpy16u:       clr     m16u3           ;clear high byte of result\r
+;      sub     m16u2,m16u2     ;clear result byte 2 and carry\r
+;      clr     m16u2\r
+;      ldi     counter,16      ;init loop counter\r
+;      lsr     mp16uH\r
+;      ror     mp16uL\r
+;\r
+;m16u_1:       brcc    noad8           ;if bit 0 of multiplier set\r
+;      add     m16u2,mc16uL    ;add multiplicand Low to byte 2 of res\r
+;      adc     m16u3,mc16uH    ;add multiplicand high to byte 3 of res\r
+;noad8:        ror     m16u3           ;shift right result byte 3\r
+;      ror     m16u2           ;rotate right result byte 2\r
+;      ror     m16u1           ;rotate result byte 1 and multiplier High\r
+;      ror     m16u0           ;rotate result byte 0 and multiplier Low\r
+;      dec     counter         ;decrement loop counter\r
+;      brne    m16u_1          ;if not done, loop more\r
+;      ret\r
+;;************************* Exponential smoothing routine ********************\r
+;;Receives : Previous value in A\r
+;;       : New value in B\r
+;;Passes   : Smoothed result back in B reg\r
+;;Uses   : d reg\r
+;\r
+;Smooth:\r
+;      mov     d,a             ; save a copy of previous value\r
+;      lsr     a\r
+;      lsr     a\r
+;      lsr     b\r
+;      lsr     b               ; prev.ave  -  prev.ave  +  new.data\r
+;      sub     d,a             ;              --------     --------\r
+;      add     b,d             ;                  n            n\r
+;      ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MESSAGE_0:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',0,128,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_1:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',240,64,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_2:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','0','0','0',0\r
+\r
+MESSAGE_3:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'W','P','O','3','0',' ','V','5'\r
+\r
+MESSAGE_4:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','D',' ','C','O','M','M','A','N','D',0\r
+\r
+MESSAGE_5:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','T','T','E','R','Y',' ','L','O','W',0\r
+\r
+MESSAGE_6:\r
+       .DB     $1B,'M','0',0\r
+\r
+MESSAGE_7:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','5','0','0',0\r
+\r
+MESSAGE_8:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'S','T','A','C','K',' ','O','V','E','R','F','L','O','W'\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 0 ENABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 100 FOR 16K * 11MHZ STARTUP DELAY (NO R/C STARTUP DELAY)\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACB4                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/wpov1.asm b/src/avr/wpov1.asm
new file mode 100644 (file)
index 0000000..cc793ac
--- /dev/null
@@ -0,0 +1,2116 @@
+;      WPOV1.ASM\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   LARGE           =0\r
+\r
+;IF LARGE\r
+;.INCLUDE "8535DEFX.INC"\r
+;ELSE\r
+.INCLUDE "4433DEF.INC"\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_TIMEOUT     =25 ;50 ;100    ; 100 * 100 US = APPROX 10.0 MS\r
+.EQU   API_TIME_IDLE   =13 ;25         ; 25 * 100 US = APPROX 2.5 MS\r
+.EQU   API_TIME_SLOW   =13 ;25         ; 25 * 100 US = APPROX 2.5 MS\r
+.EQU   API_TIME_FAST   =2 ;1 ;2                ; 2 * 100 US = APPROX 200 US\r
+.EQU   API_RATE_SLOW   =$8F ;$11               ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$05 ;$11               ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   SPI_TIMEOUT     =25 ;50 ;100    ; 100 * 100 US = APPROX 10.0 MS\r
+\r
+;.def  drem16uL        =R0             ; remainder low\r
+;.def  drem16uH        =R1             ; remainder high\r
+;.def  dres16uL        =R2             ; result low    DON'T use as general purpose\r
+;.def  dres16uH        =R3             ; result high   DON'T use as general purpose\r
+;.def  dd16uL          =R2             ; dividend low\r
+;.def  dd16uH          =R3             ; dividend high\r
+;.def  dv16uL          =R4             ; divisor low\r
+;.def  dv16uH          =R5             ; divisor high\r
+;\r
+;.DEF  SPI_REMAIN      =R6\r
+;\r
+;.def  mc16uL          =R7             ;multiplicand low byte\r
+;.def  mc16uH          =R8             ;multiplicand high byte\r
+;.def  mp16uL          =R9             ;multiplier low byte\r
+;.def  mp16uH          =R10            ;multiplier high byte\r
+;.def  m16u0           =R9             ;result byte 0 (LSB)\r
+;.def  m16u1           =R10            ;result byte 1\r
+;.def  m16u2           =R11            ;result byte 2\r
+;.def  m16u3           =R12            ;result byte 3 (MSB)\r
+;\r
+;.DEF  RX_PTR          =R13\r
+;.DEF  RX_COUNT0       =R14\r
+\r
+.DEF   API_REMAIN      =R1\r
+.DEF   API_WATCHDOG    =R2\r
+.DEF   SPI_REMAIN      =R3\r
+.DEF   SPI_WATCHDOG    =R4\r
+.DEF   RX_PTR          =R5\r
+.DEF   RX_COUNT0       =R6\r
+.DEF   RX_COUNT1       =R7\r
+.DEF   TX_PTR          =R8\r
+.DEF   TX_COUNT0       =R9\r
+.DEF   TX_COUNT1       =R10\r
+\r
+.DEF   SR              =R15\r
+.DEF    A              =R16            ; GLOBAL REGISTERS\r
+.DEF    B              =R17\r
+.DEF    D              =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R23\r
+.DEF   G               =R24\r
+\r
+.DEF   FLAGS           =R20\r
+;.def  counter         =R20            ;loop counter\r
+\r
+.DEF   ATOD            =R21            ; SO YOU CAN USE SBCI, SUBI, CPI ETC\r
+\r
+.DEF   API_STATE       =R22\r
+\r
+;.DEF  TX_PTR          =R25\r
+;.DEF  API_WATCHDOG    =R26\r
+;.DEF  API_REMAIN      =R27\r
+;.DEF  SPI_WATCHDOG    =R28\r
+;.DEF  TX_COUNT0       =R29\r
+\r
+.EQU   TX_SIZE         =$40\r
+.EQU   RX_SIZE         =$10\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+VSWTS:         .BYTE   1               ; RETAIN ORDERING %\r
+VCHGS:         .BYTE   1\r
+NEGVS:         .BYTE   1\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+TX_ADDRESS0:   .BYTE   1               ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+TX_ADDRESS1:   .BYTE   1               ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS0:   .BYTE   1               ; SOURCE FOR RX_COUNT0 BYTES AT HEAD\r
+RX_ADDRESS1:   .BYTE   1               ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS2:   .BYTE   1               ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+                                       ; SCAN IS 1,2,1,3,1,4,1,5,1,6,1,7,1,8\r
+\r
+TX_OVERRIDE:   .BYTE   1               ; COUNTER TO TRANSMIT 1 TIME IN 16\r
+RX_OVERRIDE:   .BYTE   1               ; COUNTER TO RECEIVE 1 TIME IN 16\r
+\r
+TX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME TX DEVICE\r
+RX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME RX DEVICE\r
+\r
+;ABSENT_COUNT: .BYTE   1\r
+\r
+TURNOFF_COUNT: .BYTE   1\r
+WATCHDOG_COUNT:        .BYTE   2\r
+\r
+TX_LIMIT:      .BYTE   9               ; MAX Z180 BYTES TO ACCEPT, PER DEVICE\r
+\r
+BATTERY_COUNT: .BYTE   2               ; COUNT 1024 ADC READINGS TO POWER DOWN\r
+\r
+LM385_COUNT:   .BYTE   1               ; COUNT $10 ADC READINGS TO MISSING REF\r
+VOLTAGE_VSWT:  .BYTE   1               ; MOST RECENT ADC READING FROM REF\r
+\r
+HARDWARE_TYPE: .BYTE   1               ; COMES SOMEWHAT BEFORE RSEL HI COMMAND\r
+\r
+STACK_GUARD:   .BYTE   1               ; DETECTS IF STACK COMES DOWN TO HERE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; API_STATE DEFINITIONS\r
+.EQU   SPISIZE         =0              ; SET IF EXPECTING SPI DATA SIZE CMD\r
+.EQU   SPIWAIT         =1              ; SET IF SENDING SPI ADDRESS RESPONSE\r
+.EQU   SPIDATA         =2              ; SET IF TRANSFERRING SPI DATA TX/RX\r
+.EQU   SPIDIRN         =3              ; SET IF TX, BASED ON ADDRESS COMMAND\r
+.EQU   APISIZE         =4              ; SET IF NEED TO SEND API DATA SIZE CMD\r
+.EQU   APIWAIT         =5              ; SET IF WAITING FOR API DATA SIZE RESP\r
+.EQU   APIDATA         =6              ; SET IF TRANSFERRING API DATA TX/RX\r
+.EQU   APIDIRN         =7              ; SET IF TX, TOGGLED ON NULL TRANSFER\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IF LARGE\r
+;\r
+;.EQU  IRQ             =6\r
+;.EQU  IRQ_PORT        =PORTA\r
+;.EQU  IRQ_DDR         =DDRA\r
+;\r
+;.EQU  PRG             =3\r
+;.EQU  PRG_PORT        =PORTB\r
+;.EQU  PRG_DDR         =DDRB\r
+;\r
+;.EQU  OC1             =5\r
+;.EQU  OC1_PORT        =PORTD\r
+;.EQU  OC1_DDR         =DDRD\r
+;\r
+;.EQU  OCR1H           =OCR1AH\r
+;.EQU  OCR1L           =OCR1AL\r
+;\r
+;.EQU  COM10           =COM1A0\r
+;.EQU  COM11           =COM1A1\r
+;\r
+;ELSE\r
+\r
+.EQU   IRQ             =0\r
+.EQU   IRQ_PORT        =PORTB\r
+.EQU   IRQ_DDR         =DDRB\r
+;\r
+.EQU   PRG             =2\r
+.EQU   PRG_PORT        =PORTC\r
+.EQU   PRG_DDR         =DDRC\r
+\r
+.EQU   OC1             =1\r
+.EQU   OC1_PORT        =PORTB\r
+.EQU   OC1_DDR         =DDRB\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER 0 OVERFLOW HANDLER\r
+\r
+       .ORG    SPIADDR\r
+       RJMP    SPI_COMPLETE            ; SPI TRANSFER COMPLETE HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+\r
+       .ORG    ADCCaddr\r
+       RJMP    ADC_COMPLETE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+;IF LARGE\r
+;      LDI     A,HIGH(RAMEND)\r
+;      OUT     SPH,A\r
+;ENDIF\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE STACK GUARD\r
+       LDI     A,$5A\r
+       STS     STACK_GUARD,A\r
+\r
+       ; INITIALISE PORTS\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       LDI     A,0\r
+       OUT     SPCR,A                  ; DISABLE SPI WHILE RESETTING Z180\r
+       OUT     UCR,A                   ; DISABLE UART WHILE RESETTING SLAVES\r
+\r
+;IF LARGE\r
+;      LDI     A,$FF\r
+;      OUT     DDRC,A                  ; PORTC CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     PORTB,7                 ; PB7/SCK CONFIGURED AS PULLED UP INPUT\r
+;      SBI     DDRB,6                  ; PB6/MISO CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     DDRA,7                  ; A7 CONFIGURED AS OUTPUT FOR DTR1\r
+;      SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+;\r
+;; 18DEC01 NOT PULLED UP, DON'T WANT TO CORRUPT 100K/100K DIVIDER\r
+;;     SBI     PORTA,4                 ; A4 PULLED UP TO DETECT MISSING LM385\r
+;ELSE\r
+       SBI     PORTB,5                 ; PB5/SCK CONFIGURED AS PULLED UP INPUT\r
+       SBI     DDRB,4                  ; PB4/MISO CONFIGURED AS OUTPUT\r
+\r
+       SBI     DDRD,5                  ; D5 CONFIGURED AS OUTPUT FOR DTR1\r
+       SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+\r
+       SBI     PORTC,4                 ; C4 PULLED UP TO DETECT MISSING LM385\r
+;ENDIF\r
+\r
+       SBI     PORTD,2                 ; D2 CONFIGURED AS PULL UP FOR IBM CLK\r
+       SBI     PORTD,3                 ; D3 CONFIGURED AS PULL UP FOR IBM DATA\r
+\r
+       SBI     OC1_PORT,OC1\r
+       SBI     OC1_DDR,OC1             ; OUTPUT OC1 = 1, PWM TRANSISTOR OFF\r
+\r
+       CBI     IRQ_PORT,IRQ\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       CBI     PORTD,7\r
+       SBI     DDRD,7                  ; OUTPUT RSEL = 0\r
+\r
+       CBI     PORTD,4\r
+       SBI     DDRD,4                  ; OUTPUT RES = 0\r
+\r
+       ; HARD RESET API BUS DEVICES\r
+       CBI     PRG_PORT,PRG\r
+       SBI     PRG_DDR,PRG             ; OUTPUT PRG = 0\r
+\r
+       CBI     PORTD,1\r
+       SBI     DDRD,1                  ; OUTPUT TXD = 0\r
+\r
+       LDI     A,7\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET SPARE\r
+\r
+       LDI     A,6\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 RECEIPT PRINTER\r
+\r
+       LDI     A,5\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 LABEL PRINTER\r
+\r
+       LDI     A,4\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET MT102 RECEIPT PRINTER\r
+\r
+       ;LDI    A,3\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET SPARE\r
+       ; THE ABOVE SHOULD BE OK - WHY NOT ??  16FEB01\r
+\r
+       ;LDI    A,2\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET TOUCHSCREEN\r
+\r
+       LDI     A,1\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET CUSTOMER DISPLAY\r
+\r
+       LDI     A,0\r
+       RCALL   PRG_RESET               ; REMOVE RESET PULSE\r
+\r
+       ; LOADCELL HAS BEEN IN RESET UNTIL NOW, AND WILL START IN 10 MS\r
+\r
+       ;SBI    PORTD,1                 ; OUTPUT TXD = 1\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BAUD\r
+       OUT     UBRR,A                  ; SET BAUD RATE\r
+       LDI     A,$18\r
+       OUT     UCR,A                   ; ENABLE TX AND RX (OUTPUTS TXD = 1)\r
+\r
+       RCALL   PRG_DELAY_280_MS        ; DELAY FOR TOUCHSCREEN TO REENTER IDLE\r
+\r
+       LDI     A,$AA\r
+       OUT     UDR,A                   ; SEND SLOW TURNON COMMAND\r
+       OUT     UDR,A                   ; AND AGAIN FOR EXTRA SAFETY\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO ALLOW DEVICES TO INITIALISE\r
+\r
+       ; ALLOW Z180 TO START\r
+       SBI     PORTD,4                 ; OUTPUT RES = 1\r
+       ;CBI    DDRD,4                  ; OUTPUT RES = TRI-STATE\r
+\r
+; BIGBODGE FOR ANOTHER RESET PULSE!!!! (LARGE AVR ONLY, AT THE MOMENT)\r
+;RCALL   PRG_DELAY_20_MS\r
+;CBI     PORTD,4                 ; RES=0\r
+;RCALL   PRG_DELAY_20_MS\r
+;SBI     PORTD,4                 ; OUTPUT RES = 1\r
+\r
+       ; INITIALISE VARIABLES\r
+       CLR     A\r
+       LDI     ZL,VSWTS\r
+       CLR     ZH\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       LDI     ZL,TX_LIMIT\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A                    ; CAREFUL - Z WILL BE USED AGAIN BELOW\r
+       STS     TURNOFF_COUNT,A\r
+       STS     VOLTAGE_VSWT,A\r
+\r
+       ;LDI    A,LOW(1000)\r
+       STS     WATCHDOG_COUNT,A\r
+       ;LDI    A,HIGH(1000)            ; 100 MS\r
+       STS     WATCHDOG_COUNT+1,A\r
+\r
+       LDI     A,TX_SIZE\r
+       ST      Z,A                     ; RX_LIMIT FOR 9TH (INTERNAL) DEVICE\r
+\r
+       LDI     A,LOW(1024)\r
+       STS     BATTERY_COUNT,A\r
+       LDI     A,HIGH(1024)\r
+       STS     BATTERY_COUNT+1,A\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION %\r
+       LDI     A,$10                   ; START COUNTDOWN TO MISSING LM385\r
+       STS     LM385_COUNT,A\r
+; (BUT REMAINS FOR HYT1000) %\r
+       CLR     FLAGS\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT0\r
+       CLR     TX_COUNT1\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT0\r
+       CLR     RX_COUNT1\r
+\r
+;      LDI     A,4\r
+;      STS     ABSENT_COUNT,A          ; TOP UP ABSENT COUNTER FOR TX_ADDRESS\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,2\r
+       STS     RX_ADDRESS2,A           ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+\r
+       LDI     A,1\r
+       STS     TX_ADDRESS0,A\r
+       STS     TX_ADDRESS1,A\r
+       STS     RX_ADDRESS0,A\r
+       STS     RX_ADDRESS1,A\r
+       STS     TX_OVERRIDE,A\r
+       STS     RX_OVERRIDE,A\r
+       STS     HARDWARE_TYPE,A         ; AS FOR OLD ALGORITHM WITH FLAGS,2 = 0\r
+\r
+       LDI     A,0\r
+       STS     TX_STICKY,A\r
+       STS     RX_STICKY,A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,A          ; SET UP TIME TO FIRST API BUS POLL\r
+       LDI     A,-SPI_TIMEOUT\r
+       MOV     SPI_WATCHDOG,A          ; SET UP TIME TO FIRST SPI BUS POLL\r
+\r
+       LDI     A,$02                   ; TCK0 = CK/8\r
+       OUT     TCCR0,A                 ; TCK0 ROLLOVER = 256 * 8 / 7.3728 MHZ\r
+                                       ;               = APPROX 278 US\r
+                                       ;!TCK0 ROLLOVER = 256 * 8 / 11.0592 MHZ\r
+                                       ;!              = APPROX 185 US\r
+;IF LARGE\r
+;      LDI     A,$01\r
+;ELSE\r
+       LDI     A,$02\r
+;ENDIF\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       IN      A,SPSR\r
+       IN      A,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     A,$E8\r
+       OUT     SPCR,A                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       ; START -5V GENERATOR TASK\r
+       LDI     A,0\r
+       OUT     TCNT1H,A\r
+       OUT     TCNT1L,A\r
+       OUT     OCR1H,A\r
+       OUT     OCR1L,A                 ; ASSUME NO LOAD TO BEGIN WITH\r
+\r
+       LDI     A,1<<COM11 | 1<<COM10 | 1<<PWM10 ;1<<PWM11 | 1<<PWM10\r
+       OUT     TCCR1A,A                ; 8 BIT PWM ENABLE, INVERTING PWM\r
+       LDI     A,1<<CS10\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 US\r
+\r
+       LDI     A,$05\r
+       OUT     ADMUX,A                 ; USE CHANNEL 5 FOR A/D (A5 OR C5)\r
+       LDI     A,$DE\r
+       OUT     ADCSR,A                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;VOLTAGE_SHOW:\r
+; LDI A,2\r
+; LDS B,VOLTAGE_VSWT\r
+; RCALL TX_HEX\r
+; RJMP VOLTAGE_SHOW\r
+\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+ACTIVITY_LOOP:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BREQ    NO_ERROR_STACK_OVERFLOW\r
+       RJMP    ERROR_STACK_OVERFLOW\r
+NO_ERROR_STACK_OVERFLOW:\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       SBRS    FLAGS,0                 ; READY TO SHOW HARDWARE TYPE MESSAGE ?\r
+       RJMP    ACTIVITY_LOOP\r
+\r
+       ;SBRC   FLAGS,2\r
+       ;RJMP   HARDWARE_TYPE_WPO30\r
+       LDS     A,HARDWARE_TYPE\r
+       CPI     A,3\r
+       BREQ    HARDWARE_TYPE_HYT1500\r
+       CPI     A,2\r
+       BREQ    HARDWARE_TYPE_WPO30\r
+\r
+;HARDWARE_TYPE_HYT1000:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+\r
+       LDI     ZL,LOW(MESSAGE_2*2)\r
+       LDI     ZH,HIGH(MESSAGE_2*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_HYT1500:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_7*2)\r
+       LDI     ZH,HIGH(MESSAGE_7*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_CUSTOMER_64:\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_1*2)\r
+       LDI     ZH,HIGH(MESSAGE_1*2)    ; 240 X 64 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+       RJMP    MAIN_LOOP\r
+\r
+HARDWARE_TYPE_WPO30:\r
+       LDI     A,2\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON CUSTOMER SIDE\r
+\r
+MAIN_LOOP:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+       RJMP    MAIN_LOOP\r
+\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,'D'\r
+       BREQ    DTR_COMMAND\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR_COMMAND:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$03\r
+       BREQ    DTR0_LO\r
+       CPI     A,1\r
+       BREQ    DTR0_HI\r
+       CPI     A,2\r
+       BREQ    DTR1_LO\r
+       CPI     A,3\r
+       BREQ    DTR1_HI\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR0_LO:\r
+       SBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR0_HI:\r
+       CBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_LO:\r
+;IF LARGE\r
+;      SBI     PORTA,7\r
+;ELSE\r
+       SBI     PORTD,5\r
+;ENDIF\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_HI:\r
+;IF LARGE\r
+;      CBI     PORTA,7\r
+;ELSE\r
+       CBI     PORTD,5\r
+;ENDIF\r
+       ;RJMP   DTR_DONE ;MAIN_LOOP\r
+DTR_DONE:\r
+       LDI     B,$30\r
+       ADD     B,A\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'D'\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,B\r
+;      RCALL   TX_WAIT\r
+; %\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RX_WAIT_LOOP:\r
+       SEI\r
+\r
+RX_WAIT:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BRNE    ERROR_STACK_OVERFLOW\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       CLI\r
+\r
+       TST     TX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+       BREQ    RX_WAIT_LOOP\r
+;      BRNE    RX_WAIT_CONT            ; YES, GO AND TEST ADDRESS\r
+;\r
+;      TST     TX_COUNT1               ; ANY DATA WAITING AT TAIL ?\r
+;      BREQ    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE RECEIVED\r
+;\r
+;RX_WAIT_ADOPT:\r
+;      MOV     TX_COUNT0,TX_COUNT1\r
+;      CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;\r
+;      LDS     A,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+;      STS     TX_ADDRESS0,A           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+\r
+RX_WAIT_CONT:\r
+       LDS     A,TX_ADDRESS0\r
+       CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+       BRNE    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+\r
+RX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     ZL,TX_SIZE-1\r
+       AND     TX_PTR,ZL\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;TX_WAIT_LOOP:\r
+;      SEI\r
+;\r
+;TX_WAIT:\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      CLI\r
+;\r
+;      PUSH    A\r
+;      MOV     A,RX_COUNT0\r
+;      ADD     A,RX_COUNT1\r
+;      CPI     A,RX_SIZE-1             ; ROOM TO INSERT 1 BYTE ?\r
+;      POP     A\r
+;      BRSH    TX_WAIT_LOOP\r
+;\r
+;      PUSH    A\r
+;      LDI     A,9\r
+;      STS     RX_ADDRESS1,A\r
+;      POP     A\r
+;      RJMP    TX_CHAR\r
+;\r
+;;     TST     RX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+;;     BREQ    TX_WAIT_LOOP            ; NO, BUT THIS WOULD BE AN OPTIMISATION\r
+;;\r
+;;TX_WAIT_ADOPT:\r
+;;     MOV     RX_COUNT0,RX_COUNT1\r
+;;     CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;;\r
+;;     LDS     A,RX_ADDRESS1           ; DEST FOR RX_COUNT1 BYTES AT HEAD\r
+;;     STS     RX_ADDRESS0,A           ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+;\r
+;TX_WAIT_CONT:\r
+;      PUSH    A\r
+;      LDS     A,RX_ADDRESS1\r
+;      CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+;      POP     A\r
+;      BRNE    TX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+;\r
+;;TX_CHAR: ; DON'T USE THE OTHER TX_CHAR AS IT DOESN'T FINISH WITH RETI\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RETI\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_STACK_OVERFLOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_8*2)\r
+       LDI     ZH,HIGH(MESSAGE_8*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+ERROR_BAD_COMMAND:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_4*2)\r
+       LDI     ZH,HIGH(MESSAGE_4*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BAD_COMMAND_LOOP:\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_BATTERY_LOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_5*2)\r
+       LDI     ZH,HIGH(MESSAGE_5*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BATTERY_LOW_LOOP:\r
+       LDI     A,250\r
+\r
+ERROR_BATTERY_LOW_DELAY:\r
+       RCALL   PRG_DELAY_20_MS         ; 20 MS * 250 = 5 SECONDS\r
+       DEC     A\r
+       BRNE    ERROR_BATTERY_LOW_DELAY\r
+\r
+       LDI     A,2\r
+       LDI     B,3\r
+       LDI     ZL,LOW(MESSAGE_6*2)\r
+       LDI     ZH,HIGH(MESSAGE_6*2)\r
+       RCALL   TX_MESSAGE              ; TURN VSWT OFF VIA TOUCHSCREEN COMMAND\r
+\r
+       RJMP    ERROR_BATTERY_LOW_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PRG_RESET:\r
+       CBI     PRG_PORT,PRG            ; OUTPUT PRG = 0\r
+\r
+       SBRS    A,2\r
+       CBI     PORTD,1\r
+       SBRC    A,2\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 2\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO GENERATE C INPUT TO HC137\r
+\r
+       SBRS    A,1\r
+       CBI     PORTD,1\r
+       SBRC    A,1\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 1\r
+\r
+       RCALL   PRG_DELAY_2_MS          ; DELAY TO GENERATE B INPUT TO HC137\r
+\r
+       SBRS    A,0\r
+       CBI     PORTD,1\r
+       SBRC    A,0\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 0\r
+\r
+       SBI     PRG_PORT,PRG            ; OUTPUT PRG = 1\r
+\r
+       RJMP    PRG_DELAY_200_US        ; WIDTH OF RESET PULSE TO AVR\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR SPI BUS\r
+\r
+;TX_HEX:\r
+;      SEI\r
+;      NOP\r
+;      CLI\r
+;\r
+;      TST     TX_COUNT1\r
+;      BRNE    TX_HEX\r
+;\r
+;      STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+;\r
+;      MOV     A,B\r
+;      SWAP    A\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_HI_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_HI_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      MOV     A,B\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_LO_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_LO_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      LDI     A,' '\r
+;      RCALL   TX_CHAR\r
+;\r
+;      RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_MESSAGE:\r
+       SEI\r
+       NOP\r
+       CLI\r
+\r
+       TST     TX_COUNT1\r
+       BRNE    TX_MESSAGE\r
+\r
+       STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+TX_MESSAGE_LOOP:\r
+       LPM\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       ADIW    ZL,1\r
+       DEC     B\r
+       BRNE    TX_MESSAGE_LOOP\r
+\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     TX_COUNT1\r
+       RET\r
+\r
+;RX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,TX_PTR\r
+;      SUBI    ZL,-TX_BUF\r
+;      CLR     ZH\r
+;      LD      A,Z\r
+;\r
+;      DEC     TX_COUNT0\r
+;      INC     TX_PTR\r
+;      LDI     ZL,TX_SIZE-1\r
+;      AND     TX_PTR,ZL\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      RET\r
+\r
+;TX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PRG_DELAY_280_MS:\r
+       LDI     ZL,LOW(140*29)\r
+       LDI     ZH,HIGH(140*29)         ; 125 * 29 * 69.4 US = 281 MS\r
+       RJMP    PRG_DELAY_ENTRY\r
+PRG_DELAY_20_MS:\r
+       LDI     ZL,LOW(10*29)\r
+       LDI     ZH,HIGH(10*29)          ; 10 * 29 * 69.4 US = 20.1 MS\r
+       RJMP    PRG_DELAY_ENTRY\r
+PRG_DELAY_2_MS:\r
+       LDI     ZL,29                   ; 29 * 69.4 US = 2.01 MS\r
+       RJMP    PRG_DELAY_ENTRY_ZL\r
+PRG_DELAY_200_US:\r
+       LDI     ZL,3                    ; 3 * 69.4 US = 208 US\r
+PRG_DELAY_ENTRY_ZL:\r
+       LDI     ZH,0\r
+PRG_DELAY_ENTRY:\r
+       LDI     D,0                     ; 256 * 3 = 768 T-STATES = 69.4 US\r
+PRG_DELAY_LOOP:\r
+       DEC     D\r
+       BRNE    PRG_DELAY_LOOP\r
+       SBIW    ZL,1\r
+       BRNE    PRG_DELAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; UART RX COMPLETE INTERRUPT HANDLER FOR API BUS\r
+\r
+RX_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       SBRC    API_STATE,APIDATA       ; TRANSFER ALREADY IN PROGRESS?\r
+       RJMP    API_RX_DATA             ; YES, SAVE CHARACTER\r
+\r
+;      ; RECEIVED DATA SIZE RESPONSE\r
+;      SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+;      RJMP    API_RX_RESPONSE         ; NO, PRESERVE ABSENT COUNT\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNT FOR TX_ADDRESS\r
+;\r
+;API_RX_RESPONSE:\r
+       IN      E,UDR\r
+\r
+       EOR     E,API_REMAIN            ; TEST FOR WRONG DIRECTION OF RESPONSE\r
+       BRMI    GO_API_ERROR\r
+\r
+       EOR     E,API_REMAIN            ; RESTORE ORIGINAL DATA SIZE RESPONSE\r
+       BRMI    API_RESPONSE_RX         ; DIRECTION IS TX?\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+API_RESPONSE_RX:\r
+       CP      API_REMAIN,E\r
+       BRLO    API_RESPONSE_OK\r
+       MOV     API_REMAIN,E            ; API_REMAIN = LESSER OUR / SLAVE MAX\r
+\r
+API_RESPONSE_OK:\r
+       CBR     API_STATE,1<<APISIZE    ; IN CASE NO DATA TRANSFERRED\r
+       SBR     API_STATE,1<<APIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       MOV     E,API_REMAIN\r
+       ANDI    E,$7F\r
+       BREQ    API_NULL\r
+\r
+       TST     API_REMAIN              ; ABOUT TO RECEIVE?\r
+       BRMI    API_RX_SETUP            ; YES, AWAIT FURTHER RX INTERRUPTS\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIWAIT    ; ENSURE TIMER INT DOES NOT CAUSE ABORT\r
+       ; WE CAN'T GO STRAIGHT INTO API_TX_DATA BECAUSE WE DON'T KNOW THE\r
+       ; STATUS OF THE TIMER PRESCALER THAT CONTROLS TRANSMISSION.  HERE,\r
+       ; WE WILL NOW WAIT FOR THE NEXT TIMER INTERRUPT TO GET SYNCHRONISED.\r
+       ;RJMP   API_TX_DATA\r
+\r
+       LDI     E,-1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     E,-API_TIME_IDLE\r
+       RJMP    API_ERROR_ENTRY\r
+\r
+GO_API_ERROR:\r
+       RJMP    API_ERROR\r
+\r
+API_RX_DATA:\r
+\r
+ LDS E,RX_ADDRESS1\r
+ CPI E,1 ; DON'T GO STICKY ON THE LOADCELL, BECAUSE IT ALWAYS HAS SOME DATA\r
+ BREQ API_RX_DATA_NONSTICK\r
+ LDI E,1\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+API_RX_DATA_NONSTICK:\r
+\r
+       ; RECEIVING, SAVE CHARACTER\r
+       IN      E,UDR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT0\r
+       ADD     ZL,RX_COUNT1\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,RX_ADDRESS0\r
+       LDS     ZH,RX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    API_RX_COUNT1\r
+       INC     RX_COUNT0\r
+       RJMP    API_RX_COUNT2\r
+API_RX_COUNT1:\r
+       INC     RX_COUNT1\r
+API_RX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ;LDI    E,-API_TIMEOUT\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+API_RX_SETUP:\r
+       LDI     E,-API_TIME_FAST ;FORMERLY -1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     API_REMAIN              ; STILL RECEIVING?\r
+       BRPL    API_REVERT              ; NO, RECEIVED ENTIRE PACKET\r
+\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA:\r
+       ; SENDING DATA, READY FOR NEW BYTE\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET MAX BYTES TO ACCEPT, PER DEVICE\r
+       DEC     E                       ; DECREASE\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,E\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;MOV E,TX_PTR\r
+ ;ORI E,$80\r
+ ;RCALL TWAT\r
+\r
+       ; FOR EVEN CHARACTERS, BIT 0 + START BIT MAKES A DOUBLE BIT, DELAY -1\r
+       ; FOR ODD CHARACTERS, START BIT MAY BE MISSED, SO DELAY -2 TO BE SAFE\r
+       LSR     E ;!                    ; CF = 0 EVEN, 1 ODD\r
+       SBC     E,E ;!                  ; E = $00 EVEN, $FF ODD\r
+       DEC     E ;!                    ; E = $FF EVEN, $FE ODD\r
+; LDI E,-API_TIME_FAST ;! SEE DISCUSSION JUST PRIOR TO API_TIME_FAST DEFINITION\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       ; NOW DONE EARLIER, BEFORE CLOBBERING THE TRANSMITTED CHAR IN E\r
+       ;LDI    E,-API_TIME_FAST\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       ; THIS IS NOW DONE EARLIER WHEN WE SYNCHRONISE TO THE TIMER\r
+       ;SBR    API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       DEC     API_REMAIN              ; SAY WE TRANSMITTED 1 BYTE\r
+       BRNE    API_DONE                ; IF THERE IS MORE TO SEND\r
+       RJMP    API_REVERT\r
+\r
+API_ERROR:\r
+       LDI     E,-API_TIMEOUT\r
+API_ERROR_ENTRY:\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT ADDRESS COMMAND\r
+\r
+       CBR     API_STATE,1<<APISIZE    ; WE WILL SEND ADDRESS COMMAND\r
+\r
+API_REVERT:\r
+       CBI     UCR,RXCIE               ; DISABLE RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; WE WILL SEND ADDR OR DATA SIZE\r
+\r
+API_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 INTERRUPT HANDLER FOR API/SPI BUS\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+       LDS     E,WATCHDOG_COUNT\r
+       LDS     F,WATCHDOG_COUNT+1\r
+       OR      F,E\r
+       BREQ    WATCHDOG_SKIP\r
+       SUBI    E,LOW(1)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDS     E,WATCHDOG_COUNT+1\r
+       SBCI    E,HIGH(1)\r
+       STS     WATCHDOG_COUNT+1,E\r
+       BREQ    WATCHDOG_RESET\r
+WATCHDOG_SKIP:\r
+\r
+       TST     SPI_WATCHDOG\r
+       BREQ    SPI_TIMER_OK\r
+       INC     SPI_WATCHDOG\r
+       BRNE    SPI_TIMER_OK\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI\r
+       IN      E,SPSR\r
+       IN      E,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     E,$E8\r
+       OUT     SPCR,E                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       SBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = 0\r
+\r
+       CBR     API_STATE,1<<SPIDATA | 1<<SPISIZE | 1<<SPIWAIT\r
+SPI_TIMER_OK:\r
+\r
+       TST     API_WATCHDOG\r
+       BREQ    API_TIMER_OK\r
+       INC     API_WATCHDOG\r
+       BREQ    API_TIMED_OUT\r
+API_TIMER_OK:\r
+\r
+T0_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+WATCHDOG_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_RX_TIMEOUT:\r
+       SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+       RJMP    API_TX_ADDRESS          ; NO, PRESERVE ABSENT COUNT\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      DEC     E\r
+; brne api_device_present\r
+       ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+       STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+ LDI E,TX_SIZE\r
+ ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;      LDI     E,4\r
+;api_device_present:\r
+;      STS     ABSENT_COUNT,E          ; DECREMENT ABSENT COUNT FOR TX_ADDRESS\r
+       RJMP    API_TX_ADDRESS\r
+\r
+API_TIMED_OUT:\r
+       SBRC    API_STATE,APIWAIT\r
+       RJMP    API_RX_TIMEOUT\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_TX_DATA\r
+\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_TX_DATA_SIZE\r
+\r
+API_TX_ADDRESS:\r
+       ; SEND ADDRESS COMMAND\r
+       LDI     E,-API_TIME_SLOW\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO DATA SIZE COMMAND\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E                       ; TURNOFF REQUESTED?\r
+       BREQ    API_TURNOFF_OK\r
+       DEC     E                       ; STILL WAITING FOR TURNOFF?\r
+       STS     TURNOFF_COUNT,E\r
+       BREQ    API_TURNOFF_RESET       ; GAVE UP WAITING FOR TURNOFF\r
+\r
+       CBI     PRG_PORT,PRG            ; PRG LOW\r
+       CBI     PORTD,1                 ; TXD LOW\r
+       SBI     DDRD,1                  ; TXD OUTPUT\r
+       LDI     E,0\r
+       OUT     UCR,E                   ; DISABLE UART\r
+       RJMP    API_DONE\r
+\r
+API_TURNOFF_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_TURNOFF_OK:\r
+       CBI     UCR,RXCIE               ; DISABLE RX INTS, FOR APIWAIT ENTRY\r
+\r
+       LDI     E,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       OR      E,TX_COUNT0\r
+       OR      E,TX_COUNT1\r
+       BRNE    API_TRY_TX\r
+\r
+;API_TRY_RX:\r
+       LDS     E,TX_OVERRIDE\r
+       DEC     E\r
+       BREQ    API_DIRECTION_TX        ; FORCED TRANSMIT EVERY SO OFTEN\r
+       STS     TX_OVERRIDE,E\r
+       RJMP    API_DIRECTION_RX\r
+\r
+API_TRY_TX:\r
+       LDS     E,RX_OVERRIDE\r
+       DEC     E\r
+       BREQ    BREQ_API_DIRECTION_RX   ; FORCED RECEIVE EVERY SO OFTEN\r
+       STS     RX_OVERRIDE,E\r
+\r
+API_DIRECTION_TX:\r
+       LDI     E,$10\r
+       STS     TX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       ; SUSPEND TX OPERATIONS WHEN 9TH (INTERNAL) DEVICE ADDRESSED %\r
+       TST     TX_COUNT0               ; ANY BYTES AT HEAD ?\r
+       LDS     E,TX_ADDRESS0\r
+       BRNE    API_SUSPEND_TX0         ; YES, GO AND CHECK HEAD DEVICE\r
+\r
+       TST     TX_COUNT1               ; ANY BYTES AT TAIL ?\r
+       BREQ    API_SUSPEND_TX1         ; NO, GO AND PERFORM TX OPERATION\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE TX_COUNT1 BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1\r
+       STS     TX_ADDRESS0,E           ; ADOPT TAIL DEVICE FOR BYTES AT HEAD\r
+\r
+API_SUSPEND_TX0:\r
+       CPI     E,9\r
+BREQ_API_DIRECTION_RX:\r
+       BREQ    API_DIRECTION_RX\r
+\r
+API_SUSPEND_TX1:\r
+       ; %\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      TST     E\r
+;      BRNE    API_DEVICE_PRESENT\r
+;\r
+;;API_DEVICE_ABSENT:\r
+;      ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+;      LDI     E,TX_SIZE-1\r
+;      AND     TX_PTR,E\r
+;\r
+;      CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+;      STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+;\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      LDI     ZL,TX_LIMIT-1\r
+;      LDS     ZH,TX_ADDRESS0\r
+;      ADD     ZL,ZH\r
+;      CLR     ZH\r
+;      ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+; LDI E,TX_SIZE\r
+; ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNTER FOR NEXT DEVICE\r
+;\r
+;API_DEVICE_PRESENT:\r
+       CBR     API_STATE,1<<APIDIRN    ; SAY WE WILL TRANSMIT\r
+\r
+       TST     TX_COUNT0\r
+       BRNE    API_TX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       ; THIS ROUTINE WILL MOVE BYTES AT TAIL TO HEAD,\r
+       ; REDUNDANTLY, BECAUSE WE HAVE NOW DONE IT EARLIER\r
+       TST     TX_COUNT1\r
+       BRNE    API_TX_ADDRESS_ADOPT    ; BYTES AT TAIL, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       DEC     E\r
+       BRPL    API_TX_ADDRESS_STICKY   ; STAYING STICKY, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_ADDRESS0\r
+       INC     E                       ; BUMP TX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_TX_ADDRESS_SAVE\r
+       LDI     E,1\r
+       RJMP    API_TX_ADDRESS_SAVE\r
+\r
+API_TX_ADDRESS_ADOPT:\r
+       LDI     E,1\r
+API_TX_ADDRESS_STICKY:\r
+       STS     TX_STICKY,E             ; DECREMENT, OR TOP UP, STICKY COUNT\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+API_TX_ADDRESS_SAVE:\r
+       STS     TX_ADDRESS0,E           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_TX_ADDRESS_SAME:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; TOP UP STICKY COUNT\r
+\r
+       LDS     E,TX_ADDRESS0           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_DIRECTION_RX:\r
+       LDI     E,$10\r
+       STS     RX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       SBR     API_STATE,1<<APIDIRN    ; SAY WE WILL RECEIVE\r
+\r
+ LDS E,RX_STICKY\r
+ TST E\r
+ BREQ API_DIRECTION_RX_NEW\r
+ DEC E\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+ LDS E,RX_ADDRESS1\r
+ RJMP API_ADDRESS_SEND\r
+API_DIRECTION_RX_NEW:\r
+\r
+       LDS     E,RX_ADDRESS1           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+       TST     RX_COUNT1\r
+       BRNE    API_ADDRESS_SEND        ; BYTES AT TAIL, PRESERVE DEVICE\r
+\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDS     F,RX_ADDRESS2\r
+       STS     RX_ADDRESS2,E\r
+       MOV     E,F\r
+       CPI     E,1\r
+       BREQ    API_RX_ADDRESS_SAVE\r
+       ; %\r
+\r
+       INC     E                       ; BUMP RX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_RX_ADDRESS_SAVE\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDI     E,2\r
+       ; ELSE\r
+       ;LDI    E,1\r
+       ; %\r
+API_RX_ADDRESS_SAVE:\r
+       STS     RX_ADDRESS1,E           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+API_ADDRESS_SEND:\r
+       OUT     UDR,E                   ; SEND ADDRESS COMMAND\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE WILL SEND DATA SIZE COMMAND\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; RESET, FOR APIWAIT ENTRY\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA_SIZE:\r
+       ; SEND DATA SIZE COMMAND\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       LDI     E,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       MOV     E,TX_COUNT0             ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+\r
+       SBRS    API_STATE,APIDIRN       ; TEST DIRECTION\r
+       RJMP    API_COMMAND_OK          ; DIRECTION IS TX, ASK TO TRANSMIT\r
+\r
+       LDI     E,RX_SIZE\r
+       SUB     E,RX_COUNT0\r
+       SUB     E,RX_COUNT1             ; E = MAXIMUM AMOUNT WE CAN RECEIVE\r
+       ORI     E,$80                   ; ASK TO RECEIVE\r
+\r
+API_COMMAND_OK:\r
+       OUT     UDR,E                   ; SEND DATA SIZE COMMAND\r
+       MOV     API_REMAIN,E            ; SAVE COMMAND FOR MINIMUM CALCULATION\r
+\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      E,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+\r
+       SBR     API_STATE,1<<APIWAIT    ; SAY WE ARE WAITING FOR DATA SIZE RESP\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+; SPI TRANSFER COMPLETE HANDLER FOR Z180 BUS\r
+\r
+SPI_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       IN      E,SPDR\r
+\r
+       SBRC    API_STATE,SPIDATA\r
+       RJMP    SPI_DATA\r
+\r
+       SBRC    API_STATE,SPISIZE\r
+       RJMP    SPI_RESPOND\r
+\r
+       SBRC    API_STATE,SPIWAIT\r
+       RJMP    SPI_WAIT\r
+\r
+;SPI_ADDRESS:\r
+       CPI     E,10                    ; VALID ADDRESSES ARE 1-9\r
+       BRLO    SPI_SELECT\r
+       CPI     E,$80\r
+       BREQ    SPI_RSEL_LO\r
+       CPI     E,$81\r
+       BREQ    SPI_RSEL_HI\r
+       CPI     E,$91\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1000\r
+       CPI     E,$92\r
+       BREQ    SPI_HARDWARE            ; WPO30 V5\r
+       CPI     E,$93\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1500\r
+       CPI     E,$A5\r
+       BREQ    SPI_TURNOFF\r
+       CPI     E,$AA\r
+       BREQ    SPI_RESET\r
+       CPI     E,$C5\r
+       BREQ    SPI_WATCHDOG_RESET\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<1              ; HAD WRONG COMMAND\r
+       RJMP    SPI_DONE_ENTRY          ; RETURN LEAVING SPI_WATCHDOG = 0\r
+\r
+SPI_RSEL_LO:\r
+       CBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RSEL_HI:\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE - FOR COMPATIBILITY\r
+       SBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_HARDWARE: ;_HYT1000\r
+       SUBI    E,$90                   ; THE MAGIC CRACKER\r
+       STS     HARDWARE_TYPE,E         ; IT WAS PREVIOUSLY 1 FOR COMPATIBILITY\r
+\r
+       ;CBR    FLAGS,1<<2              ; HARDWARE TYPE IS HYTECH 1000\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE\r
+       RJMP    SPI_DONE\r
+\r
+;SPI_HARDWARE_WPO30:\r
+;      SBR     FLAGS,1<<2 | 1<<0       ; HARDWARE TYPE IS WPO30, SHOW MESSAGE\r
+;      RJMP    SPI_DONE\r
+\r
+SPI_TURNOFF:\r
+       LDI     E,$FF\r
+       STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+\r
+       CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+\r
+       LDI     E,$FF\r
+       LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+SPI_WATCHDOG_RESET:\r
+       LDI     E,LOW(1000)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDI     E,HIGH(1000)            ; 0.1 SECOND\r
+       STS     WATCHDOG_COUNT+1,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_SELECT:\r
+       ; RECEIVED ADDRESS COMMAND\r
+       TST     E                       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       BRNE    SPI_SELECT_TX\r
+\r
+;SPI_SELECT_RX:\r
+       ; HAD ENQUIRY, SEND ACTIVE DEVICE\r
+       SBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS RX\r
+\r
+       TST     RX_COUNT0\r
+       BRNE    SPI_RX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       TST     RX_COUNT1\r
+       BREQ    SPI_SELECT_NULL         ; NO BYTES AT TAIL, REPORT NULL DEVICE\r
+\r
+;SPI_RX_ADDRESS_ADOPT:\r
+       MOV     RX_COUNT0,RX_COUNT1\r
+       CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     SPI_REMAIN,RX_ADDRESS1  ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+       STS     RX_ADDRESS0,SPI_REMAIN  ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_RX_ADDRESS_SAME:\r
+       LDS     SPI_REMAIN,RX_ADDRESS0  ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_TX:\r
+       ; HAD SELECT, SAVE NEW ACTIVE DEVICE\r
+       CBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS TX\r
+       MOV     SPI_REMAIN,E\r
+\r
+       TST     TX_COUNT1\r
+       BREQ    SPI_TX_ADDRESS_CONT     ; QUEUE IS EMPTY, ALLOW ANY DEVICE\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       CP      E,SPI_REMAIN\r
+       BRNE    SPI_SELECT_NULL         ; ALLOW CURRENTLY SELECTED DEVICE ONLY\r
+\r
+SPI_TX_ADDRESS_CONT:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; FORCE TX_ADDRESS1 TO BE POLLED FOR TX\r
+\r
+       STS     TX_ADDRESS1,SPI_REMAIN  ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_NULL:\r
+       CLR     SPI_REMAIN              ; TX BUSY, REPORT NULL DEVICE\r
+SPI_SELECT_SEND:\r
+       OUT     SPDR,SPI_REMAIN         ; ADDRESS RESPONSE\r
+\r
+       SBR     API_STATE,1<<SPIWAIT    ; SAY WE ARE SENDING ADDRESS RESPONSE\r
+       RJMP    SPI_DONE\r
+\r
+SPI_WAIT:\r
+       CBR     API_STATE,1<<SPIWAIT\r
+\r
+       TST     SPI_REMAIN              ; DID WE SEND NULL ADDRESS RESPONSE?\r
+       BREQ    GO_SPI_DONE             ; YES, ABORT TRANSFER\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE ARE RECEIVING DATA SIZE CMD\r
+GO_SPI_DONE:\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESPOND:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     SPI_REMAIN,E            ; SAVE DATA SIZE COMMAND FOR MIN CALC\r
+\r
+       CBR     API_STATE,1<<SPISIZE    ; IN CASE ERROR, OR NO DATA TRANSFERRED\r
+\r
+       TST     SPI_REMAIN              ; TEST DIRECTION FROM DATA SIZE COMMAND\r
+       SBRS    API_STATE,SPIDIRN       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       RJMP    SPI_RESPOND_RX\r
+\r
+;SPI_RESPOND_TX:\r
+       ; WE HAD ADDRESS ENQUIRY EARLIER\r
+       BRPL    BRPL_SPI_REVERT         ; ENSURE DATA SIZE DIRECTION IS TX\r
+\r
+       MOV     E,RX_COUNT0\r
+       ORI     E,$80                   ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+       RJMP    SPI_RESPOND_CONT\r
+\r
+GO_SPI_REVERT:\r
+       RJMP    SPI_REVERT\r
+\r
+SPI_RESPOND_RX:\r
+       ; WE HAD ADDRESS SELECT EARLIER\r
+       BRMI    GO_SPI_REVERT           ; ENSURE DATA SIZE DIRECTION IS RX\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS1\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = MAX BYTES TO ACCEPT, PER DEVICE\r
+\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BREQ    SPI_DEVICE_SAME\r
+\r
+;SPI_DEVICE_DELTA:\r
+       ; IN THIS CASE TX_COUNT0 SHOULD NOT BE INCLUDED IN MAX BYTES (E)\r
+       LDI     ZL,TX_SIZE\r
+       SUB     ZL,TX_COUNT0\r
+       CP      E,ZL\r
+       BRLO    SPI_DEVICE_DELTA_CONT\r
+       MOV     E,ZL\r
+       RJMP    SPI_DEVICE_DELTA_CONT\r
+\r
+SPI_DEVICE_SAME:\r
+       ; IN THIS CASE TX_COUNT0 SHOULD BE INCLUDED IN MAX BYTES (E)\r
+       CPI     E,TX_SIZE\r
+       BRLO    SPI_DEVICE_SAME_CONT\r
+       LDI     E,TX_SIZE\r
+SPI_DEVICE_SAME_CONT:\r
+       ; SHOULD NOT OVERFLOW BECAUSE IF SO, WE ALREADY RECEIVED MORE THAN MAX\r
+       SUB     E,TX_COUNT0\r
+;TWAT0:        BRLO    TWAT0\r
+SPI_DEVICE_DELTA_CONT:\r
+       ; SHOULD NOT OVERFLOW BECAUSE IF SO, WE ALREADY RECEIVED MORE THAN MAX\r
+       SUB     E,TX_COUNT1\r
+;TWAT1:        BRLO    TWAT1\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       BRPL    SPI_RESPOND_CONT\r
+       LDI     E,$7F                   ; E = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+SPI_RESPOND_CONT:\r
+       ; START SENDING DATA SIZE RESPONSE\r
+       ; SPI_REMAIN = HOST MAX, E = OUR MAX\r
+       CP      E,SPI_REMAIN\r
+       BRSH    SPI_RESPOND_SEND\r
+       MOV     SPI_REMAIN,E            ; SPI_REMAIN = LOWER OF HOST / OUR MAX\r
+SPI_RESPOND_SEND:\r
+       OUT     SPDR,E\r
+\r
+       SBR     API_STATE,1<<SPIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_DATA:\r
+       TST     SPI_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    SPI_RX_DATA             ; GO AND SEND OR RECEIVE 1 BYTE\r
+\r
+;SPI_TX_DATA:\r
+       DEC     SPI_REMAIN\r
+BRPL_SPI_REVERT:\r
+       BRPL    SPI_REVERT              ; SKIP ONE INTERRUPT AT COMPLETION\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_PTR\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       OUT     SPDR,E\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       DEC     RX_COUNT0\r
+       INC     RX_PTR\r
+       LDI     E,RX_SIZE-1\r
+       AND     RX_PTR,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RX_DATA:\r
+       SBRS    API_STATE,SPISIZE\r
+       RJMP    SPI_RX_SKIP             ; SKIP ONE INTERRUPT AT START\r
+\r
+ ; EAT DATA FOR UNCORRUPTED HEX DUMP OUTPUT\r
+ ;RJMP SPI_RX_SKIP\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;RCALL TWAT\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    SPI_TX_COUNT1\r
+       INC     TX_COUNT0\r
+       RJMP    SPI_TX_COUNT2\r
+SPI_TX_COUNT1:\r
+       INC     TX_COUNT1\r
+SPI_TX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+SPI_RX_SKIP:\r
+       DEC     SPI_REMAIN              ; SENT OR RECEIVED 1 CHARACTER\r
+       BRMI    SPI_REVERT\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_REVERT:\r
+       CBR     API_STATE,1<<SPIDATA    ; EXPECTING ADDRESS OR DATA SIZE COMMAND\r
+\r
+       ;LDI    E,0                     ; NO TIMEOUT IF API BUS IS NOW IDLE\r
+       ;SBRC   API_STATE,1<<SPISIZE    ; TRANSACTION STILL OPEN?\r
+SPI_DONE:\r
+       LDI     E,-SPI_TIMEOUT          ; TIMEOUT TO RESET SPI BUS\r
+       MOV     SPI_WATCHDOG,E\r
+\r
+SPI_DONE_ENTRY:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;TWAT:\r
+ ;PUSH ZL\r
+ ;PUSH ZH\r
+ ;LDS ZL,TX_ADDRESS0 ;TX_ADDRESS1\r
+ ;CPI ZL,1\r
+ ;BRNE SKIP_LOOPBACK\r
+ ;MOV ZL,RX_COUNT0\r
+ ;ADD ZL,RX_PTR\r
+ ;ANDI ZL,RX_SIZE-1\r
+ ;SUBI ZL,-RX_BUF\r
+ ;CLR ZH\r
+ ;ST Z,E\r
+ ;INC RX_COUNT0\r
+ ;SKIP_LOOPBACK:\r
+ ;POP ZH\r
+ ;POP ZL\r
+ ;RET\r
+\r
+;---------------- ANALOG TO DIGITAL INTERRUPT ROUTINE ----------------------\r
+\r
+ADC_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       WDR\r
+\r
+       IN      E,ADCL\r
+       MOV     ATOD,E\r
+       IN      E,ADCH\r
+\r
+       ROR     E\r
+       ROR     ATOD\r
+       ROR     E\r
+       ROR     ATOD                    ; CONTAINS THE 8 MSB OF CONVERTER VALUE\r
+\r
+       SBRC    FLAGS,4                 ; CURRENT RESULT IS FROM REFERENCE ?\r
+       RJMP    ADC_REFERENCE\r
+\r
+       ; CURRENT RESULT IS FROM -5V GENERATOR\r
+       SBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE REFERENCE\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E\r
+       BRNE    GO_ADC_DONE             ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+\r
+       LDI     E,$00\r
+       LDI     F,$00\r
+       SUBI    ATOD,92-$40 ;1          ; 256-512*47/147 = ABOUT 33% FULL SCALE\r
+       BRLO    ADC_PULSE               ; FAR TOO NEGATIVE, APPLY MINIMUM PULSE\r
+\r
+       LDI     E,$60\r
+       LDI     F,$00\r
+       CPI     ATOD,$80 ;2\r
+       BRSH    ADC_PULSE               ; FAR TOO POSITIVE, APPLY MAXIMUM PULSE\r
+\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $10\r
+       ;MOV    E,ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $20\r
+       ;ADD    E,ATOD                  ; $01 HALF SCALE -> $30 HALF WIDTH\r
+\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $20\r
+       MOV     E,ATOD\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $10\r
+       ADD     E,ATOD                  ; $40 HALF SCALE -> $30 HALF WIDTH\r
+       RJMP    ADC_PULSE\r
+\r
+ADC_REFERENCE:\r
+       CBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE -5V GENERATOR\r
+\r
+ ;STS VOLTAGE_VSWT,ATOD\r
+ ;RJMP ADC_DONE\r
+\r
+       SBRC    FLAGS,5                 ; CURRENT REFERENCE IS BANDGAP ?\r
+       RJMP    ADC_BANDGAP\r
+\r
+       ; CURRENT REFERENCE IS LM385\r
+       CPI     ATOD,$F8                ; IF =>$F8 ASSUME WE HAVE PULLUP ONLY\r
+       BRLO    ADC_LM385\r
+\r
+       LDS     E,LM385_COUNT\r
+       DEC     E                       ; COUNT DOWN TO MISSING LM385\r
+       STS     LM385_COUNT,E\r
+       BRNE    ADC_DONE                ; KEEP TRYING LM385\r
+\r
+       SBR     FLAGS,1<<5              ; SAY WE HAVE SWITCHED TO BANDGAP\r
+GO_ADC_DONE:\r
+       RJMP    ADC_DONE\r
+\r
+ADC_LM385:\r
+       LDI     E,$10                   ; TOP UP COUNTDOWN TO MISSING LM385\r
+       STS     LM385_COUNT,E\r
+\r
+;      LSR     ATOD                    ; LM385 VOLTAGE = APPROX 2*BANDGAP\r
+                                       ; USE LM385Z-1.2\r
+\r
+ADC_BANDGAP:\r
+       STS     VOLTAGE_VSWT,ATOD\r
+\r
+       ;CPI    ATOD,70                 ; 256*1.22/4.5\r
+       ;CPI    ATOD,63                 ; 256*1.22/5.0\r
+       CPI     ATOD,57                 ; 256*1.22/5.5\r
+       LDI     E,LOW(1024)\r
+       LDI     F,HIGH(1024)\r
+       BRLO    ADC_BATTERY_SAVE\r
+\r
+       ; VSWT < 5.5 VOLTS, STABILISE READING FOR BATTERY LOW\r
+       LDS     E,BATTERY_COUNT\r
+       LDS     F,BATTERY_COUNT+1\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    ADC_BATTERY_SAVE        ; COUNT 1024 LOW BATTERY READINGS\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<3              ; SHOW BATTERY MESSAGE AND POWER DOWN\r
+\r
+ADC_BATTERY_SAVE:\r
+       STS     BATTERY_COUNT,E\r
+       STS     BATTERY_COUNT+1,F\r
+\r
+       ;CPI    ATOD,90                 ; 256*1.22/3.5\r
+       ;CPI    ATOD,79                 ; 256*1.22/4.0\r
+       CPI     ATOD,70                 ; 256*1.22/4.5\r
+       BRLO    ADC_DONE\r
+\r
+       ; VSWT < 4.5 VOLTS, RESET MAIN PROCESSOR IMMEDIATELY\r
+       LDI     E,$FF\r
+       STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+\r
+       CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+\r
+       LDI     E,$FF\r
+       LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+ADC_PULSE:\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+\r
+ADC_DONE:\r
+       LDI     E,$45                   ; START MEASURING BANDGAP\r
+       SBRS    FLAGS,5\r
+       LDI     E,$04                   ; START MEASURING LM385\r
+       SBRS    FLAGS,4\r
+       LDI     E,$05                   ; START MEASURING -5V GENERATOR\r
+       OUT     ADMUX,E\r
+       LDI     E,$DE\r
+       OUT     ADCSR,E                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 5\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLTS_AT_A5:\r
+;      ;OUT    PORTC,M16U1     ; res in byte 2(ignore ls,byte),volts pin 5\r
+;      MOV     A,B             ; get saved VSWT\r
+;      SUB     A,M16U1         ; voltage 47K = VSWT-Voltage at pin 35\r
+;      MOV     D,A             ; which is 1/3 of total supply ie +V+(-V)\r
+;      ADD     A,D\r
+;      ADD     A,D             ; TOTAL SUPPLY\r
+;      SUB     A,B             ; TOTAL SUPPLY-VSWT=NEG SUPPLY\r
+;DIAG_NEG:\r
+;      ;OUT    PORTC,A\r
+;\r
+;      LDI     A,4\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;ADC_DONE:\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+\r
+;VSWT: ;OUT    PORTC,ATOD      ; count value for 2.5 V ref\r
+;      LDI     A,$FF\r
+;      MOV     DD16UH,A        ; divide by full scale ie VSWT\r
+;      SUB     DD16UL,DD16UL   ; clear low reg\r
+;      SUB     DV16UH,DV16UH   ; clear high reg divisor\r
+;      MOV     DV16UL,ATOD     ; use ATOD value as divisor\r
+;      ;OUT    PORTC,ATOD\r
+;      RCALL   DIVIDE          ; ***** NOTE AN FF RESULT IS NO INPUT *******\r
+;      MOV     MC16UH,DRES16UH ; load multiplicand high from result high\r
+;      MOV     MC16UL,DRES16UL ; load multiplicand low from result low\r
+;      SUB     MP16UH,MP16UH   ; clear high byte in multiplier reg\r
+;       LDI     A,25\r
+;       MOV     MP16UL,A        ; mult by zener ref voltage (2.5V)\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLT_VSWT:\r
+;xi:\r
+;      LDS     A,VSWTS         ; previous value of VSWT\r
+;      MOV     B,MP16UL        ; new value of VSWT\r
+;      ;RCALL  SMOOTH\r
+;      STS     VSWTS,B\r
+;      LDS     B,VSWTS\r
+;\r
+;      ;OUT    PORTC,B;M16U1   ; VSWT IN 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;\r
+;      ;STS    VSWTS,B         ; SAVE NEW SMOOTHED VALUE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      MOV     B,M16U1         ; save copy of VSWT for neg 5V routine\r
+;      MOV     DD16UH,M16U1\r
+;      SUB     DD16UL,DD16UL\r
+;      LDI     A,255           ; calculate the atod volts per division\r
+;      MOV     DV16UL,A\r
+;      SUB     DV16UH,DV16UH\r
+;      RCALL   DIVIDE          ; result to be found in dres high & low\r
+;\r
+;      LDI     A,3\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;VCHG:\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 37 (1/3 VCHG)\r
+;      RCALL   MULTIPLY\r
+;      MOV     A,M16U1\r
+;      ADD     M16U1,A         ; B\C A3 IS 1/3 VCHG\r
+;      ADD     M16U1,A\r
+;DIAG_VOLT_VHG:\r
+;      ;OUT    PORTC,M16U1     ; REUSULT 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      LDI     A,5\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VSWT\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;;***************************************************************************\r
+;;*\r
+;;* "div16u" - 16/16 Bit Unsigned Division\r
+;;*\r
+;;* This subroutine divides the two 16-bit numbers\r
+;;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).\r
+;;* The result is placed in "dres16uH:dres16uL" and the remainder in\r
+;;* "drem16uH:drem16uL".\r
+;;*\r
+;;* Number of words    :19\r
+;;* Number of cycles   :235/251 (Min/Max)\r
+;;* Low registers used :2 (drem16uL,drem16uH)\r
+;;* High registers used  :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,\r
+;;*                        dcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;divide:\r
+;div16u:       clr     drem16uL        ;clear remainder Low byte\r
+;      sub     drem16uH,drem16uH       ;clear remainder High byte and carry\r
+;      ldi     counter,17      ;init loop counter\r
+;d16u_1:       rol     dd16uL          ;shift left dividend\r
+;      rol     dd16uH\r
+;      dec     counter         ;decrement counter\r
+;      brne    d16u_2          ;if done\r
+;      ret                     ;    return\r
+;d16u_2:       rol     drem16uL        ;shift dividend into remainder\r
+;      rol     drem16uH\r
+;      sub     drem16uL,dv16uL ;remainder = remainder - divisor\r
+;      sbc     drem16uH,dv16uH ;\r
+;      brcc    d16u_3          ;if result negative\r
+;      add     drem16uL,dv16uL ;    restore remainder\r
+;      adc     drem16uH,dv16uH\r
+;      clc                     ;    clear carry to be shifted into result\r
+;      rjmp    d16u_1          ;else\r
+;d16u_3:       sec                     ;    set carry to be shifted into result\r
+;      rjmp    d16u_1\r
+;\r
+;;********* 16 X 16 multiplication routine from app note avr200 *************\r
+;;*\r
+;;* "mpy16u" - 16x16 Bit Unsigned Multiplication\r
+;;*\r
+;;* This subroutine multiplies the two 16-bit register variables\r
+;;* mp16uH:mp16uL and mc16uH:mc16uL.\r
+;;* The result is placed in m16u3:m16u2:m16u1:m16u0.\r
+;;*\r
+;;* Number of words    :14 + return\r
+;;* Number of cycles   :153 + return\r
+;;* Low registers used :None\r
+;;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,\r
+;;*                          m16u3,mcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;multiply:\r
+;mpy16u:       clr     m16u3           ;clear high byte of result\r
+;      sub     m16u2,m16u2     ;clear result byte 2 and carry\r
+;      clr     m16u2\r
+;      ldi     counter,16      ;init loop counter\r
+;      lsr     mp16uH\r
+;      ror     mp16uL\r
+;\r
+;m16u_1:       brcc    noad8           ;if bit 0 of multiplier set\r
+;      add     m16u2,mc16uL    ;add multiplicand Low to byte 2 of res\r
+;      adc     m16u3,mc16uH    ;add multiplicand high to byte 3 of res\r
+;noad8:        ror     m16u3           ;shift right result byte 3\r
+;      ror     m16u2           ;rotate right result byte 2\r
+;      ror     m16u1           ;rotate result byte 1 and multiplier High\r
+;      ror     m16u0           ;rotate result byte 0 and multiplier Low\r
+;      dec     counter         ;decrement loop counter\r
+;      brne    m16u_1          ;if not done, loop more\r
+;      ret\r
+;;************************* Exponential smoothing routine ********************\r
+;;Receives : Previous value in A\r
+;;       : New value in B\r
+;;Passes   : Smoothed result back in B reg\r
+;;Uses   : d reg\r
+;\r
+;Smooth:\r
+;      mov     d,a             ; save a copy of previous value\r
+;      lsr     a\r
+;      lsr     a\r
+;      lsr     b\r
+;      lsr     b               ; prev.ave  -  prev.ave  +  new.data\r
+;      sub     d,a             ;              --------     --------\r
+;      add     b,d             ;                  n            n\r
+;      ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MESSAGE_0:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',0,128,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_1:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',240,64,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_2:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','0','0','0',0\r
+\r
+MESSAGE_3:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'W','P','O','3','0',' ','V','5'\r
+\r
+MESSAGE_4:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','D',' ','C','O','M','M','A','N','D',0\r
+\r
+MESSAGE_5:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','T','T','E','R','Y',' ','L','O','W',0\r
+\r
+MESSAGE_6:\r
+       .DB     $1B,'M','0',0\r
+\r
+MESSAGE_7:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','5','0','0',0\r
+\r
+MESSAGE_8:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'S','T','A','C','K',' ','O','V','E','R','F','L','O','W'\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 100 FOR 16K * 11MHZ STARTUP DELAY (NO R/C STARTUP DELAY)\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACBC                   ; WRITE FUSE BITS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/avr/wpov2.asm b/src/avr/wpov2.asm
new file mode 100644 (file)
index 0000000..665c145
--- /dev/null
@@ -0,0 +1,2198 @@
+;      WPOV2.ASM\r
+;      COPIED FROM WPO15V1.ASM ON 20JUN02\r
+\r
+;      LOOK FOR BIGBODGE TO SEE CEC'S CHANGES TO FIX STARTUP PROBLEM\r
+;      AND TO SKIP VOLTAGE MEASURING\r
+\r
+;      REVISED 17DEC01 TO SUPPORT NEW HARDWARE TYPE 3 FOR HYT1500\r
+\r
+;      REVISED 18DEC01 TO TRY A CONSERVATIVE 4.5 VOLT SHUTDOWN, LOW BATTERY\r
+;      THIS DOESN'T PROTECT AGAINST REBOOTING WHILE PRINTING, TOO BAD\r
+\r
+;      REVISED 18DEC01 TO TRY AN AGGRESSIVE 5.5 VOLT SHUTDOWN, LOW BATTERY\r
+;      ALSO ENABLED THE 4.5 VOLT IMMEDIATE RESET, DUE TO UNRELIABLE OPERATION\r
+;      NOW TRYING 5.0 VOLT IMMEDIATE RESET, CEC SAYS IT WAS MARGINAL ANYWAY\r
+\r
+;      NOW DISABLED THE IMMEDIATE RESET DUE TO TESTING RESULTS OF 08JAN02\r
+;      NOT SURE IF THAT WAS REALLY THE PROBLEM - BUT WISH TO BE CONSERVATIVE\r
+\r
+;      REVISED 01FEB02 FOR NEW 7.3728 MHZ XTAL, PREVIOUSLY 11.0592 MHZ, 2/3\r
+;      LOOK FOR ;! TO SEE CHANGES FOR 7.3728 MHZ XTAL, ADDED COMMENTS ALSO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+.EQU   LARGE           =0\r
+\r
+;IF LARGE\r
+;.INCLUDE "8535DEF.INC"\r
+;ELSE\r
+.INCLUDE "4433DEF.INC"\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMING CALCULATIONS:\r
+\r
+; 115200 BITS/SEC = 11520 BYTES/SEC = 86.8 US/BYTE\r
+\r
+; FOR MASTER API BUS TX, SEND 1 BYTE PER 9+12 BIT-TIMES, 24 TO BE SAFE\r
+; SO THE CORRECT TX RATE = 86.8 * 2.4 = 200.8 US/BYTE = 4980 BYTES/SEC\r
+\r
+; A SUBTLE OPTIMISATION IS POSSIBLE WHEN THE PREVIOUS TRANSMITTED LSB IS 0,\r
+; AS WE CAN THEN GUARANTEE THE 4800 BPS RECEIVERS WILL SEE FALSE START BIT:\r
+\r
+; FOR MASTER API BUS TX EVEN, SEND 1 BYTE PER 2+12 BIT-TIMES, 16 TO BE SAFE\r
+; SO THE CORRECT TX RATE EVEN = 86.8 * 1.6 = 138.9 US/BYTE = 7199 BYTES/SEC\r
+\r
+; OLD: TCK0 ROLLOVER = 256 * 8 / 11.0592 MHZ = APPROX 185 US\r
+; NEW: TCK0 ROLLOVER = 256 * 8 /  7.3728 MHZ = APPROX 278 US\r
+; THUS ALL THE TIMEOUT VALUES BELOW HAVE BEEN DECREASED TO 2/3 ORIGINAL\r
+\r
+; NEW: THE EVEN/ODD TX RATE OPTIMISATION HAS BEEN DISABLED AS WE DON'T\r
+; HAVE ENOUGH RESOLUTION WITH THE 7.3728 MHZ XTAL / 8 TO GENERATE 138.9\r
+; US/BYTE DELAY, BECAUSE MINIMUM UNIT IS NOW 278 US INSTEAD OF 185 US,\r
+; THIS COULD BE IMPROVED LATER, BUT FOR NOW, WE GENERATE AN INTERRUPT\r
+; EVERY 278 US, AND THE NEXT AVAILABLE TCK0 DIVIDER IS /1 SO THIS WOULD\r
+; BECOME 34.8 US, THIS WOULD BE UNACCEPTABLE, SO REVISIT THE ISSUE LATER\r
+\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+\r
+.EQU   API_TIMEOUT     =16 ;!25        ; 25 * 0.185 MS = 4.6 MS\r
+.EQU   API_TIME_IDLE   =8 ;!13         ; 13 * 0.185 MS = 2.4 MS\r
+.EQU   API_TIME_SLOW   =8 ;!13         ; 25 * 0.185 MS = 2.4 MS\r
+.EQU   API_TIME_FAST   =1 ;!2          ; 2 * 185 US = 370 US, NOW 1 * 278 US\r
+.EQU   API_RATE_SLOW   =$5F ;!$8F      ; DIVISOR FOR 4800 BPS\r
+.EQU   API_RATE_FAST   =$03 ;!$05      ; DIVISOR FOR 115200 BPS\r
+\r
+.EQU   SPI_TIMEOUT     =16 ;!25        ; 100 * 100 US = APPROX 10.0 MS\r
+\r
+;.def  drem16uL        =R0             ; remainder low\r
+;.def  drem16uH        =R1             ; remainder high\r
+;.def  dres16uL        =R2             ; result low    DON'T use as general purpose\r
+;.def  dres16uH        =R3             ; result high   DON'T use as general purpose\r
+;.def  dd16uL          =R2             ; dividend low\r
+;.def  dd16uH          =R3             ; dividend high\r
+;.def  dv16uL          =R4             ; divisor low\r
+;.def  dv16uH          =R5             ; divisor high\r
+;\r
+;.DEF  SPI_REMAIN      =R6\r
+;\r
+;.def  mc16uL          =R7             ;multiplicand low byte\r
+;.def  mc16uH          =R8             ;multiplicand high byte\r
+;.def  mp16uL          =R9             ;multiplier low byte\r
+;.def  mp16uH          =R10            ;multiplier high byte\r
+;.def  m16u0           =R9             ;result byte 0 (LSB)\r
+;.def  m16u1           =R10            ;result byte 1\r
+;.def  m16u2           =R11            ;result byte 2\r
+;.def  m16u3           =R12            ;result byte 3 (MSB)\r
+;\r
+;.DEF  RX_PTR          =R13\r
+;.DEF  RX_COUNT0       =R14\r
+\r
+.DEF   API_REMAIN      =R1\r
+.DEF   API_WATCHDOG    =R2\r
+.DEF   SPI_REMAIN      =R3\r
+.DEF   SPI_WATCHDOG    =R4\r
+.DEF   RX_PTR          =R5\r
+.DEF   RX_COUNT0       =R6\r
+.DEF   RX_COUNT1       =R7\r
+.DEF   TX_PTR          =R8\r
+.DEF   TX_COUNT0       =R9\r
+.DEF   TX_COUNT1       =R10\r
+\r
+.DEF   SR              =R15\r
+.DEF    A              =R16            ; GLOBAL REGISTERS\r
+.DEF    B              =R17\r
+.DEF    D              =R18\r
+.DEF   E               =R19\r
+.DEF   F               =R23\r
+.DEF   G               =R24\r
+\r
+.DEF   FLAGS           =R20\r
+;.def  counter         =R20            ;loop counter\r
+\r
+.DEF   ATOD            =R21            ; SO YOU CAN USE SBCI, SUBI, CPI ETC\r
+\r
+.DEF   API_STATE       =R22\r
+\r
+;.DEF  TX_PTR          =R25\r
+;.DEF  API_WATCHDOG    =R26\r
+;.DEF  API_REMAIN      =R27\r
+;.DEF  SPI_WATCHDOG    =R28\r
+;.DEF  TX_COUNT0       =R29\r
+\r
+.EQU   TX_SIZE         =$40\r
+.EQU   RX_SIZE         =$10\r
+\r
+               .DSEG\r
+               .ORG    $60\r
+\r
+VSWTS:         .BYTE   1               ; RETAIN ORDERING %\r
+VCHGS:         .BYTE   1\r
+NEGVS:         .BYTE   1\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+TX_ADDRESS0:   .BYTE   1               ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+TX_ADDRESS1:   .BYTE   1               ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS0:   .BYTE   1               ; SOURCE FOR RX_COUNT0 BYTES AT HEAD\r
+RX_ADDRESS1:   .BYTE   1               ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+RX_ADDRESS2:   .BYTE   1               ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+                                       ; SCAN IS 1,2,1,3,1,4,1,5,1,6,1,7,1,8\r
+\r
+TX_OVERRIDE:   .BYTE   1               ; COUNTER TO TRANSMIT 1 TIME IN 16\r
+RX_OVERRIDE:   .BYTE   1               ; COUNTER TO RECEIVE 1 TIME IN 16\r
+\r
+TX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME TX DEVICE\r
+RX_STICKY:     .BYTE   1               ; COUNTER TO STAY ON SAME RX DEVICE\r
+\r
+;ABSENT_COUNT: .BYTE   1\r
+\r
+TURNOFF_COUNT: .BYTE   1\r
+WATCHDOG_COUNT:        .BYTE   2\r
+\r
+TX_LIMIT:      .BYTE   9               ; MAX Z180 BYTES TO ACCEPT, PER DEVICE\r
+\r
+BATTERY_COUNT: .BYTE   2               ; COUNT 1024 ADC READINGS TO POWER DOWN\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;LM385_COUNT:  .BYTE   1               ; COUNT $10 ADC READINGS TO MISSING REF\r
+VOLTAGE_VSWT:  .BYTE   1               ; MOST RECENT ADC READING FROM REF\r
+\r
+HARDWARE_TYPE: .BYTE   1               ; COMES SOMEWHAT BEFORE RSEL HI COMMAND\r
+\r
+STACK_GUARD:   .BYTE   1               ; DETECTS IF STACK COMES DOWN TO HERE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; API_STATE DEFINITIONS\r
+.EQU   SPISIZE         =0              ; SET IF EXPECTING SPI DATA SIZE CMD\r
+.EQU   SPIWAIT         =1              ; SET IF SENDING SPI ADDRESS RESPONSE\r
+.EQU   SPIDATA         =2              ; SET IF TRANSFERRING SPI DATA TX/RX\r
+.EQU   SPIDIRN         =3              ; SET IF TX, BASED ON ADDRESS COMMAND\r
+.EQU   APISIZE         =4              ; SET IF NEED TO SEND API DATA SIZE CMD\r
+.EQU   APIWAIT         =5              ; SET IF WAITING FOR API DATA SIZE RESP\r
+.EQU   APIDATA         =6              ; SET IF TRANSFERRING API DATA TX/RX\r
+.EQU   APIDIRN         =7              ; SET IF TX, TOGGLED ON NULL TRANSFER\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;IF LARGE\r
+;\r
+;.EQU  IRQ             =6\r
+;.EQU  IRQ_PORT        =PORTA\r
+;.EQU  IRQ_DDR         =DDRA\r
+;\r
+;.EQU  PRG             =3\r
+;.EQU  PRG_PORT        =PORTB\r
+;.EQU  PRG_DDR         =DDRB\r
+;\r
+;.EQU  OC1             =5\r
+;.EQU  OC1_PORT        =PORTD\r
+;.EQU  OC1_DDR         =DDRD\r
+;\r
+;.EQU  OCR1H           =OCR1AH\r
+;.EQU  OCR1L           =OCR1AL\r
+;\r
+;.EQU  COM10           =COM1A0\r
+;.EQU  COM11           =COM1A1\r
+;\r
+;ELSE\r
+\r
+.EQU   IRQ             =0\r
+.EQU   IRQ_PORT        =PORTB\r
+.EQU   IRQ_DDR         =DDRB\r
+\r
+.EQU   PRG             =2\r
+.EQU   PRG_PORT        =PORTC\r
+.EQU   PRG_DDR         =DDRC\r
+\r
+.EQU   OC1             =1\r
+.EQU   OC1_PORT        =PORTB\r
+.EQU   OC1_DDR         =DDRB\r
+\r
+.EQU   USR             =UCSRA\r
+.EQU   UCR             =UCSRB\r
+\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .CSEG\r
+\r
+       RJMP    RESET_ENTRY\r
+\r
+       .ORG    OVF0ADDR\r
+       RJMP    T0_OVERFLOW             ; TIMER 0 OVERFLOW HANDLER\r
+\r
+       .ORG    SPIADDR\r
+       RJMP    SPI_COMPLETE            ; SPI TRANSFER COMPLETE HANDLER\r
+\r
+       .ORG    URXCADDR\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+\r
+       .ORG    ADCCaddr\r
+       RJMP    ADC_COMPLETE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RESET_ENTRY:\r
+       ; INITIALISE AVR\r
+;IF LARGE\r
+;      LDI     A,HIGH(RAMEND)\r
+;      OUT     SPH,A\r
+;ENDIF\r
+       LDI     A,LOW(RAMEND)\r
+       OUT     SPL,A                   ; INIT STACK POINTER\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       ; INITIALISE STACK GUARD\r
+       LDI     A,$5A\r
+       STS     STACK_GUARD,A\r
+\r
+       ; INITIALISE PORTS\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       LDI     A,0\r
+       OUT     SPCR,A                  ; DISABLE SPI WHILE RESETTING Z180\r
+       OUT     UCR,A                   ; DISABLE UART WHILE RESETTING SLAVES\r
+\r
+;IF LARGE\r
+;      LDI     A,$FF\r
+;      OUT     DDRC,A                  ; PORTC CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     PORTB,7                 ; PB7/SCK CONFIGURED AS PULLED UP INPUT\r
+;      SBI     DDRB,6                  ; PB6/MISO CONFIGURED AS OUTPUT\r
+;\r
+;      SBI     DDRA,7                  ; A7 CONFIGURED AS OUTPUT FOR DTR1\r
+;      SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+;\r
+;; 18DEC01 NOT PULLED UP, DON'T WANT TO CORRUPT 100K/100K DIVIDER\r
+;;     SBI     PORTA,4                 ; A4 PULLED UP TO DETECT MISSING LM385\r
+;ELSE\r
+       SBI     PORTB,5                 ; PB5/SCK CONFIGURED AS PULLED UP INPUT\r
+       SBI     DDRB,4                  ; PB4/MISO CONFIGURED AS OUTPUT\r
+\r
+       SBI     DDRD,5                  ; D5 CONFIGURED AS OUTPUT FOR DTR1\r
+       SBI     DDRD,6                  ; D6 CONFIGURED AS OUTPUT FOR DTR0\r
+\r
+; 20JUN02 NOT PULLED UP, DON'T WANT TO CORRUPT 100K/100K DIVIDER\r
+;      SBI     PORTC,4                 ; C4 PULLED UP TO DETECT MISSING LM385\r
+;ENDIF\r
+\r
+       SBI     PORTD,2                 ; D2 CONFIGURED AS PULL UP FOR IBM CLK\r
+       SBI     PORTD,3                 ; D3 CONFIGURED AS PULL UP FOR IBM DATA\r
+\r
+       SBI     OC1_PORT,OC1\r
+       SBI     OC1_DDR,OC1             ; OUTPUT OC1 = 1, PWM TRANSISTOR OFF\r
+\r
+       CBI     IRQ_PORT,IRQ\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       CBI     PORTD,7\r
+       SBI     DDRD,7                  ; OUTPUT RSEL = 0\r
+\r
+       CBI     PORTD,4\r
+       SBI     DDRD,4                  ; OUTPUT RES = 0\r
+\r
+       ; HARD RESET API BUS DEVICES\r
+       CBI     PRG_PORT,PRG\r
+       SBI     PRG_DDR,PRG             ; OUTPUT PRG = 0\r
+\r
+       CBI     PORTD,1\r
+       SBI     DDRD,1                  ; OUTPUT TXD = 0\r
+\r
+       LDI     A,7\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET SPARE\r
+\r
+       LDI     A,6\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 RECEIPT PRINTER\r
+\r
+       LDI     A,5\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET M192 LABEL PRINTER\r
+\r
+       LDI     A,4\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET MT102 RECEIPT PRINTER\r
+\r
+       ;LDI    A,3\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET SPARE\r
+       ; THE ABOVE SHOULD BE OK - WHY NOT ??  16FEB01\r
+\r
+       ;LDI    A,2\r
+       ;RCALL  PRG_RESET               ; SPECIFIC RESET TOUCHSCREEN\r
+\r
+       LDI     A,1\r
+       RCALL   PRG_RESET               ; SPECIFIC RESET CUSTOMER DISPLAY\r
+\r
+       LDI     A,0\r
+       RCALL   PRG_RESET               ; REMOVE RESET PULSE\r
+\r
+       ; LOADCELL HAS BEEN IN RESET UNTIL NOW, AND WILL START IN 10 MS\r
+\r
+       ;SBI    PORTD,1                 ; OUTPUT TXD = 1\r
+\r
+       LDI     A,API_RATE_SLOW         ; 4800 BAUD\r
+       OUT     UBRR,A                  ; SET BAUD RATE\r
+       LDI     A,$18\r
+       OUT     UCR,A                   ; ENABLE TX AND RX (OUTPUTS TXD = 1)\r
+\r
+       RCALL   PRG_DELAY_280_MS        ; DELAY FOR TOUCHSCREEN TO REENTER IDLE\r
+\r
+       LDI     A,$AA\r
+       OUT     UDR,A                   ; SEND SLOW TURNON COMMAND\r
+       OUT     UDR,A                   ; AND AGAIN FOR EXTRA SAFETY\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO ALLOW DEVICES TO INITIALISE\r
+\r
+       ; ALLOW Z180 TO START\r
+       SBI     PORTD,4                 ; OUTPUT RES = 1\r
+       ;CBI    DDRD,4                  ; OUTPUT RES = TRI-STATE\r
+\r
+; BIGBODGE FOR ANOTHER RESET PULSE!!!!\r
+RCALL   PRG_DELAY_20_MS\r
+CBI     PORTD,4                 ; RES=0\r
+RCALL   PRG_DELAY_20_MS\r
+SBI     PORTD,4                 ; OUTPUT RES = 1\r
+\r
+       ; INITIALISE VARIABLES\r
+       CLR     A\r
+       LDI     ZL,VSWTS\r
+       CLR     ZH\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       LDI     ZL,TX_LIMIT\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A\r
+       ST      Z+,A                    ; CAREFUL - Z WILL BE USED AGAIN BELOW\r
+       STS     TURNOFF_COUNT,A\r
+       STS     VOLTAGE_VSWT,A\r
+\r
+       ;LDI    A,LOW(1000)\r
+       STS     WATCHDOG_COUNT,A\r
+       ;LDI    A,HIGH(1000)            ; 100 MS\r
+       STS     WATCHDOG_COUNT+1,A\r
+\r
+       LDI     A,TX_SIZE\r
+       ST      Z,A                     ; RX_LIMIT FOR 9TH (INTERNAL) DEVICE\r
+\r
+       LDI     A,LOW(1024)\r
+       STS     BATTERY_COUNT,A\r
+       LDI     A,HIGH(1024)\r
+       STS     BATTERY_COUNT+1,A\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      LDI     A,$10                   ; START COUNTDOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,A\r
+\r
+       CLR     FLAGS\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT0\r
+       CLR     TX_COUNT1\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT0\r
+       CLR     RX_COUNT1\r
+\r
+;      LDI     A,4\r
+;      STS     ABSENT_COUNT,A          ; TOP UP ABSENT COUNTER FOR TX_ADDRESS\r
+\r
+       ; START COMMUNICATIONS TASK\r
+       LDI     A,2\r
+       STS     RX_ADDRESS2,A           ; ALTERNATE VALUE FOR RX_ADDRESS1\r
+\r
+       LDI     A,1\r
+       STS     TX_ADDRESS0,A\r
+       STS     TX_ADDRESS1,A\r
+       STS     RX_ADDRESS0,A\r
+       STS     RX_ADDRESS1,A\r
+       STS     TX_OVERRIDE,A\r
+       STS     RX_OVERRIDE,A\r
+       STS     HARDWARE_TYPE,A         ; AS FOR OLD ALGORITHM WITH FLAGS,2 = 0\r
+\r
+       LDI     A,0\r
+       STS     TX_STICKY,A\r
+       STS     RX_STICKY,A\r
+\r
+       LDI     A,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,A          ; SET UP TIME TO FIRST API BUS POLL\r
+       LDI     A,-SPI_TIMEOUT\r
+       MOV     SPI_WATCHDOG,A          ; SET UP TIME TO FIRST SPI BUS POLL\r
+\r
+       LDI     A,$02                   ; TCK0 = CK/8\r
+       OUT     TCCR0,A                 ; TCK0 ROLLOVER = 256 * 8 / 7.3728 MHZ\r
+                                       ;               = APPROX 278 US\r
+                                       ;!TCK0 ROLLOVER = 256 * 8 / 11.0592 MHZ\r
+                                       ;!              = APPROX 185 US\r
+;IF LARGE\r
+;      LDI     A,$01\r
+;ELSE\r
+       LDI     A,$02\r
+;ENDIF\r
+       OUT     TIMSK,A                 ; ENABLE TIMER 0 OVERFLOW INTERRUPTS\r
+\r
+       ;LDI    A,API_RATE_SLOW         ; 4800 BAUD\r
+       ;OUT    UBRR,A                  ; SET BAUD RATE\r
+       ;LDI    A,$18\r
+       ;OUT    UCR,A                   ; ENABLE TX AND RX\r
+\r
+       IN      A,SPSR\r
+       IN      A,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     A,$E8\r
+       OUT     SPCR,A                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       ; START -5V GENERATOR TASK\r
+       LDI     A,0\r
+       OUT     TCNT1H,A\r
+       OUT     TCNT1L,A\r
+       OUT     OCR1H,A\r
+       OUT     OCR1L,A                 ; ASSUME NO LOAD TO BEGIN WITH\r
+\r
+       LDI     A,1<<COM11 | 1<<COM10 | 1<<PWM10 ;1<<PWM11 | 1<<PWM10\r
+       OUT     TCCR1A,A                ; 8 BIT PWM ENABLE, INVERTING PWM\r
+       LDI     A,1<<CS10\r
+       OUT     TCCR1B,A                ; TIMER1 TICK = APPROX 0.1 US\r
+\r
+       LDI     A,$05\r
+       OUT     ADMUX,A                 ; USE CHANNEL 5 FOR A/D (A5 OR C5)\r
+       LDI     A,$DE\r
+       OUT     ADCSR,A                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       ; START FOREGROUND TASK\r
+       SEI\r
+\r
+;VOLTAGE_SHOW:\r
+; LDI A,2\r
+; LDS B,VOLTAGE_VSWT\r
+; RCALL TX_HEX\r
+; RJMP VOLTAGE_SHOW\r
+\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+ACTIVITY_LOOP:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BREQ    NO_ERROR_STACK_OVERFLOW\r
+       RJMP    ERROR_STACK_OVERFLOW\r
+NO_ERROR_STACK_OVERFLOW:\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       SBRS    FLAGS,0                 ; READY TO SHOW HARDWARE TYPE MESSAGE ?\r
+       RJMP    ACTIVITY_LOOP\r
+\r
+       ;SBRC   FLAGS,2\r
+       ;RJMP   HARDWARE_TYPE_WPO30\r
+       LDS     A,HARDWARE_TYPE\r
+       CPI     A,3\r
+       BREQ    HARDWARE_TYPE_HYT1500\r
+       CPI     A,2\r
+       BREQ    HARDWARE_TYPE_WPO30\r
+\r
+;HARDWARE_TYPE_HYT1000:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_2*2)\r
+       LDI     ZH,HIGH(MESSAGE_2*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_HYT1500:\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_7*2)\r
+       LDI     ZH,HIGH(MESSAGE_7*2)    ; HYTECH 1000\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+       RJMP    HARDWARE_TYPE_CUSTOMER_64\r
+\r
+HARDWARE_TYPE_CUSTOMER_64:\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_1*2)\r
+       LDI     ZH,HIGH(MESSAGE_1*2)    ; 240 X 64 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+       RJMP    MAIN_LOOP\r
+\r
+HARDWARE_TYPE_WPO30:\r
+       LDI     A,2\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON OPERATOR SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)    ; 256 X 128 OUTER FRAME\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON CUSTOMER SIDE\r
+\r
+       LDI     A,3\r
+       LDI     B,4+8\r
+       LDI     ZL,LOW(MESSAGE_3*2)\r
+       LDI     ZH,HIGH(MESSAGE_3*2)    ; WPO30 V5\r
+       RCALL   TX_MESSAGE              ; SHOW HARDWARE TYPE ON CUSTOMER SIDE\r
+\r
+MAIN_LOOP:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+       RJMP    MAIN_LOOP\r
+\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,'D'\r
+       BREQ    DTR_COMMAND\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR_COMMAND:\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$03\r
+       BREQ    DTR0_LO\r
+       CPI     A,1\r
+       BREQ    DTR0_HI\r
+       CPI     A,2\r
+       BREQ    DTR1_LO\r
+       CPI     A,3\r
+       BREQ    DTR1_HI\r
+       RJMP    MAIN_LOOP\r
+\r
+DTR0_LO:\r
+       SBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR0_HI:\r
+       CBI     PORTD,6\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_LO:\r
+;IF LARGE\r
+;      SBI     PORTA,7\r
+;ELSE\r
+       SBI     PORTD,5\r
+;ENDIF\r
+       RJMP    DTR_DONE ;MAIN_LOOP\r
+\r
+DTR1_HI:\r
+;IF LARGE\r
+;      CBI     PORTA,7\r
+;ELSE\r
+       CBI     PORTD,5\r
+;ENDIF\r
+       ;RJMP   DTR_DONE ;MAIN_LOOP\r
+DTR_DONE:\r
+       LDI     B,$30\r
+       ADD     B,A\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;      LDI     A,$1B\r
+;      RCALL   TX_WAIT\r
+;      LDI     A,'D'\r
+;      RCALL   TX_WAIT\r
+;      MOV     A,B\r
+;      RCALL   TX_WAIT\r
+; %\r
+\r
+       RJMP    MAIN_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+RX_WAIT_LOOP:\r
+       SEI\r
+\r
+RX_WAIT:\r
+       LDS     A,STACK_GUARD\r
+       CPI     A,$5A\r
+       BRNE    ERROR_STACK_OVERFLOW\r
+\r
+       SBRC    FLAGS,1\r
+       RJMP    ERROR_BAD_COMMAND\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       CLI\r
+\r
+       TST     TX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+       BREQ    RX_WAIT_LOOP\r
+;      BRNE    RX_WAIT_CONT            ; YES, GO AND TEST ADDRESS\r
+;\r
+;      TST     TX_COUNT1               ; ANY DATA WAITING AT TAIL ?\r
+;      BREQ    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE RECEIVED\r
+;\r
+;RX_WAIT_ADOPT:\r
+;      MOV     TX_COUNT0,TX_COUNT1\r
+;      CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;\r
+;      LDS     A,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+;      STS     TX_ADDRESS0,A           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+\r
+RX_WAIT_CONT:\r
+       LDS     A,TX_ADDRESS0\r
+       CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+       BRNE    RX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+\r
+RX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      A,Z                     ; GET CHARACTER FROM TX BUFFER\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     ZL,TX_SIZE-1\r
+       AND     TX_PTR,ZL\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; DIDN'T QUITE MAKE IT INTO 5.541 SYSTEM - PLEASE REVISIT FOR 5.542 %\r
+;TX_WAIT_LOOP:\r
+;      SEI\r
+;\r
+;TX_WAIT:\r
+;      SBRC    FLAGS,1\r
+;      RJMP    ERROR_BAD_COMMAND\r
+;\r
+;      SBRC    FLAGS,3\r
+;      RJMP    ERROR_BATTERY_LOW\r
+;\r
+;      CLI\r
+;\r
+;      PUSH    A\r
+;      MOV     A,RX_COUNT0\r
+;      ADD     A,RX_COUNT1\r
+;      CPI     A,RX_SIZE-1             ; ROOM TO INSERT 1 BYTE ?\r
+;      POP     A\r
+;      BRSH    TX_WAIT_LOOP\r
+;\r
+;      PUSH    A\r
+;      LDI     A,9\r
+;      STS     RX_ADDRESS1,A\r
+;      POP     A\r
+;      RJMP    TX_CHAR\r
+;\r
+;;     TST     RX_COUNT0               ; ANY DATA WAITING AT HEAD ?\r
+;;     BREQ    TX_WAIT_LOOP            ; NO, BUT THIS WOULD BE AN OPTIMISATION\r
+;;\r
+;;TX_WAIT_ADOPT:\r
+;;     MOV     RX_COUNT0,RX_COUNT1\r
+;;     CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+;;\r
+;;     LDS     A,RX_ADDRESS1           ; DEST FOR RX_COUNT1 BYTES AT HEAD\r
+;;     STS     RX_ADDRESS0,A           ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+;\r
+;TX_WAIT_CONT:\r
+;      PUSH    A\r
+;      LDS     A,RX_ADDRESS1\r
+;      CPI     A,9                     ; 9TH (INTERNAL) DEVICE ?\r
+;      POP     A\r
+;      BRNE    TX_WAIT_LOOP            ; NO, WAIT FOR DATA TO BE SENT VIA API\r
+;\r
+;;TX_CHAR: ; DON'T USE THE OTHER TX_CHAR AS IT DOESN'T FINISH WITH RETI\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RETI\r
+; %\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_STACK_OVERFLOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_8*2)\r
+       LDI     ZH,HIGH(MESSAGE_8*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+ERROR_BAD_COMMAND:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_4*2)\r
+       LDI     ZH,HIGH(MESSAGE_4*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BAD_COMMAND_LOOP:\r
+       SBRC    FLAGS,3\r
+       RJMP    ERROR_BATTERY_LOW\r
+\r
+       RJMP    ERROR_BAD_COMMAND_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ERROR_BATTERY_LOW:\r
+       LDI     A,2\r
+       LDI     B,3+3+3+3+2+2+3+4+4+3\r
+       LDI     ZL,LOW(MESSAGE_0*2)\r
+       LDI     ZH,HIGH(MESSAGE_0*2)\r
+       RCALL   TX_MESSAGE              ; DRAW FRAME ON OPERATOR SIDE\r
+\r
+       LDI     A,2\r
+       LDI     B,4+11\r
+       LDI     ZL,LOW(MESSAGE_5*2)\r
+       LDI     ZH,HIGH(MESSAGE_5*2)\r
+       RCALL   TX_MESSAGE              ; SHOW ERROR MESSAGE ON OPERATOR SIDE\r
+\r
+ERROR_BATTERY_LOW_LOOP:\r
+       LDI     A,250\r
+\r
+ERROR_BATTERY_LOW_DELAY:\r
+       RCALL   PRG_DELAY_20_MS         ; 20 MS * 250 = 5 SECONDS\r
+       DEC     A\r
+       BRNE    ERROR_BATTERY_LOW_DELAY\r
+\r
+       LDI     A,2\r
+       LDI     B,3\r
+       LDI     ZL,LOW(MESSAGE_6*2)\r
+       LDI     ZH,HIGH(MESSAGE_6*2)\r
+       RCALL   TX_MESSAGE              ; TURN VSWT OFF VIA TOUCHSCREEN COMMAND\r
+\r
+       RJMP    ERROR_BATTERY_LOW_LOOP\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+PRG_RESET:\r
+       CBI     PRG_PORT,PRG            ; OUTPUT PRG = 0\r
+\r
+       SBRS    A,2\r
+       CBI     PORTD,1\r
+       SBRC    A,2\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 2\r
+\r
+       RCALL   PRG_DELAY_20_MS         ; DELAY TO GENERATE C INPUT TO HC137\r
+\r
+       SBRS    A,1\r
+       CBI     PORTD,1\r
+       SBRC    A,1\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 1\r
+\r
+       RCALL   PRG_DELAY_2_MS          ; DELAY TO GENERATE B INPUT TO HC137\r
+\r
+       SBRS    A,0\r
+       CBI     PORTD,1\r
+       SBRC    A,0\r
+       SBI     PORTD,1                 ; OUTPUT TXD = ADDRESS BIT 0\r
+\r
+       SBI     PRG_PORT,PRG            ; OUTPUT PRG = 1\r
+\r
+       RJMP    PRG_DELAY_200_US        ; WIDTH OF RESET PULSE TO AVR\r
+\r
+; -----------------------------------------------------------------------------\r
+; FOREGROUND ROUTINES FOR SPI BUS\r
+\r
+;TX_HEX:\r
+;      SEI\r
+;      NOP\r
+;      CLI\r
+;\r
+;      TST     TX_COUNT1\r
+;      BRNE    TX_HEX\r
+;\r
+;      STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+;\r
+;      MOV     A,B\r
+;      SWAP    A\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_HI_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_HI_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      MOV     A,B\r
+;      ANDI    A,$0F\r
+;      SUBI    A,-$30\r
+;      CPI     A,$3A\r
+;      BRLO    TX_HEX_LO_OK\r
+;      SUBI    A,-7\r
+;TX_HEX_LO_OK:\r
+;      RCALL   TX_CHAR\r
+;\r
+;      LDI     A,' '\r
+;      RCALL   TX_CHAR\r
+;\r
+;      RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_MESSAGE:\r
+       SEI\r
+       NOP\r
+       CLI\r
+\r
+       TST     TX_COUNT1\r
+       BRNE    TX_MESSAGE\r
+\r
+       STS     TX_ADDRESS1,A           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+\r
+TX_MESSAGE_LOOP:\r
+       LPM\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       ADIW    ZL,1\r
+       DEC     B\r
+       BRNE    TX_MESSAGE_LOOP\r
+\r
+       RETI                            ; WITH INTERRUPTS ENABLED\r
+\r
+TX_CHAR:\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,A\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     TX_COUNT1\r
+       RET\r
+\r
+;RX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,TX_PTR\r
+;      SUBI    ZL,-TX_BUF\r
+;      CLR     ZH\r
+;      LD      A,Z\r
+;\r
+;      DEC     TX_COUNT0\r
+;      INC     TX_PTR\r
+;      LDI     ZL,TX_SIZE-1\r
+;      AND     TX_PTR,ZL\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      RET\r
+\r
+;TX_CHAR:\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT0\r
+;      ADD     ZL,RX_COUNT1\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      ST      Z,A\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      INC     RX_COUNT1\r
+;      RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;! THESE ROUTINES ARE UPDATED FOR 7.3728 MHZ XTAL, TO AVOID A POTENTIAL\r
+;! ISSUE WITH A/B/C ADDRESS SELECT INPUTS TO HC137, THE PREVIOUS TIMINGS\r
+;! INCLUDED A 2* MARGIN SO THE NEW XTAL WOULD GIVE A 3* MARGIN, THIS IS\r
+;! A LITTLE TOO CLOSE, AS THE TIME CONSTANTS FOR A/B/C ARE ONLY 10* APART\r
+\r
+PRG_DELAY_280_MS:\r
+       LDI     ZL,LOW(140*20) ;! LOW(140*29) ; WHY 140 ??  SOME BIGBODGE ?\r
+       LDI     ZH,HIGH(140*20) ;! HIGH(140*29) ; 125 * 29 * 69.4 US = 281 MS\r
+       RJMP    PRG_DELAY_ENTRY\r
+PRG_DELAY_20_MS:\r
+       ;!LDI   ZL,LOW(10*29)\r
+       ;!LDI   ZH,HIGH(10*29)          ; 10 * 29 * 69.4 US = 20.1 MS\r
+       ;!RJMP  PRG_DELAY_ENTRY\r
+       LDI     ZL,200 ;!\r
+       RJMP    PRG_DELAY_ENTRY_ZL ;!\r
+PRG_DELAY_2_MS:\r
+       LDI     ZL,20 ;!29              ; 29 * 69.4 US = 2.01 MS\r
+       RJMP    PRG_DELAY_ENTRY_ZL\r
+PRG_DELAY_200_US:\r
+       LDI     ZL,2 ;!3                ; 3 * 69.4 US = 208 US\r
+PRG_DELAY_ENTRY_ZL:\r
+       LDI     ZH,0\r
+PRG_DELAY_ENTRY:\r
+       LDI     D,0                     ; 256 * 3 = 768 T-STATES = 69.4 US\r
+PRG_DELAY_LOOP:\r
+       DEC     D\r
+       BRNE    PRG_DELAY_LOOP\r
+       SBIW    ZL,1\r
+       BRNE    PRG_DELAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+; UART RX COMPLETE INTERRUPT HANDLER FOR API BUS\r
+\r
+RX_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       SBRC    API_STATE,APIDATA       ; TRANSFER ALREADY IN PROGRESS?\r
+       RJMP    API_RX_DATA             ; YES, SAVE CHARACTER\r
+\r
+;      ; RECEIVED DATA SIZE RESPONSE\r
+;      SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+;      RJMP    API_RX_RESPONSE         ; NO, PRESERVE ABSENT COUNT\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNT FOR TX_ADDRESS\r
+;\r
+;API_RX_RESPONSE:\r
+       IN      E,UDR\r
+\r
+       EOR     E,API_REMAIN            ; TEST FOR WRONG DIRECTION OF RESPONSE\r
+       BRMI    GO_API_ERROR\r
+\r
+       EOR     E,API_REMAIN            ; RESTORE ORIGINAL DATA SIZE RESPONSE\r
+       BRMI    API_RESPONSE_RX         ; DIRECTION IS TX?\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+API_RESPONSE_RX:\r
+       CP      API_REMAIN,E\r
+       BRLO    API_RESPONSE_OK\r
+       MOV     API_REMAIN,E            ; API_REMAIN = LESSER OUR / SLAVE MAX\r
+\r
+API_RESPONSE_OK:\r
+       CBR     API_STATE,1<<APISIZE    ; IN CASE NO DATA TRANSFERRED\r
+       SBR     API_STATE,1<<APIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       MOV     E,API_REMAIN\r
+       ANDI    E,$7F\r
+       BREQ    API_NULL\r
+\r
+       TST     API_REMAIN              ; ABOUT TO RECEIVE?\r
+       BRMI    API_RX_SETUP            ; YES, AWAIT FURTHER RX INTERRUPTS\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIWAIT    ; ENSURE TIMER INT DOES NOT CAUSE ABORT\r
+       ; WE CAN'T GO STRAIGHT INTO API_TX_DATA BECAUSE WE DON'T KNOW THE\r
+       ; STATUS OF THE TIMER PRESCALER THAT CONTROLS TRANSMISSION.  HERE,\r
+       ; WE WILL NOW WAIT FOR THE NEXT TIMER INTERRUPT TO GET SYNCHRONISED.\r
+       ;RJMP   API_TX_DATA\r
+\r
+       LDI     E,-1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     E,-API_TIME_IDLE\r
+       RJMP    API_ERROR_ENTRY\r
+\r
+GO_API_ERROR:\r
+       RJMP    API_ERROR\r
+\r
+API_RX_DATA:\r
+\r
+ LDS E,RX_ADDRESS1\r
+ CPI E,1 ; DON'T GO STICKY ON THE LOADCELL, BECAUSE IT ALWAYS HAS SOME DATA\r
+ BREQ API_RX_DATA_NONSTICK\r
+ LDI E,1\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+API_RX_DATA_NONSTICK:\r
+\r
+       ; RECEIVING, SAVE CHARACTER\r
+       IN      E,UDR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT0\r
+       ADD     ZL,RX_COUNT1\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,RX_ADDRESS0\r
+       LDS     ZH,RX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    API_RX_COUNT1\r
+       INC     RX_COUNT0\r
+       RJMP    API_RX_COUNT2\r
+API_RX_COUNT1:\r
+       INC     RX_COUNT1\r
+API_RX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       ;LDI    E,-API_TIMEOUT\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+API_RX_SETUP:\r
+       LDI     E,-API_TIME_FAST ;FORMERLY -1\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     API_REMAIN              ; STILL RECEIVING?\r
+       BRPL    API_REVERT              ; NO, RECEIVED ENTIRE PACKET\r
+\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA:\r
+       ; SENDING DATA, READY FOR NEW BYTE\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET MAX BYTES TO ACCEPT, PER DEVICE\r
+       DEC     E                       ; DECREASE\r
+       ST      Z,E                     ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,E\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;MOV E,TX_PTR\r
+ ;ORI E,$80\r
+ ;RCALL TWAT\r
+\r
+       ; FOR EVEN CHARACTERS, BIT 0 + START BIT MAKES A DOUBLE BIT, DELAY -1\r
+       ; FOR ODD CHARACTERS, START BIT MAY BE MISSED, SO DELAY -2 TO BE SAFE\r
+;!     LSR     E                       ; CF = 0 EVEN, 1 ODD\r
+;!     SBC     E,E                     ; E = $00 EVEN, $FF ODD\r
+;!     DEC     E                       ; E = $FF EVEN, $FE ODD\r
+ LDI E,-API_TIME_FAST ;! SEE DISCUSSION JUST PRIOR TO API_TIME_FAST DEFINITION\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       DEC     TX_COUNT0\r
+       INC     TX_PTR\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       ; NOW DONE EARLIER, BEFORE CLOBBERING THE TRANSMITTED CHAR IN E\r
+       ;LDI    E,-API_TIME_FAST\r
+       ;MOV    API_WATCHDOG,E          ; SET UP TIME TO NEXT TRANSMITTED CHAR\r
+\r
+       ; THIS IS NOW DONE EARLIER WHEN WE SYNCHRONISE TO THE TIMER\r
+       ;SBR    API_STATE,1<<APISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       DEC     API_REMAIN              ; SAY WE TRANSMITTED 1 BYTE\r
+       BRNE    API_DONE                ; IF THERE IS MORE TO SEND\r
+       RJMP    API_REVERT\r
+\r
+API_ERROR:\r
+       LDI     E,-API_TIMEOUT\r
+API_ERROR_ENTRY:\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO NEXT ADDRESS COMMAND\r
+\r
+       CBR     API_STATE,1<<APISIZE    ; WE WILL SEND ADDRESS COMMAND\r
+\r
+API_REVERT:\r
+       CBI     UCR,RXCIE               ; DISABLE RX COMPLETE INTERRUPT\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; WE WILL SEND ADDR OR DATA SIZE\r
+\r
+API_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+; -----------------------------------------------------------------------------\r
+; TIMER 0 INTERRUPT HANDLER FOR API/SPI BUS\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG\r
+\r
+       LDS     E,WATCHDOG_COUNT\r
+       LDS     F,WATCHDOG_COUNT+1\r
+       OR      F,E\r
+       BREQ    WATCHDOG_SKIP\r
+       SUBI    E,LOW(1)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDS     E,WATCHDOG_COUNT+1\r
+       SBCI    E,HIGH(1)\r
+       STS     WATCHDOG_COUNT+1,E\r
+       BREQ    WATCHDOG_RESET\r
+WATCHDOG_SKIP:\r
+\r
+       TST     SPI_WATCHDOG\r
+       BREQ    SPI_TIMER_OK\r
+       INC     SPI_WATCHDOG\r
+       BRNE    SPI_TIMER_OK\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI\r
+       IN      E,SPSR\r
+       IN      E,SPDR                  ; CLEAR SPI INTERRUPT PENDING FLAG\r
+       LDI     E,$E8\r
+       OUT     SPCR,E                  ; SPI SLAVE, SAMPLE ON SCK FALLING EDGE\r
+\r
+       SBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = 0\r
+\r
+       CBR     API_STATE,1<<SPIDATA | 1<<SPISIZE | 1<<SPIWAIT\r
+SPI_TIMER_OK:\r
+\r
+       TST     API_WATCHDOG\r
+       BREQ    API_TIMER_OK\r
+       INC     API_WATCHDOG\r
+       BREQ    API_TIMED_OUT\r
+API_TIMER_OK:\r
+\r
+T0_DONE:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+WATCHDOG_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_RX_TIMEOUT:\r
+       SBRC    API_STATE,APIDIRN       ; DIRECTION IS TX?\r
+       RJMP    API_TX_ADDRESS          ; NO, PRESERVE ABSENT COUNT\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      DEC     E\r
+; brne api_device_present\r
+       ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+       LDI     E,TX_SIZE-1\r
+       AND     TX_PTR,E\r
+\r
+       CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+       STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS0\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+ LDI E,TX_SIZE\r
+ ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;      LDI     E,4\r
+;api_device_present:\r
+;      STS     ABSENT_COUNT,E          ; DECREMENT ABSENT COUNT FOR TX_ADDRESS\r
+       RJMP    API_TX_ADDRESS\r
+\r
+API_TIMED_OUT:\r
+       SBRC    API_STATE,APIWAIT\r
+       RJMP    API_RX_TIMEOUT\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_TX_DATA\r
+\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_TX_DATA_SIZE\r
+\r
+API_TX_ADDRESS:\r
+       ; SEND ADDRESS COMMAND\r
+       LDI     E,-API_TIME_SLOW\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO DATA SIZE COMMAND\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E                       ; TURNOFF REQUESTED?\r
+       BREQ    API_TURNOFF_OK\r
+       DEC     E                       ; STILL WAITING FOR TURNOFF?\r
+       STS     TURNOFF_COUNT,E\r
+       BREQ    API_TURNOFF_RESET       ; GAVE UP WAITING FOR TURNOFF\r
+\r
+       CBI     PRG_PORT,PRG            ; PRG LOW\r
+       CBI     PORTD,1                 ; TXD LOW\r
+       SBI     DDRD,1                  ; TXD OUTPUT\r
+       LDI     E,0\r
+       OUT     UCR,E                   ; DISABLE UART\r
+       RJMP    API_DONE\r
+\r
+API_TURNOFF_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+API_TURNOFF_OK:\r
+       CBI     UCR,RXCIE               ; DISABLE RX INTS, FOR APIWAIT ENTRY\r
+\r
+       LDI     E,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       OR      E,TX_COUNT0\r
+       OR      E,TX_COUNT1\r
+       BRNE    API_TRY_TX\r
+\r
+;API_TRY_RX:\r
+       LDS     E,TX_OVERRIDE\r
+       DEC     E\r
+       BREQ    API_DIRECTION_TX        ; FORCED TRANSMIT EVERY SO OFTEN\r
+       STS     TX_OVERRIDE,E\r
+       RJMP    API_DIRECTION_RX\r
+\r
+API_TRY_TX:\r
+       LDS     E,RX_OVERRIDE\r
+       DEC     E\r
+       BREQ    BREQ_API_DIRECTION_RX   ; FORCED RECEIVE EVERY SO OFTEN\r
+       STS     RX_OVERRIDE,E\r
+\r
+API_DIRECTION_TX:\r
+       LDI     E,$10\r
+       STS     TX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       ; SUSPEND TX OPERATIONS WHEN 9TH (INTERNAL) DEVICE ADDRESSED %\r
+       TST     TX_COUNT0               ; ANY BYTES AT HEAD ?\r
+       LDS     E,TX_ADDRESS0\r
+       BRNE    API_SUSPEND_TX0         ; YES, GO AND CHECK HEAD DEVICE\r
+\r
+       TST     TX_COUNT1               ; ANY BYTES AT TAIL ?\r
+       BREQ    API_SUSPEND_TX1         ; NO, GO AND PERFORM TX OPERATION\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE TX_COUNT1 BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1\r
+       STS     TX_ADDRESS0,E           ; ADOPT TAIL DEVICE FOR BYTES AT HEAD\r
+\r
+API_SUSPEND_TX0:\r
+       CPI     E,9\r
+BREQ_API_DIRECTION_RX:\r
+       BREQ    API_DIRECTION_RX\r
+\r
+API_SUSPEND_TX1:\r
+       ; %\r
+\r
+;      LDS     E,ABSENT_COUNT\r
+;      TST     E\r
+;      BRNE    API_DEVICE_PRESENT\r
+;\r
+;;API_DEVICE_ABSENT:\r
+;      ADD     TX_PTR,TX_COUNT0        ; SKIP TX_COUNT0 BYTES AT HEAD\r
+;      LDI     E,TX_SIZE-1\r
+;      AND     TX_PTR,E\r
+;\r
+;      CLR     TX_COUNT0               ; ABANDON TX_COUNT0 DATA IN TX_BUF\r
+;      STS     TX_STICKY,TX_COUNT0     ; DO NOT GO STICKY ON ABSENT DEVICE\r
+;\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      LDI     ZL,TX_LIMIT-1\r
+;      LDS     ZH,TX_ADDRESS0\r
+;      ADD     ZL,ZH\r
+;      CLR     ZH\r
+;      ;ST     Z,TX_COUNT0             ; SAVE MAX BYTES TO ACCEPT, PER DEVICE\r
+; LDI E,TX_SIZE\r
+; ST Z,E ; SO THAT WE WILL GOBBLE UP DATA FOR ABSENT DEVICES\r
+;      POP     ZH\r
+;      POP     ZL\r
+;\r
+;      LDI     E,4\r
+;      STS     ABSENT_COUNT,E          ; TOP UP ABSENT COUNTER FOR NEXT DEVICE\r
+;\r
+;API_DEVICE_PRESENT:\r
+       CBR     API_STATE,1<<APIDIRN    ; SAY WE WILL TRANSMIT\r
+\r
+       TST     TX_COUNT0\r
+       BRNE    API_TX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       ; THIS ROUTINE WILL MOVE BYTES AT TAIL TO HEAD,\r
+       ; REDUNDANTLY, BECAUSE WE HAVE NOW DONE IT EARLIER\r
+       TST     TX_COUNT1\r
+       BRNE    API_TX_ADDRESS_ADOPT    ; BYTES AT TAIL, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_STICKY             ; REMAINS TOPPED UP WHILE TX_COUNT0 > 0\r
+       DEC     E\r
+       BRPL    API_TX_ADDRESS_STICKY   ; STAYING STICKY, ADOPT NEW DEVICE\r
+\r
+       LDS     E,TX_ADDRESS0\r
+       INC     E                       ; BUMP TX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_TX_ADDRESS_SAVE\r
+       LDI     E,1\r
+       RJMP    API_TX_ADDRESS_SAVE\r
+\r
+API_TX_ADDRESS_ADOPT:\r
+       LDI     E,1\r
+API_TX_ADDRESS_STICKY:\r
+       STS     TX_STICKY,E             ; DECREMENT, OR TOP UP, STICKY COUNT\r
+\r
+       MOV     TX_COUNT0,TX_COUNT1\r
+       CLR     TX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+API_TX_ADDRESS_SAVE:\r
+       STS     TX_ADDRESS0,E           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_TX_ADDRESS_SAME:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; TOP UP STICKY COUNT\r
+\r
+       LDS     E,TX_ADDRESS0           ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    API_ADDRESS_SEND\r
+\r
+API_DIRECTION_RX:\r
+       LDI     E,$10\r
+       STS     RX_OVERRIDE,E           ; COUNTDOWN TO NEXT OVERRIDE\r
+\r
+       SBR     API_STATE,1<<APIDIRN    ; SAY WE WILL RECEIVE\r
+\r
+ LDS E,RX_STICKY\r
+ TST E\r
+ BREQ API_DIRECTION_RX_NEW\r
+ DEC E\r
+ STS RX_STICKY,E ; SO WE'LL REMAIN STICKY WHILE THERE'S REALLY SOME DATA (HACK)\r
+ LDS E,RX_ADDRESS1\r
+ RJMP API_ADDRESS_SEND\r
+API_DIRECTION_RX_NEW:\r
+\r
+       LDS     E,RX_ADDRESS1           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+       TST     RX_COUNT1\r
+       BRNE    API_ADDRESS_SEND        ; BYTES AT TAIL, PRESERVE DEVICE\r
+\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDS     F,RX_ADDRESS2\r
+       STS     RX_ADDRESS2,E\r
+       MOV     E,F\r
+       CPI     E,1\r
+       BREQ    API_RX_ADDRESS_SAVE\r
+       ; %\r
+\r
+       INC     E                       ; BUMP RX_ADDRESS BEFORE USING IT\r
+       CPI     E,9\r
+       BRLO    API_RX_ADDRESS_SAVE\r
+       ; EXTRA SAFETY FOR LOADCELL ON SERVICE SCREEN %\r
+       LDI     E,2\r
+       ; ELSE\r
+       ;LDI    E,1\r
+       ; %\r
+API_RX_ADDRESS_SAVE:\r
+       STS     RX_ADDRESS1,E           ; SOURCE FOR RX_COUNT1 BYTES AT TAIL\r
+\r
+API_ADDRESS_SEND:\r
+       OUT     UDR,E                   ; SEND ADDRESS COMMAND\r
+\r
+       SBR     API_STATE,1<<APISIZE    ; SAY WE WILL SEND DATA SIZE COMMAND\r
+       CBR     API_STATE,1<<APIDATA | 1<<APIWAIT ; RESET, FOR APIWAIT ENTRY\r
+       RJMP    API_DONE\r
+\r
+API_TX_DATA_SIZE:\r
+       ; SEND DATA SIZE COMMAND\r
+       LDI     E,-API_TIMEOUT\r
+       MOV     API_WATCHDOG,E          ; SET UP TIME TO ABORT IF NO RESPONSE\r
+\r
+       LDI     E,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,E                  ; SET UART RATE\r
+\r
+       MOV     E,TX_COUNT0             ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+\r
+       SBRS    API_STATE,APIDIRN       ; TEST DIRECTION\r
+       RJMP    API_COMMAND_OK          ; DIRECTION IS TX, ASK TO TRANSMIT\r
+\r
+       LDI     E,RX_SIZE\r
+       SUB     E,RX_COUNT0\r
+       SUB     E,RX_COUNT1             ; E = MAXIMUM AMOUNT WE CAN RECEIVE\r
+       ORI     E,$80                   ; ASK TO RECEIVE\r
+\r
+API_COMMAND_OK:\r
+       OUT     UDR,E                   ; SEND DATA SIZE COMMAND\r
+       MOV     API_REMAIN,E            ; SAVE COMMAND FOR MINIMUM CALCULATION\r
+\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      E,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+\r
+       SBR     API_STATE,1<<APIWAIT    ; SAY WE ARE WAITING FOR DATA SIZE RESP\r
+       RJMP    API_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+; SPI TRANSFER COMPLETE HANDLER FOR Z180 BUS\r
+\r
+SPI_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       CBI     IRQ_DDR,IRQ             ; OUTPUT IRQ = TRI-STATE\r
+\r
+       IN      E,SPDR\r
+\r
+       SBRC    API_STATE,SPIDATA\r
+       RJMP    SPI_DATA\r
+\r
+       SBRC    API_STATE,SPISIZE\r
+       RJMP    SPI_RESPOND\r
+\r
+       SBRC    API_STATE,SPIWAIT\r
+       RJMP    SPI_WAIT\r
+\r
+;SPI_ADDRESS:\r
+       CPI     E,10                    ; VALID ADDRESSES ARE 1-9\r
+       BRLO    SPI_SELECT\r
+       CPI     E,$80\r
+       BREQ    SPI_RSEL_LO\r
+       CPI     E,$81\r
+       BREQ    SPI_RSEL_HI\r
+       CPI     E,$91\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1000\r
+       CPI     E,$92\r
+       BREQ    SPI_HARDWARE            ; WPO30 V5\r
+       CPI     E,$93\r
+       BREQ    SPI_HARDWARE            ; HYTECH 1500\r
+       CPI     E,$A5\r
+       BREQ    SPI_TURNOFF\r
+       CPI     E,$AA\r
+       BREQ    SPI_RESET\r
+       CPI     E,$C5\r
+       BREQ    SPI_WATCHDOG_RESET\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<1              ; HAD WRONG COMMAND\r
+       RJMP    SPI_DONE_ENTRY          ; RETURN LEAVING SPI_WATCHDOG = 0\r
+\r
+SPI_RSEL_LO:\r
+       CBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RSEL_HI:\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE - FOR COMPATIBILITY\r
+       SBI     PORTD,7\r
+       RJMP    SPI_DONE\r
+\r
+SPI_HARDWARE: ;_HYT1000\r
+       SUBI    E,$90                   ; THE MAGIC CRACKER\r
+       STS     HARDWARE_TYPE,E         ; IT WAS PREVIOUSLY 1 FOR COMPATIBILITY\r
+\r
+       ;CBR    FLAGS,1<<2              ; HARDWARE TYPE IS HYTECH 1000\r
+       SBR     FLAGS,1<<0              ; SHOW MESSAGE\r
+       RJMP    SPI_DONE\r
+\r
+;SPI_HARDWARE_WPO30:\r
+;      SBR     FLAGS,1<<2 | 1<<0       ; HARDWARE TYPE IS WPO30, SHOW MESSAGE\r
+;      RJMP    SPI_DONE\r
+\r
+SPI_TURNOFF:\r
+       LDI     E,$FF\r
+       STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+\r
+       CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+\r
+       LDI     E,$FF\r
+       LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESET:\r
+       RJMP    RESET_ENTRY\r
+\r
+SPI_WATCHDOG_RESET:\r
+       LDI     E,LOW(1000)\r
+       STS     WATCHDOG_COUNT,E\r
+       LDI     E,HIGH(1000)            ; 0.1 SECOND\r
+       STS     WATCHDOG_COUNT+1,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_SELECT:\r
+       ; RECEIVED ADDRESS COMMAND\r
+       TST     E                       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       BRNE    SPI_SELECT_TX\r
+\r
+;SPI_SELECT_RX:\r
+       ; HAD ENQUIRY, SEND ACTIVE DEVICE\r
+       SBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS RX\r
+\r
+       TST     RX_COUNT0\r
+       BRNE    SPI_RX_ADDRESS_SAME     ; BYTES AT HEAD, PRESERVE DEVICE\r
+\r
+       TST     RX_COUNT1\r
+       BREQ    SPI_SELECT_NULL         ; NO BYTES AT TAIL, REPORT NULL DEVICE\r
+\r
+;SPI_RX_ADDRESS_ADOPT:\r
+       MOV     RX_COUNT0,RX_COUNT1\r
+       CLR     RX_COUNT1               ; MOVE BYTES AT TAIL TO HEAD\r
+\r
+       LDS     SPI_REMAIN,RX_ADDRESS1  ; DEST FOR TX_COUNT1 BYTES AT HEAD\r
+       STS     RX_ADDRESS0,SPI_REMAIN  ; DEST FOR TX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_RX_ADDRESS_SAME:\r
+       LDS     SPI_REMAIN,RX_ADDRESS0  ; DEST FOR RX_COUNT0 BYTES AT HEAD\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_TX:\r
+       ; HAD SELECT, SAVE NEW ACTIVE DEVICE\r
+       CBR     API_STATE,1<<SPIDIRN    ; SAY THE TRANSACTION IS TX\r
+       MOV     SPI_REMAIN,E\r
+\r
+       TST     TX_COUNT1\r
+       BREQ    SPI_TX_ADDRESS_CONT     ; QUEUE IS EMPTY, ALLOW ANY DEVICE\r
+\r
+       LDS     E,TX_ADDRESS1           ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       CP      E,SPI_REMAIN\r
+       BRNE    SPI_SELECT_NULL         ; ALLOW CURRENTLY SELECTED DEVICE ONLY\r
+\r
+SPI_TX_ADDRESS_CONT:\r
+       LDI     E,1\r
+       STS     TX_STICKY,E             ; FORCE TX_ADDRESS1 TO BE POLLED FOR TX\r
+\r
+       STS     TX_ADDRESS1,SPI_REMAIN  ; DEST FOR TX_COUNT1 BYTES AT TAIL\r
+       RJMP    SPI_SELECT_SEND\r
+\r
+SPI_SELECT_NULL:\r
+       CLR     SPI_REMAIN              ; TX BUSY, REPORT NULL DEVICE\r
+SPI_SELECT_SEND:\r
+       OUT     SPDR,SPI_REMAIN         ; ADDRESS RESPONSE\r
+\r
+       SBR     API_STATE,1<<SPIWAIT    ; SAY WE ARE SENDING ADDRESS RESPONSE\r
+       RJMP    SPI_DONE\r
+\r
+SPI_WAIT:\r
+       CBR     API_STATE,1<<SPIWAIT\r
+\r
+       TST     SPI_REMAIN              ; DID WE SEND NULL ADDRESS RESPONSE?\r
+       BREQ    GO_SPI_DONE             ; YES, ABORT TRANSFER\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE ARE RECEIVING DATA SIZE CMD\r
+GO_SPI_DONE:\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RESPOND:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     SPI_REMAIN,E            ; SAVE DATA SIZE COMMAND FOR MIN CALC\r
+\r
+       CBR     API_STATE,1<<SPISIZE    ; IN CASE ERROR, OR NO DATA TRANSFERRED\r
+\r
+       TST     SPI_REMAIN              ; TEST DIRECTION FROM DATA SIZE COMMAND\r
+       SBRS    API_STATE,SPIDIRN       ; TEST DIRECTION FROM ADDRESS COMMAND\r
+       RJMP    SPI_RESPOND_RX\r
+\r
+;SPI_RESPOND_TX:\r
+       ; WE HAD ADDRESS ENQUIRY EARLIER\r
+       BRPL    BRPL_SPI_REVERT         ; ENSURE DATA SIZE DIRECTION IS TX\r
+\r
+       MOV     E,RX_COUNT0\r
+       ORI     E,$80                   ; E = MAXIMUM AMOUNT WE CAN TRANSMIT\r
+       RJMP    SPI_RESPOND_CONT\r
+\r
+GO_SPI_REVERT:\r
+       RJMP    SPI_REVERT\r
+\r
+SPI_RESPOND_RX:\r
+       ; WE HAD ADDRESS SELECT EARLIER\r
+       BRMI    GO_SPI_REVERT           ; ENSURE DATA SIZE DIRECTION IS RX\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDI     ZL,TX_LIMIT-1\r
+       LDS     ZH,TX_ADDRESS1\r
+       ADD     ZL,ZH\r
+       CLR     ZH\r
+       LD      E,Z                     ; E = MAX BYTES TO ACCEPT, PER DEVICE\r
+\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BREQ    SPI_DEVICE_SAME\r
+\r
+;SPI_DEVICE_DELTA:\r
+       LDI     ZL,TX_SIZE\r
+       SUB     ZL,TX_COUNT0\r
+       CP      E,ZL\r
+       BRLO    SPI_DEVICE_DELTA_CONT\r
+       MOV     E,ZL\r
+       RJMP    SPI_DEVICE_DELTA_CONT\r
+\r
+SPI_DEVICE_SAME:\r
+       CPI     E,TX_SIZE\r
+       BRLO    SPI_DEVICE_SAME_CONT\r
+       LDI     E,TX_SIZE\r
+SPI_DEVICE_SAME_CONT:\r
+       SUB     E,TX_COUNT0\r
+SPI_DEVICE_DELTA_CONT:\r
+       SUB     E,TX_COUNT1\r
+\r
+       POP     ZH\r
+       POP     ZL\r
+       BRPL    SPI_RESPOND_CONT\r
+       LDI     E,$7F                   ; E = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+SPI_RESPOND_CONT:\r
+       ; START SENDING DATA SIZE RESPONSE\r
+       ; SPI_REMAIN = HOST MAX, E = OUR MAX\r
+       CP      E,SPI_REMAIN\r
+       BRSH    SPI_RESPOND_SEND\r
+       MOV     SPI_REMAIN,E            ; SPI_REMAIN = LOWER OF HOST / OUR MAX\r
+SPI_RESPOND_SEND:\r
+       OUT     SPDR,E\r
+\r
+       SBR     API_STATE,1<<SPIDATA    ; WE ARE EXPECTING TO TRANSFER DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_DATA:\r
+       TST     SPI_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    SPI_RX_DATA             ; GO AND SEND OR RECEIVE 1 BYTE\r
+\r
+;SPI_TX_DATA:\r
+       DEC     SPI_REMAIN\r
+BRPL_SPI_REVERT:\r
+       BRPL    SPI_REVERT              ; SKIP ONE INTERRUPT AT COMPLETION\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_PTR\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       LD      E,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       OUT     SPDR,E\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       DEC     RX_COUNT0\r
+       INC     RX_PTR\r
+       LDI     E,RX_SIZE-1\r
+       AND     RX_PTR,E\r
+       RJMP    SPI_DONE\r
+\r
+SPI_RX_DATA:\r
+       SBRS    API_STATE,SPISIZE\r
+       RJMP    SPI_RX_SKIP             ; SKIP ONE INTERRUPT AT START\r
+\r
+ ; EAT DATA FOR UNCORRUPTED HEX DUMP OUTPUT\r
+ ;RJMP SPI_RX_SKIP\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;RCALL TWAT\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_COUNT0\r
+       ADD     ZL,TX_COUNT1\r
+       ADD     ZL,TX_PTR\r
+       ANDI    ZL,TX_SIZE-1\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       ST      Z,E                     ; SAVE CHARACTER IN RX BUFFER\r
+       LDS     ZL,TX_ADDRESS0\r
+       LDS     ZH,TX_ADDRESS1\r
+       CP      ZL,ZH\r
+       BRNE    SPI_TX_COUNT1\r
+       INC     TX_COUNT0\r
+       RJMP    SPI_TX_COUNT2\r
+SPI_TX_COUNT1:\r
+       INC     TX_COUNT1\r
+SPI_TX_COUNT2:\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+SPI_RX_SKIP:\r
+       DEC     SPI_REMAIN              ; SENT OR RECEIVED 1 CHARACTER\r
+       BRMI    SPI_REVERT\r
+\r
+       SBR     API_STATE,1<<SPISIZE    ; SAY WE REALLY TRANSFERRED SOME DATA\r
+       RJMP    SPI_DONE\r
+\r
+SPI_REVERT:\r
+       CBR     API_STATE,1<<SPIDATA    ; EXPECTING ADDRESS OR DATA SIZE COMMAND\r
+\r
+       ;LDI    E,0                     ; NO TIMEOUT IF API BUS IS NOW IDLE\r
+       ;SBRC   API_STATE,1<<SPISIZE    ; TRANSACTION STILL OPEN?\r
+SPI_DONE:\r
+       LDI     E,-SPI_TIMEOUT          ; TIMEOUT TO RESET SPI BUS\r
+       MOV     SPI_WATCHDOG,E\r
+\r
+SPI_DONE_ENTRY:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+ ; LOOPBACK TEST FOR LOADCELL\r
+ ;TWAT:\r
+ ;PUSH ZL\r
+ ;PUSH ZH\r
+ ;LDS ZL,TX_ADDRESS0 ;TX_ADDRESS1\r
+ ;CPI ZL,1\r
+ ;BRNE SKIP_LOOPBACK\r
+ ;MOV ZL,RX_COUNT0\r
+ ;ADD ZL,RX_PTR\r
+ ;ANDI ZL,RX_SIZE-1\r
+ ;SUBI ZL,-RX_BUF\r
+ ;CLR ZH\r
+ ;ST Z,E\r
+ ;INC RX_COUNT0\r
+ ;SKIP_LOOPBACK:\r
+ ;POP ZH\r
+ ;POP ZL\r
+ ;RET\r
+\r
+;---------------- ANALOG TO DIGITAL INTERRUPT ROUTINE ----------------------\r
+\r
+ADC_COMPLETE:\r
+       IN      SR,SREG\r
+\r
+       WDR\r
+\r
+       IN      E,ADCL\r
+       MOV     ATOD,E\r
+       IN      E,ADCH\r
+\r
+       ROR     E\r
+       ROR     ATOD\r
+       ROR     E\r
+       ROR     ATOD                    ; CONTAINS THE 8 MSB OF CONVERTER VALUE\r
+\r
+       SBRC    FLAGS,4                 ; CURRENT RESULT IS FROM REFERENCE ?\r
+       RJMP    ADC_REFERENCE\r
+\r
+       ; CURRENT RESULT IS FROM -5V GENERATOR\r
+       SBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE REFERENCE\r
+\r
+       LDS     E,TURNOFF_COUNT\r
+       TST     E\r
+       ; REVISED 18DEC01 FOR HYT1500\r
+       ;BRNE   GO_ADC_DONE             ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+       BRNE    ADC_DONE                ; WE ARE TURNING OFF, LEAVE TRANSISTOR\r
+\r
+       LDI     E,$00\r
+       LDI     F,$00\r
+       SUBI    ATOD,92-$40 ;1          ; 256-512*47/147 = ABOUT 33% FULL SCALE\r
+       BRLO    ADC_PULSE               ; FAR TOO NEGATIVE, APPLY MINIMUM PULSE\r
+\r
+       LDI     E,$60\r
+       LDI     F,$00\r
+       CPI     ATOD,$80 ;2\r
+       BRSH    ADC_PULSE               ; FAR TOO POSITIVE, APPLY MAXIMUM PULSE\r
+\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $10\r
+       ;MOV    E,ATOD\r
+       ;LSL    ATOD                    ; $01 HALF SCALE -> $20\r
+       ;ADD    E,ATOD                  ; $01 HALF SCALE -> $30 HALF WIDTH\r
+\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $20\r
+       MOV     E,ATOD\r
+       LSR     ATOD                    ; $40 HALF SCALE -> $10\r
+       ADD     E,ATOD                  ; $40 HALF SCALE -> $30 HALF WIDTH\r
+       RJMP    ADC_PULSE\r
+\r
+ADC_REFERENCE:\r
+       CBR     FLAGS,1<<4              ; SAY NEXT RESULT WILL BE -5V GENERATOR\r
+\r
+ ;STS VOLTAGE_VSWT,ATOD\r
+ ;RJMP ADC_DONE\r
+\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      SBRC    FLAGS,5                 ; CURRENT REFERENCE IS BANDGAP ?\r
+;      RJMP    ADC_BANDGAP\r
+;\r
+;      ; CURRENT REFERENCE IS LM385 (18DEC01 IT'S NOW A 100K/100K DIVIDER)\r
+;      CPI     ATOD,$F8                ; IF =>$F8 ASSUME WE HAVE PULLUP ONLY\r
+;      BRLO    ADC_LM385\r
+;\r
+;      LDS     E,LM385_COUNT\r
+;      DEC     E                       ; COUNT DOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,E\r
+;      BRNE    ADC_DONE                ; KEEP TRYING LM385\r
+;\r
+;      SBR     FLAGS,1<<5              ; SAY WE HAVE SWITCHED TO BANDGAP\r
+;GO_ADC_DONE:\r
+;      RJMP    ADC_DONE\r
+;\r
+;ADC_LM385:\r
+;      LDI     E,$10                   ; TOP UP COUNTDOWN TO MISSING LM385\r
+;      STS     LM385_COUNT,E\r
+;\r
+;;     LSR     ATOD                    ; LM385 VOLTAGE = APPROX 2*BANDGAP\r
+;                                      ; USE LM385Z-1.2\r
+;\r
+;ADC_BANDGAP:\r
+       STS     VOLTAGE_VSWT,ATOD\r
+\r
+       ; 18DEC01 USE 5.5 VOLTS AS FOR THE ORIGINAL HYTECH 1000 SYSTEM\r
+       ; IT MUST BE A BIT > 4.2 VOLTS BECAUSE OTHERWISE AVR VCC = Z180 VCC\r
+       ;CPI    ATOD,137                ; 256*0.5*4.5/4.2\r
+       ;CPI    ATOD,152                ; 256*0.5*5.0/4.2\r
+       CPI     ATOD,168                ; 256*0.5*5.5/4.2\r
+\r
+;      ;CPI    ATOD,70                 ; 256*1.22/4.5\r
+;      ;CPI    ATOD,63                 ; 256*1.22/5.0\r
+;      CPI     ATOD,57                 ; 256*1.22/5.5\r
+\r
+       LDI     E,LOW(1024)\r
+       LDI     F,HIGH(1024)\r
+       ; 18DEC01 FOR HYT1500 REVERSED THE SENSE DUE TO NEW 100K/100K DIVIDER\r
+       ;BRLO   ADC_BATTERY_SAVE\r
+       BRSH    ADC_BATTERY_SAVE\r
+\r
+; BIGBODGE TO SKIP SHUT DOWN DUE TO VOLTAGE MEASURING\r
+; 17DEC01 THIS IS NOW DONE FURTHER DOWN, AFTER LOW BATTERY TEST\r
+;RJMP  ADC_DONE                ; SKIP VOLTAGE TEST FOR NOW\r
+\r
+       ; VSWT < 5.5 VOLTS, STABILISE READING FOR BATTERY LOW\r
+       LDS     E,BATTERY_COUNT\r
+       LDS     F,BATTERY_COUNT+1\r
+       SUBI    E,LOW(1)\r
+       SBCI    F,HIGH(1)\r
+       BRNE    ADC_BATTERY_SAVE        ; COUNT 1024 LOW BATTERY READINGS\r
+\r
+       LDI     E,0\r
+       OUT     SPCR,E                  ; DISABLE SPI WHILE SHOWING MESSAGE\r
+       CLR     SPI_WATCHDOG            ; ENSURE SPI REMAINS DISABLED\r
+\r
+       SBR     FLAGS,1<<3              ; SHOW BATTERY MESSAGE AND POWER DOWN\r
+\r
+ADC_BATTERY_SAVE:\r
+       STS     BATTERY_COUNT,E\r
+       STS     BATTERY_COUNT+1,F\r
+\r
+; BIGBODGE TO SKIP SHUT DOWN DUE TO VOLTAGE MEASURING\r
+; 17DEC01 WE'LL ALSO COMMENT THE WHOLE THING OUT FOR NEATNESS\r
+RJMP   ADC_DONE                ; SKIP VOLTAGE TEST FOR NOW\r
+\r
+;      ; 18DEC01 USE 5.0 VOLTS, MORE AGGRESSIVE THAN HYTECH 1000 SYSTEM\r
+;      ; IT MUST BE A BIT > 4.2 VOLTS BECAUSE OTHERWISE AVR VCC = Z180 VCC\r
+;      ;CPI    ATOD,137                ; 256*0.5*4.5/4.2\r
+;      CPI     ATOD,152                ; 256*0.5*5.0/4.2\r
+;      ;CPI    ATOD,168                ; 256*0.5*5.5/4.2\r
+;      BRSH    ADC_DONE\r
+;\r
+;;     ;CPI    ATOD,90                 ; 256*1.22/3.5\r
+;;     ;CPI    ATOD,79                 ; 256*1.22/4.0\r
+;;     CPI     ATOD,70                 ; 256*1.22/4.5\r
+;;     BRLO    ADC_DONE\r
+;\r
+;      ; 18DEC01 VSWT < 5.0 VOLTS, RESET MAIN PROCESSOR IMMEDIATELY\r
+;      LDI     E,$FF\r
+;      STS     TURNOFF_COUNT,E         ; TIMEOUT TO RESET IF POWER STUCK ON\r
+;\r
+;      LDI     E,0\r
+;      OUT     SPCR,E                  ; DISABLE SPI WHILE RESETTING Z180\r
+;\r
+;      CBI     PORTD,4                 ; OUTPUT RES = 0 TO PROTECT RAM\r
+;\r
+;      LDI     E,$FF\r
+;      LDI     F,$00                   ; PWM TRANSISTOR ON, TO PULL DOWN VSWT\r
+\r
+ADC_PULSE:\r
+       OUT     OCR1H,F\r
+       OUT     OCR1L,E                 ; SET PULSE WIDTH FOR PWM TRANSISTOR\r
+\r
+ADC_DONE:\r
+; 18DEC01 REMOVED FOR HYT1500 AS ONLY ONE POSSIBLE CONFIGURATION\r
+;      LDI     E,$45                   ; START MEASURING BANDGAP\r
+;      SBRS    FLAGS,5\r
+       LDI     E,$04                   ; START MEASURING LM385\r
+       SBRS    FLAGS,4\r
+       LDI     E,$05                   ; START MEASURING -5V GENERATOR\r
+       OUT     ADMUX,E\r
+       LDI     E,$DE\r
+       OUT     ADCSR,E                 ; ENABLE A/D, START, SINGLE CONVERSION\r
+\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 5\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLTS_AT_A5:\r
+;      ;OUT    PORTC,M16U1     ; res in byte 2(ignore ls,byte),volts pin 5\r
+;      MOV     A,B             ; get saved VSWT\r
+;      SUB     A,M16U1         ; voltage 47K = VSWT-Voltage at pin 35\r
+;      MOV     D,A             ; which is 1/3 of total supply ie +V+(-V)\r
+;      ADD     A,D\r
+;      ADD     A,D             ; TOTAL SUPPLY\r
+;      SUB     A,B             ; TOTAL SUPPLY-VSWT=NEG SUPPLY\r
+;DIAG_NEG:\r
+;      ;OUT    PORTC,A\r
+;\r
+;      LDI     A,4\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;ADC_DONE:\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+\r
+;VSWT: ;OUT    PORTC,ATOD      ; count value for 2.5 V ref\r
+;      LDI     A,$FF\r
+;      MOV     DD16UH,A        ; divide by full scale ie VSWT\r
+;      SUB     DD16UL,DD16UL   ; clear low reg\r
+;      SUB     DV16UH,DV16UH   ; clear high reg divisor\r
+;      MOV     DV16UL,ATOD     ; use ATOD value as divisor\r
+;      ;OUT    PORTC,ATOD\r
+;      RCALL   DIVIDE          ; ***** NOTE AN FF RESULT IS NO INPUT *******\r
+;      MOV     MC16UH,DRES16UH ; load multiplicand high from result high\r
+;      MOV     MC16UL,DRES16UL ; load multiplicand low from result low\r
+;      SUB     MP16UH,MP16UH   ; clear high byte in multiplier reg\r
+;       LDI     A,25\r
+;       MOV     MP16UL,A        ; mult by zener ref voltage (2.5V)\r
+;      RCALL   MULTIPLY\r
+;DIAG_VOLT_VSWT:\r
+;xi:\r
+;      LDS     A,VSWTS         ; previous value of VSWT\r
+;      MOV     B,MP16UL        ; new value of VSWT\r
+;      ;RCALL  SMOOTH\r
+;      STS     VSWTS,B\r
+;      LDS     B,VSWTS\r
+;\r
+;      ;OUT    PORTC,B;M16U1   ; VSWT IN 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;\r
+;      ;STS    VSWTS,B         ; SAVE NEW SMOOTHED VALUE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      MOV     B,M16U1         ; save copy of VSWT for neg 5V routine\r
+;      MOV     DD16UH,M16U1\r
+;      SUB     DD16UL,DD16UL\r
+;      LDI     A,255           ; calculate the atod volts per division\r
+;      MOV     DV16UL,A\r
+;      SUB     DV16UH,DV16UH\r
+;      RCALL   DIVIDE          ; result to be found in dres high & low\r
+;\r
+;      LDI     A,3\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VCHG\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;VCHG:\r
+;      MOV     MC16UH,DRES16UH ; X high from result of previous division in VSWT\r
+;      MOV     MC16UL,DRES16UL ; X low from result of previous division in VSWT\r
+;      SUB     MP16UH,MP16UH   ; clear high\r
+;      MOV     MP16UL,ATOD     ; from ATOD count on pin 37 (1/3 VCHG)\r
+;      RCALL   MULTIPLY\r
+;      MOV     A,M16U1\r
+;      ADD     M16U1,A         ; B\C A3 IS 1/3 VCHG\r
+;      ADD     M16U1,A\r
+;DIAG_VOLT_VHG:\r
+;      ;OUT    PORTC,M16U1     ; REUSULT 2nd BYTE B/C YOU WANT IT FIXED SO THE REMAINDER IN THE\r
+;                              ; LAST DIVISION IS WEIGHED CORRECTLY .... SEE CEC IF YOU CAN'T REMEMBER\r
+;      LDI     A,5\r
+;      OUT     ADMUX,A         ; NEXT TIME READ VSWT\r
+;      SBI     ADCSR,ADSC      ; START ANOTHER CONVERSION\r
+;      RETI\r
+;\r
+;;***************************************************************************\r
+;;*\r
+;;* "div16u" - 16/16 Bit Unsigned Division\r
+;;*\r
+;;* This subroutine divides the two 16-bit numbers\r
+;;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).\r
+;;* The result is placed in "dres16uH:dres16uL" and the remainder in\r
+;;* "drem16uH:drem16uL".\r
+;;*\r
+;;* Number of words    :19\r
+;;* Number of cycles   :235/251 (Min/Max)\r
+;;* Low registers used :2 (drem16uL,drem16uH)\r
+;;* High registers used  :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,\r
+;;*                        dcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;divide:\r
+;div16u:       clr     drem16uL        ;clear remainder Low byte\r
+;      sub     drem16uH,drem16uH       ;clear remainder High byte and carry\r
+;      ldi     counter,17      ;init loop counter\r
+;d16u_1:       rol     dd16uL          ;shift left dividend\r
+;      rol     dd16uH\r
+;      dec     counter         ;decrement counter\r
+;      brne    d16u_2          ;if done\r
+;      ret                     ;    return\r
+;d16u_2:       rol     drem16uL        ;shift dividend into remainder\r
+;      rol     drem16uH\r
+;      sub     drem16uL,dv16uL ;remainder = remainder - divisor\r
+;      sbc     drem16uH,dv16uH ;\r
+;      brcc    d16u_3          ;if result negative\r
+;      add     drem16uL,dv16uL ;    restore remainder\r
+;      adc     drem16uH,dv16uH\r
+;      clc                     ;    clear carry to be shifted into result\r
+;      rjmp    d16u_1          ;else\r
+;d16u_3:       sec                     ;    set carry to be shifted into result\r
+;      rjmp    d16u_1\r
+;\r
+;;********* 16 X 16 multiplication routine from app note avr200 *************\r
+;;*\r
+;;* "mpy16u" - 16x16 Bit Unsigned Multiplication\r
+;;*\r
+;;* This subroutine multiplies the two 16-bit register variables\r
+;;* mp16uH:mp16uL and mc16uH:mc16uL.\r
+;;* The result is placed in m16u3:m16u2:m16u1:m16u0.\r
+;;*\r
+;;* Number of words    :14 + return\r
+;;* Number of cycles   :153 + return\r
+;;* Low registers used :None\r
+;;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,\r
+;;*                          m16u3,mcnt16u)\r
+;;*\r
+;;***************************************************************************\r
+;multiply:\r
+;mpy16u:       clr     m16u3           ;clear high byte of result\r
+;      sub     m16u2,m16u2     ;clear result byte 2 and carry\r
+;      clr     m16u2\r
+;      ldi     counter,16      ;init loop counter\r
+;      lsr     mp16uH\r
+;      ror     mp16uL\r
+;\r
+;m16u_1:       brcc    noad8           ;if bit 0 of multiplier set\r
+;      add     m16u2,mc16uL    ;add multiplicand Low to byte 2 of res\r
+;      adc     m16u3,mc16uH    ;add multiplicand high to byte 3 of res\r
+;noad8:        ror     m16u3           ;shift right result byte 3\r
+;      ror     m16u2           ;rotate right result byte 2\r
+;      ror     m16u1           ;rotate result byte 1 and multiplier High\r
+;      ror     m16u0           ;rotate result byte 0 and multiplier Low\r
+;      dec     counter         ;decrement loop counter\r
+;      brne    m16u_1          ;if not done, loop more\r
+;      ret\r
+;;************************* Exponential smoothing routine ********************\r
+;;Receives : Previous value in A\r
+;;       : New value in B\r
+;;Passes   : Smoothed result back in B reg\r
+;;Uses   : d reg\r
+;\r
+;Smooth:\r
+;      mov     d,a             ; save a copy of previous value\r
+;      lsr     a\r
+;      lsr     a\r
+;      lsr     b\r
+;      lsr     b               ; prev.ave  -  prev.ave  +  new.data\r
+;      sub     d,a             ;              --------     --------\r
+;      add     b,d             ;                  n            n\r
+;      ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MESSAGE_0:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',0,128,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_1:\r
+       .DB     $1B,'D','0',$1B,'G','0'\r
+       .DB     $1B,'P','1',$1B,'E','0'\r
+       .DB     $1B,'K'\r
+       .DB     $1B,'0'\r
+       .DB     $1B,'/','0',$1B\r
+       .DB     'S',0,0,$1B\r
+       .DB     'N',240,64,$1B\r
+       .DB     'E','1'\r
+\r
+MESSAGE_2:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','0','0','0',0\r
+\r
+MESSAGE_3:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'W','P','O','3','0',' ','V','5'\r
+\r
+MESSAGE_4:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','D',' ','C','O','M','M','A','N','D',0\r
+\r
+MESSAGE_5:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'B','A','T','T','E','R','Y',' ','L','O','W',0\r
+\r
+MESSAGE_6:\r
+       .DB     $1B,'M','0',0\r
+\r
+MESSAGE_7:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'H','Y','T','E','C','H',' ','1','5','0','0',0\r
+\r
+MESSAGE_8:\r
+       .DB     $1B,'S',16,13\r
+       .DB     'S','T','A','C','K',' ','O','V','E','R','F','L','O','W'\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+;IF LARGE (THE ORIGINAL WPO15V1.HEX SETTINGS)\r
+;      .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+;      ; FSTRT = 0 FOR 1.1 MS R/C STARTUP DELAY\r
+;      ;.DW    $ACBE                   ; WRITE FUSE BITS COMMAND\r
+;; BIGBODGE (NOT REALLY - JUST IN CASE TYPE OF CHANGE)\r
+;;       FSTRT = 1 FOR 16 MS R/C STARTUP DELAY\r
+;        .DW     $ACBF                   ; WRITE FUSE BITS COMMAND\r
+;ELSE\r
+       ; BODEN = 1 DISABLED\r
+       ; BODLEVEL = 1 FOR 2.7V\r
+\r
+       ; CKSEL = 100 FOR 16K * 11MHZ STARTUP DELAY (NO R/C STARTUP DELAY)\r
+\r
+       .DW     $4100                   ; SELECT ADDRESS COMMAND\r
+       .DW     $ACBC                   ; WRITE FUSE BITS COMMAND\r
+;ENDIF\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
index 632a28d..912b5f7 100644 (file)
Binary files a/src/bin/as-z80.exe and b/src/bin/as-z80.exe differ
index af80d7f..d284f67 100644 (file)
Binary files a/src/bin/bd.exe and b/src/bin/bd.exe differ
diff --git a/src/bin/bin2avr.exe b/src/bin/bin2avr.exe
new file mode 100644 (file)
index 0000000..3ea5d51
Binary files /dev/null and b/src/bin/bin2avr.exe differ
index e9139f4..ec59276 100644 (file)
Binary files a/src/bin/bin2c.exe and b/src/bin/bin2c.exe differ
diff --git a/src/bin/bmp2txt.exe b/src/bin/bmp2txt.exe
new file mode 100644 (file)
index 0000000..fdf4e30
Binary files /dev/null and b/src/bin/bmp2txt.exe differ
diff --git a/src/bin/chs2cmd.exe b/src/bin/chs2cmd.exe
new file mode 100644 (file)
index 0000000..f355dbb
Binary files /dev/null and b/src/bin/chs2cmd.exe differ
index 062bc40..dccde71 100644 (file)
Binary files a/src/bin/cr.exe and b/src/bin/cr.exe differ
diff --git a/src/bin/diff.exe b/src/bin/diff.exe
deleted file mode 100644 (file)
index 8c84ded..0000000
Binary files a/src/bin/diff.exe and /dev/null differ
index 0354bae..30225cc 100644 (file)
Binary files a/src/bin/fsck.exe and b/src/bin/fsck.exe differ
index 0f3885e..c29e1e5 100644 (file)
Binary files a/src/bin/ihex2bin.exe and b/src/bin/ihex2bin.exe differ
index f6760bf..1462ae1 100644 (file)
Binary files a/src/bin/link-z80.exe and b/src/bin/link-z80.exe differ
index 6012306..34770dd 100644 (file)
Binary files a/src/bin/mkfs.exe and b/src/bin/mkfs.exe differ
index 60199e7..250afd0 100644 (file)
Binary files a/src/bin/nroff.exe and b/src/bin/nroff.exe differ
diff --git a/src/bin/p.exe b/src/bin/p.exe
new file mode 100644 (file)
index 0000000..e3721c3
Binary files /dev/null and b/src/bin/p.exe differ
diff --git a/src/bin/patch.exe b/src/bin/patch.exe
deleted file mode 100644 (file)
index b7dd0e5..0000000
Binary files a/src/bin/patch.exe and /dev/null differ
diff --git a/src/bin/pkzipc.exe b/src/bin/pkzipc.exe
new file mode 100644 (file)
index 0000000..09883b9
Binary files /dev/null and b/src/bin/pkzipc.exe differ
diff --git a/src/bin/tavrasm.exe b/src/bin/tavrasm.exe
new file mode 100644 (file)
index 0000000..fa3f52c
Binary files /dev/null and b/src/bin/tavrasm.exe differ
index a607f97..84db381 100644 (file)
Binary files a/src/bin/touch.exe and b/src/bin/touch.exe differ
diff --git a/src/bin/txt2chs.exe b/src/bin/txt2chs.exe
new file mode 100644 (file)
index 0000000..e5eb754
Binary files /dev/null and b/src/bin/txt2chs.exe differ
index 1b4d72e..29b22fa 100644 (file)
Binary files a/src/bin/ucp.exe and b/src/bin/ucp.exe differ
diff --git a/src/font/large.psd b/src/font/large.psd
new file mode 100644 (file)
index 0000000..d2f7656
Binary files /dev/null and b/src/font/large.psd differ
diff --git a/src/font/lcd0.cmd b/src/font/lcd0.cmd
new file mode 100644 (file)
index 0000000..b01407f
Binary files /dev/null and b/src/font/lcd0.cmd differ
diff --git a/src/font/lcd1.cmd b/src/font/lcd1.cmd
new file mode 100644 (file)
index 0000000..5e9496d
Binary files /dev/null and b/src/font/lcd1.cmd differ
diff --git a/src/font/n.bat b/src/font/n.bat
new file mode 100644 (file)
index 0000000..754176f
--- /dev/null
@@ -0,0 +1,27 @@
+bmp2txt set01.bmp\r
+bmp2txt set02.bmp\r
+bmp2txt set03.bmp\r
+bmp2txt set04.bmp\r
+bmp2txt set05.bmp\r
+bmp2txt set06.bmp\r
+\r
+txt2chs set01.txt 1 3\r
+txt2chs set02.txt 1 3\r
+txt2chs set03.txt 1 4\r
+txt2chs set04.txt 2 5\r
+txt2chs set05.txt 2 7\r
+txt2chs set06.txt 1 3\r
+\r
+chs2cmd set01.chs 1\r
+chs2cmd set02.chs 2\r
+chs2cmd set03.chs 3\r
+chs2cmd set04.chs 4\r
+chs2cmd set05.chs 5\r
+chs2cmd set06.chs 6\r
+\r
+copy/b set01.cmd+set02.cmd+set03.cmd+set04.cmd+set05.cmd+set06.cmd lcd0.cmd\r
+copy/b set01.cmd+set02.cmd+set03.cmd+set04.cmd+set05.cmd lcd1.cmd\r
+\r
+copy lcd0.cmd ..\..\bin\font\r
+copy lcd1.cmd ..\..\bin\font\r
+\r
diff --git a/src/font/set01.bmp b/src/font/set01.bmp
new file mode 100644 (file)
index 0000000..c49ae7a
Binary files /dev/null and b/src/font/set01.bmp differ
diff --git a/src/font/set01.chs b/src/font/set01.chs
new file mode 100644 (file)
index 0000000..311c8d5
Binary files /dev/null and b/src/font/set01.chs differ
diff --git a/src/font/set01.cmd b/src/font/set01.cmd
new file mode 100644 (file)
index 0000000..bd79d3b
Binary files /dev/null and b/src/font/set01.cmd differ
diff --git a/src/font/set01.txt b/src/font/set01.txt
new file mode 100644 (file)
index 0000000..2b3e646
--- /dev/null
@@ -0,0 +1,1056 @@
+at 15,17 size 2,10\r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+    \r
+##__\r
+    \r
+    \r
+at 21,17 size 4,10\r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+        \r
+        \r
+        \r
+        \r
+________\r
+        \r
+        \r
+at 30,17 size 7,10\r
+              \r
+    ##  ##    \r
+    ##  ##    \r
+  ##########  \r
+  ##    ##    \r
+##########    \r
+  ##  ##      \r
+__##__##______\r
+              \r
+              \r
+at 41,17 size 6,10\r
+    ##      \r
+    ##      \r
+  ########  \r
+##  ##      \r
+  ####      \r
+    ####    \r
+    ##  ##  \r
+########____\r
+    ##      \r
+    ##      \r
+at 51,17 size 10,10\r
+                    \r
+  ####      ##      \r
+##    ##  ##        \r
+##    ##  ##        \r
+  ####  ##  ####    \r
+      ##  ##    ##  \r
+      ##  ##    ##  \r
+____##______####____\r
+                    \r
+                    \r
+at 65,17 size 7,10\r
+              \r
+  ####        \r
+##    ##      \r
+##    ##      \r
+  ####    ##  \r
+##    ##  ##  \r
+##      ##    \r
+__######__##__\r
+              \r
+              \r
+at 76,17 size 2,10\r
+##  \r
+##  \r
+##  \r
+    \r
+    \r
+    \r
+    \r
+____\r
+    \r
+    \r
+at 82,17 size 4,10\r
+    ##  \r
+  ##    \r
+##      \r
+##      \r
+##      \r
+##      \r
+##      \r
+##______\r
+  ##    \r
+    ##  \r
+at 90,17 size 4,10\r
+##      \r
+  ##    \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+____##__\r
+  ##    \r
+##      \r
+at 99,17 size 6,10\r
+    ##      \r
+##  ##  ##  \r
+  ######    \r
+##  ##  ##  \r
+    ##      \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+at 108,17 size 8,10\r
+                \r
+      ##        \r
+      ##        \r
+      ##        \r
+##############  \r
+      ##        \r
+      ##        \r
+______##________\r
+                \r
+                \r
+at 120,17 size 3,10\r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+  ##  \r
+__##__\r
+##    \r
+      \r
+at 127,17 size 4,10\r
+        \r
+        \r
+        \r
+        \r
+######  \r
+        \r
+        \r
+________\r
+        \r
+        \r
+at 135,17 size 2,10\r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+##  \r
+##__\r
+    \r
+    \r
+at 141,17 size 5,10\r
+      ##  \r
+      ##  \r
+    ##    \r
+    ##    \r
+  ##      \r
+  ##      \r
+  ##      \r
+##________\r
+##        \r
+          \r
+at 151,17 size 6,10\r
+            \r
+  ######    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 160,17 size 6,10\r
+            \r
+    ##      \r
+######      \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+##########__\r
+            \r
+            \r
+at 170,17 size 6,10\r
+            \r
+  ######    \r
+##      ##  \r
+        ##  \r
+      ##    \r
+    ##      \r
+  ##        \r
+##########__\r
+            \r
+            \r
+at 180,17 size 6,10\r
+            \r
+  ######    \r
+##      ##  \r
+        ##  \r
+    ####    \r
+        ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 190,17 size 6,10\r
+            \r
+      ##    \r
+    ####    \r
+  ##  ##    \r
+##    ##    \r
+##########  \r
+      ##    \r
+______##____\r
+            \r
+            \r
+at 200,17 size 6,10\r
+            \r
+##########  \r
+##          \r
+########    \r
+        ##  \r
+        ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 210,17 size 6,10\r
+            \r
+    ####    \r
+  ##        \r
+##          \r
+########    \r
+##      ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 220,17 size 6,10\r
+            \r
+##########  \r
+        ##  \r
+      ##    \r
+      ##    \r
+    ##      \r
+    ##      \r
+__##________\r
+            \r
+            \r
+at 230,17 size 6,10\r
+            \r
+  ######    \r
+##      ##  \r
+##      ##  \r
+  ######    \r
+##      ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 239,17 size 6,10\r
+            \r
+  ######    \r
+##      ##  \r
+##      ##  \r
+  ########  \r
+        ##  \r
+      ##    \r
+__####______\r
+            \r
+            \r
+at 250,17 size 2,10\r
+    \r
+    \r
+    \r
+##  \r
+##  \r
+    \r
+##  \r
+##__\r
+    \r
+    \r
+at 257,17 size 3,10\r
+      \r
+      \r
+      \r
+  ##  \r
+  ##  \r
+      \r
+  ##  \r
+__##__\r
+##    \r
+      \r
+at 265,17 size 7,10\r
+              \r
+              \r
+        ####  \r
+    ####      \r
+####          \r
+    ####      \r
+        ####  \r
+______________\r
+              \r
+              \r
+at 277,17 size 7,10\r
+              \r
+              \r
+              \r
+############  \r
+              \r
+############  \r
+              \r
+______________\r
+              \r
+              \r
+at 289,17 size 7,10\r
+              \r
+              \r
+####          \r
+    ####      \r
+        ####  \r
+    ####      \r
+####          \r
+______________\r
+              \r
+              \r
+at 300,17 size 5,10\r
+          \r
+######    \r
+      ##  \r
+      ##  \r
+    ##    \r
+  ##      \r
+          \r
+__##______\r
+          \r
+          \r
+at 7,41 size 9,10\r
+                  \r
+    ##########    \r
+  ##          ##  \r
+##    ######  ##  \r
+##  ##    ##  ##  \r
+##  ##    ##  ##  \r
+##  ##    ##  ##  \r
+##____####__##____\r
+  ##              \r
+    ########      \r
+at 20,41 size 8,10\r
+                \r
+      ##        \r
+    ##  ##      \r
+    ##  ##      \r
+  ##      ##    \r
+  ##########    \r
+  ##      ##    \r
+##__________##__\r
+                \r
+                \r
+at 31,41 size 6,10\r
+            \r
+######      \r
+##    ##    \r
+##    ##    \r
+########    \r
+##      ##  \r
+##      ##  \r
+########____\r
+            \r
+            \r
+at 41,41 size 7,10\r
+              \r
+    ######    \r
+  ##      ##  \r
+##            \r
+##            \r
+##            \r
+  ##      ##  \r
+____######____\r
+              \r
+              \r
+at 52,41 size 7,10\r
+              \r
+########      \r
+##      ##    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##      ##    \r
+########______\r
+              \r
+              \r
+at 63,41 size 5,10\r
+          \r
+########  \r
+##        \r
+##        \r
+########  \r
+##        \r
+##        \r
+########__\r
+          \r
+          \r
+at 73,41 size 6,10\r
+            \r
+##########  \r
+##          \r
+##          \r
+########    \r
+##          \r
+##          \r
+##__________\r
+            \r
+            \r
+at 82,41 size 7,10\r
+              \r
+    ######    \r
+  ##      ##  \r
+##            \r
+##    ######  \r
+##        ##  \r
+  ##      ##  \r
+____########__\r
+              \r
+              \r
+at 93,41 size 7,10\r
+              \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+############  \r
+##        ##  \r
+##        ##  \r
+##________##__\r
+              \r
+              \r
+at 104,41 size 4,10\r
+        \r
+######  \r
+  ##    \r
+  ##    \r
+  ##    \r
+  ##    \r
+  ##    \r
+######__\r
+        \r
+        \r
+at 111,41 size 5,10\r
+          \r
+    ####  \r
+      ##  \r
+      ##  \r
+      ##  \r
+      ##  \r
+      ##  \r
+######____\r
+          \r
+          \r
+at 120,41 size 7,10\r
+              \r
+##      ##    \r
+##    ##      \r
+##  ##        \r
+######        \r
+##    ##      \r
+##      ##    \r
+##________##__\r
+              \r
+              \r
+at 131,41 size 6,10\r
+            \r
+##          \r
+##          \r
+##          \r
+##          \r
+##          \r
+##          \r
+##########__\r
+            \r
+            \r
+at 140,41 size 8,10\r
+                \r
+####      ####  \r
+####      ####  \r
+##  ##  ##  ##  \r
+##  ##  ##  ##  \r
+##    ##    ##  \r
+##    ##    ##  \r
+##__________##__\r
+                \r
+                \r
+at 152,41 size 6,10\r
+            \r
+##      ##  \r
+####    ##  \r
+##  ##  ##  \r
+##  ##  ##  \r
+##    ####  \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+at 163,41 size 8,10\r
+                \r
+    ######      \r
+  ##      ##    \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+  ##      ##    \r
+____######______\r
+                \r
+                \r
+at 174,41 size 6,10\r
+            \r
+########    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+########    \r
+##          \r
+##__________\r
+            \r
+            \r
+at 184,41 size 8,10\r
+                \r
+    ######      \r
+  ##      ##    \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+  ##      ##    \r
+____######______\r
+        ##      \r
+          ####  \r
+at 195,41 size 7,10\r
+              \r
+########      \r
+##      ##    \r
+##      ##    \r
+########      \r
+##    ##      \r
+##      ##    \r
+##________##__\r
+              \r
+              \r
+at 205,41 size 6,10\r
+            \r
+  ######    \r
+##      ##  \r
+##          \r
+  ######    \r
+        ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 215,41 size 8,10\r
+                \r
+##############  \r
+      ##        \r
+      ##        \r
+      ##        \r
+      ##        \r
+      ##        \r
+______##________\r
+                \r
+                \r
+at 225,41 size 7,10\r
+              \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+at 235,41 size 8,10\r
+                \r
+##          ##  \r
+  ##      ##    \r
+  ##      ##    \r
+  ##      ##    \r
+    ##  ##      \r
+    ##  ##      \r
+______##________\r
+                \r
+                \r
+at 247,41 size 10,10\r
+                    \r
+##      ##      ##  \r
+##      ##      ##  \r
+  ##  ##  ##  ##    \r
+  ##  ##  ##  ##    \r
+  ##  ##  ##  ##    \r
+    ##      ##      \r
+____##______##______\r
+                    \r
+                    \r
+at 260,41 size 6,10\r
+            \r
+##      ##  \r
+##      ##  \r
+  ##  ##    \r
+    ##      \r
+  ##  ##    \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+at 269,41 size 8,10\r
+                \r
+##          ##  \r
+  ##      ##    \r
+    ##  ##      \r
+      ##        \r
+      ##        \r
+      ##        \r
+______##________\r
+                \r
+                \r
+at 280,41 size 6,10\r
+            \r
+##########  \r
+        ##  \r
+      ##    \r
+    ##      \r
+  ##        \r
+##          \r
+##########__\r
+            \r
+            \r
+at 290,41 size 4,10\r
+######  \r
+##      \r
+##      \r
+##      \r
+##      \r
+##      \r
+##      \r
+##______\r
+##      \r
+######  \r
+at 297,41 size 5,10\r
+##        \r
+##        \r
+  ##      \r
+  ##      \r
+  ##      \r
+    ##    \r
+    ##    \r
+______##__\r
+      ##  \r
+          \r
+at 307,41 size 4,10\r
+######  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+____##__\r
+    ##  \r
+######  \r
+at 315,41 size 7,10\r
+              \r
+    ####      \r
+  ##    ##    \r
+##        ##  \r
+              \r
+              \r
+              \r
+______________\r
+              \r
+              \r
+at 325,41 size 7,10\r
+              \r
+              \r
+              \r
+              \r
+              \r
+              \r
+              \r
+______________\r
+              \r
+############  \r
+at 8,65 size 3,10\r
+##    \r
+  ##  \r
+      \r
+      \r
+      \r
+      \r
+      \r
+______\r
+      \r
+      \r
+at 17,65 size 6,10\r
+            \r
+            \r
+            \r
+  ######    \r
+        ##  \r
+  ########  \r
+##      ##  \r
+__########__\r
+            \r
+            \r
+at 26,65 size 6,10\r
+##          \r
+##          \r
+##          \r
+########    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+########____\r
+            \r
+            \r
+at 36,65 size 5,10\r
+          \r
+          \r
+          \r
+  ######  \r
+##        \r
+##        \r
+##        \r
+__######__\r
+          \r
+          \r
+at 45,65 size 6,10\r
+        ##  \r
+        ##  \r
+        ##  \r
+  ########  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+__########__\r
+            \r
+            \r
+at 55,65 size 6,10\r
+            \r
+            \r
+            \r
+  ######    \r
+##      ##  \r
+##########  \r
+##          \r
+__########__\r
+            \r
+            \r
+at 63,65 size 5,10\r
+    ####  \r
+  ##      \r
+  ##      \r
+########  \r
+  ##      \r
+  ##      \r
+  ##      \r
+__##______\r
+          \r
+          \r
+at 71,65 size 6,10\r
+            \r
+            \r
+            \r
+  ########  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+__########__\r
+        ##  \r
+  ######    \r
+at 81,65 size 6,10\r
+##          \r
+##          \r
+##          \r
+########    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+at 91,65 size 2,10\r
+    \r
+##  \r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+    \r
+    \r
+at 96,65 size 3,10\r
+      \r
+  ##  \r
+      \r
+####  \r
+  ##  \r
+  ##  \r
+  ##  \r
+__##__\r
+  ##  \r
+##    \r
+at 104,65 size 6,10\r
+##          \r
+##          \r
+##          \r
+##    ##    \r
+##  ##      \r
+######      \r
+##    ##    \r
+##______##__\r
+            \r
+            \r
+at 113,65 size 2,10\r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+    \r
+    \r
+at 120,65 size 10,10\r
+                    \r
+                    \r
+                    \r
+########  ######    \r
+##      ##      ##  \r
+##      ##      ##  \r
+##      ##      ##  \r
+##______##______##__\r
+                    \r
+                    \r
+at 133,65 size 6,10\r
+            \r
+            \r
+            \r
+########    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+at 143,65 size 6,10\r
+            \r
+            \r
+            \r
+  ######    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 152,65 size 6,10\r
+            \r
+            \r
+            \r
+########    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+########____\r
+##          \r
+##          \r
+at 162,65 size 6,10\r
+            \r
+            \r
+            \r
+  ########  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+__########__\r
+        ##  \r
+        ##  \r
+at 172,65 size 4,10\r
+        \r
+        \r
+        \r
+##  ##  \r
+####    \r
+##      \r
+##      \r
+##______\r
+        \r
+        \r
+at 180,65 size 5,10\r
+          \r
+          \r
+          \r
+  ######  \r
+##        \r
+  ####    \r
+      ##  \r
+######____\r
+          \r
+          \r
+at 187,65 size 5,10\r
+          \r
+  ##      \r
+  ##      \r
+########  \r
+  ##      \r
+  ##      \r
+  ##      \r
+____####__\r
+          \r
+          \r
+at 196,65 size 6,10\r
+            \r
+            \r
+            \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+__########__\r
+            \r
+            \r
+at 206,65 size 5,10\r
+          \r
+          \r
+          \r
+##    ##  \r
+##    ##  \r
+##    ##  \r
+  ####    \r
+__####____\r
+          \r
+          \r
+at 215,65 size 6,10\r
+            \r
+            \r
+            \r
+##      ##  \r
+##  ##  ##  \r
+##  ##  ##  \r
+  ##  ##    \r
+__##__##____\r
+            \r
+            \r
+at 227,65 size 6,10\r
+            \r
+            \r
+            \r
+##      ##  \r
+  ##  ##    \r
+    ##      \r
+  ##  ##    \r
+##______##__\r
+            \r
+            \r
+at 236,65 size 5,10\r
+          \r
+          \r
+          \r
+##    ##  \r
+##    ##  \r
+##    ##  \r
+  ####    \r
+____##____\r
+  ##      \r
+  ##      \r
+at 246,65 size 5,10\r
+          \r
+          \r
+          \r
+########  \r
+    ##    \r
+  ##      \r
+##        \r
+########__\r
+          \r
+          \r
+at 254,65 size 6,10\r
+      ####  \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+####        \r
+    ##      \r
+____##______\r
+    ##      \r
+      ####  \r
+at 265,65 size 2,10\r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+##  \r
+##  \r
+at 271,65 size 6,10\r
+####        \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+      ####  \r
+    ##      \r
+____##______\r
+    ##      \r
+####        \r
+at 282,65 size 7,10\r
+              \r
+              \r
+              \r
+  ##      ##  \r
+##  ####  ##  \r
+##      ##    \r
+              \r
+______________\r
+              \r
+              \r
+at 293,65 size 7,10\r
+              \r
+    ######    \r
+  ##      ##  \r
+########      \r
+  ##          \r
+########      \r
+  ##      ##  \r
+____######____\r
+              \r
+              \r
+at 303,65 size 6,10\r
+            \r
+            \r
+      ##    \r
+  ########  \r
+##          \r
+##          \r
+##          \r
+__########__\r
+      ##    \r
+            \r
diff --git a/src/font/set02.bmp b/src/font/set02.bmp
new file mode 100644 (file)
index 0000000..0c7e2e8
Binary files /dev/null and b/src/font/set02.bmp differ
diff --git a/src/font/set02.chs b/src/font/set02.chs
new file mode 100644 (file)
index 0000000..8896bcb
Binary files /dev/null and b/src/font/set02.chs differ
diff --git a/src/font/set02.cmd b/src/font/set02.cmd
new file mode 100644 (file)
index 0000000..160af2d
Binary files /dev/null and b/src/font/set02.cmd differ
diff --git a/src/font/set02.txt b/src/font/set02.txt
new file mode 100644 (file)
index 0000000..5c04da5
--- /dev/null
@@ -0,0 +1,1087 @@
+at 15,19 size 3,11\r
+      \r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+      \r
+####__\r
+      \r
+      \r
+at 21,19 size 6,11\r
+            \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+            \r
+            \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+at 32,19 size 8,11\r
+                \r
+                \r
+      ##  ##    \r
+      ##  ##    \r
+  ############  \r
+    ##  ##      \r
+############    \r
+  ##  ##        \r
+__##__##________\r
+                \r
+                \r
+at 44,19 size 6,11\r
+    ##      \r
+    ##      \r
+  ######    \r
+######  ##  \r
+######      \r
+  ######    \r
+    ######  \r
+##  ######  \r
+__######____\r
+    ##      \r
+    ##      \r
+at 54,19 size 12,11\r
+                        \r
+                        \r
+  ####        ##        \r
+##    ##    ##          \r
+##    ##    ##  ####    \r
+##    ##  ##  ##    ##  \r
+  ####  ##    ##    ##  \r
+        ##    ##    ##  \r
+______##________####____\r
+                        \r
+                        \r
+at 70,19 size 8,11\r
+                \r
+                \r
+  ######        \r
+####  ####      \r
+####  ####      \r
+  ######  ####  \r
+####  ######    \r
+####    ####    \r
+__######__####__\r
+                \r
+                \r
+at 81,19 size 3,11\r
+      \r
+####  \r
+####  \r
+####  \r
+      \r
+      \r
+      \r
+      \r
+______\r
+      \r
+      \r
+at 89,19 size 5,11\r
+          \r
+    ####  \r
+  ####    \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####______\r
+  ####    \r
+    ####  \r
+at 97,19 size 5,11\r
+          \r
+####      \r
+  ####    \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+____####__\r
+  ####    \r
+####      \r
+at 107,19 size 6,11\r
+            \r
+    ##      \r
+##  ##  ##  \r
+  ######    \r
+##  ##  ##  \r
+    ##      \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+at 117,19 size 8,11\r
+                \r
+                \r
+      ##        \r
+      ##        \r
+      ##        \r
+##############  \r
+      ##        \r
+      ##        \r
+______##________\r
+                \r
+                \r
+at 129,19 size 3,11\r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+####  \r
+####__\r
+####  \r
+##    \r
+at 136,19 size 4,11\r
+        \r
+        \r
+        \r
+        \r
+        \r
+######  \r
+        \r
+        \r
+________\r
+        \r
+        \r
+at 145,19 size 3,11\r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+####  \r
+####__\r
+      \r
+      \r
+at 152,19 size 6,11\r
+            \r
+        ##  \r
+        ##  \r
+      ##    \r
+      ##    \r
+    ##      \r
+    ##      \r
+  ##        \r
+__##________\r
+##          \r
+##          \r
+at 162,19 size 6,11\r
+            \r
+            \r
+  ######    \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+__######____\r
+            \r
+            \r
+at 174,19 size 5,11\r
+          \r
+          \r
+  ####    \r
+######    \r
+  ####    \r
+  ####    \r
+  ####    \r
+  ####    \r
+########__\r
+          \r
+          \r
+at 183,19 size 6,11\r
+            \r
+            \r
+  ######    \r
+##    ####  \r
+      ####  \r
+    ####    \r
+  ####      \r
+####        \r
+##########__\r
+            \r
+            \r
+at 194,19 size 6,11\r
+            \r
+            \r
+  ######    \r
+##    ####  \r
+      ####  \r
+  ######    \r
+      ####  \r
+##    ####  \r
+__######____\r
+            \r
+            \r
+at 204,19 size 7,11\r
+              \r
+              \r
+      ####    \r
+    ######    \r
+  ##  ####    \r
+##    ####    \r
+############  \r
+      ####    \r
+______####____\r
+              \r
+              \r
+at 215,19 size 6,11\r
+            \r
+            \r
+##########  \r
+####        \r
+########    \r
+      ####  \r
+      ####  \r
+##    ####  \r
+__######____\r
+            \r
+            \r
+at 225,19 size 6,11\r
+            \r
+            \r
+  ######    \r
+####        \r
+########    \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+__######____\r
+            \r
+            \r
+at 236,19 size 6,11\r
+            \r
+            \r
+##########  \r
+      ####  \r
+    ####    \r
+    ####    \r
+  ####      \r
+  ####      \r
+####________\r
+            \r
+            \r
+at 246,19 size 6,11\r
+            \r
+            \r
+  ######    \r
+####  ####  \r
+####  ####  \r
+  ######    \r
+####  ####  \r
+####  ####  \r
+__######____\r
+            \r
+            \r
+at 257,19 size 6,11\r
+            \r
+            \r
+  ######    \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+  ########  \r
+      ####  \r
+__######____\r
+            \r
+            \r
+at 267,19 size 3,11\r
+      \r
+      \r
+      \r
+      \r
+####  \r
+####  \r
+      \r
+####  \r
+####__\r
+      \r
+      \r
+at 275,19 size 3,11\r
+      \r
+      \r
+      \r
+      \r
+####  \r
+####  \r
+      \r
+####  \r
+####__\r
+####  \r
+##    \r
+at 282,19 size 8,11\r
+                \r
+                \r
+          ####  \r
+      ####      \r
+  ####          \r
+##              \r
+  ####          \r
+      ####      \r
+__________####__\r
+                \r
+                \r
+at 294,19 size 8,11\r
+                \r
+                \r
+                \r
+                \r
+##############  \r
+                \r
+                \r
+##############  \r
+________________\r
+                \r
+                \r
+at 306,19 size 8,11\r
+                \r
+                \r
+####            \r
+    ####        \r
+        ####    \r
+            ##  \r
+        ####    \r
+    ####        \r
+####____________\r
+                \r
+                \r
+at 317,19 size 6,11\r
+            \r
+            \r
+  ######    \r
+##    ####  \r
+      ####  \r
+    ####    \r
+  ####      \r
+            \r
+__####______\r
+            \r
+            \r
+at 8,43 size 9,10\r
+                  \r
+    ########      \r
+  ##        ##    \r
+##    ######  ##  \r
+##  ##    ##  ##  \r
+##  ##    ##  ##  \r
+##    ########    \r
+__##______________\r
+    ########      \r
+                  \r
+at 21,43 size 8,10\r
+                \r
+    ######      \r
+    ######      \r
+  ####  ####    \r
+  ####  ####    \r
+  ##########    \r
+####      ####  \r
+####______####__\r
+                \r
+                \r
+at 32,43 size 7,10\r
+              \r
+##########    \r
+####    ####  \r
+####    ####  \r
+##########    \r
+####    ####  \r
+####    ####  \r
+##########____\r
+              \r
+              \r
+at 43,43 size 6,10\r
+            \r
+  ######    \r
+####    ##  \r
+####        \r
+####        \r
+####        \r
+####    ##  \r
+__######____\r
+            \r
+            \r
+at 54,43 size 8,10\r
+                \r
+##########      \r
+####    ####    \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+####    ####    \r
+##########______\r
+                \r
+                \r
+at 66,43 size 6,10\r
+            \r
+##########  \r
+####        \r
+####        \r
+##########  \r
+####        \r
+####        \r
+##########__\r
+            \r
+            \r
+at 76,43 size 6,10\r
+            \r
+##########  \r
+####        \r
+####        \r
+##########  \r
+####        \r
+####        \r
+####________\r
+            \r
+            \r
+at 86,43 size 7,10\r
+              \r
+  ########    \r
+####      ##  \r
+####          \r
+####          \r
+####  ######  \r
+####    ####  \r
+__##########__\r
+              \r
+              \r
+at 97,43 size 7,10\r
+              \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+############  \r
+####    ####  \r
+####    ####  \r
+####____####__\r
+              \r
+              \r
+at 109,43 size 5,10\r
+          \r
+########  \r
+  ####    \r
+  ####    \r
+  ####    \r
+  ####    \r
+  ####    \r
+########__\r
+          \r
+          \r
+at 117,43 size 6,10\r
+            \r
+  ########  \r
+      ####  \r
+      ####  \r
+      ####  \r
+      ####  \r
+      ####  \r
+########____\r
+            \r
+            \r
+at 127,43 size 7,10\r
+              \r
+####    ####  \r
+####  ####    \r
+########      \r
+######        \r
+########      \r
+####  ####    \r
+####____####__\r
+              \r
+              \r
+at 138,43 size 6,10\r
+            \r
+####        \r
+####        \r
+####        \r
+####        \r
+####        \r
+####        \r
+##########__\r
+            \r
+            \r
+at 148,43 size 8,10\r
+                \r
+##          ##  \r
+####      ####  \r
+######  ######  \r
+##  ####  ####  \r
+##  ####  ####  \r
+##        ####  \r
+##________####__\r
+                \r
+                \r
+at 161,43 size 7,10\r
+              \r
+##        ##  \r
+####      ##  \r
+######    ##  \r
+##  ####  ##  \r
+##    ######  \r
+##      ####  \r
+##________##__\r
+              \r
+              \r
+at 173,43 size 8,10\r
+                \r
+  ##########    \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+__##########____\r
+                \r
+                \r
+at 185,43 size 7,10\r
+              \r
+##########    \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+##########    \r
+####          \r
+####__________\r
+              \r
+              \r
+at 195,43 size 8,10\r
+                \r
+  ##########    \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+__##########____\r
+      ####      \r
+        ######  \r
+at 207,43 size 8,10\r
+                \r
+##########      \r
+####    ####    \r
+####    ####    \r
+##########      \r
+####  ####      \r
+####    ####    \r
+####______####__\r
+                \r
+                \r
+at 219,43 size 6,10\r
+            \r
+  ######    \r
+####    ##  \r
+####        \r
+  ######    \r
+      ####  \r
+##    ####  \r
+__######____\r
+            \r
+            \r
+at 228,43 size 7,10\r
+              \r
+############  \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+____####______\r
+              \r
+              \r
+at 239,43 size 7,10\r
+              \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+__########____\r
+              \r
+              \r
+at 251,43 size 7,10\r
+              \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+  ########    \r
+  ########    \r
+  ########    \r
+____####______\r
+              \r
+              \r
+at 262,43 size 11,10\r
+                      \r
+####    ####    ####  \r
+####    ####    ####  \r
+  ####  ####  ####    \r
+  ####  ####  ####    \r
+  ######    ######    \r
+    ####    ####      \r
+____####____####______\r
+                      \r
+                      \r
+at 277,43 size 7,10\r
+              \r
+####    ####  \r
+####    ####  \r
+  ########    \r
+    ####      \r
+  ########    \r
+####    ####  \r
+####____####__\r
+              \r
+              \r
+at 288,43 size 7,10\r
+              \r
+####    ####  \r
+####    ####  \r
+  ########    \r
+    ####      \r
+    ####      \r
+    ####      \r
+____####______\r
+              \r
+              \r
+at 298,43 size 6,10\r
+            \r
+##########  \r
+      ####  \r
+    ####    \r
+  ####      \r
+####        \r
+####        \r
+##########__\r
+            \r
+            \r
+at 309,43 size 4,10\r
+######  \r
+####    \r
+####    \r
+####    \r
+####    \r
+####    \r
+####    \r
+####____\r
+####    \r
+######  \r
+at 318,43 size 6,10\r
+##          \r
+##          \r
+  ##        \r
+  ##        \r
+    ##      \r
+    ##      \r
+      ##    \r
+______##____\r
+        ##  \r
+        ##  \r
+at 328,43 size 4,10\r
+######  \r
+  ####  \r
+  ####  \r
+  ####  \r
+  ####  \r
+  ####  \r
+  ####  \r
+__####__\r
+  ####  \r
+######  \r
+at 337,43 size 8,10\r
+                \r
+      ##        \r
+    ######      \r
+  ####  ####    \r
+####      ####  \r
+                \r
+                \r
+________________\r
+                \r
+                \r
+at 348,43 size 8,10\r
+                \r
+                \r
+                \r
+                \r
+                \r
+                \r
+                \r
+________________\r
+                \r
+##############  \r
+at 9,67 size 4,10\r
+####    \r
+  ####  \r
+        \r
+        \r
+        \r
+        \r
+        \r
+________\r
+        \r
+        \r
+at 18,67 size 7,10\r
+              \r
+              \r
+              \r
+  ########    \r
+        ####  \r
+  ##########  \r
+####    ####  \r
+__##########__\r
+              \r
+              \r
+at 28,67 size 7,10\r
+####          \r
+####          \r
+####          \r
+##########    \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+##########____\r
+              \r
+              \r
+at 38,67 size 6,10\r
+            \r
+            \r
+            \r
+  ########  \r
+####        \r
+####        \r
+####        \r
+__########__\r
+            \r
+            \r
+at 47,67 size 7,10\r
+        ####  \r
+        ####  \r
+        ####  \r
+  ##########  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+__##########__\r
+              \r
+              \r
+at 58,67 size 7,10\r
+              \r
+              \r
+              \r
+  ########    \r
+####    ####  \r
+############  \r
+####          \r
+__##########__\r
+              \r
+              \r
+at 68,67 size 6,10\r
+    ######  \r
+  ####      \r
+  ####      \r
+##########  \r
+  ####      \r
+  ####      \r
+  ####      \r
+__####______\r
+            \r
+            \r
+at 75,67 size 7,10\r
+              \r
+              \r
+              \r
+  ##########  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+__##########__\r
+        ####  \r
+  ########    \r
+at 86,67 size 7,10\r
+####          \r
+####          \r
+####          \r
+##########    \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####____####__\r
+              \r
+              \r
+at 96,67 size 3,10\r
+      \r
+####  \r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+      \r
+      \r
+at 103,67 size 4,10\r
+        \r
+  ####  \r
+        \r
+######  \r
+  ####  \r
+  ####  \r
+  ####  \r
+__####__\r
+  ####  \r
+####    \r
+at 111,67 size 7,10\r
+####          \r
+####          \r
+####          \r
+####    ####  \r
+####  ####    \r
+########      \r
+####  ####    \r
+####____####__\r
+              \r
+              \r
+at 121,67 size 3,10\r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+      \r
+      \r
+at 128,67 size 11,10\r
+                      \r
+                      \r
+                      \r
+##########  ######    \r
+####    ####    ####  \r
+####    ####    ####  \r
+####    ####    ####  \r
+####____####____####__\r
+                      \r
+                      \r
+at 142,67 size 7,10\r
+              \r
+              \r
+              \r
+##########    \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####____####__\r
+              \r
+              \r
+at 152,67 size 7,10\r
+              \r
+              \r
+              \r
+  ########    \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+__########____\r
+              \r
+              \r
+at 162,67 size 7,10\r
+              \r
+              \r
+              \r
+##########    \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+##########____\r
+####          \r
+####          \r
+at 173,67 size 7,10\r
+              \r
+              \r
+              \r
+  ##########  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+__##########__\r
+        ####  \r
+        ####  \r
+at 183,67 size 6,10\r
+            \r
+            \r
+            \r
+####  ####  \r
+##########  \r
+####        \r
+####        \r
+####________\r
+            \r
+            \r
+at 192,67 size 6,10\r
+            \r
+            \r
+            \r
+  ########  \r
+####        \r
+##########  \r
+      ####  \r
+########____\r
+            \r
+            \r
+at 201,67 size 6,10\r
+            \r
+  ####      \r
+  ####      \r
+##########  \r
+  ####      \r
+  ####      \r
+  ####      \r
+____######__\r
+            \r
+            \r
+at 209,67 size 7,10\r
+              \r
+              \r
+              \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+__##########__\r
+              \r
+              \r
+at 220,67 size 7,10\r
+              \r
+              \r
+              \r
+####    ####  \r
+####    ####  \r
+  ########    \r
+  ########    \r
+____####______\r
+              \r
+              \r
+at 229,67 size 9,10\r
+                  \r
+                  \r
+                  \r
+####  ####  ####  \r
+####  ####  ####  \r
+####  ####  ####  \r
+  ####    ####    \r
+__####____####____\r
+                  \r
+                  \r
+at 243,67 size 7,10\r
+              \r
+              \r
+              \r
+####    ####  \r
+  ########    \r
+    ####      \r
+  ########    \r
+####____####__\r
+              \r
+              \r
+at 253,67 size 7,10\r
+              \r
+              \r
+              \r
+####    ####  \r
+####    ####  \r
+  ########    \r
+  ########    \r
+____####______\r
+    ####      \r
+  ####        \r
+at 263,67 size 6,10\r
+            \r
+            \r
+            \r
+##########  \r
+    ####    \r
+  ####      \r
+####        \r
+##########__\r
+            \r
+            \r
+at 273,67 size 6,10\r
+      ####  \r
+    ####    \r
+    ####    \r
+    ####    \r
+######      \r
+    ####    \r
+    ####    \r
+____####____\r
+    ####    \r
+      ####  \r
+at 285,67 size 2,10\r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+##  \r
+##  \r
+at 292,67 size 6,10\r
+####        \r
+  ####      \r
+  ####      \r
+  ####      \r
+    ######  \r
+  ####      \r
+  ####      \r
+__####______\r
+  ####      \r
+####        \r
+at 303,67 size 8,10\r
+                \r
+                \r
+                \r
+  ####      ##  \r
+##    ##    ##  \r
+##      ####    \r
+                \r
+________________\r
+                \r
+                \r
+at 317,67 size 8,10\r
+                \r
+                \r
+    ########    \r
+  ####      ##  \r
+##########      \r
+  ####          \r
+##########      \r
+__####______##__\r
+    ########    \r
+                \r
+at 330,67 size 7,10\r
+              \r
+              \r
+              \r
+      ####    \r
+  ##########  \r
+####          \r
+####          \r
+####__________\r
+  ##########  \r
+      ####    \r
diff --git a/src/font/set03.bmp b/src/font/set03.bmp
new file mode 100644 (file)
index 0000000..6b6ad7f
Binary files /dev/null and b/src/font/set03.bmp differ
diff --git a/src/font/set03.chs b/src/font/set03.chs
new file mode 100644 (file)
index 0000000..05c355b
Binary files /dev/null and b/src/font/set03.chs differ
diff --git a/src/font/set03.cmd b/src/font/set03.cmd
new file mode 100644 (file)
index 0000000..de811f1
Binary files /dev/null and b/src/font/set03.cmd differ
diff --git a/src/font/set03.txt b/src/font/set03.txt
new file mode 100644 (file)
index 0000000..49b686e
--- /dev/null
@@ -0,0 +1,1312 @@
+at 19,20 size 2,13\r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+    \r
+##  \r
+##__\r
+    \r
+    \r
+    \r
+at 28,20 size 4,13\r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+        \r
+        \r
+        \r
+        \r
+        \r
+________\r
+        \r
+        \r
+        \r
+at 38,20 size 9,13\r
+                  \r
+      ##    ##    \r
+      ##    ##    \r
+  ##############  \r
+    ##    ##      \r
+    ##    ##      \r
+##############    \r
+  ##    ##        \r
+  ##    ##        \r
+__________________\r
+                  \r
+                  \r
+                  \r
+at 54,20 size 7,13\r
+    ##        \r
+    ##        \r
+  ##########  \r
+##  ##        \r
+##  ##        \r
+  ####        \r
+    ######    \r
+    ##    ##  \r
+    ##    ##  \r
+##########____\r
+    ##        \r
+    ##        \r
+              \r
+at 66,20 size 12,13\r
+                        \r
+  ######        ##      \r
+##      ##    ##        \r
+##      ##  ##          \r
+##      ##  ##          \r
+  ######  ##  ######    \r
+        ##  ##      ##  \r
+        ##  ##      ##  \r
+      ##    ##      ##  \r
+____##________######____\r
+                        \r
+                        \r
+                        \r
+at 85,20 size 9,13\r
+                  \r
+  ######          \r
+##      ##        \r
+##      ##        \r
+##      ##        \r
+  ######      ##  \r
+##      ##  ##    \r
+##        ##      \r
+##      ####      \r
+__######____####__\r
+                  \r
+                  \r
+                  \r
+at 99,20 size 2,13\r
+##  \r
+##  \r
+##  \r
+##  \r
+    \r
+    \r
+    \r
+    \r
+    \r
+____\r
+    \r
+    \r
+    \r
+at 107,20 size 5,13\r
+      ##  \r
+    ##    \r
+  ##      \r
+  ##      \r
+##        \r
+##        \r
+##        \r
+##        \r
+##        \r
+__##______\r
+  ##      \r
+    ##    \r
+      ##  \r
+at 118,20 size 5,13\r
+##        \r
+  ##      \r
+    ##    \r
+    ##    \r
+      ##  \r
+      ##  \r
+      ##  \r
+      ##  \r
+      ##  \r
+____##____\r
+    ##    \r
+  ##      \r
+##        \r
+at 129,20 size 6,13\r
+    ##      \r
+##  ##  ##  \r
+  ######    \r
+##  ##  ##  \r
+    ##      \r
+            \r
+            \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+            \r
+at 141,20 size 8,13\r
+                \r
+                \r
+      ##        \r
+      ##        \r
+      ##        \r
+##############  \r
+      ##        \r
+      ##        \r
+      ##        \r
+________________\r
+                \r
+                \r
+                \r
+at 156,20 size 3,13\r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+  ##  \r
+__##__\r
+  ##  \r
+##    \r
+      \r
+at 165,20 size 6,13\r
+            \r
+            \r
+            \r
+            \r
+            \r
+##########  \r
+            \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+            \r
+at 177,20 size 2,13\r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+##  \r
+##__\r
+    \r
+    \r
+    \r
+at 184,20 size 7,13\r
+          ##  \r
+          ##  \r
+        ##    \r
+        ##    \r
+      ##      \r
+      ##      \r
+    ##        \r
+    ##        \r
+  ##          \r
+__##__________\r
+##            \r
+##            \r
+              \r
+at 196,20 size 7,13\r
+              \r
+  ########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 209,20 size 6,13\r
+            \r
+    ##      \r
+######      \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+##########__\r
+            \r
+            \r
+            \r
+at 221,20 size 7,13\r
+              \r
+  ########    \r
+##        ##  \r
+##        ##  \r
+          ##  \r
+        ##    \r
+    ####      \r
+  ##          \r
+##            \r
+############__\r
+              \r
+              \r
+              \r
+at 234,20 size 7,13\r
+              \r
+  ########    \r
+##        ##  \r
+          ##  \r
+          ##  \r
+    ######    \r
+          ##  \r
+          ##  \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 247,20 size 8,13\r
+                \r
+        ##      \r
+      ####      \r
+    ##  ##      \r
+  ##    ##      \r
+##      ##      \r
+##############  \r
+        ##      \r
+        ##      \r
+________##______\r
+                \r
+                \r
+                \r
+at 260,20 size 7,13\r
+              \r
+  ##########  \r
+  ##          \r
+  ##          \r
+  ##          \r
+  ########    \r
+          ##  \r
+          ##  \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 273,20 size 7,13\r
+              \r
+    ######    \r
+  ##          \r
+##            \r
+##########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 285,20 size 7,13\r
+              \r
+############  \r
+          ##  \r
+        ##    \r
+        ##    \r
+      ##      \r
+      ##      \r
+    ##        \r
+    ##        \r
+____##________\r
+              \r
+              \r
+              \r
+at 298,20 size 7,13\r
+              \r
+  ########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+  ########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 311,20 size 7,13\r
+              \r
+  ########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+  ##########  \r
+          ##  \r
+        ##    \r
+__######______\r
+              \r
+              \r
+              \r
+at 325,20 size 2,13\r
+    \r
+    \r
+    \r
+##  \r
+##  \r
+    \r
+    \r
+    \r
+##  \r
+##__\r
+    \r
+    \r
+    \r
+at 334,20 size 3,13\r
+      \r
+      \r
+      \r
+  ##  \r
+  ##  \r
+      \r
+      \r
+      \r
+  ##  \r
+__##__\r
+  ##  \r
+##    \r
+      \r
+at 345,20 size 8,13\r
+                \r
+                \r
+                \r
+          ####  \r
+      ####      \r
+  ####          \r
+##              \r
+  ####          \r
+      ####      \r
+__________####__\r
+                \r
+                \r
+                \r
+at 360,20 size 8,13\r
+                \r
+                \r
+                \r
+                \r
+##############  \r
+                \r
+                \r
+##############  \r
+                \r
+________________\r
+                \r
+                \r
+                \r
+at 375,20 size 8,13\r
+                \r
+                \r
+                \r
+####            \r
+    ####        \r
+        ####    \r
+            ##  \r
+        ####    \r
+    ####        \r
+####____________\r
+                \r
+                \r
+                \r
+at 391,20 size 6,13\r
+            \r
+  ######    \r
+##      ##  \r
+        ##  \r
+      ##    \r
+    ##      \r
+    ##      \r
+            \r
+    ##      \r
+____##______\r
+            \r
+            \r
+            \r
+at 9,51 size 12,12\r
+                        \r
+      ##########        \r
+    ##          ##      \r
+  ##    ########  ##    \r
+##    ##      ##    ##  \r
+##    ##      ##    ##  \r
+##    ##      ##    ##  \r
+##    ##      ##    ##  \r
+##    ##      ##    ##  \r
+__##____############____\r
+    ##                  \r
+      ##########        \r
+at 27,51 size 8,12\r
+                \r
+      ##        \r
+      ##        \r
+    ##  ##      \r
+    ##  ##      \r
+  ##      ##    \r
+  ##      ##    \r
+  ##########    \r
+##          ##  \r
+##__________##__\r
+                \r
+                \r
+at 40,51 size 7,12\r
+              \r
+########      \r
+##      ##    \r
+##      ##    \r
+##      ##    \r
+##########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##########____\r
+              \r
+              \r
+at 54,51 size 8,12\r
+                \r
+    ########    \r
+  ##        ##  \r
+##              \r
+##              \r
+##              \r
+##              \r
+##              \r
+  ##        ##  \r
+____########____\r
+                \r
+                \r
+at 67,51 size 8,12\r
+                \r
+##########      \r
+##        ##    \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##        ##    \r
+##########______\r
+                \r
+                \r
+at 82,51 size 7,12\r
+              \r
+############  \r
+##            \r
+##            \r
+##            \r
+############  \r
+##            \r
+##            \r
+##            \r
+############__\r
+              \r
+              \r
+at 95,51 size 7,12\r
+              \r
+############  \r
+##            \r
+##            \r
+##            \r
+##########    \r
+##            \r
+##            \r
+##            \r
+##____________\r
+              \r
+              \r
+at 107,51 size 8,12\r
+                \r
+    ########    \r
+  ##        ##  \r
+##              \r
+##              \r
+##              \r
+##      ######  \r
+##          ##  \r
+  ##        ##  \r
+____##########__\r
+                \r
+                \r
+at 121,51 size 8,12\r
+                \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##############  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##__________##__\r
+                \r
+                \r
+at 136,51 size 4,12\r
+        \r
+######  \r
+  ##    \r
+  ##    \r
+  ##    \r
+  ##    \r
+  ##    \r
+  ##    \r
+  ##    \r
+######__\r
+        \r
+        \r
+at 145,51 size 6,12\r
+            \r
+    ######  \r
+        ##  \r
+        ##  \r
+        ##  \r
+        ##  \r
+        ##  \r
+        ##  \r
+        ##  \r
+########____\r
+            \r
+            \r
+at 156,51 size 7,12\r
+              \r
+##        ##  \r
+##      ##    \r
+##    ##      \r
+##  ##        \r
+####          \r
+##  ##        \r
+##    ##      \r
+##      ##    \r
+##________##__\r
+              \r
+              \r
+at 170,51 size 7,12\r
+              \r
+##            \r
+##            \r
+##            \r
+##            \r
+##            \r
+##            \r
+##            \r
+##            \r
+############__\r
+              \r
+              \r
+at 181,51 size 10,12\r
+                    \r
+####          ####  \r
+####          ####  \r
+##  ##      ##  ##  \r
+##  ##      ##  ##  \r
+##    ##  ##    ##  \r
+##    ##  ##    ##  \r
+##      ##      ##  \r
+##      ##      ##  \r
+##______________##__\r
+                    \r
+                    \r
+at 197,51 size 8,12\r
+                \r
+####        ##  \r
+####        ##  \r
+##  ##      ##  \r
+##  ##      ##  \r
+##    ##    ##  \r
+##      ##  ##  \r
+##      ##  ##  \r
+##        ####  \r
+##________####__\r
+                \r
+                \r
+at 211,51 size 9,12\r
+                  \r
+    ########      \r
+  ##        ##    \r
+##            ##  \r
+##            ##  \r
+##            ##  \r
+##            ##  \r
+##            ##  \r
+  ##        ##    \r
+____########______\r
+                  \r
+                  \r
+at 226,51 size 7,12\r
+              \r
+##########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##########    \r
+##            \r
+##            \r
+##____________\r
+              \r
+              \r
+at 239,51 size 9,12\r
+                  \r
+    ########      \r
+  ##        ##    \r
+##            ##  \r
+##            ##  \r
+##            ##  \r
+##            ##  \r
+##            ##  \r
+  ##        ##    \r
+____########______\r
+          ##      \r
+            ####  \r
+at 253,51 size 8,12\r
+                \r
+##########      \r
+##        ##    \r
+##        ##    \r
+##        ##    \r
+##      ##      \r
+########        \r
+##      ##      \r
+##        ##    \r
+##__________##__\r
+                \r
+                \r
+at 267,51 size 8,12\r
+                \r
+  ##########    \r
+##          ##  \r
+##              \r
+##              \r
+  ##########    \r
+            ##  \r
+            ##  \r
+##          ##  \r
+__##########____\r
+                \r
+                \r
+at 280,51 size 8,12\r
+                \r
+##############  \r
+      ##        \r
+      ##        \r
+      ##        \r
+      ##        \r
+      ##        \r
+      ##        \r
+      ##        \r
+______##________\r
+                \r
+                \r
+at 293,51 size 8,12\r
+                \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+  ##      ##    \r
+____######______\r
+                \r
+                \r
+at 307,51 size 8,12\r
+                \r
+##          ##  \r
+##          ##  \r
+##          ##  \r
+  ##      ##    \r
+  ##      ##    \r
+    ##  ##      \r
+    ##  ##      \r
+      ##        \r
+______##________\r
+                \r
+                \r
+at 320,51 size 12,12\r
+                        \r
+##        ##        ##  \r
+##        ##        ##  \r
+##      ##  ##      ##  \r
+##      ##  ##      ##  \r
+  ##    ##  ##    ##    \r
+  ##  ##      ##  ##    \r
+  ##  ##      ##  ##    \r
+    ##          ##      \r
+____##__________##______\r
+                        \r
+                        \r
+at 338,51 size 8,12\r
+                \r
+##          ##  \r
+##          ##  \r
+  ##      ##    \r
+    ##  ##      \r
+      ##        \r
+    ##  ##      \r
+  ##      ##    \r
+##          ##  \r
+##__________##__\r
+                \r
+                \r
+at 351,51 size 8,12\r
+                \r
+##          ##  \r
+  ##      ##    \r
+  ##      ##    \r
+    ##  ##      \r
+    ##  ##      \r
+      ##        \r
+      ##        \r
+      ##        \r
+______##________\r
+                \r
+                \r
+at 364,51 size 8,12\r
+                \r
+##############  \r
+            ##  \r
+          ##    \r
+        ##      \r
+      ##        \r
+    ##          \r
+  ##            \r
+##              \r
+##############__\r
+                \r
+                \r
+at 378,51 size 4,12\r
+######  \r
+##      \r
+##      \r
+##      \r
+##      \r
+##      \r
+##      \r
+##      \r
+##      \r
+##______\r
+##      \r
+######  \r
+at 387,51 size 7,12\r
+##            \r
+##            \r
+  ##          \r
+  ##          \r
+    ##        \r
+    ##        \r
+      ##      \r
+      ##      \r
+        ##    \r
+________##____\r
+          ##  \r
+          ##  \r
+at 398,51 size 4,12\r
+######  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+____##__\r
+    ##  \r
+######  \r
+at 409,51 size 10,12\r
+                    \r
+        ##          \r
+      ##  ##        \r
+    ##      ##      \r
+  ##          ##    \r
+##              ##  \r
+                    \r
+                    \r
+                    \r
+____________________\r
+                    \r
+                    \r
+at 423,51 size 9,12\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+__________________\r
+                  \r
+################  \r
+at 11,84 size 3,13\r
+##    \r
+  ##  \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+______\r
+      \r
+      \r
+      \r
+at 22,84 size 7,13\r
+              \r
+              \r
+              \r
+  ########    \r
+          ##  \r
+          ##  \r
+  ##########  \r
+##        ##  \r
+##        ##  \r
+__##########__\r
+              \r
+              \r
+              \r
+at 34,84 size 7,13\r
+##            \r
+##            \r
+##            \r
+##  ######    \r
+####      ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##########____\r
+              \r
+              \r
+              \r
+at 47,84 size 7,13\r
+              \r
+              \r
+              \r
+  ########    \r
+##        ##  \r
+##            \r
+##            \r
+##            \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 58,84 size 7,13\r
+          ##  \r
+          ##  \r
+          ##  \r
+  ##########  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##      ####  \r
+__######__##__\r
+              \r
+              \r
+              \r
+at 71,84 size 7,13\r
+              \r
+              \r
+              \r
+  ########    \r
+##        ##  \r
+##        ##  \r
+############  \r
+##            \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 83,84 size 6,13\r
+    ######  \r
+  ##        \r
+  ##        \r
+########    \r
+  ##        \r
+  ##        \r
+  ##        \r
+  ##        \r
+  ##        \r
+__##________\r
+            \r
+            \r
+            \r
+at 92,84 size 7,13\r
+              \r
+              \r
+              \r
+  ##########  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##      ####  \r
+__######__##__\r
+          ##  \r
+          ##  \r
+  ########    \r
+at 105,84 size 7,13\r
+##            \r
+##            \r
+##            \r
+##  ######    \r
+####      ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##________##__\r
+              \r
+              \r
+              \r
+at 118,84 size 2,13\r
+##  \r
+    \r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+    \r
+    \r
+    \r
+at 125,84 size 4,13\r
+    ##  \r
+        \r
+        \r
+  ####  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+____##__\r
+    ##  \r
+    ##  \r
+####    \r
+at 135,84 size 6,13\r
+##          \r
+##          \r
+##          \r
+##      ##  \r
+##    ##    \r
+##  ##      \r
+####        \r
+##  ##      \r
+##    ##    \r
+##______##__\r
+            \r
+            \r
+            \r
+at 147,84 size 2,13\r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+    \r
+    \r
+    \r
+at 155,84 size 10,13\r
+                    \r
+                    \r
+                    \r
+##  ####    ####    \r
+####    ####    ##  \r
+##      ##      ##  \r
+##      ##      ##  \r
+##      ##      ##  \r
+##      ##      ##  \r
+##______##______##__\r
+                    \r
+                    \r
+                    \r
+at 173,84 size 7,13\r
+              \r
+              \r
+              \r
+##  ######    \r
+####      ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##________##__\r
+              \r
+              \r
+              \r
+at 185,84 size 7,13\r
+              \r
+              \r
+              \r
+  ########    \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+__########____\r
+              \r
+              \r
+              \r
+at 198,84 size 7,13\r
+              \r
+              \r
+              \r
+##  ######    \r
+####      ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##########____\r
+##            \r
+##            \r
+##            \r
+at 211,84 size 7,13\r
+              \r
+              \r
+              \r
+  ##########  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##      ####  \r
+__######__##__\r
+          ##  \r
+          ##  \r
+          ##  \r
+at 223,84 size 5,13\r
+          \r
+          \r
+          \r
+##  ####  \r
+####      \r
+##        \r
+##        \r
+##        \r
+##        \r
+##________\r
+          \r
+          \r
+          \r
+at 233,84 size 6,13\r
+            \r
+            \r
+            \r
+  ########  \r
+##          \r
+##          \r
+  ######    \r
+        ##  \r
+        ##  \r
+########____\r
+            \r
+            \r
+            \r
+at 245,84 size 5,13\r
+          \r
+  ##      \r
+  ##      \r
+########  \r
+  ##      \r
+  ##      \r
+  ##      \r
+  ##      \r
+  ##      \r
+____####__\r
+          \r
+          \r
+          \r
+at 254,84 size 7,13\r
+              \r
+              \r
+              \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##        ##  \r
+##      ####  \r
+__######__##__\r
+              \r
+              \r
+              \r
+at 267,84 size 7,13\r
+              \r
+              \r
+              \r
+##        ##  \r
+##        ##  \r
+  ##    ##    \r
+  ##    ##    \r
+  ##    ##    \r
+    ####      \r
+____####______\r
+              \r
+              \r
+              \r
+at 279,84 size 10,13\r
+                    \r
+                    \r
+                    \r
+##      ##      ##  \r
+##      ##      ##  \r
+  ##  ##  ##  ##    \r
+  ##  ##  ##  ##    \r
+  ##  ##  ##  ##    \r
+    ##      ##      \r
+____##______##______\r
+                    \r
+                    \r
+                    \r
+at 295,84 size 6,13\r
+            \r
+            \r
+            \r
+##      ##  \r
+##      ##  \r
+  ##  ##    \r
+    ##      \r
+  ##  ##    \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+            \r
+at 307,84 size 7,13\r
+              \r
+              \r
+              \r
+##        ##  \r
+##        ##  \r
+  ##    ##    \r
+  ##    ##    \r
+  ##    ##    \r
+    ####      \r
+____####______\r
+    ##        \r
+    ##        \r
+  ##          \r
+at 319,84 size 6,13\r
+            \r
+            \r
+            \r
+##########  \r
+        ##  \r
+      ##    \r
+    ##      \r
+  ##        \r
+##          \r
+##########__\r
+            \r
+            \r
+            \r
+at 331,84 size 6,13\r
+      ####  \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+####        \r
+    ##      \r
+    ##      \r
+    ##      \r
+____##______\r
+    ##      \r
+      ####  \r
+            \r
+at 345,84 size 2,13\r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+##  \r
+##  \r
+    \r
+at 355,84 size 6,13\r
+####        \r
+    ##      \r
+    ##      \r
+    ##      \r
+    ##      \r
+      ####  \r
+    ##      \r
+    ##      \r
+    ##      \r
+____##______\r
+    ##      \r
+####        \r
+            \r
+at 367,84 size 9,13\r
+                  \r
+                  \r
+                  \r
+                  \r
+  ####        ##  \r
+##    ####    ##  \r
+##        ####    \r
+                  \r
+                  \r
+__________________\r
+                  \r
+                  \r
+                  \r
+at 383,84 size 10,13\r
+                    \r
+        ########    \r
+      ##        ##  \r
+    ##              \r
+##############      \r
+    ##              \r
+##############      \r
+    ##              \r
+      ##        ##  \r
+________########____\r
+                    \r
+                    \r
+                    \r
+at 400,84 size 7,13\r
+              \r
+      ##      \r
+      ##      \r
+  ########    \r
+##        ##  \r
+##            \r
+##            \r
+##            \r
+##        ##  \r
+__########____\r
+      ##      \r
+      ##      \r
+              \r
diff --git a/src/font/set04.bmp b/src/font/set04.bmp
new file mode 100644 (file)
index 0000000..2d5f953
Binary files /dev/null and b/src/font/set04.bmp differ
diff --git a/src/font/set04.chs b/src/font/set04.chs
new file mode 100644 (file)
index 0000000..0956164
Binary files /dev/null and b/src/font/set04.chs differ
diff --git a/src/font/set04.cmd b/src/font/set04.cmd
new file mode 100644 (file)
index 0000000..0f1d269
Binary files /dev/null and b/src/font/set04.cmd differ
diff --git a/src/font/set04.txt b/src/font/set04.txt
new file mode 100644 (file)
index 0000000..f7e1cb6
--- /dev/null
@@ -0,0 +1,1665 @@
+at 25,25 size 3,16\r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+      \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+at 36,25 size 6,16\r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+            \r
+at 50,25 size 12,16\r
+                        \r
+          ##    ##      \r
+          ##    ##      \r
+        ##    ##        \r
+  ####################  \r
+        ##    ##        \r
+        ##    ##        \r
+      ##    ##          \r
+      ##    ##          \r
+####################    \r
+      ##    ##          \r
+    ##    ##            \r
+____##____##____________\r
+                        \r
+                        \r
+                        \r
+at 69,25 size 10,16\r
+        ##          \r
+        ##          \r
+    ##############  \r
+  ####  ##      ##  \r
+####    ##          \r
+####    ##          \r
+######  ##          \r
+    ############    \r
+        ##  ######  \r
+        ##    ####  \r
+        ##    ####  \r
+##      ##  ####    \r
+##############______\r
+        ##          \r
+        ##          \r
+        ##          \r
+at 86,25 size 17,16\r
+                                  \r
+  ########          ####          \r
+####    ####        ##            \r
+####    ####      ####            \r
+####    ####      ##              \r
+####    ####    ####              \r
+####    ####    ##    ########    \r
+  ########    ##    ####    ####  \r
+            ####    ####    ####  \r
+            ##      ####    ####  \r
+          ####      ####    ####  \r
+          ##        ####    ####  \r
+________####__________########____\r
+                                  \r
+                                  \r
+                                  \r
+at 110,25 size 13,16\r
+                          \r
+    ########              \r
+  ####    ####            \r
+  ####    ####            \r
+  ####    ####            \r
+    ########              \r
+    ######      ####      \r
+  ####  ####    ####      \r
+####      ####  ####      \r
+####        ######        \r
+####          ######      \r
+  ####      ####  ####    \r
+____########________####__\r
+                          \r
+                          \r
+                          \r
+at 129,25 size 3,16\r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+______\r
+      \r
+      \r
+      \r
+at 139,25 size 6,16\r
+      ####  \r
+    ####    \r
+  ####      \r
+  ####      \r
+######      \r
+####        \r
+####        \r
+####        \r
+####        \r
+####        \r
+####        \r
+######      \r
+__####______\r
+  ####      \r
+    ####    \r
+      ####  \r
+at 153,25 size 6,16\r
+####        \r
+  ####      \r
+    ####    \r
+    ####    \r
+    ######  \r
+      ####  \r
+      ####  \r
+      ####  \r
+      ####  \r
+      ####  \r
+      ####  \r
+    ######  \r
+____####____\r
+    ####    \r
+  ####      \r
+####        \r
+at 168,25 size 8,16\r
+      ##        \r
+##    ##    ##  \r
+  ##  ##  ##    \r
+    ######      \r
+    ######      \r
+  ##  ##  ##    \r
+##    ##    ##  \r
+      ##        \r
+                \r
+                \r
+                \r
+                \r
+________________\r
+                \r
+                \r
+                \r
+at 183,25 size 12,16\r
+                        \r
+                        \r
+          ##            \r
+          ##            \r
+          ##            \r
+          ##            \r
+          ##            \r
+######################  \r
+          ##            \r
+          ##            \r
+          ##            \r
+          ##            \r
+__________##____________\r
+                        \r
+                        \r
+                        \r
+at 203,25 size 5,16\r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+  ######  \r
+__####____\r
+  ####    \r
+####      \r
+####      \r
+at 215,25 size 6,16\r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+##########  \r
+            \r
+            \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+            \r
+at 230,25 size 3,16\r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+at 240,25 size 8,16\r
+          ####  \r
+          ####  \r
+        ####    \r
+        ####    \r
+        ####    \r
+      ####      \r
+      ####      \r
+      ####      \r
+    ####        \r
+    ####        \r
+    ####        \r
+  ####          \r
+__####__________\r
+  ####          \r
+####            \r
+####            \r
+at 255,25 size 10,16\r
+                    \r
+    ##########      \r
+  ####      ####    \r
+  ##          ##    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ##          ##    \r
+  ####      ####    \r
+____##########______\r
+                    \r
+                    \r
+                    \r
+at 273,25 size 9,16\r
+                  \r
+      ####        \r
+      ####        \r
+##########        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+################__\r
+                  \r
+                  \r
+                  \r
+at 289,25 size 10,16\r
+                    \r
+  ##########        \r
+####      ####      \r
+##          ####    \r
+            ####    \r
+            ####    \r
+          ####      \r
+        ######      \r
+      ######        \r
+    ######          \r
+  ######            \r
+####                \r
+##################__\r
+                    \r
+                    \r
+                    \r
+at 305,25 size 10,16\r
+                    \r
+  ############      \r
+####        ######  \r
+##            ####  \r
+              ####  \r
+            ####    \r
+      ######        \r
+            ####    \r
+              ####  \r
+              ####  \r
+##            ####  \r
+####        ####    \r
+__############______\r
+                    \r
+                    \r
+                    \r
+at 322,25 size 11,16\r
+                      \r
+            ####      \r
+          ######      \r
+        ##  ####      \r
+      ##    ####      \r
+    ####    ####      \r
+  ####      ####      \r
+####        ####      \r
+##          ####      \r
+####################  \r
+            ####      \r
+            ####      \r
+____________####______\r
+                      \r
+                      \r
+                      \r
+at 340,25 size 9,16\r
+                  \r
+  ##############  \r
+  ####            \r
+  ####            \r
+  ####            \r
+  ##########      \r
+          ####    \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+##        ####    \r
+############______\r
+                  \r
+                  \r
+                  \r
+at 356,25 size 10,16\r
+                    \r
+        ########    \r
+    ####            \r
+  ####              \r
+  ##                \r
+####  ########      \r
+######      ####    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ##          ####  \r
+  ####      ####    \r
+____##########______\r
+                    \r
+                    \r
+                    \r
+at 372,25 size 9,16\r
+                  \r
+################  \r
+            ####  \r
+          ####    \r
+          ####    \r
+        ####      \r
+        ####      \r
+      ######      \r
+      ####        \r
+      ####        \r
+    ####          \r
+    ####          \r
+__####____________\r
+                  \r
+                  \r
+                  \r
+at 389,25 size 10,16\r
+                    \r
+    ##########      \r
+  ####      ####    \r
+####          ####  \r
+####          ####  \r
+  ####      ####    \r
+    ##########      \r
+  ####    ######    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ####      ####    \r
+____##########______\r
+                    \r
+                    \r
+                    \r
+at 406,25 size 10,16\r
+                    \r
+    ##########      \r
+  ####      ####    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ####      ######  \r
+    ########  ####  \r
+              ##    \r
+            ####    \r
+          ####      \r
+__########__________\r
+                    \r
+                    \r
+                    \r
+at 425,25 size 3,16\r
+      \r
+      \r
+      \r
+      \r
+####  \r
+####  \r
+      \r
+      \r
+      \r
+      \r
+      \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+at 438,25 size 5,16\r
+          \r
+          \r
+          \r
+          \r
+  ####    \r
+  ####    \r
+          \r
+          \r
+          \r
+          \r
+          \r
+  ######  \r
+__####____\r
+  ####    \r
+####      \r
+####      \r
+at 451,25 size 11,16\r
+                      \r
+                      \r
+                ####  \r
+            ####      \r
+        ####          \r
+    ####              \r
+####                  \r
+####                  \r
+    ####              \r
+        ####          \r
+            ####      \r
+                ####  \r
+______________________\r
+                      \r
+                      \r
+                      \r
+at 471,25 size 11,16\r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+####################  \r
+                      \r
+                      \r
+####################  \r
+                      \r
+                      \r
+                      \r
+______________________\r
+                      \r
+                      \r
+                      \r
+at 491,25 size 11,16\r
+                      \r
+                      \r
+####                  \r
+    ####              \r
+        ####          \r
+            ####      \r
+                ####  \r
+                ####  \r
+            ####      \r
+        ####          \r
+    ####              \r
+####                  \r
+______________________\r
+                      \r
+                      \r
+                      \r
+at 510,25 size 8,16\r
+                \r
+##########      \r
+##      ######  \r
+          ####  \r
+          ####  \r
+        ######  \r
+      ######    \r
+    ######      \r
+    ####        \r
+    ####        \r
+                \r
+    ####        \r
+____####________\r
+                \r
+                \r
+                \r
+at 11,65 size 15,16\r
+                              \r
+        ############          \r
+      ####        ######      \r
+    ####              ####    \r
+  ####    ##########  ####    \r
+####    ####    ####    ####  \r
+####  ####      ####    ####  \r
+####  ####      ####    ####  \r
+####  ####      ####    ####  \r
+####  ####      ####    ####  \r
+####  ####    ######    ##    \r
+  ####  ######  ##########    \r
+__######______________________\r
+    ######                    \r
+        ############          \r
+                              \r
+at 33,65 size 13,16\r
+                          \r
+          ####            \r
+        ########          \r
+        ########          \r
+      ####    ####        \r
+      ####    ####        \r
+      ####    ####        \r
+    ####        ####      \r
+    ################      \r
+  ####            ####    \r
+  ####            ####    \r
+  ####            ####    \r
+####________________####__\r
+                          \r
+                          \r
+                          \r
+at 53,65 size 10,16\r
+                    \r
+##############      \r
+####        ####    \r
+####        ####    \r
+####        ####    \r
+####      ####      \r
+##############      \r
+####        ####    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####        ####    \r
+##############______\r
+                    \r
+                    \r
+                    \r
+at 69,65 size 11,16\r
+                      \r
+      ############    \r
+    ####        ####  \r
+  ####            ##  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+  ####            ##  \r
+    ####        ####  \r
+______############____\r
+                      \r
+                      \r
+                      \r
+at 88,65 size 11,16\r
+                      \r
+##############        \r
+####        ####      \r
+####          ####    \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####          ####    \r
+####        ####      \r
+##############________\r
+                      \r
+                      \r
+                      \r
+at 107,65 size 9,16\r
+                  \r
+################  \r
+####              \r
+####              \r
+####              \r
+####              \r
+################  \r
+####              \r
+####              \r
+####              \r
+####              \r
+####              \r
+################__\r
+                  \r
+                  \r
+                  \r
+at 124,65 size 9,16\r
+                  \r
+################  \r
+####              \r
+####              \r
+####              \r
+####              \r
+##############    \r
+####              \r
+####              \r
+####              \r
+####              \r
+####              \r
+####______________\r
+                  \r
+                  \r
+                  \r
+at 139,65 size 12,16\r
+                        \r
+        ############    \r
+    ####          ####  \r
+  ####              ##  \r
+####                    \r
+####                    \r
+####                    \r
+####        ##########  \r
+####              ####  \r
+####              ####  \r
+  ####            ####  \r
+    ####          ####  \r
+______############______\r
+                        \r
+                        \r
+                        \r
+at 159,65 size 10,16\r
+                    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+##################  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####__________####__\r
+                    \r
+                    \r
+                    \r
+at 177,65 size 7,16\r
+              \r
+############  \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+############__\r
+              \r
+              \r
+              \r
+at 189,65 size 7,16\r
+              \r
+    ########  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+########______\r
+              \r
+              \r
+              \r
+at 204,65 size 11,16\r
+                      \r
+####          ####    \r
+####        ####      \r
+####      ####        \r
+####    ####          \r
+####  ####            \r
+########              \r
+##########            \r
+####    ####          \r
+####    ######        \r
+####      ######      \r
+####        ######    \r
+####__________######__\r
+                      \r
+                      \r
+                      \r
+at 222,65 size 8,16\r
+                \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+##############__\r
+                \r
+                \r
+                \r
+at 238,65 size 11,16\r
+                      \r
+######        ######  \r
+######        ######  \r
+######        ######  \r
+####  ##    ##  ####  \r
+####  ##    ##  ####  \r
+####  ####  ##  ####  \r
+####    ####    ####  \r
+####    ####    ####  \r
+####    ####    ####  \r
+####            ####  \r
+####            ####  \r
+####____________####__\r
+                      \r
+                      \r
+                      \r
+at 258,65 size 10,16\r
+                    \r
+######        ####  \r
+######        ####  \r
+####  ##      ####  \r
+####  ##      ####  \r
+####  ####    ####  \r
+####    ##    ####  \r
+####    ####  ####  \r
+####      ##  ####  \r
+####      ##  ####  \r
+####        ######  \r
+####        ######  \r
+####________######__\r
+                    \r
+                    \r
+                    \r
+at 276,65 size 12,16\r
+                        \r
+      ##########        \r
+    ####      ####      \r
+  ####          ####    \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+  ####          ####    \r
+    ####      ####      \r
+______##########________\r
+                        \r
+                        \r
+                        \r
+at 296,65 size 8,16\r
+                \r
+##########      \r
+####    ####    \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+####      ####  \r
+####    ####    \r
+##########      \r
+####            \r
+####            \r
+####            \r
+####____________\r
+                \r
+                \r
+                \r
+at 311,65 size 12,16\r
+                        \r
+      ##########        \r
+    ####      ####      \r
+  ####          ####    \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+  ####          ####    \r
+    ####      ####      \r
+______##########________\r
+            ####        \r
+            ####        \r
+              ########  \r
+at 331,65 size 11,16\r
+                      \r
+############          \r
+####      ######      \r
+####        ####      \r
+####        ####      \r
+####        ####      \r
+####      ####        \r
+############          \r
+####    ####          \r
+####      ####        \r
+####        ####      \r
+####          ####    \r
+####__________######__\r
+                      \r
+                      \r
+                      \r
+at 348,65 size 11,16\r
+                      \r
+    ############      \r
+  ####        ####    \r
+####            ##    \r
+####                  \r
+######                \r
+  ############        \r
+      ############    \r
+              ######  \r
+                ####  \r
+##              ####  \r
+####          ####    \r
+__##############______\r
+                      \r
+                      \r
+                      \r
+at 365,65 size 11,16\r
+                      \r
+####################  \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+________####__________\r
+                      \r
+                      \r
+                      \r
+at 382,65 size 11,16\r
+                      \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+  ####        ####    \r
+____############______\r
+                      \r
+                      \r
+                      \r
+at 400,65 size 13,16\r
+                          \r
+####                ####  \r
+  ##                ##    \r
+  ####            ####    \r
+  ####            ####    \r
+    ####        ####      \r
+    ####        ####      \r
+      ##        ##        \r
+      ####    ####        \r
+      ####    ####        \r
+        ########          \r
+        ########          \r
+__________####____________\r
+                          \r
+                          \r
+                          \r
+at 418,65 size 16,16\r
+                                \r
+####          ##          ####  \r
+####        ######        ####  \r
+  ####      ##  ##      ####    \r
+  ####      ##  ##      ####    \r
+  ####      ##  ##      ####    \r
+  ####    ####  ####    ####    \r
+    ##    ##      ##    ##      \r
+    ####  ##      ##  ####      \r
+    ####  ##      ##  ####      \r
+      ######      ########      \r
+      ####          ####        \r
+______####__________####________\r
+                                \r
+                                \r
+                                \r
+at 441,65 size 11,16\r
+                      \r
+######        ######  \r
+  ####        ####    \r
+    ####    ####      \r
+    ####    ####      \r
+      ########        \r
+        ####          \r
+        ####          \r
+      ########        \r
+    ####    ####      \r
+    ####    ####      \r
+  ####        ####    \r
+######________######__\r
+                      \r
+                      \r
+                      \r
+at 458,65 size 11,16\r
+                      \r
+######        ######  \r
+  ####        ####    \r
+  ######    ######    \r
+    ####    ####      \r
+      ########        \r
+      ########        \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+________####__________\r
+                      \r
+                      \r
+                      \r
+at 475,65 size 11,16\r
+                      \r
+####################  \r
+              ######  \r
+              ####    \r
+            ####      \r
+          ####        \r
+        ####          \r
+        ####          \r
+      ####            \r
+    ####              \r
+  ####                \r
+######                \r
+####################__\r
+                      \r
+                      \r
+                      \r
+at 494,65 size 5,16\r
+########  \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####      \r
+####______\r
+####      \r
+####      \r
+########  \r
+at 507,65 size 8,16\r
+####            \r
+####            \r
+  ####          \r
+  ####          \r
+  ####          \r
+    ####        \r
+    ####        \r
+    ####        \r
+      ####      \r
+      ####      \r
+      ####      \r
+        ####    \r
+________####____\r
+        ####    \r
+          ####  \r
+          ####  \r
+at 520,65 size 5,16\r
+########  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+____####__\r
+    ####  \r
+    ####  \r
+########  \r
+at 535,65 size 12,16\r
+                        \r
+          ##            \r
+        ######          \r
+      ####  ####        \r
+    ####      ####      \r
+    ##          ##      \r
+  ####          ####    \r
+####              ####  \r
+                        \r
+                        \r
+                        \r
+                        \r
+________________________\r
+                        \r
+                        \r
+                        \r
+at 553,65 size 12,16\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+________________________\r
+                        \r
+                        \r
+######################  \r
+at 13,105 size 5,17\r
+######    \r
+  ####    \r
+    ####  \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+          \r
+__________\r
+          \r
+          \r
+          \r
+at 27,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+  ############    \r
+  ##        ####  \r
+            ####  \r
+    ############  \r
+  ####      ####  \r
+####        ####  \r
+####        ####  \r
+####      ######  \r
+__########__####__\r
+                  \r
+                  \r
+                  \r
+at 44,105 size 10,17\r
+                    \r
+####                \r
+####                \r
+####                \r
+####                \r
+####  ########      \r
+######      ####    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####        ####    \r
+##############______\r
+                    \r
+                    \r
+                    \r
+at 60,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+    ############  \r
+  ####        ##  \r
+####              \r
+####              \r
+####              \r
+####              \r
+####              \r
+  ####      ####  \r
+____##########____\r
+                  \r
+                  \r
+                  \r
+at 74,105 size 10,17\r
+                    \r
+              ####  \r
+              ####  \r
+              ####  \r
+              ####  \r
+    ##############  \r
+  ####        ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ####      ######  \r
+____########__####__\r
+                    \r
+                    \r
+                    \r
+at 91,105 size 10,17\r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+    ##########      \r
+  ####      ####    \r
+####          ####  \r
+####          ####  \r
+##################  \r
+####                \r
+####                \r
+  ####          ##  \r
+______############__\r
+                    \r
+                    \r
+                    \r
+at 107,105 size 7,17\r
+              \r
+    ########  \r
+  ####        \r
+  ####        \r
+  ####        \r
+##########    \r
+  ####        \r
+  ####        \r
+  ####        \r
+  ####        \r
+  ####        \r
+  ####        \r
+  ####        \r
+__####________\r
+              \r
+              \r
+              \r
+at 119,105 size 10,17\r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+    ##############  \r
+  ####        ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ####      ######  \r
+____########__####__\r
+              ####  \r
+  ##        ####    \r
+  ############      \r
+at 137,105 size 9,17\r
+                  \r
+####              \r
+####              \r
+####              \r
+####              \r
+####  ########    \r
+######      ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####________####__\r
+                  \r
+                  \r
+                  \r
+at 153,105 size 3,17\r
+      \r
+      \r
+####  \r
+####  \r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+at 163,105 size 5,17\r
+          \r
+          \r
+    ####  \r
+    ####  \r
+          \r
+  ######  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+    ####  \r
+____####__\r
+    ####  \r
+    ####  \r
+######    \r
+at 176,105 size 10,17\r
+                    \r
+####                \r
+####                \r
+####                \r
+####                \r
+####        ####    \r
+####      ####      \r
+####    ####        \r
+####  ####          \r
+##########          \r
+############        \r
+####    ######      \r
+####      ######    \r
+####________######__\r
+                    \r
+                    \r
+                    \r
+at 192,105 size 3,17\r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+at 202,105 size 15,17\r
+                              \r
+                              \r
+                              \r
+                              \r
+                              \r
+####  ########    ########    \r
+######      ######      ####  \r
+####        ####        ####  \r
+####        ####        ####  \r
+####        ####        ####  \r
+####        ####        ####  \r
+####        ####        ####  \r
+####        ####        ####  \r
+####________####________####__\r
+                              \r
+                              \r
+                              \r
+at 225,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+####  ########    \r
+######      ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####________####__\r
+                  \r
+                  \r
+                  \r
+at 241,105 size 10,17\r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+    ##########      \r
+  ####      ####    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ####      ####    \r
+____##########______\r
+                    \r
+                    \r
+                    \r
+at 258,105 size 10,17\r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+####  ########      \r
+######      ####    \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####        ####    \r
+##############______\r
+####                \r
+####                \r
+####                \r
+at 274,105 size 10,17\r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+    ##############  \r
+  ####        ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+####          ####  \r
+  ####      ######  \r
+____########__####__\r
+              ####  \r
+              ####  \r
+              ####  \r
+at 291,105 size 7,17\r
+              \r
+              \r
+              \r
+              \r
+              \r
+####  ######  \r
+######        \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####__________\r
+              \r
+              \r
+              \r
+at 303,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+    ##########    \r
+  ####      ####  \r
+####          ##  \r
+######            \r
+  ############    \r
+          ######  \r
+##          ####  \r
+####      ####    \r
+__##########______\r
+                  \r
+                  \r
+                  \r
+at 318,105 size 8,17\r
+                \r
+                \r
+  ####          \r
+  ####          \r
+  ####          \r
+##############  \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+____##########__\r
+                \r
+                \r
+                \r
+at 332,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####        ####  \r
+####      ######  \r
+__########__####__\r
+                  \r
+                  \r
+                  \r
+at 349,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+####        ####  \r
+  ####    ####    \r
+  ####    ####    \r
+  ####    ####    \r
+    ##    ##      \r
+    ########      \r
+    ########      \r
+      ####        \r
+______####________\r
+                  \r
+                  \r
+                  \r
+at 365,105 size 13,17\r
+                          \r
+                          \r
+                          \r
+                          \r
+                          \r
+####      ####      ####  \r
+####      ####      ####  \r
+  ##      ####      ##    \r
+  ####  ########  ####    \r
+  ####  ##    ##  ####    \r
+  ####  ##    ##  ####    \r
+    ######    ######      \r
+    ####        ####      \r
+____####________####______\r
+                          \r
+                          \r
+                          \r
+at 385,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+######    ######  \r
+  ####    ####    \r
+    ########      \r
+    ######        \r
+      ####        \r
+    ########      \r
+    ########      \r
+  ####    ####    \r
+######____######__\r
+                  \r
+                  \r
+                  \r
+at 401,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+                  \r
+                  \r
+####        ####  \r
+  ####    ####    \r
+  ####    ####    \r
+  ####    ####    \r
+    ##    ##      \r
+    ########      \r
+      ####        \r
+      ####        \r
+______####________\r
+      ##          \r
+    ####          \r
+  ####            \r
+at 417,105 size 8,17\r
+                \r
+                \r
+                \r
+                \r
+                \r
+##############  \r
+          ####  \r
+        ####    \r
+      ####      \r
+      ##        \r
+    ####        \r
+  ####          \r
+####            \r
+##############__\r
+                \r
+                \r
+                \r
+at 433,105 size 9,17\r
+                  \r
+        ########  \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+    ####          \r
+######            \r
+    ####          \r
+      ####        \r
+      ####        \r
+      ####        \r
+______####________\r
+      ####        \r
+      ####        \r
+        ########  \r
+at 450,105 size 3,17\r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+####  \r
+####  \r
+####  \r
+at 462,105 size 9,17\r
+                  \r
+########          \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+        ####      \r
+          ######  \r
+        ####      \r
+      ####        \r
+      ####        \r
+      ####        \r
+______####________\r
+      ####        \r
+      ####        \r
+########          \r
+at 480,105 size 12,17\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+    ######        ####  \r
+  ####    ##      ####  \r
+####      ##    ####    \r
+####        ######      \r
+                        \r
+                        \r
+                        \r
+________________________\r
+                        \r
+                        \r
+                        \r
+at 501,105 size 11,17\r
+                      \r
+                      \r
+        ##########    \r
+      ####      ####  \r
+    ####              \r
+    ####              \r
+##############        \r
+    ####              \r
+    ####              \r
+##############        \r
+    ####              \r
+    ####              \r
+      ####      ####  \r
+________##########____\r
+                      \r
+                      \r
+                      \r
+at 516,105 size 9,17\r
+                  \r
+                  \r
+                  \r
+        ####      \r
+        ####      \r
+    ############  \r
+  ####        ##  \r
+####              \r
+####              \r
+####              \r
+####              \r
+####              \r
+  ####      ####  \r
+____##########____\r
+        ####      \r
+        ####      \r
+                  \r
diff --git a/src/font/set05.bmp b/src/font/set05.bmp
new file mode 100644 (file)
index 0000000..ef53425
Binary files /dev/null and b/src/font/set05.bmp differ
diff --git a/src/font/set05.chs b/src/font/set05.chs
new file mode 100644 (file)
index 0000000..06ca0fb
Binary files /dev/null and b/src/font/set05.chs differ
diff --git a/src/font/set05.cmd b/src/font/set05.cmd
new file mode 100644 (file)
index 0000000..c365d83
Binary files /dev/null and b/src/font/set05.cmd differ
diff --git a/src/font/set05.txt b/src/font/set05.txt
new file mode 100644 (file)
index 0000000..1739a51
--- /dev/null
@@ -0,0 +1,2145 @@
+at 32,42 size 3,21\r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+      \r
+      \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+      \r
+at 48,42 size 7,21\r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+####    ####  \r
+              \r
+              \r
+              \r
+              \r
+              \r
+              \r
+              \r
+              \r
+              \r
+              \r
+______________\r
+              \r
+              \r
+              \r
+              \r
+at 66,42 size 15,21\r
+                              \r
+            ##        ##      \r
+            ##        ##      \r
+          ##        ##        \r
+          ##        ##        \r
+          ##        ##        \r
+  ##########################  \r
+        ##        ##          \r
+        ##        ##          \r
+        ##        ##          \r
+        ##        ##          \r
+##########################    \r
+      ##        ##            \r
+      ##        ##            \r
+      ##        ##            \r
+    ##        ##              \r
+____##________##______________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 90,42 size 12,21\r
+          ##            \r
+          ##            \r
+          ##            \r
+      ############      \r
+  ##################    \r
+######    ##      ##    \r
+####      ##            \r
+####      ##            \r
+######    ##            \r
+  ##############        \r
+        ############    \r
+          ##    ######  \r
+          ##      ####  \r
+          ##      ####  \r
+####      ##    ######  \r
+####################    \r
+__##############________\r
+          ##            \r
+          ##            \r
+          ##            \r
+          ##            \r
+at 113,42 size 21,21\r
+                                          \r
+    ########              ####            \r
+  ############          ####              \r
+######    ######        ####              \r
+####        ####      ####                \r
+####        ####      ####                \r
+####        ####    ####                  \r
+######    ######    ####                  \r
+  ############    ####      ########      \r
+    ########      ####    ############    \r
+                ####    ######    ######  \r
+                ####    ####        ####  \r
+              ####      ####        ####  \r
+              ####      ####        ####  \r
+            ####        ######    ######  \r
+            ####          ############    \r
+__________####______________########______\r
+                                          \r
+                                          \r
+                                          \r
+                                          \r
+at 144,42 size 17,21\r
+                                  \r
+      ##########                  \r
+    ##############                \r
+  ######      ######              \r
+  ####          ####              \r
+  ####          ####              \r
+    ####      ####                \r
+      ##########      ####        \r
+    ##########        ####        \r
+  ####      ####      ####        \r
+####          ######  ####        \r
+####            ########          \r
+####              ######          \r
+####              ########        \r
+########        ############      \r
+  ################      ######    \r
+______##########__________######__\r
+                                  \r
+                                  \r
+                                  \r
+                                  \r
+at 168,42 size 3,21\r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+      \r
+______\r
+      \r
+      \r
+      \r
+      \r
+at 182,42 size 7,21\r
+      ######  \r
+      ####    \r
+    ####      \r
+    ####      \r
+  ####        \r
+  ####        \r
+######        \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+######        \r
+  ####        \r
+__####________\r
+    ####      \r
+    ####      \r
+      ####    \r
+      ######  \r
+at 200,42 size 7,21\r
+######        \r
+  ####        \r
+    ####      \r
+    ######    \r
+      ####    \r
+      ####    \r
+      ######  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+      ######  \r
+      ####    \r
+______####____\r
+    ######    \r
+    ####      \r
+  ####        \r
+######        \r
+at 216,42 size 12,21\r
+          ##            \r
+          ##            \r
+####      ##      ####  \r
+  ######  ##  ######    \r
+      ##########        \r
+      ##########        \r
+  ######  ##  ######    \r
+####      ##      ####  \r
+          ##            \r
+          ##            \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+________________________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 239,42 size 15,21\r
+                              \r
+                              \r
+                              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+############################  \r
+############################  \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+____________####______________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 265,42 size 6,21\r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+    ######  \r
+    ####    \r
+__######____\r
+  ####      \r
+  ####      \r
+####        \r
+####        \r
+at 281,42 size 8,21\r
+                \r
+                \r
+                \r
+                \r
+                \r
+                \r
+                \r
+                \r
+                \r
+##############  \r
+##############  \r
+                \r
+                \r
+                \r
+                \r
+                \r
+________________\r
+                \r
+                \r
+                \r
+                \r
+at 299,42 size 4,21\r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+######  \r
+######  \r
+######__\r
+        \r
+        \r
+        \r
+        \r
+at 312,42 size 11,21\r
+                ####  \r
+              ####    \r
+              ####    \r
+            ######    \r
+            ####      \r
+            ####      \r
+          ####        \r
+          ####        \r
+        ######        \r
+        ####          \r
+        ####          \r
+      ####            \r
+      ####            \r
+      ####            \r
+    ####              \r
+    ####              \r
+__######______________\r
+  ####                \r
+  ####                \r
+####                  \r
+                      \r
+at 331,42 size 12,21\r
+                        \r
+      ##########        \r
+    ##############      \r
+  ######      ######    \r
+  ####          ####    \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+  ####          ####    \r
+  ######      ######    \r
+    ##############      \r
+______##########________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 354,42 size 9,21\r
+                  \r
+      ####        \r
+      ####        \r
+##########        \r
+##########        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+      ####        \r
+################  \r
+################__\r
+                  \r
+                  \r
+                  \r
+                  \r
+at 375,42 size 11,21\r
+                      \r
+  ############        \r
+################      \r
+##          ######    \r
+              ####    \r
+              ####    \r
+              ####    \r
+              ####    \r
+            ####      \r
+          ####        \r
+        ######        \r
+      ######          \r
+    ######            \r
+  ######              \r
+######                \r
+####################  \r
+####################__\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 397,42 size 11,21\r
+                      \r
+  ##############      \r
+##################    \r
+##            ######  \r
+                ####  \r
+                ####  \r
+              ####    \r
+        ########      \r
+        ########      \r
+              ####    \r
+                ####  \r
+                ####  \r
+                ####  \r
+                ####  \r
+##            ####    \r
+##################    \r
+__############________\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 418,42 size 13,21\r
+                          \r
+                ####      \r
+              ######      \r
+            ########      \r
+          ##########      \r
+        ######  ####      \r
+      ######    ####      \r
+    ######      ####      \r
+  ######        ####      \r
+######          ####      \r
+########################  \r
+########################  \r
+                ####      \r
+                ####      \r
+                ####      \r
+                ####      \r
+________________####______\r
+                          \r
+                          \r
+                          \r
+                          \r
+at 440,42 size 11,21\r
+                      \r
+  ##################  \r
+  ##################  \r
+  ####                \r
+  ####                \r
+  ####                \r
+  ####                \r
+  ##############      \r
+  ################    \r
+              ######  \r
+                ####  \r
+                ####  \r
+                ####  \r
+                ####  \r
+##            ####    \r
+##################    \r
+__############________\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 461,42 size 12,21\r
+                        \r
+        ##########      \r
+      ############      \r
+    ######              \r
+  ####                  \r
+  ####                  \r
+####                    \r
+####  ##########        \r
+####################    \r
+######          ######  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+  ####            ####  \r
+  ######        ####    \r
+    ##############      \r
+______##########________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 484,42 size 12,21\r
+                        \r
+######################  \r
+######################  \r
+                  ####  \r
+                  ####  \r
+                ####    \r
+              ######    \r
+              ####      \r
+            ####        \r
+            ####        \r
+          ####          \r
+        ######          \r
+        ####            \r
+      ####              \r
+      ####              \r
+    ####                \r
+__######________________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 504,42 size 12,21\r
+                        \r
+      ##########        \r
+  ##################    \r
+######          ######  \r
+####              ####  \r
+####              ####  \r
+######            ####  \r
+  ########    ######    \r
+      ##########        \r
+  ####      ########    \r
+####            ######  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+######          ####    \r
+  ##################    \r
+______##########________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 526,42 size 12,21\r
+                        \r
+      ##########        \r
+    ##############      \r
+  ####        ######    \r
+####            ####    \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+######          ######  \r
+  ####################  \r
+      ##########  ####  \r
+                  ####  \r
+                ####    \r
+                ####    \r
+            ######      \r
+    ############        \r
+____##########__________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 551,42 size 4,21\r
+        \r
+        \r
+        \r
+        \r
+        \r
+######  \r
+######  \r
+######  \r
+        \r
+        \r
+        \r
+        \r
+        \r
+        \r
+######  \r
+######  \r
+######__\r
+        \r
+        \r
+        \r
+        \r
+at 568,42 size 6,21\r
+            \r
+            \r
+            \r
+            \r
+            \r
+  ######    \r
+  ######    \r
+  ######    \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+    ######  \r
+    ####    \r
+__######____\r
+  ####      \r
+  ####      \r
+####        \r
+####        \r
+at 585,42 size 13,21\r
+                          \r
+                          \r
+                          \r
+                          \r
+                    ####  \r
+                ########  \r
+            ########      \r
+        ########          \r
+    ########              \r
+########                  \r
+########                  \r
+    ########              \r
+        ########          \r
+            ########      \r
+                ########  \r
+                    ####  \r
+__________________________\r
+                          \r
+                          \r
+                          \r
+                          \r
+at 611,42 size 14,21\r
+                            \r
+                            \r
+                            \r
+                            \r
+                            \r
+                            \r
+                            \r
+##########################  \r
+##########################  \r
+                            \r
+                            \r
+                            \r
+##########################  \r
+##########################  \r
+                            \r
+                            \r
+____________________________\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 637,42 size 13,21\r
+                          \r
+                          \r
+                          \r
+                          \r
+####                      \r
+########                  \r
+    ########              \r
+        ########          \r
+            ########      \r
+                ########  \r
+                ########  \r
+            ########      \r
+        ########          \r
+    ########              \r
+########                  \r
+####                      \r
+__________________________\r
+                          \r
+                          \r
+                          \r
+                          \r
+at 662,42 size 10,21\r
+                    \r
+  ############      \r
+################    \r
+##          ######  \r
+              ####  \r
+              ####  \r
+              ####  \r
+            ####    \r
+          ######    \r
+      ######        \r
+      ####          \r
+      ####          \r
+      ####          \r
+                    \r
+                    \r
+      ####          \r
+______####__________\r
+                    \r
+                    \r
+                    \r
+                    \r
+at 16,94 size 19,21\r
+                                      \r
+            ############              \r
+        ####################          \r
+      ######            ########      \r
+    ######                  ####      \r
+  ######    ##############    ####    \r
+  ####    ################    ####    \r
+######    ####        ####      ####  \r
+####    ####          ####      ####  \r
+####    ####          ####      ####  \r
+####    ####          ####      ####  \r
+####    ####          ####      ####  \r
+####    ####          ####      ####  \r
+######  ######      ######    ######  \r
+  ####    ########################    \r
+  ######    ########  ############    \r
+____######____________________________\r
+      ########                        \r
+        ##################            \r
+            ##############            \r
+                                      \r
+at 44,94 size 16,21\r
+                                \r
+            ######              \r
+          ####  ####            \r
+          ####  ####            \r
+          ####  ####            \r
+        ####      ####          \r
+        ####      ####          \r
+        ####      ####          \r
+      ####          ####        \r
+      ####          ####        \r
+    ######          ######      \r
+    ######################      \r
+    ######################      \r
+  ####                  ####    \r
+  ####                  ####    \r
+  ####                  ####    \r
+####______________________####__\r
+                                \r
+                                \r
+                                \r
+                                \r
+at 68,94 size 13,21\r
+                          \r
+##################        \r
+####################      \r
+####            ######    \r
+####              ####    \r
+####              ####    \r
+####            ####      \r
+##################        \r
+######################    \r
+####              ####    \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####            ######    \r
+######################    \r
+##################________\r
+                          \r
+                          \r
+                          \r
+                          \r
+at 90,94 size 14,21\r
+                            \r
+          ############      \r
+      ####################  \r
+    ######          ######  \r
+  ######                ##  \r
+  ####                      \r
+####                        \r
+####                        \r
+####                        \r
+####                        \r
+####                        \r
+####                        \r
+  ####                      \r
+  ######                ##  \r
+    ######          ######  \r
+      ####################  \r
+________##############______\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 114,94 size 15,21\r
+                              \r
+##################            \r
+######################        \r
+####            ########      \r
+####                ######    \r
+####                  ####    \r
+####                    ####  \r
+####                    ####  \r
+####                    ####  \r
+####                    ####  \r
+####                    ####  \r
+####                    ####  \r
+####                  ####    \r
+####                ######    \r
+####            ########      \r
+######################        \r
+##################____________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 139,94 size 12,21\r
+                        \r
+######################  \r
+######################  \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+######################  \r
+######################  \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+######################  \r
+######################__\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 161,94 size 12,21\r
+                        \r
+######################  \r
+######################  \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####################    \r
+####################    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####____________________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 180,94 size 15,21\r
+                              \r
+          ##############      \r
+      ######################  \r
+    ######            ######  \r
+  ######                  ##  \r
+  ####                        \r
+####                          \r
+####                          \r
+####                          \r
+####            ############  \r
+####            ############  \r
+####                    ####  \r
+  ####                  ####  \r
+  ######                ####  \r
+    ######              ####  \r
+      ######################  \r
+__________############________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 206,94 size 14,21\r
+                            \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+##########################  \r
+##########################  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####                  ####  \r
+####__________________####__\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 230,94 size 7,21\r
+              \r
+############  \r
+############  \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+    ####      \r
+############  \r
+############__\r
+              \r
+              \r
+              \r
+              \r
+at 245,94 size 9,21\r
+                  \r
+    ############  \r
+    ############  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+            ####  \r
+          ######  \r
+##############    \r
+############______\r
+                  \r
+                  \r
+                  \r
+                  \r
+at 265,94 size 14,21\r
+                            \r
+####                ####    \r
+####              ####      \r
+####            ####        \r
+####          ####          \r
+####        ####            \r
+####      ####              \r
+####    ####                \r
+####  ####                  \r
+############                \r
+######    ####              \r
+####      ######            \r
+####        ######          \r
+####          ######        \r
+####            ######      \r
+####              ######    \r
+####________________######__\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 288,94 size 11,21\r
+                      \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####################  \r
+####################__\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 308,94 size 16,21\r
+                                \r
+######                  ######  \r
+########              ########  \r
+########              ########  \r
+####  ####          ####  ####  \r
+####  ####          ####  ####  \r
+####    ####      ####    ####  \r
+####    ####      ####    ####  \r
+####      ####  ####      ####  \r
+####      ####  ####      ####  \r
+####        ######        ####  \r
+####        ######        ####  \r
+####          ##          ####  \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+####______________________####__\r
+                                \r
+                                \r
+                                \r
+                                \r
+at 334,94 size 13,21\r
+                          \r
+########            ####  \r
+########            ####  \r
+##########          ####  \r
+####  ####          ####  \r
+####  ######        ####  \r
+####    ####        ####  \r
+####    ######      ####  \r
+####      ####      ####  \r
+####        ####    ####  \r
+####        ####    ####  \r
+####          ####  ####  \r
+####          ####  ####  \r
+####            ########  \r
+####            ########  \r
+####              ######  \r
+####______________######__\r
+                          \r
+                          \r
+                          \r
+                          \r
+at 357,94 size 16,21\r
+                                \r
+          ############          \r
+      ##################        \r
+    ######          ######      \r
+  ######              ######    \r
+  ####                  ####    \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+  ####                  ####    \r
+  ######              ######    \r
+    ######          ######      \r
+      ##################        \r
+__________############__________\r
+                                \r
+                                \r
+                                \r
+                                \r
+at 383,94 size 11,21\r
+                      \r
+##############        \r
+##################    \r
+####          ######  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####          ####    \r
+################      \r
+##############        \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####__________________\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 403,94 size 16,21\r
+                                \r
+          ############          \r
+      ##################        \r
+    ######          ######      \r
+  ######              ######    \r
+  ####                  ####    \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+####                      ####  \r
+  ####                  ####    \r
+  ######              ######    \r
+    ######          ######      \r
+      ##################        \r
+__________##########____________\r
+                ####            \r
+                ######          \r
+                  ############  \r
+                    ##########  \r
+at 429,94 size 14,21\r
+                            \r
+################            \r
+##################          \r
+####          ######        \r
+####            ####        \r
+####            ####        \r
+####            ####        \r
+####            ####        \r
+####          ####          \r
+################            \r
+##############              \r
+####        ####            \r
+####        ######          \r
+####          ######        \r
+####            ######      \r
+####              ######    \r
+####________________######__\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 451,94 size 14,21\r
+                            \r
+      ##############        \r
+  ######################    \r
+  ####            ######    \r
+####                  ##    \r
+####                        \r
+####                        \r
+  ######                    \r
+    ################        \r
+        ################    \r
+                  ########  \r
+                      ####  \r
+                      ####  \r
+##                    ####  \r
+######            ######    \r
+######################      \r
+____################________\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 473,94 size 15,21\r
+                              \r
+############################  \r
+############################  \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+____________####______________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 497,94 size 13,21\r
+                          \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+####                ####  \r
+######            ######  \r
+  ######        ######    \r
+    ################      \r
+______############________\r
+                          \r
+                          \r
+                          \r
+                          \r
+at 518,94 size 16,21\r
+                                \r
+####                      ####  \r
+  ####                  ####    \r
+  ####                  ####    \r
+  ####                  ####    \r
+    ####              ####      \r
+    ####              ####      \r
+    ######          ######      \r
+      ####          ####        \r
+      ####          ####        \r
+        ####      ####          \r
+        ####      ####          \r
+        ####      ####          \r
+          ####  ####            \r
+          ####  ####            \r
+          ##########            \r
+____________######______________\r
+                                \r
+                                \r
+                                \r
+                                \r
+at 542,94 size 21,21\r
+                                          \r
+####              ####              ####  \r
+####              ######            ####  \r
+  ####          ########          ####    \r
+  ####          ########          ####    \r
+  ####          ########          ####    \r
+  ######        ##    ####        ####    \r
+    ####      ####    ####      ####      \r
+    ####      ####    ####      ####      \r
+    ####      ####    ####      ####      \r
+      ####    ##        ####    ####      \r
+      ####  ####        ####  ####        \r
+      ####  ####        ####  ####        \r
+      ####  ####        ####  ####        \r
+        ######            ######          \r
+        ######            ######          \r
+________######____________######__________\r
+                                          \r
+                                          \r
+                                          \r
+                                          \r
+at 572,94 size 14,21\r
+                            \r
+######              ######  \r
+  ####              ####    \r
+    ####          ####      \r
+    ######      ######      \r
+      ####      ####        \r
+        ####  ####          \r
+        ##########          \r
+          ######            \r
+          ######            \r
+        ####  ####          \r
+        ####  ####          \r
+      ####      ####        \r
+    ######      ######      \r
+    ####          ####      \r
+  ####              ####    \r
+######______________######__\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 593,94 size 15,21\r
+                              \r
+######                ######  \r
+  ####                ####    \r
+    ####            ####      \r
+    ######        ######      \r
+      ####        ####        \r
+        ####    ####          \r
+        ############          \r
+          ########            \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+            ####              \r
+____________####______________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 616,94 size 14,21\r
+                            \r
+##########################  \r
+##########################  \r
+                    ######  \r
+                  ######    \r
+                ######      \r
+              ######        \r
+              ####          \r
+            ####            \r
+          ####              \r
+        ####                \r
+      ######                \r
+    ######                  \r
+  ######                    \r
+######                      \r
+##########################  \r
+##########################__\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 640,94 size 7,21\r
+############  \r
+############  \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####          \r
+####__________\r
+####          \r
+####          \r
+############  \r
+############  \r
+at 656,94 size 11,21\r
+####                  \r
+  ####                \r
+  ####                \r
+  ######              \r
+    ####              \r
+    ####              \r
+      ####            \r
+      ####            \r
+      ######          \r
+        ####          \r
+        ####          \r
+          ####        \r
+          ####        \r
+          ####        \r
+            ####      \r
+            ####      \r
+____________######____\r
+              ####    \r
+              ####    \r
+                ####  \r
+                      \r
+at 675,94 size 7,21\r
+############  \r
+############  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+________####__\r
+        ####  \r
+        ####  \r
+############  \r
+############  \r
+at 693,94 size 15,21\r
+                              \r
+            ####              \r
+          ########            \r
+          ########            \r
+        ####    ####          \r
+      ####        ####        \r
+    ######        ######      \r
+    ####            ####      \r
+  ####                ####    \r
+####                    ####  \r
+                              \r
+                              \r
+                              \r
+                              \r
+                              \r
+                              \r
+______________________________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 716,94 size 12,21\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+________________________\r
+                        \r
+                        \r
+######################  \r
+                        \r
+at 18,146 size 6,22\r
+######      \r
+  ######    \r
+    ####    \r
+      ####  \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+____________\r
+            \r
+            \r
+            \r
+            \r
+at 37,146 size 11,22\r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+  ##############      \r
+  ################    \r
+  ##          ######  \r
+                ####  \r
+      ##############  \r
+  ##################  \r
+########        ####  \r
+####            ####  \r
+####            ####  \r
+######        ######  \r
+  ##################  \r
+____########____####__\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 59,146 size 12,22\r
+                        \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####    ########        \r
+####################    \r
+######          ####    \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####            ######  \r
+####          ######    \r
+##################      \r
+####__##########________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 79,146 size 10,22\r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+      ##########    \r
+    ##############  \r
+  ######        ##  \r
+######              \r
+####                \r
+####                \r
+####                \r
+####                \r
+######              \r
+  ####          ##  \r
+  ################  \r
+______##########____\r
+                    \r
+                    \r
+                    \r
+                    \r
+at 98,146 size 12,22\r
+                        \r
+                  ####  \r
+                  ####  \r
+                  ####  \r
+                  ####  \r
+                  ####  \r
+      ##########  ####  \r
+    ##################  \r
+  ######          ####  \r
+######            ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+  ####          ######  \r
+  ####################  \r
+______########____####__\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 120,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+      ##########        \r
+    ################    \r
+  ######        ####    \r
+######            ####  \r
+####              ####  \r
+######################  \r
+######################  \r
+####                    \r
+####                    \r
+  ######            ##  \r
+    ##################  \r
+______##############____\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 141,146 size 8,22\r
+                \r
+      ########  \r
+    ##########  \r
+  ######        \r
+  ####          \r
+  ####          \r
+############    \r
+############    \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+  ####          \r
+__####__________\r
+                \r
+                \r
+                \r
+                \r
+at 156,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+      ##########  ####  \r
+    ##################  \r
+  ######          ####  \r
+######            ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+  ####          ######  \r
+  ####################  \r
+______########____####__\r
+                  ####  \r
+  ##            ####    \r
+  ##################    \r
+  ##############        \r
+at 178,146 size 11,22\r
+                      \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####                  \r
+####    ########      \r
+##################    \r
+######        ######  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####____________####__\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 200,146 size 3,22\r
+      \r
+      \r
+####  \r
+####  \r
+      \r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+      \r
+at 212,146 size 7,22\r
+              \r
+              \r
+        ####  \r
+        ####  \r
+              \r
+              \r
+  ##########  \r
+  ##########  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+        ####  \r
+________####__\r
+        ####  \r
+      ######  \r
+##########    \r
+########      \r
+at 229,146 size 12,22\r
+                        \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+####            ####    \r
+####          ####      \r
+####        ####        \r
+####      ####          \r
+####    ####            \r
+####  ####              \r
+############            \r
+######  ######          \r
+####      ######        \r
+####        ######      \r
+####          ######    \r
+####____________######__\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 250,146 size 3,22\r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+      \r
+      \r
+      \r
+      \r
+at 264,146 size 19,22\r
+                                      \r
+                                      \r
+                                      \r
+                                      \r
+                                      \r
+                                      \r
+####    ########      ##########      \r
+##################  ##############    \r
+######        ##########      ######  \r
+####            ####            ####  \r
+####            ####            ####  \r
+####            ####            ####  \r
+####            ####            ####  \r
+####            ####            ####  \r
+####            ####            ####  \r
+####            ####            ####  \r
+####            ####            ####  \r
+####____________####____________####__\r
+                                      \r
+                                      \r
+                                      \r
+                                      \r
+at 293,146 size 11,22\r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+####    ########      \r
+##################    \r
+######        ######  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####____________####__\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 314,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+      ##########        \r
+    ##############      \r
+  ######      ######    \r
+######          ######  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+######          ######  \r
+  ######      ######    \r
+    ##############      \r
+______##########________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 336,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+####    ########        \r
+####################    \r
+######          ####    \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####            ######  \r
+####          ######    \r
+##################      \r
+####__##########________\r
+####                    \r
+####                    \r
+####                    \r
+####                    \r
+at 356,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+      ##########  ####  \r
+    ##################  \r
+  ######          ####  \r
+######            ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+####              ####  \r
+  ####          ######  \r
+  ####################  \r
+______##########__####__\r
+                  ####  \r
+                  ####  \r
+                  ####  \r
+                  ####  \r
+at 378,146 size 8,22\r
+                \r
+                \r
+                \r
+                \r
+                \r
+                \r
+####    ######  \r
+##############  \r
+######          \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####            \r
+####____________\r
+                \r
+                \r
+                \r
+                \r
+at 395,146 size 10,22\r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+                    \r
+    ############    \r
+  ################  \r
+####            ##  \r
+####                \r
+######              \r
+  ############      \r
+      ##########    \r
+            ######  \r
+              ####  \r
+##            ####  \r
+################    \r
+__############______\r
+                    \r
+                    \r
+                    \r
+                    \r
+at 414,146 size 9,22\r
+                  \r
+                  \r
+                  \r
+  ####            \r
+  ####            \r
+  ####            \r
+################  \r
+################  \r
+  ####            \r
+  ####            \r
+  ####            \r
+  ####            \r
+  ####            \r
+  ####            \r
+  ####            \r
+  ######          \r
+    ############  \r
+______##########__\r
+                  \r
+                  \r
+                  \r
+                  \r
+at 431,146 size 11,22\r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+####            ####  \r
+######        ######  \r
+  ##################  \r
+____########____####__\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 452,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+####              ####  \r
+  ####          ####    \r
+  ####          ####    \r
+  ####          ####    \r
+    ####      ####      \r
+    ####      ####      \r
+    ####      ####      \r
+      ####  ####        \r
+      ####  ####        \r
+        ######          \r
+        ######          \r
+________######__________\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 473,146 size 17,22\r
+                                  \r
+                                  \r
+                                  \r
+                                  \r
+                                  \r
+                                  \r
+####          ####          ####  \r
+####          ####          ####  \r
+  ####      ########      ####    \r
+  ####      ########      ####    \r
+  ####      ##    ##      ####    \r
+  ####    ####    ####    ####    \r
+    ####  ####    ####    ##      \r
+    ####  ##        ##  ####      \r
+    ####  ##        ########      \r
+    ########        ########      \r
+      ####            ####        \r
+______####____________####________\r
+                                  \r
+                                  \r
+                                  \r
+                                  \r
+at 498,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+######          ######  \r
+  ######        ####    \r
+    ####      ####      \r
+      ####  ####        \r
+      ##########        \r
+        ######          \r
+        ######          \r
+      ##########        \r
+      ####  ####        \r
+    ####      ####      \r
+  ####          ####    \r
+######__________######__\r
+                        \r
+                        \r
+                        \r
+                        \r
+at 519,146 size 12,22\r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+                        \r
+####              ####  \r
+  ####          ####    \r
+  ####          ####    \r
+  ####          ####    \r
+    ####      ####      \r
+    ####      ####      \r
+      ####  ####        \r
+      ####  ####        \r
+      ####  ####        \r
+        ######          \r
+        ######          \r
+________####____________\r
+        ####            \r
+      ####              \r
+      ####              \r
+    ######              \r
+at 540,146 size 11,22\r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+                      \r
+####################  \r
+####################  \r
+              ######  \r
+            ######    \r
+          ######      \r
+        ######        \r
+      ######          \r
+    ######            \r
+  ######              \r
+######                \r
+####################  \r
+####################__\r
+                      \r
+                      \r
+                      \r
+                      \r
+at 560,146 size 11,22\r
+                      \r
+            ########  \r
+          ##########  \r
+        ######        \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+      ####            \r
+########              \r
+########              \r
+      ####            \r
+        ####          \r
+        ####          \r
+        ####          \r
+________####__________\r
+        ####          \r
+        ######        \r
+          ##########  \r
+            ########  \r
+at 584,146 size 3,22\r
+      \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####  \r
+####__\r
+####  \r
+####  \r
+####  \r
+####  \r
+at 600,146 size 11,22\r
+                      \r
+########              \r
+##########            \r
+      ######          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+        ####          \r
+          ####        \r
+            ########  \r
+            ########  \r
+          ####        \r
+        ####          \r
+        ####          \r
+        ####          \r
+________####__________\r
+        ####          \r
+      ######          \r
+##########            \r
+########              \r
+at 621,146 size 15,22\r
+                              \r
+                              \r
+                              \r
+                              \r
+                              \r
+                              \r
+                              \r
+                              \r
+    ########            ####  \r
+  ############          ####  \r
+  ####    ######        ####  \r
+####        ######    ####    \r
+####          ############    \r
+####            ########      \r
+                              \r
+                              \r
+                              \r
+______________________________\r
+                              \r
+                              \r
+                              \r
+                              \r
+at 647,146 size 14,22\r
+                            \r
+                            \r
+            ############    \r
+        ##################  \r
+      ########        ####  \r
+    ######                  \r
+    ####                    \r
+######################      \r
+######################      \r
+    ####                    \r
+####################        \r
+####################        \r
+    ####                    \r
+    ######                  \r
+      ########        ####  \r
+        ##################  \r
+            ############    \r
+____________________________\r
+                            \r
+                            \r
+                            \r
+                            \r
+at 676,146 size 10,22\r
+                    \r
+                    \r
+                    \r
+          ####      \r
+          ####      \r
+          ####      \r
+      ##########    \r
+    ##############  \r
+  ######        ##  \r
+######              \r
+####                \r
+####                \r
+####                \r
+####                \r
+######              \r
+  ####          ##  \r
+  ################  \r
+______##########____\r
+          ####      \r
+          ####      \r
+          ####      \r
+                    \r
diff --git a/src/font/set06.bmp b/src/font/set06.bmp
new file mode 100644 (file)
index 0000000..e995ee4
Binary files /dev/null and b/src/font/set06.bmp differ
diff --git a/src/font/set06.chs b/src/font/set06.chs
new file mode 100644 (file)
index 0000000..24b2533
Binary files /dev/null and b/src/font/set06.chs differ
diff --git a/src/font/set06.cmd b/src/font/set06.cmd
new file mode 100644 (file)
index 0000000..3523644
Binary files /dev/null and b/src/font/set06.cmd differ
diff --git a/src/font/set06.txt b/src/font/set06.txt
new file mode 100644 (file)
index 0000000..087aaa8
--- /dev/null
@@ -0,0 +1,1024 @@
+at 13,18 size 2,10\r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+    \r
+##__\r
+    \r
+    \r
+at 17,18 size 4,10\r
+        \r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+        \r
+        \r
+        \r
+________\r
+        \r
+        \r
+at 22,18 size 6,10\r
+            \r
+  ##  ##    \r
+  ##  ##    \r
+##########  \r
+  ##  ##    \r
+##########  \r
+##  ##      \r
+##__##______\r
+            \r
+            \r
+at 29,18 size 6,10\r
+    ##      \r
+  ######    \r
+##  ##  ##  \r
+##  ##      \r
+  ######    \r
+    ##  ##  \r
+##  ##  ##  \r
+__######____\r
+    ##      \r
+            \r
+at 36,18 size 8,10\r
+                \r
+  ##      ##    \r
+##  ##  ##      \r
+##  ##  ##      \r
+  ##  ##  ##    \r
+      ####  ##  \r
+    ##  ##  ##  \r
+____##____##____\r
+                \r
+                \r
+at 46,18 size 6,10\r
+            \r
+    ##      \r
+  ##  ##    \r
+  ##  ##    \r
+  ####      \r
+##    ####  \r
+##    ##    \r
+__####__##__\r
+            \r
+            \r
+at 53,18 size 2,10\r
+    \r
+##  \r
+##  \r
+##  \r
+    \r
+    \r
+    \r
+____\r
+    \r
+    \r
+at 57,18 size 3,10\r
+      \r
+  ##  \r
+##    \r
+##    \r
+##    \r
+##    \r
+##    \r
+##____\r
+##    \r
+  ##  \r
+at 62,18 size 3,10\r
+      \r
+##    \r
+  ##  \r
+  ##  \r
+  ##  \r
+  ##  \r
+  ##  \r
+__##__\r
+  ##  \r
+##    \r
+at 67,18 size 4,10\r
+        \r
+  ##    \r
+######  \r
+  ##    \r
+##  ##  \r
+        \r
+        \r
+________\r
+        \r
+        \r
+at 73,18 size 5,10\r
+          \r
+          \r
+  ##      \r
+  ##      \r
+########  \r
+  ##      \r
+  ##      \r
+__________\r
+          \r
+          \r
+at 80,18 size 2,10\r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+##__\r
+##  \r
+    \r
+at 84,18 size 3,10\r
+      \r
+      \r
+      \r
+      \r
+      \r
+####  \r
+      \r
+______\r
+      \r
+      \r
+at 89,18 size 2,10\r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+    \r
+##__\r
+    \r
+    \r
+at 94,18 size 3,10\r
+      \r
+  ##  \r
+  ##  \r
+  ##  \r
+  ##  \r
+##    \r
+##    \r
+##____\r
+      \r
+      \r
+at 98,18 size 5,10\r
+          \r
+  ####    \r
+##    ##  \r
+##    ##  \r
+##    ##  \r
+##    ##  \r
+##    ##  \r
+__####____\r
+          \r
+          \r
+at 106,18 size 3,10\r
+      \r
+  ##  \r
+####  \r
+  ##  \r
+  ##  \r
+  ##  \r
+  ##  \r
+__##__\r
+      \r
+      \r
+at 112,18 size 5,10\r
+          \r
+  ####    \r
+##    ##  \r
+      ##  \r
+    ##    \r
+  ##      \r
+##        \r
+########__\r
+          \r
+          \r
+at 119,18 size 5,10\r
+          \r
+  ####    \r
+##    ##  \r
+      ##  \r
+  ####    \r
+      ##  \r
+##    ##  \r
+__####____\r
+          \r
+          \r
+at 126,18 size 6,10\r
+            \r
+      ##    \r
+    ####    \r
+  ##  ##    \r
+##    ##    \r
+##########  \r
+      ##    \r
+______##____\r
+            \r
+            \r
+at 133,18 size 5,10\r
+          \r
+########  \r
+##        \r
+######    \r
+      ##  \r
+      ##  \r
+##    ##  \r
+__####____\r
+          \r
+          \r
+at 139,18 size 5,10\r
+          \r
+  ####    \r
+##        \r
+##  ##    \r
+####  ##  \r
+##    ##  \r
+##    ##  \r
+__####____\r
+          \r
+          \r
+at 146,18 size 5,10\r
+          \r
+########  \r
+      ##  \r
+      ##  \r
+    ##    \r
+  ##      \r
+  ##      \r
+__##______\r
+          \r
+          \r
+at 153,18 size 5,10\r
+          \r
+  ####    \r
+##    ##  \r
+##    ##  \r
+  ####    \r
+##    ##  \r
+##    ##  \r
+__####____\r
+          \r
+          \r
+at 160,18 size 5,10\r
+          \r
+  ####    \r
+##    ##  \r
+##    ##  \r
+##  ####  \r
+  ##  ##  \r
+      ##  \r
+__####____\r
+          \r
+          \r
+at 167,18 size 2,10\r
+    \r
+    \r
+    \r
+##  \r
+    \r
+    \r
+    \r
+##__\r
+    \r
+    \r
+at 171,18 size 2,10\r
+    \r
+    \r
+    \r
+##  \r
+    \r
+    \r
+    \r
+##__\r
+##  \r
+    \r
+at 176,18 size 5,10\r
+          \r
+          \r
+      ##  \r
+  ####    \r
+##        \r
+  ####    \r
+      ##  \r
+__________\r
+          \r
+          \r
+at 183,18 size 5,10\r
+          \r
+          \r
+          \r
+########  \r
+          \r
+########  \r
+          \r
+__________\r
+          \r
+          \r
+at 190,18 size 5,10\r
+          \r
+          \r
+##        \r
+  ####    \r
+      ##  \r
+  ####    \r
+##        \r
+__________\r
+          \r
+          \r
+at 197,18 size 5,10\r
+          \r
+  ####    \r
+##    ##  \r
+      ##  \r
+    ##    \r
+  ##      \r
+          \r
+__##______\r
+          \r
+          \r
+at 8,42 size 8,9\r
+    ######      \r
+  ##      ##    \r
+##    ####  ##  \r
+##  ##  ##  ##  \r
+##  ##  ##  ##  \r
+##  ##  ##  ##  \r
+##____######____\r
+  ##        ##  \r
+    ########    \r
+at 18,42 size 6,9\r
+    ##      \r
+    ##      \r
+  ##  ##    \r
+  ##  ##    \r
+  ######    \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+at 26,42 size 5,9\r
+######    \r
+##    ##  \r
+##    ##  \r
+######    \r
+##    ##  \r
+##    ##  \r
+######____\r
+          \r
+          \r
+at 34,42 size 6,9\r
+    ####    \r
+  ##    ##  \r
+##          \r
+##          \r
+##          \r
+  ##    ##  \r
+____####____\r
+            \r
+            \r
+at 42,42 size 6,9\r
+######      \r
+##    ##    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##    ##    \r
+######______\r
+            \r
+            \r
+at 50,42 size 5,9\r
+########  \r
+##        \r
+##        \r
+########  \r
+##        \r
+##        \r
+########__\r
+          \r
+          \r
+at 58,42 size 5,9\r
+########  \r
+##        \r
+##        \r
+########  \r
+##        \r
+##        \r
+##________\r
+          \r
+          \r
+at 65,42 size 6,9\r
+    ####    \r
+  ##    ##  \r
+##          \r
+##    ####  \r
+##      ##  \r
+  ##    ##  \r
+____####____\r
+            \r
+            \r
+at 74,42 size 6,9\r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##########  \r
+##      ##  \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+at 82,42 size 2,9\r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+    \r
+    \r
+at 87,42 size 4,9\r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+    ##  \r
+##  ##  \r
+__##____\r
+        \r
+        \r
+at 93,42 size 5,9\r
+##    ##  \r
+##  ##    \r
+####      \r
+####      \r
+##  ##    \r
+##  ##    \r
+##____##__\r
+          \r
+          \r
+at 101,42 size 5,9\r
+##        \r
+##        \r
+##        \r
+##        \r
+##        \r
+##        \r
+########__\r
+          \r
+          \r
+at 107,42 size 6,9\r
+##      ##  \r
+##      ##  \r
+####  ####  \r
+####  ####  \r
+####  ####  \r
+##  ##  ##  \r
+##__##__##__\r
+            \r
+            \r
+at 117,42 size 6,9\r
+##      ##  \r
+####    ##  \r
+####    ##  \r
+##  ##  ##  \r
+##    ####  \r
+##    ####  \r
+##______##__\r
+            \r
+            \r
+at 125,42 size 6,9\r
+    ##      \r
+  ##  ##    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+  ##  ##    \r
+____##______\r
+            \r
+            \r
+at 133,42 size 5,9\r
+######    \r
+##    ##  \r
+##    ##  \r
+######    \r
+##        \r
+##        \r
+##________\r
+          \r
+          \r
+at 141,42 size 6,9\r
+    ##      \r
+  ##  ##    \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+  ##  ##    \r
+____######__\r
+        ##  \r
+            \r
+at 150,42 size 6,9\r
+########    \r
+##      ##  \r
+##      ##  \r
+########    \r
+##    ##    \r
+##      ##  \r
+##______##__\r
+            \r
+            \r
+at 158,42 size 5,9\r
+  ####    \r
+##    ##  \r
+##        \r
+  ####    \r
+      ##  \r
+##    ##  \r
+__####____\r
+          \r
+          \r
+at 166,42 size 5,9\r
+########  \r
+  ##      \r
+  ##      \r
+  ##      \r
+  ##      \r
+  ##      \r
+__##______\r
+          \r
+          \r
+at 173,42 size 6,9\r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+##      ##  \r
+__######____\r
+            \r
+            \r
+at 181,42 size 6,9\r
+##      ##  \r
+##      ##  \r
+  ##  ##    \r
+  ##  ##    \r
+  ##  ##    \r
+  ##  ##    \r
+____##______\r
+            \r
+            \r
+at 189,42 size 8,9\r
+##    ##    ##  \r
+##  ##  ##  ##  \r
+##  ##  ##  ##  \r
+##  ##  ##  ##  \r
+##  ##  ##  ##  \r
+##  ##  ##  ##  \r
+__##______##____\r
+                \r
+                \r
+at 199,42 size 6,9\r
+##      ##  \r
+  ##  ##    \r
+  ##  ##    \r
+    ##      \r
+  ##  ##    \r
+  ##  ##    \r
+##______##__\r
+            \r
+            \r
+at 207,42 size 6,9\r
+##      ##  \r
+  ##  ##    \r
+  ##  ##    \r
+    ##      \r
+    ##      \r
+    ##      \r
+____##______\r
+            \r
+            \r
+at 214,42 size 5,9\r
+########  \r
+      ##  \r
+    ##    \r
+  ##      \r
+  ##      \r
+##        \r
+########__\r
+          \r
+          \r
+at 222,42 size 3,9\r
+####  \r
+##    \r
+##    \r
+##    \r
+##    \r
+##    \r
+##____\r
+##    \r
+####  \r
+at 226,42 size 3,9\r
+##    \r
+##    \r
+##    \r
+  ##  \r
+  ##  \r
+  ##  \r
+__##__\r
+      \r
+      \r
+at 230,42 size 3,9\r
+####  \r
+  ##  \r
+  ##  \r
+  ##  \r
+  ##  \r
+  ##  \r
+__##__\r
+  ##  \r
+####  \r
+at 235,42 size 4,9\r
+  ##    \r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+        \r
+        \r
+________\r
+        \r
+        \r
+at 241,42 size 6,9\r
+            \r
+            \r
+            \r
+            \r
+            \r
+            \r
+____________\r
+##########  \r
+            \r
+at 8,66 size 2,10\r
+##  \r
+##  \r
+    \r
+    \r
+    \r
+    \r
+    \r
+____\r
+    \r
+    \r
+at 13,66 size 5,10\r
+          \r
+          \r
+          \r
+  ####    \r
+      ##  \r
+  ######  \r
+##    ##  \r
+__######__\r
+          \r
+          \r
+at 20,66 size 5,10\r
+          \r
+##        \r
+##        \r
+##  ##    \r
+####  ##  \r
+##    ##  \r
+####  ##  \r
+##__##____\r
+          \r
+          \r
+at 27,66 size 4,10\r
+        \r
+        \r
+        \r
+  ##    \r
+##  ##  \r
+##      \r
+##  ##  \r
+__##____\r
+        \r
+        \r
+at 33,66 size 5,10\r
+          \r
+      ##  \r
+      ##  \r
+  ##  ##  \r
+##  ####  \r
+##    ##  \r
+##  ####  \r
+__##__##__\r
+          \r
+          \r
+at 40,66 size 5,10\r
+          \r
+          \r
+          \r
+  ####    \r
+##    ##  \r
+########  \r
+##        \r
+__######__\r
+          \r
+          \r
+at 47,66 size 3,10\r
+      \r
+  ##  \r
+##    \r
+####  \r
+##    \r
+##    \r
+##    \r
+##____\r
+      \r
+      \r
+at 51,66 size 5,10\r
+          \r
+          \r
+          \r
+  ##  ##  \r
+##  ####  \r
+##    ##  \r
+##  ####  \r
+__##__##__\r
+      ##  \r
+######    \r
+at 58,66 size 5,10\r
+          \r
+##        \r
+##        \r
+##  ##    \r
+####  ##  \r
+##    ##  \r
+##    ##  \r
+##____##__\r
+          \r
+          \r
+at 65,66 size 2,10\r
+    \r
+##  \r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+    \r
+    \r
+at 69,66 size 2,10\r
+    \r
+##  \r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+##  \r
+##  \r
+at 73,66 size 4,10\r
+        \r
+##      \r
+##      \r
+##  ##  \r
+####    \r
+####    \r
+##  ##  \r
+##__##__\r
+        \r
+        \r
+at 80,66 size 2,10\r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+    \r
+    \r
+at 84,66 size 6,10\r
+            \r
+            \r
+            \r
+########    \r
+##  ##  ##  \r
+##  ##  ##  \r
+##  ##  ##  \r
+##__##__##__\r
+            \r
+            \r
+at 93,66 size 5,10\r
+          \r
+          \r
+          \r
+##  ##    \r
+####  ##  \r
+##    ##  \r
+##    ##  \r
+##____##__\r
+          \r
+          \r
+at 100,66 size 5,10\r
+          \r
+          \r
+          \r
+  ####    \r
+##    ##  \r
+##    ##  \r
+##    ##  \r
+__####____\r
+          \r
+          \r
+at 106,66 size 5,10\r
+          \r
+          \r
+          \r
+##  ##    \r
+####  ##  \r
+##    ##  \r
+####  ##  \r
+##__##____\r
+##        \r
+##        \r
+at 113,66 size 5,10\r
+          \r
+          \r
+          \r
+  ##  ##  \r
+##  ####  \r
+##    ##  \r
+##  ####  \r
+__##__##__\r
+      ##  \r
+      ##  \r
+at 120,66 size 4,10\r
+        \r
+        \r
+        \r
+##  ##  \r
+####    \r
+##      \r
+##      \r
+##______\r
+        \r
+        \r
+at 125,66 size 4,10\r
+        \r
+        \r
+        \r
+  ####  \r
+##      \r
+  ##    \r
+    ##  \r
+####____\r
+        \r
+        \r
+at 132,66 size 3,10\r
+      \r
+##    \r
+##    \r
+####  \r
+##    \r
+##    \r
+##    \r
+__##__\r
+      \r
+      \r
+at 136,66 size 5,10\r
+          \r
+          \r
+          \r
+##    ##  \r
+##    ##  \r
+##    ##  \r
+##  ####  \r
+__##__##__\r
+          \r
+          \r
+at 143,66 size 4,10\r
+        \r
+        \r
+        \r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+__##____\r
+        \r
+        \r
+at 149,66 size 6,10\r
+            \r
+            \r
+            \r
+##  ##  ##  \r
+##  ##  ##  \r
+##  ##  ##  \r
+##  ##  ##  \r
+__##__##____\r
+            \r
+            \r
+at 158,66 size 4,10\r
+        \r
+        \r
+        \r
+##  ##  \r
+  ##    \r
+  ##    \r
+  ##    \r
+##__##__\r
+        \r
+        \r
+at 164,66 size 4,10\r
+        \r
+        \r
+        \r
+##  ##  \r
+##  ##  \r
+##  ##  \r
+  ##    \r
+__##____\r
+  ##    \r
+##      \r
+at 170,66 size 4,10\r
+        \r
+        \r
+        \r
+######  \r
+    ##  \r
+  ##    \r
+##      \r
+######__\r
+        \r
+        \r
+at 177,66 size 4,10\r
+        \r
+    ##  \r
+  ##    \r
+  ##    \r
+  ##    \r
+##      \r
+  ##    \r
+__##____\r
+  ##    \r
+    ##  \r
+at 182,66 size 2,10\r
+    \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##  \r
+##__\r
+##  \r
+##  \r
+at 186,66 size 4,10\r
+        \r
+##      \r
+  ##    \r
+  ##    \r
+  ##    \r
+    ##  \r
+  ##    \r
+__##____\r
+  ##    \r
+##      \r
+at 191,66 size 5,10\r
+          \r
+          \r
+          \r
+  ##  ##  \r
+##  ##    \r
+          \r
+          \r
+__________\r
+          \r
+          \r
+at 197,66 size 6,10\r
+            \r
+    ####    \r
+  ##    ##  \r
+######      \r
+  ##        \r
+######      \r
+  ##    ##  \r
+____####____\r
+            \r
+            \r
+at 204,66 size 5,10\r
+          \r
+          \r
+    ##    \r
+  ######  \r
+##        \r
+##        \r
+##        \r
+__######__\r
+    ##    \r
+          \r
diff --git a/src/font/small.psd b/src/font/small.psd
new file mode 100644 (file)
index 0000000..0fbc524
Binary files /dev/null and b/src/font/small.psd differ
index af80d7f..d284f67 100644 (file)
Binary files a/src/fsutil/bd.exe and b/src/fsutil/bd.exe differ
index 446b7e4..352a23a 100644 (file)
@@ -1,7 +1,7 @@
-/* ..\fsutil\boot.c generated from ..\..\bin\boot.bin, do not edit! */\r
+/* ..\..\fsutil\boot.c generated from ..\..\..\bin\boot.bin, do not edit! */\r
 \r
-0x43,0x38,0x33,0x30,0x30,0x33,0x30,0x33,\r
-0x31,0x31,0x30,0x34,0x35,0x32,0x34,0x34,\r
+0x43,0x36,0x45,0x46,0x30,0x33,0x30,0x35,\r
+0x30,0x39,0x32,0x30,0x33,0x39,0x31,0x30,\r
 0x31,0x00,0x80,0xcd,0xa3,0x06,0xcd,0xab,\r
 0x05,0xcd,0xfd,0x04,0x18,0x22,0x00,0x00,\r
 0x00,0x42,0x4f,0x4f,0x54,0x20,0x20,0x20,\r
diff --git a/src/fsutil/f.bat b/src/fsutil/f.bat
deleted file mode 100644 (file)
index eb08e56..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-cl -Zi -I. -I..\kernel -DVAX -DUTIL -DDEBUG=1 -c utils.c\r
-@if errorlevel 1 goto failure\r
-cl -Zi -I. -I..\kernel -DVAX -DUTIL -DNATIVE -DDEBUG=1 -c fsck.c\r
-@if errorlevel 1 goto failure\r
-link @fsck.lnk\r
-@if errorlevel 1 goto failure\r
-\r
-@echo SUCCESS\r
-@goto done\r
-:failure\r
-@echo FAILURE\r
-:done\r
-\r
index 0354bae..30225cc 100644 (file)
Binary files a/src/fsutil/fsck.exe and b/src/fsutil/fsck.exe differ
index aeeac6d..6415e4e 100644 (file)
@@ -1,12 +1,14 @@
 -k ..\..\lib\r
--l libcl.lib\r
--l libsysl.lib\r
+-l libcb.lib\r
+-l libsysb.lib\r
 -l libiar.lib\r
 -m\r
 -u\r
 -i\r
 -o fsck\r
 -bl RCODE=0x8100\r
-..\..\lib\c0l.rel\r
+-bl CODE=0x4000,0x10000\r
+-bc CODE=0x4000\r
+..\..\lib\c0b.rel\r
 fsck\r
-utils\r
+utils \r
index 8e4abd5..851ad61 100644 (file)
@@ -9,15 +9,15 @@ Area                       Addr        Size        Decimal Bytes (Attributes)
      00000000  s__DEFAUL |    00000000  l_CCSTR   |    00000000  l_ECSTR  \r
      00000000  l_CONST   |    00000000  .__.ABS.  |    00000000  ?CL64180L\r
      00000000  ?CL64180B |    00000014  e__DEFAUL |    00000014  l__DEFAUL\r
-     0000016C  l_CDATA0  |    0000016C  l_IDATA0  |    00000352  l_RCODE  \r
-     000007A9  l_CSTR    |    000008C2  l_UDATA0  |    00001000  l_CSTACK \r
-     000038A8  l_CODE    |    00008100  s_RCODE   |    00008452  e_RCODE  \r
-     00008452  s_CODE    |    0000BCFA  s_CSTR    |    0000BCFA  e_CODE   \r
-     0000BCFA  e_CONST   |    0000BCFA  s_CONST   |    0000C4A3  e_CSTR   \r
-     0000C4A3  s_IDATA0  |    0000C4A3  s_CDATA0  |    0000C60F  s_UDATA0 \r
-     0000C60F  e_CCSTR   |    0000C60F  e_ECSTR   |    0000C60F  s_CCSTR  \r
-     0000C60F  e_CDATA0  |    0000C60F  s_ECSTR   |    0000C60F  e_IDATA0 \r
-     0000CED1  e_UDATA0  |    0000CED1  s_CSTACK  |    0000DED1  e_CSTACK \r
+     0000016C  l_CDATA0  |    0000016C  l_IDATA0  |    00000377  l_RCODE  \r
+     000007A9  l_CSTR    |    000008CD  l_UDATA0  |    00001000  l_CSTACK \r
+     00004000  s_CODE    |    00008100  s_RCODE   |    00008477  s_CSTR   \r
+     00008477  e_RCODE   |    00008477  e_CONST   |    00008477  s_CONST  \r
+     00008C20  e_CSTR    |    00008C20  s_IDATA0  |    00008C20  s_CDATA0 \r
+     00008D8C  s_UDATA0  |    00008D8C  e_CCSTR   |    00008D8C  e_ECSTR  \r
+     00008D8C  s_CCSTR   |    00008D8C  e_CDATA0  |    00008D8C  s_ECSTR  \r
+     00008D8C  e_IDATA0  |    00009659  e_UDATA0  |    00009659  s_CSTACK \r
+     0000A659  e_CSTACK  |    0000C015  l_CODE    |    00010015  e_CODE   \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
@@ -30,61 +30,35 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-RCODE                  00008100    00000352 =         850. bytes (REL,CON)\r
+RCODE                  00008100    00000377 =         887. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     00008100  __init    |    00008115  ?US_RSH_L |    0000811F  ?S_LSH_L0\r
-     00008128  ?LEAVE_DI |    0000812F  ?ENT_PARM |    0000813B  ?L_ANDASG\r
-     00008154  ?SL_CMP_L |    00008185  ?ENT_AUTO |    00008199  ?SL_DIV_L\r
-     000081C9  ?SS_CMP_L |    000081DB  ?L_INC_L0 |    000081E3  ?US_MOD_L\r
-     000081EC  ?C_LSH_L0 |    000081F3  ?US_DIV_L |    00008201  ?SL_RSH_L\r
-     0000820F  ?L_DIVMOD |    00008267  ?L_LSH_L0 |    0000827F  ?S_DIVMOD\r
-     00008295  ?LEAVE_32 |    0000829D  ?S_MULASG |    000082A7  ?L_NOT_L0\r
-     000082B6  ?S_MUL_L0 |    000082CC  ?C_V_SWIT |    000082DE  ?CALL_IND\r
-     000082DF  ?L_FIND_S |    00008323  ?UL_DIVAS |    00008333  ?V_SWITCH\r
-     0000833D  ?UL_MOD_L |    00008362  ?UL_DIV_L |    0000838A  ?L_NEG_L0\r
-     0000839C  ?L_END_MU |    000083A5  ?L_MULASG |    000083B5  ?L_MUL_L0\r
-     00008439  ?L_ADDASG\r
+     00008100  __init    |    0000811F  ?US_RSH_L |    00008129  ?S_LSH_L0\r
+     00008132  ?BANK_LEA |    00008138  ?BANK_FAS |    0000813D  ?ENT_PARM\r
+     00008149  ?BANK_CAL |    00008156  ?L_ANDASG |    0000816F  ?SL_CMP_L\r
+     000081A0  ?ENT_AUTO |    000081B4  ?SL_DIV_L |    000081E4  ?SS_CMP_L\r
+     000081F6  ?L_INC_L0 |    000081FE  ?US_MOD_L |    00008207  ?C_LSH_L0\r
+     0000820E  ?US_DIV_L |    0000821C  ?SL_RSH_L |    0000822A  ?L_DIVMOD\r
+     00008282  ?BANK_LEA |    0000828E  ?L_LSH_L0 |    000082A6  ?S_DIVMOD\r
+     000082BC  ?S_MULASG |    000082C6  ?L_NOT_L0 |    000082D5  ?S_MUL_L0\r
+     000082EB  ?C_V_SWIT |    000082FD  ?LEAVE_DI |    00008304  ?L_FIND_S\r
+     00008348  ?UL_DIVAS |    00008358  ?V_SWITCH |    00008362  ?UL_MOD_L\r
+     00008387  ?UL_DIV_L |    000083AF  ?L_NEG_L0 |    000083C1  ?L_END_MU\r
+     000083CA  ?L_MULASG |    000083DA  ?L_MUL_L0 |    0000845E  ?L_ADDASG\r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CODE                   00008452    000038A8 =       14504. bytes (REL,CON)\r
+CONST                  00008477    00000000 =           0. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     00008452  da_read   |    000084C5  da_write  |    00008538  pass1    \r
-     000089A8  pass2     |    00008C22  pass3     |    00008EF0  ckdir    \r
-     000092FF  pass4     |    0000932B  mkentry   |    000093EE  pass5    \r
-     000095DA  getblkno  |    000096C7  setblkno  |    000097F5  _blk_allo\r
-     000098AD  daread    |    000098DD  dwrite    |    00009907  iread    \r
-     0000994B  iwrite    |    000099A9  dirread   |    00009A09  dirwrite \r
-     00009A7A  yes       |    00009AC4  main      |    00009D79  bitmap_du\r
-     00009E5B  bitmap_fi |    00009F9E  mypanic   |    00009FBA  bzero    \r
-     00009FE4  bfill     |    0000A010  bcopy     |    0000A048  int_min  \r
-     0000A069  int_max   |    0000A07F  sprintf   |    0000A0BE  fflush   \r
-     0000A2B3  _write    |    0000A2CD  strcat    |    0000A2E3  printf   \r
-     0000A30D  lseek     |    0000A335  __stdio_c |    0000A38C  __stdio_i\r
-     0000A3BA  close     |    0000A3CA  strlen    |    0000A401  abort    \r
-     0000A445  _exit     |    0000A455  fgets     |    0000A4F5  strcmp   \r
-     0000A591  perror    |    0000A5C9  pause     |    0000A5D2  isatty   \r
-     0000A608  fstat     |    0000A61A  strcpy    |    0000A637  kill     \r
-     0000A7BA  vfprintf  |    0000ACED  ltoa      |    0000AD4B  __longtoa\r
-     0000AEDF  itoa      |    0000AF43  open      |    0000AF69  malloc   \r
-     0000B18B  fprintf   |    0000B1B8  exit      |    0000B1DD  _read    \r
-     0000B1F7  getpid    |    0000B205  signal    |    0000B225  strerror \r
-     0000B3B4  unix      |    0000B3CC  fgetc     |    0000B4D2  memcpy   \r
-     0000B58B  on_exit   |    0000B5ED  atexit    |    0000B5F9  unix_long\r
-     0000B611  strchr    |    0000B64C  free      |    0000B72C  fputc    \r
-     0000B82A  ultoa     |    0000B87A  atoi      |    0000B88B  sbrk     \r
-     0000B89B  fread     |    0000BA30  strtol    |    0000BB59  strtoul  \r
-     0000BCB0  toupper   |    0000BCD5  tolower  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CONST                  0000BCFA    00000000 =           0. bytes (REL,CON)\r
+CSTR                   00008477    000007A9 =        1961. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -92,26 +66,26 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CSTR                   0000BCFA    000007A9 =        1961. bytes (REL,CON)\r
+IDATA0                 00008C20    0000016C =         364. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
+     00008C20  _yes      |    00008C3A  __IO_list |    00008C3C  stdin    \r
+     00008C54  stdout    |    00008C6C  stderr    |    00008C86  __sys_err\r
+     00008C88  __sys_ner |    00008C8A  __on_exit |    00008C8C  __ctype  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-IDATA0                 0000C4A3    0000016C =         364. bytes (NUL,CON)\r
+CDATA0                 00008C20    0000016C =         364. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     0000C4A3  _yes      |    0000C4BD  __IO_list |    0000C4BF  stdin    \r
-     0000C4D7  stdout    |    0000C4EF  stderr    |    0000C509  __sys_err\r
-     0000C50B  __sys_ner |    0000C50D  __on_exit |    0000C50F  __ctype  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CDATA0                 0000C4A3    0000016C =         364. bytes (REL,CON)\r
+ECSTR                  00008D8C    00000000 =           0. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -119,7 +93,7 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-ECSTR                  0000C60F    00000000 =           0. bytes (NUL,CON)\r
+CCSTR                  00008D8C    00000000 =           0. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -127,120 +101,147 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CCSTR                  0000C60F    00000000 =           0. bytes (REL,CON)\r
+CODE                   00004000    0000C015 =       49173. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
+     00004CA0  da_read   |    00004D45  da_write  |    00004DEA  pass1    \r
+     000052C9  pass2     |    00005570  pass3     |    0000589D  ckdir    \r
+     00005D38  pass4     |    00005D70  mkentry   |    00005E52  pass5    \r
+     0000608F  getblkno  |    0000618B  setblkno  |    000062E1  _blk_allo\r
+     000063B3  daread    |    000063F2  dwrite    |    0000642B  iread    \r
+     00006479  iwrite    |    000064E6  dirread   |    0000655A  dirwrite \r
+     000065E4  yes       |    0000663D  main      |    000069D9  bitmap_du\r
+     00006ACF  bitmap_fi |    00006C21  mypanic   |    00006C4C  bzero    \r
+     00006C76  bfill     |    00006CA2  bcopy     |    00006CDA  int_min  \r
+     00006CFB  int_max   |    00006D11  sprintf   |    00006D55  fflush   \r
+     00006F68  _write    |    00006F87  strcat    |    00006FA7  printf   \r
+     00006FD6  lseek     |    00007003  __stdio_c |    0000706E  __stdio_i\r
+     000070AC  close     |    000070C1  strlen    |    000070F8  abort    \r
+     00007166  _exit     |    0000717B  fgets     |    00007220  strcmp   \r
+     000072C1  perror    |    000072FE  pause     |    0000730E  isatty   \r
+     00007349  fstat     |    00007360  strcpy    |    00007387  kill     \r
+     0000751E  vfprintf  |    00007A79  ltoa      |    00007ADC  __longtoa\r
+     00007C70  itoa      |    00007CD9  open      |    00007D04  malloc   \r
+     00007F30  fprintf   |    00007F62  exit      |    00007F92  _read    \r
+     00007FB1  getpid    |    00007FC6  signal    |    00014000  strerror \r
+     000141BD  unix      |    000141D7  fgetc     |    000142E7  memcpy   \r
+     000143B5  on_exit   |    0001442E  atexit    |    00014441  unix_long\r
+     0001445B  strchr    |    00014496  free      |    00014576  fputc    \r
+     00014688  ultoa     |    000146DD  atoi      |    000146F3  sbrk     \r
+     00014708  fread     |    000148B6  strtol    |    000149E4  strtoul  \r
+     00014B3B  toupper   |    00014B60  tolower  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-UDATA0                 0000C60F    000008C2 =        2242. bytes (REL,CON)\r
+UDATA0                 00008D8C    000008CD =        2253. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     0000C60F  _argc     |    0000C611  _argv     |    0000C613  environ  \r
-     0000C615  errno     |    0000C617  __cleanup |    0000C619  device_ha\r
-     0000C61B  device_na |    0000C81B  zeroed    |    0000CA1B  depth    \r
-     0000CA1D  dev       |    0000CA1F  filsys    |    0000CA3D  ninodes  \r
-     0000CA3F  finode    |    0000CA41  bitmap_in |    0000CA45  bitmap_bl\r
-     0000CA49  bitmap_im |    0000CA4D  inode_bit |    0000CA4F  block_bit\r
-     0000CA51  link_coun |    0000CE53  __malloc_ |    0000CE57  __malloc_\r
-     0000CEA9  __on_exit\r
+     00008D8C  _argc     |    00008D8E  _argv     |    00008D90  environ  \r
+     00008D92  errno     |    00008D94  __cleanup |    00008D97  device_ha\r
+     00008D99  device_na |    00008F99  zeroed    |    00009199  depth    \r
+     0000919B  dev       |    0000919D  filsys    |    000091BB  ninodes  \r
+     000091BD  finode    |    000091BF  bitmap_in |    000091C3  bitmap_bl\r
+     000091C7  bitmap_im |    000091CB  inode_bit |    000091CD  block_bit\r
+     000091CF  link_coun |    000095D1  __malloc_ |    000095D5  __malloc_\r
+     00009627  __on_exit\r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CSTACK                 0000CED1    00001000 =        4096. bytes (REL,CON)\r
+CSTACK                 00009659    00001000 =        4096. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
 \r
 Files Linked                              [ module(s) ]\r
 \r
-..\..\lib\c0l.rel                         [ _c0l ]\r
+..\..\lib\c0b.rel                         [ _c0b ]\r
 fsck                                      [ fsck ]\r
 utils                                     [ utils ]\r
 \r
 \r
 Libraries Linked                          [ object file ]\r
 \r
-..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\USRSH.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SLSH.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\sprintf.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fflush.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\write.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strcat.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\printf.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\lseek.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\stdio0.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\close.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strlen.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\abort.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\_exit.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fgets.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strcmp.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\perror.rel ]\r
-..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\pause.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\isatty.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\fstat.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\sprintf.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fflush.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\write.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcat.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\printf.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\lseek.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\stdio0.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\close.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strlen.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\abort.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\_exit.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fgets.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcmp.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\perror.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\pause.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\isatty.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\fstat.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ENTPARMDIRECT.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strcpy.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKCALLDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcpy.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LANDASG.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SLCMP.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\kill.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\kill.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ENTAUTODIRECT.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SLDIV.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\vfprintf.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\ltoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\vfprintf.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ltoa.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SSCMP.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\itoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\itoa.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LINC.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\open.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\open.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\USMOD.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\CLSH.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\USDIV.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\malloc.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\malloc.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SLRSH.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fprintf.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\exit.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fprintf.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\exit.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LDIVMOD.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\read.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\getpid.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\signal.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\read.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\getpid.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\signal.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVE32.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LLSH.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SDIVMOD.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\error.rel ]\r
-..\..\lib\libiar.lib                      [ reliar\LEAVE32.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\sys0l.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\error.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys0b.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SMULASG.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LNOT.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fgetc.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\memcpy.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fgetc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcpy.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SMUL.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\atexit.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\sys1l.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strchr.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atexit.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys1b.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strchr.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\CVSWITCH.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\free.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fputc.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\ultoa.rel ]\r
-..\..\lib\libiar.lib                      [ reliar\CALLIND.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\free.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ultoa.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LFINDSIGN.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ULDIVASG.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\VSWITCHEND.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\atoi.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atoi.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ULMOD.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ULDIV.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\sbrk.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sbrk.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LNEG.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fread.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fread.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LENDMULDIVASG.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strtol.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strtoul.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\ctype.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtol.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtoul.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ctype.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LMULASG.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LMUL.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LADDASG.rel ]\r
@@ -249,3 +250,5 @@ Libraries Linked                          [ object file ]
 User Base Address Definitions\r
 \r
 l RCODE=0x8100\r
+l CODE=0x4000,0x10000\r
+c CODE=0x4000\r
index 5f9624b..d2974fd 100644 (file)
@@ -1,26 +1,27 @@
 XL4\r
-H 6 areas 4B global symbols\r
+H 6 areas 4D global symbols\r
 M fsck\r
 S ?US_RSH_L02 Ref00000000\r
-S ?CL64180L_4_06_L00 Ref00000000\r
 S ?S_LSH_L02 Ref00000000\r
 S sprintf Ref00000000\r
+S ?BANK_FAST_LEAVE_L08 Ref00000000\r
 S fflush Ref00000000\r
 S bfill Ref00000000\r
 S _write Ref00000000\r
 S strcat Ref00000000\r
 S printf Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
 S stderr Ref00000000\r
 S lseek Ref00000000\r
 S close Ref00000000\r
 S abort Ref00000000\r
 S strcmp Ref00000000\r
 S fgets Ref00000000\r
-S ?LEAVE_DIRECT_L09 Ref00000000\r
 S perror Ref00000000\r
 S bcopy Ref00000000\r
 S stdin Ref00000000\r
 S ?ENT_PARM_DIRECT_L09 Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
 S stdout Ref00000000\r
 S strcpy Ref00000000\r
 S ?L_ANDASG_L03 Ref00000000\r
@@ -31,6 +32,7 @@ S int_min Ref00000000
 S ?SS_CMP_L02 Ref00000000\r
 S open Ref00000000\r
 S ?C_LSH_L01 Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
 S ?SL_RSH_L03 Ref00000000\r
 S malloc Ref00000000\r
 S fprintf Ref00000000\r
@@ -39,30 +41,30 @@ S _read Ref00000000
 S .__.ABS. Def00000000\r
 S ?L_LSH_L03 Ref00000000\r
 A _DEFAULT size 0 flags 0\r
-A CODE size 1B68 flags 0\r
+A CODE size 1FAC flags 0\r
 S da_read Def00000000\r
-S _blk_alloc Def000013A3\r
-S iread Def000014B5\r
-S mkentry Def00000ED9\r
-S ckdir Def00000A9E\r
-S dwrite Def0000148B\r
-S da_write Def00000073\r
-S yes Def00001628\r
-S bitmap_dump Def00001927\r
-S iwrite Def000014F9\r
-S getblkno Def00001188\r
-S dirread Def00001557\r
-S daread Def0000145B\r
-S setblkno Def00001275\r
-S main Def00001672\r
-S pass1 Def000000E6\r
-S pass2 Def00000556\r
-S pass3 Def000007D0\r
-S dirwrite Def000015B7\r
-S pass4 Def00000EAD\r
-S pass5 Def00000F9C\r
-S mypanic Def00001B4C\r
-S bitmap_find Def00001A09\r
+S _blk_alloc Def00001641\r
+S iread Def0000178B\r
+S mkentry Def000010D0\r
+S ckdir Def00000BFD\r
+S dwrite Def00001752\r
+S da_write Def000000A5\r
+S yes Def00001944\r
+S bitmap_dump Def00001D39\r
+S iwrite Def000017D9\r
+S getblkno Def000013EF\r
+S dirread Def00001846\r
+S daread Def00001713\r
+S setblkno Def000014EB\r
+S main Def0000199D\r
+S pass1 Def0000014A\r
+S pass2 Def00000629\r
+S pass3 Def000008D0\r
+S dirwrite Def000018BA\r
+S pass4 Def00001098\r
+S pass5 Def000011B2\r
+S mypanic Def00001F81\r
+S bitmap_find Def00001E2F\r
 A CSTR size 771 flags 0\r
 A UDATA0 size 63A flags 0\r
 S bitmap_immov Def00000430\r
@@ -87,2519 +89,2941 @@ R 00 00 01 00
 T 00 00 00 00 CD 00 00 00 00 21 00 00 E5 69 60\r
 R 00 00 01 00 02 05 13 00\r
 T 09 00 00 00 01 00 00 3E 09 CD 00 00 00 00 C5\r
-R 00 00 01 00 02 0A 24 00\r
-T 12 00 00 00 E5 ED 5B 00 00 00 00 CD\r
+R 00 00 01 00 02 0A 26 00\r
+T 12 00 00 00 E5 ED 5B 00 00 00 00 3E\r
 R 00 00 01 00 00 07 03 00\r
-T 18 00 00 00 00 00 00 00 F1 F1 F1 CB 78 28 1A\r
-R 00 00 01 00 02 04 0A 00\r
-T 21 00 00 00\r
-R 00 00 01 00\r
-T 21 00 00 00 21 00 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 28 00 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T 2F 00 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 10 00\r
-T 36 00 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 21 00\r
-T 3B 00 00 00\r
-R 00 00 01 00\r
-T 3B 00 00 00 21 00 02 E5 DD 4E 08 DD 46 09 ED\r
-R 00 00 01 00\r
-T 46 00 00 00 5B 00 00 00 00 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 05 03 00 02 0A 22 00\r
-T 4D 00 00 00 3E 02 AC B5 28 1A\r
-R 00 00 01 00\r
-T 53 00 00 00\r
-R 00 00 01 00\r
-T 53 00 00 00 21 0D 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 5A 00 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T 61 00 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 10 00\r
-T 68 00 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 21 00\r
-T 6D 00 00 00\r
-R 00 00 01 00\r
-T 6D 00 00 00 21 00 02 C3 00 00 00 00\r
-R 00 00 01 00 02 08 0F 00\r
-T 73 00 00 00\r
-R 00 00 01 00\r
-T 73 00 00 00 CD 00 00 00 00 21 00 00 E5 69 60\r
+T 18 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0B 00 02 09 0B 00\r
+T 1D 00 00 00 00 00 00 00 F1 F1 F1 CB 78 28 2E\r
+R 00 00 01 00 02 04 14 00\r
+T 26 00 00 00\r
+R 00 00 01 00\r
+T 26 00 00 00 21 00 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 2C 00 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T 33 00 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T 39 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 3F 00 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 10 00\r
+T 44 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 10 00 02 09 14 00\r
+T 4A 00 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 23 00\r
+T 4F 00 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T 54 00 00 00\r
+R 00 00 01 00\r
+T 54 00 00 00 21 00 02 E5 DD 4E 0A DD 46 0B ED\r
+R 00 00 01 00\r
+T 5F 00 00 00 5B 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 03 00 2B 0A 24 00\r
+T 65 00 00 00 00 00 00 00 CD 00 00 00 00 F1 3E\r
+R 00 00 01 00 02 04 24 00 02 09 14 00\r
+T 6C 00 00 00 02 AC B5 28 2E\r
+R 00 00 01 00\r
+T 71 00 00 00\r
+R 00 00 01 00\r
+T 71 00 00 00 21 0D 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 77 00 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T 7E 00 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T 84 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 8A 00 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 10 00\r
+T 8F 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 10 00 02 09 14 00\r
+T 95 00 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 23 00\r
+T 9A 00 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T 9F 00 00 00\r
+R 00 00 01 00\r
+T 9F 00 00 00 21 00 02 C3 00 00 00 00\r
+R 00 00 01 00 02 08 09 00\r
+T A5 00 00 00\r
+R 00 00 01 00\r
+T A5 00 00 00 CD 00 00 00 00 21 00 00 E5 69 60\r
 R 00 00 01 00 02 05 13 00\r
-T 7C 00 00 00 01 00 00 3E 09 CD 00 00 00 00 C5\r
-R 00 00 01 00 02 0A 24 00\r
-T 85 00 00 00 E5 ED 5B 00 00 00 00 CD\r
+T AE 00 00 00 01 00 00 3E 09 CD 00 00 00 00 C5\r
+R 00 00 01 00 02 0A 26 00\r
+T B7 00 00 00 E5 ED 5B 00 00 00 00 3E\r
 R 00 00 01 00 00 07 03 00\r
-T 8B 00 00 00 00 00 00 00 F1 F1 F1 CB 78 28 1A\r
-R 00 00 01 00 02 04 0A 00\r
-T 94 00 00 00\r
-R 00 00 01 00\r
-T 94 00 00 00 21 00 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 9B 00 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T A2 00 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 10 00\r
-T A9 00 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 21 00\r
-T AE 00 00 00\r
-R 00 00 01 00\r
-T AE 00 00 00 21 00 02 E5 DD 4E 08 DD 46 09 ED\r
-R 00 00 01 00\r
-T B9 00 00 00 5B 00 00 00 00 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 05 03 00 02 0A 06 00\r
-T C0 00 00 00 3E 02 AC B5 28 1A\r
-R 00 00 01 00\r
-T C6 00 00 00\r
-R 00 00 01 00\r
-T C6 00 00 00 21 1A 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T CD 00 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T D4 00 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 10 00\r
-T DB 00 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 21 00\r
-T E0 00 00 00\r
-R 00 00 01 00\r
-T E0 00 00 00 21 00 02 C3 00 00 00 00\r
-R 00 00 01 00 02 08 0F 00\r
-T E6 00 00 00\r
-R 00 00 01 00\r
-T E6 00 00 00 CD 00 00 00 00 B2 FF AF DD 77 B6\r
-R 00 00 01 00 02 05 18 00\r
-T EF 00 00 00 DD 77 B7 DD 36 B2 01 DD 36 B3 00\r
-R 00 00 01 00\r
-T FA 00 00 00\r
-R 00 00 01 00\r
-T FA 00 00 00 ED 4B 24 04 00 00 DD 6E B2 DD 66\r
+T BD 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0B 00 02 09 0B 00\r
+T C2 00 00 00 00 00 00 00 F1 F1 F1 CB 78 28 2E\r
+R 00 00 01 00 02 04 14 00\r
+T CB 00 00 00\r
+R 00 00 01 00\r
+T CB 00 00 00 21 00 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T D1 00 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T D8 00 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T DE 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T E4 00 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 10 00\r
+T E9 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 10 00 02 09 14 00\r
+T EF 00 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 23 00\r
+T F4 00 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T F9 00 00 00\r
+R 00 00 01 00\r
+T F9 00 00 00 21 00 02 E5 DD 4E 0A DD 46 0B ED\r
+R 00 00 01 00\r
+T 04 01 00 00 5B 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 03 00 2B 0A 06 00\r
+T 0A 01 00 00 00 00 00 00 CD 00 00 00 00 F1 3E\r
+R 00 00 01 00 02 04 06 00 02 09 14 00\r
+T 11 01 00 00 02 AC B5 28 2E\r
+R 00 00 01 00\r
+T 16 01 00 00\r
+R 00 00 01 00\r
+T 16 01 00 00 21 1A 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 1C 01 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T 23 01 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T 29 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 2F 01 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 10 00\r
+T 34 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 10 00 02 09 14 00\r
+T 3A 01 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 23 00\r
+T 3F 01 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T 44 01 00 00\r
+R 00 00 01 00\r
+T 44 01 00 00 21 00 02 C3 00 00 00 00\r
+R 00 00 01 00 02 08 09 00\r
+T 4A 01 00 00\r
+R 00 00 01 00\r
+T 4A 01 00 00 CD 00 00 00 00 B2 FF AF DD 77 B6\r
+R 00 00 01 00 02 05 19 00\r
+T 53 01 00 00 DD 77 B7 DD 36 B2 01 DD 36 B3 00\r
+R 00 00 01 00\r
+T 5E 01 00 00\r
+R 00 00 01 00\r
+T 5E 01 00 00 ED 4B 24 04 00 00 DD 6E B2 DD 66\r
 R 00 00 01 00 00 06 03 00\r
-T 03 01 00 00 B3 A7 ED 42 D2 03 05 00 00\r
+T 67 01 00 00 B3 A7 ED 42 D2 C7 05 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T 0A 01 00 00\r
+T 6E 01 00 00\r
 R 00 00 01 00\r
-T 0A 01 00 00 21 0E 00 39 4D 44 DD 5E B2 DD 56\r
+T 6E 01 00 00 21 0E 00 39 4D 44 DD 5E B2 DD 56\r
 R 00 00 01 00\r
-T 15 01 00 00 B3 CD B5 14 00 00 DD 6E B2 DD 66\r
-R 00 00 01 00 00 06 01 00\r
-T 1E 01 00 00 B3 ED 4B 38 04 00 00 09 36 FF DD\r
-R 00 00 01 00 00 07 03 00\r
-T 27 01 00 00 6E C0 DD 66 C1 7D B4 20 03\r
+T 79 01 00 00 B3 3E 8B 17 00 00 21 8B 17 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 7F 01 00 00 CD 00 00 00 00 DD 6E B2 DD 66 B3\r
+R 00 00 01 00 02 05 14 00\r
+T 88 01 00 00 ED 4B 38 04 00 00 09 36 FF DD 6E\r
+R 00 00 01 00 00 06 03 00\r
+T 91 01 00 00 C0 DD 66 C1 7D B4 20 03\r
 R 00 00 01 00\r
-T 30 01 00 00\r
+T 99 01 00 00\r
 R 00 00 01 00\r
-T 30 01 00 00 C3 F8 04 00 00\r
+T 99 01 00 00 C3 BC 05 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 33 01 00 00\r
-R 00 00 01 00\r
-T 33 01 00 00 DD 7E C0 E6 00 6F DD 7E C1 E6 F0\r
+T 9C 01 00 00\r
 R 00 00 01 00\r
-T 3E 01 00 00 67 DD 75 B4 DD 74 B5 3E A0 AC B5\r
+T 9C 01 00 00 DD 7E C0 E6 00 6F DD 7E C1 E6 F0\r
 R 00 00 01 00\r
-T 49 01 00 00 28 71 3E 80 DD AE B5 DD B6 B4 28\r
+T A7 01 00 00 67 DD 75 B4 DD 74 B5 3E A0 AC B5\r
 R 00 00 01 00\r
-T 54 01 00 00 67 3E 40 DD AE B5 DD B6 B4 28 5D\r
+T B2 01 00 00 CA 35 02 00 00 3E 80 DD AE B5 DD\r
+R 00 00 01 00 00 05 01 00\r
+T BB 01 00 00 B6 B4 28 76 3E 40 DD AE B5 DD B6\r
 R 00 00 01 00\r
-T 5F 01 00 00 3E 90 DD AE B5 DD B6 B4 28 53 3E\r
+T C6 01 00 00 B4 28 6C 3E 90 DD AE B5 DD B6 B4\r
 R 00 00 01 00\r
-T 6A 01 00 00 60 DD AE B5 DD B6 B4 28 49 3E 20\r
+T D1 01 00 00 28 62 3E 60 DD AE B5 DD B6 B4 28\r
 R 00 00 01 00\r
-T 75 01 00 00 DD AE B5 DD B6 B4 28 3F\r
+T DC 01 00 00 58 3E 20 DD AE B5 DD B6 B4 28 4E\r
 R 00 00 01 00\r
-T 7D 01 00 00\r
+T E7 01 00 00\r
 R 00 00 01 00\r
-T 7D 01 00 00\r
+T E7 01 00 00\r
 R 00 00 01 00\r
-T 7D 01 00 00\r
+T E7 01 00 00\r
 R 00 00 01 00\r
-T 7D 01 00 00 DD 6E C0 DD 66 C1 E5 DD 6E B2 DD\r
+T E7 01 00 00 DD 6E C0 DD 66 C1 E5 DD 6E B2 DD\r
 R 00 00 01 00\r
-T 88 01 00 00 66 B3 E5 21 28 00 00 00 E5 CD\r
+T F2 01 00 00 66 B3 E5 21 28 00 00 00 E5 3E\r
 R 00 00 01 00 00 08 02 00\r
-T 90 01 00 00 00 00 00 00 F1 F1 F1 CD\r
-R 00 00 01 00 02 04 08 00\r
-T 96 01 00 00 28 16 00 00 7D B4 28 20\r
+T FA 01 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T FF 01 00 00 00 00 00 00 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 05 02 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 0A 02 00 00 00 00 00 00 7D B4 28 25\r
+R 00 00 01 00 02 04 14 00\r
+T 10 02 00 00\r
+R 00 00 01 00\r
+T 10 02 00 00 AF DD 77 C0 DD 77 C1 AF DD 77 C2\r
+R 00 00 01 00\r
+T 1B 02 00 00 DD 77 C3 21 0E 00 39 4D 44 DD 5E\r
+R 00 00 01 00\r
+T 26 02 00 00 B2 DD 56 B3 3E D9 17 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 2D 02 00 00 D9 17 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 33 02 00 00 BC 05 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 9C 01 00 00\r
+T 35 02 00 00\r
 R 00 00 01 00\r
-T 9C 01 00 00 AF DD 77 C0 DD 77 C1 AF DD 77 C2\r
+T 35 02 00 00\r
 R 00 00 01 00\r
-T A7 01 00 00 DD 77 C3 21 0E 00 39 4D 44 DD 5E\r
+T 35 02 00 00 DD 6E B2 DD 66 B3 ED 4B\r
 R 00 00 01 00\r
-T B2 01 00 00 B2 DD 56 B3 CD F9 14 00 00 C3\r
-R 00 00 01 00 00 09 01 00\r
-T BA 01 00 00 F8 04 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T BC 01 00 00\r
-R 00 00 01 00\r
-T BC 01 00 00\r
-R 00 00 01 00\r
-T BC 01 00 00 DD 6E B2 DD 66 B3 ED 4B\r
-R 00 00 01 00\r
-T C4 01 00 00 38 04 00 00 09 36 00 DD 34 B6 20\r
+T 3D 02 00 00 38 04 00 00 09 36 00 DD 34 B6 20\r
 R 00 00 01 00 00 04 03 00\r
-T CD 01 00 00 03 DD 34 B7\r
+T 46 02 00 00 03 DD 34 B7\r
 R 00 00 01 00\r
-T D1 01 00 00\r
+T 4A 02 00 00\r
 R 00 00 01 00\r
-T D1 01 00 00 3E A0 DD AE B5 DD B6 B4 28 1F 3E\r
+T 4A 02 00 00 3E A0 DD AE B5 DD B6 B4 28 1F 3E\r
 R 00 00 01 00\r
-T DC 01 00 00 80 DD AE B5 DD B6 B4 28 15 3E 40\r
+T 55 02 00 00 80 DD AE B5 DD B6 B4 28 15 3E 40\r
 R 00 00 01 00\r
-T E7 01 00 00 DD AE B5 DD B6 B4 28 0B 3E 90 DD\r
+T 60 02 00 00 DD AE B5 DD B6 B4 28 0B 3E 90 DD\r
 R 00 00 01 00\r
-T F2 01 00 00 AE B5 DD B6 B4 C2 F8 04 00 00\r
+T 6B 02 00 00 AE B5 DD B6 B4 C2 BC 05 00 00\r
 R 00 00 01 00 00 0A 01 00\r
-T FA 01 00 00\r
+T 73 02 00 00\r
 R 00 00 01 00\r
-T FA 01 00 00\r
+T 73 02 00 00\r
 R 00 00 01 00\r
-T FA 01 00 00\r
+T 73 02 00 00\r
 R 00 00 01 00\r
-T FA 01 00 00 DD 36 B8 12 DD 36 B9 00\r
+T 73 02 00 00 DD 36 B8 12 DD 36 B9 00\r
 R 00 00 01 00\r
-T 02 02 00 00\r
+T 7B 02 00 00\r
 R 00 00 01 00\r
-T 02 02 00 00 DD 4E B8 DD 46 B9 21 13 00 A7 ED\r
+T 7B 02 00 00 DD 4E B8 DD 46 B9 21 13 00 A7 ED\r
 R 00 00 01 00\r
-T 0D 02 00 00 42 DA 3D 03 00 00\r
+T 86 02 00 00 42 DA D4 03 00 00\r
 R 00 00 01 00 00 06 01 00\r
-T 11 02 00 00\r
+T 8A 02 00 00\r
 R 00 00 01 00\r
-T 11 02 00 00 DD 6E B8 DD 66 B9 29 E5 21 10 00\r
+T 8A 02 00 00 DD 6E B8 DD 66 B9 29 E5 21 10 00\r
 R 00 00 01 00\r
-T 1C 02 00 00 39 01 18 00 09 4D 44 E1 09 46 23\r
+T 95 02 00 00 39 01 18 00 09 4D 44 E1 09 46 23\r
 R 00 00 01 00\r
-T 27 02 00 00 66 68 DD 75 BC DD 74 BD 7D B4 28\r
+T A0 02 00 00 66 68 DD 75 BC DD 74 BD 7D B4 28\r
 R 00 00 01 00\r
-T 32 02 00 00 6C ED 4B 26 04 00 00 DD 6E BC DD\r
+T AB 02 00 00 7B ED 4B 26 04 00 00 DD 6E BC DD\r
 R 00 00 01 00 00 07 03 00\r
-T 3B 02 00 00 66 BD A7 ED 42 38 0F ED 4B\r
+T B4 02 00 00 66 BD A7 ED 42 38 0F ED 4B\r
 R 00 00 01 00\r
-T 44 02 00 00 0C 04 00 00 DD 6E BC DD 66 BD A7\r
+T BD 02 00 00 0C 04 00 00 DD 6E BC DD 66 BD A7\r
 R 00 00 01 00 00 04 03 00\r
-T 4D 02 00 00 ED 42 38 4E\r
+T C6 02 00 00 ED 42 38 5D\r
 R 00 00 01 00\r
-T 51 02 00 00\r
+T CA 02 00 00\r
 R 00 00 01 00\r
-T 51 02 00 00\r
+T CA 02 00 00\r
 R 00 00 01 00\r
-T 51 02 00 00\r
+T CA 02 00 00\r
 R 00 00 01 00\r
-T 51 02 00 00\r
+T CA 02 00 00\r
 R 00 00 01 00\r
-T 51 02 00 00\r
+T CA 02 00 00\r
 R 00 00 01 00\r
-T 51 02 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
+T CA 02 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
 R 00 00 01 00\r
-T 5C 02 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
+T D5 02 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
 R 00 00 01 00\r
-T 67 02 00 00 5D 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 6E 02 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T 77 02 00 00 27\r
+T E0 02 00 00 5D 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T E6 02 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T ED 02 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T F2 02 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T F9 02 00 00 28 2C\r
 R 00 00 01 00\r
-T 78 02 00 00\r
+T FB 02 00 00\r
 R 00 00 01 00\r
-T 78 02 00 00 DD 6E B8 DD 66 B9 29 E5 21 10 00\r
+T FB 02 00 00 DD 6E B8 DD 66 B9 29 E5 21 10 00\r
 R 00 00 01 00\r
-T 83 02 00 00 39 01 18 00 09 4D 44 E1 09 AF 77\r
+T 06 03 00 00 39 01 18 00 09 4D 44 E1 09 AF 77\r
 R 00 00 01 00\r
-T 8E 02 00 00 23 77 21 0E 00 39 4D 44 DD 5E B2\r
+T 11 03 00 00 23 77 21 0E 00 39 4D 44 DD 5E B2\r
 R 00 00 01 00\r
-T 99 02 00 00 DD 56 B3 CD F9 14 00 00\r
-R 00 00 01 00 00 08 01 00\r
-T 9F 02 00 00\r
+T 1C 03 00 00 DD 56 B3 3E D9 17 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T 22 03 00 00 D9 17 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 27 03 00 00\r
 R 00 00 01 00\r
-T 9F 02 00 00\r
+T 27 03 00 00\r
 R 00 00 01 00\r
-T 9F 02 00 00 DD 7E BC DD B6 BD 28 67 21 16 00\r
+T 27 03 00 00 DD 7E BC DD B6 BD 28 76 21 16 00\r
 R 00 00 01 00\r
-T AA 02 00 00 39 5E 23 56 23 4E 23 46 EB 3E 09\r
+T 32 03 00 00 39 5E 23 56 23 4E 23 46 EB 3E 09\r
 R 00 00 01 00\r
-T B5 02 00 00 CD 00 00 00 00 01 12 00 A7 ED 42\r
-R 00 00 01 00 02 05 1E 00\r
-T BE 02 00 00 30 4E\r
+T 3D 03 00 00 CD 00 00 00 00 01 12 00 A7 ED 42\r
+R 00 00 01 00 02 05 20 00\r
+T 46 03 00 00 30 5D\r
 R 00 00 01 00\r
-T C0 02 00 00\r
+T 48 03 00 00\r
 R 00 00 01 00\r
-T C0 02 00 00\r
+T 48 03 00 00\r
 R 00 00 01 00\r
-T C0 02 00 00\r
+T 48 03 00 00\r
 R 00 00 01 00\r
-T C0 02 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
+T 48 03 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
 R 00 00 01 00\r
-T CB 02 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
+T 53 03 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
 R 00 00 01 00\r
-T D6 02 00 00 A7 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T DD 02 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T E6 02 00 00 27\r
+T 5E 03 00 00 A7 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 64 03 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 6B 03 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 70 03 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 77 03 00 00 28 2C\r
 R 00 00 01 00\r
-T E7 02 00 00\r
+T 79 03 00 00\r
 R 00 00 01 00\r
-T E7 02 00 00 DD 6E B8 DD 66 B9 29 E5 21 10 00\r
+T 79 03 00 00 DD 6E B8 DD 66 B9 29 E5 21 10 00\r
 R 00 00 01 00\r
-T F2 02 00 00 39 01 18 00 09 4D 44 E1 09 AF 77\r
+T 84 03 00 00 39 01 18 00 09 4D 44 E1 09 AF 77\r
 R 00 00 01 00\r
-T FD 02 00 00 23 77 21 0E 00 39 4D 44 DD 5E B2\r
+T 8F 03 00 00 23 77 21 0E 00 39 4D 44 DD 5E B2\r
 R 00 00 01 00\r
-T 08 03 00 00 DD 56 B3 CD F9 14 00 00\r
-R 00 00 01 00 00 08 01 00\r
-T 0E 03 00 00\r
+T 9A 03 00 00 DD 56 B3 3E D9 17 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T A0 03 00 00 D9 17 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T A5 03 00 00\r
 R 00 00 01 00\r
-T 0E 03 00 00\r
+T A5 03 00 00\r
 R 00 00 01 00\r
-T 0E 03 00 00 DD 7E BC DD B6 BD 28 1C\r
+T A5 03 00 00 DD 7E BC DD B6 BD 28 1C\r
 R 00 00 01 00\r
-T 16 03 00 00\r
+T AD 03 00 00\r
 R 00 00 01 00\r
-T 16 03 00 00 06 03 DD 5E BC DD 56 BD CD\r
+T AD 03 00 00 06 03 DD 5E BC DD 56 BD CD\r
 R 00 00 01 00\r
-T 1F 03 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T B6 03 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 26 03 00 00 7E BC E6 07 47 3E 01 CD\r
+T BD 03 00 00 7E BC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 2E 03 00 00 00 00 00 00 B6 77\r
-R 00 00 01 00 02 04 1D 00\r
-T 32 03 00 00\r
+T C5 03 00 00 00 00 00 00 B6 77\r
+R 00 00 01 00 02 04 1E 00\r
+T C9 03 00 00\r
 R 00 00 01 00\r
-T 32 03 00 00 DD 34 B8 20 03 DD 34 B9\r
+T C9 03 00 00 DD 34 B8 20 03 DD 34 B9\r
 R 00 00 01 00\r
-T 3A 03 00 00\r
+T D1 03 00 00\r
 R 00 00 01 00\r
-T 3A 03 00 00 C3 02 02 00 00\r
+T D1 03 00 00 C3 7B 02 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 3D 03 00 00\r
+T D4 03 00 00\r
 R 00 00 01 00\r
-T 3D 03 00 00 DD 6E FE DD 66 FF 7D B4 CA\r
+T D4 03 00 00 DD 6E FE DD 66 FF 7D B4 CA\r
 R 00 00 01 00\r
-T 46 03 00 00 18 04 00 00\r
+T DD 03 00 00 C3 04 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 48 03 00 00\r
+T DF 03 00 00\r
 R 00 00 01 00\r
-T 48 03 00 00 DD 5E FE DD 56 FF CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 51 03 00 00 DD 75 BE DD 74 BF AF DD 77 B8 DD\r
+T DF 03 00 00 DD 5E FE DD 56 FF 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T E7 03 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T EE 03 00 00 75 BE DD 74 BF AF DD 77 B8 DD 77\r
 R 00 00 01 00\r
-T 5C 03 00 00 77 B9\r
+T F9 03 00 00 B9\r
 R 00 00 01 00\r
-T 5E 03 00 00\r
+T FA 03 00 00\r
 R 00 00 01 00\r
-T 5E 03 00 00 01 00 01 DD 6E B8 DD 66 B9 A7 ED\r
+T FA 03 00 00 01 00 01 DD 6E B8 DD 66 B9 A7 ED\r
 R 00 00 01 00\r
-T 69 03 00 00 42 D2 18 04 00 00\r
+T 05 04 00 00 42 D2 C3 04 00 00\r
 R 00 00 01 00 00 06 01 00\r
-T 6D 03 00 00\r
+T 09 04 00 00\r
 R 00 00 01 00\r
-T 6D 03 00 00 DD 6E B2 DD 66 B3 29 DD 4E BE DD\r
+T 09 04 00 00 DD 6E B2 DD 66 B3 29 DD 4E BE DD\r
 R 00 00 01 00\r
-T 78 03 00 00 46 BF 09 46 23 66 68 DD 75 BC DD\r
+T 14 04 00 00 46 BF 09 46 23 66 68 DD 75 BC DD\r
 R 00 00 01 00\r
-T 83 03 00 00 74 BD 7D B4 28 60 ED 4B\r
+T 1F 04 00 00 74 BD 7D B4 28 6F ED 4B\r
 R 00 00 01 00\r
-T 8B 03 00 00 26 04 00 00 DD 6E BC DD 66 BD A7\r
+T 27 04 00 00 26 04 00 00 DD 6E BC DD 66 BD A7\r
 R 00 00 01 00 00 04 03 00\r
-T 94 03 00 00 ED 42 38 0F ED 4B 0C 04 00 00 DD\r
+T 30 04 00 00 ED 42 38 0F ED 4B 0C 04 00 00 DD\r
 R 00 00 01 00 00 0A 03 00\r
-T 9D 03 00 00 6E BC DD 66 BD A7 ED 42 38 42\r
+T 39 04 00 00 6E BC DD 66 BD A7 ED 42 38 51\r
 R 00 00 01 00\r
-T A7 03 00 00\r
+T 43 04 00 00\r
 R 00 00 01 00\r
-T A7 03 00 00\r
+T 43 04 00 00\r
 R 00 00 01 00\r
-T A7 03 00 00\r
+T 43 04 00 00\r
 R 00 00 01 00\r
-T A7 03 00 00\r
+T 43 04 00 00\r
 R 00 00 01 00\r
-T A7 03 00 00\r
+T 43 04 00 00\r
 R 00 00 01 00\r
-T A7 03 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
+T 43 04 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
 R 00 00 01 00\r
-T B2 03 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
+T 4E 04 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
 R 00 00 01 00\r
-T BD 03 00 00 F5 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T C4 03 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T CD 03 00 00 1B\r
+T 59 04 00 00 F5 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 5F 04 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 66 04 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 6B 04 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 72 04 00 00 28 20\r
 R 00 00 01 00\r
-T CE 03 00 00\r
+T 74 04 00 00\r
 R 00 00 01 00\r
-T CE 03 00 00 DD 6E B8 DD 66 B9 29 DD 4E BE DD\r
+T 74 04 00 00 DD 6E B8 DD 66 B9 29 DD 4E BE DD\r
 R 00 00 01 00\r
-T D9 03 00 00 46 BF 09 AF 77 23 77 DD 5E B8 DD\r
+T 7F 04 00 00 46 BF 09 AF 77 23 77 DD 5E B8 DD\r
 R 00 00 01 00\r
-T E4 03 00 00 56 B9 CD 8B 14 00 00\r
-R 00 00 01 00 00 07 01 00\r
-T E9 03 00 00\r
+T 8A 04 00 00 56 B9 3E 52 17 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 8F 04 00 00 52 17 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 94 04 00 00\r
 R 00 00 01 00\r
-T E9 03 00 00\r
+T 94 04 00 00\r
 R 00 00 01 00\r
-T E9 03 00 00 DD 7E BC DD B6 BD 28 1C\r
+T 94 04 00 00 DD 7E BC DD B6 BD 28 1C\r
 R 00 00 01 00\r
-T F1 03 00 00\r
+T 9C 04 00 00\r
 R 00 00 01 00\r
-T F1 03 00 00 06 03 DD 5E BC DD 56 BD CD\r
+T 9C 04 00 00 06 03 DD 5E BC DD 56 BD CD\r
 R 00 00 01 00\r
-T FA 03 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T A5 04 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 01 04 00 00 7E BC E6 07 47 3E 01 CD\r
+T AC 04 00 00 7E BC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 09 04 00 00 00 00 00 00 B6 77\r
-R 00 00 01 00 02 04 1D 00\r
-T 0D 04 00 00\r
+T B4 04 00 00 00 00 00 00 B6 77\r
+R 00 00 01 00 02 04 1E 00\r
+T B8 04 00 00\r
 R 00 00 01 00\r
-T 0D 04 00 00 DD 34 B8 20 03 DD 34 B9\r
+T B8 04 00 00 DD 34 B8 20 03 DD 34 B9\r
 R 00 00 01 00\r
-T 15 04 00 00\r
+T C0 04 00 00\r
 R 00 00 01 00\r
-T 15 04 00 00 C3 5E 03 00 00\r
+T C0 04 00 00 C3 FA 03 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 18 04 00 00\r
+T C3 04 00 00\r
 R 00 00 01 00\r
-T 18 04 00 00\r
+T C3 04 00 00\r
 R 00 00 01 00\r
-T 18 04 00 00 AF DD 77 B8 DD 77 B9 21 16 00 39\r
+T C3 04 00 00 AF DD 77 B8 DD 77 B9 21 16 00 39\r
 R 00 00 01 00\r
-T 23 04 00 00 5E 23 56 23 4E 23 46 EB 3E 09 CD\r
+T CE 04 00 00 5E 23 56 23 4E 23 46 EB 3E 09 CD\r
 R 00 00 01 00\r
-T 2E 04 00 00 00 00 00 00 DD 75 BA DD 74 BB\r
-R 00 00 01 00 02 04 1E 00\r
-T 36 04 00 00\r
+T D9 04 00 00 00 00 00 00 DD 75 BA DD 74 BB\r
+R 00 00 01 00 02 04 20 00\r
+T E1 04 00 00\r
 R 00 00 01 00\r
-T 36 04 00 00 DD 4E B8 DD 46 B9 DD 6E BA DD 66\r
+T E1 04 00 00 DD 4E B8 DD 46 B9 DD 6E BA DD 66\r
 R 00 00 01 00\r
-T 41 04 00 00 BB A7 ED 42 DA F8 04 00 00\r
+T EC 04 00 00 BB A7 ED 42 DA BC 05 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T 48 04 00 00\r
+T F3 04 00 00\r
 R 00 00 01 00\r
-T 48 04 00 00 DD 4E B8 DD 46 B9 21 0E 00 39 5D\r
+T F3 04 00 00 DD 4E B8 DD 46 B9 21 0E 00 39 5D\r
 R 00 00 01 00\r
-T 53 04 00 00 54 CD 88 11 00 00 DD 75 BC DD 74\r
-R 00 00 01 00 00 06 01 00\r
-T 5C 04 00 00 BD 7D B4 28 68 ED 4B 26 04 00 00\r
-R 00 00 01 00 00 0B 03 00\r
-T 65 04 00 00 DD 6E BC DD 66 BD A7 ED 42 38 0F\r
+T FE 04 00 00 54 3E EF 13 00 00 21 EF 13 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 04 05 00 00 CD 00 00 00 00 DD 75 BC DD 74 BD\r
+R 00 00 01 00 02 05 14 00\r
+T 0D 05 00 00 7D B4 28 7C ED 4B 26 04 00 00 DD\r
+R 00 00 01 00 00 0A 03 00\r
+T 16 05 00 00 6E BC DD 66 BD A7 ED 42 38 0F ED\r
 R 00 00 01 00\r
-T 70 04 00 00 ED 4B 0C 04 00 00 DD 6E BC DD 66\r
-R 00 00 01 00 00 06 03 00\r
-T 79 04 00 00 BD A7 ED 42 38 4A\r
+T 21 05 00 00 4B 0C 04 00 00 DD 6E BC DD 66 BD\r
+R 00 00 01 00 00 05 03 00\r
+T 2A 05 00 00 A7 ED 42 38 5E\r
 R 00 00 01 00\r
-T 7F 04 00 00\r
+T 2F 05 00 00\r
 R 00 00 01 00\r
-T 7F 04 00 00\r
+T 2F 05 00 00\r
 R 00 00 01 00\r
-T 7F 04 00 00\r
+T 2F 05 00 00\r
 R 00 00 01 00\r
-T 7F 04 00 00\r
+T 2F 05 00 00\r
 R 00 00 01 00\r
-T 7F 04 00 00\r
+T 2F 05 00 00\r
 R 00 00 01 00\r
-T 7F 04 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
+T 2F 05 00 00 DD 6E BC DD 66 BD E5 DD 6E B8 DD\r
 R 00 00 01 00\r
-T 8A 04 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
+T 3A 05 00 00 66 B9 E5 DD 6E B2 DD 66 B3 E5 21\r
 R 00 00 01 00\r
-T 95 04 00 00 3F 01 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 9C 04 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T A5 04 00 00 23\r
+T 45 05 00 00 3F 01 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 4B 05 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 52 05 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 57 05 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 5E 05 00 00 28 2D\r
 R 00 00 01 00\r
-T A6 04 00 00\r
+T 60 05 00 00\r
 R 00 00 01 00\r
-T A6 04 00 00 21 00 00 E5 DD 4E B8 DD 46 B9 21\r
+T 60 05 00 00 21 00 00 E5 DD 4E B8 DD 46 B9 21\r
 R 00 00 01 00\r
-T B1 04 00 00 10 00 39 5D 54 CD 75 12 00 00 E1\r
-R 00 00 01 00 00 0A 01 00\r
-T BA 04 00 00 21 0E 00 39 4D 44 DD 5E B2 DD 56\r
+T 6B 05 00 00 10 00 39 5D 54 3E EB 14 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T 73 05 00 00 EB 14 00 00 CD 00 00 00 00 E1 21\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 7A 05 00 00 0E 00 39 4D 44 DD 5E B2 DD 56 B3\r
 R 00 00 01 00\r
-T C5 04 00 00 B3 CD F9 14 00 00\r
-R 00 00 01 00 00 06 01 00\r
-T C9 04 00 00\r
+T 85 05 00 00 3E D9 17 00 00 21 D9 17 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 8B 05 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 8D 05 00 00\r
 R 00 00 01 00\r
-T C9 04 00 00\r
+T 8D 05 00 00\r
 R 00 00 01 00\r
-T C9 04 00 00 DD 7E BC DD B6 BD 28 1C\r
+T 8D 05 00 00 DD 7E BC DD B6 BD 28 1C\r
 R 00 00 01 00\r
-T D1 04 00 00\r
+T 95 05 00 00\r
 R 00 00 01 00\r
-T D1 04 00 00 06 03 DD 5E BC DD 56 BD CD\r
+T 95 05 00 00 06 03 DD 5E BC DD 56 BD CD\r
 R 00 00 01 00\r
-T DA 04 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T 9E 05 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T E1 04 00 00 7E BC E6 07 47 3E 01 CD\r
+T A5 05 00 00 7E BC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T E9 04 00 00 00 00 00 00 B6 77\r
-R 00 00 01 00 02 04 1D 00\r
-T ED 04 00 00\r
+T AD 05 00 00 00 00 00 00 B6 77\r
+R 00 00 01 00 02 04 1E 00\r
+T B1 05 00 00\r
 R 00 00 01 00\r
-T ED 04 00 00 DD 34 B8 20 03 DD 34 B9\r
+T B1 05 00 00 DD 34 B8 20 03 DD 34 B9\r
 R 00 00 01 00\r
-T F5 04 00 00\r
+T B9 05 00 00\r
 R 00 00 01 00\r
-T F5 04 00 00 C3 36 04 00 00\r
+T B9 05 00 00 C3 E1 04 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T F8 04 00 00\r
+T BC 05 00 00\r
 R 00 00 01 00\r
-T F8 04 00 00\r
+T BC 05 00 00\r
 R 00 00 01 00\r
-T F8 04 00 00\r
+T BC 05 00 00\r
 R 00 00 01 00\r
-T F8 04 00 00 DD 34 B2 20 03 DD 34 B3\r
+T BC 05 00 00 DD 34 B2 20 03 DD 34 B3\r
 R 00 00 01 00\r
-T 00 05 00 00\r
+T C4 05 00 00\r
 R 00 00 01 00\r
-T 00 05 00 00 C3 FA 00 00 00\r
+T C4 05 00 00 C3 5E 01 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 03 05 00 00\r
+T C7 05 00 00\r
 R 00 00 01 00\r
-T 03 05 00 00 DD 4E B6 DD 46 B7 2A 24 04 00 00\r
+T C7 05 00 00 DD 4E B6 DD 46 B7 2A 24 04 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T 0C 05 00 00 A7 ED 42 01 FF FF 09 DD 75 B8 DD\r
+T D0 05 00 00 A7 ED 42 01 FF FF 09 DD 75 B8 DD\r
 R 00 00 01 00\r
-T 17 05 00 00 74 B9 ED 4B 10 04 00 00 A7 ED 42\r
+T DB 05 00 00 74 B9 ED 4B 10 04 00 00 A7 ED 42\r
 R 00 00 01 00 00 08 03 00\r
-T 20 05 00 00 28 31\r
+T E4 05 00 00 28 40\r
 R 00 00 01 00\r
-T 22 05 00 00\r
+T E6 05 00 00\r
 R 00 00 01 00\r
-T 22 05 00 00 DD 6E B8 DD 66 B9 E5 21\r
+T E6 05 00 00 DD 6E B8 DD 66 B9 E5 21\r
 R 00 00 01 00\r
-T 2A 05 00 00 10 04 00 00 4E 23 46 C5 21\r
+T EE 05 00 00 10 04 00 00 4E 23 46 C5 21\r
 R 00 00 01 00 00 04 03 00\r
-T 31 05 00 00 79 01 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 38 05 00 00 F1 F1 CD 28 16 00 00 7D B4 28 12\r
-R 00 00 01 00 00 07 01 00\r
-T 41 05 00 00\r
-R 00 00 01 00\r
-T 41 05 00 00 DD 6E B8 DD 66 B9 22 10 04 00 00\r
+T F5 05 00 00 79 01 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T FB 05 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 02 06 00 00 F1 3E 44 19 00 00 21 44 19 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 08 06 00 00 CD 00 00 00 00 7D B4 28 17\r
+R 00 00 01 00 02 05 14 00\r
+T 0F 06 00 00\r
+R 00 00 01 00\r
+T 0F 06 00 00 DD 6E B8 DD 66 B9 22 10 04 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T 4A 05 00 00 01 06 04 00 00 11 01 00 CD\r
+T 18 06 00 00 01 06 04 00 00 11 01 00 3E\r
 R 00 00 01 00 00 05 03 00\r
-T 51 05 00 00 8B 14 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 53 05 00 00\r
+T 1F 06 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 24 06 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 26 06 00 00\r
 R 00 00 01 00\r
-T 53 05 00 00\r
+T 26 06 00 00\r
 R 00 00 01 00\r
-T 53 05 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 56 05 00 00\r
+T 26 06 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 29 06 00 00\r
 R 00 00 01 00\r
-T 56 05 00 00 CD 00 00 00 00 F0 FF 2A\r
-R 00 00 01 00 02 05 18 00\r
-T 5C 05 00 00 0E 04 00 00 DD 75 F6 DD 74 F7 2A\r
+T 29 06 00 00 CD 00 00 00 00 F0 FF 2A\r
+R 00 00 01 00 02 05 19 00\r
+T 2F 06 00 00 0E 04 00 00 DD 75 F6 DD 74 F7 2A\r
 R 00 00 01 00 00 04 03 00\r
-T 65 05 00 00 10 04 00 00 DD 75 F8 DD 74 F9 21\r
+T 38 06 00 00 10 04 00 00 DD 75 F8 DD 74 F9 21\r
 R 00 00 01 00 00 04 03 00\r
-T 6E 05 00 00 B3 01 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 75 05 00 00 CD 28 16 00 00 7D B4 20 03\r
-R 00 00 01 00 00 05 01 00\r
-T 7C 05 00 00\r
-R 00 00 01 00\r
-T 7C 05 00 00 C3 CD 07 00 00\r
+T 41 06 00 00 B3 01 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 47 06 00 00 00 00 00 00 CD 00 00 00 00 F1 3E\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 4E 06 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 53 06 00 00 00 00 00 00 7D B4 20 03\r
+R 00 00 01 00 02 04 14 00\r
+T 59 06 00 00\r
+R 00 00 01 00\r
+T 59 06 00 00 C3 CD 08 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 7F 05 00 00\r
+T 5C 06 00 00\r
 R 00 00 01 00\r
-T 7F 05 00 00 2A 16 04 00 00 DD 75 FA DD 74 FB\r
+T 5C 06 00 00 2A 16 04 00 00 DD 75 FA DD 74 FB\r
 R 00 00 01 00 00 05 03 00\r
-T 88 05 00 00 2A 18 04 00 00 DD 75 FC DD 74 FD\r
+T 65 06 00 00 2A 18 04 00 00 DD 75 FC DD 74 FD\r
 R 00 00 01 00 00 05 03 00\r
-T 91 05 00 00 2A 1A 04 00 00 DD 75 FE DD 74 FF\r
+T 6E 06 00 00 2A 1A 04 00 00 DD 75 FE DD 74 FF\r
 R 00 00 01 00 00 05 03 00\r
-T 9A 05 00 00 AF DD 77 F2 DD 77 F3\r
+T 77 06 00 00 AF DD 77 F2 DD 77 F3\r
 R 00 00 01 00\r
-T A1 05 00 00\r
+T 7E 06 00 00\r
 R 00 00 01 00\r
-T A1 05 00 00 2A 0A 04 00 00 ED 4B 26 04 00 00\r
+T 7E 06 00 00 2A 0A 04 00 00 ED 4B 26 04 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T A8 05 00 00 09 4D 44 DD 6E F2 DD 66 F3 A7 ED\r
+T 85 06 00 00 09 4D 44 DD 6E F2 DD 66 F3 A7 ED\r
 R 00 00 01 00\r
-T B3 05 00 00 42 30 26\r
+T 90 06 00 00 42 30 26\r
 R 00 00 01 00\r
-T B6 05 00 00\r
+T 93 06 00 00\r
 R 00 00 01 00\r
-T B6 05 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
+T 93 06 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
 R 00 00 01 00\r
-T BF 05 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T 9C 06 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T C6 05 00 00 7E F2 E6 07 47 3E 01 CD\r
+T A3 06 00 00 7E F2 E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T CE 05 00 00 00 00 00 00 B6 77 DD 34 F2 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T D7 05 00 00 DD 34 F3\r
+T AB 06 00 00 00 00 00 00 B6 77 DD 34 F2 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T B4 06 00 00 DD 34 F3\r
 R 00 00 01 00\r
-T DA 05 00 00\r
+T B7 06 00 00\r
 R 00 00 01 00\r
-T DA 05 00 00 18 C5\r
+T B7 06 00 00 18 C5\r
 R 00 00 01 00\r
-T DC 05 00 00\r
+T B9 06 00 00\r
 R 00 00 01 00\r
-T DC 05 00 00 DD 4E FC DD 46 FD DD 6E FE DD 66\r
+T B9 06 00 00 DD 4E FC DD 46 FD DD 6E FE DD 66\r
 R 00 00 01 00\r
-T E7 05 00 00 FF A7 ED 42 29 29 29 DD 75 F4 DD\r
+T C4 06 00 00 FF A7 ED 42 29 29 29 DD 75 F4 DD\r
 R 00 00 01 00\r
-T F2 05 00 00 74 F5 2A 0C 04 00 00 DD 75 F2 DD\r
+T CF 06 00 00 74 F5 2A 0C 04 00 00 DD 75 F2 DD\r
 R 00 00 01 00 00 07 03 00\r
-T FB 05 00 00 74 F3\r
+T D8 06 00 00 74 F3\r
 R 00 00 01 00\r
-T FD 05 00 00\r
+T DA 06 00 00\r
 R 00 00 01 00\r
-T FD 05 00 00 DD 6E F4 DD 66 F5 DD 4E F2 DD 46\r
+T DA 06 00 00 DD 6E F4 DD 66 F5 DD 4E F2 DD 46\r
 R 00 00 01 00\r
-T 08 06 00 00 F3 A7 ED 42 28 26\r
+T E5 06 00 00 F3 A7 ED 42 28 26\r
 R 00 00 01 00\r
-T 0E 06 00 00\r
+T EB 06 00 00\r
 R 00 00 01 00\r
-T 0E 06 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
+T EB 06 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
 R 00 00 01 00\r
-T 17 06 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T F4 06 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 1E 06 00 00 7E F2 E6 07 47 3E 01 CD\r
+T FB 06 00 00 7E F2 E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 26 06 00 00 00 00 00 00 B6 77 DD 34 F2 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T 2F 06 00 00 DD 34 F3\r
+T 03 07 00 00 00 00 00 00 B6 77 DD 34 F2 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T 0C 07 00 00 DD 34 F3\r
 R 00 00 01 00\r
-T 32 06 00 00\r
+T 0F 07 00 00\r
 R 00 00 01 00\r
-T 32 06 00 00 18 C9\r
+T 0F 07 00 00 18 C9\r
 R 00 00 01 00\r
-T 34 06 00 00\r
+T 11 07 00 00\r
 R 00 00 01 00\r
-T 34 06 00 00 21 00 00 22 0E 04 00 00 2A\r
+T 11 07 00 00 21 00 00 22 0E 04 00 00 2A\r
 R 00 00 01 00 00 08 03 00\r
-T 3B 06 00 00 0A 04 00 00 ED 4B 26 04 00 00 09\r
+T 18 07 00 00 0A 04 00 00 ED 4B 26 04 00 00 09\r
 R 00 00 01 00 00 04 03 00 00 0A 03 00\r
-T 42 06 00 00 DD 75 F2 DD 74 F3\r
+T 1F 07 00 00 DD 75 F2 DD 74 F3\r
 R 00 00 01 00\r
-T 48 06 00 00\r
+T 25 07 00 00\r
 R 00 00 01 00\r
-T 48 06 00 00 ED 4B 0C 04 00 00 DD 6E F2 DD 66\r
+T 25 07 00 00 ED 4B 0C 04 00 00 DD 6E F2 DD 66\r
 R 00 00 01 00 00 06 03 00\r
-T 51 06 00 00 F3 A7 ED 42 30 2E\r
+T 2E 07 00 00 F3 A7 ED 42 30 2E\r
 R 00 00 01 00\r
-T 57 06 00 00\r
+T 34 07 00 00\r
 R 00 00 01 00\r
-T 57 06 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
+T 34 07 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
 R 00 00 01 00\r
-T 60 06 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T 3D 07 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 67 06 00 00 7E F2 E6 07 47 3E 01 CD\r
+T 44 07 00 00 7E F2 E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 6F 06 00 00 00 00 00 00 A6 20 07\r
-R 00 00 01 00 02 04 1D 00\r
-T 74 06 00 00\r
+T 4C 07 00 00 00 00 00 00 A6 20 07\r
+R 00 00 01 00 02 04 1E 00\r
+T 51 07 00 00\r
 R 00 00 01 00\r
-T 74 06 00 00 2A 0E 04 00 00 23 22 0E 04 00 00\r
+T 51 07 00 00 2A 0E 04 00 00 23 22 0E 04 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T 7B 06 00 00\r
+T 58 07 00 00\r
 R 00 00 01 00\r
-T 7B 06 00 00 DD 34 F2 20 03 DD 34 F3\r
+T 58 07 00 00 DD 34 F2 20 03 DD 34 F3\r
 R 00 00 01 00\r
-T 83 06 00 00\r
+T 60 07 00 00\r
 R 00 00 01 00\r
-T 83 06 00 00 18 C3\r
+T 60 07 00 00 18 C3\r
 R 00 00 01 00\r
-T 85 06 00 00\r
+T 62 07 00 00\r
 R 00 00 01 00\r
-T 85 06 00 00 DD 6E FE DD 66 FF 01 00 00 C5 E5\r
+T 62 07 00 00 DD 6E FE DD 66 FF 01 00 00 C5 E5\r
 R 00 00 01 00\r
-T 90 06 00 00 DD 6E FC DD 66 FD 01 00 00 C5 E5\r
+T 6D 07 00 00 DD 6E FC DD 66 FD 01 00 00 C5 E5\r
 R 00 00 01 00\r
-T 9B 06 00 00 ED 5B 36 04 00 00 CD 27 19 00 00\r
-R 00 00 01 00 00 06 03 00 00 0B 01 00\r
-T A2 06 00 00 E1 E1 E1 E1 2A 34 04 00 00 7E F6\r
-R 00 00 01 00 00 09 03 00\r
-T AB 06 00 00 01 77 2A 34 04 00 00 7E F6 02 77\r
-R 00 00 01 00 00 07 03 00\r
-T B4 06 00 00 DD 36 F2 02 DD 36 F3 00\r
+T 78 07 00 00 ED 5B 36 04 00 00 3E 39 1D 00 00\r
+R 00 00 01 00 00 06 03 00 29 0B 01 00\r
+T 7E 07 00 00 21 39 1D 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 85 07 00 00 E1 E1 E1 2A 34 04 00 00 7E F6 01\r
+R 00 00 01 00 00 08 03 00\r
+T 8E 07 00 00 77 2A 34 04 00 00 7E F6 02 77 DD\r
+R 00 00 01 00 00 06 03 00\r
+T 97 07 00 00 36 F2 02 DD 36 F3 00\r
 R 00 00 01 00\r
-T BC 06 00 00\r
+T 9E 07 00 00\r
 R 00 00 01 00\r
-T BC 06 00 00 ED 4B 24 04 00 00 DD 6E F2 DD 66\r
+T 9E 07 00 00 ED 4B 24 04 00 00 DD 6E F2 DD 66\r
 R 00 00 01 00 00 06 03 00\r
-T C5 06 00 00 F3 A7 ED 42 30 35\r
+T A7 07 00 00 F3 A7 ED 42 30 35\r
 R 00 00 01 00\r
-T CB 06 00 00\r
+T AD 07 00 00\r
 R 00 00 01 00\r
-T CB 06 00 00 DD 6E F2 DD 66 F3 ED 4B\r
+T AD 07 00 00 DD 6E F2 DD 66 F3 ED 4B\r
 R 00 00 01 00\r
-T D3 06 00 00 38 04 00 00 09 46 04 28 1C\r
+T B5 07 00 00 38 04 00 00 09 46 04 28 1C\r
 R 00 00 01 00 00 04 03 00\r
-T DA 06 00 00\r
+T BC 07 00 00\r
 R 00 00 01 00\r
-T DA 06 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
+T BC 07 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
 R 00 00 01 00\r
-T E3 06 00 00 00 00 00 00 2A 34 04 00 00 19 DD\r
+T C5 07 00 00 00 00 00 00 2A 34 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T EA 06 00 00 7E F2 E6 07 47 3E 01 CD\r
+T CC 07 00 00 7E F2 E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T F2 06 00 00 00 00 00 00 B6 77\r
-R 00 00 01 00 02 04 1D 00\r
-T F6 06 00 00\r
+T D4 07 00 00 00 00 00 00 B6 77\r
+R 00 00 01 00 02 04 1E 00\r
+T D8 07 00 00\r
 R 00 00 01 00\r
-T F6 06 00 00 DD 34 F2 20 03 DD 34 F3\r
+T D8 07 00 00 DD 34 F2 20 03 DD 34 F3\r
 R 00 00 01 00\r
-T FE 06 00 00\r
+T E0 07 00 00\r
 R 00 00 01 00\r
-T FE 06 00 00 18 BC\r
+T E0 07 00 00 18 BC\r
 R 00 00 01 00\r
-T 00 07 00 00\r
+T E2 07 00 00\r
 R 00 00 01 00\r
-T 00 07 00 00 DD 4E FA DD 46 FB DD 6E FC DD 66\r
+T E2 07 00 00 DD 4E FA DD 46 FB DD 6E FC DD 66\r
 R 00 00 01 00\r
-T 0B 07 00 00 FD A7 ED 42 29 29 29 DD 75 F4 DD\r
+T ED 07 00 00 FD A7 ED 42 29 29 29 DD 75 F4 DD\r
 R 00 00 01 00\r
-T 16 07 00 00 74 F5 2A 0A 04 00 00 29 29 29 DD\r
+T F8 07 00 00 74 F5 2A 0A 04 00 00 29 29 29 DD\r
 R 00 00 01 00 00 07 03 00\r
-T 1F 07 00 00 75 F2 DD 74 F3\r
+T 01 08 00 00 75 F2 DD 74 F3\r
 R 00 00 01 00\r
-T 24 07 00 00\r
+T 06 08 00 00\r
 R 00 00 01 00\r
-T 24 07 00 00 DD 6E F4 DD 66 F5 DD 4E F2 DD 46\r
+T 06 08 00 00 DD 6E F4 DD 66 F5 DD 4E F2 DD 46\r
 R 00 00 01 00\r
-T 2F 07 00 00 F3 A7 ED 42 28 26\r
+T 11 08 00 00 F3 A7 ED 42 28 26\r
 R 00 00 01 00\r
-T 35 07 00 00\r
+T 17 08 00 00\r
 R 00 00 01 00\r
-T 35 07 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
+T 17 08 00 00 06 03 DD 5E F2 DD 56 F3 CD\r
 R 00 00 01 00\r
-T 3E 07 00 00 00 00 00 00 2A 34 04 00 00 19 DD\r
+T 20 08 00 00 00 00 00 00 2A 34 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 45 07 00 00 7E F2 E6 07 47 3E 01 CD\r
+T 27 08 00 00 7E F2 E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 4D 07 00 00 00 00 00 00 B6 77 DD 34 F2 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T 56 07 00 00 DD 34 F3\r
+T 2F 08 00 00 00 00 00 00 B6 77 DD 34 F2 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T 38 08 00 00 DD 34 F3\r
 R 00 00 01 00\r
-T 59 07 00 00\r
+T 3B 08 00 00\r
 R 00 00 01 00\r
-T 59 07 00 00 18 C9\r
+T 3B 08 00 00 18 C9\r
 R 00 00 01 00\r
-T 5B 07 00 00\r
+T 3D 08 00 00\r
 R 00 00 01 00\r
-T 5B 07 00 00 DD 6E FC DD 66 FD 01 00 00 C5 E5\r
+T 3D 08 00 00 DD 6E FC DD 66 FD 01 00 00 C5 E5\r
 R 00 00 01 00\r
-T 66 07 00 00 DD 6E FA DD 66 FB 01 00 00 C5 E5\r
+T 48 08 00 00 DD 6E FA DD 66 FB 01 00 00 C5 E5\r
 R 00 00 01 00\r
-T 71 07 00 00 ED 5B 34 04 00 00 CD 27 19 00 00\r
-R 00 00 01 00 00 06 03 00 00 0B 01 00\r
-T 78 07 00 00 E1 E1 E1 E1 11 04 00 CD\r
+T 53 08 00 00 ED 5B 34 04 00 00 3E 39 1D 00 00\r
+R 00 00 01 00 00 06 03 00 29 0B 01 00\r
+T 59 08 00 00 21 39 1D 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 60 08 00 00 E1 E1 E1 11 04 00 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 68 08 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 6F 08 00 00 75 F0 DD 74 F1 01 1E 00 C5 4D 44\r
 R 00 00 01 00\r
-T 80 07 00 00 5B 14 00 00 DD 75 F0 DD 74 F1 01\r
-R 00 00 01 00 00 04 01 00\r
-T 89 07 00 00 1E 00 C5 4D 44 11 06 04 00 00 CD\r
-R 00 00 01 00 00 0A 03 00\r
-T 92 07 00 00 00 00 00 00 E1 DD 4E F0 DD 46 F1\r
-R 00 00 01 00 02 04 11 00\r
-T 9B 07 00 00 11 04 00 CD 8B 14 00 00 2A\r
-R 00 00 01 00 00 08 01 00\r
-T A2 07 00 00 0E 04 00 00 DD 4E F6 DD 46 F7 A7\r
-R 00 00 01 00 00 04 03 00\r
-T AB 07 00 00 ED 42 28 1E\r
+T 7A 08 00 00 11 06 04 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 03 00 2B 0A 11 00\r
+T 80 08 00 00 00 00 00 00 CD 00 00 00 00 E1 DD\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T 87 08 00 00 4E F0 DD 46 F1 11 04 00 3E\r
 R 00 00 01 00\r
-T AF 07 00 00\r
+T 90 08 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 95 08 00 00 00 00 00 00 2A 0E 04 00 00 DD 4E\r
+R 00 00 01 00 02 04 14 00 00 09 03 00\r
+T 9C 08 00 00 F6 DD 46 F7 A7 ED 42 28 28\r
 R 00 00 01 00\r
-T AF 07 00 00 DD 6E F6 DD 66 F7 E5 21\r
+T A5 08 00 00\r
 R 00 00 01 00\r
-T B7 07 00 00 0E 04 00 00 4E 23 46 C5 21\r
+T A5 08 00 00 DD 6E F6 DD 66 F7 E5 21\r
+R 00 00 01 00\r
+T AD 08 00 00 0E 04 00 00 4E 23 46 C5 21\r
 R 00 00 01 00 00 04 03 00\r
-T BE 07 00 00 D2 01 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T C5 07 00 00 F1 F1 11 00 00 00 00 CD\r
-R 00 00 01 00 02 07 14 00\r
-T CB 07 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 04 00\r
-T CD 07 00 00\r
-R 00 00 01 00\r
-T CD 07 00 00\r
-R 00 00 01 00\r
-T CD 07 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T D0 07 00 00\r
-R 00 00 01 00\r
-T D0 07 00 00 CD 00 00 00 00 B4 FF 2A\r
-R 00 00 01 00 02 05 18 00\r
-T D6 07 00 00 26 04 00 00 DD 75 F8 DD 74 F9\r
+T B4 08 00 00 D2 01 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T BA 08 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T C1 08 00 00 F1 11 00 00 00 00 3E 00 00 00 00\r
+R 00 00 01 00 02 06 15 00 2B 0B 04 00\r
+T C7 08 00 00 21 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 04 00 02 0A 14 00\r
+T CD 08 00 00\r
+R 00 00 01 00\r
+T CD 08 00 00\r
+R 00 00 01 00\r
+T CD 08 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T D0 08 00 00\r
+R 00 00 01 00\r
+T D0 08 00 00 CD 00 00 00 00 B4 FF 2A\r
+R 00 00 01 00 02 05 19 00\r
+T D6 08 00 00 26 04 00 00 DD 75 F8 DD 74 F9\r
 R 00 00 01 00 00 04 03 00\r
-T DE 07 00 00\r
+T DE 08 00 00\r
 R 00 00 01 00\r
-T DE 07 00 00 ED 4B 0C 04 00 00 DD 6E F8 DD 66\r
+T DE 08 00 00 ED 4B 0C 04 00 00 DD 6E F8 DD 66\r
 R 00 00 01 00 00 06 03 00\r
-T E7 07 00 00 F9 A7 ED 42 30 27\r
+T E7 08 00 00 F9 A7 ED 42 30 27\r
 R 00 00 01 00\r
-T ED 07 00 00\r
+T ED 08 00 00\r
 R 00 00 01 00\r
-T ED 07 00 00 06 03 DD 5E F8 DD 56 F9 CD\r
+T ED 08 00 00 06 03 DD 5E F8 DD 56 F9 CD\r
 R 00 00 01 00\r
-T F6 07 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T F6 08 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T FD 07 00 00 7E F8 E6 07 47 3E 01 CD\r
+T FD 08 00 00 7E F8 E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 05 08 00 00 00 00 00 00 2F A6 77 DD 34 F8 20\r
-R 00 00 01 00 02 04 1D 00\r
-T 0E 08 00 00 03 DD 34 F9\r
+T 05 09 00 00 00 00 00 00 2F A6 77 DD 34 F8 20\r
+R 00 00 01 00 02 04 1E 00\r
+T 0E 09 00 00 03 DD 34 F9\r
 R 00 00 01 00\r
-T 12 08 00 00\r
+T 12 09 00 00\r
 R 00 00 01 00\r
-T 12 08 00 00 18 CA\r
+T 12 09 00 00 18 CA\r
 R 00 00 01 00\r
-T 14 08 00 00\r
+T 14 09 00 00\r
 R 00 00 01 00\r
-T 14 08 00 00 DD 36 B4 01 DD 36 B5 00\r
+T 14 09 00 00 DD 36 B4 01 DD 36 B5 00\r
 R 00 00 01 00\r
-T 1C 08 00 00\r
+T 1C 09 00 00\r
 R 00 00 01 00\r
-T 1C 08 00 00 ED 4B 24 04 00 00 DD 6E B4 DD 66\r
+T 1C 09 00 00 ED 4B 24 04 00 00 DD 6E B4 DD 66\r
 R 00 00 01 00 00 06 03 00\r
-T 25 08 00 00 B5 A7 ED 42 D2 9B 0A 00 00\r
+T 25 09 00 00 B5 A7 ED 42 D2 FA 0B 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T 2C 08 00 00\r
+T 2C 09 00 00\r
 R 00 00 01 00\r
-T 2C 08 00 00 21 04 00 39 4D 44 DD 5E B4 DD 56\r
+T 2C 09 00 00 21 04 00 39 4D 44 DD 5E B4 DD 56\r
 R 00 00 01 00\r
-T 37 08 00 00 B5 CD B5 14 00 00 DD 7E B8 E6 00\r
-R 00 00 01 00 00 06 01 00\r
-T 40 08 00 00 6F DD 7E B9 E6 F0 67 DD 75 B6 DD\r
+T 37 09 00 00 B5 3E 8B 17 00 00 21 8B 17 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 3D 09 00 00 CD 00 00 00 00 DD 7E B8 E6 00 6F\r
+R 00 00 01 00 02 05 14 00\r
+T 46 09 00 00 DD 7E B9 E6 F0 67 DD 75 B6 DD 74\r
 R 00 00 01 00\r
-T 4B 08 00 00 74 B7 3E A0 AC B5 28 21 3E 80 DD\r
+T 51 09 00 00 B7 3E A0 AC B5 28 21 3E 80 DD AE\r
 R 00 00 01 00\r
-T 56 08 00 00 AE B7 DD B6 B6 28 17 3E 40 DD AE\r
+T 5C 09 00 00 B7 DD B6 B6 28 17 3E 40 DD AE B7\r
 R 00 00 01 00\r
-T 61 08 00 00 B7 DD B6 B6 28 0D 3E 90 DD AE B7\r
+T 67 09 00 00 DD B6 B6 28 0D 3E 90 DD AE B7 DD\r
 R 00 00 01 00\r
-T 6C 08 00 00 DD B6 B6 28 03\r
+T 72 09 00 00 B6 B6 28 03\r
 R 00 00 01 00\r
-T 71 08 00 00\r
+T 76 09 00 00\r
 R 00 00 01 00\r
-T 71 08 00 00\r
+T 76 09 00 00\r
 R 00 00 01 00\r
-T 71 08 00 00\r
+T 76 09 00 00\r
 R 00 00 01 00\r
-T 71 08 00 00 C3 90 0A 00 00\r
+T 76 09 00 00 C3 EF 0B 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 74 08 00 00\r
+T 79 09 00 00\r
 R 00 00 01 00\r
-T 74 08 00 00 DD 36 F8 12 DD 36 F9 00\r
+T 79 09 00 00 DD 36 F8 12 DD 36 F9 00\r
 R 00 00 01 00\r
-T 7C 08 00 00\r
+T 81 09 00 00\r
 R 00 00 01 00\r
-T 7C 08 00 00 DD 4E F8 DD 46 F9 21 13 00 A7 ED\r
+T 81 09 00 00 DD 4E F8 DD 46 F9 21 13 00 A7 ED\r
 R 00 00 01 00\r
-T 87 08 00 00 42 DA 7C 09 00 00\r
+T 8C 09 00 00 42 DA A9 0A 00 00\r
 R 00 00 01 00 00 06 01 00\r
-T 8B 08 00 00\r
+T 90 09 00 00\r
 R 00 00 01 00\r
-T 8B 08 00 00 DD 6E F8 DD 66 F9 29 E5 21 06 00\r
+T 90 09 00 00 DD 6E F8 DD 66 F9 29 E5 21 06 00\r
 R 00 00 01 00\r
-T 96 08 00 00 39 01 18 00 09 4D 44 E1 09 46 23\r
+T 9B 09 00 00 39 01 18 00 09 4D 44 E1 09 46 23\r
 R 00 00 01 00\r
-T A1 08 00 00 66 68 DD 75 FC DD 74 FD 7D B4 CA\r
+T A6 09 00 00 66 68 DD 75 FC DD 74 FD 7D B4 CA\r
 R 00 00 01 00\r
-T AC 08 00 00 71 09 00 00\r
+T B1 09 00 00 9E 0A 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T AE 08 00 00\r
+T B3 09 00 00\r
 R 00 00 01 00\r
-T AE 08 00 00 06 03 DD 5E FC DD 56 FD CD\r
+T B3 09 00 00 06 03 DD 5E FC DD 56 FD CD\r
 R 00 00 01 00\r
-T B7 08 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T BC 09 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T BE 08 00 00 7E FC E6 07 47 3E 01 CD\r
+T C3 09 00 00 7E FC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T C6 08 00 00 00 00 00 00 A6 CA 55 09 00 00\r
-R 00 00 01 00 02 04 1D 00 00 0A 01 00\r
-T CC 08 00 00\r
+T CB 09 00 00 00 00 00 00 A6 CA 82 0A 00 00\r
+R 00 00 01 00 02 04 1E 00 00 0A 01 00\r
+T D1 09 00 00\r
 R 00 00 01 00\r
-T CC 08 00 00 DD 6E FC DD 66 FD E5 DD 6E B4 DD\r
+T D1 09 00 00 DD 6E FC DD 66 FD E5 DD 6E B4 DD\r
 R 00 00 01 00\r
-T D7 08 00 00 66 B5 E5 DD 6E F8 DD 66 F9 E5 21\r
+T DC 09 00 00 66 B5 E5 DD 6E F8 DD 66 F9 E5 21\r
 R 00 00 01 00\r
-T E2 08 00 00 14 02 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T E9 08 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T F2 08 00 00 60\r
+T E7 09 00 00 14 02 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T ED 09 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T F4 09 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T F9 09 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 00 0A 00 00 28 7E\r
 R 00 00 01 00\r
-T F3 08 00 00\r
+T 02 0A 00 00\r
 R 00 00 01 00\r
-T F3 08 00 00 11 06 04 00 00 CD A3 13 00 00 DD\r
-R 00 00 01 00 00 05 03 00 00 0A 01 00\r
-T FA 08 00 00 75 FE DD 74 FF 7D B4 20 10\r
+T 02 0A 00 00 11 06 04 00 00 3E 41 16 00 00 21\r
+R 00 00 01 00 00 05 03 00 29 0A 01 00\r
+T 08 0A 00 00 41 16 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 0F 0A 00 00 FE DD 74 FF 7D B4 20 1A\r
 R 00 00 01 00\r
-T 03 09 00 00\r
+T 17 0A 00 00\r
 R 00 00 01 00\r
-T 03 09 00 00 21 55 02 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 0A 09 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T 11 09 00 00 18 40\r
+T 17 0A 00 00 21 55 02 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 1D 0A 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T 24 0A 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T 2A 0A 00 00 00 00 00 00 CD 00 00 00 00 18 4F\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 31 0A 00 00\r
 R 00 00 01 00\r
-T 13 09 00 00\r
+T 31 0A 00 00 DD 5E FC DD 56 FD 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 39 0A 00 00 21 13 17 00 00 CD 00 00 00 00 4D\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 40 0A 00 00 44 DD 5E FE DD 56 FF 3E\r
 R 00 00 01 00\r
-T 13 09 00 00 DD 5E FC DD 56 FD CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 1C 09 00 00 4D 44 DD 5E FE DD 56 FF CD\r
+T 48 0A 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 4D 0A 00 00 00 00 00 00 DD 6E F8 DD 66 F9 29\r
+R 00 00 01 00 02 04 14 00\r
+T 56 0A 00 00 E5 21 06 00 39 01 18 00 09 4D 44\r
 R 00 00 01 00\r
-T 25 09 00 00 8B 14 00 00 DD 6E F8 DD 66 F9 29\r
-R 00 00 01 00 00 04 01 00\r
-T 2E 09 00 00 E5 21 06 00 39 01 18 00 09 4D 44\r
+T 61 0A 00 00 E1 09 DD 4E FE DD 46 FF 71 23 70\r
 R 00 00 01 00\r
-T 39 09 00 00 E1 09 DD 4E FE DD 46 FF 71 23 70\r
+T 6C 0A 00 00 21 04 00 39 4D 44 DD 5E B4 DD 56\r
 R 00 00 01 00\r
-T 44 09 00 00 21 04 00 39 4D 44 DD 5E B4 DD 56\r
+T 77 0A 00 00 B5 3E D9 17 00 00 21 D9 17 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 7D 0A 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 14 00\r
+T 80 0A 00 00\r
 R 00 00 01 00\r
-T 4F 09 00 00 B5 CD F9 14 00 00\r
-R 00 00 01 00 00 06 01 00\r
-T 53 09 00 00\r
-R 00 00 01 00\r
-T 53 09 00 00\r
+T 80 0A 00 00\r
 R 00 00 01 00\r
-T 53 09 00 00 18 1C\r
+T 80 0A 00 00 18 1C\r
 R 00 00 01 00\r
-T 55 09 00 00\r
+T 82 0A 00 00\r
 R 00 00 01 00\r
-T 55 09 00 00 06 03 DD 5E FC DD 56 FD CD\r
+T 82 0A 00 00 06 03 DD 5E FC DD 56 FD CD\r
 R 00 00 01 00\r
-T 5E 09 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T 8B 0A 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 65 09 00 00 7E FC E6 07 47 3E 01 CD\r
+T 92 0A 00 00 7E FC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 6D 09 00 00 00 00 00 00 B6 77\r
-R 00 00 01 00 02 04 1D 00\r
-T 71 09 00 00\r
+T 9A 0A 00 00 00 00 00 00 B6 77\r
+R 00 00 01 00 02 04 1E 00\r
+T 9E 0A 00 00\r
 R 00 00 01 00\r
-T 71 09 00 00\r
+T 9E 0A 00 00\r
 R 00 00 01 00\r
-T 71 09 00 00 DD 34 F8 20 03 DD 34 F9\r
+T 9E 0A 00 00 DD 34 F8 20 03 DD 34 F9\r
 R 00 00 01 00\r
-T 79 09 00 00\r
+T A6 0A 00 00\r
 R 00 00 01 00\r
-T 79 09 00 00 C3 7C 08 00 00\r
+T A6 0A 00 00 C3 81 09 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 7C 09 00 00\r
+T A9 0A 00 00\r
 R 00 00 01 00\r
-T 7C 09 00 00 AF DD 77 F8 DD 77 F9 21 0C 00 39\r
+T A9 0A 00 00 AF DD 77 F8 DD 77 F9 21 0C 00 39\r
 R 00 00 01 00\r
-T 87 09 00 00 5E 23 56 23 4E 23 46 EB 3E 09 CD\r
+T B4 0A 00 00 5E 23 56 23 4E 23 46 EB 3E 09 CD\r
 R 00 00 01 00\r
-T 92 09 00 00 00 00 00 00 DD 75 FA DD 74 FB\r
-R 00 00 01 00 02 04 1E 00\r
-T 9A 09 00 00\r
+T BF 0A 00 00 00 00 00 00 DD 75 FA DD 74 FB\r
+R 00 00 01 00 02 04 20 00\r
+T C7 0A 00 00\r
 R 00 00 01 00\r
-T 9A 09 00 00 DD 4E F8 DD 46 F9 DD 6E FA DD 66\r
+T C7 0A 00 00 DD 4E F8 DD 46 F9 DD 6E FA DD 66\r
 R 00 00 01 00\r
-T A5 09 00 00 FB A7 ED 42 DA 90 0A 00 00\r
+T D2 0A 00 00 FB A7 ED 42 DA EF 0B 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T AC 09 00 00\r
+T D9 0A 00 00\r
 R 00 00 01 00\r
-T AC 09 00 00 DD 4E F8 DD 46 F9 21 04 00 39 5D\r
+T D9 0A 00 00 DD 4E F8 DD 46 F9 21 04 00 39 5D\r
 R 00 00 01 00\r
-T B7 09 00 00 54 CD 88 11 00 00 DD 75 FC DD 74\r
-R 00 00 01 00 00 06 01 00\r
-T C0 09 00 00 FD 7D B4 20 03\r
+T E4 0A 00 00 54 3E EF 13 00 00 21 EF 13 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T EA 0A 00 00 CD 00 00 00 00 DD 75 FC DD 74 FD\r
+R 00 00 01 00 02 05 14 00\r
+T F3 0A 00 00 7D B4 20 03\r
 R 00 00 01 00\r
-T C5 09 00 00\r
+T F7 0A 00 00\r
 R 00 00 01 00\r
-T C5 09 00 00 C3 85 0A 00 00\r
+T F7 0A 00 00 C3 E4 0B 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T C8 09 00 00\r
+T FA 0A 00 00\r
 R 00 00 01 00\r
-T C8 09 00 00 06 03 DD 5E FC DD 56 FD CD\r
+T FA 0A 00 00 06 03 DD 5E FC DD 56 FD CD\r
 R 00 00 01 00\r
-T D1 09 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T 03 0B 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T D8 09 00 00 7E FC E6 07 47 3E 01 CD\r
-R 00 00 01 00\r
-T E0 09 00 00 00 00 00 00 A6 CA 69 0A 00 00\r
-R 00 00 01 00 02 04 1D 00 00 0A 01 00\r
-T E6 09 00 00\r
-R 00 00 01 00\r
-T E6 09 00 00 DD 6E FC DD 66 FD E5 DD 6E B4 DD\r
-R 00 00 01 00\r
-T F1 09 00 00 66 B5 E5 DD 6E F8 DD 66 F9 E5 21\r
-R 00 00 01 00\r
-T FC 09 00 00 74 02 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 03 0A 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T 0C 0A 00 00 5A\r
-R 00 00 01 00\r
-T 0D 0A 00 00\r
-R 00 00 01 00\r
-T 0D 0A 00 00 11 06 04 00 00 CD A3 13 00 00 DD\r
-R 00 00 01 00 00 05 03 00 00 0A 01 00\r
-T 14 0A 00 00 75 FE DD 74 FF 7D B4 20 10\r
-R 00 00 01 00\r
-T 1D 0A 00 00\r
-R 00 00 01 00\r
-T 1D 0A 00 00 21 55 02 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 24 0A 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T 2B 0A 00 00 18 3A\r
-R 00 00 01 00\r
-T 2D 0A 00 00\r
-R 00 00 01 00\r
-T 2D 0A 00 00 DD 5E FC DD 56 FD CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 36 0A 00 00 4D 44 DD 5E FE DD 56 FF CD\r
-R 00 00 01 00\r
-T 3F 0A 00 00 8B 14 00 00 DD 6E FE DD 66 FF E5\r
-R 00 00 01 00 00 04 01 00\r
-T 48 0A 00 00 DD 4E F8 DD 46 F9 21 06 00 39 5D\r
-R 00 00 01 00\r
-T 53 0A 00 00 54 CD 75 12 00 00 E1 21 04 00 39\r
-R 00 00 01 00 00 06 01 00\r
-T 5C 0A 00 00 4D 44 DD 5E B4 DD 56 B5 CD\r
-R 00 00 01 00\r
-T 65 0A 00 00 F9 14 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 67 0A 00 00\r
-R 00 00 01 00\r
-T 67 0A 00 00\r
-R 00 00 01 00\r
-T 67 0A 00 00 18 1C\r
-R 00 00 01 00\r
-T 69 0A 00 00\r
-R 00 00 01 00\r
-T 69 0A 00 00 06 03 DD 5E FC DD 56 FD CD\r
-R 00 00 01 00\r
-T 72 0A 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
+T 0A 0B 00 00 7E FC E6 07 47 3E 01 CD\r
+R 00 00 01 00\r
+T 12 0B 00 00 00 00 00 00 A6 CA C8 0B 00 00\r
+R 00 00 01 00 02 04 1E 00 00 0A 01 00\r
+T 18 0B 00 00\r
+R 00 00 01 00\r
+T 18 0B 00 00 DD 6E FC DD 66 FD E5 DD 6E B4 DD\r
+R 00 00 01 00\r
+T 23 0B 00 00 66 B5 E5 DD 6E F8 DD 66 F9 E5 21\r
+R 00 00 01 00\r
+T 2E 0B 00 00 74 02 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 34 0B 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 3B 0B 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 40 0B 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 47 0B 00 00 28 7D\r
+R 00 00 01 00\r
+T 49 0B 00 00\r
+R 00 00 01 00\r
+T 49 0B 00 00 11 06 04 00 00 3E 41 16 00 00 21\r
+R 00 00 01 00 00 05 03 00 29 0A 01 00\r
+T 4F 0B 00 00 41 16 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 56 0B 00 00 FE DD 74 FF 7D B4 20 1A\r
+R 00 00 01 00\r
+T 5E 0B 00 00\r
+R 00 00 01 00\r
+T 5E 0B 00 00 21 55 02 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 64 0B 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T 6B 0B 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T 71 0B 00 00 00 00 00 00 CD 00 00 00 00 18 4E\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 78 0B 00 00\r
+R 00 00 01 00\r
+T 78 0B 00 00 DD 5E FC DD 56 FD 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 80 0B 00 00 21 13 17 00 00 CD 00 00 00 00 4D\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 87 0B 00 00 44 DD 5E FE DD 56 FF 3E\r
+R 00 00 01 00\r
+T 8F 0B 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 94 0B 00 00 00 00 00 00 DD 6E FE DD 66 FF E5\r
+R 00 00 01 00 02 04 14 00\r
+T 9D 0B 00 00 DD 4E F8 DD 46 F9 21 06 00 39 5D\r
+R 00 00 01 00\r
+T A8 0B 00 00 54 3E EB 14 00 00 21 EB 14 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T AE 0B 00 00 CD 00 00 00 00 E1 21 04 00 39 4D\r
+R 00 00 01 00 02 05 14 00\r
+T B7 0B 00 00 44 DD 5E B4 DD 56 B5 3E\r
+R 00 00 01 00\r
+T BF 0B 00 00 D9 17 00 00 21 D9 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T C4 0B 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T C6 0B 00 00\r
+R 00 00 01 00\r
+T C6 0B 00 00\r
+R 00 00 01 00\r
+T C6 0B 00 00 18 1C\r
+R 00 00 01 00\r
+T C8 0B 00 00\r
+R 00 00 01 00\r
+T C8 0B 00 00 06 03 DD 5E FC DD 56 FD CD\r
+R 00 00 01 00\r
+T D1 0B 00 00 00 00 00 00 2A 36 04 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 79 0A 00 00 7E FC E6 07 47 3E 01 CD\r
+T D8 0B 00 00 7E FC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 81 0A 00 00 00 00 00 00 B6 77\r
-R 00 00 01 00 02 04 1D 00\r
-T 85 0A 00 00\r
+T E0 0B 00 00 00 00 00 00 B6 77\r
+R 00 00 01 00 02 04 1E 00\r
+T E4 0B 00 00\r
 R 00 00 01 00\r
-T 85 0A 00 00\r
+T E4 0B 00 00\r
 R 00 00 01 00\r
-T 85 0A 00 00 DD 34 F8 20 03 DD 34 F9\r
+T E4 0B 00 00 DD 34 F8 20 03 DD 34 F9\r
 R 00 00 01 00\r
-T 8D 0A 00 00\r
+T EC 0B 00 00\r
 R 00 00 01 00\r
-T 8D 0A 00 00 C3 9A 09 00 00\r
+T EC 0B 00 00 C3 C7 0A 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 90 0A 00 00\r
+T EF 0B 00 00\r
 R 00 00 01 00\r
-T 90 0A 00 00\r
+T EF 0B 00 00\r
 R 00 00 01 00\r
-T 90 0A 00 00 DD 34 B4 20 03 DD 34 B5\r
+T EF 0B 00 00 DD 34 B4 20 03 DD 34 B5\r
 R 00 00 01 00\r
-T 98 0A 00 00\r
+T F7 0B 00 00\r
 R 00 00 01 00\r
-T 98 0A 00 00 C3 1C 08 00 00\r
+T F7 0B 00 00 C3 1C 09 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 9B 0A 00 00\r
+T FA 0B 00 00\r
 R 00 00 01 00\r
-T 9B 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 9E 0A 00 00\r
+T FA 0B 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T FD 0B 00 00\r
 R 00 00 01 00\r
-T 9E 0A 00 00 CD 00 00 00 00 14 FF 21 00 00 39\r
-R 00 00 01 00 02 05 18 00\r
-T A7 0A 00 00 4D 44 DD 5E 02 DD 56 03 CD\r
+T FD 0B 00 00 CD 00 00 00 00 14 FF 21 00 00 39\r
+R 00 00 01 00 02 05 19 00\r
+T 06 0C 00 00 4D 44 DD 5E 02 DD 56 03 3E\r
 R 00 00 01 00\r
-T B0 0A 00 00 B5 14 00 00 21 00 00 39 7E E6 00\r
-R 00 00 01 00 00 04 01 00\r
-T B9 0A 00 00 4F 23 7E E6 F0 47 3E 40 A8 B1 28\r
+T 0F 0C 00 00 8B 17 00 00 21 8B 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 14 0C 00 00 00 00 00 00 21 00 00 39 7E E6 00\r
+R 00 00 01 00 02 04 14 00\r
+T 1D 0C 00 00 4F 23 7E E6 F0 47 3E 40 A8 B1 28\r
 R 00 00 01 00\r
-T C4 0A 00 00 03\r
+T 28 0C 00 00 03\r
 R 00 00 01 00\r
-T C5 0A 00 00\r
+T 29 0C 00 00\r
 R 00 00 01 00\r
-T C5 0A 00 00 C3 AA 0E 00 00\r
+T 29 0C 00 00 C3 95 10 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T C8 0A 00 00\r
+T 2C 0C 00 00\r
 R 00 00 01 00\r
-T C8 0A 00 00 2A 02 04 00 00 23 22 02 04 00 00\r
+T 2C 0C 00 00 2A 02 04 00 00 23 22 02 04 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T CF 0A 00 00 21 52 00 39 E5 21 0A 00 39 5E 23\r
+T 33 0C 00 00 21 52 00 39 E5 21 0A 00 39 5E 23\r
 R 00 00 01 00\r
-T DA 0A 00 00 56 23 4E 23 46 EB 7D E6 0F 4F 7C\r
+T 3E 0C 00 00 56 23 4E 23 46 EB 7D E6 0F 4F 7C\r
 R 00 00 01 00\r
-T E5 0A 00 00 E6 00 47 E1 71 23 70 21 52 00 39\r
+T 49 0C 00 00 E6 00 47 E1 71 23 70 21 52 00 39\r
 R 00 00 01 00\r
-T F0 0A 00 00 7E 23 B6 28 3C\r
+T 54 0C 00 00 7E 23 B6 28 4B\r
 R 00 00 01 00\r
-T F5 0A 00 00\r
+T 59 0C 00 00\r
 R 00 00 01 00\r
-T F5 0A 00 00 21 52 00 39 4E 23 46 C5 DD 6E 02\r
+T 59 0C 00 00 21 52 00 39 4E 23 46 C5 DD 6E 02\r
 R 00 00 01 00\r
-T 00 0B 00 00 DD 66 03 E5 21 AC 02 00 00 E5 CD\r
+T 64 0C 00 00 DD 66 03 E5 21 AC 02 00 00 E5 3E\r
 R 00 00 01 00 00 09 02 00\r
-T 09 0B 00 00 00 00 00 00 F1 F1 F1 CD\r
-R 00 00 01 00 02 04 08 00\r
-T 0F 0B 00 00 28 16 00 00 7D B4 28 1C\r
-R 00 00 01 00 00 04 01 00\r
-T 15 0B 00 00\r
+T 6D 0C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T 72 0C 00 00 00 00 00 00 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 78 0C 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 7D 0C 00 00 00 00 00 00 7D B4 28 21\r
+R 00 00 01 00 02 04 14 00\r
+T 83 0C 00 00\r
 R 00 00 01 00\r
-T 15 0B 00 00 21 08 00 39 01 00 00 11 F0 FF CD\r
+T 83 0C 00 00 21 08 00 39 01 00 00 11 F0 FF CD\r
 R 00 00 01 00\r
-T 20 0B 00 00 00 00 00 00 21 00 00 39 4D 44 DD\r
-R 00 00 01 00 02 04 16 00\r
-T 29 0B 00 00 5E 02 DD 56 03 CD F9 14 00 00\r
-R 00 00 01 00 00 0A 01 00\r
-T 31 0B 00 00\r
+T 8E 0C 00 00 00 00 00 00 21 00 00 39 4D 44 DD\r
+R 00 00 01 00 02 04 17 00\r
+T 97 0C 00 00 5E 02 DD 56 03 3E D9 17 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T 9F 0C 00 00 D9 17 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T A4 0C 00 00\r
 R 00 00 01 00\r
-T 31 0B 00 00\r
+T A4 0C 00 00\r
 R 00 00 01 00\r
-T 31 0B 00 00 21 54 00 39 E5 01 00 00 C5 01\r
+T A4 0C 00 00 21 54 00 39 E5 01 00 00 C5 01\r
 R 00 00 01 00\r
-T 3B 0B 00 00 10 00 C5 21 0E 00 39 5E 23 56 23\r
+T AE 0C 00 00 10 00 C5 21 0E 00 39 5E 23 56 23\r
 R 00 00 01 00\r
-T 46 0B 00 00 4E 23 46 EB CD 00 00 00 00 EB E1\r
-R 00 00 01 00 02 09 19 00\r
-T 4F 0B 00 00 73 23 72 21 50 00 39 AF 77 23 77\r
+T B9 0C 00 00 4E 23 46 EB CD 00 00 00 00 EB E1\r
+R 00 00 01 00 02 09 1A 00\r
+T C2 0C 00 00 73 23 72 21 50 00 39 AF 77 23 77\r
 R 00 00 01 00\r
-T 5A 0B 00 00\r
+T CD 0C 00 00\r
 R 00 00 01 00\r
-T 5A 0B 00 00 21 54 00 39 4E 23 46 21 50 00 39\r
+T CD 0C 00 00 21 54 00 39 4E 23 46 21 50 00 39\r
 R 00 00 01 00\r
-T 65 0B 00 00 56 23 66 6A A7 ED 42 D2\r
+T D8 0C 00 00 56 23 66 6A A7 ED 42 D2\r
 R 00 00 01 00\r
-T 6D 0B 00 00 A3 0E 00 00\r
+T E0 0C 00 00 8E 10 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 6F 0B 00 00\r
+T E2 0C 00 00\r
 R 00 00 01 00\r
-T 6F 0B 00 00 21 40 00 39 E5 21 52 00 39 4E 23\r
+T E2 0C 00 00 21 40 00 39 E5 21 52 00 39 4E 23\r
 R 00 00 01 00\r
-T 7A 0B 00 00 46 21 02 00 39 5D 54 CD\r
+T ED 0C 00 00 46 21 02 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 82 0B 00 00 57 15 00 00 E1 21 40 00 39 46 23\r
-R 00 00 01 00 00 04 01 00\r
-T 8B 0B 00 00 66 68 7D B4 20 03\r
+T F5 0C 00 00 46 18 00 00 21 46 18 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T FA 0C 00 00 00 00 00 00 E1 21 40 00 39 46 23\r
+R 00 00 01 00 02 04 14 00\r
+T 03 0D 00 00 66 68 7D B4 20 03\r
 R 00 00 01 00\r
-T 91 0B 00 00\r
+T 09 0D 00 00\r
 R 00 00 01 00\r
-T 91 0B 00 00 C3 97 0E 00 00\r
+T 09 0D 00 00 C3 82 10 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 94 0B 00 00\r
+T 0C 0D 00 00\r
 R 00 00 01 00\r
-T 94 0B 00 00 21 40 00 39 46 23 66 68 01 01 00\r
+T 0C 0D 00 00 21 40 00 39 46 23 66 68 01 01 00\r
 R 00 00 01 00\r
-T 9F 0B 00 00 A7 ED 42 38 15 2A 0A 04 00 00 29\r
+T 17 0D 00 00 A7 ED 42 38 15 2A 0A 04 00 00 29\r
 R 00 00 01 00 00 0A 03 00\r
-T A8 0B 00 00 29 29 4D 44 21 40 00 39 56 23 66\r
+T 20 0D 00 00 29 29 4D 44 21 40 00 39 56 23 66\r
 R 00 00 01 00\r
-T B3 0B 00 00 6A A7 ED 42 38 51\r
+T 2B 0D 00 00 6A A7 ED 42 38 60\r
 R 00 00 01 00\r
-T B9 0B 00 00\r
+T 31 0D 00 00\r
 R 00 00 01 00\r
-T B9 0B 00 00\r
+T 31 0D 00 00\r
 R 00 00 01 00\r
-T B9 0B 00 00\r
+T 31 0D 00 00\r
 R 00 00 01 00\r
-T B9 0B 00 00 21 40 00 39 4E 23 46 C5 21 42 00\r
+T 31 0D 00 00 21 40 00 39 4E 23 46 C5 21 42 00\r
 R 00 00 01 00\r
-T C4 0B 00 00 39 01 02 00 09 E5 DD 6E 08 DD 66\r
+T 3C 0D 00 00 39 01 02 00 09 E5 DD 6E 0A DD 66\r
 R 00 00 01 00\r
-T CF 0B 00 00 09 E5 21 E5 02 00 00 E5 CD\r
+T 47 0D 00 00 0B E5 21 E5 02 00 00 E5 3E\r
 R 00 00 01 00 00 07 02 00\r
-T D6 0B 00 00 00 00 00 00 F1 F1 F1 F1 CD\r
-R 00 00 01 00 02 04 08 00\r
-T DD 0B 00 00 28 16 00 00 7D B4 28 27\r
-R 00 00 01 00 00 04 01 00\r
-T E3 0B 00 00\r
+T 4E 0D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T 53 0D 00 00 00 00 00 00 F1 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 5A 0D 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 5F 0D 00 00 00 00 00 00 7D B4 28 2C\r
+R 00 00 01 00 02 04 14 00\r
+T 65 0D 00 00\r
 R 00 00 01 00\r
-T E3 0B 00 00 21 40 00 39 AF 77 23 77 21 42 00\r
+T 65 0D 00 00 21 40 00 39 AF 77 23 77 21 42 00\r
 R 00 00 01 00\r
-T EE 0B 00 00 39 36 00 21 40 00 39 E5 21 52 00\r
+T 70 0D 00 00 39 36 00 21 40 00 39 E5 21 52 00\r
 R 00 00 01 00\r
-T F9 0B 00 00 39 4E 23 46 21 02 00 39 5D 54 CD\r
+T 7B 0D 00 00 39 4E 23 46 21 02 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 04 0C 00 00 B7 15 00 00 E1 C3 97 0E 00 00\r
-R 00 00 01 00 00 04 01 00 00 0A 01 00\r
-T 0A 0C 00 00\r
+T 86 0D 00 00 BA 18 00 00 21 BA 18 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 8B 0D 00 00 00 00 00 00 E1 C3 82 10 00 00\r
+R 00 00 01 00 02 04 14 00 00 0A 01 00\r
+T 91 0D 00 00\r
 R 00 00 01 00\r
-T 0A 0C 00 00\r
+T 91 0D 00 00\r
 R 00 00 01 00\r
-T 0A 0C 00 00 21 40 00 39 46 23 66 68 7D B4 28\r
+T 91 0D 00 00 21 40 00 39 46 23 66 68 7D B4 28\r
 R 00 00 01 00\r
-T 15 0C 00 00 62 21 40 00 39 46 23 66 68 ED 4B\r
+T 9C 0D 00 00 71 21 40 00 39 46 23 66 68 ED 4B\r
 R 00 00 01 00\r
-T 20 0C 00 00 38 04 00 00 09 46 04 20 51\r
+T A7 0D 00 00 38 04 00 00 09 46 04 20 60\r
 R 00 00 01 00 00 04 03 00\r
-T 27 0C 00 00\r
+T AE 0D 00 00\r
 R 00 00 01 00\r
-T 27 0C 00 00\r
+T AE 0D 00 00\r
 R 00 00 01 00\r
-T 27 0C 00 00\r
+T AE 0D 00 00\r
 R 00 00 01 00\r
-T 27 0C 00 00 21 40 00 39 4E 23 46 C5 21 42 00\r
+T AE 0D 00 00 21 40 00 39 4E 23 46 C5 21 42 00\r
 R 00 00 01 00\r
-T 32 0C 00 00 39 01 02 00 09 E5 DD 6E 08 DD 66\r
+T B9 0D 00 00 39 01 02 00 09 E5 DD 6E 0A DD 66\r
 R 00 00 01 00\r
-T 3D 0C 00 00 09 E5 21 20 03 00 00 E5 CD\r
+T C4 0D 00 00 0B E5 21 20 03 00 00 E5 3E\r
 R 00 00 01 00 00 07 02 00\r
-T 44 0C 00 00 00 00 00 00 F1 F1 F1 F1 CD\r
-R 00 00 01 00 02 04 08 00\r
-T 4B 0C 00 00 28 16 00 00 7D B4 28 27\r
-R 00 00 01 00 00 04 01 00\r
-T 51 0C 00 00\r
+T CB 0D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T D0 0D 00 00 00 00 00 00 F1 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T D7 0D 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T DC 0D 00 00 00 00 00 00 7D B4 28 2C\r
+R 00 00 01 00 02 04 14 00\r
+T E2 0D 00 00\r
 R 00 00 01 00\r
-T 51 0C 00 00 21 40 00 39 AF 77 23 77 21 42 00\r
+T E2 0D 00 00 21 40 00 39 AF 77 23 77 21 42 00\r
 R 00 00 01 00\r
-T 5C 0C 00 00 39 36 00 21 40 00 39 E5 21 52 00\r
+T ED 0D 00 00 39 36 00 21 40 00 39 E5 21 52 00\r
 R 00 00 01 00\r
-T 67 0C 00 00 39 4E 23 46 21 02 00 39 5D 54 CD\r
+T F8 0D 00 00 39 4E 23 46 21 02 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 72 0C 00 00 B7 15 00 00 E1 C3 97 0E 00 00\r
-R 00 00 01 00 00 04 01 00 00 0A 01 00\r
-T 78 0C 00 00\r
+T 03 0E 00 00 BA 18 00 00 21 BA 18 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 08 0E 00 00 00 00 00 00 E1 C3 82 10 00 00\r
+R 00 00 01 00 02 04 14 00 00 0A 01 00\r
+T 0E 0E 00 00\r
 R 00 00 01 00\r
-T 78 0C 00 00\r
+T 0E 0E 00 00\r
 R 00 00 01 00\r
-T 78 0C 00 00 21 40 00 39 46 23 66 68 ED 4B\r
+T 0E 0E 00 00 21 40 00 39 46 23 66 68 ED 4B\r
 R 00 00 01 00\r
-T 82 0C 00 00 38 04 00 00 09 46 34 04 04 20 1C\r
+T 18 0E 00 00 38 04 00 00 09 46 34 04 04 20 26\r
 R 00 00 01 00 00 04 03 00\r
-T 8B 0C 00 00\r
+T 21 0E 00 00\r
 R 00 00 01 00\r
-T 8B 0C 00 00 21 40 00 39 4E 23 46 C5 21\r
+T 21 0E 00 00 21 40 00 39 4E 23 46 C5 21\r
 R 00 00 01 00\r
-T 94 0C 00 00 5A 03 00 00 E5 21 00 00 00 00 E5\r
-R 00 00 01 00 00 04 02 00 02 0A 09 00\r
-T 9B 0C 00 00 CD 00 00 00 00 F1 F1 F1 11 01 00\r
-R 00 00 01 00 02 05 20 00\r
-T A4 0C 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 21 00\r
-T A7 0C 00 00\r
+T 2A 0E 00 00 5A 03 00 00 E5 21 00 00 00 00 E5\r
+R 00 00 01 00 00 04 02 00 02 0A 0A 00\r
+T 31 0E 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 22 00 02 0A 22 00\r
+T 37 0E 00 00 00 00 00 00 F1 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 40 0E 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 23 00 02 09 23 00\r
+T 45 0E 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 47 0E 00 00\r
 R 00 00 01 00\r
-T A7 0C 00 00 21 52 00 39 AF 77 23 77\r
+T 47 0E 00 00 21 52 00 39 AF 77 23 77\r
 R 00 00 01 00\r
-T AF 0C 00 00\r
+T 4F 0E 00 00\r
 R 00 00 01 00\r
-T AF 0C 00 00 01 0E 00 21 52 00 39 56 23 66 6A\r
+T 4F 0E 00 00 01 0E 00 21 52 00 39 56 23 66 6A\r
 R 00 00 01 00\r
-T BA 0C 00 00 A7 ED 42 D2 44 0D 00 00 21 40 00\r
+T 5A 0E 00 00 A7 ED 42 D2 F3 0E 00 00 21 40 00\r
 R 00 00 01 00 00 08 01 00\r
-T C3 0C 00 00 39 01 02 00 09 E5 21 54 00 39 4E\r
+T 63 0E 00 00 39 01 02 00 09 E5 21 54 00 39 4E\r
 R 00 00 01 00\r
-T CE 0C 00 00 23 46 E1 09 7E B7 28 6E\r
+T 6E 0E 00 00 23 46 E1 09 7E B7 28 7D\r
 R 00 00 01 00\r
-T D6 0C 00 00\r
+T 76 0E 00 00\r
 R 00 00 01 00\r
-T D6 0C 00 00\r
+T 76 0E 00 00\r
 R 00 00 01 00\r
-T D6 0C 00 00\r
+T 76 0E 00 00\r
 R 00 00 01 00\r
-T D6 0C 00 00 21 40 00 39 01 02 00 09 E5 21\r
+T 76 0E 00 00 21 40 00 39 01 02 00 09 E5 21\r
 R 00 00 01 00\r
-T E0 0C 00 00 54 00 39 4E 23 46 E1 09 7E FE 2F\r
+T 80 0E 00 00 54 00 39 4E 23 46 E1 09 7E FE 2F\r
 R 00 00 01 00\r
-T EB 0C 00 00 20 4B\r
+T 8B 0E 00 00 20 5A\r
 R 00 00 01 00\r
-T ED 0C 00 00\r
+T 8D 0E 00 00\r
 R 00 00 01 00\r
-T ED 0C 00 00 21 40 00 39 01 02 00 09 E5 DD 6E\r
+T 8D 0E 00 00 21 40 00 39 01 02 00 09 E5 DD 6E\r
 R 00 00 01 00\r
-T F8 0C 00 00 08 DD 66 09 E5 21 9D 03 00 00 E5\r
+T 98 0E 00 00 0A DD 66 0B E5 21 9D 03 00 00 E5\r
 R 00 00 01 00 00 0A 02 00\r
-T 01 0D 00 00 CD 00 00 00 00 F1 F1 F1 CD\r
-R 00 00 01 00 02 05 08 00\r
-T 08 0D 00 00 28 16 00 00 7D B4 28 2A\r
-R 00 00 01 00 00 04 01 00\r
-T 0E 0D 00 00\r
+T A1 0E 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 08 00 02 0A 08 00\r
+T A7 0E 00 00 00 00 00 00 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T AD 0E 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T B2 0E 00 00 00 00 00 00 7D B4 28 2F\r
+R 00 00 01 00 02 04 14 00\r
+T B8 0E 00 00\r
 R 00 00 01 00\r
-T 0E 0D 00 00 21 40 00 39 01 02 00 09 E5 21\r
+T B8 0E 00 00 21 40 00 39 01 02 00 09 E5 21\r
 R 00 00 01 00\r
-T 18 0D 00 00 54 00 39 4E 23 46 E1 09 36 7E 21\r
+T C2 0E 00 00 54 00 39 4E 23 46 E1 09 36 7E 21\r
 R 00 00 01 00\r
-T 23 0D 00 00 40 00 39 E5 21 52 00 39 4E 23 46\r
+T CD 0E 00 00 40 00 39 E5 21 52 00 39 4E 23 46\r
 R 00 00 01 00\r
-T 2E 0D 00 00 21 02 00 39 5D 54 CD B7 15 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 37 0D 00 00 E1\r
+T D8 0E 00 00 21 02 00 39 5D 54 3E BA 18 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T E0 0E 00 00 21 BA 18 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T E7 0E 00 00\r
 R 00 00 01 00\r
-T 38 0D 00 00\r
+T E7 0E 00 00\r
 R 00 00 01 00\r
-T 38 0D 00 00\r
+T E7 0E 00 00 21 52 00 39 34 23 20 01 34\r
 R 00 00 01 00\r
-T 38 0D 00 00 21 52 00 39 34 23 20 01 34\r
+T F0 0E 00 00\r
 R 00 00 01 00\r
-T 41 0D 00 00\r
-R 00 00 01 00\r
-T 41 0D 00 00 C3 AF 0C 00 00\r
+T F0 0E 00 00 C3 4F 0E 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 44 0D 00 00\r
+T F3 0E 00 00\r
 R 00 00 01 00\r
-T 44 0D 00 00 01 CD 03 00 00 21 40 00 39 11\r
+T F3 0E 00 00 01 CD 03 00 00 21 40 00 39 11\r
 R 00 00 01 00 00 05 02 00\r
-T 4C 0D 00 00 02 00 19 EB CD 00 00 00 00 7D B4\r
-R 00 00 01 00 02 09 0D 00\r
-T 55 0D 00 00 20 5C 21 40 00 39 46 23 66 68 DD\r
+T FB 0E 00 00 02 00 19 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 0E 00\r
+T 02 0F 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 02 04 0E 00 02 09 14 00\r
+T 09 0F 00 00 20 6B 21 40 00 39 46 23 66 68 DD\r
 R 00 00 01 00\r
-T 60 0D 00 00 4E 02 DD 46 03 A7 ED 42 28 49\r
+T 14 0F 00 00 4E 02 DD 46 03 A7 ED 42 28 58\r
 R 00 00 01 00\r
-T 6A 0D 00 00\r
+T 1E 0F 00 00\r
 R 00 00 01 00\r
-T 6A 0D 00 00\r
+T 1E 0F 00 00\r
 R 00 00 01 00\r
-T 6A 0D 00 00\r
+T 1E 0F 00 00\r
 R 00 00 01 00\r
-T 6A 0D 00 00 21 40 00 39 01 02 00 09 E5 21\r
+T 1E 0F 00 00 21 40 00 39 01 02 00 09 E5 21\r
 R 00 00 01 00\r
-T 74 0D 00 00 0E 00 E5 DD 6E 08 DD 66 09 E5 21\r
+T 28 0F 00 00 0E 00 E5 DD 6E 0A DD 66 0B E5 21\r
 R 00 00 01 00\r
-T 7F 0D 00 00 CF 03 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 86 0D 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T 8F 0D 00 00 23\r
+T 33 0F 00 00 CF 03 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 39 0F 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 40 0F 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 45 0F 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 4C 0F 00 00 28 28\r
 R 00 00 01 00\r
-T 90 0D 00 00\r
+T 4E 0F 00 00\r
 R 00 00 01 00\r
-T 90 0D 00 00 21 40 00 39 DD 4E 02 DD 46 03 71\r
+T 4E 0F 00 00 21 40 00 39 DD 4E 02 DD 46 03 71\r
 R 00 00 01 00\r
-T 9B 0D 00 00 23 70 21 40 00 39 E5 21 52 00 39\r
+T 59 0F 00 00 23 70 21 40 00 39 E5 21 52 00 39\r
 R 00 00 01 00\r
-T A6 0D 00 00 4E 23 46 21 02 00 39 5D 54 CD\r
+T 64 0F 00 00 4E 23 46 21 02 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T B0 0D 00 00 B7 15 00 00 E1\r
-R 00 00 01 00 00 04 01 00\r
-T B3 0D 00 00\r
+T 6E 0F 00 00 BA 18 00 00 21 BA 18 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 73 0F 00 00 00 00 00 00 E1\r
+R 00 00 01 00 02 04 14 00\r
+T 76 0F 00 00\r
 R 00 00 01 00\r
-T B3 0D 00 00\r
+T 76 0F 00 00\r
 R 00 00 01 00\r
-T B3 0D 00 00 01 FF 03 00 00 21 40 00 39 11\r
+T 76 0F 00 00 01 FF 03 00 00 21 40 00 39 11\r
 R 00 00 01 00 00 05 02 00\r
-T BB 0D 00 00 02 00 19 EB CD 00 00 00 00 7D B4\r
-R 00 00 01 00 02 09 0D 00\r
-T C4 0D 00 00 20 5C 21 40 00 39 46 23 66 68 DD\r
+T 7E 0F 00 00 02 00 19 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 0E 00\r
+T 85 0F 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 02 04 0E 00 02 09 14 00\r
+T 8C 0F 00 00 20 6B 21 40 00 39 46 23 66 68 DD\r
 R 00 00 01 00\r
-T CF 0D 00 00 4E 04 DD 46 05 A7 ED 42 28 49\r
+T 97 0F 00 00 4E 04 DD 46 05 A7 ED 42 28 58\r
 R 00 00 01 00\r
-T D9 0D 00 00\r
+T A1 0F 00 00\r
 R 00 00 01 00\r
-T D9 0D 00 00\r
+T A1 0F 00 00\r
 R 00 00 01 00\r
-T D9 0D 00 00\r
+T A1 0F 00 00\r
 R 00 00 01 00\r
-T D9 0D 00 00 21 40 00 39 01 02 00 09 E5 21\r
+T A1 0F 00 00 21 40 00 39 01 02 00 09 E5 21\r
 R 00 00 01 00\r
-T E3 0D 00 00 0E 00 E5 DD 6E 08 DD 66 09 E5 21\r
+T AB 0F 00 00 0E 00 E5 DD 6E 0A DD 66 0B E5 21\r
 R 00 00 01 00\r
-T EE 0D 00 00 02 04 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T F5 0D 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T FE 0D 00 00 23\r
+T B6 0F 00 00 02 04 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T BC 0F 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T C3 0F 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T C8 0F 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T CF 0F 00 00 28 28\r
 R 00 00 01 00\r
-T FF 0D 00 00\r
+T D1 0F 00 00\r
 R 00 00 01 00\r
-T FF 0D 00 00 21 40 00 39 DD 4E 04 DD 46 05 71\r
+T D1 0F 00 00 21 40 00 39 DD 4E 04 DD 46 05 71\r
 R 00 00 01 00\r
-T 0A 0E 00 00 23 70 21 40 00 39 E5 21 52 00 39\r
+T DC 0F 00 00 23 70 21 40 00 39 E5 21 52 00 39\r
 R 00 00 01 00\r
-T 15 0E 00 00 4E 23 46 21 02 00 39 5D 54 CD\r
+T E7 0F 00 00 4E 23 46 21 02 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 1F 0E 00 00 B7 15 00 00 E1\r
-R 00 00 01 00 00 04 01 00\r
-T 22 0E 00 00\r
+T F1 0F 00 00 BA 18 00 00 21 BA 18 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T F6 0F 00 00 00 00 00 00 E1\r
+R 00 00 01 00 02 04 14 00\r
+T F9 0F 00 00\r
 R 00 00 01 00\r
-T 22 0E 00 00\r
+T F9 0F 00 00\r
 R 00 00 01 00\r
-T 22 0E 00 00 21 40 00 39 46 23 66 68 DD 4E 04\r
+T F9 0F 00 00 21 40 00 39 46 23 66 68 DD 4E 04\r
 R 00 00 01 00\r
-T 2D 0E 00 00 DD 46 05 A7 ED 42 28 62 21 40 00\r
+T 04 10 00 00 DD 46 05 A7 ED 42 28 76 21 40 00\r
 R 00 00 01 00\r
-T 38 0E 00 00 39 46 23 66 68 DD 4E 02 DD 46 03\r
+T 0F 10 00 00 39 46 23 66 68 DD 4E 02 DD 46 03\r
 R 00 00 01 00\r
-T 43 0E 00 00 A7 ED 42 28 4F 01 21 00 2A\r
+T 1A 10 00 00 A7 ED 42 28 63 01 21 00 2A\r
 R 00 00 01 00\r
-T 4C 0E 00 00 02 04 00 00 A7 ED 42 30 44\r
+T 23 10 00 00 02 04 00 00 A7 ED 42 30 58\r
 R 00 00 01 00 00 04 03 00\r
-T 53 0E 00 00\r
-R 00 00 01 00\r
-T 53 0E 00 00\r
+T 2A 10 00 00\r
 R 00 00 01 00\r
-T 53 0E 00 00\r
+T 2A 10 00 00\r
 R 00 00 01 00\r
-T 53 0E 00 00 DD 4E 08 DD 46 09 21 56 00 39 5D\r
+T 2A 10 00 00\r
 R 00 00 01 00\r
-T 5E 0E 00 00 54 CD 00 00 00 00 21 40 00 39 01\r
-R 00 00 01 00 02 06 15 00\r
-T 67 0E 00 00 02 00 09 4D 44 21 56 00 39 5D 54\r
+T 2A 10 00 00 DD 4E 0A DD 46 0B 21 56 00 39 5D\r
 R 00 00 01 00\r
-T 72 0E 00 00 CD 00 00 00 00 01 33 04 00 00 21\r
-R 00 00 01 00 02 05 07 00 00 0A 02 00\r
-T 79 0E 00 00 56 00 39 5D 54 CD 00 00 00 00 21\r
-R 00 00 01 00 02 0A 07 00\r
-T 82 0E 00 00 56 00 39 E5 DD 4E 02 DD 46 03 21\r
+T 35 10 00 00 54 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 16 00 02 0B 16 00\r
+T 3B 10 00 00 CD 00 00 00 00 21 40 00 39 01\r
+R 00 00 01 00 02 05 14 00\r
+T 43 10 00 00 02 00 09 4D 44 21 56 00 39 5D 54\r
 R 00 00 01 00\r
-T 8D 0E 00 00 42 00 39 5E 23 56 CD 9E 0A 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 96 0E 00 00 E1\r
+T 4E 10 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 07 00 02 0A 07 00\r
+T 54 10 00 00 00 00 00 00 01 33 04 00 00 21\r
+R 00 00 01 00 02 04 14 00 00 09 02 00\r
+T 5A 10 00 00 56 00 39 5D 54 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 07 00\r
+T 62 10 00 00 00 00 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 02 04 07 00 02 09 14 00\r
+T 68 10 00 00 56 00 39 E5 DD 4E 02 DD 46 03 21\r
 R 00 00 01 00\r
-T 97 0E 00 00\r
+T 73 10 00 00 42 00 39 5E 23 56 3E FD 0B 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 7B 10 00 00 21 FD 0B 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 82 10 00 00\r
 R 00 00 01 00\r
-T 97 0E 00 00\r
+T 82 10 00 00\r
 R 00 00 01 00\r
-T 97 0E 00 00 21 50 00 39 34 23 20 01 34\r
+T 82 10 00 00 21 50 00 39 34 23 20 01 34\r
 R 00 00 01 00\r
-T A0 0E 00 00\r
+T 8B 10 00 00\r
 R 00 00 01 00\r
-T A0 0E 00 00 C3 5A 0B 00 00\r
+T 8B 10 00 00 C3 CD 0C 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T A3 0E 00 00\r
+T 8E 10 00 00\r
 R 00 00 01 00\r
-T A3 0E 00 00 2A 02 04 00 00 2B 22 02 04 00 00\r
+T 8E 10 00 00 2A 02 04 00 00 2B 22 02 04 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T AA 0E 00 00\r
+T 95 10 00 00\r
 R 00 00 01 00\r
-T AA 0E 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T AD 0E 00 00\r
+T 95 10 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 98 10 00 00\r
 R 00 00 01 00\r
-T AD 0E 00 00 C5 D5 21 00 00 22 02 04 00 00 2A\r
+T 98 10 00 00 C5 D5 21 00 00 22 02 04 00 00 2A\r
 R 00 00 01 00 00 0A 03 00\r
-T B6 0E 00 00 38 04 00 00 23 36 01 21\r
+T A1 10 00 00 38 04 00 00 23 36 01 21\r
 R 00 00 01 00 00 04 03 00\r
-T BC 0E 00 00 33 04 00 00 E5 01 01 00 11 01 00\r
+T A7 10 00 00 33 04 00 00 E5 01 01 00 11 01 00\r
 R 00 00 01 00 00 04 02 00\r
-T C5 0E 00 00 CD 9E 0A 00 00 E1 2A 02 04 00 00\r
-R 00 00 01 00 00 05 01 00 00 0B 03 00\r
-T CC 0E 00 00 7D B4 28 06\r
+T B0 10 00 00 3E FD 0B 00 00 21 FD 0B 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T B6 10 00 00 00 00 00 00 E1 2A 02 04 00 00 7D\r
+R 00 00 01 00 02 04 14 00 00 0A 03 00\r
+T BD 10 00 00 B4 28 0B\r
 R 00 00 01 00\r
-T D0 0E 00 00\r
+T C0 10 00 00\r
 R 00 00 01 00\r
-T D0 0E 00 00 11 35 04 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T D6 0E 00 00\r
+T C0 10 00 00 11 35 04 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T C6 10 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T CB 10 00 00\r
 R 00 00 01 00\r
-T D6 0E 00 00 D1 C1 C9\r
+T CB 10 00 00 D1 C1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 03 00\r
+T D0 10 00 00\r
 R 00 00 01 00\r
-T D9 0E 00 00\r
+T D0 10 00 00 CD 00 00 00 00 AC FF 21 00 00 39\r
+R 00 00 01 00 02 05 19 00\r
+T D9 10 00 00 4D 44 11 01 00 3E 8B 17 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T E1 10 00 00 8B 17 00 00 CD 00 00 00 00 AF DD\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T E8 10 00 00 77 FC DD 77 FD 21 00 00 E5 21\r
 R 00 00 01 00\r
-T D9 0E 00 00 CD 00 00 00 00 AC FF 21 00 00 39\r
-R 00 00 01 00 02 05 18 00\r
-T E2 0E 00 00 4D 44 11 01 00 CD B5 14 00 00 AF\r
-R 00 00 01 00 00 0A 01 00\r
-T EB 0E 00 00 DD 77 FC DD 77 FD 21 00 00 E5 21\r
-R 00 00 01 00\r
-T F6 0E 00 00 10 00 E5 21 0C 00 39 5E 23 56 23\r
+T F2 10 00 00 10 00 E5 21 0C 00 39 5E 23 56 23\r
 R 00 00 01 00\r
-T 01 0F 00 00 4E 23 46 EB CD 00 00 00 00 DD 75\r
-R 00 00 01 00 02 09 19 00\r
-T 0A 0F 00 00 FE DD 74 FF\r
+T FD 10 00 00 4E 23 46 EB CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 09 1A 00\r
+T 06 11 00 00 FE DD 74 FF\r
 R 00 00 01 00\r
-T 0E 0F 00 00\r
+T 0A 11 00 00\r
 R 00 00 01 00\r
-T 0E 0F 00 00 DD 4E FE DD 46 FF DD 6E FC DD 66\r
+T 0A 11 00 00 DD 4E FE DD 46 FF DD 6E FC DD 66\r
 R 00 00 01 00\r
-T 19 0F 00 00 FD A7 ED 42 30 6C\r
+T 15 11 00 00 FD A7 ED 42 30 7C\r
 R 00 00 01 00\r
-T 1F 0F 00 00\r
+T 1B 11 00 00\r
 R 00 00 01 00\r
-T 1F 0F 00 00 21 40 00 39 E5 DD 4E FC DD 46 FD\r
+T 1B 11 00 00 21 40 00 39 E5 DD 4E FC DD 46 FD\r
 R 00 00 01 00\r
-T 2A 0F 00 00 21 02 00 39 5D 54 CD 57 15 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 33 0F 00 00 E1 DD 6E EC DD 66 ED 7D B4 20 43\r
+T 26 11 00 00 21 02 00 39 5D 54 3E 46 18 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 2E 11 00 00 21 46 18 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 35 11 00 00 DD 6E EC DD 66 ED 7D B4 20 4D DD\r
 R 00 00 01 00\r
-T 3E 0F 00 00 DD 7E EE B7 20 3D\r
+T 40 11 00 00 7E EE B7 20 47\r
 R 00 00 01 00\r
-T 44 0F 00 00\r
+T 45 11 00 00\r
 R 00 00 01 00\r
-T 44 0F 00 00\r
+T 45 11 00 00\r
 R 00 00 01 00\r
-T 44 0F 00 00\r
+T 45 11 00 00\r
 R 00 00 01 00\r
-T 44 0F 00 00 DD 6E 02 DD 66 03 DD 75 EC DD 74\r
+T 45 11 00 00 DD 6E 02 DD 66 03 DD 75 EC DD 74\r
 R 00 00 01 00\r
-T 4F 0F 00 00 ED DD 6E 02 DD 66 03 E5 21\r
+T 50 11 00 00 ED DD 6E 02 DD 66 03 E5 21\r
 R 00 00 01 00\r
-T 58 0F 00 00 48 04 00 00 E5 21 44 00 39 01\r
+T 59 11 00 00 48 04 00 00 E5 21 44 00 39 01\r
 R 00 00 01 00 00 04 02 00\r
-T 60 0F 00 00 02 00 09 E5 CD 00 00 00 00 F1 F1\r
-R 00 00 01 00 02 09 03 00\r
-T 69 0F 00 00 F1 21 40 00 39 E5 DD 4E FC DD 46\r
+T 61 11 00 00 02 00 09 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 02 00\r
+T 68 11 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 02 00 02 09 14 00\r
+T 6F 11 00 00 F1 21 40 00 39 E5 DD 4E FC DD 46\r
 R 00 00 01 00\r
-T 74 0F 00 00 FD 21 02 00 39 5D 54 CD\r
+T 7A 11 00 00 FD 21 02 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 7C 0F 00 00 B7 15 00 00 E1 18 18\r
-R 00 00 01 00 00 04 01 00\r
-T 81 0F 00 00\r
+T 82 11 00 00 BA 18 00 00 21 BA 18 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 87 11 00 00 00 00 00 00 E1 18 23\r
+R 00 00 01 00 02 04 14 00\r
+T 8C 11 00 00\r
 R 00 00 01 00\r
-T 81 0F 00 00 DD 34 FC 20 03 DD 34 FD\r
+T 8C 11 00 00 DD 34 FC 20 03 DD 34 FD\r
 R 00 00 01 00\r
-T 89 0F 00 00\r
+T 94 11 00 00\r
 R 00 00 01 00\r
-T 89 0F 00 00 18 83\r
-R 00 00 01 00\r
-T 8B 0F 00 00\r
+T 94 11 00 00 C3 0A 11 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 97 11 00 00\r
 R 00 00 01 00\r
-T 8B 0F 00 00 21 4E 04 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 92 0F 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T 99 0F 00 00\r
+T 97 11 00 00 21 4E 04 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 9D 11 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T A4 11 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T AA 11 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T AF 11 00 00\r
 R 00 00 01 00\r
-T 99 0F 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 9C 0F 00 00\r
+T AF 11 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T B2 11 00 00\r
 R 00 00 01 00\r
-T 9C 0F 00 00 CD 00 00 00 00 BC FF DD 36 BE 01\r
-R 00 00 01 00 02 05 18 00\r
-T A5 0F 00 00 DD 36 BF 00\r
+T B2 11 00 00 CD 00 00 00 00 BC FF DD 36 BE 01\r
+R 00 00 01 00 02 05 19 00\r
+T BB 11 00 00 DD 36 BF 00\r
 R 00 00 01 00\r
-T A9 0F 00 00\r
+T BF 11 00 00\r
 R 00 00 01 00\r
-T A9 0F 00 00 ED 4B 24 04 00 00 DD 6E BE DD 66\r
+T BF 11 00 00 ED 4B 24 04 00 00 DD 6E BE DD 66\r
 R 00 00 01 00 00 06 03 00\r
-T B2 0F 00 00 BF A7 ED 42 D2 85 11 00 00\r
+T C8 11 00 00 BF A7 ED 42 D2 EC 13 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T B9 0F 00 00\r
+T CF 11 00 00\r
 R 00 00 01 00\r
-T B9 0F 00 00 21 04 00 39 4D 44 DD 5E BE DD 56\r
+T CF 11 00 00 21 04 00 39 4D 44 DD 5E BE DD 56\r
 R 00 00 01 00\r
-T C4 0F 00 00 BF CD B5 14 00 00 DD 6E C0 DD 66\r
-R 00 00 01 00 00 06 01 00\r
-T CD 0F 00 00 C1 7D B4 20 18\r
+T DA 11 00 00 BF 3E 8B 17 00 00 21 8B 17 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T E0 11 00 00 CD 00 00 00 00 DD 6E C0 DD 66 C1\r
+R 00 00 01 00 02 05 14 00\r
+T E9 11 00 00 7D B4 20 1D\r
 R 00 00 01 00\r
-T D2 0F 00 00\r
+T ED 11 00 00\r
 R 00 00 01 00\r
-T D2 0F 00 00 DD 6E BE DD 66 BF ED 4B\r
+T ED 11 00 00 DD 6E BE DD 66 BF ED 4B\r
 R 00 00 01 00\r
-T DA 0F 00 00 38 04 00 00 09 46 04 28 06\r
+T F5 11 00 00 38 04 00 00 09 46 04 28 0B\r
 R 00 00 01 00 00 04 03 00\r
-T E1 0F 00 00\r
+T FC 11 00 00\r
 R 00 00 01 00\r
-T E1 0F 00 00 11 7A 04 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T E7 0F 00 00\r
+T FC 11 00 00 11 7A 04 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T 02 12 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 07 12 00 00\r
 R 00 00 01 00\r
-T E7 0F 00 00 C3 7A 11 00 00\r
+T 07 12 00 00 C3 E1 13 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T EA 0F 00 00\r
+T 0A 12 00 00\r
 R 00 00 01 00\r
-T EA 0F 00 00 DD 6E BE DD 66 BF ED 4B\r
+T 0A 12 00 00 DD 6E BE DD 66 BF ED 4B\r
 R 00 00 01 00\r
-T F2 0F 00 00 38 04 00 00 09 46 04 20 10 DD 6E\r
+T 12 12 00 00 38 04 00 00 09 46 04 20 15 DD 6E\r
 R 00 00 01 00 00 04 03 00\r
-T FB 0F 00 00 C0 DD 66 C1 7D B4 28 06\r
+T 1B 12 00 00 C0 DD 66 C1 7D B4 28 0B\r
 R 00 00 01 00\r
-T 03 10 00 00\r
+T 23 12 00 00\r
 R 00 00 01 00\r
-T 03 10 00 00\r
+T 23 12 00 00\r
 R 00 00 01 00\r
-T 03 10 00 00\r
+T 23 12 00 00\r
 R 00 00 01 00\r
-T 03 10 00 00 11 7A 04 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T 09 10 00 00\r
+T 23 12 00 00 11 7A 04 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T 29 12 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 2E 12 00 00\r
 R 00 00 01 00\r
-T 09 10 00 00 DD 6E BE DD 66 BF ED 4B\r
+T 2E 12 00 00 DD 6E BE DD 66 BF ED 4B\r
 R 00 00 01 00\r
-T 11 10 00 00 38 04 00 00 09 46 04 28 6B DD 6E\r
+T 36 12 00 00 38 04 00 00 09 46 04 28 7A DD 6E\r
 R 00 00 01 00 00 04 03 00\r
-T 1A 10 00 00 BE DD 66 BF ED 4B 38 04 00 00 09\r
+T 3F 12 00 00 BE DD 66 BF ED 4B 38 04 00 00 09\r
 R 00 00 01 00 00 0A 03 00\r
-T 23 10 00 00 4E 06 00 DD 6E C2 DD 66 C3 A7 ED\r
+T 48 12 00 00 4E 06 00 DD 6E C2 DD 66 C3 A7 ED\r
 R 00 00 01 00\r
-T 2E 10 00 00 42 28 52\r
+T 53 12 00 00 42 28 61\r
 R 00 00 01 00\r
-T 31 10 00 00\r
+T 56 12 00 00\r
 R 00 00 01 00\r
-T 31 10 00 00\r
+T 56 12 00 00\r
 R 00 00 01 00\r
-T 31 10 00 00\r
+T 56 12 00 00\r
 R 00 00 01 00\r
-T 31 10 00 00 DD 6E BE DD 66 BF ED 4B\r
+T 56 12 00 00 DD 6E BE DD 66 BF ED 4B\r
 R 00 00 01 00\r
-T 39 10 00 00 38 04 00 00 09 4E 06 00 C5 DD 6E\r
+T 5E 12 00 00 38 04 00 00 09 4E 06 00 C5 DD 6E\r
 R 00 00 01 00 00 04 03 00\r
-T 42 10 00 00 C2 DD 66 C3 E5 DD 6E BE DD 66 BF\r
+T 67 12 00 00 C2 DD 66 C3 E5 DD 6E BE DD 66 BF\r
 R 00 00 01 00\r
-T 4D 10 00 00 E5 21 92 04 00 00 E5 CD\r
+T 72 12 00 00 E5 21 92 04 00 00 E5 3E\r
 R 00 00 01 00 00 06 02 00\r
-T 53 10 00 00 00 00 00 00 F1 F1 F1 F1 CD\r
-R 00 00 01 00 02 04 08 00\r
-T 5A 10 00 00 28 16 00 00 7D B4 28 23\r
-R 00 00 01 00 00 04 01 00\r
-T 60 10 00 00\r
-R 00 00 01 00\r
-T 60 10 00 00 DD 6E BE DD 66 BF ED 4B\r
-R 00 00 01 00\r
-T 68 10 00 00 38 04 00 00 09 4E 06 00 DD 71 C2\r
+T 78 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T 7D 12 00 00 00 00 00 00 F1 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 84 12 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 89 12 00 00 00 00 00 00 7D B4 28 28\r
+R 00 00 01 00 02 04 14 00\r
+T 8F 12 00 00\r
+R 00 00 01 00\r
+T 8F 12 00 00 DD 6E BE DD 66 BF ED 4B\r
+R 00 00 01 00\r
+T 97 12 00 00 38 04 00 00 09 4E 06 00 DD 71 C2\r
 R 00 00 01 00 00 04 03 00\r
-T 71 10 00 00 DD 70 C3 21 04 00 39 4D 44 DD 5E\r
+T A0 12 00 00 DD 70 C3 21 04 00 39 4D 44 DD 5E\r
 R 00 00 01 00\r
-T 7C 10 00 00 BE DD 56 BF CD F9 14 00 00\r
-R 00 00 01 00 00 09 01 00\r
-T 83 10 00 00\r
+T AB 12 00 00 BE DD 56 BF 3E D9 17 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T B2 12 00 00 D9 17 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T B7 12 00 00\r
 R 00 00 01 00\r
-T 83 10 00 00\r
+T B7 12 00 00\r
 R 00 00 01 00\r
-T 83 10 00 00 DD 6E BE DD 66 BF ED 4B\r
+T B7 12 00 00 DD 6E BE DD 66 BF ED 4B\r
 R 00 00 01 00\r
-T 8B 10 00 00 38 04 00 00 09 7E B7 C2\r
+T BF 12 00 00 38 04 00 00 09 7E B7 C2\r
 R 00 00 01 00 00 04 03 00\r
-T 91 10 00 00 7A 11 00 00\r
+T C5 12 00 00 E1 13 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 93 10 00 00\r
+T C7 12 00 00\r
 R 00 00 01 00\r
-T 93 10 00 00 DD 7E C0 E6 00 6F DD 7E C1 E6 F0\r
+T C7 12 00 00 DD 7E C0 E6 00 6F DD 7E C1 E6 F0\r
 R 00 00 01 00\r
-T 9E 10 00 00 67 3E 60 AC B5 28 24 DD 7E C0 E6\r
+T D2 12 00 00 67 3E 60 AC B5 28 25 DD 7E C0 E6\r
 R 00 00 01 00\r
-T A9 10 00 00 00 6F DD 7E C1 E6 F0 67 3E 20 AC\r
+T DD 12 00 00 00 6F DD 7E C1 E6 F0 67 3E 20 AC\r
 R 00 00 01 00\r
-T B4 10 00 00 B5 28 12 21 0C 00 39 5E 23 56 23\r
+T E8 12 00 00 B5 28 13 21 0C 00 39 5E 23 56 23\r
 R 00 00 01 00\r
-T BF 10 00 00 4E 23 46 EB 7D B4 B1 B0 20 72\r
+T F3 12 00 00 4E 23 46 EB 7D B4 B1 B0 C2\r
 R 00 00 01 00\r
-T C9 10 00 00\r
+T FC 12 00 00 8E 13 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T FE 12 00 00\r
 R 00 00 01 00\r
-T C9 10 00 00\r
+T FE 12 00 00\r
 R 00 00 01 00\r
-T C9 10 00 00\r
+T FE 12 00 00\r
 R 00 00 01 00\r
-T C9 10 00 00 DD 6E C2 DD 66 C3 E5 DD 6E C0 DD\r
+T FE 12 00 00 DD 6E C2 DD 66 C3 E5 DD 6E C0 DD\r
 R 00 00 01 00\r
-T D4 10 00 00 66 C1 E5 DD 6E BE DD 66 BF E5 21\r
+T 09 13 00 00 66 C1 E5 DD 6E BE DD 66 BF E5 21\r
 R 00 00 01 00\r
-T DF 10 00 00 C1 04 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T E6 10 00 00 F1 F1 F1 CD 28 16 00 00 7D B4 28\r
-R 00 00 01 00 00 08 01 00\r
-T EF 10 00 00 49\r
+T 14 13 00 00 C1 04 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 1A 13 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 21 13 00 00 F1 F1 3E 44 19 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 26 13 00 00 44 19 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 2D 13 00 00 28 5D\r
 R 00 00 01 00\r
-T F0 10 00 00\r
+T 2F 13 00 00\r
 R 00 00 01 00\r
-T F0 10 00 00 AF DD 77 C2 DD 77 C3 AF DD 77 C0\r
+T 2F 13 00 00 AF DD 77 C2 DD 77 C3 AF DD 77 C0\r
 R 00 00 01 00\r
-T FB 10 00 00 DD 77 C1 21 04 00 39 4D 44 DD 5E\r
+T 3A 13 00 00 DD 77 C1 21 04 00 39 4D 44 DD 5E\r
 R 00 00 01 00\r
-T 06 11 00 00 BE DD 56 BF CD F9 14 00 00 2A\r
-R 00 00 01 00 00 09 01 00\r
-T 0E 11 00 00 10 04 00 00 23 22 10 04 00 00 11\r
+T 45 13 00 00 BE DD 56 BF 3E D9 17 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 4C 13 00 00 D9 17 00 00 CD 00 00 00 00 2A\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 52 13 00 00 10 04 00 00 23 22 10 04 00 00 11\r
 R 00 00 01 00 00 04 03 00 00 0A 03 00\r
-T 15 11 00 00 04 00 CD 5B 14 00 00 DD 75 BC DD\r
-R 00 00 01 00 00 07 01 00\r
-T 1E 11 00 00 74 BD 01 1E 00 C5 4D 44 11\r
+T 59 13 00 00 04 00 3E 13 17 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 5E 13 00 00 13 17 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 65 13 00 00 BC DD 74 BD 01 1E 00 C5 4D 44 11\r
 R 00 00 01 00\r
-T 27 11 00 00 06 04 00 00 CD 00 00 00 00 E1 DD\r
-R 00 00 01 00 00 04 03 00 02 09 11 00\r
-T 2E 11 00 00 4E BC DD 46 BD 11 04 00 CD\r
+T 70 13 00 00 06 04 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 11 00\r
+T 75 13 00 00 00 00 00 00 CD 00 00 00 00 E1 DD\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T 7C 13 00 00 4E BC DD 46 BD 11 04 00 3E\r
 R 00 00 01 00\r
-T 37 11 00 00 8B 14 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 39 11 00 00\r
+T 85 13 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 8A 13 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 8C 13 00 00\r
 R 00 00 01 00\r
-T 39 11 00 00 18 3F\r
+T 8C 13 00 00 18 53\r
 R 00 00 01 00\r
-T 3B 11 00 00\r
+T 8E 13 00 00\r
 R 00 00 01 00\r
-T 3B 11 00 00 DD 6E C2 DD 66 C3 E5 DD 6E BE DD\r
+T 8E 13 00 00 DD 6E C2 DD 66 C3 E5 DD 6E BE DD\r
 R 00 00 01 00\r
-T 46 11 00 00 66 BF E5 21 0D 05 00 00 E5 CD\r
+T 99 13 00 00 66 BF E5 21 0D 05 00 00 E5 3E\r
 R 00 00 01 00 00 08 02 00\r
-T 4E 11 00 00 00 00 00 00 F1 F1 F1 CD\r
-R 00 00 01 00 02 04 08 00\r
-T 54 11 00 00 28 16 00 00 7D B4 28 20\r
-R 00 00 01 00 00 04 01 00\r
-T 5A 11 00 00\r
+T A1 13 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T A6 13 00 00 00 00 00 00 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T AC 13 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T B1 13 00 00 00 00 00 00 7D B4 28 2A\r
+R 00 00 01 00 02 04 14 00\r
+T B7 13 00 00\r
 R 00 00 01 00\r
-T 5A 11 00 00 DD 36 C2 01 DD 36 C3 00 21 04 00\r
+T B7 13 00 00 DD 36 C2 01 DD 36 C3 00 21 04 00\r
 R 00 00 01 00\r
-T 65 11 00 00 39 4D 44 DD 5E BE DD 56 BF CD\r
+T C2 13 00 00 39 4D 44 DD 5E BE DD 56 BF 3E\r
 R 00 00 01 00\r
-T 6F 11 00 00 F9 14 00 00 DD 5E BE DD 56 BF CD\r
-R 00 00 01 00 00 04 01 00\r
-T 78 11 00 00 D9 0E 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 7A 11 00 00\r
+T CC 13 00 00 D9 17 00 00 21 D9 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T D1 13 00 00 00 00 00 00 DD 5E BE DD 56 BF 3E\r
+R 00 00 01 00 02 04 14 00\r
+T DA 13 00 00 D0 10 00 00 21 D0 10 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T DF 13 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T E1 13 00 00\r
 R 00 00 01 00\r
-T 7A 11 00 00\r
+T E1 13 00 00\r
 R 00 00 01 00\r
-T 7A 11 00 00\r
+T E1 13 00 00\r
 R 00 00 01 00\r
-T 7A 11 00 00\r
+T E1 13 00 00\r
 R 00 00 01 00\r
-T 7A 11 00 00 DD 34 BE 20 03 DD 34 BF\r
+T E1 13 00 00 DD 34 BE 20 03 DD 34 BF\r
 R 00 00 01 00\r
-T 82 11 00 00\r
+T E9 13 00 00\r
 R 00 00 01 00\r
-T 82 11 00 00 C3 A9 0F 00 00\r
+T E9 13 00 00 C3 BF 11 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 85 11 00 00\r
+T EC 13 00 00\r
 R 00 00 01 00\r
-T 85 11 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 88 11 00 00\r
+T EC 13 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T EF 13 00 00\r
 R 00 00 01 00\r
-T 88 11 00 00 CD 00 00 00 00 FA FF 11 12 00 69\r
-R 00 00 01 00 02 05 18 00\r
-T 91 11 00 00 60 A7 ED 52 30 19\r
+T EF 13 00 00 CD 00 00 00 00 FA FF 11 12 00 69\r
+R 00 00 01 00 02 05 19 00\r
+T F8 13 00 00 60 A7 ED 52 30 19\r
 R 00 00 01 00\r
-T 97 11 00 00\r
+T FE 13 00 00\r
 R 00 00 01 00\r
-T 97 11 00 00 DD 6E 04 DD 66 05 29 DD 4E 02 DD\r
+T FE 13 00 00 DD 6E 04 DD 66 05 29 DD 4E 02 DD\r
 R 00 00 01 00\r
-T A2 11 00 00 46 03 09 01 18 00 09 46 23 66 68\r
+T 09 14 00 00 46 03 09 01 18 00 09 46 23 66 68\r
 R 00 00 01 00\r
-T AD 11 00 00 C3 72 12 00 00\r
+T 14 14 00 00 C3 E8 14 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T B0 11 00 00\r
+T 17 14 00 00\r
 R 00 00 01 00\r
-T B0 11 00 00 01 12 01 DD 6E 04 DD 66 05 A7 ED\r
+T 17 14 00 00 01 12 01 DD 6E 04 DD 66 05 A7 ED\r
 R 00 00 01 00\r
-T BB 11 00 00 42 30 43\r
+T 22 14 00 00 42 30 48\r
 R 00 00 01 00\r
-T BE 11 00 00\r
+T 25 14 00 00\r
 R 00 00 01 00\r
-T BE 11 00 00 21 3C 00 DD 4E 02 DD 46 03 09 46\r
+T 25 14 00 00 21 3C 00 DD 4E 02 DD 46 03 09 46\r
 R 00 00 01 00\r
-T C9 11 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
+T 30 14 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
 R 00 00 01 00\r
-T D4 11 00 00 20 06\r
+T 3B 14 00 00 20 06\r
 R 00 00 01 00\r
-T D6 11 00 00\r
+T 3D 14 00 00\r
 R 00 00 01 00\r
-T D6 11 00 00 21 00 00 C3 72 12 00 00\r
+T 3D 14 00 00 21 00 00 C3 E8 14 00 00\r
 R 00 00 01 00 00 08 01 00\r
-T DC 11 00 00\r
+T 43 14 00 00\r
 R 00 00 01 00\r
-T DC 11 00 00 DD 5E FA DD 56 FB CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T E5 11 00 00 DD 75 FE DD 74 FF E5 DD 6E 04 DD\r
+T 43 14 00 00 DD 5E FA DD 56 FB 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 4B 14 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 52 14 00 00 75 FE DD 74 FF E5 DD 6E 04 DD 66\r
 R 00 00 01 00\r
-T F0 11 00 00 66 05 29 4D 44 E1 09 01 DC FF 09\r
+T 5D 14 00 00 05 29 4D 44 E1 09 01 DC FF 09 46\r
 R 00 00 01 00\r
-T FB 11 00 00 46 23 66 68 18 71\r
+T 68 14 00 00 23 66 68 18 7B\r
 R 00 00 01 00\r
-T 01 12 00 00\r
+T 6D 14 00 00\r
 R 00 00 01 00\r
-T 01 12 00 00 21 3E 00 DD 4E 02 DD 46 03 09 46\r
+T 6D 14 00 00 21 3E 00 DD 4E 02 DD 46 03 09 46\r
 R 00 00 01 00\r
-T 0C 12 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
+T 78 14 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
 R 00 00 01 00\r
-T 17 12 00 00 20 05\r
+T 83 14 00 00 20 05\r
 R 00 00 01 00\r
-T 19 12 00 00\r
+T 85 14 00 00\r
 R 00 00 01 00\r
-T 19 12 00 00 21 00 00 18 54\r
+T 85 14 00 00 21 00 00 18 5E\r
 R 00 00 01 00\r
-T 1E 12 00 00\r
+T 8A 14 00 00\r
 R 00 00 01 00\r
-T 1E 12 00 00 DD 5E FA DD 56 FB CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 27 12 00 00 DD 75 FE DD 74 FF 21 E0 00 DD 4E\r
+T 8A 14 00 00 DD 5E FA DD 56 FB 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 92 14 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 99 14 00 00 75 FE DD 74 FF 21 E0 00 DD 4E 04\r
 R 00 00 01 00\r
-T 32 12 00 00 04 DD 46 05 09 DD 75 FA DD 74 FB\r
+T A4 14 00 00 DD 46 05 09 DD 75 FA DD 74 FB 6C\r
 R 00 00 01 00\r
-T 3D 12 00 00 6C 26 00 29 DD 4E FE DD 46 FF 09\r
+T AF 14 00 00 26 00 29 DD 4E FE DD 46 FF 09 56\r
 R 00 00 01 00\r
-T 48 12 00 00 56 23 66 6A DD 75 FC DD 74 FD EB\r
+T BA 14 00 00 23 66 6A DD 75 FC DD 74 FD EB 3E\r
 R 00 00 01 00\r
-T 53 12 00 00 CD 5B 14 00 00 DD 75 FE DD 74 FF\r
-R 00 00 01 00 00 05 01 00\r
-T 5C 12 00 00 E5 DD 7E FA E6 FF 6F DD 7E FB E6\r
+T C5 14 00 00 13 17 00 00 21 13 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T CA 14 00 00 00 00 00 00 DD 75 FE DD 74 FF E5\r
+R 00 00 01 00 02 04 14 00\r
+T D3 14 00 00 DD 7E FA E6 FF 6F DD 7E FB E6 00\r
 R 00 00 01 00\r
-T 67 12 00 00 00 67 29 4D 44 E1 09 46 23 66 68\r
+T DE 14 00 00 67 29 4D 44 E1 09 46 23 66 68\r
 R 00 00 01 00\r
-T 72 12 00 00\r
+T E8 14 00 00\r
 R 00 00 01 00\r
-T 72 12 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 75 12 00 00\r
+T E8 14 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T EB 14 00 00\r
 R 00 00 01 00\r
-T 75 12 00 00 CD 00 00 00 00 FA FF 11 12 00 69\r
-R 00 00 01 00 02 05 18 00\r
-T 7E 12 00 00 60 A7 ED 52 30 1E\r
+T EB 14 00 00 CD 00 00 00 00 FA FF 11 12 00 69\r
+R 00 00 01 00 02 05 19 00\r
+T F4 14 00 00 60 A7 ED 52 30 1E\r
 R 00 00 01 00\r
-T 84 12 00 00\r
+T FA 14 00 00\r
 R 00 00 01 00\r
-T 84 12 00 00 DD 6E 04 DD 66 05 29 DD 4E 02 DD\r
+T FA 14 00 00 DD 6E 04 DD 66 05 29 DD 4E 02 DD\r
 R 00 00 01 00\r
-T 8F 12 00 00 46 03 09 01 18 00 09 DD 4E 08 DD\r
+T 05 15 00 00 46 03 09 01 18 00 09 DD 4E 0A DD\r
 R 00 00 01 00\r
-T 9A 12 00 00 46 09 71 23 70 C3 A0 13 00 00\r
+T 10 15 00 00 46 0B 71 23 70 C3 3E 16 00 00\r
 R 00 00 01 00 00 0A 01 00\r
-T A2 12 00 00\r
+T 18 15 00 00\r
 R 00 00 01 00\r
-T A2 12 00 00 01 12 01 DD 6E 04 DD 66 05 A7 ED\r
+T 18 15 00 00 01 12 01 DD 6E 04 DD 66 05 A7 ED\r
 R 00 00 01 00\r
-T AD 12 00 00 42 30 58\r
+T 23 15 00 00 42 30 67\r
 R 00 00 01 00\r
-T B0 12 00 00\r
+T 26 15 00 00\r
 R 00 00 01 00\r
-T B0 12 00 00 21 3C 00 DD 4E 02 DD 46 03 09 46\r
+T 26 15 00 00 21 3C 00 DD 4E 02 DD 46 03 09 46\r
 R 00 00 01 00\r
-T BB 12 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
+T 31 15 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
 R 00 00 01 00\r
-T C6 12 00 00 20 06\r
+T 3C 15 00 00 20 0B\r
 R 00 00 01 00\r
-T C8 12 00 00\r
+T 3E 15 00 00\r
 R 00 00 01 00\r
-T C8 12 00 00 11 43 05 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T CE 12 00 00\r
+T 3E 15 00 00 11 43 05 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T 44 15 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 49 15 00 00\r
 R 00 00 01 00\r
-T CE 12 00 00 DD 5E FA DD 56 FB CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T D7 12 00 00 DD 75 FE DD 74 FF E5 DD 6E 04 DD\r
+T 49 15 00 00 DD 5E FA DD 56 FB 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 51 15 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 58 15 00 00 75 FE DD 74 FF E5 DD 6E 04 DD 66\r
 R 00 00 01 00\r
-T E2 12 00 00 66 05 29 4D 44 E1 09 01 DC FF 09\r
+T 63 15 00 00 05 29 4D 44 E1 09 01 DC FF 09 DD\r
 R 00 00 01 00\r
-T ED 12 00 00 DD 4E 08 DD 46 09 71 23 70 DD 4E\r
+T 6E 15 00 00 4E 0A DD 46 0B 71 23 70 DD 4E FE\r
 R 00 00 01 00\r
-T F8 12 00 00 FE DD 46 FF DD 5E FA DD 56 FB CD\r
+T 79 15 00 00 DD 46 FF DD 5E FA DD 56 FB 3E\r
 R 00 00 01 00\r
-T 03 13 00 00 8B 14 00 00 C3 A0 13 00 00\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 08 13 00 00\r
+T 83 15 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 88 15 00 00 00 00 00 00 C3 3E 16 00 00\r
+R 00 00 01 00 02 04 14 00 00 09 01 00\r
+T 8D 15 00 00\r
 R 00 00 01 00\r
-T 08 13 00 00 21 3E 00 DD 4E 02 DD 46 03 09 46\r
+T 8D 15 00 00 21 3E 00 DD 4E 02 DD 46 03 09 46\r
 R 00 00 01 00\r
-T 13 13 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
+T 98 15 00 00 23 66 68 DD 75 FA DD 74 FB 7D B4\r
 R 00 00 01 00\r
-T 1E 13 00 00 20 06\r
+T A3 15 00 00 20 0B\r
 R 00 00 01 00\r
-T 20 13 00 00\r
+T A5 15 00 00\r
 R 00 00 01 00\r
-T 20 13 00 00 11 43 05 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T 26 13 00 00\r
+T A5 15 00 00 11 43 05 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T AB 15 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T B0 15 00 00\r
 R 00 00 01 00\r
-T 26 13 00 00 DD 5E FA DD 56 FB CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 2F 13 00 00 DD 75 FE DD 74 FF 21 0A 00 39 7E\r
+T B0 15 00 00 DD 5E FA DD 56 FB 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T B8 15 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T BF 15 00 00 75 FE DD 74 FF 21 0A 00 39 7E D6\r
 R 00 00 01 00\r
-T 3A 13 00 00 D6 12 77 23 7E DE 01 77 DD 6E 04\r
+T CA 15 00 00 12 77 23 7E DE 01 77 DD 6E 04 DD\r
 R 00 00 01 00\r
-T 45 13 00 00 DD 66 05 6C 26 00 29 DD 4E FE DD\r
+T D5 15 00 00 66 05 6C 26 00 29 DD 4E FE DD 46\r
 R 00 00 01 00\r
-T 50 13 00 00 46 FF 09 46 23 66 68 DD 75 FC DD\r
+T E0 15 00 00 FF 09 46 23 66 68 DD 75 FC DD 74\r
 R 00 00 01 00\r
-T 5B 13 00 00 74 FD 7D B4 20 06\r
+T EB 15 00 00 FD 7D B4 20 0B\r
 R 00 00 01 00\r
-T 61 13 00 00\r
+T F0 15 00 00\r
 R 00 00 01 00\r
-T 61 13 00 00 11 43 05 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T 67 13 00 00\r
+T F0 15 00 00 11 43 05 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T F6 15 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T FB 15 00 00\r
 R 00 00 01 00\r
-T 67 13 00 00 DD 5E FC DD 56 FD CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 70 13 00 00 DD 75 FE DD 74 FF E5 DD 7E 04 E6\r
+T FB 15 00 00 DD 5E FC DD 56 FD 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 03 16 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 0A 16 00 00 75 FE DD 74 FF E5 DD 7E 04 E6 FF\r
 R 00 00 01 00\r
-T 7B 13 00 00 FF 6F DD 7E 05 E6 00 67 29 4D 44\r
+T 15 16 00 00 6F DD 7E 05 E6 00 67 29 4D 44 E1\r
 R 00 00 01 00\r
-T 86 13 00 00 E1 09 DD 4E 04 DD 46 05 71 23 70\r
+T 20 16 00 00 09 DD 4E 04 DD 46 05 71 23 70 DD\r
 R 00 00 01 00\r
-T 91 13 00 00 DD 4E FE DD 46 FF DD 5E FA DD 56\r
+T 2B 16 00 00 4E FE DD 46 FF DD 5E FA DD 56 FB\r
 R 00 00 01 00\r
-T 9C 13 00 00 FB CD 8B 14 00 00\r
-R 00 00 01 00 00 06 01 00\r
-T A0 13 00 00\r
-R 00 00 01 00\r
-T A0 13 00 00\r
+T 36 16 00 00 3E 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 3C 16 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 3E 16 00 00\r
 R 00 00 01 00\r
-T A0 13 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T A3 13 00 00\r
+T 3E 16 00 00\r
 R 00 00 01 00\r
-T A3 13 00 00 CD 00 00 00 00 F6 FF 21 12 00 DD\r
-R 00 00 01 00 02 05 18 00\r
-T AC 13 00 00 4E 02 DD 46 03 09 56 23 66 6A DD\r
+T 3E 16 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 41 16 00 00\r
 R 00 00 01 00\r
-T B7 13 00 00 75 FC DD 74 FD 21 14 00 09 46 23\r
+T 41 16 00 00 CD 00 00 00 00 F6 FF 21 12 00 DD\r
+R 00 00 01 00 02 05 19 00\r
+T 4A 16 00 00 4E 02 DD 46 03 09 56 23 66 6A DD\r
 R 00 00 01 00\r
-T C2 13 00 00 66 68 DD 75 FE DD 74 FF 4D 44 DD\r
+T 55 16 00 00 75 FC DD 74 FD 21 14 00 09 46 23\r
 R 00 00 01 00\r
-T CD 13 00 00 5E FC DD 56 FD CD 09 1A 00 00 DD\r
-R 00 00 01 00 00 0A 01 00\r
-T D6 13 00 00 75 FA DD 74 FB 7D A4 3C 20 05\r
+T 60 16 00 00 66 68 DD 75 FE DD 74 FF 4D 44 DD\r
 R 00 00 01 00\r
-T E0 13 00 00\r
+T 6B 16 00 00 5E FC DD 56 FD 3E 2F 1E 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T 73 16 00 00 2F 1E 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 7A 16 00 00 FA DD 74 FB 7D A4 3C 20 06\r
 R 00 00 01 00\r
-T E0 13 00 00 21 00 00 18 73\r
+T 83 16 00 00\r
 R 00 00 01 00\r
-T E5 13 00 00\r
+T 83 16 00 00 21 00 00 C3 10 17 00 00\r
+R 00 00 01 00 00 08 01 00\r
+T 89 16 00 00\r
 R 00 00 01 00\r
-T E5 13 00 00 21 08 00 DD 4E 02 DD 46 03 09 4E\r
+T 89 16 00 00 21 08 00 DD 4E 02 DD 46 03 09 4E\r
 R 00 00 01 00\r
-T F0 13 00 00 23 46 0B 70 2B 71 ED 4B\r
+T 94 16 00 00 23 46 0B 70 2B 71 ED 4B\r
 R 00 00 01 00\r
-T F8 13 00 00 26 04 00 00 DD 6E FA DD 66 FB A7\r
+T 9C 16 00 00 26 04 00 00 DD 6E FA DD 66 FB A7\r
 R 00 00 01 00 00 04 03 00\r
-T 01 14 00 00 ED 42 38 18 21 06 00 DD 4E 02 DD\r
+T A5 16 00 00 ED 42 38 18 21 06 00 DD 4E 02 DD\r
 R 00 00 01 00\r
-T 0C 14 00 00 46 03 09 4E 23 46 DD 6E FA DD 66\r
+T B0 16 00 00 46 03 09 4E 23 46 DD 6E FA DD 66\r
 R 00 00 01 00\r
-T 17 14 00 00 FB A7 ED 42 38 0D\r
+T BB 16 00 00 FB A7 ED 42 38 12\r
 R 00 00 01 00\r
-T 1D 14 00 00\r
+T C1 16 00 00\r
 R 00 00 01 00\r
-T 1D 14 00 00\r
+T C1 16 00 00\r
 R 00 00 01 00\r
-T 1D 14 00 00\r
+T C1 16 00 00\r
 R 00 00 01 00\r
-T 1D 14 00 00 21 5A 05 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 24 14 00 00 F1 21 00 00 18 2E\r
+T C1 16 00 00 21 5A 05 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T C7 16 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T CE 16 00 00 21 00 00 18 3D\r
 R 00 00 01 00\r
-T 2A 14 00 00\r
+T D3 16 00 00\r
 R 00 00 01 00\r
-T 2A 14 00 00 11 04 00 CD 5B 14 00 00 DD 75 F8\r
-R 00 00 01 00 00 08 01 00\r
-T 33 14 00 00 DD 74 F9 01 02 00 C5 4D 44 21\r
+T D3 16 00 00 11 04 00 3E 13 17 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T D9 16 00 00 13 17 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T E0 16 00 00 F8 DD 74 F9 01 02 00 C5 4D 44 21\r
 R 00 00 01 00\r
-T 3D 14 00 00 0E 00 39 5D 54 CD 00 00 00 00 E1\r
-R 00 00 01 00 02 0A 11 00\r
-T 46 14 00 00 DD 4E F8 DD 46 F9 11 04 00 CD\r
+T EB 16 00 00 0E 00 39 5D 54 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 11 00\r
+T F3 16 00 00 00 00 00 00 CD 00 00 00 00 E1 DD\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T FA 16 00 00 4E F8 DD 46 F9 11 04 00 3E\r
 R 00 00 01 00\r
-T 50 14 00 00 8B 14 00 00 DD 6E FA DD 66 FB\r
-R 00 00 01 00 00 04 01 00\r
-T 58 14 00 00\r
+T 03 17 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 08 17 00 00 00 00 00 00 DD 6E FA DD 66 FB\r
+R 00 00 01 00 02 04 14 00\r
+T 10 17 00 00\r
 R 00 00 01 00\r
-T 58 14 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 5B 14 00 00\r
+T 10 17 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 13 17 00 00\r
 R 00 00 01 00\r
-T 5B 14 00 00 CD 00 00 00 00 21 3A 04 00 00 E5\r
+T 13 17 00 00 CD 00 00 00 00 21 3A 04 00 00 E5\r
 R 00 00 01 00 02 05 13 00 00 0A 03 00\r
-T 62 14 00 00 4B 42 ED 5B 04 04 00 00 CD\r
+T 1A 17 00 00 4B 42 ED 5B 04 04 00 00 3E\r
 R 00 00 01 00 00 08 03 00\r
-T 69 14 00 00 00 00 00 00 F1 3E 02 AC B5 28 13\r
-R 00 00 01 00 00 04 01 00\r
-T 72 14 00 00\r
-R 00 00 01 00\r
-T 72 14 00 00 DD 6E 02 DD 66 03 E5 21\r
-R 00 00 01 00\r
-T 7A 14 00 00 86 05 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 81 14 00 00 F1 CD 00 00 00 00\r
-R 00 00 01 00 02 06 0C 00\r
-T 85 14 00 00\r
-R 00 00 01 00\r
-T 85 14 00 00 21 3A 04 00 00 C3 00 00 00 00\r
-R 00 00 01 00 00 05 03 00 02 0A 0F 00\r
-T 8B 14 00 00\r
-R 00 00 01 00\r
-T 8B 14 00 00 CD 00 00 00 00 C5 4B 42 ED 5B\r
+T 21 17 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 26 17 00 00 00 00 00 00 F1 3E 02 AC B5 28 1D\r
+R 00 00 01 00 02 04 14 00\r
+T 2F 17 00 00\r
+R 00 00 01 00\r
+T 2F 17 00 00 DD 6E 02 DD 66 03 E5 21\r
+R 00 00 01 00\r
+T 37 17 00 00 86 05 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 3D 17 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 44 17 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 0D 00 02 0A 0D 00\r
+T 4A 17 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 4C 17 00 00\r
+R 00 00 01 00\r
+T 4C 17 00 00 21 3A 04 00 00 C3 00 00 00 00\r
+R 00 00 01 00 00 05 03 00 02 0A 09 00\r
+T 52 17 00 00\r
+R 00 00 01 00\r
+T 52 17 00 00 CD 00 00 00 00 C5 4B 42 ED 5B\r
 R 00 00 01 00 02 05 13 00\r
-T 93 14 00 00 04 04 00 00 CD 73 00 00 00 F1 3E\r
-R 00 00 01 00 00 04 03 00 00 09 01 00\r
-T 9A 14 00 00 02 AC B5 28 13\r
-R 00 00 01 00\r
-T 9F 14 00 00\r
-R 00 00 01 00\r
-T 9F 14 00 00 DD 6E 02 DD 66 03 E5 21\r
-R 00 00 01 00\r
-T A7 14 00 00 A0 05 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T AE 14 00 00 F1 CD 00 00 00 00\r
-R 00 00 01 00 02 06 0C 00\r
-T B2 14 00 00\r
-R 00 00 01 00\r
-T B2 14 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T B5 14 00 00\r
-R 00 00 01 00\r
-T B5 14 00 00 CD 00 00 00 00 FE FF 06 03 DD 5E\r
-R 00 00 01 00 02 05 18 00\r
-T BE 14 00 00 02 DD 56 03 CD 00 00 00 00 2A\r
-R 00 00 01 00 02 09 00 00\r
-T C6 14 00 00 26 04 00 00 19 EB CD 5B 14 00 00\r
-R 00 00 01 00 00 04 03 00 00 0B 01 00\r
-T CD 14 00 00 DD 75 FE DD 74 FF 01 40 00 C5 DD\r
-R 00 00 01 00\r
-T D8 14 00 00 4E 04 DD 46 05 C5 DD 7E 02 E6 07\r
-R 00 00 01 00\r
-T E3 14 00 00 5F DD 7E 03 E6 00 57 06 06 CD\r
-R 00 00 01 00\r
-T ED 14 00 00 00 00 00 00 19 EB C1 CD\r
-R 00 00 01 00 02 04 02 00\r
-T F3 14 00 00 00 00 00 00 E1 C3 00 00 00 00\r
-R 00 00 01 00 02 04 11 00 02 0A 0F 00\r
-T F9 14 00 00\r
-R 00 00 01 00\r
-T F9 14 00 00 CD 00 00 00 00 FE FF 06 03 DD 5E\r
-R 00 00 01 00 02 05 18 00\r
-T 02 15 00 00 02 DD 56 03 CD 00 00 00 00 2A\r
+T 5A 17 00 00 04 04 00 00 3E A5 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 29 09 01 00\r
+T 5F 17 00 00 A5 00 00 00 CD 00 00 00 00 F1 3E\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 66 17 00 00 02 AC B5 28 1D\r
+R 00 00 01 00\r
+T 6B 17 00 00\r
+R 00 00 01 00\r
+T 6B 17 00 00 DD 6E 02 DD 66 03 E5 21\r
+R 00 00 01 00\r
+T 73 17 00 00 A0 05 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 79 17 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 80 17 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 0D 00 02 0A 0D 00\r
+T 86 17 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 88 17 00 00\r
+R 00 00 01 00\r
+T 88 17 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 8B 17 00 00\r
+R 00 00 01 00\r
+T 8B 17 00 00 CD 00 00 00 00 FE FF 06 03 DD 5E\r
+R 00 00 01 00 02 05 19 00\r
+T 94 17 00 00 02 DD 56 03 CD 00 00 00 00 2A\r
 R 00 00 01 00 02 09 00 00\r
-T 0A 15 00 00 26 04 00 00 19 EB CD 5B 14 00 00\r
-R 00 00 01 00 00 04 03 00 00 0B 01 00\r
-T 11 15 00 00 DD 75 FE DD 74 FF 01 40 00 C5 DD\r
-R 00 00 01 00\r
-T 1C 15 00 00 7E 02 E6 07 5F DD 7E 03 E6 00 57\r
-R 00 00 01 00\r
-T 27 15 00 00 06 06 CD 00 00 00 00 19 4D 44 DD\r
-R 00 00 01 00 02 07 02 00\r
-T 30 15 00 00 5E 04 DD 56 05 CD 00 00 00 00 E1\r
-R 00 00 01 00 02 0A 11 00\r
-T 39 15 00 00 DD 4E FE DD 46 FF C5 06 03 DD 5E\r
-R 00 00 01 00\r
-T 44 15 00 00 02 DD 56 03 CD 00 00 00 00 2A\r
+T 9C 17 00 00 26 04 00 00 19 EB 3E 13 17 00 00\r
+R 00 00 01 00 00 04 03 00 29 0B 01 00\r
+T A2 17 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T A9 17 00 00 75 FE DD 74 FF 01 40 00 C5 DD 4E\r
+R 00 00 01 00\r
+T B4 17 00 00 04 DD 46 05 C5 DD 7E 02 E6 07 5F\r
+R 00 00 01 00\r
+T BF 17 00 00 DD 7E 03 E6 00 57 06 06 CD\r
+R 00 00 01 00\r
+T C8 17 00 00 00 00 00 00 19 EB 3E 00 00 00 00\r
+R 00 00 01 00 02 04 01 00 2B 0B 11 00\r
+T CE 17 00 00 21 00 00 00 00 C1 CD 00 00 00 00\r
+R 00 00 01 00 02 05 11 00 02 0B 14 00\r
+T D5 17 00 00 E1 C3 00 00 00 00\r
+R 00 00 01 00 02 06 09 00\r
+T D9 17 00 00\r
+R 00 00 01 00\r
+T D9 17 00 00 CD 00 00 00 00 FE FF 06 03 DD 5E\r
+R 00 00 01 00 02 05 19 00\r
+T E2 17 00 00 02 DD 56 03 CD 00 00 00 00 2A\r
 R 00 00 01 00 02 09 00 00\r
-T 4C 15 00 00 26 04 00 00 19 EB C1 CD\r
-R 00 00 01 00 00 04 03 00\r
-T 52 15 00 00 8B 14 00 00 C3 00 00 00 00\r
-R 00 00 01 00 00 04 01 00 02 09 0F 00\r
-T 57 15 00 00\r
-R 00 00 01 00\r
-T 57 15 00 00 CD 00 00 00 00 FC FF 06 05 DD 5E\r
-R 00 00 01 00 02 05 18 00\r
-T 60 15 00 00 04 DD 56 05 CD 00 00 00 00 4B 42\r
+T EA 17 00 00 26 04 00 00 19 EB 3E 13 17 00 00\r
+R 00 00 01 00 00 04 03 00 29 0B 01 00\r
+T F0 17 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T F7 17 00 00 75 FE DD 74 FF 01 40 00 C5 DD 7E\r
+R 00 00 01 00\r
+T 02 18 00 00 02 E6 07 5F DD 7E 03 E6 00 57 06\r
+R 00 00 01 00\r
+T 0D 18 00 00 06 CD 00 00 00 00 19 4D 44 DD 5E\r
+R 00 00 01 00 02 06 01 00\r
+T 16 18 00 00 04 DD 56 05 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 11 00\r
+T 1D 18 00 00 00 00 00 00 CD 00 00 00 00 E1 DD\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T 24 18 00 00 4E FE DD 46 FF C5 06 03 DD 5E 02\r
+R 00 00 01 00\r
+T 2F 18 00 00 DD 56 03 CD 00 00 00 00 2A\r
+R 00 00 01 00 02 08 00 00\r
+T 36 18 00 00 26 04 00 00 19 EB 3E 52 17 00 00\r
+R 00 00 01 00 00 04 03 00 29 0B 01 00\r
+T 3C 18 00 00 21 52 17 00 00 C1 CD 00 00 00 00\r
+R 00 00 01 00 00 05 01 00 02 0B 14 00\r
+T 43 18 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 46 18 00 00\r
+R 00 00 01 00\r
+T 46 18 00 00 CD 00 00 00 00 FC FF 06 05 DD 5E\r
+R 00 00 01 00 02 05 19 00\r
+T 4F 18 00 00 04 DD 56 05 CD 00 00 00 00 4B 42\r
 R 00 00 01 00 02 09 00 00\r
-T 69 15 00 00 DD 5E 02 DD 56 03 CD 88 11 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 72 15 00 00 DD 75 FE DD 74 FF 7D B4 20 06\r
-R 00 00 01 00\r
-T 7C 15 00 00\r
-R 00 00 01 00\r
-T 7C 15 00 00 11 BB 05 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T 82 15 00 00\r
-R 00 00 01 00\r
-T 82 15 00 00 DD 5E FE DD 56 FF CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 8B 15 00 00 DD 75 FC DD 74 FD 01 10 00 C5 DD\r
-R 00 00 01 00\r
-T 96 15 00 00 4E 08 DD 46 09 E5 DD 7E 04 E6 1F\r
-R 00 00 01 00\r
-T A1 15 00 00 6F DD 7E 05 E6 00 67 29 29 29 29\r
-R 00 00 01 00\r
-T AC 15 00 00 EB E1 19 EB CD 00 00 00 00 E1 C3\r
-R 00 00 01 00 02 09 11 00\r
-T B5 15 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0F 00\r
-T B7 15 00 00\r
-R 00 00 01 00\r
-T B7 15 00 00 CD 00 00 00 00 FC FF 06 05 DD 5E\r
-R 00 00 01 00 02 05 18 00\r
-T C0 15 00 00 04 DD 56 05 CD 00 00 00 00 4B 42\r
+T 58 18 00 00 DD 5E 02 DD 56 03 3E EF 13 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 60 18 00 00 21 EF 13 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 67 18 00 00 75 FE DD 74 FF 7D B4 20 0B\r
+R 00 00 01 00\r
+T 70 18 00 00\r
+R 00 00 01 00\r
+T 70 18 00 00 11 BB 05 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T 76 18 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T 7B 18 00 00\r
+R 00 00 01 00\r
+T 7B 18 00 00 DD 5E FE DD 56 FF 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 83 18 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 8A 18 00 00 75 FC DD 74 FD 01 10 00 C5 DD 4E\r
+R 00 00 01 00\r
+T 95 18 00 00 0A DD 46 0B E5 DD 7E 04 E6 1F 6F\r
+R 00 00 01 00\r
+T A0 18 00 00 DD 7E 05 E6 00 67 29 29 29 29 EB\r
+R 00 00 01 00\r
+T AB 18 00 00 E1 19 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 11 00\r
+T B1 18 00 00 00 00 00 00 CD 00 00 00 00 E1 C3\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T B8 18 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 09 00\r
+T BA 18 00 00\r
+R 00 00 01 00\r
+T BA 18 00 00 CD 00 00 00 00 FC FF 06 05 DD 5E\r
+R 00 00 01 00 02 05 19 00\r
+T C3 18 00 00 04 DD 56 05 CD 00 00 00 00 4B 42\r
 R 00 00 01 00 02 09 00 00\r
-T C9 15 00 00 DD 5E 02 DD 56 03 CD 88 11 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T D2 15 00 00 DD 75 FE DD 74 FF 7D B4 20 06\r
-R 00 00 01 00\r
-T DC 15 00 00\r
-R 00 00 01 00\r
-T DC 15 00 00 11 BB 05 00 00 CD 4C 1B 00 00\r
-R 00 00 01 00 00 05 02 00 00 0A 01 00\r
-T E2 15 00 00\r
-R 00 00 01 00\r
-T E2 15 00 00 DD 5E FE DD 56 FF CD 5B 14 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T EB 15 00 00 DD 75 FC DD 74 FD 01 10 00 C5 E5\r
-R 00 00 01 00\r
-T F6 15 00 00 DD 7E 04 E6 1F 6F DD 7E 05 E6 00\r
-R 00 00 01 00\r
-T 01 16 00 00 67 29 29 29 29 4D 44 E1 09 4D 44\r
-R 00 00 01 00\r
-T 0C 16 00 00 DD 5E 08 DD 56 09 CD 00 00 00 00\r
-R 00 00 01 00 02 0B 11 00\r
-T 15 16 00 00 E1 DD 4E FC DD 46 FD DD 5E FE DD\r
-R 00 00 01 00\r
-T 20 16 00 00 56 FF CD 8B 14 00 00 C3\r
-R 00 00 01 00 00 07 01 00\r
-T 26 16 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0F 00\r
-T 28 16 00 00\r
-R 00 00 01 00\r
-T 28 16 00 00 CD 00 00 00 00 EC FF 11\r
-R 00 00 01 00 02 05 18 00\r
-T 2E 16 00 00 00 00 00 00 CD 00 00 00 00 2A\r
-R 00 00 01 00 02 04 14 00 02 09 04 00\r
-T 34 16 00 00 00 00 00 00 7D B4 28 0A\r
+T CC 18 00 00 DD 5E 02 DD 56 03 3E EF 13 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T D4 18 00 00 21 EF 13 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T DB 18 00 00 75 FE DD 74 FF 7D B4 20 0B\r
+R 00 00 01 00\r
+T E4 18 00 00\r
+R 00 00 01 00\r
+T E4 18 00 00 11 BB 05 00 00 3E 81 1F 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T EA 18 00 00 81 1F 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T EF 18 00 00\r
+R 00 00 01 00\r
+T EF 18 00 00 DD 5E FE DD 56 FF 3E 13 17 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T F7 18 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T FE 18 00 00 75 FC DD 74 FD 01 10 00 C5 E5 DD\r
+R 00 00 01 00\r
+T 09 19 00 00 7E 04 E6 1F 6F DD 7E 05 E6 00 67\r
+R 00 00 01 00\r
+T 14 19 00 00 29 29 29 29 4D 44 E1 09 4D 44 DD\r
+R 00 00 01 00\r
+T 1F 19 00 00 5E 0A DD 56 0B 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 11 00\r
+T 27 19 00 00 00 00 00 00 CD 00 00 00 00 E1 DD\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T 2E 19 00 00 4E FC DD 46 FD DD 5E FE DD 56 FF\r
+R 00 00 01 00\r
+T 39 19 00 00 3E 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 3F 19 00 00 00 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 04 14 00 02 09 09 00\r
+T 44 19 00 00\r
+R 00 00 01 00\r
+T 44 19 00 00 CD 00 00 00 00 EC FF 11\r
+R 00 00 01 00 02 05 19 00\r
+T 4A 19 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 15 00 2B 09 04 00\r
+T 4F 19 00 00 00 00 00 00 CD 00 00 00 00 2A\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 55 19 00 00 00 00 00 00 7D B4 28 0F\r
 R 00 00 01 00 00 04 04 00\r
-T 3A 16 00 00\r
+T 5B 19 00 00\r
 R 00 00 01 00\r
-T 3A 16 00 00 21 D6 05 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 41 16 00 00 F1 18 28\r
+T 5B 19 00 00 21 D6 05 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 61 19 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T 68 19 00 00 18 2D\r
 R 00 00 01 00\r
-T 44 16 00 00\r
+T 6A 19 00 00\r
 R 00 00 01 00\r
-T 44 16 00 00 21 00 00 00 00 E5 01 14 00 21\r
+T 6A 19 00 00 21 00 00 00 00 E5 01 14 00 21\r
 R 00 00 01 00 02 05 12 00\r
-T 4C 16 00 00 02 00 39 5D 54 CD 00 00 00 00 F1\r
-R 00 00 01 00 02 0A 0E 00\r
-T 55 16 00 00 7D B4 28 0E DD 7E EC FE 79 28 0C\r
+T 72 19 00 00 02 00 39 5D 54 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 0F 00\r
+T 7A 19 00 00 00 00 00 00 CD 00 00 00 00 F1 7D\r
+R 00 00 01 00 02 04 0F 00 02 09 14 00\r
+T 81 19 00 00 B4 28 0E DD 7E EC FE 79 28 0C DD\r
 R 00 00 01 00\r
-T 60 16 00 00 DD 7E EC FE 59 28 05\r
+T 8C 19 00 00 7E EC FE 59 28 05\r
 R 00 00 01 00\r
-T 67 16 00 00\r
+T 92 19 00 00\r
 R 00 00 01 00\r
-T 67 16 00 00\r
+T 92 19 00 00\r
 R 00 00 01 00\r
-T 67 16 00 00\r
+T 92 19 00 00\r
 R 00 00 01 00\r
-T 67 16 00 00\r
+T 92 19 00 00\r
 R 00 00 01 00\r
-T 67 16 00 00\r
+T 92 19 00 00\r
 R 00 00 01 00\r
-T 67 16 00 00 21 00 00 18 03\r
+T 92 19 00 00 21 00 00 18 03\r
 R 00 00 01 00\r
-T 6C 16 00 00\r
+T 97 19 00 00\r
 R 00 00 01 00\r
-T 6C 16 00 00\r
+T 97 19 00 00\r
 R 00 00 01 00\r
-T 6C 16 00 00 21 01 00\r
+T 97 19 00 00 21 01 00\r
 R 00 00 01 00\r
-T 6F 16 00 00\r
+T 9A 19 00 00\r
 R 00 00 01 00\r
-T 6F 16 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 72 16 00 00\r
+T 9A 19 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 9D 19 00 00\r
 R 00 00 01 00\r
-T 72 16 00 00 CD 00 00 00 00 F8 FF DD 36 FC 01\r
-R 00 00 01 00 02 05 18 00\r
-T 7B 16 00 00 DD 36 FD 00 DD 6E 02 DD 66 03 DD\r
+T 9D 19 00 00 CD 00 00 00 00 F8 FF DD 36 FC 01\r
+R 00 00 01 00 02 05 19 00\r
+T A6 19 00 00 DD 36 FD 00 DD 6E 02 DD 66 03 DD\r
 R 00 00 01 00\r
-T 86 16 00 00 75 FE DD 74 FF 2B DD 75 FE DD 74\r
+T B1 19 00 00 75 FE DD 74 FF 2B DD 75 FE DD 74\r
 R 00 00 01 00\r
-T 91 16 00 00 FF 4D 44 21 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 0B 1B 00\r
-T 9A 16 00 00 30 6C DD 6E FC DD 66 FD 29 DD 4E\r
+T BC 19 00 00 FF 4D 44 21 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 0B 1C 00\r
+T C5 19 00 00 30 76 DD 6E FC DD 66 FD 29 DD 4E\r
 R 00 00 01 00\r
-T A5 16 00 00 04 DD 46 05 09 46 23 66 68 DD 75\r
+T D0 19 00 00 04 DD 46 05 09 46 23 66 68 DD 75\r
 R 00 00 01 00\r
-T B0 16 00 00 FA DD 74 FB 7E FE 2D 20 4F\r
+T DB 19 00 00 FA DD 74 FB 7E FE 2D 20 59\r
 R 00 00 01 00\r
-T B9 16 00 00\r
+T E4 19 00 00\r
 R 00 00 01 00\r
-T B9 16 00 00\r
+T E4 19 00 00\r
 R 00 00 01 00\r
-T B9 16 00 00\r
+T E4 19 00 00\r
 R 00 00 01 00\r
-T B9 16 00 00 DD 6E FA DD 66 FB 23 7E FE 79 28\r
+T E4 19 00 00 DD 6E FA DD 66 FB 23 7E FE 79 28\r
 R 00 00 01 00\r
-T C4 16 00 00 27 DD 6E FA DD 66 FB 23 7E FE 59\r
+T EF 19 00 00 31 DD 6E FA DD 66 FB 23 7E FE 59\r
 R 00 00 01 00\r
-T CF 16 00 00 28 1B\r
+T FA 19 00 00 28 25\r
 R 00 00 01 00\r
-T D1 16 00 00\r
+T FC 19 00 00\r
 R 00 00 01 00\r
-T D1 16 00 00\r
+T FC 19 00 00\r
 R 00 00 01 00\r
-T D1 16 00 00\r
+T FC 19 00 00\r
 R 00 00 01 00\r
-T D1 16 00 00 DD 6E FA DD 66 FB E5 21\r
+T FC 19 00 00 DD 6E FA DD 66 FB E5 21\r
 R 00 00 01 00\r
-T D9 16 00 00 D9 05 00 00 E5 21 00 00 00 00 E5\r
-R 00 00 01 00 00 04 02 00 02 0A 09 00\r
-T E0 16 00 00 CD 00 00 00 00 F1 F1 F1 11 01 00\r
-R 00 00 01 00 02 05 20 00\r
-T E9 16 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 21 00\r
-T EC 16 00 00\r
+T 04 1A 00 00 D9 05 00 00 E5 21 00 00 00 00 E5\r
+R 00 00 01 00 00 04 02 00 02 0A 0A 00\r
+T 0B 1A 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 22 00 02 0A 22 00\r
+T 11 1A 00 00 00 00 00 00 F1 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 1A 1A 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 23 00 02 09 23 00\r
+T 1F 1A 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 21 1A 00 00\r
 R 00 00 01 00\r
-T EC 16 00 00 2A 00 00 00 00 23 22 00 00 00 00\r
+T 21 1A 00 00 2A 00 00 00 00 23 22 00 00 00 00\r
 R 00 00 01 00 00 05 04 00 00 0B 04 00\r
-T F3 16 00 00 DD 34 FC 20 03 DD 34 FD\r
+T 28 1A 00 00 DD 34 FC 20 03 DD 34 FD\r
 R 00 00 01 00\r
-T FB 16 00 00\r
+T 30 1A 00 00\r
 R 00 00 01 00\r
-T FB 16 00 00 DD 6E FE DD 66 FF 2B DD 75 FE DD\r
+T 30 1A 00 00 DD 6E FE DD 66 FF 2B DD 75 FE DD\r
 R 00 00 01 00\r
-T 06 17 00 00 74 FF\r
+T 3B 1A 00 00 74 FF\r
 R 00 00 01 00\r
-T 08 17 00 00\r
+T 3D 1A 00 00\r
 R 00 00 01 00\r
-T 08 17 00 00 3E 01 DD AE FE DD B6 FF 28 13\r
+T 3D 1A 00 00 3E 01 DD AE FE DD B6 FF 28 1D\r
 R 00 00 01 00\r
-T 12 17 00 00\r
+T 47 1A 00 00\r
 R 00 00 01 00\r
-T 12 17 00 00 21 EC 05 00 00 E5 21 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 09 00\r
-T 19 17 00 00 E5 CD 00 00 00 00 F1 F1 11 01 00\r
-R 00 00 01 00 02 06 20 00\r
-T 22 17 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 21 00\r
-T 25 17 00 00\r
+T 47 1A 00 00 21 EC 05 00 00 E5 21 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 02 0B 0A 00\r
+T 4E 1A 00 00 E5 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 22 00 02 0B 22 00\r
+T 54 1A 00 00 CD 00 00 00 00 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 05 14 00\r
+T 5D 1A 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 23 00 02 09 23 00\r
+T 62 1A 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 64 1A 00 00\r
 R 00 00 01 00\r
-T 25 17 00 00 DD 6E FC DD 66 FD 29 DD 4E 04 DD\r
+T 64 1A 00 00 DD 6E FC DD 66 FD 29 DD 4E 04 DD\r
 R 00 00 01 00\r
-T 30 17 00 00 46 05 09 4E 23 46 11 02 00 00 00\r
+T 6F 1A 00 00 46 05 09 4E 23 46 11 02 00 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T 39 17 00 00 CD 00 00 00 00 21 02 80 E5 21\r
-R 00 00 01 00 02 05 15 00\r
-T 41 17 00 00 02 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 03 00 02 0A 1C 00\r
-T 48 17 00 00 F1 22 00 00 00 00 CB 7C 28 1A\r
-R 00 00 01 00 00 06 03 00\r
-T 50 17 00 00\r
-R 00 00 01 00\r
-T 50 17 00 00 21 05 06 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 08 00\r
-T 57 17 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 14 00 02 0B 04 00\r
-T 5E 17 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 10 00\r
-T 65 17 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 21 00\r
-T 6A 17 00 00\r
-R 00 00 01 00\r
-T 6A 17 00 00 11 04 00 CD 5B 14 00 00 DD 75 F8\r
-R 00 00 01 00 00 08 01 00\r
-T 73 17 00 00 DD 74 F9 01 1E 00 C5 01\r
-R 00 00 01 00\r
-T 7B 17 00 00 06 04 00 00 EB CD 00 00 00 00 E1\r
-R 00 00 01 00 00 04 03 00 02 0A 11 00\r
-T 82 17 00 00 2A 06 04 00 00 01 C6 31 A7 ED 42\r
+T 78 1A 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 16 00 02 0A 16 00\r
+T 7E 1A 00 00 00 00 00 00 21 02 80 E5 21\r
+R 00 00 01 00 02 04 14 00\r
+T 85 1A 00 00 02 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 0A 1D 00\r
+T 8B 1A 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 1D 00 02 09 14 00\r
+T 92 1A 00 00 22 00 00 00 00 CB 7C 28 2E\r
 R 00 00 01 00 00 05 03 00\r
-T 8B 17 00 00 28 45\r
+T 99 1A 00 00\r
+R 00 00 01 00\r
+T 99 1A 00 00 21 05 06 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 08 00\r
+T 9F 1A 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 14 00\r
+T A6 1A 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 15 00 2B 0A 04 00\r
+T AC 1A 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T B2 1A 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 10 00\r
+T B7 1A 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 10 00 02 09 14 00\r
+T BD 1A 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 23 00\r
+T C2 1A 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T C7 1A 00 00\r
+R 00 00 01 00\r
+T C7 1A 00 00 11 04 00 3E 13 17 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T CD 1A 00 00 13 17 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T D4 1A 00 00 F8 DD 74 F9 01 1E 00 C5 01\r
+R 00 00 01 00\r
+T DD 1A 00 00 06 04 00 00 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 0A 11 00\r
+T E3 1A 00 00 00 00 00 00 CD 00 00 00 00 E1 2A\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T EA 1A 00 00 06 04 00 00 01 C6 31 A7 ED 42 28\r
+R 00 00 01 00 00 04 03 00\r
+T F3 1A 00 00 5E\r
 R 00 00 01 00\r
-T 8D 17 00 00\r
+T F4 1A 00 00\r
 R 00 00 01 00\r
-T 8D 17 00 00 21 06 04 00 00 4E 23 46 C5 2A\r
+T F4 1A 00 00 21 06 04 00 00 4E 23 46 C5 2A\r
 R 00 00 01 00 00 05 03 00\r
-T 95 17 00 00 04 04 00 00 E5 21 12 06 00 00 E5\r
+T FC 1A 00 00 04 04 00 00 E5 21 12 06 00 00 E5\r
 R 00 00 01 00 00 04 03 00 00 0A 02 00\r
-T 9C 17 00 00 CD 00 00 00 00 F1 F1 F1 CD\r
-R 00 00 01 00 02 05 08 00\r
-T A3 17 00 00 28 16 00 00 7D B4 20 06\r
-R 00 00 01 00 00 04 01 00\r
-T A9 17 00 00\r
-R 00 00 01 00\r
-T A9 17 00 00 11 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 08 21 00\r
-T AF 17 00 00\r
-R 00 00 01 00\r
-T AF 17 00 00 21 C6 31 22 06 04 00 00 21 1E 00\r
+T 03 1B 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 08 00 02 0A 08 00\r
+T 09 1B 00 00 00 00 00 00 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 0F 1B 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 14 1B 00 00 00 00 00 00 7D B4 20 0B\r
+R 00 00 01 00 02 04 14 00\r
+T 1A 1B 00 00\r
+R 00 00 01 00\r
+T 1A 1B 00 00 11 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 23 00\r
+T 20 1B 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T 25 1B 00 00\r
+R 00 00 01 00\r
+T 25 1B 00 00 21 C6 31 22 06 04 00 00 21 1E 00\r
 R 00 00 01 00 00 08 03 00\r
-T B8 17 00 00 E5 DD 4E F8 DD 46 F9 11\r
+T 2E 1B 00 00 E5 DD 4E F8 DD 46 F9 11\r
 R 00 00 01 00\r
-T C0 17 00 00 06 04 00 00 CD 00 00 00 00 E1 DD\r
-R 00 00 01 00 00 04 03 00 02 09 11 00\r
-T C7 17 00 00 4E F8 DD 46 F9 11 04 00 CD\r
+T 36 1B 00 00 06 04 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 11 00\r
+T 3B 1B 00 00 00 00 00 00 CD 00 00 00 00 E1 DD\r
+R 00 00 01 00 02 04 11 00 02 09 14 00\r
+T 42 1B 00 00 4E F8 DD 46 F9 11 04 00 3E\r
 R 00 00 01 00\r
-T D0 17 00 00 8B 14 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T D2 17 00 00\r
+T 4B 1B 00 00 52 17 00 00 21 52 17 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 50 1B 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 52 1B 00 00\r
 R 00 00 01 00\r
-T D2 17 00 00 2A 08 04 00 00 01 FB FF 09 E5 21\r
+T 52 1B 00 00 2A 08 04 00 00 01 FB FF 09 E5 21\r
 R 00 00 01 00 00 05 03 00\r
-T DB 17 00 00 0A 04 00 00 4E 23 46 C5 21\r
+T 5B 1B 00 00 0A 04 00 00 4E 23 46 C5 21\r
 R 00 00 01 00 00 04 03 00\r
-T E2 17 00 00 0C 04 00 00 4E 23 46 C5 21\r
+T 62 1B 00 00 0C 04 00 00 4E 23 46 C5 21\r
 R 00 00 01 00 00 04 03 00\r
-T E9 17 00 00 02 00 00 00 E5 21 3F 06 00 00 E5\r
+T 69 1B 00 00 02 00 00 00 E5 21 3F 06 00 00 E5\r
 R 00 00 01 00 00 04 03 00 00 0A 02 00\r
-T F0 17 00 00 CD 00 00 00 00 F1 F1 F1 F1 F1 CD\r
-R 00 00 01 00 02 05 08 00\r
-T F9 17 00 00 28 16 00 00 7D B4 20 06\r
-R 00 00 01 00 00 04 01 00\r
-T FF 17 00 00\r
-R 00 00 01 00\r
-T FF 17 00 00 11 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 08 21 00\r
-T 05 18 00 00\r
-R 00 00 01 00\r
-T 05 18 00 00 ED 4B 16 04 00 00 2A 18 04 00 00\r
+T 70 1B 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 08 00 02 0A 08 00\r
+T 76 1B 00 00 00 00 00 00 F1 F1 F1 F1 F1 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 7E 1B 00 00 44 19 00 00 21 44 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 83 1B 00 00 00 00 00 00 7D B4 20 0B\r
+R 00 00 01 00 02 04 14 00\r
+T 89 1B 00 00\r
+R 00 00 01 00\r
+T 89 1B 00 00 11 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 23 00\r
+T 8F 1B 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T 94 1B 00 00\r
+R 00 00 01 00\r
+T 94 1B 00 00 ED 4B 16 04 00 00 2A 18 04 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 0C 18 00 00 A7 ED 42 EB CD 00 00 00 00 22\r
-R 00 00 01 00 02 09 1F 00\r
-T 14 18 00 00 34 04 00 00 7D B4 20 0A\r
+T 9B 1B 00 00 A7 ED 42 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 21 00\r
+T A2 1B 00 00 00 00 00 00 CD 00 00 00 00 22\r
+R 00 00 01 00 02 04 21 00 02 09 14 00\r
+T A8 1B 00 00 34 04 00 00 7D B4 20 0B\r
 R 00 00 01 00 00 04 03 00\r
-T 1A 18 00 00\r
+T AE 1B 00 00\r
 R 00 00 01 00\r
-T 1A 18 00 00 DD 36 FA 79 06 00 00 DD 36 FB\r
+T AE 1B 00 00 DD 36 FA 79 06 00 00 DD 36 FB\r
 R 00 00 01 00 09 07 02 00\r
-T 21 18 00 00 79 06 00 00 18 6D\r
-R 00 00 01 00 89 04 02 00\r
-T 24 18 00 00\r
+T B5 1B 00 00 79 06 00 00 C3 3A 1C 00 00\r
+R 00 00 01 00 89 04 02 00 00 09 01 00\r
+T B9 1B 00 00\r
 R 00 00 01 00\r
-T 24 18 00 00 ED 4B 16 04 00 00 2A 18 04 00 00\r
+T B9 1B 00 00 ED 4B 16 04 00 00 2A 18 04 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 2B 18 00 00 A7 ED 42 E5 0E 00 ED 5B\r
+T C0 1B 00 00 A7 ED 42 E5 0E 00 ED 5B\r
 R 00 00 01 00\r
-T 33 18 00 00 34 04 00 00 CD 00 00 00 00 E1 ED\r
-R 00 00 01 00 00 04 03 00 02 09 05 00\r
-T 3A 18 00 00 4B 18 04 00 00 2A 1A 04 00 00 A7\r
+T C8 1B 00 00 34 04 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 05 00\r
+T CD 1B 00 00 00 00 00 00 CD 00 00 00 00 E1 ED\r
+R 00 00 01 00 02 04 05 00 02 09 14 00\r
+T D4 1B 00 00 4B 18 04 00 00 2A 1A 04 00 00 A7\r
 R 00 00 01 00 00 05 03 00 00 0A 03 00\r
-T 41 18 00 00 ED 42 EB CD 00 00 00 00 22\r
-R 00 00 01 00 02 08 1F 00\r
-T 48 18 00 00 36 04 00 00 7D B4 20 0A\r
+T DB 1B 00 00 ED 42 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 21 00\r
+T E1 1B 00 00 00 00 00 00 CD 00 00 00 00 22\r
+R 00 00 01 00 02 04 21 00 02 09 14 00\r
+T E7 1B 00 00 36 04 00 00 7D B4 20 0A\r
 R 00 00 01 00 00 04 03 00\r
-T 4E 18 00 00\r
+T ED 1B 00 00\r
 R 00 00 01 00\r
-T 4E 18 00 00 DD 36 FA 86 06 00 00 DD 36 FB\r
+T ED 1B 00 00 DD 36 FA 86 06 00 00 DD 36 FB\r
 R 00 00 01 00 09 07 02 00\r
-T 55 18 00 00 86 06 00 00 18 39\r
+T F4 1B 00 00 86 06 00 00 18 43\r
 R 00 00 01 00 89 04 02 00\r
-T 58 18 00 00\r
+T F7 1B 00 00\r
 R 00 00 01 00\r
-T 58 18 00 00 ED 4B 18 04 00 00 2A 1A 04 00 00\r
+T F7 1B 00 00 ED 4B 18 04 00 00 2A 1A 04 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 5F 18 00 00 A7 ED 42 E5 0E 00 ED 5B\r
+T FE 1B 00 00 A7 ED 42 E5 0E 00 ED 5B\r
 R 00 00 01 00\r
-T 67 18 00 00 36 04 00 00 CD 00 00 00 00 E1 2A\r
-R 00 00 01 00 00 04 03 00 02 09 05 00\r
-T 6E 18 00 00 0A 04 00 00 29 29 29 22\r
+T 06 1C 00 00 36 04 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 05 00\r
+T 0B 1C 00 00 00 00 00 00 CD 00 00 00 00 E1 2A\r
+R 00 00 01 00 02 04 05 00 02 09 14 00\r
+T 12 1C 00 00 0A 04 00 00 29 29 29 22\r
 R 00 00 01 00 00 04 03 00\r
-T 74 18 00 00 24 04 00 00 ED 4B 08 04 00 00 ED\r
+T 18 1C 00 00 24 04 00 00 ED 4B 08 04 00 00 ED\r
 R 00 00 01 00 00 04 03 00 00 0A 03 00\r
-T 7B 18 00 00 43 26 04 00 00 EB CD 00 00 00 00\r
-R 00 00 01 00 00 05 03 00 02 0B 1F 00\r
-T 82 18 00 00 22 38 04 00 00 7D B4 20 23\r
-R 00 00 01 00 00 05 03 00\r
-T 89 18 00 00\r
+T 1F 1C 00 00 43 26 04 00 00 EB 3E 00 00 00 00\r
+R 00 00 01 00 00 05 03 00 2B 0B 21 00\r
+T 25 1C 00 00 21 00 00 00 00 CD 00 00 00 00 22\r
+R 00 00 01 00 02 05 21 00 02 0A 14 00\r
+T 2C 1C 00 00 38 04 00 00 7D B4 20 2D\r
+R 00 00 01 00 00 04 03 00\r
+T 32 1C 00 00\r
 R 00 00 01 00\r
-T 89 18 00 00 DD 36 FA 93 06 00 00 DD 36 FB\r
+T 32 1C 00 00 DD 36 FA 93 06 00 00 DD 36 FB\r
 R 00 00 01 00 09 07 02 00\r
-T 90 18 00 00 93 06 00 00\r
+T 39 1C 00 00 93 06 00 00\r
 R 00 00 01 00 89 04 02 00\r
-T 91 18 00 00\r
-R 00 00 01 00\r
-T 91 18 00 00 DD 6E FA DD 66 FB E5 21\r
-R 00 00 01 00\r
-T 99 18 00 00 9F 06 00 00 E5 21 00 00 00 00 E5\r
-R 00 00 01 00 00 04 02 00 02 0A 09 00\r
-T A0 18 00 00 CD 00 00 00 00 F1 F1 F1 11 01 00\r
-R 00 00 01 00 02 05 20 00\r
-T A9 18 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 21 00\r
-T AC 18 00 00\r
-R 00 00 01 00\r
-T AC 18 00 00 2A 24 04 00 00 E5 0E 00 ED 5B\r
+T 3A 1C 00 00\r
+R 00 00 01 00\r
+T 3A 1C 00 00 DD 6E FA DD 66 FB E5 21\r
+R 00 00 01 00\r
+T 42 1C 00 00 9F 06 00 00 E5 21 00 00 00 00 E5\r
+R 00 00 01 00 00 04 02 00 02 0A 0A 00\r
+T 49 1C 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 22 00 02 0A 22 00\r
+T 4F 1C 00 00 00 00 00 00 F1 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 58 1C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 23 00 02 09 23 00\r
+T 5D 1C 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 14 00\r
+T 5F 1C 00 00\r
+R 00 00 01 00\r
+T 5F 1C 00 00 2A 24 04 00 00 E5 0E 00 ED 5B\r
 R 00 00 01 00 00 05 03 00\r
-T B4 18 00 00 38 04 00 00 CD 00 00 00 00 E1 21\r
-R 00 00 01 00 00 04 03 00 02 09 05 00\r
-T BB 18 00 00 BA 06 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T C2 18 00 00 11 00 00 00 00 CD 00 00 00 00 CD\r
-R 00 00 01 00 02 05 14 00 02 0A 04 00\r
-T C9 18 00 00 E6 00 00 00 21 D5 06 00 00 E5 CD\r
-R 00 00 01 00 00 04 01 00 00 09 02 00\r
-T D0 18 00 00 00 00 00 00 F1 11 00 00 00 00 CD\r
-R 00 00 01 00 02 04 08 00 02 0A 14 00\r
-T D7 18 00 00 00 00 00 00 CD 56 05 00 00 21\r
-R 00 00 01 00 02 04 04 00 00 09 01 00\r
-T DD 18 00 00 F7 06 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T E4 18 00 00 11 00 00 00 00 CD 00 00 00 00 CD\r
-R 00 00 01 00 02 05 14 00 02 0A 04 00\r
-T EB 18 00 00 D0 07 00 00 21 1B 07 00 00 E5 CD\r
-R 00 00 01 00 00 04 01 00 00 09 02 00\r
-T F2 18 00 00 00 00 00 00 F1 11 00 00 00 00 CD\r
-R 00 00 01 00 02 04 08 00 02 0A 14 00\r
-T F9 18 00 00 00 00 00 00 CD AD 0E 00 00 21\r
-R 00 00 01 00 02 04 04 00 00 09 01 00\r
-T FF 18 00 00 40 07 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 08 00\r
-T 06 19 00 00 11 00 00 00 00 CD 00 00 00 00 CD\r
-R 00 00 01 00 02 05 14 00 02 0A 04 00\r
-T 0D 19 00 00 9C 0F 00 00 ED 5B 00 00 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 0A 03 00\r
-T 14 19 00 00 00 00 00 00 21 5F 07 00 00 E5 CD\r
-R 00 00 01 00 02 04 0B 00 00 09 02 00\r
-T 1B 19 00 00 00 00 00 00 F1 11 00 00 CD\r
-R 00 00 01 00 02 04 08 00\r
-T 22 19 00 00 00 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 04 21 00 02 09 0F 00\r
-T 27 19 00 00\r
-R 00 00 01 00\r
-T 27 19 00 00 CD 00 00 00 00 FA FF DD 6E 08 DD\r
-R 00 00 01 00 02 05 18 00\r
-T 30 19 00 00 66 09 DD 75 FC DD 74 FD\r
-R 00 00 01 00\r
-T 38 19 00 00\r
-R 00 00 01 00\r
-T 38 19 00 00 DD 6E 0E DD 66 0F E5 DD 6E 0C DD\r
-R 00 00 01 00\r
-T 43 19 00 00 66 0D E5 DD 6E FC DD 66 FD 01\r
-R 00 00 01 00\r
-T 4D 19 00 00 00 00 CD 00 00 00 00 D2\r
-R 00 00 01 00 02 07 17 00\r
-T 53 19 00 00 06 1A 00 00\r
+T 67 1C 00 00 38 04 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 05 00\r
+T 6C 1C 00 00 00 00 00 00 CD 00 00 00 00 E1 21\r
+R 00 00 01 00 02 04 05 00 02 09 14 00\r
+T 73 1C 00 00 BA 06 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T 79 1C 00 00 00 00 00 00 CD 00 00 00 00 F1 11\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 80 1C 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 15 00 2B 09 04 00\r
+T 85 1C 00 00 00 00 00 00 CD 00 00 00 00 3E\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 8B 1C 00 00 4A 01 00 00 21 4A 01 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 90 1C 00 00 00 00 00 00 21 D5 06 00 00 E5 3E\r
+R 00 00 01 00 02 04 14 00 00 09 02 00\r
+T 97 1C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T 9C 1C 00 00 00 00 00 00 F1 11 00 00 00 00 3E\r
+R 00 00 01 00 02 04 14 00 02 0A 15 00\r
+T A3 1C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 04 00 02 09 04 00\r
+T A8 1C 00 00 00 00 00 00 3E 29 06 00 00 21\r
+R 00 00 01 00 02 04 14 00 29 09 01 00\r
+T AD 1C 00 00 29 06 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T B3 1C 00 00 F7 06 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T B9 1C 00 00 00 00 00 00 CD 00 00 00 00 F1 11\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T C0 1C 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 15 00 2B 09 04 00\r
+T C5 1C 00 00 00 00 00 00 CD 00 00 00 00 3E\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T CB 1C 00 00 D0 08 00 00 21 D0 08 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T D0 1C 00 00 00 00 00 00 21 1B 07 00 00 E5 3E\r
+R 00 00 01 00 02 04 14 00 00 09 02 00\r
+T D7 1C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T DC 1C 00 00 00 00 00 00 F1 11 00 00 00 00 3E\r
+R 00 00 01 00 02 04 14 00 02 0A 15 00\r
+T E3 1C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 04 00 02 09 04 00\r
+T E8 1C 00 00 00 00 00 00 3E 98 10 00 00 21\r
+R 00 00 01 00 02 04 14 00 29 09 01 00\r
+T ED 1C 00 00 98 10 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T F3 1C 00 00 40 07 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 08 00\r
+T F9 1C 00 00 00 00 00 00 CD 00 00 00 00 F1 11\r
+R 00 00 01 00 02 04 08 00 02 09 14 00\r
+T 00 1D 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 15 00 2B 09 04 00\r
+T 05 1D 00 00 00 00 00 00 CD 00 00 00 00 3E\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 0B 1D 00 00 B2 11 00 00 21 B2 11 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 10 1D 00 00 00 00 00 00 ED 5B 00 00 00 00 3E\r
+R 00 00 01 00 02 04 14 00 00 0A 03 00\r
+T 17 1D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0C 00 02 09 0C 00\r
+T 1C 1D 00 00 00 00 00 00 21 5F 07 00 00 E5 3E\r
+R 00 00 01 00 02 04 14 00 00 09 02 00\r
+T 23 1D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T 28 1D 00 00 00 00 00 00 F1 11 00 00 3E\r
+R 00 00 01 00 02 04 14 00\r
+T 2F 1D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 23 00 02 09 23 00\r
+T 34 1D 00 00 00 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 04 14 00 02 09 09 00\r
+T 39 1D 00 00\r
+R 00 00 01 00\r
+T 39 1D 00 00 CD 00 00 00 00 FA FF DD 6E 0A DD\r
+R 00 00 01 00 02 05 19 00\r
+T 42 1D 00 00 66 0B DD 75 FC DD 74 FD\r
+R 00 00 01 00\r
+T 4A 1D 00 00\r
+R 00 00 01 00\r
+T 4A 1D 00 00 DD 6E 10 DD 66 11 E5 DD 6E 0E DD\r
+R 00 00 01 00\r
+T 55 1D 00 00 66 0F E5 DD 6E FC DD 66 FD 01\r
+R 00 00 01 00\r
+T 5F 1D 00 00 00 00 CD 00 00 00 00 D2\r
+R 00 00 01 00 02 07 18 00\r
+T 65 1D 00 00 2C 1E 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 55 19 00 00\r
+T 67 1D 00 00\r
 R 00 00 01 00\r
-T 55 19 00 00 DD 4E 0C DD 46 0D DD 6E FC DD 66\r
+T 67 1D 00 00 DD 4E 0E DD 46 0F DD 6E FC DD 66\r
 R 00 00 01 00\r
-T 60 19 00 00 FD 3E 02 84 67 7D E6 00 5F 7C E6\r
+T 72 1D 00 00 FD 3E 02 84 67 7D E6 00 5F 7C E6\r
 R 00 00 01 00\r
-T 6B 19 00 00 FE 57 CD 00 00 00 00 DD 75 FE DD\r
-R 00 00 01 00 02 07 1A 00\r
-T 74 19 00 00 74 FF DD 4E FC DD 46 FD A7 ED 42\r
+T 7D 1D 00 00 FE 57 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 1B 00\r
+T 82 1D 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 1B 00 02 09 14 00\r
+T 89 1D 00 00 FE DD 74 FF DD 4E FC DD 46 FD A7\r
 R 00 00 01 00\r
-T 7F 19 00 00 01 00 02 A7 ED 42 30 16\r
+T 94 1D 00 00 ED 42 01 00 02 A7 ED 42 30 1B\r
 R 00 00 01 00\r
-T 87 19 00 00\r
+T 9E 1D 00 00\r
 R 00 00 01 00\r
-T 87 19 00 00 06 09 DD 5E FC DD 56 FD CD\r
+T 9E 1D 00 00 06 09 DD 5E FC DD 56 FD CD\r
 R 00 00 01 00\r
-T 90 19 00 00 00 00 00 00 CD 5B 14 00 00 DD 75\r
-R 00 00 01 00 02 04 00 00 00 09 01 00\r
-T 97 19 00 00 FA DD 74 FB 18 08\r
+T A7 1D 00 00 00 00 00 00 3E 13 17 00 00 21\r
+R 00 00 01 00 02 04 00 00 29 09 01 00\r
+T AC 1D 00 00 13 17 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 14 00\r
+T B3 1D 00 00 FA DD 74 FB 18 08\r
 R 00 00 01 00\r
-T 9D 19 00 00\r
+T B9 1D 00 00\r
 R 00 00 01 00\r
-T 9D 19 00 00 DD 36 FA 02 02 00 00 DD 36 FB\r
+T B9 1D 00 00 DD 36 FA 02 02 00 00 DD 36 FB\r
 R 00 00 01 00 09 07 03 00\r
-T A4 19 00 00 02 02 00 00\r
+T C0 1D 00 00 02 02 00 00\r
 R 00 00 01 00 89 04 03 00\r
-T A5 19 00 00\r
+T C1 1D 00 00\r
 R 00 00 01 00\r
-T A5 19 00 00 DD 4E FC DD 46 FD DD 6E FE DD 66\r
+T C1 1D 00 00 DD 4E FC DD 46 FD DD 6E FE DD 66\r
 R 00 00 01 00\r
-T B0 19 00 00 FF A7 ED 42 E5 79 E6 FF 6F 78 E6\r
+T CC 1D 00 00 FF A7 ED 42 E5 79 E6 FF 6F 78 E6\r
 R 00 00 01 00\r
-T BB 19 00 00 01 67 DD 5E FA DD 56 FB 19 4D 44\r
+T D7 1D 00 00 01 67 DD 5E FA DD 56 FB 19 4D 44\r
 R 00 00 01 00\r
-T C6 19 00 00 DD 5E 08 DD 56 09 DD 6E FC DD 66\r
+T E2 1D 00 00 DD 5E 0A DD 56 0B DD 6E FC DD 66\r
 R 00 00 01 00\r
-T D1 19 00 00 FD A7 ED 52 DD 5E 02 DD 56 03 19\r
+T ED 1D 00 00 FD A7 ED 52 DD 5E 02 DD 56 03 19\r
 R 00 00 01 00\r
-T DC 19 00 00 EB CD 00 00 00 00 E1 DD 4E FA DD\r
-R 00 00 01 00 02 06 11 00\r
-T E5 19 00 00 46 FB C5 06 09 DD 5E FC DD 56 FD\r
+T F8 1D 00 00 EB 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 11 00 02 0B 11 00\r
+T FE 1D 00 00 CD 00 00 00 00 E1 DD 4E FA DD 46\r
+R 00 00 01 00 02 05 14 00\r
+T 07 1E 00 00 FB C5 06 09 DD 5E FC DD 56 FD CD\r
 R 00 00 01 00\r
-T F0 19 00 00 CD 00 00 00 00 C1 CD 8B 14 00 00\r
-R 00 00 01 00 02 05 00 00 00 0B 01 00\r
-T F7 19 00 00 DD 6E FE DD 66 FF DD 75 FC DD 74\r
+T 12 1E 00 00 00 00 00 00 3E 52 17 00 00 21\r
+R 00 00 01 00 02 04 00 00 29 09 01 00\r
+T 17 1E 00 00 52 17 00 00 C1 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 04 01 00 02 0A 14 00\r
+T 1E 1E 00 00 6E FE DD 66 FF DD 75 FC DD 74 FD\r
 R 00 00 01 00\r
-T 02 1A 00 00 FD C3 38 19 00 00\r
-R 00 00 01 00 00 06 01 00\r
-T 06 1A 00 00\r
+T 29 1E 00 00 C3 4A 1D 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 2C 1E 00 00\r
 R 00 00 01 00\r
-T 06 1A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 09 1A 00 00\r
+T 2C 1E 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 2F 1E 00 00\r
 R 00 00 01 00\r
-T 09 1A 00 00 CD 00 00 00 00 F4 FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 18 00\r
-T 12 1A 00 00 66 03 DD 75 FA DD 74 FB\r
+T 2F 1E 00 00 CD 00 00 00 00 F4 FF DD 6E 02 DD\r
+R 00 00 01 00 02 05 19 00\r
+T 38 1E 00 00 66 03 DD 75 FA DD 74 FB\r
 R 00 00 01 00\r
-T 1A 1A 00 00\r
+T 40 1E 00 00\r
 R 00 00 01 00\r
-T 1A 1A 00 00 DD 4E 04 DD 46 05 DD 6E FA DD 66\r
+T 40 1E 00 00 DD 4E 04 DD 46 05 DD 6E FA DD 66\r
 R 00 00 01 00\r
-T 25 1A 00 00 FB A7 ED 42 D2 46 1B 00 00\r
+T 4B 1E 00 00 FB A7 ED 42 D2 7B 1F 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T 2C 1A 00 00\r
+T 52 1E 00 00\r
 R 00 00 01 00\r
-T 2C 1A 00 00 DD 4E 04 DD 46 05 DD 6E FA DD 66\r
+T 52 1E 00 00 DD 4E 04 DD 46 05 DD 6E FA DD 66\r
 R 00 00 01 00\r
-T 37 1A 00 00 FB 3E 02 84 67 7D E6 00 5F 7C E6\r
+T 5D 1E 00 00 FB 3E 02 84 67 7D E6 00 5F 7C E6\r
 R 00 00 01 00\r
-T 42 1A 00 00 FE 57 CD 00 00 00 00 DD 75 FC DD\r
-R 00 00 01 00 02 07 1A 00\r
-T 4B 1A 00 00 74 FD 06 09 DD 5E FA DD 56 FB CD\r
+T 68 1E 00 00 FE 57 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 1B 00\r
+T 6D 1E 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 1B 00 02 09 14 00\r
+T 74 1E 00 00 FC DD 74 FD 06 09 DD 5E FA DD 56\r
 R 00 00 01 00\r
-T 56 1A 00 00 00 00 00 00 CD 5B 14 00 00 DD 75\r
-R 00 00 01 00 02 04 00 00 00 09 01 00\r
-T 5D 1A 00 00 F4 DD 74 F5 DD 7E FA E6 FF 4F DD\r
+T 7F 1E 00 00 FB CD 00 00 00 00 3E 13 17 00 00\r
+R 00 00 01 00 02 06 00 00 29 0B 01 00\r
+T 85 1E 00 00 21 13 17 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 14 00\r
+T 8C 1E 00 00 75 F4 DD 74 F5 DD 7E FA E6 FF 4F\r
 R 00 00 01 00\r
-T 68 1A 00 00 7E FB E6 01 47 09 DD 75 F6 DD 74\r
+T 97 1E 00 00 DD 7E FB E6 01 47 09 DD 75 F6 DD\r
 R 00 00 01 00\r
-T 73 1A 00 00 F7 DD 6E FA DD 66 FB DD 75 F8 DD\r
+T A2 1E 00 00 74 F7 DD 6E FA DD 66 FB DD 75 F8\r
 R 00 00 01 00\r
-T 7E 1A 00 00 74 F9\r
+T AD 1E 00 00 DD 74 F9\r
 R 00 00 01 00\r
-T 80 1A 00 00\r
+T B0 1E 00 00\r
 R 00 00 01 00\r
-T 80 1A 00 00 DD 4E FC DD 46 FD DD 6E F8 DD 66\r
+T B0 1E 00 00 DD 4E FC DD 46 FD DD 6E F8 DD 66\r
 R 00 00 01 00\r
-T 8B 1A 00 00 F9 A7 ED 42 D2 37 1B 00 00\r
+T BB 1E 00 00 F9 A7 ED 42 D2 6C 1F 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T 92 1A 00 00\r
+T C2 1E 00 00\r
 R 00 00 01 00\r
-T 92 1A 00 00 DD 6E F6 DD 66 F7 46 04 CA\r
+T C2 1E 00 00 DD 6E F6 DD 66 F7 46 04 CA\r
 R 00 00 01 00\r
-T 9B 1A 00 00 24 1B 00 00\r
+T CB 1E 00 00 59 1F 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 9D 1A 00 00\r
+T CD 1E 00 00\r
 R 00 00 01 00\r
-T 9D 1A 00 00 DD 4E 02 DD 46 03 DD 6E F8 DD 66\r
+T CD 1E 00 00 DD 4E 02 DD 46 03 DD 6E F8 DD 66\r
 R 00 00 01 00\r
-T A8 1A 00 00 F9 A7 ED 42 29 29 29 DD 75 FE DD\r
+T D8 1E 00 00 F9 A7 ED 42 29 29 29 DD 75 FE DD\r
 R 00 00 01 00\r
-T B3 1A 00 00 74 FF AF DD 77 F8 DD 77 F9\r
+T E3 1E 00 00 74 FF AF DD 77 F8 DD 77 F9\r
 R 00 00 01 00\r
-T BC 1A 00 00\r
+T EC 1E 00 00\r
 R 00 00 01 00\r
-T BC 1A 00 00 01 07 00 DD 6E F8 DD 66 F9 A7 ED\r
+T EC 1E 00 00 01 07 00 DD 6E F8 DD 66 F9 A7 ED\r
 R 00 00 01 00\r
-T C7 1A 00 00 42 30 1D\r
+T F7 1E 00 00 42 30 1D\r
 R 00 00 01 00\r
-T CA 1A 00 00\r
+T FA 1E 00 00\r
 R 00 00 01 00\r
-T CA 1A 00 00 DD 6E F6 DD 66 F7 DD 46 F8 3E 01\r
+T FA 1E 00 00 DD 6E F6 DD 66 F7 DD 46 F8 3E 01\r
 R 00 00 01 00\r
-T D5 1A 00 00 CD 00 00 00 00 A6 20 02\r
-R 00 00 01 00 02 05 1D 00\r
-T DB 1A 00 00\r
+T 05 1F 00 00 CD 00 00 00 00 A6 20 02\r
+R 00 00 01 00 02 05 1E 00\r
+T 0B 1F 00 00\r
 R 00 00 01 00\r
-T DB 1A 00 00 18 0A\r
+T 0B 1F 00 00 18 0A\r
 R 00 00 01 00\r
-T DD 1A 00 00\r
+T 0D 1F 00 00\r
 R 00 00 01 00\r
-T DD 1A 00 00 DD 34 F8 20 03 DD 34 F9\r
+T 0D 1F 00 00 DD 34 F8 20 03 DD 34 F9\r
 R 00 00 01 00\r
-T E5 1A 00 00\r
+T 15 1F 00 00\r
 R 00 00 01 00\r
-T E5 1A 00 00 18 D5\r
+T 15 1F 00 00 18 D5\r
 R 00 00 01 00\r
-T E7 1A 00 00\r
+T 17 1F 00 00\r
 R 00 00 01 00\r
-T E7 1A 00 00 21 0A 00 39 7E DD 86 F8 77 23 7E\r
+T 17 1F 00 00 21 0A 00 39 7E DD 86 F8 77 23 7E\r
 R 00 00 01 00\r
-T F2 1A 00 00 DD 8E F9 77 DD 6E F6 DD 66 F7 DD\r
+T 22 1F 00 00 DD 8E F9 77 DD 6E F6 DD 66 F7 DD\r
 R 00 00 01 00\r
-T FD 1A 00 00 46 F8 3E 01 CD 00 00 00 00 B6 77\r
-R 00 00 01 00 02 09 1D 00\r
-T 06 1B 00 00 DD 4E F4 DD 46 F5 C5 06 09 DD 5E\r
+T 2D 1F 00 00 46 F8 3E 01 CD 00 00 00 00 B6 77\r
+R 00 00 01 00 02 09 1E 00\r
+T 36 1F 00 00 DD 4E F4 DD 46 F5 C5 06 09 DD 5E\r
 R 00 00 01 00\r
-T 11 1B 00 00 FA DD 56 FB CD 00 00 00 00 C1 CD\r
+T 41 1F 00 00 FA DD 56 FB CD 00 00 00 00 3E\r
 R 00 00 01 00 02 09 00 00\r
-T 1A 1B 00 00 8B 14 00 00 DD 6E FE DD 66 FF 18\r
-R 00 00 01 00 00 04 01 00\r
-T 23 1B 00 00 25\r
+T 49 1F 00 00 52 17 00 00 21 52 17 00 00 C1 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 4F 1F 00 00 00 00 00 00 DD 6E FE DD 66 FF 18\r
+R 00 00 01 00 02 04 14 00\r
+T 58 1F 00 00 25\r
 R 00 00 01 00\r
-T 24 1B 00 00\r
+T 59 1F 00 00\r
 R 00 00 01 00\r
-T 24 1B 00 00 DD 34 F6 20 03 DD 34 F7\r
+T 59 1F 00 00 DD 34 F6 20 03 DD 34 F7\r
 R 00 00 01 00\r
-T 2C 1B 00 00\r
+T 61 1F 00 00\r
 R 00 00 01 00\r
-T 2C 1B 00 00 DD 34 F8 20 03 DD 34 F9\r
+T 61 1F 00 00 DD 34 F8 20 03 DD 34 F9\r
 R 00 00 01 00\r
-T 34 1B 00 00\r
+T 69 1F 00 00\r
 R 00 00 01 00\r
-T 34 1B 00 00 C3 80 1A 00 00\r
+T 69 1F 00 00 C3 B0 1E 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 37 1B 00 00\r
+T 6C 1F 00 00\r
 R 00 00 01 00\r
-T 37 1B 00 00 DD 6E FC DD 66 FD DD 75 FA DD 74\r
+T 6C 1F 00 00 DD 6E FC DD 66 FD DD 75 FA DD 74\r
 R 00 00 01 00\r
-T 42 1B 00 00 FB C3 1A 1A 00 00\r
+T 77 1F 00 00 FB C3 40 1E 00 00\r
 R 00 00 01 00 00 06 01 00\r
-T 46 1B 00 00\r
+T 7B 1F 00 00\r
 R 00 00 01 00\r
-T 46 1B 00 00 21 FF FF\r
+T 7B 1F 00 00 21 FF FF\r
 R 00 00 01 00\r
-T 49 1B 00 00\r
+T 7E 1F 00 00\r
 R 00 00 01 00\r
-T 49 1B 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 4C 1B 00 00\r
+T 7E 1F 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 09 00\r
+T 81 1F 00 00\r
 R 00 00 01 00\r
-T 4C 1B 00 00 CD 00 00 00 00 D5 21 67 07 00 00\r
+T 81 1F 00 00 CD 00 00 00 00 D5 21 67 07 00 00\r
 R 00 00 01 00 02 05 13 00 00 0B 02 00\r
-T 53 1B 00 00 E5 CD 00 00 00 00 F1 F1 11\r
-R 00 00 01 00 02 06 08 00\r
-T 5A 1B 00 00 00 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 02 04 14 00 02 09 04 00\r
-T 60 1B 00 00 01 00 CD 00 00 00 00 C3\r
-R 00 00 01 00 02 07 21 00\r
-T 66 1B 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0F 00\r
+T 88 1F 00 00 E5 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 08 00 02 0B 08 00\r
+T 8E 1F 00 00 CD 00 00 00 00 F1 F1 11\r
+R 00 00 01 00 02 05 14 00\r
+T 94 1F 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 15 00 2B 09 04 00\r
+T 99 1F 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 04 00 02 09 14 00\r
+T 9F 1F 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 23 00\r
+T A4 1F 00 00 00 00 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 02 04 23 00 02 09 14 00\r
+T AA 1F 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 09 00\r
 T 00 00 00 00\r
 R 00 00 02 00\r
 T 00 00 00 00 63 61 6E 27 74 20 73 65 65 6B 3A\r
diff --git a/src/fsutil/m.bat b/src/fsutil/m.bat
deleted file mode 100644 (file)
index e476e5b..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-cl -Zi -I. -I..\kernel -DVAX -DUTIL -DDEBUG=1 -c utils.c\r
-@if errorlevel 1 goto failure\r
-cl -Zi -I. -I..\kernel -DVAX -DUTIL -DNATIVE -DDEBUG=1 -c mkfs.c\r
-@if errorlevel 1 goto failure\r
-link @mkfs.lnk\r
-@if errorlevel 1 goto failure\r
-\r
-@echo SUCCESS\r
-@goto done\r
-:failure\r
-@echo FAILURE\r
-:done\r
-\r
index 9c0b56b..22073d5 100644 (file)
@@ -197,10 +197,17 @@ int da_read(dev, blk, addr)
 \r
        if (read(device_handle, addr, BUFSIZE) != BUFSIZE)\r
                {\r
+ if (errno == 0)\r
+  {\r
+  bfill(addr, 0xaa, BUFSIZE); /* for creation of unpadded initrd images */\r
+  }\r
+ else\r
+  {\r
                printf("can't read: ");\r
                fflush(stdout);\r
                perror(device_name);\r
                exit(1);\r
+  }\r
                }\r
 #else\r
        bufptr buf = bread(dev, blk, 0);\r
index 6012306..34770dd 100644 (file)
Binary files a/src/fsutil/mkfs.exe and b/src/fsutil/mkfs.exe differ
index a7a9d4c..e48eab7 100644 (file)
@@ -1,12 +1,14 @@
 -k ..\..\lib\r
--l libcl.lib\r
--l libsysl.lib\r
+-l libcb.lib\r
+-l libsysb.lib\r
 -l libiar.lib\r
 -m\r
 -u\r
 -i\r
 -o mkfs\r
 -bl RCODE=0x8100\r
-..\..\lib\c0l.rel\r
+-bl CODE=0x4000,0x10000\r
+-bc CODE=0x4000\r
+..\..\lib\c0b.rel\r
 mkfs\r
-utils\r
+utils \r
index 0ce2377..6b65380 100644 (file)
@@ -6,18 +6,18 @@ Area                       Addr        Size        Decimal Bytes (Attributes)
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     00000000  s__DEFAUL |    00000000  l_CCSTR   |    00000000  l_ECSTR  \r
-     00000000  l_CONST   |    00000000  .__.ABS.  |    00000000  ?CL64180L\r
-     00000000  ?CL64180B |    00000014  e__DEFAUL |    00000014  l__DEFAUL\r
-     00000232  l_CSTR    |    000002D2  l_RCODE   |    00000AA2  l_UDATA0 \r
-     00000AD7  l_CDATA0  |    00000AD7  l_IDATA0  |    00001000  l_CSTACK \r
-     00002955  l_CODE    |    00008100  s_RCODE   |    000083D2  e_RCODE  \r
-     000083D2  s_CODE    |    0000AD27  s_CSTR    |    0000AD27  e_CODE   \r
-     0000AD27  e_CONST   |    0000AD27  s_CONST   |    0000AF59  e_CSTR   \r
-     0000AF59  s_IDATA0  |    0000AF59  s_CDATA0  |    0000BA30  s_UDATA0 \r
-     0000BA30  e_CCSTR   |    0000BA30  e_ECSTR   |    0000BA30  s_CCSTR  \r
-     0000BA30  e_CDATA0  |    0000BA30  s_ECSTR   |    0000BA30  e_IDATA0 \r
-     0000C4D2  e_UDATA0  |    0000C4D2  s_CSTACK  |    0000D4D2  e_CSTACK \r
+     00000000  s__DEFAUL |    00000000  l_CODE    |    00000000  l_CCSTR  \r
+     00000000  l_ECSTR   |    00000000  l_CONST   |    00000000  .__.ABS. \r
+     00000000  ?CL64180L |    00000000  ?CL64180B |    00000014  e__DEFAUL\r
+     00000014  l__DEFAUL |    00000232  l_CSTR    |    000002F7  l_RCODE  \r
+     00000AAD  l_UDATA0  |    00000AD7  l_CDATA0  |    00000AD7  l_IDATA0 \r
+     00001000  l_CSTACK  |    00004000  e_CODE    |    00004000  s_CODE   \r
+     00008100  s_RCODE   |    000083F7  s_CSTR    |    000083F7  e_RCODE  \r
+     000083F7  e_CONST   |    000083F7  s_CONST   |    00008629  e_CSTR   \r
+     00008629  s_IDATA0  |    00008629  s_CDATA0  |    00009100  s_UDATA0 \r
+     00009100  e_CCSTR   |    00009100  e_ECSTR   |    00009100  s_CCSTR  \r
+     00009100  e_CDATA0  |    00009100  s_ECSTR   |    00009100  e_IDATA0 \r
+     00009BAD  e_UDATA0  |    00009BAD  s_CSTACK  |    0000ABAD  e_CSTACK \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
@@ -30,54 +30,34 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-RCODE                  00008100    000002D2 =         722. bytes (REL,CON)\r
+RCODE                  00008100    000002F7 =         759. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     00008100  __init    |    00008115  ?US_RSH_L |    0000811F  ?C_V_SWIT\r
-     00008131  ?LEAVE_DI |    00008138  ?ENT_PARM |    00008144  ?L_AND_L0\r
-     00008162  ?SL_CMP_L |    00008193  ?ENT_AUTO |    000081A7  ?V_SWITCH\r
-     000081B1  ?SS_CMP_L |    000081C3  ?US_MOD_L |    000081CC  ?C_LSH_L0\r
-     000081D3  ?US_DIV_L |    000081E1  ?SL_RSH_L |    000081EF  ?L_LSH_L0\r
-     00008207  ?S_DIVMOD |    0000821D  ?LEAVE_32 |    00008225  ?S_MULASG\r
-     0000822F  ?S_MUL_L0 |    00008245  ?CALL_IND |    00008246  ?UL_DIVAS\r
-     00008256  ?UL_MOD_L |    0000827B  ?UL_DIV_L |    000082A3  ?L_NEG_L0\r
-     000082B5  ?L_DIVMOD |    0000830D  ?L_NOT_L0 |    0000831C  ?L_END_MU\r
-     00008325  ?L_MULASG |    00008335  ?L_MUL_L0 |    000083B9  ?L_ADDASG\r
+     00008100  __init    |    0000811F  ?US_RSH_L |    00008129  ?BANK_LEA\r
+     0000812F  ?BANK_FAS |    00008134  ?C_V_SWIT |    00008146  ?ENT_PARM\r
+     00008152  ?BANK_CAL |    0000815F  ?L_AND_L0 |    0000817D  ?SL_CMP_L\r
+     000081AE  ?ENT_AUTO |    000081C2  ?V_SWITCH |    000081CC  ?SS_CMP_L\r
+     000081DE  ?US_MOD_L |    000081E7  ?C_LSH_L0 |    000081EE  ?US_DIV_L\r
+     000081FC  ?SL_RSH_L |    0000820A  ?BANK_LEA |    00008216  ?L_LSH_L0\r
+     0000822E  ?S_DIVMOD |    00008244  ?S_MULASG |    0000824E  ?S_MUL_L0\r
+     00008264  ?LEAVE_DI |    0000826B  ?UL_DIVAS |    0000827B  ?UL_MOD_L\r
+     000082A0  ?UL_DIV_L |    000082C8  ?L_NEG_L0 |    000082DA  ?L_DIVMOD\r
+     00008332  ?L_NOT_L0 |    00008341  ?L_END_MU |    0000834A  ?L_MULASG\r
+     0000835A  ?L_MUL_L0 |    000083DE  ?L_ADDASG\r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CODE                   000083D2    00002955 =       10581. bytes (REL,CON)\r
+CONST                  000083F7    00000000 =           0. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     000083D2  daread    |    00008402  dwrite    |    0000842C  da_read  \r
-     0000849F  da_write  |    00008512  yes       |    00008568  mkfs     \r
-     00008A11  doformatt |    00008A73  main      |    00008F42  bitmap_du\r
-     00009024  bzero     |    0000904E  bfill     |    0000907A  bcopy    \r
-     000090B2  int_min   |    000090D3  int_max   |    000090E9  fflush   \r
-     000092DE  _write    |    000092F8  printf    |    00009322  lseek    \r
-     0000934A  __stdio_c |    000093A1  __stdio_i |    000093CF  close    \r
-     000093DF  abort     |    00009423  _exit     |    00009433  fgets    \r
-     00009518  perror    |    00009550  pause     |    00009559  isatty   \r
-     0000958F  fstat     |    000095A1  strcpy    |    000095BE  kill     \r
-     000095D0  atoi      |    00009752  vfprintf  |    00009C85  ltoa     \r
-     00009CE3  __longtoa |    00009E77  itoa      |    00009EDB  fputs    \r
-     00009F34  open      |    00009F5A  malloc    |    0000A17C  fprintf  \r
-     0000A1A9  exit      |    0000A1CE  _read     |    0000A1E8  getpid   \r
-     0000A1F6  signal    |    0000A216  strerror  |    0000A3A5  unix     \r
-     0000A3BD  fgetc     |    0000A4C3  memcpy    |    0000A57C  on_exit  \r
-     0000A5DE  atexit    |    0000A5EA  strcat    |    0000A600  unix_long\r
-     0000A618  strchr    |    0000A653  strlen    |    0000A68A  free     \r
-     0000A76A  fputc     |    0000A868  ultoa     |    0000A8B8  strtol   \r
-     0000A95B  sbrk      |    0000A96B  fread     |    0000AB86  strtoul  \r
-     0000ACDD  toupper   |    0000AD02  tolower  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CONST                  0000AD27    00000000 =           0. bytes (REL,CON)\r
+CSTR                   000083F7    00000232 =         562. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -85,28 +65,28 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CSTR                   0000AD27    00000232 =         562. bytes (REL,CON)\r
+IDATA0                 00008629    00000AD7 =        2775. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
+     00008629  bootblock |    00008DA9  dirbuf    |    00008FA9  _fmt     \r
+     00008FAA  _yes      |    00008FAB  _quick    |    00008FAC  _verb    \r
+     00008FAD  _immov    |    00008FAE  __IO_list |    00008FB0  stdin    \r
+     00008FC8  stdout    |    00008FE0  stderr    |    00008FFA  __sys_err\r
+     00008FFC  __sys_ner |    00008FFE  __on_exit |    00009000  __ctype  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-IDATA0                 0000AF59    00000AD7 =        2775. bytes (NUL,CON)\r
+CDATA0                 00008629    00000AD7 =        2775. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     0000AF59  bootblock |    0000B6D9  dirbuf    |    0000B8D9  _fmt     \r
-     0000B8DA  _yes      |    0000B8DB  _quick    |    0000B8DC  _verb    \r
-     0000B8DD  _immov    |    0000B8DE  __IO_list |    0000B8E0  stdin    \r
-     0000B8F8  stdout    |    0000B910  stderr    |    0000B92A  __sys_err\r
-     0000B92C  __sys_ner |    0000B92E  __on_exit |    0000B930  __ctype  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CDATA0                 0000AF59    00000AD7 =        2775. bytes (REL,CON)\r
+ECSTR                  00009100    00000000 =           0. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -114,7 +94,7 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-ECSTR                  0000BA30    00000000 =           0. bytes (NUL,CON)\r
+CCSTR                  00009100    00000000 =           0. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -122,114 +102,136 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CCSTR                  0000BA30    00000000 =           0. bytes (REL,CON)\r
+CODE                   00004000    00000000 =           0. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
+     00005014  daread    |    00005053  dwrite    |    0000508C  da_read  \r
+     0000514F  da_write  |    000051F4  yes       |    0000525E  mkfs     \r
+     00005785  doformatt |    000057FB  main      |    00005D71  bitmap_du\r
+     00005E67  bzero     |    00005E91  bfill     |    00005EBD  bcopy    \r
+     00005EF5  int_min   |    00005F16  int_max   |    00005F2C  fflush   \r
+     0000613F  _write    |    0000615E  printf    |    0000618D  lseek    \r
+     000061BA  __stdio_c |    00006225  __stdio_i |    00006263  close    \r
+     00006278  abort     |    000062E6  _exit     |    000062FB  fgets    \r
+     000063EA  perror    |    00006427  pause     |    00006437  isatty   \r
+     00006472  fstat     |    00006489  strcpy    |    000064B0  kill     \r
+     000064C7  atoi      |    0000665D  vfprintf  |    00006BB8  ltoa     \r
+     00006C1B  __longtoa |    00006DAF  itoa      |    00006E18  fputs    \r
+     00006E76  open      |    00006EA1  malloc    |    000070CD  fprintf  \r
+     000070FF  exit      |    0000712F  _read     |    0000714E  getpid   \r
+     00007163  signal    |    00007188  strerror  |    00007345  unix     \r
+     0000735F  fgetc     |    0000746F  memcpy    |    0000753D  on_exit  \r
+     000075B6  atexit    |    000075C9  strcat    |    000075E9  unix_long\r
+     00007603  strchr    |    0000763E  strlen    |    00007675  free     \r
+     00007755  fputc     |    00007867  ultoa     |    000078BC  strtol   \r
+     00007964  sbrk      |    00007979  fread     |    00007BAD  strtoul  \r
+     00007D04  toupper   |    00007D29  tolower  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-UDATA0                 0000BA30    00000AA2 =        2722. bytes (REL,CON)\r
+UDATA0                 00009100    00000AAD =        2733. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     0000BA30  _argc     |    0000BA32  _argv     |    0000BA34  environ  \r
-     0000BA36  errno     |    0000BA38  __cleanup |    0000BA3A  device_ha\r
-     0000BA3C  device_na |    0000BC3C  zeroed    |    0000BE3C  dev      \r
-     0000BE3E  inode     |    0000C03E  bitmap_in |    0000C042  bitmap_bl\r
-     0000C046  bitmap_im |    0000C04A  bitmap_fi |    0000C04E  inode_bit\r
-     0000C050  block_bit |    0000C052  immov_bit |    0000C454  __malloc_\r
-     0000C458  __malloc_ |    0000C4AA  __on_exit\r
+     00009100  _argc     |    00009102  _argv     |    00009104  environ  \r
+     00009106  errno     |    00009108  __cleanup |    0000910B  device_ha\r
+     0000910D  device_na |    0000930D  zeroed    |    0000950D  dev      \r
+     0000950F  inode     |    0000970F  bitmap_in |    00009713  bitmap_bl\r
+     00009717  bitmap_im |    0000971B  bitmap_fi |    0000971F  inode_bit\r
+     00009721  block_bit |    00009723  immov_bit |    00009B25  __malloc_\r
+     00009B29  __malloc_ |    00009B7B  __on_exit\r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CSTACK                 0000C4D2    00001000 =        4096. bytes (REL,CON)\r
+CSTACK                 00009BAD    00001000 =        4096. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
 \r
 Files Linked                              [ module(s) ]\r
 \r
-..\..\lib\c0l.rel                         [ _c0l ]\r
+..\..\lib\c0b.rel                         [ _c0b ]\r
 mkfs                                      [ mkfs ]\r
 utils                                     [ utils ]\r
 \r
 \r
 Libraries Linked                          [ object file ]\r
 \r
-..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\USRSH.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fflush.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\write.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\printf.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\lseek.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\stdio0.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\close.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\abort.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\_exit.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fgets.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fflush.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\write.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\printf.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\lseek.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\stdio0.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVEDIRECT.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\close.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\abort.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\_exit.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fgets.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\CVSWITCH.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\perror.rel ]\r
-..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\pause.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\isatty.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\fstat.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\perror.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\pause.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\isatty.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\fstat.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ENTPARMDIRECT.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strcpy.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKCALLDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcpy.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LAND.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SLCMP.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\kill.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\kill.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ENTAUTODIRECT.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\VSWITCHEND.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\atoi.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\vfprintf.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\ltoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atoi.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\vfprintf.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ltoa.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SSCMP.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\itoa.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fputs.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\open.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\itoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputs.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\open.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\USMOD.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\CLSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\USDIV.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\malloc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\malloc.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SLRSH.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fprintf.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\exit.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\read.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\getpid.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\signal.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fprintf.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\exit.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\read.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\getpid.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\signal.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVE32.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LLSH.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SDIVMOD.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\error.rel ]\r
-..\..\lib\libiar.lib                      [ reliar\LEAVE32.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\sys0l.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\error.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys0b.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SMULASG.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fgetc.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\memcpy.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fgetc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcpy.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\SMUL.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\atexit.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strcat.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\sys1l.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strchr.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strlen.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\free.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fputc.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\ultoa.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strtol.rel ]\r
-..\..\lib\libiar.lib                      [ reliar\CALLIND.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atexit.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcat.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys1b.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strchr.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strlen.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\free.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ultoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtol.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ULDIVASG.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ULMOD.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\ULDIV.rel ]\r
-..\..\lib\libsysl.lib                     [ relsysl\sbrk.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sbrk.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LNEG.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LDIVMOD.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\fread.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fread.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LNOT.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LENDMULDIVASG.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\strtoul.rel ]\r
-..\..\lib\libcl.lib                       [ relcl\ctype.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtoul.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ctype.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LMULASG.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LMUL.rel ]\r
 ..\..\lib\libiar.lib                      [ reliar\LADDASG.rel ]\r
@@ -238,3 +240,5 @@ Libraries Linked                          [ object file ]
 User Base Address Definitions\r
 \r
 l RCODE=0x8100\r
+l CODE=0x4000,0x10000\r
+c CODE=0x4000\r
index a997a24..e12e806 100644 (file)
@@ -1,26 +1,27 @@
 XL4\r
-H 6 areas 42 global symbols\r
+H 6 areas 44 global symbols\r
 M mkfs\r
 S ?US_RSH_L02 Ref00000000\r
-S ?CL64180L_4_06_L00 Ref00000000\r
 S fflush Ref00000000\r
 S bfill Ref00000000\r
 S _write Ref00000000\r
 S printf Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
 S stderr Ref00000000\r
 S lseek Ref00000000\r
 S close Ref00000000\r
 S abort Ref00000000\r
 S ?C_V_SWITCH_L06 Ref00000000\r
 S fgets Ref00000000\r
-S ?LEAVE_DIRECT_L09 Ref00000000\r
 S perror Ref00000000\r
 S bcopy Ref00000000\r
 S stdin Ref00000000\r
 S bzero Ref00000000\r
 S ?ENT_PARM_DIRECT_L09 Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
 S stdout Ref00000000\r
 S strcpy Ref00000000\r
+S errno Ref00000000\r
 S ?SL_CMP_L03 Ref00000000\r
 S ?L_AND_L03 Ref00000000\r
 S ?ENT_AUTO_DIRECT_L09 Ref00000000\r
@@ -32,6 +33,7 @@ S fputs Ref00000000
 S ?US_MOD_L02 Ref00000000\r
 S ?C_LSH_L01 Ref00000000\r
 S ?US_DIV_L02 Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
 S ?SL_RSH_L03 Ref00000000\r
 S malloc Ref00000000\r
 S fprintf Ref00000000\r
@@ -40,16 +42,16 @@ S _read Ref00000000
 S .__.ABS. Def00000000\r
 S ?L_LSH_L03 Ref00000000\r
 A _DEFAULT size 0 flags 0\r
-A CODE size C52 flags 0\r
-S da_read Def0000005A\r
-S doformatting Def0000063F\r
-S dwrite Def00000030\r
-S da_write Def000000CD\r
-S yes Def00000140\r
-S bitmap_dump Def00000B70\r
+A CODE size E53 flags 0\r
+S da_read Def00000078\r
+S doformatting Def00000771\r
+S dwrite Def0000003F\r
+S da_write Def0000013B\r
+S yes Def000001E0\r
+S bitmap_dump Def00000D5D\r
 S daread Def00000000\r
-S main Def000006A1\r
-S mkfs Def00000196\r
+S main Def000007E7\r
+S mkfs Def0000024A\r
 A CSTR size 1FA flags 0\r
 A UDATA0 size 81A flags 0\r
 S immov_bitmap Def00000618\r
@@ -76,1101 +78,1307 @@ A CDATA0 size 985 flags 0
 T 00 00 00 00\r
 R 00 00 01 00\r
 T 00 00 00 00 CD 00 00 00 00 21 1A 06 00 00 E5\r
-R 00 00 01 00 02 05 11 00 00 0A 03 00\r
-T 07 00 00 00 4B 42 ED 5B 02 04 00 00 CD\r
+R 00 00 01 00 02 05 10 00 00 0A 03 00\r
+T 07 00 00 00 4B 42 ED 5B 02 04 00 00 3E\r
 R 00 00 01 00 00 08 03 00\r
-T 0E 00 00 00 5A 00 00 00 F1 3E 02 AC B5 28 13\r
-R 00 00 01 00 00 04 01 00\r
-T 17 00 00 00\r
-R 00 00 01 00\r
-T 17 00 00 00 DD 6E 02 DD 66 03 E5 21\r
-R 00 00 01 00\r
-T 1F 00 00 00 00 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 05 00\r
-T 26 00 00 00 F1 CD 00 00 00 00\r
-R 00 00 01 00 02 06 09 00\r
-T 2A 00 00 00\r
-R 00 00 01 00\r
-T 2A 00 00 00 21 1A 06 00 00 C3 00 00 00 00\r
-R 00 00 01 00 00 05 03 00 02 0A 0C 00\r
-T 30 00 00 00\r
-R 00 00 01 00\r
-T 30 00 00 00 CD 00 00 00 00 C5 4B 42 ED 5B\r
-R 00 00 01 00 02 05 11 00\r
-T 38 00 00 00 02 04 00 00 CD CD 00 00 00 F1 3E\r
-R 00 00 01 00 00 04 03 00 00 09 01 00\r
-T 3F 00 00 00 02 AC B5 28 13\r
-R 00 00 01 00\r
-T 44 00 00 00\r
-R 00 00 01 00\r
-T 44 00 00 00 DD 6E 02 DD 66 03 E5 21\r
-R 00 00 01 00\r
-T 4C 00 00 00 1A 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 05 00\r
-T 53 00 00 00 F1 CD 00 00 00 00\r
-R 00 00 01 00 02 06 09 00\r
-T 57 00 00 00\r
-R 00 00 01 00\r
-T 57 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0C 00\r
-T 5A 00 00 00\r
+T 0E 00 00 00 78 00 00 00 21 78 00 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 13 00 00 00 00 00 00 00 F1 3E 02 AC B5 28 1D\r
+R 00 00 01 00 02 04 11 00\r
+T 1C 00 00 00\r
+R 00 00 01 00\r
+T 1C 00 00 00 DD 6E 02 DD 66 03 E5 21\r
+R 00 00 01 00\r
+T 24 00 00 00 00 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 04 00\r
+T 2A 00 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 04 00 02 09 11 00\r
+T 31 00 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 09 00 02 0A 09 00\r
+T 37 00 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 11 00\r
+T 39 00 00 00\r
+R 00 00 01 00\r
+T 39 00 00 00 21 1A 06 00 00 C3 00 00 00 00\r
+R 00 00 01 00 00 05 03 00 02 0A 05 00\r
+T 3F 00 00 00\r
+R 00 00 01 00\r
+T 3F 00 00 00 CD 00 00 00 00 C5 4B 42 ED 5B\r
+R 00 00 01 00 02 05 10 00\r
+T 47 00 00 00 02 04 00 00 3E 3B 01 00 00 21\r
+R 00 00 01 00 00 04 03 00 29 09 01 00\r
+T 4C 00 00 00 3B 01 00 00 CD 00 00 00 00 F1 3E\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T 53 00 00 00 02 AC B5 28 1D\r
+R 00 00 01 00\r
+T 58 00 00 00\r
+R 00 00 01 00\r
+T 58 00 00 00 DD 6E 02 DD 66 03 E5 21\r
+R 00 00 01 00\r
+T 60 00 00 00 1A 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 04 00\r
+T 66 00 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 04 00 02 09 11 00\r
+T 6D 00 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 09 00 02 0A 09 00\r
+T 73 00 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 11 00\r
+T 75 00 00 00\r
+R 00 00 01 00\r
+T 75 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 05 00\r
+T 78 00 00 00\r
 R 00 00 01 00\r
-T 5A 00 00 00 CD 00 00 00 00 21 00 00 E5 69 60\r
-R 00 00 01 00 02 05 11 00\r
-T 63 00 00 00 01 00 00 3E 09 CD 00 00 00 00 C5\r
-R 00 00 01 00 02 0A 25 00\r
-T 6C 00 00 00 E5 ED 5B 00 00 00 00 CD\r
+T 78 00 00 00 CD 00 00 00 00 21 00 00 E5 69 60\r
+R 00 00 01 00 02 05 10 00\r
+T 81 00 00 00 01 00 00 3E 09 CD 00 00 00 00 C5\r
+R 00 00 01 00 02 0A 27 00\r
+T 8A 00 00 00 E5 ED 5B 00 00 00 00 3E\r
 R 00 00 01 00 00 07 03 00\r
-T 72 00 00 00 00 00 00 00 F1 F1 F1 CB 78 28 1A\r
-R 00 00 01 00 02 04 07 00\r
-T 7B 00 00 00\r
-R 00 00 01 00\r
-T 7B 00 00 00 21 35 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T 82 00 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T 89 00 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 0D 00\r
-T 90 00 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 22 00\r
-T 95 00 00 00\r
-R 00 00 01 00\r
-T 95 00 00 00 21 00 02 E5 DD 4E 08 DD 46 09 ED\r
-R 00 00 01 00\r
-T A0 00 00 00 5B 00 00 00 00 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 05 03 00 02 0A 23 00\r
-T A7 00 00 00 3E 02 AC B5 28 1A\r
-R 00 00 01 00\r
-T AD 00 00 00\r
-R 00 00 01 00\r
-T AD 00 00 00 21 42 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T B4 00 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T BB 00 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 0D 00\r
-T C2 00 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 22 00\r
-T C7 00 00 00\r
-R 00 00 01 00\r
-T C7 00 00 00 21 00 02 C3 00 00 00 00\r
-R 00 00 01 00 02 08 0C 00\r
-T CD 00 00 00\r
-R 00 00 01 00\r
-T CD 00 00 00 CD 00 00 00 00 21 00 00 E5 69 60\r
+T 90 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 07 00 02 09 07 00\r
+T 95 00 00 00 00 00 00 00 F1 F1 F1 CB 78 28 2E\r
+R 00 00 01 00 02 04 11 00\r
+T 9E 00 00 00\r
+R 00 00 01 00\r
+T 9E 00 00 00 21 35 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T A4 00 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T AB 00 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T B1 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T B7 00 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 0C 00\r
+T BC 00 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0C 00 02 09 11 00\r
+T C2 00 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 24 00\r
+T C7 00 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 24 00 02 09 11 00\r
+T CC 00 00 00\r
+R 00 00 01 00\r
+T CC 00 00 00 21 00 02 E5 DD 4E 0A DD 46 0B ED\r
+R 00 00 01 00\r
+T D7 00 00 00 5B 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 03 00 2B 0A 25 00\r
+T DD 00 00 00 00 00 00 00 CD 00 00 00 00 F1 3E\r
+R 00 00 01 00 02 04 25 00 02 09 11 00\r
+T E4 00 00 00 02 AC B5 28 4C\r
+R 00 00 01 00\r
+T E9 00 00 00\r
+R 00 00 01 00\r
+T E9 00 00 00 2A 00 00 00 00 7D B4 20 17\r
+R 00 00 01 00 02 05 14 00\r
+T F0 00 00 00\r
+R 00 00 01 00\r
+T F0 00 00 00 21 00 02 E5 0E AA DD 5E 0A DD 56\r
+R 00 00 01 00\r
+T FB 00 00 00 0B 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 02 00 02 0B 02 00\r
+T 01 01 00 00 CD 00 00 00 00 E1 18 2E\r
 R 00 00 01 00 02 05 11 00\r
-T D6 00 00 00 01 00 00 3E 09 CD 00 00 00 00 C5\r
-R 00 00 01 00 02 0A 25 00\r
-T DF 00 00 00 E5 ED 5B 00 00 00 00 CD\r
+T 07 01 00 00\r
+R 00 00 01 00\r
+T 07 01 00 00 21 42 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 0D 01 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 14 01 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T 1A 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T 20 01 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 0C 00\r
+T 25 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0C 00 02 09 11 00\r
+T 2B 01 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 24 00\r
+T 30 01 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 24 00 02 09 11 00\r
+T 35 01 00 00\r
+R 00 00 01 00\r
+T 35 01 00 00\r
+R 00 00 01 00\r
+T 35 01 00 00 21 00 02 C3 00 00 00 00\r
+R 00 00 01 00 02 08 05 00\r
+T 3B 01 00 00\r
+R 00 00 01 00\r
+T 3B 01 00 00 CD 00 00 00 00 21 00 00 E5 69 60\r
+R 00 00 01 00 02 05 10 00\r
+T 44 01 00 00 01 00 00 3E 09 CD 00 00 00 00 C5\r
+R 00 00 01 00 02 0A 27 00\r
+T 4D 01 00 00 E5 ED 5B 00 00 00 00 3E\r
 R 00 00 01 00 00 07 03 00\r
-T E5 00 00 00 00 00 00 00 F1 F1 F1 CB 78 28 1A\r
-R 00 00 01 00 02 04 07 00\r
-T EE 00 00 00\r
-R 00 00 01 00\r
-T EE 00 00 00 21 35 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T F5 00 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T FC 00 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 0D 00\r
-T 03 01 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 22 00\r
-T 08 01 00 00\r
-R 00 00 01 00\r
-T 08 01 00 00 21 00 02 E5 DD 4E 08 DD 46 09 ED\r
-R 00 00 01 00\r
-T 13 01 00 00 5B 00 00 00 00 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 05 03 00 02 0A 04 00\r
-T 1A 01 00 00 3E 02 AC B5 28 1A\r
-R 00 00 01 00\r
-T 20 01 00 00\r
-R 00 00 01 00\r
-T 20 01 00 00 21 4F 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T 27 01 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T 2E 01 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 0D 00\r
-T 35 01 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 22 00\r
-T 3A 01 00 00\r
-R 00 00 01 00\r
-T 3A 01 00 00 21 00 02 C3 00 00 00 00\r
-R 00 00 01 00 02 08 0C 00\r
-T 40 01 00 00\r
-R 00 00 01 00\r
-T 40 01 00 00 CD 00 00 00 00 EC FF 01\r
-R 00 00 01 00 02 05 16 00\r
-T 46 01 00 00 00 00 00 00 DD 5E 02 DD 56 03 CD\r
+T 53 01 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 07 00 02 09 07 00\r
+T 58 01 00 00 00 00 00 00 F1 F1 F1 CB 78 28 2E\r
+R 00 00 01 00 02 04 11 00\r
+T 61 01 00 00\r
+R 00 00 01 00\r
+T 61 01 00 00 21 35 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 67 01 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 6E 01 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T 74 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T 7A 01 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 0C 00\r
+T 7F 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0C 00 02 09 11 00\r
+T 85 01 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 24 00\r
+T 8A 01 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 24 00 02 09 11 00\r
+T 8F 01 00 00\r
+R 00 00 01 00\r
+T 8F 01 00 00 21 00 02 E5 DD 4E 0A DD 46 0B ED\r
+R 00 00 01 00\r
+T 9A 01 00 00 5B 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 03 00 2B 0A 03 00\r
+T A0 01 00 00 00 00 00 00 CD 00 00 00 00 F1 3E\r
+R 00 00 01 00 02 04 03 00 02 09 11 00\r
+T A7 01 00 00 02 AC B5 28 2E\r
+R 00 00 01 00\r
+T AC 01 00 00\r
+R 00 00 01 00\r
+T AC 01 00 00 21 4F 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T B2 01 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T B9 01 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T BF 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T C5 01 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 0C 00\r
+T CA 01 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0C 00 02 09 11 00\r
+T D0 01 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 24 00\r
+T D5 01 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 24 00 02 09 11 00\r
+T DA 01 00 00\r
+R 00 00 01 00\r
+T DA 01 00 00 21 00 02 C3 00 00 00 00\r
+R 00 00 01 00 02 08 05 00\r
+T E0 01 00 00\r
+R 00 00 01 00\r
+T E0 01 00 00 CD 00 00 00 00 EC FF 01\r
+R 00 00 01 00 02 05 17 00\r
+T E6 01 00 00 00 00 00 00 DD 5E 02 DD 56 03 3E\r
 R 00 00 01 00 02 04 12 00\r
-T 4F 01 00 00 00 00 00 00 11 00 00 00 00 CD\r
-R 00 00 01 00 02 04 1B 00 02 09 12 00\r
-T 55 01 00 00 00 00 00 00 3A 81 09 00 00 B7 28\r
-R 00 00 01 00 02 04 02 00 00 09 04 00\r
-T 5C 01 00 00 0B\r
-R 00 00 01 00\r
-T 5D 01 00 00\r
-R 00 00 01 00\r
-T 5D 01 00 00 01 00 00 00 00 11 5D 00 00 00 CD\r
+T EF 01 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 1C 00 02 09 1C 00\r
+T F4 01 00 00 00 00 00 00 11 00 00 00 00 3E\r
+R 00 00 01 00 02 04 11 00 02 09 12 00\r
+T FA 01 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 01 00 02 09 01 00\r
+T FF 01 00 00 00 00 00 00 3A 81 09 00 00 B7 28\r
+R 00 00 01 00 02 04 11 00 00 09 04 00\r
+T 06 02 00 00 10\r
+R 00 00 01 00\r
+T 07 02 00 00\r
+R 00 00 01 00\r
+T 07 02 00 00 01 00 00 00 00 11 5D 00 00 00 3E\r
 R 00 00 01 00 02 05 12 00 00 0A 02 00\r
-T 64 01 00 00 00 00 00 00 18 28\r
-R 00 00 01 00 02 04 1B 00\r
-T 68 01 00 00\r
+T 0E 02 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 1C 00 02 09 1C 00\r
+T 13 02 00 00 00 00 00 00 18 2D\r
+R 00 00 01 00 02 04 11 00\r
+T 17 02 00 00\r
 R 00 00 01 00\r
-T 68 01 00 00 21 00 00 00 00 E5 01 14 00 21\r
-R 00 00 01 00 02 05 0F 00\r
-T 70 01 00 00 02 00 39 5D 54 CD 00 00 00 00 F1\r
-R 00 00 01 00 02 0A 0B 00\r
-T 79 01 00 00 7D B4 28 0E DD 7E EC FE 79 28 0C\r
+T 17 02 00 00 21 00 00 00 00 E5 01 14 00 21\r
+R 00 00 01 00 02 05 0E 00\r
+T 1F 02 00 00 02 00 39 5D 54 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 0B 00\r
+T 27 02 00 00 00 00 00 00 CD 00 00 00 00 F1 7D\r
+R 00 00 01 00 02 04 0B 00 02 09 11 00\r
+T 2E 02 00 00 B4 28 0E DD 7E EC FE 79 28 0C DD\r
 R 00 00 01 00\r
-T 84 01 00 00 DD 7E EC FE 59 28 05\r
+T 39 02 00 00 7E EC FE 59 28 05\r
 R 00 00 01 00\r
-T 8B 01 00 00\r
+T 3F 02 00 00\r
 R 00 00 01 00\r
-T 8B 01 00 00\r
+T 3F 02 00 00\r
 R 00 00 01 00\r
-T 8B 01 00 00\r
+T 3F 02 00 00\r
 R 00 00 01 00\r
-T 8B 01 00 00\r
+T 3F 02 00 00\r
 R 00 00 01 00\r
-T 8B 01 00 00\r
+T 3F 02 00 00\r
 R 00 00 01 00\r
-T 8B 01 00 00 21 00 00 18 03\r
+T 3F 02 00 00 21 00 00 18 03\r
 R 00 00 01 00\r
-T 90 01 00 00\r
+T 44 02 00 00\r
 R 00 00 01 00\r
-T 90 01 00 00\r
+T 44 02 00 00\r
 R 00 00 01 00\r
-T 90 01 00 00 21 01 00\r
+T 44 02 00 00 21 01 00\r
 R 00 00 01 00\r
-T 93 01 00 00\r
+T 47 02 00 00\r
 R 00 00 01 00\r
-T 93 01 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0C 00\r
-T 96 01 00 00\r
+T 47 02 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 05 00\r
+T 4A 02 00 00\r
 R 00 00 01 00\r
-T 96 01 00 00 CD 00 00 00 00 DC FF 3A\r
-R 00 00 01 00 02 05 16 00\r
-T 9C 01 00 00 83 09 00 00 B7 28 0E\r
+T 4A 02 00 00 CD 00 00 00 00 DC FF 3A\r
+R 00 00 01 00 02 05 17 00\r
+T 50 02 00 00 83 09 00 00 B7 28 18\r
 R 00 00 01 00 00 04 04 00\r
-T A1 01 00 00\r
-R 00 00 01 00\r
-T A1 01 00 00 21 60 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T A8 01 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T AF 01 00 00\r
+T 55 02 00 00\r
 R 00 00 01 00\r
-T AF 01 00 00 AF DD 77 DC DD 77 DD\r
+T 55 02 00 00 21 60 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 5B 02 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 62 02 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T 68 02 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T 6D 02 00 00\r
 R 00 00 01 00\r
-T B6 01 00 00\r
+T 6D 02 00 00 AF DD 77 DC DD 77 DD\r
 R 00 00 01 00\r
-T B6 01 00 00 01 80 07 DD 6E DC DD 66 DD A7 ED\r
+T 74 02 00 00\r
 R 00 00 01 00\r
-T C1 01 00 00 42 30 7C\r
+T 74 02 00 00 01 80 07 DD 6E DC DD 66 DD A7 ED\r
 R 00 00 01 00\r
-T C4 01 00 00\r
+T 7F 02 00 00 42 D2 13 03 00 00\r
+R 00 00 01 00 00 06 01 00\r
+T 83 02 00 00\r
 R 00 00 01 00\r
-T C4 01 00 00 01 00 02 DD 5E DC DD 56 DD 21\r
+T 83 02 00 00 01 00 02 DD 5E DC DD 56 DD 21\r
 R 00 00 01 00\r
-T CE 01 00 00 80 07 A7 ED 52 EB CD 00 00 00 00\r
-R 00 00 01 00 02 0B 18 00\r
-T D7 01 00 00 DD 75 DE DD 74 DF 01 00 02 A7 ED\r
+T 8D 02 00 00 80 07 A7 ED 52 EB 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 19 00\r
+T 95 02 00 00 21 00 00 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 02 05 19 00 02 0A 11 00\r
+T 9C 02 00 00 75 DE DD 74 DF 01 00 02 A7 ED 42\r
 R 00 00 01 00\r
-T E2 01 00 00 42 30 16\r
+T A7 02 00 00 30 1B\r
 R 00 00 01 00\r
-T E5 01 00 00\r
+T A9 02 00 00\r
 R 00 00 01 00\r
-T E5 01 00 00 06 09 DD 5E DC DD 56 DD CD\r
+T A9 02 00 00 06 09 DD 5E DC DD 56 DD CD\r
 R 00 00 01 00\r
-T EE 01 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
-R 00 00 01 00 02 04 00 00 00 09 01 00\r
-T F5 01 00 00 FE DD 74 FF 18 08\r
+T B2 02 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 00 00 29 09 01 00\r
+T B7 02 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T BE 02 00 00 FE DD 74 FF 18 08\r
 R 00 00 01 00\r
-T FB 01 00 00\r
+T C4 02 00 00\r
 R 00 00 01 00\r
-T FB 01 00 00 DD 36 FE 02 02 00 00 DD 36 FF\r
+T C4 02 00 00 DD 36 FE 02 02 00 00 DD 36 FF\r
 R 00 00 01 00 09 07 03 00\r
-T 02 02 00 00 02 02 00 00\r
+T CB 02 00 00 02 02 00 00\r
 R 00 00 01 00 89 04 03 00\r
-T 03 02 00 00\r
+T CC 02 00 00\r
 R 00 00 01 00\r
-T 03 02 00 00 DD 6E DE DD 66 DF E5 DD 4E FE DD\r
+T CC 02 00 00 DD 6E DE DD 66 DF E5 DD 4E FE DD\r
 R 00 00 01 00\r
-T 0E 02 00 00 46 FF 21 00 00 00 00 DD 5E DC DD\r
+T D7 02 00 00 46 FF 21 00 00 00 00 DD 5E DC DD\r
 R 00 00 01 00 00 07 04 00\r
-T 17 02 00 00 56 DD 19 EB CD 00 00 00 00 E1 DD\r
-R 00 00 01 00 02 09 0E 00\r
-T 20 02 00 00 4E FE DD 46 FF C5 06 09 DD 5E DC\r
+T E0 02 00 00 56 DD 19 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 0D 00\r
+T E7 02 00 00 00 00 00 00 CD 00 00 00 00 E1 DD\r
+R 00 00 01 00 02 04 0D 00 02 09 11 00\r
+T EE 02 00 00 4E FE DD 46 FF C5 06 09 DD 5E DC\r
 R 00 00 01 00\r
-T 2B 02 00 00 DD 56 DD CD 00 00 00 00 C1 CD\r
+T F9 02 00 00 DD 56 DD CD 00 00 00 00 3E\r
 R 00 00 01 00 02 08 00 00\r
-T 33 02 00 00 30 00 00 00 3E 02 DD 86 DD DD 77\r
-R 00 00 01 00 00 04 01 00\r
-T 3C 02 00 00 DD C3 B6 01 00 00\r
+T 00 03 00 00 3F 00 00 00 21 3F 00 00 00 C1 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 06 03 00 00 00 00 00 00 3E 02 DD 86 DD DD 77\r
+R 00 00 01 00 02 04 11 00\r
+T 0F 03 00 00 DD C3 74 02 00 00\r
 R 00 00 01 00 00 06 01 00\r
-T 40 02 00 00\r
+T 13 03 00 00\r
 R 00 00 01 00\r
-T 40 02 00 00 01 00 02 11 02 02 00 00 CD\r
+T 13 03 00 00 01 00 02 11 02 02 00 00 3E\r
 R 00 00 01 00 00 08 03 00\r
-T 47 02 00 00 00 00 00 00 3A 83 09 00 00 B7 28\r
-R 00 00 01 00 02 04 10 00 00 09 04 00\r
-T 4E 02 00 00 0E\r
-R 00 00 01 00\r
-T 4F 02 00 00\r
-R 00 00 01 00\r
-T 4F 02 00 00 21 78 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T 56 02 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T 5D 02 00 00\r
-R 00 00 01 00\r
-T 5D 02 00 00 3A 82 09 00 00 B7 28 19\r
+T 1A 03 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0F 00 02 09 0F 00\r
+T 1F 03 00 00 00 00 00 00 3A 83 09 00 00 B7 28\r
+R 00 00 01 00 02 04 11 00 00 09 04 00\r
+T 26 03 00 00 18\r
+R 00 00 01 00\r
+T 27 03 00 00\r
+R 00 00 01 00\r
+T 27 03 00 00 21 78 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 2D 03 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 34 03 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T 3A 03 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T 3F 03 00 00\r
+R 00 00 01 00\r
+T 3F 03 00 00 3A 82 09 00 00 B7 28 19\r
 R 00 00 01 00 00 05 04 00\r
-T 63 02 00 00\r
+T 45 03 00 00\r
 R 00 00 01 00\r
-T 63 02 00 00 DD 6E 04 DD 66 05 DD 4E 08 DD 46\r
+T 45 03 00 00 DD 6E 04 DD 66 05 DD 4E 0A DD 46\r
 R 00 00 01 00\r
-T 6E 02 00 00 09 09 01 05 00 09 DD 75 DE DD 74\r
+T 50 03 00 00 0B 09 01 05 00 09 DD 75 DE DD 74\r
 R 00 00 01 00\r
-T 79 02 00 00 DF 18 0C\r
+T 5B 03 00 00 DF 18 0C\r
 R 00 00 01 00\r
-T 7C 02 00 00\r
+T 5E 03 00 00\r
 R 00 00 01 00\r
-T 7C 02 00 00 DD 6E 02 DD 66 03 DD 75 DE DD 74\r
+T 5E 03 00 00 DD 6E 02 DD 66 03 DD 75 DE DD 74\r
 R 00 00 01 00\r
-T 87 02 00 00 DF\r
+T 69 03 00 00 DF\r
 R 00 00 01 00\r
-T 88 02 00 00\r
+T 6A 03 00 00\r
 R 00 00 01 00\r
-T 88 02 00 00 21 05 00 DD 4E 08 DD 46 09 09 DD\r
+T 6A 03 00 00 21 05 00 DD 4E 0A DD 46 0B 09 DD\r
 R 00 00 01 00\r
-T 93 02 00 00 75 DC DD 74 DD\r
+T 75 03 00 00 75 DC DD 74 DD\r
 R 00 00 01 00\r
-T 98 02 00 00\r
+T 7A 03 00 00\r
 R 00 00 01 00\r
-T 98 02 00 00 DD 4E DE DD 46 DF DD 6E DC DD 66\r
+T 7A 03 00 00 DD 4E DE DD 46 DF DD 6E DC DD 66\r
 R 00 00 01 00\r
-T A3 02 00 00 DD A7 ED 42 30 42\r
+T 85 03 00 00 DD A7 ED 42 30 51\r
 R 00 00 01 00\r
-T A9 02 00 00\r
+T 8B 03 00 00\r
 R 00 00 01 00\r
-T A9 02 00 00 3A 83 09 00 00 B7 28 26 01 09 00\r
+T 8B 03 00 00 3A 83 09 00 00 B7 28 30 01 09 00\r
 R 00 00 01 00 00 05 04 00\r
-T B2 02 00 00 DD 5E DC DD 56 DD CD 00 00 00 00\r
-R 00 00 01 00 02 0B 1C 00\r
-T BB 02 00 00 7B B2 20 16\r
+T 94 03 00 00 DD 5E DC DD 56 DD CD 00 00 00 00\r
+R 00 00 01 00 02 0B 1D 00\r
+T 9D 03 00 00 7B B2 20 20\r
 R 00 00 01 00\r
-T BF 02 00 00\r
+T A1 03 00 00\r
 R 00 00 01 00\r
-T BF 02 00 00\r
+T A1 03 00 00\r
 R 00 00 01 00\r
-T BF 02 00 00\r
+T A1 03 00 00\r
 R 00 00 01 00\r
-T BF 02 00 00 DD 6E DC DD 66 DD E5 21\r
+T A1 03 00 00 DD 6E DC DD 66 DD E5 21\r
 R 00 00 01 00\r
-T C7 02 00 00 9C 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 02 00 02 0A 05 00\r
-T CE 02 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T D5 02 00 00\r
+T A9 03 00 00 9C 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 0A 04 00\r
+T AF 03 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 04 00 02 09 11 00\r
+T B6 03 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T BC 03 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T C1 03 00 00\r
 R 00 00 01 00\r
-T D5 02 00 00 01 02 02 00 00 DD 5E DC DD 56 DD\r
+T C1 03 00 00 01 02 02 00 00 DD 5E DC DD 56 DD\r
 R 00 00 01 00 00 05 03 00\r
-T DE 02 00 00 13 DD 73 DC DD 72 DD 1B CD\r
+T CA 03 00 00 13 DD 73 DC DD 72 DD 1B 3E\r
 R 00 00 01 00\r
-T E7 02 00 00 30 00 00 00 18 AD\r
-R 00 00 01 00 00 04 01 00\r
-T EB 02 00 00\r
+T D3 03 00 00 3F 00 00 00 21 3F 00 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T D8 03 00 00 00 00 00 00 18 9E\r
+R 00 00 01 00 02 04 11 00\r
+T DC 03 00 00\r
 R 00 00 01 00\r
-T EB 02 00 00 3A 83 09 00 00 B7 28 1D\r
+T DC 03 00 00 3A 83 09 00 00 B7 28 27\r
 R 00 00 01 00 00 05 04 00\r
-T F1 02 00 00\r
+T E2 03 00 00\r
 R 00 00 01 00\r
-T F1 02 00 00 DD 6E DC DD 66 DD 2B DD 75 DC DD\r
+T E2 03 00 00 DD 6E DC DD 66 DD 2B DD 75 DC DD\r
 R 00 00 01 00\r
-T FC 02 00 00 74 DD E5 21 A5 00 00 00 E5 CD\r
+T ED 03 00 00 74 DD E5 21 A5 00 00 00 E5 3E\r
 R 00 00 01 00 00 08 02 00\r
-T 04 03 00 00 00 00 00 00 F1 F1 11 00 00 00 00\r
-R 00 00 01 00 02 04 05 00 02 0B 12 00\r
-T 0B 03 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 02 00\r
-T 0E 03 00 00\r
-R 00 00 01 00\r
-T 0E 03 00 00 3A 83 09 00 00 B7 28 0E\r
+T F5 03 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 04 00 02 09 04 00\r
+T FA 03 00 00 00 00 00 00 F1 F1 11 00 00 00 00\r
+R 00 00 01 00 02 04 11 00 02 0B 12 00\r
+T 01 04 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 01 00 02 0A 01 00\r
+T 07 04 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 11 00\r
+T 09 04 00 00\r
+R 00 00 01 00\r
+T 09 04 00 00 3A 83 09 00 00 B7 28 18\r
 R 00 00 01 00 00 05 04 00\r
-T 14 03 00 00\r
+T 0F 04 00 00\r
 R 00 00 01 00\r
-T 14 03 00 00 21 AE 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T 1B 03 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T 22 03 00 00\r
+T 0F 04 00 00 21 AE 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 15 04 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 1C 04 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T 22 04 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T 27 04 00 00\r
 R 00 00 01 00\r
-T 22 03 00 00 01 1E 00 21 04 00 39 5D 54 CD\r
+T 27 04 00 00 01 1E 00 21 04 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 2C 03 00 00 00 00 00 00 DD 36 E0 C6 DD 36 E1\r
-R 00 00 01 00 02 04 10 00\r
-T 35 03 00 00 31 21 05 00 DD 4E 08 DD 46 09 09\r
+T 31 04 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0F 00 02 09 0F 00\r
+T 36 04 00 00 00 00 00 00 DD 36 E0 C6 DD 36 E1\r
+R 00 00 01 00 02 04 11 00\r
+T 3F 04 00 00 31 21 05 00 DD 4E 0A DD 46 0B 09\r
 R 00 00 01 00\r
-T 40 03 00 00 DD 75 E2 DD 74 E3 DD 6E 04 DD 66\r
+T 4A 04 00 00 DD 75 E2 DD 74 E3 DD 6E 04 DD 66\r
 R 00 00 01 00\r
-T 4B 03 00 00 05 DD 75 E4 DD 74 E5 DD 6E 02 DD\r
+T 55 04 00 00 05 DD 75 E4 DD 74 E5 DD 6E 02 DD\r
 R 00 00 01 00\r
-T 56 03 00 00 66 03 DD 75 E6 DD 74 E7 DD 6E 04\r
+T 60 04 00 00 66 03 DD 75 E6 DD 74 E7 DD 6E 04\r
 R 00 00 01 00\r
-T 61 03 00 00 DD 66 05 29 29 29 11 FE FF 19 DD\r
+T 6B 04 00 00 DD 66 05 29 29 29 11 FE FF 19 DD\r
 R 00 00 01 00\r
-T 6C 03 00 00 75 EA DD 74 EB DD 6E 04 DD 66 05\r
+T 76 04 00 00 75 EA DD 74 EB DD 6E 04 DD 66 05\r
 R 00 00 01 00\r
-T 77 03 00 00 09 01 06 00 09 4D 44 DD 6E 02 DD\r
+T 81 04 00 00 09 01 06 00 09 4D 44 DD 6E 02 DD\r
 R 00 00 01 00\r
-T 82 03 00 00 66 03 A7 ED 42 DD 75 E8 DD 74 E9\r
+T 8C 04 00 00 66 03 A7 ED 42 DD 75 E8 DD 74 E9\r
 R 00 00 01 00\r
-T 8D 03 00 00 2A 04 06 00 00 DD 75 F0 DD 74 F1\r
+T 97 04 00 00 2A 04 06 00 00 DD 75 F0 DD 74 F1\r
 R 00 00 01 00 00 05 03 00\r
-T 96 03 00 00 2A 08 06 00 00 DD 75 F2 DD 74 F3\r
+T A0 04 00 00 2A 08 06 00 00 DD 75 F2 DD 74 F3\r
 R 00 00 01 00 00 05 03 00\r
-T 9F 03 00 00 2A 0C 06 00 00 DD 75 F4 DD 74 F5\r
+T A9 04 00 00 2A 0C 06 00 00 DD 75 F4 DD 74 F5\r
 R 00 00 01 00 00 05 03 00\r
-T A8 03 00 00 2A 10 06 00 00 DD 75 F6 DD 74 F7\r
+T B2 04 00 00 2A 10 06 00 00 DD 75 F6 DD 74 F7\r
 R 00 00 01 00 00 05 03 00\r
-T B1 03 00 00 AF DD 77 DC DD 77 DD\r
+T BB 04 00 00 AF DD 77 DC DD 77 DD\r
 R 00 00 01 00\r
-T B8 03 00 00\r
+T C2 04 00 00\r
 R 00 00 01 00\r
-T B8 03 00 00 DD 6E 04 DD 66 05 DD 4E 08 DD 46\r
+T C2 04 00 00 DD 6E 04 DD 66 05 DD 4E 0A DD 46\r
 R 00 00 01 00\r
-T C3 03 00 00 09 09 01 06 00 09 4D 44 DD 6E DC\r
+T CD 04 00 00 0B 09 01 06 00 09 4D 44 DD 6E DC\r
 R 00 00 01 00\r
-T CE 03 00 00 DD 66 DD A7 ED 42 30 26\r
+T D8 04 00 00 DD 66 DD A7 ED 42 30 26\r
 R 00 00 01 00\r
-T D6 03 00 00\r
+T E0 04 00 00\r
 R 00 00 01 00\r
-T D6 03 00 00 06 03 DD 5E DC DD 56 DD CD\r
+T E0 04 00 00 06 03 DD 5E DC DD 56 DD CD\r
 R 00 00 01 00\r
-T DF 03 00 00 00 00 00 00 2A 16 06 00 00 19 DD\r
+T E9 04 00 00 00 00 00 00 2A 16 06 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T E6 03 00 00 7E DC E6 07 47 3E 01 CD\r
+T F0 04 00 00 7E DC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T EE 03 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T F7 03 00 00 DD 34 DD\r
+T F8 04 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T 01 05 00 00 DD 34 DD\r
 R 00 00 01 00\r
-T FA 03 00 00\r
+T 04 05 00 00\r
 R 00 00 01 00\r
-T FA 03 00 00 18 BC\r
+T 04 05 00 00 18 BC\r
 R 00 00 01 00\r
-T FC 03 00 00\r
+T 06 05 00 00\r
 R 00 00 01 00\r
-T FC 03 00 00 ED 4B 08 06 00 00 2A 0C 06 00 00\r
+T 06 05 00 00 ED 4B 08 06 00 00 2A 0C 06 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 03 04 00 00 A7 ED 42 29 29 29 DD 75 DE DD 74\r
+T 0D 05 00 00 A7 ED 42 29 29 29 DD 75 DE DD 74\r
 R 00 00 01 00\r
-T 0E 04 00 00 DF DD 6E 02 DD 66 03 DD 75 DC DD\r
+T 18 05 00 00 DF DD 6E 02 DD 66 03 DD 75 DC DD\r
 R 00 00 01 00\r
-T 19 04 00 00 74 DD\r
+T 23 05 00 00 74 DD\r
 R 00 00 01 00\r
-T 1B 04 00 00\r
+T 25 05 00 00\r
 R 00 00 01 00\r
-T 1B 04 00 00 DD 6E DE DD 66 DF DD 4E DC DD 46\r
+T 25 05 00 00 DD 6E DE DD 66 DF DD 4E DC DD 46\r
 R 00 00 01 00\r
-T 26 04 00 00 DD A7 ED 42 28 26\r
+T 30 05 00 00 DD A7 ED 42 28 26\r
 R 00 00 01 00\r
-T 2C 04 00 00\r
+T 36 05 00 00\r
 R 00 00 01 00\r
-T 2C 04 00 00 06 03 DD 5E DC DD 56 DD CD\r
+T 36 05 00 00 06 03 DD 5E DC DD 56 DD CD\r
 R 00 00 01 00\r
-T 35 04 00 00 00 00 00 00 2A 16 06 00 00 19 DD\r
+T 3F 05 00 00 00 00 00 00 2A 16 06 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T 3C 04 00 00 7E DC E6 07 47 3E 01 CD\r
+T 46 05 00 00 7E DC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 44 04 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T 4D 04 00 00 DD 34 DD\r
+T 4E 05 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T 57 05 00 00 DD 34 DD\r
 R 00 00 01 00\r
-T 50 04 00 00\r
+T 5A 05 00 00\r
 R 00 00 01 00\r
-T 50 04 00 00 18 C9\r
+T 5A 05 00 00 18 C9\r
 R 00 00 01 00\r
-T 52 04 00 00\r
+T 5C 05 00 00\r
 R 00 00 01 00\r
-T 52 04 00 00 2A 0E 06 00 00 E5 2A 0C 06 00 00\r
+T 5C 05 00 00 2A 0E 06 00 00 E5 2A 0C 06 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T 59 04 00 00 E5 2A 0A 06 00 00 E5 2A\r
+T 63 05 00 00 E5 2A 0A 06 00 00 E5 2A\r
 R 00 00 01 00 00 06 03 00\r
-T 5F 04 00 00 08 06 00 00 E5 ED 5B 16 06 00 00\r
+T 69 05 00 00 08 06 00 00 E5 ED 5B 16 06 00 00\r
 R 00 00 01 00 00 04 03 00 00 0B 03 00\r
-T 66 04 00 00 CD 70 0B 00 00 E1 E1 E1 E1 3A\r
-R 00 00 01 00 00 05 01 00\r
-T 6E 04 00 00 84 09 00 00 B7 CA 30 05 00 00\r
+T 70 05 00 00 3E 5D 0D 00 00 21 5D 0D 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 76 05 00 00 00 00 00 00 E1 E1 E1 E1 3A\r
+R 00 00 01 00 02 04 11 00\r
+T 7D 05 00 00 84 09 00 00 B7 CA 44 06 00 00\r
 R 00 00 01 00 00 04 04 00 00 0A 01 00\r
-T 74 04 00 00\r
+T 83 05 00 00\r
 R 00 00 01 00\r
-T 74 04 00 00 AF DD 77 DC DD 77 DD\r
+T 83 05 00 00 AF DD 77 DC DD 77 DD\r
 R 00 00 01 00\r
-T 7B 04 00 00\r
+T 8A 05 00 00\r
 R 00 00 01 00\r
-T 7B 04 00 00 DD 6E 04 DD 66 05 DD 4E 08 DD 46\r
+T 8A 05 00 00 DD 6E 04 DD 66 05 DD 4E 0A DD 46\r
 R 00 00 01 00\r
-T 86 04 00 00 09 09 01 06 00 09 4D 44 DD 6E DC\r
+T 95 05 00 00 0B 09 01 06 00 09 4D 44 DD 6E DC\r
 R 00 00 01 00\r
-T 91 04 00 00 DD 66 DD A7 ED 42 30 26\r
+T A0 05 00 00 DD 66 DD A7 ED 42 30 26\r
 R 00 00 01 00\r
-T 99 04 00 00\r
+T A8 05 00 00\r
 R 00 00 01 00\r
-T 99 04 00 00 06 03 DD 5E DC DD 56 DD CD\r
+T A8 05 00 00 06 03 DD 5E DC DD 56 DD CD\r
 R 00 00 01 00\r
-T A2 04 00 00 00 00 00 00 2A 18 06 00 00 19 DD\r
+T B1 05 00 00 00 00 00 00 2A 18 06 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T A9 04 00 00 7E DC E6 07 47 3E 01 CD\r
+T B8 05 00 00 7E DC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T B1 04 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T BA 04 00 00 DD 34 DD\r
+T C0 05 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T C9 05 00 00 DD 34 DD\r
 R 00 00 01 00\r
-T BD 04 00 00\r
+T CC 05 00 00\r
 R 00 00 01 00\r
-T BD 04 00 00 18 BC\r
+T CC 05 00 00 18 BC\r
 R 00 00 01 00\r
-T BF 04 00 00\r
+T CE 05 00 00\r
 R 00 00 01 00\r
-T BF 04 00 00 ED 4B 0C 06 00 00 2A 10 06 00 00\r
+T CE 05 00 00 ED 4B 0C 06 00 00 2A 10 06 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T C6 04 00 00 A7 ED 42 29 29 29 DD 75 DE DD 74\r
+T D5 05 00 00 A7 ED 42 29 29 29 DD 75 DE DD 74\r
 R 00 00 01 00\r
-T D1 04 00 00 DF DD 6E 02 DD 66 03 DD 75 DC DD\r
+T E0 05 00 00 DF DD 6E 02 DD 66 03 DD 75 DC DD\r
 R 00 00 01 00\r
-T DC 04 00 00 74 DD\r
+T EB 05 00 00 74 DD\r
 R 00 00 01 00\r
-T DE 04 00 00\r
+T ED 05 00 00\r
 R 00 00 01 00\r
-T DE 04 00 00 DD 6E DE DD 66 DF DD 4E DC DD 46\r
+T ED 05 00 00 DD 6E DE DD 66 DF DD 4E DC DD 46\r
 R 00 00 01 00\r
-T E9 04 00 00 DD A7 ED 42 28 26\r
+T F8 05 00 00 DD A7 ED 42 28 26\r
 R 00 00 01 00\r
-T EF 04 00 00\r
+T FE 05 00 00\r
 R 00 00 01 00\r
-T EF 04 00 00 06 03 DD 5E DC DD 56 DD CD\r
+T FE 05 00 00 06 03 DD 5E DC DD 56 DD CD\r
 R 00 00 01 00\r
-T F8 04 00 00 00 00 00 00 2A 18 06 00 00 19 DD\r
+T 07 06 00 00 00 00 00 00 2A 18 06 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T FF 04 00 00 7E DC E6 07 47 3E 01 CD\r
+T 0E 06 00 00 7E DC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T 07 05 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T 10 05 00 00 DD 34 DD\r
+T 16 06 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T 1F 06 00 00 DD 34 DD\r
 R 00 00 01 00\r
-T 13 05 00 00\r
+T 22 06 00 00\r
 R 00 00 01 00\r
-T 13 05 00 00 18 C9\r
+T 22 06 00 00 18 C9\r
 R 00 00 01 00\r
-T 15 05 00 00\r
+T 24 06 00 00\r
 R 00 00 01 00\r
-T 15 05 00 00 2A 12 06 00 00 E5 2A 10 06 00 00\r
+T 24 06 00 00 2A 12 06 00 00 E5 2A 10 06 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T 1C 05 00 00 E5 2A 0E 06 00 00 E5 2A\r
+T 2B 06 00 00 E5 2A 0E 06 00 00 E5 2A\r
 R 00 00 01 00 00 06 03 00\r
-T 22 05 00 00 0C 06 00 00 E5 ED 5B 18 06 00 00\r
+T 31 06 00 00 0C 06 00 00 E5 ED 5B 18 06 00 00\r
 R 00 00 01 00 00 04 03 00 00 0B 03 00\r
-T 29 05 00 00 CD 70 0B 00 00 E1 E1 E1 E1\r
-R 00 00 01 00 00 05 01 00\r
-T 30 05 00 00\r
+T 38 06 00 00 3E 5D 0D 00 00 21 5D 0D 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 3E 06 00 00 00 00 00 00 E1 E1 E1 E1\r
+R 00 00 01 00 02 04 11 00\r
+T 44 06 00 00\r
 R 00 00 01 00\r
-T 30 05 00 00 21 ED 41 22 44 04 00 00 21 03 00\r
+T 44 06 00 00 21 ED 41 22 44 04 00 00 21 03 00\r
 R 00 00 01 00 00 08 03 00\r
-T 39 05 00 00 22 46 04 00 00 01 00 00 21 20 00\r
+T 4D 06 00 00 22 46 04 00 00 01 00 00 21 20 00\r
 R 00 00 01 00 00 05 03 00\r
-T 42 05 00 00 22 4C 04 00 00 ED 43 4E 04 00 00\r
+T 56 06 00 00 22 4C 04 00 00 ED 43 4E 04 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T 49 05 00 00 DD 6E 04 DD 66 05 DD 4E 08 DD 46\r
+T 5D 06 00 00 DD 6E 04 DD 66 05 DD 4E 0A DD 46\r
 R 00 00 01 00\r
-T 54 05 00 00 09 09 01 05 00 09 22 5C 04 00 00\r
+T 68 06 00 00 0B 09 01 05 00 09 22 5C 04 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T 5D 05 00 00 21 01 00 22 06 04 00 00 21 FF FF\r
+T 71 06 00 00 21 01 00 22 06 04 00 00 21 FF FF\r
 R 00 00 01 00 00 08 03 00\r
-T 66 05 00 00 22 04 04 00 00 2A 14 06 00 00 7E\r
+T 7A 06 00 00 22 04 04 00 00 2A 14 06 00 00 7E\r
 R 00 00 01 00 00 05 03 00 00 0A 03 00\r
-T 6D 05 00 00 F6 01 77 2A 14 06 00 00 7E F6 02\r
+T 81 06 00 00 F6 01 77 2A 14 06 00 00 7E F6 02\r
 R 00 00 01 00 00 08 03 00\r
-T 76 05 00 00 77 ED 4B 04 06 00 00 2A\r
+T 8A 06 00 00 77 ED 4B 04 06 00 00 2A\r
 R 00 00 01 00 00 07 03 00\r
-T 7C 05 00 00 08 06 00 00 A7 ED 42 29 29 29 DD\r
+T 90 06 00 00 08 06 00 00 A7 ED 42 29 29 29 DD\r
 R 00 00 01 00 00 04 03 00\r
-T 85 05 00 00 75 DE DD 74 DF DD 6E 04 DD 66 05\r
+T 99 06 00 00 75 DE DD 74 DF DD 6E 04 DD 66 05\r
 R 00 00 01 00\r
-T 90 05 00 00 29 29 29 DD 75 DC DD 74 DD\r
+T A4 06 00 00 29 29 29 DD 75 DC DD 74 DD\r
 R 00 00 01 00\r
-T 99 05 00 00\r
+T AD 06 00 00\r
 R 00 00 01 00\r
-T 99 05 00 00 DD 6E DE DD 66 DF DD 4E DC DD 46\r
+T AD 06 00 00 DD 6E DE DD 66 DF DD 4E DC DD 46\r
 R 00 00 01 00\r
-T A4 05 00 00 DD A7 ED 42 28 26\r
+T B8 06 00 00 DD A7 ED 42 28 26\r
 R 00 00 01 00\r
-T AA 05 00 00\r
+T BE 06 00 00\r
 R 00 00 01 00\r
-T AA 05 00 00 06 03 DD 5E DC DD 56 DD CD\r
+T BE 06 00 00 06 03 DD 5E DC DD 56 DD CD\r
 R 00 00 01 00\r
-T B3 05 00 00 00 00 00 00 2A 14 06 00 00 19 DD\r
+T C7 06 00 00 00 00 00 00 2A 14 06 00 00 19 DD\r
 R 00 00 01 00 02 04 00 00 00 09 03 00\r
-T BA 05 00 00 7E DC E6 07 47 3E 01 CD\r
+T CE 06 00 00 7E DC E6 07 47 3E 01 CD\r
 R 00 00 01 00\r
-T C2 05 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
-R 00 00 01 00 02 04 1D 00\r
-T CB 05 00 00 DD 34 DD\r
+T D6 06 00 00 00 00 00 00 B6 77 DD 34 DC 20 03\r
+R 00 00 01 00 02 04 1E 00\r
+T DF 06 00 00 DD 34 DD\r
 R 00 00 01 00\r
-T CE 05 00 00\r
+T E2 06 00 00\r
 R 00 00 01 00\r
-T CE 05 00 00 18 C9\r
+T E2 06 00 00 18 C9\r
 R 00 00 01 00\r
-T D0 05 00 00\r
+T E4 06 00 00\r
 R 00 00 01 00\r
-T D0 05 00 00 2A 0A 06 00 00 E5 2A 08 06 00 00\r
+T E4 06 00 00 2A 0A 06 00 00 E5 2A 08 06 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 03 00\r
-T D7 05 00 00 E5 2A 06 06 00 00 E5 2A\r
+T EB 06 00 00 E5 2A 06 06 00 00 E5 2A\r
 R 00 00 01 00 00 06 03 00\r
-T DD 05 00 00 04 06 00 00 E5 ED 5B 14 06 00 00\r
+T F1 06 00 00 04 06 00 00 E5 ED 5B 14 06 00 00\r
 R 00 00 01 00 00 04 03 00 00 0B 03 00\r
-T E4 05 00 00 CD 70 0B 00 00 E1 E1 E1 E1 01\r
-R 00 00 01 00 00 05 01 00\r
-T EC 05 00 00 04 04 00 00 21 05 00 DD 5E 08 DD\r
+T F8 06 00 00 3E 5D 0D 00 00 21 5D 0D 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T FE 06 00 00 00 00 00 00 E1 E1 E1 E1 01\r
+R 00 00 01 00 02 04 11 00\r
+T 05 07 00 00 04 04 00 00 21 05 00 DD 5E 0A DD\r
 R 00 00 01 00 00 04 03 00\r
-T F5 05 00 00 56 09 19 EB CD 30 00 00 00 01\r
-R 00 00 01 00 00 09 01 00\r
-T FD 05 00 00 80 07 00 00 DD 6E 04 DD 66 05 DD\r
+T 0E 07 00 00 56 0B 19 EB 3E 3F 00 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 15 07 00 00 3F 00 00 00 CD 00 00 00 00 01\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T 1B 07 00 00 80 07 00 00 DD 6E 04 DD 66 05 DD\r
 R 00 00 01 00 00 04 04 00\r
-T 06 06 00 00 5E 08 DD 56 09 19 11 05 00 19 EB\r
-R 00 00 01 00\r
-T 11 06 00 00 CD 30 00 00 00 11 04 00 CD\r
-R 00 00 01 00 00 05 01 00\r
-T 18 06 00 00 00 00 00 00 DD 75 FE DD 74 FF 01\r
-R 00 00 01 00 00 04 01 00\r
-T 21 06 00 00 1E 00 C5 4D 44 21 06 00 39 5D 54\r
-R 00 00 01 00\r
-T 2C 06 00 00 CD 00 00 00 00 E1 DD 4E FE DD 46\r
-R 00 00 01 00 02 05 0E 00\r
-T 35 06 00 00 FF 11 04 00 CD 30 00 00 00 C3\r
-R 00 00 01 00 00 09 01 00\r
-T 3D 06 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0C 00\r
-T 3F 06 00 00\r
-R 00 00 01 00\r
-T 3F 06 00 00 CD 00 00 00 00 FE FD 3A\r
-R 00 00 01 00 02 05 16 00\r
-T 45 06 00 00 83 09 00 00 B7 28 0E\r
+T 24 07 00 00 5E 0A DD 56 0B 19 11 05 00 19 EB\r
+R 00 00 01 00\r
+T 2F 07 00 00 3E 3F 00 00 00 21 3F 00 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 35 07 00 00 00 00 00 00 11 04 00 3E\r
+R 00 00 01 00 02 04 11 00\r
+T 3B 07 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 40 07 00 00 00 00 00 00 DD 75 FE DD 74 FF 01\r
+R 00 00 01 00 02 04 11 00\r
+T 49 07 00 00 1E 00 C5 4D 44 21 06 00 39 5D 54\r
+R 00 00 01 00\r
+T 54 07 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 0D 00 02 0A 0D 00\r
+T 5A 07 00 00 00 00 00 00 E1 DD 4E FE DD 46 FF\r
+R 00 00 01 00 02 04 11 00\r
+T 63 07 00 00 11 04 00 3E 3F 00 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T 69 07 00 00 3F 00 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T 6F 07 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 05 00\r
+T 71 07 00 00\r
+R 00 00 01 00\r
+T 71 07 00 00 CD 00 00 00 00 FE FD 3A\r
+R 00 00 01 00 02 05 17 00\r
+T 77 07 00 00 83 09 00 00 B7 28 18\r
 R 00 00 01 00 00 04 04 00\r
-T 4A 06 00 00\r
-R 00 00 01 00\r
-T 4A 06 00 00 21 C7 00 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T 51 06 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T 58 06 00 00\r
-R 00 00 01 00\r
-T 58 06 00 00 21 00 02 E5 0E AA 21 04 00 39 5D\r
-R 00 00 01 00\r
-T 63 06 00 00 54 CD 00 00 00 00 E1 21 00 00 39\r
-R 00 00 01 00 02 06 03 00\r
-T 6C 06 00 00 AF 77 23 77\r
+T 7C 07 00 00\r
+R 00 00 01 00\r
+T 7C 07 00 00 21 C7 00 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 82 07 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 89 07 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T 8F 07 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T 94 07 00 00\r
+R 00 00 01 00\r
+T 94 07 00 00 21 00 02 E5 0E AA 21 04 00 39 5D\r
+R 00 00 01 00\r
+T 9F 07 00 00 54 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 02 00 02 0B 02 00\r
+T A5 07 00 00 CD 00 00 00 00 E1 21 00 00 39 AF\r
+R 00 00 01 00 02 05 11 00\r
+T AE 07 00 00 77 23 77\r
 R 00 00 01 00\r
-T 70 06 00 00\r
+T B1 07 00 00\r
 R 00 00 01 00\r
-T 70 06 00 00 DD 4E 02 DD 46 03 21 00 00 39 56\r
+T B1 07 00 00 DD 4E 02 DD 46 03 21 00 00 39 56\r
 R 00 00 01 00\r
-T 7B 06 00 00 23 66 6A A7 ED 42 30 1B\r
+T BC 07 00 00 23 66 6A A7 ED 42 30 20\r
 R 00 00 01 00\r
-T 83 06 00 00\r
+T C4 07 00 00\r
 R 00 00 01 00\r
-T 83 06 00 00 21 02 00 39 4D 44 21 00 00 39 5E\r
+T C4 07 00 00 21 02 00 39 4D 44 21 00 00 39 5E\r
 R 00 00 01 00\r
-T 8E 06 00 00 23 56 CD 30 00 00 00 21 00 00 39\r
-R 00 00 01 00 00 07 01 00\r
-T 97 06 00 00 34 23 20 01 34\r
+T CF 07 00 00 23 56 3E 3F 00 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T D4 07 00 00 3F 00 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T DA 07 00 00 00 00 39 34 23 20 01 34\r
 R 00 00 01 00\r
-T 9C 06 00 00\r
+T E2 07 00 00\r
 R 00 00 01 00\r
-T 9C 06 00 00 18 D2\r
+T E2 07 00 00 18 CD\r
 R 00 00 01 00\r
-T 9E 06 00 00\r
+T E4 07 00 00\r
 R 00 00 01 00\r
-T 9E 06 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0C 00\r
-T A1 06 00 00\r
+T E4 07 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 05 00\r
+T E7 07 00 00\r
 R 00 00 01 00\r
-T A1 06 00 00 CD 00 00 00 00 F4 FF AF DD 77 F8\r
-R 00 00 01 00 02 05 16 00\r
-T AA 06 00 00 DD 77 F9 DD 36 FA 01 DD 36 FB 00\r
+T E7 07 00 00 CD 00 00 00 00 F4 FF AF DD 77 F8\r
+R 00 00 01 00 02 05 17 00\r
+T F0 07 00 00 DD 77 F9 DD 36 FA 01 DD 36 FB 00\r
 R 00 00 01 00\r
-T B5 06 00 00 DD 6E 02 DD 66 03 DD 75 FC DD 74\r
+T FB 07 00 00 DD 6E 02 DD 66 03 DD 75 FC DD 74\r
 R 00 00 01 00\r
-T C0 06 00 00 FD\r
+T 06 08 00 00 FD\r
 R 00 00 01 00\r
-T C1 06 00 00\r
+T 07 08 00 00\r
 R 00 00 01 00\r
-T C1 06 00 00 DD 4E 02 DD 46 03 DD 6E FA DD 66\r
+T 07 08 00 00 DD 4E 02 DD 46 03 DD 6E FA DD 66\r
 R 00 00 01 00\r
-T CC 06 00 00 FB CD 00 00 00 00 D2 8F 07 00 00\r
-R 00 00 01 00 02 06 19 00 00 0B 01 00\r
-T D3 06 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
+T 12 08 00 00 FB CD 00 00 00 00 D2 E0 08 00 00\r
+R 00 00 01 00 02 06 1A 00 00 0B 01 00\r
+T 19 08 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
 R 00 00 01 00\r
-T DE 06 00 00 46 05 09 46 23 66 68 DD 75 FE DD\r
+T 24 08 00 00 46 05 09 46 23 66 68 DD 75 FE DD\r
 R 00 00 01 00\r
-T E9 06 00 00 74 FF 7E FE 2D C2 8F 07 00 00\r
+T 2F 08 00 00 74 FF 7E FE 2D C2 E0 08 00 00\r
 R 00 00 01 00 00 0A 01 00\r
-T F1 06 00 00\r
+T 37 08 00 00\r
 R 00 00 01 00\r
-T F1 06 00 00\r
+T 37 08 00 00\r
 R 00 00 01 00\r
-T F1 06 00 00\r
+T 37 08 00 00\r
 R 00 00 01 00\r
-T F1 06 00 00 DD 34 FE 20 03 DD 34 FF\r
+T 37 08 00 00 DD 34 FE 20 03 DD 34 FF\r
 R 00 00 01 00\r
-T F9 06 00 00\r
+T 3F 08 00 00\r
 R 00 00 01 00\r
-T F9 06 00 00 DD 34 FA 20 03 DD 34 FB\r
+T 3F 08 00 00 DD 34 FA 20 03 DD 34 FB\r
 R 00 00 01 00\r
-T 01 07 00 00\r
+T 47 08 00 00\r
 R 00 00 01 00\r
-T 01 07 00 00 DD 6E FC DD 66 FD 2B DD 75 FC DD\r
+T 47 08 00 00 DD 6E FC DD 66 FD 2B DD 75 FC DD\r
 R 00 00 01 00\r
-T 0C 07 00 00 74 FD\r
+T 52 08 00 00 74 FD\r
 R 00 00 01 00\r
-T 0E 07 00 00\r
+T 54 08 00 00\r
 R 00 00 01 00\r
-T 0E 07 00 00 DD 6E FE DD 66 FF AF B6 28 74\r
+T 54 08 00 00 DD 6E FE DD 66 FF AF B6 28 7F\r
 R 00 00 01 00\r
-T 18 07 00 00\r
+T 5E 08 00 00\r
 R 00 00 01 00\r
-T 18 07 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
+T 5E 08 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
 R 00 00 01 00\r
-T 23 07 00 00 74 FF 2B 5E CD 00 00 00 00 0A 00\r
+T 69 08 00 00 74 FF 2B 5E CD 00 00 00 00 0A 00\r
 R 00 00 01 00 02 09 0A 00\r
-T 2C 07 00 00 46 4C 51 56 59 66 6C 71 76 79\r
+T 72 08 00 00 46 4C 51 56 59 66 6C 71 76 79\r
 R 00 00 01 00\r
-T 36 07 00 00 6F 07 00 00 4C 07 00 00\r
+T 7C 08 00 00 B5 08 00 00 92 08 00 00\r
 R 00 00 01 00 00 04 01 00 00 08 01 00\r
-T 3A 07 00 00 61 07 00 00 5A 07 00 00\r
+T 80 08 00 00 A7 08 00 00 A0 08 00 00\r
 R 00 00 01 00 00 04 01 00 00 08 01 00\r
-T 3E 07 00 00 68 07 00 00 53 07 00 00\r
+T 84 08 00 00 AE 08 00 00 99 08 00 00\r
 R 00 00 01 00 00 04 01 00 00 08 01 00\r
-T 42 07 00 00 4C 07 00 00 61 07 00 00\r
+T 88 08 00 00 92 08 00 00 A7 08 00 00\r
 R 00 00 01 00 00 04 01 00 00 08 01 00\r
-T 46 07 00 00 5A 07 00 00 68 07 00 00\r
+T 8C 08 00 00 A0 08 00 00 AE 08 00 00\r
 R 00 00 01 00 00 04 01 00 00 08 01 00\r
-T 4A 07 00 00 53 07 00 00\r
+T 90 08 00 00 99 08 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 4C 07 00 00\r
+T 92 08 00 00\r
 R 00 00 01 00\r
-T 4C 07 00 00 3E 01 32 81 09 00 00 18 37\r
+T 92 08 00 00 3E 01 32 81 09 00 00 18 41\r
 R 00 00 01 00 00 07 04 00\r
-T 53 07 00 00\r
+T 99 08 00 00\r
 R 00 00 01 00\r
-T 53 07 00 00 3E 01 32 80 09 00 00 18 30\r
+T 99 08 00 00 3E 01 32 80 09 00 00 18 3A\r
 R 00 00 01 00 00 07 04 00\r
-T 5A 07 00 00\r
+T A0 08 00 00\r
 R 00 00 01 00\r
-T 5A 07 00 00 3E 01 32 82 09 00 00 18 29\r
+T A0 08 00 00 3E 01 32 82 09 00 00 18 33\r
 R 00 00 01 00 00 07 04 00\r
-T 61 07 00 00\r
+T A7 08 00 00\r
 R 00 00 01 00\r
-T 61 07 00 00 3E 01 32 83 09 00 00 18 22\r
+T A7 08 00 00 3E 01 32 83 09 00 00 18 2C\r
 R 00 00 01 00 00 07 04 00\r
-T 68 07 00 00\r
+T AE 08 00 00\r
 R 00 00 01 00\r
-T 68 07 00 00 3E 01 32 84 09 00 00 18 1B\r
+T AE 08 00 00 3E 01 32 84 09 00 00 18 25\r
 R 00 00 01 00 00 07 04 00\r
-T 6F 07 00 00\r
+T B5 08 00 00\r
 R 00 00 01 00\r
-T 6F 07 00 00 DD 6E FE DD 66 FF E5 21\r
+T B5 08 00 00 DD 6E FE DD 66 FF E5 21\r
 R 00 00 01 00\r
-T 77 07 00 00 E0 00 00 00 E5 21 00 00 00 00 E5\r
+T BD 08 00 00 E0 00 00 00 E5 21 00 00 00 00 E5\r
 R 00 00 01 00 00 04 02 00 02 0A 06 00\r
-T 7E 07 00 00 CD 00 00 00 00 F1 F1 F1 11 01 00\r
-R 00 00 01 00 02 05 21 00\r
-T 87 07 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 22 00\r
-T 8A 07 00 00\r
-R 00 00 01 00\r
-T 8A 07 00 00 18 82\r
-R 00 00 01 00\r
-T 8C 07 00 00\r
+T C4 08 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 23 00 02 0A 23 00\r
+T CA 08 00 00 00 00 00 00 F1 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 04 11 00\r
+T D3 08 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 24 00 02 09 24 00\r
+T D8 08 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 11 00\r
+T DA 08 00 00\r
+R 00 00 01 00\r
+T DA 08 00 00 C3 54 08 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T DD 08 00 00\r
 R 00 00 01 00\r
-T 8C 07 00 00 C3 C1 06 00 00\r
+T DD 08 00 00 C3 07 08 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 8F 07 00 00\r
+T E0 08 00 00\r
 R 00 00 01 00\r
-T 8F 07 00 00 01 04 80 DD 6E FC DD 66 FD 3E 80\r
+T E0 08 00 00 01 04 80 DD 6E FC DD 66 FD 3E 80\r
 R 00 00 01 00\r
-T 9A 07 00 00 AC 67 ED 42 30 13\r
+T EB 08 00 00 AC 67 ED 42 30 1D\r
 R 00 00 01 00\r
-T A0 07 00 00\r
+T F1 08 00 00\r
 R 00 00 01 00\r
-T A0 07 00 00 21 F3 00 00 00 E5 21 00 00 00 00\r
+T F1 08 00 00 21 F3 00 00 00 E5 21 00 00 00 00\r
 R 00 00 01 00 00 05 02 00 02 0B 06 00\r
-T A7 07 00 00 E5 CD 00 00 00 00 F1 F1 11 01 00\r
-R 00 00 01 00 02 06 21 00\r
-T B0 07 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 22 00\r
-T B3 07 00 00\r
+T F8 08 00 00 E5 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 23 00 02 0B 23 00\r
+T FE 08 00 00 CD 00 00 00 00 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 05 11 00\r
+T 07 09 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 24 00 02 09 24 00\r
+T 0C 09 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 11 00\r
+T 0E 09 00 00\r
 R 00 00 01 00\r
-T B3 07 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
+T 0E 09 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
 R 00 00 01 00\r
-T BE 07 00 00 46 05 09 4E 23 46 11 02 00 00 00\r
+T 19 09 00 00 46 05 09 4E 23 46 11 02 00 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T C7 07 00 00 CD 00 00 00 00 21 02 80 E5 21\r
-R 00 00 01 00 02 05 13 00\r
-T CF 07 00 00 02 00 00 00 E5 CD 00 00 00 00 F1\r
-R 00 00 01 00 00 04 03 00 02 0A 1A 00\r
-T D6 07 00 00 F1 22 00 00 00 00 CB 7C 28 1A\r
-R 00 00 01 00 00 06 03 00\r
-T DE 07 00 00\r
-R 00 00 01 00\r
-T DE 07 00 00 21 24 01 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T E5 07 00 00 F1 11 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 06 12 00 02 0B 02 00\r
-T EC 07 00 00 11 02 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 05 03 00 02 0A 0D 00\r
-T F3 07 00 00 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 07 22 00\r
-T F8 07 00 00\r
-R 00 00 01 00\r
-T F8 07 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
-R 00 00 01 00\r
-T 03 08 00 00 46 05 09 23 23 5E 23 56 CD\r
-R 00 00 01 00\r
-T 0C 08 00 00 00 00 00 00 DD 75 F4 DD 74 F5 DD\r
-R 00 00 01 00 02 04 17 00\r
-T 15 08 00 00 6E FA DD 66 FB 29 09 01 04 00 09\r
-R 00 00 01 00\r
-T 20 08 00 00 5E 23 56 CD 00 00 00 00 DD 75 F6\r
-R 00 00 01 00 02 08 17 00\r
-T 29 08 00 00 DD 74 F7 DD 4E FC DD 46 FD 21\r
-R 00 00 01 00\r
-T 33 08 00 00 04 00 CD 00 00 00 00 30 1E\r
-R 00 00 01 00 02 07 19 00\r
-T 3A 08 00 00\r
-R 00 00 01 00\r
-T 3A 08 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
-R 00 00 01 00\r
-T 45 08 00 00 46 05 09 01 06 00 09 5E 23 56 CD\r
-R 00 00 01 00\r
-T 50 08 00 00 00 00 00 00 DD 75 F8 DD 74 F9\r
-R 00 00 01 00 02 04 17 00\r
-T 58 08 00 00\r
-R 00 00 01 00\r
-T 58 08 00 00 01 64 00 DD 6E F4 DD 66 F5 A7 ED\r
-R 00 00 01 00\r
-T 63 08 00 00 42 38 25 01 1E 00 DD 5E F4 DD 56\r
-R 00 00 01 00\r
-T 6E 08 00 00 F5 CD 00 00 00 00 DD 6E F6 DD 66\r
-R 00 00 01 00 02 06 1E 00\r
-T 77 08 00 00 F7 A7 ED 52 30 0E DD 4E F8 DD 46\r
+T 22 09 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 13 00 02 0A 13 00\r
+T 28 09 00 00 00 00 00 00 21 02 80 E5 21\r
+R 00 00 01 00 02 04 11 00\r
+T 2F 09 00 00 02 00 00 00 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 0A 1B 00\r
+T 35 09 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 1B 00 02 09 11 00\r
+T 3C 09 00 00 22 00 00 00 00 CB 7C 28 2E\r
+R 00 00 01 00 00 05 03 00\r
+T 43 09 00 00\r
+R 00 00 01 00\r
+T 43 09 00 00 21 24 01 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 49 09 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 50 09 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 12 00 2B 0A 01 00\r
+T 56 09 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T 5C 09 00 00 02 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 0C 00\r
+T 61 09 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0C 00 02 09 11 00\r
+T 67 09 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 24 00\r
+T 6C 09 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 24 00 02 09 11 00\r
+T 71 09 00 00\r
+R 00 00 01 00\r
+T 71 09 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
+R 00 00 01 00\r
+T 7C 09 00 00 46 05 09 23 23 5E 23 56 3E\r
+R 00 00 01 00\r
+T 85 09 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 18 00 02 09 18 00\r
+T 8A 09 00 00 00 00 00 00 DD 75 F4 DD 74 F5 DD\r
+R 00 00 01 00 02 04 11 00\r
+T 93 09 00 00 6E FA DD 66 FB 29 09 01 04 00 09\r
+R 00 00 01 00\r
+T 9E 09 00 00 5E 23 56 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 18 00\r
+T A4 09 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 18 00 02 09 11 00\r
+T AB 09 00 00 F6 DD 74 F7 DD 4E FC DD 46 FD 21\r
+R 00 00 01 00\r
+T B6 09 00 00 04 00 CD 00 00 00 00 30 23\r
+R 00 00 01 00 02 07 1A 00\r
+T BD 09 00 00\r
+R 00 00 01 00\r
+T BD 09 00 00 DD 6E FA DD 66 FB 29 DD 4E 04 DD\r
+R 00 00 01 00\r
+T C8 09 00 00 46 05 09 01 06 00 09 5E 23 56 3E\r
+R 00 00 01 00\r
+T D3 09 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 18 00 02 09 18 00\r
+T D8 09 00 00 00 00 00 00 DD 75 F8 DD 74 F9\r
+R 00 00 01 00 02 04 11 00\r
+T E0 09 00 00\r
+R 00 00 01 00\r
+T E0 09 00 00 01 64 00 DD 6E F4 DD 66 F5 A7 ED\r
+R 00 00 01 00\r
+T EB 09 00 00 42 38 25 01 1E 00 DD 5E F4 DD 56\r
+R 00 00 01 00\r
+T F6 09 00 00 F5 CD 00 00 00 00 DD 6E F6 DD 66\r
+R 00 00 01 00 02 06 1F 00\r
+T FF 09 00 00 F7 A7 ED 52 30 0E DD 4E F8 DD 46\r
 R 00 00 01 00\r
-T 82 08 00 00 F9 21 64 00 A7 ED 42 30 13\r
+T 0A 0A 00 00 F9 21 64 00 A7 ED 42 30 1D\r
 R 00 00 01 00\r
-T 8B 08 00 00\r
+T 13 0A 00 00\r
 R 00 00 01 00\r
-T 8B 08 00 00\r
+T 13 0A 00 00\r
 R 00 00 01 00\r
-T 8B 08 00 00\r
+T 13 0A 00 00\r
 R 00 00 01 00\r
-T 8B 08 00 00 21 31 01 00 00 E5 21 00 00 00 00\r
+T 13 0A 00 00 21 31 01 00 00 E5 21 00 00 00 00\r
 R 00 00 01 00 00 05 02 00 02 0B 06 00\r
-T 92 08 00 00 E5 CD 00 00 00 00 F1 F1 11 01 00\r
-R 00 00 01 00 02 06 21 00\r
-T 9B 08 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 22 00\r
-T 9E 08 00 00\r
+T 1A 0A 00 00 E5 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 23 00 02 0B 23 00\r
+T 20 0A 00 00 CD 00 00 00 00 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 05 11 00\r
+T 29 0A 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 24 00 02 09 24 00\r
+T 2E 0A 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 11 00\r
+T 30 0A 00 00\r
 R 00 00 01 00\r
-T 9E 08 00 00 01 00 00 21 1E 08 22 04 06 00 00\r
+T 30 0A 00 00 01 00 00 21 1E 08 22 04 06 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T A7 08 00 00 ED 43 06 06 00 00 11 FF FF D5 11\r
+T 39 0A 00 00 ED 43 06 06 00 00 11 FF FF D5 11\r
 R 00 00 01 00 00 06 03 00\r
-T B0 08 00 00 FC FF D5 C5 E5 21 03 00 C1 09 EB\r
+T 42 0A 00 00 FC FF D5 C5 E5 21 03 00 C1 09 EB\r
 R 00 00 01 00\r
-T BB 08 00 00 21 00 00 C1 ED 4A 4D 44 EB CD\r
+T 4D 0A 00 00 21 00 00 C1 ED 4A 4D 44 EB CD\r
 R 00 00 01 00\r
-T C5 08 00 00 00 00 00 00 22 04 06 00 00 ED 43\r
-R 00 00 01 00 02 04 15 00 00 09 03 00\r
-T CC 08 00 00 06 06 00 00 C5 E5 DD 6E F6 DD 66\r
+T 57 0A 00 00 00 00 00 00 22 04 06 00 00 ED 43\r
+R 00 00 01 00 02 04 16 00 00 09 03 00\r
+T 5E 0A 00 00 06 06 00 00 C5 E5 DD 6E F6 DD 66\r
 R 00 00 01 00 00 04 03 00\r
-T D5 08 00 00 F7 29 29 29 01 FF FF 09 EB 06 03\r
+T 67 0A 00 00 F7 29 29 29 01 FF FF 09 EB 06 03\r
 R 00 00 01 00\r
-T E0 08 00 00 CD 00 00 00 00 EB 11 00 00 C1 09\r
+T 72 0A 00 00 CD 00 00 00 00 EB 11 00 00 C1 09\r
 R 00 00 01 00 02 05 00 00\r
-T E9 08 00 00 EB C1 ED 4A E5 D5 21 01 00 C1 09\r
+T 7B 0A 00 00 EB C1 ED 4A E5 D5 21 01 00 C1 09\r
 R 00 00 01 00\r
-T F4 08 00 00 EB 21 00 00 C1 ED 4A 4D 44 EB 22\r
+T 86 0A 00 00 EB 21 00 00 C1 ED 4A 4D 44 EB 22\r
 R 00 00 01 00\r
-T FF 08 00 00 08 06 00 00 ED 43 0A 06 00 00 11\r
+T 91 0A 00 00 08 06 00 00 ED 43 0A 06 00 00 11\r
 R 00 00 01 00 00 04 03 00 00 0A 03 00\r
-T 06 09 00 00 FF FF D5 11 FC FF D5 C5 E5 21\r
+T 98 0A 00 00 FF FF D5 11 FC FF D5 C5 E5 21\r
 R 00 00 01 00\r
-T 10 09 00 00 03 00 C1 09 EB 21 00 00 C1 ED 4A\r
+T A2 0A 00 00 03 00 C1 09 EB 21 00 00 C1 ED 4A\r
 R 00 00 01 00\r
-T 1B 09 00 00 4D 44 EB CD 00 00 00 00 22\r
-R 00 00 01 00 02 08 15 00\r
-T 22 09 00 00 08 06 00 00 ED 43 0A 06 00 00 C5\r
+T AD 0A 00 00 4D 44 EB CD 00 00 00 00 22\r
+R 00 00 01 00 02 08 16 00\r
+T B4 0A 00 00 08 06 00 00 ED 43 0A 06 00 00 C5\r
 R 00 00 01 00 00 04 03 00 00 0A 03 00\r
-T 29 09 00 00 E5 21 FF FF DD 4E F4 DD 46 F5 09\r
+T BB 0A 00 00 E5 21 FF FF DD 4E F4 DD 46 F5 09\r
 R 00 00 01 00\r
-T 34 09 00 00 EB 06 03 CD 00 00 00 00 EB 11\r
+T C6 0A 00 00 EB 06 03 CD 00 00 00 00 EB 11\r
 R 00 00 01 00 02 08 00 00\r
-T 3C 09 00 00 00 00 C1 09 EB C1 ED 4A E5 D5 21\r
+T CE 0A 00 00 00 00 C1 09 EB C1 ED 4A E5 D5 21\r
 R 00 00 01 00\r
-T 47 09 00 00 01 00 C1 09 EB 21 00 00 C1 ED 4A\r
+T D9 0A 00 00 01 00 C1 09 EB 21 00 00 C1 ED 4A\r
 R 00 00 01 00\r
-T 52 09 00 00 4D 44 EB 22 0C 06 00 00 ED 43\r
+T E4 0A 00 00 4D 44 EB 22 0C 06 00 00 ED 43\r
 R 00 00 01 00 00 08 03 00\r
-T 5A 09 00 00 0E 06 00 00 11 FF FF D5 11 FC FF\r
+T EC 0A 00 00 0E 06 00 00 11 FF FF D5 11 FC FF\r
 R 00 00 01 00 00 04 03 00\r
-T 63 09 00 00 D5 C5 E5 21 03 00 C1 09 EB 21\r
+T F5 0A 00 00 D5 C5 E5 21 03 00 C1 09 EB 21\r
 R 00 00 01 00\r
-T 6D 09 00 00 00 00 C1 ED 4A 4D 44 EB CD\r
+T FF 0A 00 00 00 00 C1 ED 4A 4D 44 EB CD\r
 R 00 00 01 00\r
-T 76 09 00 00 00 00 00 00 22 0C 06 00 00 ED 43\r
-R 00 00 01 00 02 04 15 00 00 09 03 00\r
-T 7D 09 00 00 0E 06 00 00 22 10 06 00 00 ED 43\r
+T 08 0B 00 00 00 00 00 00 22 0C 06 00 00 ED 43\r
+R 00 00 01 00 02 04 16 00 00 09 03 00\r
+T 0F 0B 00 00 0E 06 00 00 22 10 06 00 00 ED 43\r
 R 00 00 01 00 00 04 03 00 00 09 03 00\r
-T 84 09 00 00 12 06 00 00 C5 E5 21 FF 01 C1 09\r
+T 16 0B 00 00 12 06 00 00 C5 E5 21 FF 01 C1 09\r
 R 00 00 01 00 00 04 03 00\r
-T 8D 09 00 00 EB 21 00 00 C1 ED 4A 4D 44 EB 3E\r
+T 1F 0B 00 00 EB 21 00 00 C1 ED 4A 4D 44 EB 3E\r
 R 00 00 01 00\r
-T 98 09 00 00 09 CD 00 00 00 00 01 FB FF 09 DD\r
-R 00 00 01 00 02 06 1F 00\r
-T A1 09 00 00 75 F8 DD 74 F9 3A 84 09 00 00 B7\r
+T 2A 0B 00 00 09 CD 00 00 00 00 01 FB FF 09 DD\r
+R 00 00 01 00 02 06 21 00\r
+T 33 0B 00 00 75 F8 DD 74 F9 3A 84 09 00 00 B7\r
 R 00 00 01 00 00 0A 04 00\r
-T AA 09 00 00 28 7D\r
+T 3C 0B 00 00 28 7D\r
 R 00 00 01 00\r
-T AC 09 00 00\r
+T 3E 0B 00 00\r
 R 00 00 01 00\r
-T AC 09 00 00 21 FF FF DD 4E F4 DD 46 F5 09 EB\r
+T 3E 0B 00 00 21 FF FF DD 4E F4 DD 46 F5 09 EB\r
 R 00 00 01 00\r
-T B7 09 00 00 06 03 CD 00 00 00 00 EB 01 00 00\r
+T 49 0B 00 00 06 03 CD 00 00 00 00 EB 01 00 00\r
 R 00 00 01 00 02 07 00 00\r
-T C0 09 00 00 C5 E5 2A 0C 06 00 00 C1 09 EB 2A\r
+T 52 0B 00 00 C5 E5 2A 0C 06 00 00 C1 09 EB 2A\r
 R 00 00 01 00 00 07 03 00\r
-T C9 09 00 00 0E 06 00 00 C1 ED 4A E5 D5 21\r
+T 5B 0B 00 00 0E 06 00 00 C1 ED 4A E5 D5 21\r
 R 00 00 01 00 00 04 03 00\r
-T D1 09 00 00 01 00 C1 09 EB 21 00 00 C1 ED 4A\r
+T 63 0B 00 00 01 00 C1 09 EB 21 00 00 C1 ED 4A\r
 R 00 00 01 00\r
-T DC 09 00 00 4D 44 EB 22 10 06 00 00 ED 43\r
+T 6E 0B 00 00 4D 44 EB 22 10 06 00 00 ED 43\r
 R 00 00 01 00 00 08 03 00\r
-T E4 09 00 00 12 06 00 00 11 FF FF D5 11 FC FF\r
+T 76 0B 00 00 12 06 00 00 11 FF FF D5 11 FC FF\r
 R 00 00 01 00 00 04 03 00\r
-T ED 09 00 00 D5 C5 E5 21 03 00 C1 09 EB 21\r
+T 7F 0B 00 00 D5 C5 E5 21 03 00 C1 09 EB 21\r
 R 00 00 01 00\r
-T F7 09 00 00 00 00 C1 ED 4A 4D 44 EB CD\r
+T 89 0B 00 00 00 00 C1 ED 4A 4D 44 EB CD\r
 R 00 00 01 00\r
-T 00 0A 00 00 00 00 00 00 22 10 06 00 00 ED 43\r
-R 00 00 01 00 02 04 15 00 00 09 03 00\r
-T 07 0A 00 00 12 06 00 00 C5 E5 21 FF 01 C1 09\r
+T 92 0B 00 00 00 00 00 00 22 10 06 00 00 ED 43\r
+R 00 00 01 00 02 04 16 00 00 09 03 00\r
+T 99 0B 00 00 12 06 00 00 C5 E5 21 FF 01 C1 09\r
 R 00 00 01 00 00 04 03 00\r
-T 10 0A 00 00 EB 21 00 00 C1 ED 4A 4D 44 EB 3E\r
+T A2 0B 00 00 EB 21 00 00 C1 ED 4A 4D 44 EB 3E\r
 R 00 00 01 00\r
-T 1B 0A 00 00 09 CD 00 00 00 00 01 FB FF 09 DD\r
-R 00 00 01 00 02 06 1F 00\r
-T 24 0A 00 00 75 F8 DD 74 F9\r
+T AD 0B 00 00 09 CD 00 00 00 00 01 FB FF 09 DD\r
+R 00 00 01 00 02 06 21 00\r
+T B6 0B 00 00 75 F8 DD 74 F9\r
 R 00 00 01 00\r
-T 29 0A 00 00\r
+T BB 0B 00 00\r
 R 00 00 01 00\r
-T 29 0A 00 00 DD 6E F8 DD 66 F9 E5 DD 6E F6 DD\r
+T BB 0B 00 00 DD 6E F8 DD 66 F9 E5 DD 6E F6 DD\r
 R 00 00 01 00\r
-T 34 0A 00 00 66 F7 E5 DD 6E F4 DD 66 F5 E5 21\r
+T C6 0B 00 00 66 F7 E5 DD 6E F4 DD 66 F5 E5 21\r
 R 00 00 01 00\r
-T 3F 0A 00 00 02 00 00 00 E5 21 47 01 00 00 E5\r
+T D1 0B 00 00 02 00 00 00 E5 21 47 01 00 00 E5\r
 R 00 00 01 00 00 04 03 00 00 0A 02 00\r
-T 46 0A 00 00 CD 00 00 00 00 F1 F1 F1 F1 F1 11\r
-R 00 00 01 00 02 05 05 00\r
-T 4F 0A 00 00 00 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 02 04 12 00 02 09 02 00\r
-T 55 0A 00 00 80 01 00 00 CD 40 01 00 00 7D B4\r
-R 00 00 01 00 00 04 02 00 00 09 01 00\r
-T 5C 0A 00 00 20 06\r
-R 00 00 01 00\r
-T 5E 0A 00 00\r
-R 00 00 01 00\r
-T 5E 0A 00 00 11 01 00 CD 00 00 00 00\r
-R 00 00 01 00 02 08 22 00\r
-T 64 0A 00 00\r
-R 00 00 01 00\r
-T 64 0A 00 00 21 8A 01 00 00 E5 CD 00 00 00 00\r
-R 00 00 01 00 00 05 02 00 02 0B 05 00\r
-T 6B 0A 00 00 F1 3A 80 09 00 00 B7 28 09\r
-R 00 00 01 00 00 06 04 00\r
-T 72 0A 00 00\r
+T D8 0B 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 04 00 02 0A 04 00\r
+T DE 0B 00 00 00 00 00 00 F1 F1 F1 F1 F1 11\r
+R 00 00 01 00 02 04 11 00\r
+T E6 0B 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 12 00 2B 09 01 00\r
+T EB 0B 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 01 00 02 09 11 00\r
+T F1 0B 00 00 80 01 00 00 3E E0 01 00 00 21\r
+R 00 00 01 00 00 04 02 00 29 09 01 00\r
+T F6 0B 00 00 E0 01 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T FD 0B 00 00 20 0B\r
+R 00 00 01 00\r
+T FF 0B 00 00\r
+R 00 00 01 00\r
+T FF 0B 00 00 11 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 24 00\r
+T 05 0C 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 24 00 02 09 11 00\r
+T 0A 0C 00 00\r
+R 00 00 01 00\r
+T 0A 0C 00 00 21 8A 01 00 00 E5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 04 00\r
+T 10 0C 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 04 00 02 0A 11 00\r
+T 17 0C 00 00 3A 80 09 00 00 B7 28 0E\r
+R 00 00 01 00 00 05 04 00\r
+T 1D 0C 00 00\r
 R 00 00 01 00\r
-T 72 0A 00 00 DD 5E F4 DD 56 F5 CD 3F 06 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 7B 0A 00 00\r
+T 1D 0C 00 00 DD 5E F4 DD 56 F5 3E 71 07 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 25 0C 00 00 21 71 07 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 05 01 00 02 0A 11 00\r
+T 2B 0C 00 00\r
 R 00 00 01 00\r
-T 7B 0A 00 00 ED 4B 04 06 00 00 2A 08 06 00 00\r
+T 2B 0C 00 00 ED 4B 04 06 00 00 2A 08 06 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 82 0A 00 00 A7 ED 42 EB CD 00 00 00 00 22\r
-R 00 00 01 00 02 09 20 00\r
-T 8A 0A 00 00 14 06 00 00 7D B4 20 0A\r
+T 32 0C 00 00 A7 ED 42 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 22 00\r
+T 39 0C 00 00 00 00 00 00 CD 00 00 00 00 22\r
+R 00 00 01 00 02 04 22 00 02 09 11 00\r
+T 3F 0C 00 00 14 06 00 00 7D B4 20 0B\r
 R 00 00 01 00 00 04 03 00\r
-T 90 0A 00 00\r
+T 45 0C 00 00\r
 R 00 00 01 00\r
-T 90 0A 00 00 DD 36 FE 8C 01 00 00 DD 36 FF\r
+T 45 0C 00 00 DD 36 FE 8C 01 00 00 DD 36 FF\r
 R 00 00 01 00 09 07 02 00\r
-T 97 0A 00 00 8C 01 00 00 18 6C\r
-R 00 00 01 00 89 04 02 00\r
-T 9A 0A 00 00\r
+T 4C 0C 00 00 8C 01 00 00 C3 D0 0C 00 00\r
+R 00 00 01 00 89 04 02 00 00 09 01 00\r
+T 50 0C 00 00\r
 R 00 00 01 00\r
-T 9A 0A 00 00 ED 4B 04 06 00 00 2A 08 06 00 00\r
+T 50 0C 00 00 ED 4B 04 06 00 00 2A 08 06 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T A1 0A 00 00 A7 ED 42 E5 0E 00 ED 5B\r
+T 57 0C 00 00 A7 ED 42 E5 0E 00 ED 5B\r
 R 00 00 01 00\r
-T A9 0A 00 00 14 06 00 00 CD 00 00 00 00 E1 ED\r
-R 00 00 01 00 00 04 03 00 02 09 03 00\r
-T B0 0A 00 00 4B 08 06 00 00 2A 10 06 00 00 A7\r
+T 5F 0C 00 00 14 06 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 02 00\r
+T 64 0C 00 00 00 00 00 00 CD 00 00 00 00 E1 ED\r
+R 00 00 01 00 02 04 02 00 02 09 11 00\r
+T 6B 0C 00 00 4B 08 06 00 00 2A 10 06 00 00 A7\r
 R 00 00 01 00 00 05 03 00 00 0A 03 00\r
-T B7 0A 00 00 ED 42 EB CD 00 00 00 00 22\r
-R 00 00 01 00 02 08 20 00\r
-T BE 0A 00 00 16 06 00 00 7D B4 20 0A\r
+T 72 0C 00 00 ED 42 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 22 00\r
+T 78 0C 00 00 00 00 00 00 CD 00 00 00 00 22\r
+R 00 00 01 00 02 04 22 00 02 09 11 00\r
+T 7E 0C 00 00 16 06 00 00 7D B4 20 0A\r
 R 00 00 01 00 00 04 03 00\r
-T C4 0A 00 00\r
+T 84 0C 00 00\r
 R 00 00 01 00\r
-T C4 0A 00 00 DD 36 FE 99 01 00 00 DD 36 FF\r
+T 84 0C 00 00 DD 36 FE 99 01 00 00 DD 36 FF\r
 R 00 00 01 00 09 07 02 00\r
-T CB 0A 00 00 99 01 00 00 18 38\r
+T 8B 0C 00 00 99 01 00 00 18 42\r
 R 00 00 01 00 89 04 02 00\r
-T CE 0A 00 00\r
+T 8E 0C 00 00\r
 R 00 00 01 00\r
-T CE 0A 00 00 ED 4B 08 06 00 00 2A 10 06 00 00\r
+T 8E 0C 00 00 ED 4B 08 06 00 00 2A 10 06 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T D5 0A 00 00 A7 ED 42 E5 0E 00 ED 5B\r
+T 95 0C 00 00 A7 ED 42 E5 0E 00 ED 5B\r
 R 00 00 01 00\r
-T DD 0A 00 00 16 06 00 00 CD 00 00 00 00 E1 3A\r
-R 00 00 01 00 00 04 03 00 02 09 03 00\r
-T E4 0A 00 00 84 09 00 00 B7 28 4D\r
+T 9D 0C 00 00 16 06 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 02 00\r
+T A2 0C 00 00 00 00 00 00 CD 00 00 00 00 E1 3A\r
+R 00 00 01 00 02 04 02 00 02 09 11 00\r
+T A9 0C 00 00 84 09 00 00 B7 28 61\r
 R 00 00 01 00 00 04 04 00\r
-T E9 0A 00 00\r
+T AE 0C 00 00\r
 R 00 00 01 00\r
-T E9 0A 00 00 ED 4B 0C 06 00 00 2A 10 06 00 00\r
+T AE 0C 00 00 ED 4B 0C 06 00 00 2A 10 06 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T F0 0A 00 00 A7 ED 42 EB CD 00 00 00 00 22\r
-R 00 00 01 00 02 09 20 00\r
-T F8 0A 00 00 18 06 00 00 7D B4 20 23\r
+T B5 0C 00 00 A7 ED 42 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 22 00\r
+T BC 0C 00 00 00 00 00 00 CD 00 00 00 00 22\r
+R 00 00 01 00 02 04 22 00 02 09 11 00\r
+T C2 0C 00 00 18 06 00 00 7D B4 20 2D\r
 R 00 00 01 00 00 04 03 00\r
-T FE 0A 00 00\r
+T C8 0C 00 00\r
 R 00 00 01 00\r
-T FE 0A 00 00 DD 36 FE A6 01 00 00 DD 36 FF\r
+T C8 0C 00 00 DD 36 FE A6 01 00 00 DD 36 FF\r
 R 00 00 01 00 09 07 02 00\r
-T 05 0B 00 00 A6 01 00 00\r
+T CF 0C 00 00 A6 01 00 00\r
 R 00 00 01 00 89 04 02 00\r
-T 06 0B 00 00\r
+T D0 0C 00 00\r
 R 00 00 01 00\r
-T 06 0B 00 00 DD 6E FE DD 66 FF E5 21\r
+T D0 0C 00 00 DD 6E FE DD 66 FF E5 21\r
 R 00 00 01 00\r
-T 0E 0B 00 00 B2 01 00 00 E5 21 00 00 00 00 E5\r
+T D8 0C 00 00 B2 01 00 00 E5 21 00 00 00 00 E5\r
 R 00 00 01 00 00 04 02 00 02 0A 06 00\r
-T 15 0B 00 00 CD 00 00 00 00 F1 F1 F1 11 01 00\r
-R 00 00 01 00 02 05 21 00\r
-T 1E 0B 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 22 00\r
-T 21 0B 00 00\r
-R 00 00 01 00\r
-T 21 0B 00 00 ED 4B 0C 06 00 00 2A 10 06 00 00\r
+T DF 0C 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 23 00 02 0A 23 00\r
+T E5 0C 00 00 00 00 00 00 F1 F1 F1 11 01 00 3E\r
+R 00 00 01 00 02 04 11 00\r
+T EE 0C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 24 00 02 09 24 00\r
+T F3 0C 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 11 00\r
+T F5 0C 00 00\r
+R 00 00 01 00\r
+T F5 0C 00 00 ED 4B 0C 06 00 00 2A 10 06 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 28 0B 00 00 A7 ED 42 E5 0E 00 ED 5B\r
+T FC 0C 00 00 A7 ED 42 E5 0E 00 ED 5B\r
 R 00 00 01 00\r
-T 30 0B 00 00 18 06 00 00 CD 00 00 00 00 E1\r
-R 00 00 01 00 00 04 03 00 02 09 03 00\r
-T 36 0B 00 00\r
+T 04 0D 00 00 18 06 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 02 00\r
+T 09 0D 00 00 00 00 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 02 04 02 00 02 09 11 00\r
+T 0F 0D 00 00\r
 R 00 00 01 00\r
-T 36 0B 00 00 DD 6E F8 DD 66 F9 E5 DD 4E F6 DD\r
+T 0F 0D 00 00 DD 6E F8 DD 66 F9 E5 DD 4E F6 DD\r
 R 00 00 01 00\r
-T 41 0B 00 00 46 F7 DD 5E F4 DD 56 F5 CD\r
+T 1A 0D 00 00 46 F7 DD 5E F4 DD 56 F5 3E\r
 R 00 00 01 00\r
-T 4A 0B 00 00 96 01 00 00 E1 ED 5B 00 00 00 00\r
-R 00 00 01 00 00 04 01 00 00 0B 03 00\r
-T 51 0B 00 00 CD 00 00 00 00 3A 83 09 00 00 B7\r
-R 00 00 01 00 02 05 08 00 00 0A 04 00\r
-T 58 0B 00 00 28 0D\r
+T 23 0D 00 00 4A 02 00 00 21 4A 02 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 28 0D 00 00 00 00 00 00 E1 ED 5B 00 00 00 00\r
+R 00 00 01 00 02 04 11 00 00 0B 03 00\r
+T 2F 0D 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 08 00 02 0A 08 00\r
+T 35 0D 00 00 00 00 00 00 3A 83 09 00 00 B7 28\r
+R 00 00 01 00 02 04 11 00 00 09 04 00\r
+T 3C 0D 00 00 12\r
 R 00 00 01 00\r
-T 5A 0B 00 00\r
+T 3D 0D 00 00\r
 R 00 00 01 00\r
-T 5A 0B 00 00 21 02 00 00 00 E5 21 CD 01 00 00\r
+T 3D 0D 00 00 21 02 00 00 00 E5 21 CD 01 00 00\r
 R 00 00 01 00 00 05 03 00 00 0B 02 00\r
-T 61 0B 00 00 E5 CD 00 00 00 00 F1 F1\r
-R 00 00 01 00 02 06 05 00\r
-T 67 0B 00 00\r
+T 44 0D 00 00 E5 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 04 00 02 0B 04 00\r
+T 4A 0D 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 05 11 00\r
+T 4F 0D 00 00\r
 R 00 00 01 00\r
-T 67 0B 00 00 11 00 00 CD 00 00 00 00 C3\r
-R 00 00 01 00 02 08 22 00\r
-T 6E 0B 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0C 00\r
-T 70 0B 00 00\r
+T 4F 0D 00 00 11 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 24 00\r
+T 55 0D 00 00 00 00 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 02 04 24 00 02 09 11 00\r
+T 5B 0D 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 05 00\r
+T 5D 0D 00 00\r
 R 00 00 01 00\r
-T 70 0B 00 00 CD 00 00 00 00 FA FF DD 6E 08 DD\r
-R 00 00 01 00 02 05 16 00\r
-T 79 0B 00 00 66 09 DD 75 FC DD 74 FD\r
+T 5D 0D 00 00 CD 00 00 00 00 FA FF DD 6E 0A DD\r
+R 00 00 01 00 02 05 17 00\r
+T 66 0D 00 00 66 0B DD 75 FC DD 74 FD\r
 R 00 00 01 00\r
-T 81 0B 00 00\r
+T 6E 0D 00 00\r
 R 00 00 01 00\r
-T 81 0B 00 00 DD 6E 0E DD 66 0F E5 DD 6E 0C DD\r
+T 6E 0D 00 00 DD 6E 10 DD 66 11 E5 DD 6E 0E DD\r
 R 00 00 01 00\r
-T 8C 0B 00 00 66 0D E5 DD 6E FC DD 66 FD 01\r
+T 79 0D 00 00 66 0F E5 DD 6E FC DD 66 FD 01\r
 R 00 00 01 00\r
-T 96 0B 00 00 00 00 CD 00 00 00 00 D2\r
-R 00 00 01 00 02 07 14 00\r
-T 9C 0B 00 00 4F 0C 00 00\r
+T 83 0D 00 00 00 00 CD 00 00 00 00 D2\r
+R 00 00 01 00 02 07 15 00\r
+T 89 0D 00 00 50 0E 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 9E 0B 00 00\r
+T 8B 0D 00 00\r
 R 00 00 01 00\r
-T 9E 0B 00 00 DD 4E 0C DD 46 0D DD 6E FC DD 66\r
+T 8B 0D 00 00 DD 4E 0E DD 46 0F DD 6E FC DD 66\r
 R 00 00 01 00\r
-T A9 0B 00 00 FD 3E 02 84 67 7D E6 00 5F 7C E6\r
+T 96 0D 00 00 FD 3E 02 84 67 7D E6 00 5F 7C E6\r
 R 00 00 01 00\r
-T B4 0B 00 00 FE 57 CD 00 00 00 00 DD 75 FE DD\r
-R 00 00 01 00 02 07 18 00\r
-T BD 0B 00 00 74 FF DD 4E FC DD 46 FD A7 ED 42\r
+T A1 0D 00 00 FE 57 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 19 00\r
+T A6 0D 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 19 00 02 09 11 00\r
+T AD 0D 00 00 FE DD 74 FF DD 4E FC DD 46 FD A7\r
 R 00 00 01 00\r
-T C8 0B 00 00 01 00 02 A7 ED 42 30 16\r
+T B8 0D 00 00 ED 42 01 00 02 A7 ED 42 30 1B\r
 R 00 00 01 00\r
-T D0 0B 00 00\r
+T C2 0D 00 00\r
 R 00 00 01 00\r
-T D0 0B 00 00 06 09 DD 5E FC DD 56 FD CD\r
+T C2 0D 00 00 06 09 DD 5E FC DD 56 FD CD\r
 R 00 00 01 00\r
-T D9 0B 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
-R 00 00 01 00 02 04 00 00 00 09 01 00\r
-T E0 0B 00 00 FA DD 74 FB 18 08\r
+T CB 0D 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 00 00 29 09 01 00\r
+T D0 0D 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T D7 0D 00 00 FA DD 74 FB 18 08\r
 R 00 00 01 00\r
-T E6 0B 00 00\r
+T DD 0D 00 00\r
 R 00 00 01 00\r
-T E6 0B 00 00 DD 36 FA 02 02 00 00 DD 36 FB\r
+T DD 0D 00 00 DD 36 FA 02 02 00 00 DD 36 FB\r
 R 00 00 01 00 09 07 03 00\r
-T ED 0B 00 00 02 02 00 00\r
+T E4 0D 00 00 02 02 00 00\r
 R 00 00 01 00 89 04 03 00\r
-T EE 0B 00 00\r
+T E5 0D 00 00\r
 R 00 00 01 00\r
-T EE 0B 00 00 DD 4E FC DD 46 FD DD 6E FE DD 66\r
+T E5 0D 00 00 DD 4E FC DD 46 FD DD 6E FE DD 66\r
 R 00 00 01 00\r
-T F9 0B 00 00 FF A7 ED 42 E5 79 E6 FF 6F 78 E6\r
+T F0 0D 00 00 FF A7 ED 42 E5 79 E6 FF 6F 78 E6\r
 R 00 00 01 00\r
-T 04 0C 00 00 01 67 DD 5E FA DD 56 FB 19 4D 44\r
+T FB 0D 00 00 01 67 DD 5E FA DD 56 FB 19 4D 44\r
 R 00 00 01 00\r
-T 0F 0C 00 00 DD 5E 08 DD 56 09 DD 6E FC DD 66\r
+T 06 0E 00 00 DD 5E 0A DD 56 0B DD 6E FC DD 66\r
 R 00 00 01 00\r
-T 1A 0C 00 00 FD A7 ED 52 DD 5E 02 DD 56 03 19\r
+T 11 0E 00 00 FD A7 ED 52 DD 5E 02 DD 56 03 19\r
 R 00 00 01 00\r
-T 25 0C 00 00 EB CD 00 00 00 00 E1 DD 4E FA DD\r
-R 00 00 01 00 02 06 0E 00\r
-T 2E 0C 00 00 46 FB C5 06 09 DD 5E FC DD 56 FD\r
+T 1C 0E 00 00 EB 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 0D 00 02 0B 0D 00\r
+T 22 0E 00 00 CD 00 00 00 00 E1 DD 4E FA DD 46\r
+R 00 00 01 00 02 05 11 00\r
+T 2B 0E 00 00 FB C5 06 09 DD 5E FC DD 56 FD CD\r
 R 00 00 01 00\r
-T 39 0C 00 00 CD 00 00 00 00 C1 CD 30 00 00 00\r
-R 00 00 01 00 02 05 00 00 00 0B 01 00\r
-T 40 0C 00 00 DD 6E FE DD 66 FF DD 75 FC DD 74\r
+T 36 0E 00 00 00 00 00 00 3E 3F 00 00 00 21\r
+R 00 00 01 00 02 04 00 00 29 09 01 00\r
+T 3B 0E 00 00 3F 00 00 00 C1 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 04 01 00 02 0A 11 00\r
+T 42 0E 00 00 6E FE DD 66 FF DD 75 FC DD 74 FD\r
 R 00 00 01 00\r
-T 4B 0C 00 00 FD C3 81 0B 00 00\r
-R 00 00 01 00 00 06 01 00\r
-T 4F 0C 00 00\r
+T 4D 0E 00 00 C3 6E 0D 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 50 0E 00 00\r
 R 00 00 01 00\r
-T 4F 0C 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0C 00\r
+T 50 0E 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 05 00\r
 T 00 00 00 00\r
 R 00 00 02 00\r
 T 00 00 00 00 52 65 61 64 20 6F 66 20 62 6C 6F\r
@@ -1421,9 +1629,9 @@ T 84 09 00 00
 R 00 00 04 00\r
 T 84 09 00 00\r
 R 00 00 04 00\r
-T 00 00 00 00 43 38 33 30 30 33 30 33 31 31 30\r
+T 00 00 00 00 43 36 45 46 30 33 30 35 30 39 32\r
 R 00 00 05 00\r
-T 0B 00 00 00 34 35 32 34 34 31 00 80 CD A3 06\r
+T 0B 00 00 00 30 33 39 31 30 31 00 80 CD A3 06\r
 R 00 00 05 00\r
 T 16 00 00 00 CD AB 05 CD FD 04 18 22 00 00 00\r
 R 00 00 05 00\r
index 14d4e49..1cb4914 100644 (file)
@@ -60,12 +60,17 @@ link @bd.w32
 @if errorlevel 1 goto failure\r
 copy bd.exe ..\bin\r
 \r
+rem compile utils in large mode, once, for large-mode mkfs and fsck\r
+\r
 iccz80 -S -w -ml -v1 -z -A -I..\..\include\ -I..\kernel\uzi\ -DUTIL -DNATIVE -DDEBUG=1 utils\r
 @if errorlevel 1 goto failure\r
 del utils.r01\r
 as-z80 -l -o utils.s01\r
 @if errorlevel 1 goto failure\r
 \r
+call mklink-l mkfs\r
+echo utils >> mkfs.lnk\r
+\r
 iccz80 -S -w -ml -v1 -z -A -I..\..\include\ -I..\kernel\uzi\ -DUTIL -DNATIVE -DDEBUG=1 mkfs\r
 @if errorlevel 1 goto failure\r
 del mkfs.r01\r
@@ -77,6 +82,9 @@ link-z80 -f mkfs
 ihex2bin -l mkfs.i86 ..\..\bin\large\mkfs\r
 @if errorlevel 1 goto failure\r
 \r
+call mklink-l fsck\r
+echo utils >> fsck.lnk\r
+\r
 iccz80 -S -w -ml -v1 -z -A -I..\..\include\ -I..\kernel\uzi\ -DUTIL -DNATIVE -DDEBUG=1 fsck\r
 @if errorlevel 1 goto failure\r
 del fsck.r01\r
@@ -88,6 +96,42 @@ link-z80 -f fsck
 ihex2bin -l fsck.i86 ..\..\bin\large\fsck\r
 @if errorlevel 1 goto failure\r
 \r
+rem compile utils in banked mode, once, for banked-mode mkfs and fsck\r
+\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\include\ -I..\kernel\uzi\ -DUTIL -DNATIVE -DDEBUG=1 utils\r
+@if errorlevel 1 goto failure\r
+del utils.r01\r
+as-z80 -l -o utils.s01\r
+@if errorlevel 1 goto failure\r
+\r
+call mklink-b mkfs\r
+echo utils >> mkfs.lnk\r
+\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\include\ -I..\kernel\uzi\ -DUTIL -DNATIVE -DDEBUG=1 mkfs\r
+@if errorlevel 1 goto failure\r
+del mkfs.r01\r
+as-z80 -l -o mkfs.s01\r
+@if errorlevel 1 goto failure\r
+\r
+link-z80 -f mkfs\r
+@if errorlevel 1 goto failure\r
+ihex2bin -l mkfs.i86 ..\..\bin\banked\mkfs\r
+@if errorlevel 1 goto failure\r
+\r
+call mklink-b fsck\r
+echo utils >> fsck.lnk\r
+\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\include\ -I..\kernel\uzi\ -DUTIL -DNATIVE -DDEBUG=1 fsck\r
+@if errorlevel 1 goto failure\r
+del fsck.r01\r
+as-z80 -l -o fsck.s01\r
+@if errorlevel 1 goto failure\r
+\r
+link-z80 -f fsck\r
+@if errorlevel 1 goto failure\r
+ihex2bin -l fsck.i86 ..\..\bin\banked\fsck\r
+@if errorlevel 1 goto failure\r
+\r
 iccz80 -S -w -ml -v1 -z -A -I..\..\include\ -I..\kernel\uzi\ -DUTIL -DNATIVE -DDEBUG=1 bd -l bd\r
 @if errorlevel 1 goto failure\r
 del bd.r01\r
index 04d3813..86aded3 100644 (file)
@@ -71,7 +71,11 @@ uchar line[128+1];
 uchar f_pause = 0;\r
 \r
 int xls(char *option, char *path);\r
-int xchmod(char *path, char *modes);\r
+int xchmod(char *modes, char *path); /* Nick reversed argument order */\r
+#if 1 /* Nick */\r
+int xchown(char *uidno, char *path);\r
+int xchgrp(char *gidno, char *path);\r
+#endif\r
 int xumask(char *masks);\r
 int xmknod(char *path, char *modes, char *devs, char *devs1);\r
 int xmkdir(char *path);\r
@@ -113,6 +117,10 @@ char *help[] = {
        "mkdir name",\r
        "mknod name mode major minor",\r
        "chmod mode name",\r
+#if 1 /* Nick */\r
+       "chown decimaluid name",\r
+       "chgrp decimalgid name",\r
+#endif\r
        "[b]get dosfilename [uzixfilename]",\r
        "[b]put uzixfilename [dosfilename]",\r
        "type|cat filename",\r
@@ -187,6 +195,16 @@ int execute(cmd, a1, a2, a3, a4)
                if (*a1 && *a2)\r
                        xchmod(a1, a2);\r
        }\r
+#if 1 /* Nick */\r
+       else if (eq(cmd, "chown")) {\r
+               if (*a1 && *a2)\r
+                       xchown(a1, a2);\r
+       }\r
+       else if (eq(cmd, "chgrp")) {\r
+               if (*a1 && *a2)\r
+                       xchgrp(a1, a2);\r
+       }\r
+#endif\r
        else if (eq(cmd, "ln")) {\r
                if (*a1 && *a2)\r
                        UZIXlink(a1, a2);\r
index 1b4d72e..29b22fa 100644 (file)
Binary files a/src/fsutil/ucp.exe and b/src/fsutil/ucp.exe differ
index 43e53cf..44d8238 100644 (file)
@@ -1,13 +1,13 @@
  ucp\r
 \r
- Timestamp is 3e6cd0f0 (Tue Mar 11 04:52:48 2003)\r
+ Timestamp is 3ebb8562 (Fri May 09 20:39:30 2003)\r
 \r
  Preferred load address is 00400000\r
 \r
  Start         Length     Name                   Class\r
- 0001:00000000 000197f7H .text                   CODE\r
- 0002:00000000 00000696H .rdata                  DATA\r
- 0002:00000696 00000000H .edata                  DATA\r
+ 0001:00000000 0001aa8fH .text                   CODE\r
+ 0002:00000000 000006d0H .rdata                  DATA\r
+ 0002:000006d0 00000000H .edata                  DATA\r
  0003:00000000 00000104H .CRT$XCA                DATA\r
  0003:00000104 00000104H .CRT$XCZ                DATA\r
  0003:00000208 00000104H .CRT$XIA                DATA\r
  0003:00000724 00000104H .CRT$XPZ                DATA\r
  0003:00000828 00000104H .CRT$XTA                DATA\r
  0003:0000092c 00000104H .CRT$XTZ                DATA\r
- 0003:00000a30 000026eeH .data                   DATA\r
- 0003:00003120 000076a4H .bss                    DATA\r
+ 0003:00000a30 00004f6fH .data                   DATA\r
+ 0003:000059a0 00006c04H .bss                    DATA\r
  0004:00000000 00000014H .idata$2                DATA\r
  0004:00000014 00000014H .idata$3                DATA\r
- 0004:00000028 00000138H .idata$4                DATA\r
- 0004:00000160 00000138H .idata$5                DATA\r
- 0004:00000298 00000559H .idata$6                DATA\r
+ 0004:00000028 00000144H .idata$4                DATA\r
+ 0004:0000016c 00000144H .idata$5                DATA\r
+ 0004:000002b0 0000059dH .idata$6                DATA\r
 \r
   Address         Publics by Value              Rva+Base     Lib:Object\r
 \r
- 0001:000008a0       _pse                       004018a0 f   ucp.obj\r
- 0001:000008e6       _dohelp                    004018e6 f   ucp.obj\r
- 0001:0000092d       _eq                        0040192d f   ucp.obj\r
- 0001:00000947       _execute                   00401947 f   ucp.obj\r
- 0001:00000ea9       _usage                     00401ea9 f   ucp.obj\r
- 0001:00000ec7       _main                      00401ec7 f   ucp.obj\r
- 0001:000019e0       _ldir                      004029e0 f   ucpsub.obj\r
- 0001:00001a21       _devdir                    00402a21 f   ucpsub.obj\r
- 0001:00001a9c       _prot                      00402a9c f   ucpsub.obj\r
- 0001:00001aae       _dols                      00402aae f   ucpsub.obj\r
- 0001:0000206e       _xls                       0040306e f   ucpsub.obj\r
- 0001:00002164       _xchmod                    00403164 f   ucpsub.obj\r
- 0001:000021e4       _xumask                    004031e4 f   ucpsub.obj\r
- 0001:00002265       _xmknod                    00403265 f   ucpsub.obj\r
- 0001:00002399       _xmkdir                    00403399 f   ucpsub.obj\r
- 0001:000023e0       _xget                      004033e0 f   ucpsub.obj\r
- 0001:0000258b       _xput                      0040358b f   ucpsub.obj\r
- 0001:00002722       _xtype                     00403722 f   ucpsub.obj\r
- 0001:000027c0       _xdump                     004037c0 f   ucpsub.obj\r
- 0001:00002a7e       _xunlink                   00403a7e f   ucpsub.obj\r
- 0001:00002b64       _xrmdir                    00403b64 f   ucpsub.obj\r
- 0001:00002d68       _xdf                       00403d68 f   ucpsub.obj\r
- 0001:00002e27       _xalign                    00403e27 f   ucpsub.obj\r
- 0001:00002f1c       _xualign                   00403f1c f   ucpsub.obj\r
- 0001:00003560       _wd_read                   00404560 f   devhd.obj\r
- 0001:00003597       _wd_write                  00404597 f   devhd.obj\r
- 0001:000035ce       _setup                     004045ce f   devhd.obj\r
- 0001:0000372b       _chkstat                   0040472b f   devhd.obj\r
- 0001:00003771       _wd_open                   00404771 f   devhd.obj\r
- 0001:00003810       _bread                     00404810 f   devio.obj\r
- 0001:00003947       _bfree                     00404947 f   devio.obj\r
- 0001:000039fe       _zerobuf                   004049fe f   devio.obj\r
- 0001:00003a85       _bufsync                   00404a85 f   devio.obj\r
- 0001:00003af9       _bfind                     00404af9 f   devio.obj\r
- 0001:00003b51       _freebuf                   00404b51 f   devio.obj\r
- 0001:00003c93       _bufdump                   00404c93 f   devio.obj\r
- 0001:00003d7a       _validdev                  00404d7a f   devio.obj\r
- 0001:00003e05       _bdreadwrite               00404e05 f   devio.obj\r
- 0001:00003e83       _cdreadwrite               00404e83 f   devio.obj\r
- 0001:00003ee9       _d_openclose               00404ee9 f   devio.obj\r
- 0001:00003f49       _d_ioctl                   00404f49 f   devio.obj\r
- 0001:00003f9f       _d_init                    00404f9f f   devio.obj\r
- 0001:00003ffe       _ok                        00404ffe f   devio.obj\r
- 0001:00004005       _ok_rdwr                   00405005 f   devio.obj\r
- 0001:0000400c       _nogood                    0040500c f   devio.obj\r
- 0001:00004014       _nogood_ioctl              00405014 f   devio.obj\r
- 0001:0000401c       _insq                      0040501c f   devio.obj\r
- 0001:0000408e       _remq                      0040508e f   devio.obj\r
- 0001:000040fc       _uninsq                    004050fc f   devio.obj\r
- 0001:0000416f       _clrq                      0040516f f   devio.obj\r
- 0001:000043f0       _mem_read                  004053f0 f   devmisc.obj\r
- 0001:00004451       _mem_write                 00405451 f   devmisc.obj\r
- 0001:000044b4       _null_write                004054b4 f   devmisc.obj\r
- 0001:000044be       _lpr_open                  004054be f   devmisc.obj\r
- 0001:000044cc       _lpr_close                 004054cc f   devmisc.obj\r
- 0001:000044e5       _lpr_write                 004054e5 f   devmisc.obj\r
- 0001:0000454b       _mt_read                   0040554b f   devmisc.obj\r
- 0001:00004553       _mt_write                  00405553 f   devmisc.obj\r
- 0001:0000455b       _mt_open                   0040555b f   devmisc.obj\r
- 0001:00004563       _mt_close                  00405563 f   devmisc.obj\r
- 0001:000045d0       _tty_read                  004055d0 f   devtty.obj\r
- 0001:00004783       _tty_write                 00405783 f   devtty.obj\r
- 0001:00004900       _tty_open                  00405900 f   devtty.obj\r
- 0001:00004997       _tty_close                 00405997 f   devtty.obj\r
- 0001:000049fb       _tty_ioctl                 004059fb f   devtty.obj\r
- 0001:00004b99       _tty_inproc                00405b99 f   devtty.obj\r
- 0001:00004f41       _tty_inproc_dummy          00405f41 f   devtty.obj\r
- 0001:00004f46       _echo                      00405f46 f   devtty.obj\r
- 0001:000051e0       _findfs                    004061e0 f   filesys.obj\r
- 0001:0000522c       _getfs                     0040622c f   filesys.obj\r
- 0001:00005281       _wr_inode                  00406281 f   filesys.obj\r
- 0001:00005354       _i_ref                     00406354 f   filesys.obj\r
- 0001:000053b2       _i_deref                   004063b2 f   filesys.obj\r
- 0001:00005489       _i_free                    00406489 f   filesys.obj\r
- 0001:00005522       __namei                    00406522 f   filesys.obj\r
- 0001:000056f9       _namei                     004066f9 f   filesys.obj\r
- 0001:00005a57       _srch_dir                  00406a57 f   filesys.obj\r
- 0001:00005b87       _srch_mt                   00406b87 f   filesys.obj\r
- 0001:00005be7       _i_open                    00406be7 f   filesys.obj\r
- 0001:00005e80       _ch_link                   00406e80 f   filesys.obj\r
- 0001:00006029       _filename                  00407029 f   filesys.obj\r
- 0001:000060d0       _namecomp                  004070d0 f   filesys.obj\r
- 0001:00006156       _newfile                   00407156 f   filesys.obj\r
- 0001:00006232       _doclose                   00407232 f   filesys.obj\r
- 0001:000062d3       _i_alloc                   004072d3 f   filesys.obj\r
- 0001:000063d8       _blk_alloc                 004073d8 f   filesys.obj\r
- 0001:00006512       _blk_free                  00407512 f   filesys.obj\r
- 0001:000065c0       _oft_alloc                 004075c0 f   filesys.obj\r
- 0001:00006630       _oft_deref                 00407630 f   filesys.obj\r
- 0001:00006688       _uf_alloc                  00407688 f   filesys.obj\r
- 0001:000066e0       _isdevice                  004076e0 f   filesys.obj\r
- 0001:00006727       _freeblk                   00407727 f   filesys.obj\r
- 0001:000067c8       _f_trunc                   004077c8 f   filesys.obj\r
- 0001:00006881       _bmap                      00407881 f   filesys.obj\r
- 0001:00006ae1       _validblk                  00407ae1 f   filesys.obj\r
- 0001:00006b60       _getinode                  00407b60 f   filesys.obj\r
- 0001:00006c3c       _getperm                   00407c3c f   filesys.obj\r
- 0001:00006cdc       _setftim                   00407cdc f   filesys.obj\r
- 0001:00006d46       _fmount                    00407d46 f   filesys.obj\r
- 0001:00006efe       _magic                     00407efe f   filesys.obj\r
- 0001:00006f28       _i_sync                    00407f28 f   filesys.obj\r
- 0001:00006f9d       _fs_sync                   00407f9d f   filesys.obj\r
- 0001:00007d40       _scsiop                    00408d40 f   hdasm.obj\r
- 0001:00007e60       _fs_init                   00408e60 f   machdep.obj\r
- 0001:00007e81       _valadr                    00408e81 f   machdep.obj\r
- 0001:00007e8b       _addtick                   00408e8b f   machdep.obj\r
- 0001:00007ee9       _incrtick                  00408ee9 f   machdep.obj\r
- 0001:00007f28       _calltrap                  00408f28 f   machdep.obj\r
- 0001:00007fae       _sttime                    00408fae f   machdep.obj\r
- 0001:00007fc6       _panic                     00408fc6 f   machdep.obj\r
- 0001:00008014       _warning                   00409014 f   machdep.obj\r
- 0001:00008048       _idump                     00409048 f   machdep.obj\r
- 0001:000082b0       _abort                     004092b0 f   main.obj\r
- 0001:000082ce       _rdtime                    004092ce f   main.obj\r
- 0001:00008370       _init2                     00409370 f   process.obj\r
- 0001:00008591       _psleep                    00409591 f   process.obj\r
- 0001:0000860d       _wakeup                    0040960d f   process.obj\r
- 0001:00008658       _getproc                   00409658 f   process.obj\r
- 0001:000086b1       _newproc                   004096b1 f   process.obj\r
- 0001:000087f1       _ptab_alloc                004097f1 f   process.obj\r
- 0001:000088a6       _clkint2                   004098a6 f   process.obj\r
- 0001:000089ea       _unix2                     004099ea f   process.obj\r
- 0001:00008a72       _chksigs                   00409a72 f   process.obj\r
- 0001:00008b30       _sgrpsig                   00409b30 f   process.obj\r
- 0001:00008b7c       _ssig                      00409b7c f   process.obj\r
- 0001:00008bf3       _sendsig                   00409bf3 f   process.obj\r
- 0001:00008c47       _dowait                    00409c47 f   process.obj\r
- 0001:00008fa0       _sys_NONE                  00409fa0 f   scall1.obj\r
- 0001:00008fb2       _sys_sync                  00409fb2 f   scall1.obj\r
- 0001:00008fc3       _sys_utime                 00409fc3 f   scall1.obj\r
- 0001:000090e4       _sys_close                 0040a0e4 f   scall1.obj\r
- 0001:000090f7       _truncateto0               0040a0f7 f   scall1.obj\r
- 0001:00009170       _sys_open                  0040a170 f   scall1.obj\r
- 0001:000094a9       _sys_link                  0040a4a9 f   scall1.obj\r
- 0001:000095f4       _sys_symlink               0040a5f4 f   scall1.obj\r
- 0001:000096e2       _sys_unlink                0040a6e2 f   scall1.obj\r
- 0001:000097fc       _sys_readwrite             0040a7fc f   scall1.obj\r
- 0001:00009892       _sys_lseek                 0040a892 f   scall1.obj\r
- 0001:00009970       _sys_chdir                 0040a970 f   scall1.obj\r
- 0001:000099ff       _sys_chroot                0040a9ff f   scall1.obj\r
- 0001:00009a3d       _sys_mknod                 0040aa3d f   scall1.obj\r
- 0001:00009b18       _sys_access                0040ab18 f   scall1.obj\r
- 0001:00009bff       _sys_chmod                 0040abff f   scall1.obj\r
- 0001:00009ce3       _sys_chown                 0040ace3 f   scall1.obj\r
- 0001:00009d0a       _stcpy                     0040ad0a f   scall1.obj\r
- 0001:00009da7       _sys_statfstat             0040ada7 f   scall1.obj\r
- 0001:00009e3a       _sys_falign                0040ae3a f   scall1.obj\r
- 0001:00009ea4       _sys_dup                   0040aea4 f   scall1.obj\r
- 0001:00009f2f       _sys_dup2                  0040af2f f   scall1.obj\r
- 0001:00009fdb       _sys_getfsys               0040afdb f   scall1.obj\r
- 0001:0000a036       _sys_ioctl                 0040b036 f   scall1.obj\r
- 0001:0000a0c9       _sys_mountumount           0040b0c9 f   scall1.obj\r
- 0001:0000a32c       _sys_time                  0040b32c f   scall1.obj\r
- 0001:0000a364       _exit0                     0040b364 f   scall1.obj\r
- 0001:0000a375       _n_creat                   0040b375 f   scall1.obj\r
- 0001:0000a531       _readwritei                0040b531 f   scall1.obj\r
- 0001:0000aa5b       _rwsetup                   0040ba5b f   scall1.obj\r
- 0001:0000ab08       _getfsys                   0040bb08 f   scall1.obj\r
- 0001:0000b410       _findprocess               0040c410 f   scall2.obj\r
- 0001:0000b475       _filldesc                  0040c475 f   scall2.obj\r
- 0001:0000b4ab       _sys_pipe                  0040c4ab f   scall2.obj\r
- 0001:0000b642       _sys_stime                 0040c642 f   scall2.obj\r
- 0001:0000b691       _sys_times                 0040c691 f   scall2.obj\r
- 0001:0000b6e0       _sys_brk                   0040c6e0 f   scall2.obj\r
- 0001:0000b71c       _sys_sbrk                  0040c71c f   scall2.obj\r
- 0001:0000b762       _sys_waitpid               0040c762 f   scall2.obj\r
- 0001:0000b7dd       _sys__exit                 0040c7dd f   scall2.obj\r
- 0001:0000b7f5       _doexit                    0040c7f5 f   scall2.obj\r
- 0001:0000b929       _sys_fork                  0040c929 f   scall2.obj\r
- 0001:0000b92e       _sys_pause                 0040c92e f   scall2.obj\r
- 0001:0000b94a       _sys_signal                0040c94a f   scall2.obj\r
- 0001:0000ba03       _sys_kill                  0040ca03 f   scall2.obj\r
- 0001:0000ba67       _sys_alarm                 0040ca67 f   scall2.obj\r
- 0001:0000ba8b       _sys_reboot                0040ca8b f   scall2.obj\r
- 0001:0000bade       _sys_getset                0040cade f   scall2.obj\r
- 0001:0000bf10       _bitmap_align              0040cf10 f   xip.obj\r
- 0001:0000c62a       _bitmap_ualign             0040d62a f   xip.obj\r
- 0001:0000c752       _bitmap_examine            0040d752 f   xip.obj\r
- 0001:0000c977       _bitmap_align_chase        0040d977 f   xip.obj\r
- 0001:0000cae2       _bitmap_align_bmap         0040dae2 f   xip.obj\r
- 0001:0000cd68       _bitmap_align_reverse      0040dd68 f   xip.obj\r
- 0001:0000ce53       _bitmap_align_recurse      0040de53 f   xip.obj\r
- 0001:0000d2d7       _bitmap_search             0040e2d7 f   xip.obj\r
- 0001:0000d469       _bitmap_reserve            0040e469 f   xip.obj\r
- 0001:0000d656       _bitmap_find               0040e656 f   xip.obj\r
- 0001:0000d895       _bitmap_get                0040e895 f   xip.obj\r
- 0001:0000d966       _bitmap_set                0040e966 f   xip.obj\r
- 0001:0000e010       _bzero                     0040f010 f   utils.obj\r
- 0001:0000e036       _bfill                     0040f036 f   utils.obj\r
- 0001:0000e05e       _bcopy                     0040f05e f   utils.obj\r
- 0001:0000e091       _int_min                   0040f091 f   utils.obj\r
- 0001:0000e0b2       _int_max                   0040f0b2 f   utils.obj\r
- 0001:0000e110       _xfs_init                  0040f110 f   xfs.obj\r
- 0001:0000e27e       _xfs_end                   0040f27e f   xfs.obj\r
- 0001:0000e2c5       _UZIXopen                  0040f2c5 f   xfs.obj\r
- 0001:0000e2ea       _UZIXclose                 0040f2ea f   xfs.obj\r
- 0001:0000e2fc       _UZIXcreat                 0040f2fc f   xfs.obj\r
- 0001:0000e321       _UZIXlink                  0040f321 f   xfs.obj\r
- 0001:0000e33c       _UZIXsymlink               0040f33c f   xfs.obj\r
- 0001:0000e357       _UZIXunlink                0040f357 f   xfs.obj\r
- 0001:0000e369       _UZIXread                  0040f369 f   xfs.obj\r
- 0001:0000e394       _UZIXwrite                 0040f394 f   xfs.obj\r
- 0001:0000e3bf       _UZIXlseek                 0040f3bf f   xfs.obj\r
- 0001:0000e3ee       _UZIXchdir                 0040f3ee f   xfs.obj\r
- 0001:0000e400       _UZIXmknod                 0040f400 f   xfs.obj\r
- 0001:0000e424       _UZIXsync                  0040f424 f   xfs.obj\r
- 0001:0000e42e       _UZIXaccess                0040f42e f   xfs.obj\r
- 0001:0000e449       _UZIXchmod                 0040f449 f   xfs.obj\r
- 0001:0000e464       _UZIXchown                 0040f464 f   xfs.obj\r
- 0001:0000e488       _UZIXstat                  0040f488 f   xfs.obj\r
- 0001:0000e4aa       _UZIXfstat                 0040f4aa f   xfs.obj\r
- 0001:0000e4cc       _UZIXfalign                0040f4cc f   xfs.obj\r
- 0001:0000e4e7       _UZIXdup                   0040f4e7 f   xfs.obj\r
- 0001:0000e4f9       _UZIXdup2                  0040f4f9 f   xfs.obj\r
- 0001:0000e514       _UZIXumask                 0040f514 f   xfs.obj\r
- 0001:0000e530       _UZIXgetfsys               0040f530 f   xfs.obj\r
- 0001:0000e550       _UZIXioctl                 0040f550 f   xfs.obj\r
- 0001:0000e574       _UZIXmount                 0040f574 f   xfs.obj\r
- 0001:0000e59f       _UZIXumount                0040f59f f   xfs.obj\r
- 0001:0000e5b8       _UZIXtime                  0040f5b8 f   xfs.obj\r
- 0001:0000e6f8       ___initstdio               0040f6f8 f   LIBC:_file.obj\r
- 0001:0000e79d       ___endstdio                0040f79d f   LIBC:_file.obj\r
- 0001:0000e7b1       _fgets                     0040f7b1 f   LIBC:fgets.obj\r
- 0001:0000e808       _fflush                    0040f808 f   LIBC:fflush.obj\r
- 0001:0000e843       __flush                    0040f843 f   LIBC:fflush.obj\r
- 0001:0000e89f       __flushall                 0040f89f f   LIBC:fflush.obj\r
- 0001:0000e915       _fprintf                   0040f915 f   LIBC:fprintf.obj\r
- 0001:0000e947       _printf                    0040f947 f   LIBC:printf.obj\r
- 0001:0000e980       _strcpy                    0040f980 f   LIBC:strcat.obj\r
- 0001:0000e990       _strcat                    0040f990 f   LIBC:strcat.obj\r
- 0001:0000ea70       __cinit                    0040fa70 f   LIBC:crt0dat.obj\r
- 0001:0000ea9d       _exit                      0040fa9d f   LIBC:crt0dat.obj\r
- 0001:0000eaae       __exit                     0040faae f   LIBC:crt0dat.obj\r
- 0001:0000eabf       __cexit                    0040fabf f   LIBC:crt0dat.obj\r
- 0001:0000eace       __c_exit                   0040face f   LIBC:crt0dat.obj\r
- 0001:0000eb90       _system                    0040fb90 f   LIBC:system.obj\r
- 0001:0000ec40       _strchr                    0040fc40 f   LIBC:strchr.obj\r
- 0001:0000ec46       ___from_strstr_to_strchr   0040fc46 f   LIBC:strchr.obj\r
- 0001:0000ecfc       _sscanf                    0040fcfc f   LIBC:sscanf.obj\r
- 0001:0000ed30       _fputs                     0040fd30 f   LIBC:fputs.obj\r
- 0001:0000ed73       __flsbuf                   0040fd73 f   LIBC:_flsbuf.obj\r
- 0001:0000ee90       _strlen                    0040fe90 f   LIBC:strlen.obj\r
- 0001:0000ef0b       __isctype                  0040ff0b f   LIBC:isctype.obj\r
- 0001:0000ef80       __fsopen                   0040ff80 f   LIBC:fopen.obj\r
- 0001:0000efa0       _fopen                     0040ffa0 f   LIBC:fopen.obj\r
- 0001:0000efb3       _sprintf                   0040ffb3 f   LIBC:sprintf.obj\r
- 0001:0000f010       _strncat                   00410010 f   LIBC:strncat.obj\r
- 0001:0000f133       _fclose                    00410133 f   LIBC:fclose.obj\r
- 0001:0000f189       _fread                     00410189 f   LIBC:fread.obj\r
- 0001:0000f271       _fwrite                    00410271 f   LIBC:fwrite.obj\r
- 0001:0000f37b       _atol                      0041037b f   LIBC:atox.obj\r
- 0001:0000f406       _atoi                      00410406 f   LIBC:atox.obj\r
- 0001:0000f411       __atoi64                   00410411 f   LIBC:atox.obj\r
- 0001:0000f4cb       __fputchar                 004104cb f   LIBC:fputchar.obj\r
- 0001:0000f4fa       _putchar                   004104fa f   LIBC:fputchar.obj\r
- 0001:0000f505       _localtime                 00410505 f   LIBC:localtim.obj\r
- 0001:0000f665       _time                      00410665 f   LIBC:time.obj\r
- 0001:0000f741       _mainCRTStartup            00410741 f   LIBC:crt0.obj\r
- 0001:0000f820       __amsg_exit                00410820 f   LIBC:crt0.obj\r
- 0001:0000f869       __ioinit                   00410869 f   LIBC:ioinit.obj\r
- 0001:0000fa14       __ioterm                   00410a14 f   LIBC:ioinit.obj\r
- 0001:0000fa37       _calloc                    00410a37 f   LIBC:calloc.obj\r
- 0001:0000fab4       __fcloseall                00410ab4 f   LIBC:closeall.obj\r
- 0001:0000fb0c       __filbuf                   00410b0c f   LIBC:_filbuf.obj\r
- 0001:0000fbe5       __commit                   00410be5 f   LIBC:commit.obj\r
- 0001:0000fc3c       __write                    00410c3c f   LIBC:write.obj\r
- 0001:0000fc3c       _write                     00410c3c f   LIBC:write.obj\r
- 0001:0000fde9       __stbuf                    00410de9 f   LIBC:_sftbuf.obj\r
- 0001:0000fe76       __ftbuf                    00410e76 f   LIBC:_sftbuf.obj\r
- 0001:0000feb3       __output                   00410eb3 f   LIBC:output.obj\r
- 0001:000106bd       __spawnvpe                 004116bd f   LIBC:spawnvpe.obj\r
- 0001:00010820       __spawnve                  00411820 f   LIBC:spawnve.obj\r
- 0001:000109ba       __access                   004119ba f   LIBC:access.obj\r
- 0001:000109fe       _getenv                    004119fe f   LIBC:getenv.obj\r
- 0001:00010a7b       __input                    00411a7b f   LIBC:input.obj\r
- 0001:0001152c       _lseek                     0041252c f   LIBC:lseek.obj\r
- 0001:0001152c       __lseek                    0041252c f   LIBC:lseek.obj\r
- 0001:000115c6       __getbuf                   004125c6 f   LIBC:_getbuf.obj\r
- 0001:0001160a       __isatty                   0041260a f   LIBC:isatty.obj\r
- 0001:0001160a       _isatty                    0041260a f   LIBC:isatty.obj\r
- 0001:00011630       ___crtGetStringTypeA       00412630 f   LIBC:a_str.obj\r
- 0001:00011779       __openfile                 00412779 f   LIBC:_open.obj\r
- 0001:000118e9       __getstream                004128e9 f   LIBC:stream.obj\r
- 0001:00011961       _free                      00412961 f   LIBC:free.obj\r
- 0001:00011990       __close                    00412990 f   LIBC:close.obj\r
- 0001:00011a43       __freebuf                  00412a43 f   LIBC:_freebuf.obj\r
- 0001:00011a6e       __read                     00412a6e f   LIBC:read.obj\r
- 0001:00011a6e       _read                      00412a6e f   LIBC:read.obj\r
- 0001:00011c70       _memcpy                    00412c70 f   LIBC:memcpy.obj\r
- 0001:00011fb0       __allmul                   00412fb0 f   LIBC:llmul.obj\r
- 0001:00011fe4       ___tzset                   00412fe4 f   LIBC:tzset.obj\r
- 0001:00011ff9       __tzset                    00412ff9 f   LIBC:tzset.obj\r
- 0001:00012257       __isindst                  00413257 f   LIBC:tzset.obj\r
- 0001:00012543       _gmtime                    00413543 f   LIBC:gmtime.obj\r
- 0001:0001263c       ___loctotime_t             0041363c f   LIBC:dtoxtime.obj\r
- 0001:000126fe       __XcptFilter               004136fe f   LIBC:winxfltr.obj\r
- 0001:00012882       __setenvp                  00413882 f   LIBC:stdenvp.obj\r
- 0001:0001293b       __setargv                  0041393b f   LIBC:stdargv.obj\r
- 0001:00012b88       ___crtGetEnvironmentStringsA 00413b88 f   LIBC:a_env.obj\r
- 0001:00012cba       __heap_init                00413cba f   LIBC:heapinit.obj\r
- 0001:00012cf6       __heap_term                00413cf6 f   LIBC:heapinit.obj\r
- 0001:00012d6c       __global_unwind2           00413d6c f   LIBC:exsup.obj\r
- 0001:00012dae       __local_unwind2            00413dae f   LIBC:exsup.obj\r
- 0001:00012e06       __NLG_Return2              00413e06 f   LIBC:exsup.obj\r
- 0001:00012e16       __abnormal_termination     00413e16 f   LIBC:exsup.obj\r
- 0001:00012e39       __NLG_Notify1              00413e39 f   LIBC:exsup.obj\r
- 0001:00012e42       __NLG_Notify               00413e42 f   LIBC:exsup.obj\r
- 0001:00012e55       __NLG_Dispatch             00413e55 f   LIBC:exsup.obj\r
- 0001:00012e64       __except_handler3          00413e64 f   LIBC:exsup3.obj\r
- 0001:00012f21       __seh_longjmp_unwind@4     00413f21 f   LIBC:exsup3.obj\r
- 0001:00012f3c       __FF_MSGBANNER             00413f3c f   LIBC:crt0msg.obj\r
- 0001:00012f75       __NMSG_WRITE               00413f75 f   LIBC:crt0msg.obj\r
- 0001:000130c8       __GET_RTERRMSG             004140c8 f   LIBC:crt0msg.obj\r
- 0001:000130f9       _malloc                    004140f9 f   LIBC:malloc.obj\r
- 0001:0001310b       __nh_malloc                0041410b f   LIBC:malloc.obj\r
- 0001:00013137       __heap_alloc               00414137 f   LIBC:malloc.obj\r
- 0001:00013170       _memset                    00414170 f   LIBC:memset.obj\r
- 0001:000131c8       ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z 004141c8 f   LIBC:handler.obj\r
- 0001:000131d8       ?_query_new_handler@@YAP6AHI@ZXZ 004141d8 f   LIBC:handler.obj\r
- 0001:000131de       __callnewh                 004141de f   LIBC:handler.obj\r
- 0001:000131f9       __get_sbh_threshold        004141f9 f   LIBC:sbheap.obj\r
- 0001:000131ff       __set_sbh_threshold        004141ff f   LIBC:sbheap.obj\r
- 0001:00013216       ___sbh_heap_init           00414216 f   LIBC:sbheap.obj\r
- 0001:00013254       ___sbh_find_block          00414254 f   LIBC:sbheap.obj\r
- 0001:0001327f       ___sbh_free_block          0041427f f   LIBC:sbheap.obj\r
- 0001:000135aa       ___sbh_alloc_block         004145aa f   LIBC:sbheap.obj\r
- 0001:000138b3       ___sbh_alloc_new_region    004148b3 f   LIBC:sbheap.obj\r
- 0001:00013964       ___sbh_alloc_new_group     00414964 f   LIBC:sbheap.obj\r
- 0001:00013a5f       ___sbh_resize_block        00414a5f f   LIBC:sbheap.obj\r
- 0001:00013d55       ___sbh_heapmin             00414d55 f   LIBC:sbheap.obj\r
- 0001:00013e26       ___sbh_heap_check          00414e26 f   LIBC:sbheap.obj\r
- 0001:00014155       __alloc_osfhnd             00415155 f   LIBC:osfinfo.obj\r
- 0001:000141ea       __set_osfhnd               004151ea f   LIBC:osfinfo.obj\r
- 0001:00014261       __free_osfhnd              00415261 f   LIBC:osfinfo.obj\r
- 0001:000142db       __get_osfhandle            004152db f   LIBC:osfinfo.obj\r
- 0001:00014318       __open_osfhandle           00415318 f   LIBC:osfinfo.obj\r
- 0001:000143b5       __dosmaperr                004153b5 f   LIBC:dosmap.obj\r
- 0001:0001441c       _wctomb                    0041541c f   LIBC:wctomb.obj\r
- 0001:00014490       __aulldiv                  00415490 f   LIBC:ulldiv.obj\r
- 0001:00014500       __aullrem                  00415500 f   LIBC:ullrem.obj\r
- 0001:00014575       __mbsrchr                  00415575 f   LIBC:mbsrchr.obj\r
- 0001:000145d5       __getpath                  004155d5 f   LIBC:getpath.obj\r
- 0001:00014649       __mbschr                   00415649 f   LIBC:mbschr.obj\r
- 0001:000146bc       __dospawn                  004156bc f   LIBC:dospawn.obj\r
- 0001:0001489b       __cenvarg                  0041589b f   LIBC:cenvarg.obj\r
- 0001:00014a9f       __mbsnbicoll               00415a9f f   LIBC:mbsnbico.obj\r
- 0001:00014ade       ___wtomb_environ           00415ade f   LIBC:wtombenv.obj\r
- 0001:00014b4c       _mbtowc                    00415b4c f   LIBC:mbtowc.obj\r
- 0001:00014c14       _isalpha                   00415c14 f   LIBC:_ctype.obj\r
- 0001:00014c42       _isupper                   00415c42 f   LIBC:_ctype.obj\r
- 0001:00014c6a       _islower                   00415c6a f   LIBC:_ctype.obj\r
- 0001:00014c92       _isdigit                   00415c92 f   LIBC:_ctype.obj\r
- 0001:00014cba       _isxdigit                  00415cba f   LIBC:_ctype.obj\r
- 0001:00014ce7       _isspace                   00415ce7 f   LIBC:_ctype.obj\r
- 0001:00014d0f       _ispunct                   00415d0f f   LIBC:_ctype.obj\r
- 0001:00014d37       _isalnum                   00415d37 f   LIBC:_ctype.obj\r
- 0001:00014d65       _isprint                   00415d65 f   LIBC:_ctype.obj\r
- 0001:00014d93       _isgraph                   00415d93 f   LIBC:_ctype.obj\r
- 0001:00014dc1       _iscntrl                   00415dc1 f   LIBC:_ctype.obj\r
- 0001:00014de9       ___isascii                 00415de9 f   LIBC:_ctype.obj\r
- 0001:00014df6       ___toascii                 00415df6 f   LIBC:_ctype.obj\r
- 0001:00014dfe       ___iscsymf                 00415dfe f   LIBC:_ctype.obj\r
- 0001:00014e3b       ___iscsym                  00415e3b f   LIBC:_ctype.obj\r
- 0001:00014e80       __allshl                   00415e80 f   LIBC:llshl.obj\r
- 0001:00014e9f       _ungetc                    00415e9f f   LIBC:ungetc.obj\r
- 0001:00014f10       __chkstk                   00415f10 f   LIBC:chkstk.obj\r
- 0001:00014f10       __alloca_probe             00415f10 f   LIBC:chkstk.obj\r
- 0001:00014f3f       __open                     00415f3f f   LIBC:open.obj\r
- 0001:00014f3f       _open                      00415f3f f   LIBC:open.obj\r
- 0001:00014f56       __sopen                    00415f56 f   LIBC:open.obj\r
- 0001:00015210       _strncpy                   00416210 f   LIBC:strncpy.obj\r
- 0001:00015310       _strcmp                    00416310 f   LIBC:strcmp.obj\r
- 0001:00015394       __setmbcp                  00416394 f   LIBC:mbctype.obj\r
- 0001:00015758       __getmbcp                  00416758 f   LIBC:mbctype.obj\r
- 0001:00015768       ___initmbctable            00416768 f   LIBC:mbctype.obj\r
- 0001:00015784       ___crtMessageBoxA          00416784 f   LIBC:crtmbox.obj\r
- 0001:00015810       _memmove                   00416810 f   LIBC:memmove.obj\r
- 0001:00015b45       __fptrap                   00416b45 f   LIBC:crt0fp.obj\r
- 0001:00015b50       _strrchr                   00416b50 f   LIBC:strrchr.obj\r
- 0001:00015b77       ___crtCompareStringA       00416b77 f   LIBC:a_cmp.obj\r
- 0001:00015e1f       ___crtsetenv               00416e1f f   LIBC:setenv.obj\r
- 0001:00016065       __chsize                   00417065 f   LIBC:chsize.obj\r
- 0001:000161ab       ___crtLCMapStringA         004171ab f   LIBC:a_map.obj\r
- 0001:000163fa       _realloc                   004173fa f   LIBC:realloc.obj\r
- 0001:0001651a       __strdup                   0041751a f   LIBC:strdup.obj\r
- 0001:00016545       __setmode                  00417545 f   LIBC:setmode.obj\r
- 0001:000165c0       _ExitProcess@4             004175c0 f   kernel32:KERNEL32.dll\r
- 0001:000165c6       _TerminateProcess@8        004175c6 f   kernel32:KERNEL32.dll\r
- 0001:000165cc       _GetCurrentProcess@0       004175cc f   kernel32:KERNEL32.dll\r
- 0001:000165d2       _GetTimeZoneInformation@4  004175d2 f   kernel32:KERNEL32.dll\r
- 0001:000165d8       _GetSystemTime@4           004175d8 f   kernel32:KERNEL32.dll\r
- 0001:000165de       _GetLocalTime@4            004175de f   kernel32:KERNEL32.dll\r
- 0001:000165e4       _GetCommandLineA@0         004175e4 f   kernel32:KERNEL32.dll\r
- 0001:000165ea       _GetVersion@0              004175ea f   kernel32:KERNEL32.dll\r
- 0001:000165f0       _SetHandleCount@4          004175f0 f   kernel32:KERNEL32.dll\r
- 0001:000165f6       _GetStdHandle@4            004175f6 f   kernel32:KERNEL32.dll\r
- 0001:000165fc       _GetFileType@4             004175fc f   kernel32:KERNEL32.dll\r
- 0001:00016602       _GetStartupInfoA@4         00417602 f   kernel32:KERNEL32.dll\r
- 0001:00016608       _HeapAlloc@12              00417608 f   kernel32:KERNEL32.dll\r
- 0001:0001660e       _GetLastError@0            0041760e f   kernel32:KERNEL32.dll\r
- 0001:00016614       _FlushFileBuffers@4        00417614 f   kernel32:KERNEL32.dll\r
- 0001:0001661a       _WriteFile@20              0041761a f   kernel32:KERNEL32.dll\r
- 0001:00016620       _GetFileAttributesA@4      00417620 f   kernel32:KERNEL32.dll\r
- 0001:00016626       _SetFilePointer@16         00417626 f   kernel32:KERNEL32.dll\r
- 0001:0001662c       _MultiByteToWideChar@24    0041762c f   kernel32:KERNEL32.dll\r
- 0001:00016632       _GetStringTypeA@20         00417632 f   kernel32:KERNEL32.dll\r
- 0001:00016638       _GetStringTypeW@16         00417638 f   kernel32:KERNEL32.dll\r
- 0001:0001663e       _HeapFree@12               0041763e f   kernel32:KERNEL32.dll\r
- 0001:00016644       _CloseHandle@4             00417644 f   kernel32:KERNEL32.dll\r
- 0001:0001664a       _ReadFile@20               0041764a f   kernel32:KERNEL32.dll\r
- 0001:00016650       _WideCharToMultiByte@32    00417650 f   kernel32:KERNEL32.dll\r
- 0001:00016656       _UnhandledExceptionFilter@4 00417656 f   kernel32:KERNEL32.dll\r
- 0001:0001665c       _GetModuleFileNameA@12     0041765c f   kernel32:KERNEL32.dll\r
- 0001:00016662       _FreeEnvironmentStringsA@4 00417662 f   kernel32:KERNEL32.dll\r
- 0001:00016668       _FreeEnvironmentStringsW@4 00417668 f   kernel32:KERNEL32.dll\r
- 0001:0001666e       _GetEnvironmentStrings@0   0041766e f   kernel32:KERNEL32.dll\r
- 0001:00016674       _GetEnvironmentStringsW@0  00417674 f   kernel32:KERNEL32.dll\r
- 0001:0001667a       _HeapDestroy@4             0041767a f   kernel32:KERNEL32.dll\r
- 0001:00016680       _HeapCreate@12             00417680 f   kernel32:KERNEL32.dll\r
- 0001:00016686       _VirtualFree@12            00417686 f   kernel32:KERNEL32.dll\r
- 0001:0001668c       _RtlUnwind@16              0041768c f   kernel32:KERNEL32.dll\r
- 0001:00016692       _VirtualAlloc@16           00417692 f   kernel32:KERNEL32.dll\r
- 0001:00016698       _HeapReAlloc@16            00417698 f   kernel32:KERNEL32.dll\r
- 0001:0001669e       _IsBadWritePtr@8           0041769e f   kernel32:KERNEL32.dll\r
- 0001:000166a4       _SetStdHandle@8            004176a4 f   kernel32:KERNEL32.dll\r
- 0001:000166aa       _GetExitCodeProcess@8      004176aa f   kernel32:KERNEL32.dll\r
- 0001:000166b0       _WaitForSingleObject@8     004176b0 f   kernel32:KERNEL32.dll\r
- 0001:000166b6       _CreateProcessA@40         004176b6 f   kernel32:KERNEL32.dll\r
- 0001:000166bc       _CreateFileA@28            004176bc f   kernel32:KERNEL32.dll\r
- 0001:000166c2       _GetCPInfo@8               004176c2 f   kernel32:KERNEL32.dll\r
- 0001:000166c8       _GetACP@0                  004176c8 f   kernel32:KERNEL32.dll\r
- 0001:000166ce       _GetOEMCP@0                004176ce f   kernel32:KERNEL32.dll\r
- 0001:000166d4       _GetProcAddress@8          004176d4 f   kernel32:KERNEL32.dll\r
- 0001:000166da       _LoadLibraryA@4            004176da f   kernel32:KERNEL32.dll\r
- 0001:000166e0       _CompareStringA@24         004176e0 f   kernel32:KERNEL32.dll\r
- 0001:000166e6       _CompareStringW@24         004176e6 f   kernel32:KERNEL32.dll\r
- 0001:000166ec       _SetEnvironmentVariableA@8 004176ec f   kernel32:KERNEL32.dll\r
- 0001:000166f2       _SetEndOfFile@4            004176f2 f   kernel32:KERNEL32.dll\r
- 0001:000166f8       _LCMapStringA@24           004176f8 f   kernel32:KERNEL32.dll\r
- 0001:000166fe       _LCMapStringW@24           004176fe f   kernel32:KERNEL32.dll\r
- 0001:00016710       __stricmp                  00417710 f   LIBC:stricmp.obj\r
- 0001:00016710       _stricmp                   00417710 f   LIBC:stricmp.obj\r
- 0001:00016710       __strcmpi                  00417710 f   LIBC:stricmp.obj\r
- 0001:0001679c       _chdir                     0041779c f   LIBC:chdir.obj\r
- 0001:0001679c       __chdir                    0041779c f   LIBC:chdir.obj\r
- 0001:00016830       _memicmp                   00417830 f   LIBC:memicmp.obj\r
- 0001:00016830       __memicmp                  00417830 f   LIBC:memicmp.obj\r
- 0001:000168cd       __fileno                   004178cd f   LIBC:fileno.obj\r
- 0001:000168cd       _fileno                    004178cd f   LIBC:fileno.obj\r
- 0001:000168d5       __tolower                  004178d5 f   LIBC:tolower.obj\r
- 0001:000168dd       _tolower                   004178dd f   LIBC:tolower.obj\r
- 0001:000169a8       __mbctoupper               004179a8 f   LIBC:mbtoupr.obj\r
- 0001:00016a24       _GetCurrentDirectoryA@8    00417a24 f   kernel32:KERNEL32.dll\r
- 0001:00016a2a       _SetCurrentDirectoryA@4    00417a2a f   kernel32:KERNEL32.dll\r
- 0002:0000001c       ??_C@_07OOMJ@cmd?4exe?$AA@ 0041b01c     LIBC:system.obj\r
- 0002:00000024       ??_C@_0M@IPJP@command?4com?$AA@ 0041b024     LIBC:system.obj\r
- 0002:00000030       ??_C@_02JMK@?1c?$AA@       0041b030     LIBC:system.obj\r
- 0002:00000034       ??_C@_07KFDO@COMSPEC?$AA@  0041b034     LIBC:system.obj\r
- 0002:0000004c       ___lookuptable             0041b04c     LIBC:output.obj\r
- 0002:000000a8       ??_C@_1O@POHA@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 0041b0a8     LIBC:output.obj\r
- 0002:000000b8       ??_C@_06ONKE@?$CInull?$CJ?$AA@ 0041b0b8     LIBC:output.obj\r
- 0002:000000c0       ??_C@_01PCFE@?2?$AA@       0041b0c0     LIBC:spawnvpe.obj\r
- 0002:000000c4       ??_C@_04LNMG@PATH?$AA@     0041b0c4     LIBC:spawnvpe.obj\r
- 0002:000000cc       ??_C@_04GGNP@?4com?$AA@    0041b0cc     LIBC:spawnve.obj\r
- 0002:000000d4       ??_C@_04NFOM@?4exe?$AA@    0041b0d4     LIBC:spawnve.obj\r
- 0002:000000dc       ??_C@_04KBDN@?4bat?$AA@    0041b0dc     LIBC:spawnve.obj\r
- 0002:000000e4       ??_C@_04LFKF@?4cmd?$AA@    0041b0e4     LIBC:spawnve.obj\r
- 0002:000000ec       ??_C@_02OFKN@?4?2?$AA@     0041b0ec     LIBC:spawnve.obj\r
- 0002:000000f0       ??_C@_01A@?$AA?$AA@        0041b0f0     LIBC:a_str.obj\r
- 0002:000000f4       ??_C@_13A@?$AA?$AA?$AA?$AA@ 0041b0f4     LIBC:a_str.obj\r
- 0002:00000104       ___dnames                  0041b104     LIBC:timeset.obj\r
- 0002:0000011c       ___mnames                  0041b11c     LIBC:timeset.obj\r
- 0002:00000144       ??_C@_02JHIA@TZ?$AA@       0041b144     LIBC:tzset.obj\r
- 0002:00000148       ??_C@_0P@GGKG@runtime?5error?5?$AA@ 0041b148     LIBC:crt0msg.obj\r
- 0002:00000158       ??_C@_02PIMC@?$AN?6?$AA@   0041b158     LIBC:crt0msg.obj\r
- 0002:0000015c       ??_C@_0O@DELO@TLOSS?5error?$AN?6?$AA@ 0041b15c     LIBC:crt0msg.obj\r
- 0002:0000016c       ??_C@_0N@OMLL@SING?5error?$AN?6?$AA@ 0041b16c     LIBC:crt0msg.obj\r
- 0002:0000017c       ??_C@_0P@OJAK@DOMAIN?5error?$AN?6?$AA@ 0041b17c     LIBC:crt0msg.obj\r
- 0002:0000018c       ??_C@_0CF@EANP@R6028?$AN?6?9?5unable?5to?5initialize?5he@ 0041b18c     LIBC:crt0msg.obj\r
- 0002:000001b4       ??_C@_0DF@ECGN@R6027?$AN?6?9?5not?5enough?5space?5for?5lo@ 0041b1b4     LIBC:crt0msg.obj\r
- 0002:000001ec       ??_C@_0DF@FKAC@R6026?$AN?6?9?5not?5enough?5space?5for?5st@ 0041b1ec     LIBC:crt0msg.obj\r
- 0002:00000224       ??_C@_0CG@DPMN@R6025?$AN?6?9?5pure?5virtual?5function?5c@ 0041b224     LIBC:crt0msg.obj\r
- 0002:0000024c       ??_C@_0DF@CKIP@R6024?$AN?6?9?5not?5enough?5space?5for?5_o@ 0041b24c     LIBC:crt0msg.obj\r
- 0002:00000284       ??_C@_0CJ@GGOE@R6019?$AN?6?9?5unable?5to?5open?5console?5@ 0041b284     LIBC:crt0msg.obj\r
- 0002:000002b0       ??_C@_0CB@LBOB@R6018?$AN?6?9?5unexpected?5heap?5error?$AN?6@ 0041b2b0     LIBC:crt0msg.obj\r
- 0002:000002d4       ??_C@_0CN@FPEG@R6017?$AN?6?9?5unexpected?5multithread?5@ 0041b2d4     LIBC:crt0msg.obj\r
- 0002:00000304       ??_C@_0CM@OBIC@R6016?$AN?6?9?5not?5enough?5space?5for?5th@ 0041b304     LIBC:crt0msg.obj\r
- 0002:00000330       ??_C@_0CB@HPAL@?$AN?6abnormal?5program?5termination?$AN?6@ 0041b330     LIBC:crt0msg.obj\r
- 0002:00000354       ??_C@_0CM@JOOB@R6009?$AN?6?9?5not?5enough?5space?5for?5en@ 0041b354     LIBC:crt0msg.obj\r
- 0002:00000380       ??_C@_0CK@OIBL@R6008?$AN?6?9?5not?5enough?5space?5for?5ar@ 0041b380     LIBC:crt0msg.obj\r
- 0002:000003ac       ??_C@_0CF@LKPB@R6002?$AN?6?9?5floating?5point?5not?5load@ 0041b3ac     LIBC:crt0msg.obj\r
- 0002:000003d4       ??_C@_0CF@JPDF@Microsoft?5Visual?5C?$CL?$CL?5Runtime?5Lib@ 0041b3d4     LIBC:crt0msg.obj\r
- 0002:000003fc       ??_C@_02JJJH@?6?6?$AA@     0041b3fc     LIBC:crt0msg.obj\r
- 0002:00000400       ??_C@_0BK@DEOK@Runtime?5Error?$CB?6?6Program?3?5?$AA@ 0041b400     LIBC:crt0msg.obj\r
- 0002:0000041c       ??_C@_03NAME@?4?4?4?$AA@   0041b41c     LIBC:crt0msg.obj\r
- 0002:00000420       ??_C@_0BH@NNCD@?$DMprogram?5name?5unknown?$DO?$AA@ 0041b420     LIBC:crt0msg.obj\r
- 0002:00000438       ??_C@_0BD@NJFP@GetLastActivePopup?$AA@ 0041b438     LIBC:crtmbox.obj\r
- 0002:0000044c       ??_C@_0BA@GILI@GetActiveWindow?$AA@ 0041b44c     LIBC:crtmbox.obj\r
- 0002:0000045c       ??_C@_0M@PKCK@MessageBoxA?$AA@ 0041b45c     LIBC:crtmbox.obj\r
- 0002:00000468       ??_C@_0L@HKL@user32?4dll?$AA@ 0041b468     LIBC:crtmbox.obj\r
- 0003:00000000       ___xc_a                    0041c000     LIBC:crt0init.obj\r
- 0003:00000104       ___xc_z                    0041c104     LIBC:crt0init.obj\r
- 0003:00000208       ___xi_a                    0041c208     LIBC:crt0init.obj\r
- 0003:00000418       ___xi_z                    0041c418     LIBC:crt0init.obj\r
- 0003:0000051c       ___xp_a                    0041c51c     LIBC:crt0init.obj\r
- 0003:00000724       ___xp_z                    0041c724     LIBC:crt0init.obj\r
- 0003:00000828       ___xt_a                    0041c828     LIBC:crt0init.obj\r
- 0003:0000092c       ___xt_z                    0041c92c     LIBC:crt0init.obj\r
- 0003:00000a30       _in                        0041ca30     ucp.obj\r
- 0003:00000a34       _rdev                      0041ca34     ucp.obj\r
- 0003:00000a38       _syserror                  0041ca38     ucp.obj\r
- 0003:00000a3c       _help                      0041ca3c     ucp.obj\r
- 0003:000016c4       _cmdblk                    0041d6c4     devhd.obj\r
- 0003:000016cc       _busid                     0041d6cc     devhd.obj\r
- 0003:00001708       _dev_tab                   0041d708     devio.obj\r
- 0003:00001898       _tty_default               0041d898     devtty.obj\r
- 0003:000018a8       _tty_vector                0041d8a8     devtty.obj\r
- 0003:000018d0       _ttyinq                    0041d8d0     devtty.obj\r
- 0003:00001a00       _baddevmsg                 0041da00     filesys.obj\r
- 0003:00001d4c       _UZIX                      0041dd4c     main.obj\r
- 0003:00001d5c       _HOST                      0041dd5c     main.obj\r
- 0003:00001ec8       _stringerr                 0041dec8     xfs.obj\r
- 0003:00002450       __iob                      0041e450     LIBC:_file.obj\r
- 0003:000026d0       __pctype                   0041e6d0     LIBC:ctype.obj\r
- 0003:000026d4       __pwctype                  0041e6d4     LIBC:ctype.obj\r
- 0003:000026d8       __ctype                    0041e6d8     LIBC:ctype.obj\r
- 0003:000028dc       ___mb_cur_max              0041e8dc     LIBC:nlsdata1.obj\r
- 0003:000028e0       ___decimal_point           0041e8e0     LIBC:nlsdata1.obj\r
- 0003:000028e4       ___decimal_point_length    0041e8e4     LIBC:nlsdata1.obj\r
- 0003:000028f0       __aexit_rtn                0041e8f0     LIBC:crt0.obj\r
- 0003:000028f4       ___app_type                0041e8f4     LIBC:crt0.obj\r
- 0003:000028f8       ___badioinfo               0041e8f8     LIBC:ioinit.obj\r
- 0003:00002900       ___nullstring              0041e900     LIBC:output.obj\r
- 0003:00002904       ___wnullstring             0041e904     LIBC:output.obj\r
- 0003:00002930       __timezone                 0041e930     LIBC:timeset.obj\r
- 0003:00002934       __daylight                 0041e934     LIBC:timeset.obj\r
- 0003:00002938       __dstbias                  0041e938     LIBC:timeset.obj\r
- 0003:000029bc       __tzname                   0041e9bc     LIBC:timeset.obj\r
- 0003:000029e8       __XcptActTab               0041e9e8     LIBC:winxfltr.obj\r
- 0003:00002a60       __First_FPE_Indx           0041ea60     LIBC:winxfltr.obj\r
- 0003:00002a64       __Num_FPE                  0041ea64     LIBC:winxfltr.obj\r
- 0003:00002a68       __XcptActTabCount          0041ea68     LIBC:winxfltr.obj\r
- 0003:00002a6c       __fpecode                  0041ea6c     LIBC:winxfltr.obj\r
- 0003:00002a70       __amblksiz                 0041ea70     LIBC:heapinit.obj\r
- 0003:00002a74       __NLG_Destination          0041ea74     LIBC:exsup.obj\r
- 0003:00002b20       ___sbh_threshold           0041eb20     LIBC:sbheap.obj\r
- 0003:00002c90       __cfltcvt_tab              0041ec90     LIBC:cmiscdat.obj\r
- 0003:00002cb0       __p_overlay                0041ecb0     LIBC:dospawn.obj\r
- 0003:00002cc0       __lpdays                   0041ecc0     LIBC:days.obj\r
- 0003:00002cf4       __days                     0041ecf4     LIBC:days.obj\r
- 0003:00003120       _f_pause                   0041f120     ucp.obj\r
- 0003:00003121       _unix_locked_out           0041f121     <common>\r
- 0003:00003122       _swapblk                   0041f122     <common>\r
- 0003:00003124       _hd_offset                 0041f124     devhd.obj\r
- 0003:00003128       _hd_sector                 0041f128     devhd.obj\r
- 0003:0000312c       _dptr                      0041f12c     devhd.obj\r
- 0003:00003130       _dlen                      0041f130     devhd.obj\r
- 0003:00003134       _cptr                      0041f134     devhd.obj\r
- 0003:00003139       _dirty_mask                0041f139     <common>\r
- 0003:0000313a       _inint                     0041f13a     <common>\r
- 0003:0000313c       _initproc                  0041f13c     <common>\r
- 0003:00003140       _bufclock                  0041f140     devio.obj\r
- 0003:00003148       _swapcnt                   0041f148     <common>\r
- 0003:0000314d       _traceon                   0041f14d     <common>\r
- 0003:0000314e       _sec                       0041f14e     <common>\r
- 0003:00003159       _total                     0041f159     <common>\r
- 0003:0000315a       _waitno                    0041f15a     <common>\r
- 0003:00003164       _tod                       0041f164     <common>\r
- 0003:00003174       _runticks                  0041f174     <common>\r
- 0003:00003176       _root_dev                  0041f176     <common>\r
- 0003:00003188       __cflush                   0041f188     LIBC:_file.obj\r
- 0003:0000318c       _errno                     0041f18c     LIBC:crt0dat.obj\r
- 0003:00003190       __doserrno                 0041f190     LIBC:crt0dat.obj\r
- 0003:00003194       __umaskval                 0041f194     LIBC:crt0dat.obj\r
- 0003:00003198       __osver                    0041f198     LIBC:crt0dat.obj\r
- 0003:0000319c       __winver                   0041f19c     LIBC:crt0dat.obj\r
- 0003:000031a0       __winmajor                 0041f1a0     LIBC:crt0dat.obj\r
- 0003:000031a4       __winminor                 0041f1a4     LIBC:crt0dat.obj\r
- 0003:000031a8       ___argc                    0041f1a8     LIBC:crt0dat.obj\r
- 0003:000031ac       ___argv                    0041f1ac     LIBC:crt0dat.obj\r
- 0003:000031b0       ___wargv                   0041f1b0     LIBC:crt0dat.obj\r
- 0003:000031b4       __environ                  0041f1b4     LIBC:crt0dat.obj\r
- 0003:000031b8       ___initenv                 0041f1b8     LIBC:crt0dat.obj\r
- 0003:000031bc       __wenviron                 0041f1bc     LIBC:crt0dat.obj\r
- 0003:000031c0       ___winitenv                0041f1c0     LIBC:crt0dat.obj\r
- 0003:000031c4       __pgmptr                   0041f1c4     LIBC:crt0dat.obj\r
- 0003:000031c8       __wpgmptr                  0041f1c8     LIBC:crt0dat.obj\r
- 0003:000031cc       __exitflag                 0041f1cc     LIBC:crt0dat.obj\r
- 0003:000031d0       __C_Termination_Done       0041f1d0     LIBC:crt0dat.obj\r
- 0003:000031d4       __C_Exit_Done              0041f1d4     LIBC:crt0dat.obj\r
- 0003:000031f0       __aenvptr                  0041f1f0     LIBC:crt0.obj\r
- 0003:000031f4       __wenvptr                  0041f1f4     LIBC:crt0.obj\r
- 0003:000031f8       ___error_mode              0041f1f8     LIBC:crt0.obj\r
- 0003:000031fc       __stdbuf                   0041f1fc     LIBC:_sftbuf.obj\r
- 0003:000032c4       _swapbase                  0041f2c4     <common>\r
- 0003:000032ec       __pxcptinfoptrs            0041f2ec     LIBC:winxfltr.obj\r
- 0003:000033f8       __adbgmsg                  0041f3f8     LIBC:crt0msg.obj\r
- 0003:000033fc       ?_pnhHeap@@3P6AHI@ZA       0041f3fc     LIBC:handler.obj\r
- 0003:00003400       __newmode                  0041f400     LIBC:_newmode.obj\r
- 0003:00003404       ___lc_handle               0041f404     LIBC:nlsdata2.obj\r
- 0003:0000341c       ___lc_codepage             0041f41c     LIBC:nlsdata2.obj\r
- 0003:00003420       ___lc_collate_cp           0041f420     LIBC:nlsdata2.obj\r
- 0003:00003424       __commode                  0041f424     LIBC:ncommode.obj\r
- 0003:0000343c       __fmode                    0041f43c     LIBC:txtmode.obj\r
- 0003:00003444       _ticks                     0041f444     <common>\r
- 0003:00003448       _root_ino                  0041f448     <common>\r
- 0003:0000344c       _ncalls                    0041f44c     <common>\r
- 0003:00003450       _ibuf                      0041f450     <common>\r
- 0003:0000345c       _osBank                    0041f45c     <common>\r
- 0003:00003460       _bufpool                   0041f460     <common>\r
- 0003:00005d50       _disp_tab                  00421d50     <common>\r
- 0003:00005d54       _buf_flsh                  00421d54     <common>\r
- 0003:00005d58       _buf_hits                  00421d58     <common>\r
- 0003:00005d5c       _buf_miss                  00421d5c     <common>\r
- 0003:00005d60       _fs_tab                    00421d60     <common>\r
- 0003:00005de0       _of_tab                    00421de0     <common>\r
- 0003:00005f60       _i_tab                     00421f60     <common>\r
- 0003:00006b40       _ub                        00422b40     <common>\r
- 0003:00007b40       _ptab                      00423b40     <common>\r
- 0003:00007c80       _kbuf                      00423c80     <common>\r
- 0003:00007cc0       _recv_bufs                 00423cc0     <common>\r
- 0003:000089c0       _stopflag                  004249c0     <common>\r
- 0003:00008a00       _flshflag                  00424a00     <common>\r
- 0003:00008a40       _tty_data                  00424a40     <common>\r
- 0003:00008ae0       _cwd                       00424ae0     <common>\r
- 0003:00008b80       _line                      00424b80     <common>\r
- 0003:00009024       ___mbcodepage              00425024     <common>\r
- 0003:000090a0       ___mbulinfo                004250a0     <common>\r
- 0003:000090ac       ___ismbcodepage            004250ac     <common>\r
- 0003:000090c0       __mbcasemap                004250c0     <common>\r
- 0003:000091c0       __mbctype                  004251c0     <common>\r
- 0003:000092c4       ___mblcid                  004252c4     <common>\r
- 0003:000092c8       ___sbh_sizeHeaderList      004252c8     <common>\r
- 0003:000092d8       ___sbh_indGroupDefer       004252d8     <common>\r
- 0003:000092dc       ___sbh_pHeaderScan         004252dc     <common>\r
- 0003:000092e0       ___sbh_pHeaderDefer        004252e0     <common>\r
- 0003:000092e4       ___sbh_cntHeaderList       004252e4     <common>\r
- 0003:000092e8       ___sbh_pHeaderList         004252e8     <common>\r
- 0003:000092ec       __crtheap                  004252ec     <common>\r
- 0003:00009300       ___pioinfo                 00425300     <common>\r
- 0003:0000943c       __nhandle                  0042543c     <common>\r
- 0003:00009440       __acmdln                   00425440     <common>\r
- 0003:0000944c       ___env_initialized         0042544c     <common>\r
- 0003:0000945c       ___mbctype_initialized     0042545c     <common>\r
- 0003:00009460       ___onexitend               00425460     <common>\r
- 0003:00009464       ___onexitbegin             00425464     <common>\r
- 0003:00009468       __FPinit                   00425468     <common>\r
- 0003:0000946c       ___piob                    0042546c     <common>\r
- 0003:000097c0       __bufin                    004257c0     <common>\r
- 0003:0000a7c0       __nstream                  004267c0     <common>\r
- 0004:00000000       __IMPORT_DESCRIPTOR_KERNEL32 00427000     kernel32:KERNEL32.dll\r
- 0004:00000014       __NULL_IMPORT_DESCRIPTOR   00427014     kernel32:KERNEL32.dll\r
- 0004:00000160       __imp__FreeEnvironmentStringsW@4 00427160     kernel32:KERNEL32.dll\r
- 0004:00000164       __imp__TerminateProcess@8  00427164     kernel32:KERNEL32.dll\r
- 0004:00000168       __imp__GetCurrentProcess@0 00427168     kernel32:KERNEL32.dll\r
- 0004:0000016c       __imp__GetTimeZoneInformation@4 0042716c     kernel32:KERNEL32.dll\r
- 0004:00000170       __imp__GetSystemTime@4     00427170     kernel32:KERNEL32.dll\r
- 0004:00000174       __imp__GetLocalTime@4      00427174     kernel32:KERNEL32.dll\r
- 0004:00000178       __imp__GetCommandLineA@0   00427178     kernel32:KERNEL32.dll\r
- 0004:0000017c       __imp__GetVersion@0        0042717c     kernel32:KERNEL32.dll\r
- 0004:00000180       __imp__SetHandleCount@4    00427180     kernel32:KERNEL32.dll\r
- 0004:00000184       __imp__GetStdHandle@4      00427184     kernel32:KERNEL32.dll\r
- 0004:00000188       __imp__GetFileType@4       00427188     kernel32:KERNEL32.dll\r
- 0004:0000018c       __imp__GetStartupInfoA@4   0042718c     kernel32:KERNEL32.dll\r
- 0004:00000190       __imp__HeapAlloc@12        00427190     kernel32:KERNEL32.dll\r
- 0004:00000194       __imp__GetLastError@0      00427194     kernel32:KERNEL32.dll\r
- 0004:00000198       __imp__FlushFileBuffers@4  00427198     kernel32:KERNEL32.dll\r
- 0004:0000019c       __imp__WriteFile@20        0042719c     kernel32:KERNEL32.dll\r
- 0004:000001a0       __imp__GetFileAttributesA@4 004271a0     kernel32:KERNEL32.dll\r
- 0004:000001a4       __imp__SetFilePointer@16   004271a4     kernel32:KERNEL32.dll\r
- 0004:000001a8       __imp__MultiByteToWideChar@24 004271a8     kernel32:KERNEL32.dll\r
- 0004:000001ac       __imp__GetStringTypeA@20   004271ac     kernel32:KERNEL32.dll\r
- 0004:000001b0       __imp__GetStringTypeW@16   004271b0     kernel32:KERNEL32.dll\r
- 0004:000001b4       __imp__HeapFree@12         004271b4     kernel32:KERNEL32.dll\r
- 0004:000001b8       __imp__CloseHandle@4       004271b8     kernel32:KERNEL32.dll\r
- 0004:000001bc       __imp__ReadFile@20         004271bc     kernel32:KERNEL32.dll\r
- 0004:000001c0       __imp__WideCharToMultiByte@32 004271c0     kernel32:KERNEL32.dll\r
- 0004:000001c4       __imp__UnhandledExceptionFilter@4 004271c4     kernel32:KERNEL32.dll\r
- 0004:000001c8       __imp__GetModuleFileNameA@12 004271c8     kernel32:KERNEL32.dll\r
- 0004:000001cc       __imp__FreeEnvironmentStringsA@4 004271cc     kernel32:KERNEL32.dll\r
- 0004:000001d0       __imp__ExitProcess@4       004271d0     kernel32:KERNEL32.dll\r
- 0004:000001d4       __imp__GetEnvironmentStrings@0 004271d4     kernel32:KERNEL32.dll\r
- 0004:000001d8       __imp__GetEnvironmentStringsW@0 004271d8     kernel32:KERNEL32.dll\r
- 0004:000001dc       __imp__HeapDestroy@4       004271dc     kernel32:KERNEL32.dll\r
- 0004:000001e0       __imp__HeapCreate@12       004271e0     kernel32:KERNEL32.dll\r
- 0004:000001e4       __imp__VirtualFree@12      004271e4     kernel32:KERNEL32.dll\r
- 0004:000001e8       __imp__RtlUnwind@16        004271e8     kernel32:KERNEL32.dll\r
- 0004:000001ec       __imp__VirtualAlloc@16     004271ec     kernel32:KERNEL32.dll\r
- 0004:000001f0       __imp__HeapReAlloc@16      004271f0     kernel32:KERNEL32.dll\r
- 0004:000001f4       __imp__IsBadWritePtr@8     004271f4     kernel32:KERNEL32.dll\r
- 0004:000001f8       __imp__SetStdHandle@8      004271f8     kernel32:KERNEL32.dll\r
- 0004:000001fc       __imp__GetExitCodeProcess@8 004271fc     kernel32:KERNEL32.dll\r
- 0004:00000200       __imp__WaitForSingleObject@8 00427200     kernel32:KERNEL32.dll\r
- 0004:00000204       __imp__CreateProcessA@40   00427204     kernel32:KERNEL32.dll\r
- 0004:00000208       __imp__CreateFileA@28      00427208     kernel32:KERNEL32.dll\r
- 0004:0000020c       __imp__GetCPInfo@8         0042720c     kernel32:KERNEL32.dll\r
- 0004:00000210       __imp__GetACP@0            00427210     kernel32:KERNEL32.dll\r
- 0004:00000214       __imp__GetOEMCP@0          00427214     kernel32:KERNEL32.dll\r
- 0004:00000218       __imp__GetProcAddress@8    00427218     kernel32:KERNEL32.dll\r
- 0004:0000021c       __imp__LoadLibraryA@4      0042721c     kernel32:KERNEL32.dll\r
- 0004:00000220       __imp__CompareStringA@24   00427220     kernel32:KERNEL32.dll\r
- 0004:00000224       __imp__CompareStringW@24   00427224     kernel32:KERNEL32.dll\r
- 0004:00000228       __imp__SetEnvironmentVariableA@8 00427228     kernel32:KERNEL32.dll\r
- 0004:0000022c       __imp__SetEndOfFile@4      0042722c     kernel32:KERNEL32.dll\r
- 0004:00000230       __imp__LCMapStringA@24     00427230     kernel32:KERNEL32.dll\r
- 0004:00000234       __imp__LCMapStringW@24     00427234     kernel32:KERNEL32.dll\r
- 0004:00000238       __imp__GetCurrentDirectoryA@8 00427238     kernel32:KERNEL32.dll\r
- 0004:0000023c       __imp__SetCurrentDirectoryA@4 0042723c     kernel32:KERNEL32.dll\r
- 0004:00000240       \177KERNEL32_NULL_THUNK_DATA 00427240     kernel32:KERNEL32.dll\r
+ 0001:000008c0       _pse                       004018c0 f   ucp.obj\r
+ 0001:00000906       _dohelp                    00401906 f   ucp.obj\r
+ 0001:0000094d       _eq                        0040194d f   ucp.obj\r
+ 0001:00000967       _execute                   00401967 f   ucp.obj\r
+ 0001:00000f45       _usage                     00401f45 f   ucp.obj\r
+ 0001:00000f63       _main                      00401f63 f   ucp.obj\r
+ 0001:00001aa0       _ldir                      00402aa0 f   ucpsub.obj\r
+ 0001:00001ae1       _devdir                    00402ae1 f   ucpsub.obj\r
+ 0001:00001b5c       _prot                      00402b5c f   ucpsub.obj\r
+ 0001:00001b6e       _dols                      00402b6e f   ucpsub.obj\r
+ 0001:0000212e       _xls                       0040312e f   ucpsub.obj\r
+ 0001:00002224       _xchmod                    00403224 f   ucpsub.obj\r
+ 0001:000022a4       _xchown                    004032a4 f   ucpsub.obj\r
+ 0001:00002344       _xchgrp                    00403344 f   ucpsub.obj\r
+ 0001:000023e4       _xumask                    004033e4 f   ucpsub.obj\r
+ 0001:00002465       _xmknod                    00403465 f   ucpsub.obj\r
+ 0001:00002599       _xmkdir                    00403599 f   ucpsub.obj\r
+ 0001:000025e0       _xget                      004035e0 f   ucpsub.obj\r
+ 0001:0000278b       _xput                      0040378b f   ucpsub.obj\r
+ 0001:00002922       _xtype                     00403922 f   ucpsub.obj\r
+ 0001:000029c0       _xdump                     004039c0 f   ucpsub.obj\r
+ 0001:00002c7e       _xunlink                   00403c7e f   ucpsub.obj\r
+ 0001:00002d64       _xrmdir                    00403d64 f   ucpsub.obj\r
+ 0001:00002f68       _xdf                       00403f68 f   ucpsub.obj\r
+ 0001:00003027       _xalign                    00404027 f   ucpsub.obj\r
+ 0001:0000311c       _xualign                   0040411c f   ucpsub.obj\r
+ 0001:000037b0       _wd_read                   004047b0 f   devhd.obj\r
+ 0001:000037e7       _wd_write                  004047e7 f   devhd.obj\r
+ 0001:0000381e       _setup                     0040481e f   devhd.obj\r
+ 0001:0000397b       _chkstat                   0040497b f   devhd.obj\r
+ 0001:000039c1       _wd_open                   004049c1 f   devhd.obj\r
+ 0001:00003a50       _bread                     00404a50 f   devio.obj\r
+ 0001:00003b87       _bfree                     00404b87 f   devio.obj\r
+ 0001:00003c3e       _zerobuf                   00404c3e f   devio.obj\r
+ 0001:00003cc5       _bufsync                   00404cc5 f   devio.obj\r
+ 0001:00003d39       _bfind                     00404d39 f   devio.obj\r
+ 0001:00003d91       _freebuf                   00404d91 f   devio.obj\r
+ 0001:00003ed3       _bufdump                   00404ed3 f   devio.obj\r
+ 0001:00003fba       _validdev                  00404fba f   devio.obj\r
+ 0001:00004045       _bdreadwrite               00405045 f   devio.obj\r
+ 0001:000040c3       _cdreadwrite               004050c3 f   devio.obj\r
+ 0001:00004129       _d_openclose               00405129 f   devio.obj\r
+ 0001:00004189       _d_ioctl                   00405189 f   devio.obj\r
+ 0001:000041df       _d_init                    004051df f   devio.obj\r
+ 0001:0000423e       _ok                        0040523e f   devio.obj\r
+ 0001:00004245       _ok_rdwr                   00405245 f   devio.obj\r
+ 0001:0000424c       _nogood                    0040524c f   devio.obj\r
+ 0001:00004254       _nogood_ioctl              00405254 f   devio.obj\r
+ 0001:0000425c       _insq                      0040525c f   devio.obj\r
+ 0001:000042ce       _remq                      004052ce f   devio.obj\r
+ 0001:0000433c       _uninsq                    0040533c f   devio.obj\r
+ 0001:000043af       _clrq                      004053af f   devio.obj\r
+ 0001:00004640       _mem_read                  00405640 f   devmisc.obj\r
+ 0001:000046a1       _mem_write                 004056a1 f   devmisc.obj\r
+ 0001:00004704       _null_write                00405704 f   devmisc.obj\r
+ 0001:0000470e       _lpr_open                  0040570e f   devmisc.obj\r
+ 0001:0000471c       _lpr_close                 0040571c f   devmisc.obj\r
+ 0001:00004735       _lpr_write                 00405735 f   devmisc.obj\r
+ 0001:0000479b       _mt_read                   0040579b f   devmisc.obj\r
+ 0001:000047a3       _mt_write                  004057a3 f   devmisc.obj\r
+ 0001:000047ab       _mt_open                   004057ab f   devmisc.obj\r
+ 0001:000047b3       _mt_close                  004057b3 f   devmisc.obj\r
+ 0001:00004820       _tty_read                  00405820 f   devtty.obj\r
+ 0001:000049d3       _tty_write                 004059d3 f   devtty.obj\r
+ 0001:00004b50       _tty_open                  00405b50 f   devtty.obj\r
+ 0001:00004be7       _tty_close                 00405be7 f   devtty.obj\r
+ 0001:00004c4b       _tty_ioctl                 00405c4b f   devtty.obj\r
+ 0001:00004de9       _tty_inproc                00405de9 f   devtty.obj\r
+ 0001:00005191       _tty_inproc_dummy          00406191 f   devtty.obj\r
+ 0001:00005196       _echo                      00406196 f   devtty.obj\r
+ 0001:00005430       _findfs                    00406430 f   filesys.obj\r
+ 0001:0000547c       _getfs                     0040647c f   filesys.obj\r
+ 0001:000054d1       _wr_inode                  004064d1 f   filesys.obj\r
+ 0001:000055a4       _i_ref                     004065a4 f   filesys.obj\r
+ 0001:00005602       _i_deref                   00406602 f   filesys.obj\r
+ 0001:000056d9       _i_free                    004066d9 f   filesys.obj\r
+ 0001:00005772       __namei                    00406772 f   filesys.obj\r
+ 0001:00005949       _namei                     00406949 f   filesys.obj\r
+ 0001:00005ca7       _srch_dir                  00406ca7 f   filesys.obj\r
+ 0001:00005dd7       _srch_mt                   00406dd7 f   filesys.obj\r
+ 0001:00005e37       _i_open                    00406e37 f   filesys.obj\r
+ 0001:000060fe       _ch_link                   004070fe f   filesys.obj\r
+ 0001:000062a7       _filename                  004072a7 f   filesys.obj\r
+ 0001:0000634e       _namecomp                  0040734e f   filesys.obj\r
+ 0001:000063d4       _newfile                   004073d4 f   filesys.obj\r
+ 0001:000064b0       _doclose                   004074b0 f   filesys.obj\r
+ 0001:00006551       _i_alloc                   00407551 f   filesys.obj\r
+ 0001:00006656       _blk_alloc                 00407656 f   filesys.obj\r
+ 0001:00006790       _blk_free                  00407790 f   filesys.obj\r
+ 0001:0000683e       _oft_alloc                 0040783e f   filesys.obj\r
+ 0001:000068ae       _oft_deref                 004078ae f   filesys.obj\r
+ 0001:00006906       _uf_alloc                  00407906 f   filesys.obj\r
+ 0001:0000695e       _isdevice                  0040795e f   filesys.obj\r
+ 0001:000069a5       _freeblk                   004079a5 f   filesys.obj\r
+ 0001:00006a46       _f_trunc                   00407a46 f   filesys.obj\r
+ 0001:00006aff       _bmap                      00407aff f   filesys.obj\r
+ 0001:00006d5f       _validblk                  00407d5f f   filesys.obj\r
+ 0001:00006dde       _getinode                  00407dde f   filesys.obj\r
+ 0001:00006eba       _getperm                   00407eba f   filesys.obj\r
+ 0001:00006f5a       _setftim                   00407f5a f   filesys.obj\r
+ 0001:00006fc4       _fmount                    00407fc4 f   filesys.obj\r
+ 0001:0000717c       _magic                     0040817c f   filesys.obj\r
+ 0001:000071a6       _i_sync                    004081a6 f   filesys.obj\r
+ 0001:0000721b       _fs_sync                   0040821b f   filesys.obj\r
+ 0001:00007a50       _scsiop                    00408a50 f   hdasm.obj\r
+ 0001:00007b70       _fs_init                   00408b70 f   machdep.obj\r
+ 0001:00007b91       _valadr                    00408b91 f   machdep.obj\r
+ 0001:00007b9b       _addtick                   00408b9b f   machdep.obj\r
+ 0001:00007bf9       _incrtick                  00408bf9 f   machdep.obj\r
+ 0001:00007c38       _calltrap                  00408c38 f   machdep.obj\r
+ 0001:00007cbe       _sttime                    00408cbe f   machdep.obj\r
+ 0001:00007cd6       _panic                     00408cd6 f   machdep.obj\r
+ 0001:00007d24       _warning                   00408d24 f   machdep.obj\r
+ 0001:00007d58       _idump                     00408d58 f   machdep.obj\r
+ 0001:00007ff0       _abort                     00408ff0 f   main.obj\r
+ 0001:0000800e       _rdtime                    0040900e f   main.obj\r
+ 0001:000080b0       _init2                     004090b0 f   process.obj\r
+ 0001:000082d1       _psleep                    004092d1 f   process.obj\r
+ 0001:0000834d       _wakeup                    0040934d f   process.obj\r
+ 0001:00008398       _getproc                   00409398 f   process.obj\r
+ 0001:000083f1       _newproc                   004093f1 f   process.obj\r
+ 0001:00008537       _ptab_alloc                00409537 f   process.obj\r
+ 0001:000085ec       _clkint2                   004095ec f   process.obj\r
+ 0001:00008730       _unix2                     00409730 f   process.obj\r
+ 0001:000087b8       _chksigs                   004097b8 f   process.obj\r
+ 0001:00008862       _sgrpsig                   00409862 f   process.obj\r
+ 0001:000088ae       _ssig                      004098ae f   process.obj\r
+ 0001:00008925       _sendsig                   00409925 f   process.obj\r
+ 0001:00008979       _dowait                    00409979 f   process.obj\r
+ 0001:00008cf0       _sys_NONE                  00409cf0 f   scall1.obj\r
+ 0001:00008d02       _sys_sync                  00409d02 f   scall1.obj\r
+ 0001:00008d13       _sys_utime                 00409d13 f   scall1.obj\r
+ 0001:00008e34       _sys_close                 00409e34 f   scall1.obj\r
+ 0001:00008e47       _truncateto0               00409e47 f   scall1.obj\r
+ 0001:00008ec0       _sys_open                  00409ec0 f   scall1.obj\r
+ 0001:000091f9       _sys_link                  0040a1f9 f   scall1.obj\r
+ 0001:00009344       _sys_symlink               0040a344 f   scall1.obj\r
+ 0001:00009432       _sys_unlink                0040a432 f   scall1.obj\r
+ 0001:0000954c       _sys_readwrite             0040a54c f   scall1.obj\r
+ 0001:000095e2       _sys_lseek                 0040a5e2 f   scall1.obj\r
+ 0001:000096c0       _sys_chdir                 0040a6c0 f   scall1.obj\r
+ 0001:0000974f       _sys_chroot                0040a74f f   scall1.obj\r
+ 0001:0000978d       _sys_mknod                 0040a78d f   scall1.obj\r
+ 0001:00009868       _sys_access                0040a868 f   scall1.obj\r
+ 0001:0000994f       _sys_chmod                 0040a94f f   scall1.obj\r
+ 0001:00009a33       _sys_chown                 0040aa33 f   scall1.obj\r
+ 0001:00009a5a       _stcpy                     0040aa5a f   scall1.obj\r
+ 0001:00009af7       _sys_statfstat             0040aaf7 f   scall1.obj\r
+ 0001:00009b8a       _sys_falign                0040ab8a f   scall1.obj\r
+ 0001:00009bf4       _sys_dup                   0040abf4 f   scall1.obj\r
+ 0001:00009c7f       _sys_dup2                  0040ac7f f   scall1.obj\r
+ 0001:00009d2b       _sys_getfsys               0040ad2b f   scall1.obj\r
+ 0001:00009d86       _sys_ioctl                 0040ad86 f   scall1.obj\r
+ 0001:00009e19       _sys_mountumount           0040ae19 f   scall1.obj\r
+ 0001:0000a07c       _sys_time                  0040b07c f   scall1.obj\r
+ 0001:0000a0b4       _exit0                     0040b0b4 f   scall1.obj\r
+ 0001:0000a0c5       _n_creat                   0040b0c5 f   scall1.obj\r
+ 0001:0000a281       _readwritei                0040b281 f   scall1.obj\r
+ 0001:0000a7ab       _rwsetup                   0040b7ab f   scall1.obj\r
+ 0001:0000a858       _getfsys                   0040b858 f   scall1.obj\r
+ 0001:0000b160       _findprocess               0040c160 f   scall2.obj\r
+ 0001:0000b1c5       _filldesc                  0040c1c5 f   scall2.obj\r
+ 0001:0000b1fb       _sys_pipe                  0040c1fb f   scall2.obj\r
+ 0001:0000b392       _sys_stime                 0040c392 f   scall2.obj\r
+ 0001:0000b3e1       _sys_times                 0040c3e1 f   scall2.obj\r
+ 0001:0000b430       _sys_brk                   0040c430 f   scall2.obj\r
+ 0001:0000b46c       _sys_sbrk                  0040c46c f   scall2.obj\r
+ 0001:0000b4b2       _sys_waitpid               0040c4b2 f   scall2.obj\r
+ 0001:0000b52d       _sys__exit                 0040c52d f   scall2.obj\r
+ 0001:0000b545       _doexit                    0040c545 f   scall2.obj\r
+ 0001:0000b67e       _sys_fork                  0040c67e f   scall2.obj\r
+ 0001:0000b683       _sys_pause                 0040c683 f   scall2.obj\r
+ 0001:0000b69f       _sys_signal                0040c69f f   scall2.obj\r
+ 0001:0000b758       _sys_kill                  0040c758 f   scall2.obj\r
+ 0001:0000b7bc       _sys_alarm                 0040c7bc f   scall2.obj\r
+ 0001:0000b7e0       _sys_reboot                0040c7e0 f   scall2.obj\r
+ 0001:0000b833       _sys_getset                0040c833 f   scall2.obj\r
+ 0001:0000bcb0       _bitmap_align              0040ccb0 f   xip.obj\r
+ 0001:0000c368       _bitmap_ualign             0040d368 f   xip.obj\r
+ 0001:0000c490       _bitmap_examine            0040d490 f   xip.obj\r
+ 0001:0000c6b5       _bitmap_align_chase        0040d6b5 f   xip.obj\r
+ 0001:0000c7ca       _bitmap_align_bmap         0040d7ca f   xip.obj\r
+ 0001:0000ca50       _bitmap_align_reverse      0040da50 f   xip.obj\r
+ 0001:0000cb3b       _bitmap_align_recurse      0040db3b f   xip.obj\r
+ 0001:0000cf5e       _bitmap_search             0040df5e f   xip.obj\r
+ 0001:0000d0f0       _bitmap_reserve            0040e0f0 f   xip.obj\r
+ 0001:0000d2dd       _bitmap_find               0040e2dd f   xip.obj\r
+ 0001:0000d51c       _bitmap_get                0040e51c f   xip.obj\r
+ 0001:0000d5ed       _bitmap_set                0040e5ed f   xip.obj\r
+ 0001:0000dda0       _bzero                     0040eda0 f   utils.obj\r
+ 0001:0000ddc6       _bfill                     0040edc6 f   utils.obj\r
+ 0001:0000ddee       _bcopy                     0040edee f   utils.obj\r
+ 0001:0000de21       _int_min                   0040ee21 f   utils.obj\r
+ 0001:0000de42       _int_max                   0040ee42 f   utils.obj\r
+ 0001:0000dea0       _xfs_init                  0040eea0 f   xfs.obj\r
+ 0001:0000e00e       _xfs_end                   0040f00e f   xfs.obj\r
+ 0001:0000e055       _UZIXopen                  0040f055 f   xfs.obj\r
+ 0001:0000e07a       _UZIXclose                 0040f07a f   xfs.obj\r
+ 0001:0000e08c       _UZIXcreat                 0040f08c f   xfs.obj\r
+ 0001:0000e0b1       _UZIXlink                  0040f0b1 f   xfs.obj\r
+ 0001:0000e0cc       _UZIXsymlink               0040f0cc f   xfs.obj\r
+ 0001:0000e0e7       _UZIXunlink                0040f0e7 f   xfs.obj\r
+ 0001:0000e0f9       _UZIXread                  0040f0f9 f   xfs.obj\r
+ 0001:0000e124       _UZIXwrite                 0040f124 f   xfs.obj\r
+ 0001:0000e14f       _UZIXlseek                 0040f14f f   xfs.obj\r
+ 0001:0000e17e       _UZIXchdir                 0040f17e f   xfs.obj\r
+ 0001:0000e190       _UZIXmknod                 0040f190 f   xfs.obj\r
+ 0001:0000e1b4       _UZIXsync                  0040f1b4 f   xfs.obj\r
+ 0001:0000e1be       _UZIXaccess                0040f1be f   xfs.obj\r
+ 0001:0000e1d9       _UZIXchmod                 0040f1d9 f   xfs.obj\r
+ 0001:0000e1f4       _UZIXchown                 0040f1f4 f   xfs.obj\r
+ 0001:0000e218       _UZIXstat                  0040f218 f   xfs.obj\r
+ 0001:0000e23a       _UZIXfstat                 0040f23a f   xfs.obj\r
+ 0001:0000e25c       _UZIXfalign                0040f25c f   xfs.obj\r
+ 0001:0000e277       _UZIXdup                   0040f277 f   xfs.obj\r
+ 0001:0000e289       _UZIXdup2                  0040f289 f   xfs.obj\r
+ 0001:0000e2a4       _UZIXumask                 0040f2a4 f   xfs.obj\r
+ 0001:0000e2c0       _UZIXgetfsys               0040f2c0 f   xfs.obj\r
+ 0001:0000e2e0       _UZIXioctl                 0040f2e0 f   xfs.obj\r
+ 0001:0000e304       _UZIXmount                 0040f304 f   xfs.obj\r
+ 0001:0000e32f       _UZIXumount                0040f32f f   xfs.obj\r
+ 0001:0000e348       _UZIXtime                  0040f348 f   xfs.obj\r
+ 0001:0000e488       ___initstdio               0040f488 f   LIBC:_file.obj\r
+ 0001:0000e52d       ___endstdio                0040f52d f   LIBC:_file.obj\r
+ 0001:0000e541       _fgets                     0040f541 f   LIBC:fgets.obj\r
+ 0001:0000e598       _fflush                    0040f598 f   LIBC:fflush.obj\r
+ 0001:0000e5d3       __flush                    0040f5d3 f   LIBC:fflush.obj\r
+ 0001:0000e62f       __flushall                 0040f62f f   LIBC:fflush.obj\r
+ 0001:0000e6a5       _fprintf                   0040f6a5 f   LIBC:fprintf.obj\r
+ 0001:0000e6d7       _printf                    0040f6d7 f   LIBC:printf.obj\r
+ 0001:0000e710       _strcpy                    0040f710 f   LIBC:strcat.obj\r
+ 0001:0000e720       _strcat                    0040f720 f   LIBC:strcat.obj\r
+ 0001:0000e800       __cinit                    0040f800 f   LIBC:crt0dat.obj\r
+ 0001:0000e82d       _exit                      0040f82d f   LIBC:crt0dat.obj\r
+ 0001:0000e83e       __exit                     0040f83e f   LIBC:crt0dat.obj\r
+ 0001:0000e84f       __cexit                    0040f84f f   LIBC:crt0dat.obj\r
+ 0001:0000e85e       __c_exit                   0040f85e f   LIBC:crt0dat.obj\r
+ 0001:0000e920       _system                    0040f920 f   LIBC:system.obj\r
+ 0001:0000e9d0       _strchr                    0040f9d0 f   LIBC:strchr.obj\r
+ 0001:0000e9d6       ___from_strstr_to_strchr   0040f9d6 f   LIBC:strchr.obj\r
+ 0001:0000ea8c       _sscanf                    0040fa8c f   LIBC:sscanf.obj\r
+ 0001:0000eac0       _fputs                     0040fac0 f   LIBC:fputs.obj\r
+ 0001:0000eb03       __flsbuf                   0040fb03 f   LIBC:_flsbuf.obj\r
+ 0001:0000ec20       _strlen                    0040fc20 f   LIBC:strlen.obj\r
+ 0001:0000ec9b       __isctype                  0040fc9b f   LIBC:isctype.obj\r
+ 0001:0000ed10       __fsopen                   0040fd10 f   LIBC:fopen.obj\r
+ 0001:0000ed30       _fopen                     0040fd30 f   LIBC:fopen.obj\r
+ 0001:0000ed43       _sprintf                   0040fd43 f   LIBC:sprintf.obj\r
+ 0001:0000eda0       _strncat                   0040fda0 f   LIBC:strncat.obj\r
+ 0001:0000eec3       _fclose                    0040fec3 f   LIBC:fclose.obj\r
+ 0001:0000ef19       _fread                     0040ff19 f   LIBC:fread.obj\r
+ 0001:0000f001       _fwrite                    00410001 f   LIBC:fwrite.obj\r
+ 0001:0000f10b       _atol                      0041010b f   LIBC:atox.obj\r
+ 0001:0000f196       _atoi                      00410196 f   LIBC:atox.obj\r
+ 0001:0000f1a1       __atoi64                   004101a1 f   LIBC:atox.obj\r
+ 0001:0000f25b       __fputchar                 0041025b f   LIBC:fputchar.obj\r
+ 0001:0000f28a       _putchar                   0041028a f   LIBC:fputchar.obj\r
+ 0001:0000f295       _localtime                 00410295 f   LIBC:localtim.obj\r
+ 0001:0000f3f5       _time                      004103f5 f   LIBC:time.obj\r
+ 0001:0000f4d1       _mainCRTStartup            004104d1 f   LIBC:crt0.obj\r
+ 0001:0000f5b0       __amsg_exit                004105b0 f   LIBC:crt0.obj\r
+ 0001:0000f5f9       __ioinit                   004105f9 f   LIBC:ioinit.obj\r
+ 0001:0000f7a4       __ioterm                   004107a4 f   LIBC:ioinit.obj\r
+ 0001:0000f7c7       _calloc                    004107c7 f   LIBC:calloc.obj\r
+ 0001:0000f878       __fcloseall                00410878 f   LIBC:closeall.obj\r
+ 0001:0000f8d0       __filbuf                   004108d0 f   LIBC:_filbuf.obj\r
+ 0001:0000f9a9       __commit                   004109a9 f   LIBC:commit.obj\r
+ 0001:0000fa00       _write                     00410a00 f   LIBC:write.obj\r
+ 0001:0000fa00       __write                    00410a00 f   LIBC:write.obj\r
+ 0001:0000fbad       __stbuf                    00410bad f   LIBC:_sftbuf.obj\r
+ 0001:0000fc3a       __ftbuf                    00410c3a f   LIBC:_sftbuf.obj\r
+ 0001:0000fc77       __output                   00410c77 f   LIBC:output.obj\r
+ 0001:00010481       __spawnvpe                 00411481 f   LIBC:spawnvpe.obj\r
+ 0001:000105e4       __spawnve                  004115e4 f   LIBC:spawnve.obj\r
+ 0001:0001077e       __access                   0041177e f   LIBC:access.obj\r
+ 0001:000107c2       _getenv                    004117c2 f   LIBC:getenv.obj\r
+ 0001:0001083f       __input                    0041183f f   LIBC:input.obj\r
+ 0001:000112f0       _lseek                     004122f0 f   LIBC:lseek.obj\r
+ 0001:000112f0       __lseek                    004122f0 f   LIBC:lseek.obj\r
+ 0001:0001138a       __getbuf                   0041238a f   LIBC:_getbuf.obj\r
+ 0001:000113ce       _isatty                    004123ce f   LIBC:isatty.obj\r
+ 0001:000113ce       __isatty                   004123ce f   LIBC:isatty.obj\r
+ 0001:000113f4       ___crtGetStringTypeA       004123f4 f   LIBC:a_str.obj\r
+ 0001:0001153d       __openfile                 0041253d f   LIBC:_open.obj\r
+ 0001:000116ad       __getstream                004126ad f   LIBC:stream.obj\r
+ 0001:00011725       _free                      00412725 f   LIBC:free.obj\r
+ 0001:0001178e       __close                    0041278e f   LIBC:close.obj\r
+ 0001:00011841       __freebuf                  00412841 f   LIBC:_freebuf.obj\r
+ 0001:0001186c       __read                     0041286c f   LIBC:read.obj\r
+ 0001:0001186c       _read                      0041286c f   LIBC:read.obj\r
+ 0001:00011a70       _memcpy                    00412a70 f   LIBC:memcpy.obj\r
+ 0001:00011db0       __allmul                   00412db0 f   LIBC:llmul.obj\r
+ 0001:00011de4       ___tzset                   00412de4 f   LIBC:tzset.obj\r
+ 0001:00011df9       __tzset                    00412df9 f   LIBC:tzset.obj\r
+ 0001:00012057       __isindst                  00413057 f   LIBC:tzset.obj\r
+ 0001:00012343       _gmtime                    00413343 f   LIBC:gmtime.obj\r
+ 0001:0001243c       ___loctotime_t             0041343c f   LIBC:dtoxtime.obj\r
+ 0001:000124fe       __XcptFilter               004134fe f   LIBC:winxfltr.obj\r
+ 0001:00012682       __setenvp                  00413682 f   LIBC:stdenvp.obj\r
+ 0001:0001273b       __setargv                  0041373b f   LIBC:stdargv.obj\r
+ 0001:00012988       ___crtGetEnvironmentStringsA 00413988 f   LIBC:a_env.obj\r
+ 0001:00012aba       __GetLinkerVersion         00413aba f   LIBC:heapinit.obj\r
+ 0001:00012ae7       ___heap_select             00413ae7 f   LIBC:heapinit.obj\r
+ 0001:00012c2f       __heap_init                00413c2f f   LIBC:heapinit.obj\r
+ 0001:00012c8c       __heap_term                00413c8c f   LIBC:heapinit.obj\r
+ 0001:00012d34       __global_unwind2           00413d34 f   LIBC:exsup.obj\r
+ 0001:00012d76       __local_unwind2            00413d76 f   LIBC:exsup.obj\r
+ 0001:00012dce       __NLG_Return2              00413dce f   LIBC:exsup.obj\r
+ 0001:00012dde       __abnormal_termination     00413dde f   LIBC:exsup.obj\r
+ 0001:00012e01       __NLG_Notify1              00413e01 f   LIBC:exsup.obj\r
+ 0001:00012e0a       __NLG_Notify               00413e0a f   LIBC:exsup.obj\r
+ 0001:00012e1d       __NLG_Dispatch             00413e1d f   LIBC:exsup.obj\r
+ 0001:00012e2c       __except_handler3          00413e2c f   LIBC:exsup3.obj\r
+ 0001:00012ee9       __seh_longjmp_unwind@4     00413ee9 f   LIBC:exsup3.obj\r
+ 0001:00012f04       __FF_MSGBANNER             00413f04 f   LIBC:crt0msg.obj\r
+ 0001:00012f3d       __NMSG_WRITE               00413f3d f   LIBC:crt0msg.obj\r
+ 0001:00013090       __GET_RTERRMSG             00414090 f   LIBC:crt0msg.obj\r
+ 0001:000130c1       _malloc                    004140c1 f   LIBC:malloc.obj\r
+ 0001:000130d3       __nh_malloc                004140d3 f   LIBC:malloc.obj\r
+ 0001:000130ff       __heap_alloc               004140ff f   LIBC:malloc.obj\r
+ 0001:00013180       _memset                    00414180 f   LIBC:memset.obj\r
+ 0001:000131d8       ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z 004141d8 f   LIBC:handler.obj\r
+ 0001:000131e8       ?_query_new_handler@@YAP6AHI@ZXZ 004141e8 f   LIBC:handler.obj\r
+ 0001:000131ee       __callnewh                 004141ee f   LIBC:handler.obj\r
+ 0001:00013209       __get_sbh_threshold        00414209 f   LIBC:sbheap.obj\r
+ 0001:00013228       __set_sbh_threshold        00414228 f   LIBC:sbheap.obj\r
+ 0001:000132db       ___sbh_heap_init           004142db f   LIBC:sbheap.obj\r
+ 0001:00013323       ___sbh_find_block          00414323 f   LIBC:sbheap.obj\r
+ 0001:0001334e       ___sbh_free_block          0041434e f   LIBC:sbheap.obj\r
+ 0001:00013677       ___sbh_alloc_block         00414677 f   LIBC:sbheap.obj\r
+ 0001:00013980       ___sbh_alloc_new_region    00414980 f   LIBC:sbheap.obj\r
+ 0001:00013a31       ___sbh_alloc_new_group     00414a31 f   LIBC:sbheap.obj\r
+ 0001:00013b2c       ___sbh_resize_block        00414b2c f   LIBC:sbheap.obj\r
+ 0001:00013e22       ___sbh_heapmin             00414e22 f   LIBC:sbheap.obj\r
+ 0001:00013ef3       ___sbh_heap_check          00414ef3 f   LIBC:sbheap.obj\r
+ 0001:00014222       __get_old_sbh_threshold    00415222 f   LIBC:sbheap.obj\r
+ 0001:00014228       __set_old_sbh_threshold    00415228 f   LIBC:sbheap.obj\r
+ 0001:00014244       ___old_sbh_new_region      00415244 f   LIBC:sbheap.obj\r
+ 0001:00014388       ___old_sbh_release_region  00415388 f   LIBC:sbheap.obj\r
+ 0001:000143de       ___old_sbh_decommit_pages  004153de f   LIBC:sbheap.obj\r
+ 0001:000144a0       ___old_sbh_find_block      004154a0 f   LIBC:sbheap.obj\r
+ 0001:000144f7       ___old_sbh_free_block      004154f7 f   LIBC:sbheap.obj\r
+ 0001:0001453c       ___old_sbh_alloc_block     0041553c f   LIBC:sbheap.obj\r
+ 0001:00014744       ___old_sbh_alloc_block_from_page 00415744 f   LIBC:sbheap.obj\r
+ 0001:00014868       ___old_sbh_resize_block    00415868 f   LIBC:sbheap.obj\r
+ 0001:00014911       ___old_sbh_heap_check      00415911 f   LIBC:sbheap.obj\r
+ 0001:00014a6f       __alloc_osfhnd             00415a6f f   LIBC:osfinfo.obj\r
+ 0001:00014b04       __set_osfhnd               00415b04 f   LIBC:osfinfo.obj\r
+ 0001:00014b7b       __free_osfhnd              00415b7b f   LIBC:osfinfo.obj\r
+ 0001:00014bf5       __get_osfhandle            00415bf5 f   LIBC:osfinfo.obj\r
+ 0001:00014c32       __open_osfhandle           00415c32 f   LIBC:osfinfo.obj\r
+ 0001:00014ccf       __dosmaperr                00415ccf f   LIBC:dosmap.obj\r
+ 0001:00014d36       _wctomb                    00415d36 f   LIBC:wctomb.obj\r
+ 0001:00014da0       __aulldiv                  00415da0 f   LIBC:ulldiv.obj\r
+ 0001:00014e10       __aullrem                  00415e10 f   LIBC:ullrem.obj\r
+ 0001:00014e85       __mbsrchr                  00415e85 f   LIBC:mbsrchr.obj\r
+ 0001:00014ee5       __getpath                  00415ee5 f   LIBC:getpath.obj\r
+ 0001:00014f59       __mbschr                   00415f59 f   LIBC:mbschr.obj\r
+ 0001:00014fcc       __dospawn                  00415fcc f   LIBC:dospawn.obj\r
+ 0001:000151ab       __cenvarg                  004161ab f   LIBC:cenvarg.obj\r
+ 0001:000153af       __mbsnbicoll               004163af f   LIBC:mbsnbico.obj\r
+ 0001:000153ee       ___wtomb_environ           004163ee f   LIBC:wtombenv.obj\r
+ 0001:0001545c       _mbtowc                    0041645c f   LIBC:mbtowc.obj\r
+ 0001:00015524       _isalpha                   00416524 f   LIBC:_ctype.obj\r
+ 0001:00015552       _isupper                   00416552 f   LIBC:_ctype.obj\r
+ 0001:0001557a       _islower                   0041657a f   LIBC:_ctype.obj\r
+ 0001:000155a2       _isdigit                   004165a2 f   LIBC:_ctype.obj\r
+ 0001:000155ca       _isxdigit                  004165ca f   LIBC:_ctype.obj\r
+ 0001:000155f7       _isspace                   004165f7 f   LIBC:_ctype.obj\r
+ 0001:0001561f       _ispunct                   0041661f f   LIBC:_ctype.obj\r
+ 0001:00015647       _isalnum                   00416647 f   LIBC:_ctype.obj\r
+ 0001:00015675       _isprint                   00416675 f   LIBC:_ctype.obj\r
+ 0001:000156a3       _isgraph                   004166a3 f   LIBC:_ctype.obj\r
+ 0001:000156d1       _iscntrl                   004166d1 f   LIBC:_ctype.obj\r
+ 0001:000156f9       ___isascii                 004166f9 f   LIBC:_ctype.obj\r
+ 0001:00015706       ___toascii                 00416706 f   LIBC:_ctype.obj\r
+ 0001:0001570e       ___iscsymf                 0041670e f   LIBC:_ctype.obj\r
+ 0001:0001574b       ___iscsym                  0041674b f   LIBC:_ctype.obj\r
+ 0001:00015790       __allshl                   00416790 f   LIBC:llshl.obj\r
+ 0001:000157af       _ungetc                    004167af f   LIBC:ungetc.obj\r
+ 0001:00015820       __alloca_probe             00416820 f   LIBC:chkstk.obj\r
+ 0001:00015820       __chkstk                   00416820 f   LIBC:chkstk.obj\r
+ 0001:0001584f       __open                     0041684f f   LIBC:open.obj\r
+ 0001:0001584f       _open                      0041684f f   LIBC:open.obj\r
+ 0001:00015866       __sopen                    00416866 f   LIBC:open.obj\r
+ 0001:00015b20       _strncpy                   00416b20 f   LIBC:strncpy.obj\r
+ 0001:00015c20       _strcmp                    00416c20 f   LIBC:strcmp.obj\r
+ 0001:00015ca4       __setmbcp                  00416ca4 f   LIBC:mbctype.obj\r
+ 0001:00016068       __getmbcp                  00417068 f   LIBC:mbctype.obj\r
+ 0001:00016078       ___initmbctable            00417078 f   LIBC:mbctype.obj\r
+ 0001:00016094       _strtol                    00417094 f   LIBC:strtol.obj\r
+ 0001:000162b3       _strtoul                   004172b3 f   LIBC:strtol.obj\r
+ 0001:000162d0       _strstr                    004172d0 f   LIBC:strstr.obj\r
+ 0001:00016350       _strncmp                   00417350 f   LIBC:strncmp.obj\r
+ 0001:00016388       ___crtMessageBoxA          00417388 f   LIBC:crtmbox.obj\r
+ 0001:00016420       _memmove                   00417420 f   LIBC:memmove.obj\r
+ 0001:00016755       __fptrap                   00417755 f   LIBC:crt0fp.obj\r
+ 0001:00016760       _strrchr                   00417760 f   LIBC:strrchr.obj\r
+ 0001:00016787       ___crtCompareStringA       00417787 f   LIBC:a_cmp.obj\r
+ 0001:00016a2f       ___crtsetenv               00417a2f f   LIBC:setenv.obj\r
+ 0001:00016c75       __chsize                   00417c75 f   LIBC:chsize.obj\r
+ 0001:00016dbb       ___crtLCMapStringA         00417dbb f   LIBC:a_map.obj\r
+ 0001:0001700a       __toupper                  0041800a f   LIBC:toupper.obj\r
+ 0001:00017012       _toupper                   00418012 f   LIBC:toupper.obj\r
+ 0001:000170de       _realloc                   004180de f   LIBC:realloc.obj\r
+ 0001:0001737e       __strdup                   0041837e f   LIBC:strdup.obj\r
+ 0001:000173a9       __setmode                  004183a9 f   LIBC:setmode.obj\r
+ 0001:00017420       _ExitProcess@4             00418420 f   kernel32:KERNEL32.dll\r
+ 0001:00017426       _TerminateProcess@8        00418426 f   kernel32:KERNEL32.dll\r
+ 0001:0001742c       _GetCurrentProcess@0       0041842c f   kernel32:KERNEL32.dll\r
+ 0001:00017432       _GetTimeZoneInformation@4  00418432 f   kernel32:KERNEL32.dll\r
+ 0001:00017438       _GetSystemTime@4           00418438 f   kernel32:KERNEL32.dll\r
+ 0001:0001743e       _GetLocalTime@4            0041843e f   kernel32:KERNEL32.dll\r
+ 0001:00017444       _GetCommandLineA@0         00418444 f   kernel32:KERNEL32.dll\r
+ 0001:0001744a       _GetVersion@0              0041844a f   kernel32:KERNEL32.dll\r
+ 0001:00017450       _SetHandleCount@4          00418450 f   kernel32:KERNEL32.dll\r
+ 0001:00017456       _GetStdHandle@4            00418456 f   kernel32:KERNEL32.dll\r
+ 0001:0001745c       _GetFileType@4             0041845c f   kernel32:KERNEL32.dll\r
+ 0001:00017462       _GetStartupInfoA@4         00418462 f   kernel32:KERNEL32.dll\r
+ 0001:00017468       _HeapAlloc@12              00418468 f   kernel32:KERNEL32.dll\r
+ 0001:0001746e       _GetLastError@0            0041846e f   kernel32:KERNEL32.dll\r
+ 0001:00017474       _FlushFileBuffers@4        00418474 f   kernel32:KERNEL32.dll\r
+ 0001:0001747a       _WriteFile@20              0041847a f   kernel32:KERNEL32.dll\r
+ 0001:00017480       _GetFileAttributesA@4      00418480 f   kernel32:KERNEL32.dll\r
+ 0001:00017486       _SetFilePointer@16         00418486 f   kernel32:KERNEL32.dll\r
+ 0001:0001748c       _MultiByteToWideChar@24    0041848c f   kernel32:KERNEL32.dll\r
+ 0001:00017492       _GetStringTypeA@20         00418492 f   kernel32:KERNEL32.dll\r
+ 0001:00017498       _GetStringTypeW@16         00418498 f   kernel32:KERNEL32.dll\r
+ 0001:0001749e       _HeapFree@12               0041849e f   kernel32:KERNEL32.dll\r
+ 0001:000174a4       _CloseHandle@4             004184a4 f   kernel32:KERNEL32.dll\r
+ 0001:000174aa       _ReadFile@20               004184aa f   kernel32:KERNEL32.dll\r
+ 0001:000174b0       _WideCharToMultiByte@32    004184b0 f   kernel32:KERNEL32.dll\r
+ 0001:000174b6       _UnhandledExceptionFilter@4 004184b6 f   kernel32:KERNEL32.dll\r
+ 0001:000174bc       _GetModuleFileNameA@12     004184bc f   kernel32:KERNEL32.dll\r
+ 0001:000174c2       _FreeEnvironmentStringsA@4 004184c2 f   kernel32:KERNEL32.dll\r
+ 0001:000174c8       _FreeEnvironmentStringsW@4 004184c8 f   kernel32:KERNEL32.dll\r
+ 0001:000174ce       _GetEnvironmentStrings@0   004184ce f   kernel32:KERNEL32.dll\r
+ 0001:000174d4       _GetEnvironmentStringsW@0  004184d4 f   kernel32:KERNEL32.dll\r
+ 0001:000174da       _GetModuleHandleA@4        004184da f   kernel32:KERNEL32.dll\r
+ 0001:000174e0       _GetEnvironmentVariableA@12 004184e0 f   kernel32:KERNEL32.dll\r
+ 0001:000174e6       _GetVersionExA@4           004184e6 f   kernel32:KERNEL32.dll\r
+ 0001:000174ec       _HeapDestroy@4             004184ec f   kernel32:KERNEL32.dll\r
+ 0001:000174f2       _HeapCreate@12             004184f2 f   kernel32:KERNEL32.dll\r
+ 0001:000174f8       _VirtualFree@12            004184f8 f   kernel32:KERNEL32.dll\r
+ 0001:000174fe       _RtlUnwind@16              004184fe f   kernel32:KERNEL32.dll\r
+ 0001:00017504       _VirtualAlloc@16           00418504 f   kernel32:KERNEL32.dll\r
+ 0001:0001750a       _HeapReAlloc@16            0041850a f   kernel32:KERNEL32.dll\r
+ 0001:00017510       _IsBadWritePtr@8           00418510 f   kernel32:KERNEL32.dll\r
+ 0001:00017516       _SetStdHandle@8            00418516 f   kernel32:KERNEL32.dll\r
+ 0001:0001751c       _GetExitCodeProcess@8      0041851c f   kernel32:KERNEL32.dll\r
+ 0001:00017522       _WaitForSingleObject@8     00418522 f   kernel32:KERNEL32.dll\r
+ 0001:00017528       _CreateProcessA@40         00418528 f   kernel32:KERNEL32.dll\r
+ 0001:0001752e       _CreateFileA@28            0041852e f   kernel32:KERNEL32.dll\r
+ 0001:00017534       _GetCPInfo@8               00418534 f   kernel32:KERNEL32.dll\r
+ 0001:0001753a       _GetACP@0                  0041853a f   kernel32:KERNEL32.dll\r
+ 0001:00017540       _GetOEMCP@0                00418540 f   kernel32:KERNEL32.dll\r
+ 0001:00017546       _GetProcAddress@8          00418546 f   kernel32:KERNEL32.dll\r
+ 0001:0001754c       _LoadLibraryA@4            0041854c f   kernel32:KERNEL32.dll\r
+ 0001:00017552       _CompareStringA@24         00418552 f   kernel32:KERNEL32.dll\r
+ 0001:00017558       _CompareStringW@24         00418558 f   kernel32:KERNEL32.dll\r
+ 0001:0001755e       _SetEnvironmentVariableA@8 0041855e f   kernel32:KERNEL32.dll\r
+ 0001:00017564       _SetEndOfFile@4            00418564 f   kernel32:KERNEL32.dll\r
+ 0001:0001756a       _LCMapStringA@24           0041856a f   kernel32:KERNEL32.dll\r
+ 0001:00017570       _LCMapStringW@24           00418570 f   kernel32:KERNEL32.dll\r
+ 0001:00017580       __stricmp                  00418580 f   LIBC:stricmp.obj\r
+ 0001:00017580       __strcmpi                  00418580 f   LIBC:stricmp.obj\r
+ 0001:00017580       _stricmp                   00418580 f   LIBC:stricmp.obj\r
+ 0001:0001760c       _chdir                     0041860c f   LIBC:chdir.obj\r
+ 0001:0001760c       __chdir                    0041860c f   LIBC:chdir.obj\r
+ 0001:000176a0       _memicmp                   004186a0 f   LIBC:memicmp.obj\r
+ 0001:000176a0       __memicmp                  004186a0 f   LIBC:memicmp.obj\r
+ 0001:0001773d       _fileno                    0041873d f   LIBC:fileno.obj\r
+ 0001:0001773d       __fileno                   0041873d f   LIBC:fileno.obj\r
+ 0001:00017745       __tolower                  00418745 f   LIBC:tolower.obj\r
+ 0001:0001774d       _tolower                   0041874d f   LIBC:tolower.obj\r
+ 0001:00017818       __mbctoupper               00418818 f   LIBC:mbtoupr.obj\r
+ 0001:00017894       _GetCurrentDirectoryA@8    00418894 f   kernel32:KERNEL32.dll\r
+ 0001:0001789a       _SetCurrentDirectoryA@4    0041889a f   kernel32:KERNEL32.dll\r
+ 0002:0000001c       ??_C@_07OOMJ@cmd?4exe?$AA@ 0041c01c     LIBC:system.obj\r
+ 0002:00000024       ??_C@_0M@IPJP@command?4com?$AA@ 0041c024     LIBC:system.obj\r
+ 0002:00000030       ??_C@_02JMK@?1c?$AA@       0041c030     LIBC:system.obj\r
+ 0002:00000034       ??_C@_07KFDO@COMSPEC?$AA@  0041c034     LIBC:system.obj\r
+ 0002:0000004c       ___lookuptable             0041c04c     LIBC:output.obj\r
+ 0002:000000a8       ??_C@_1O@POHA@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 0041c0a8     LIBC:output.obj\r
+ 0002:000000b8       ??_C@_06ONKE@?$CInull?$CJ?$AA@ 0041c0b8     LIBC:output.obj\r
+ 0002:000000c0       ??_C@_01PCFE@?2?$AA@       0041c0c0     LIBC:spawnvpe.obj\r
+ 0002:000000c4       ??_C@_04LNMG@PATH?$AA@     0041c0c4     LIBC:spawnvpe.obj\r
+ 0002:000000cc       ??_C@_04GGNP@?4com?$AA@    0041c0cc     LIBC:spawnve.obj\r
+ 0002:000000d4       ??_C@_04NFOM@?4exe?$AA@    0041c0d4     LIBC:spawnve.obj\r
+ 0002:000000dc       ??_C@_04KBDN@?4bat?$AA@    0041c0dc     LIBC:spawnve.obj\r
+ 0002:000000e4       ??_C@_04LFKF@?4cmd?$AA@    0041c0e4     LIBC:spawnve.obj\r
+ 0002:000000ec       ??_C@_02OFKN@?4?2?$AA@     0041c0ec     LIBC:spawnve.obj\r
+ 0002:000000f0       ??_C@_01A@?$AA?$AA@        0041c0f0     LIBC:a_str.obj\r
+ 0002:000000f4       ??_C@_13A@?$AA?$AA?$AA?$AA@ 0041c0f4     LIBC:a_str.obj\r
+ 0002:00000104       ___dnames                  0041c104     LIBC:timeset.obj\r
+ 0002:0000011c       ___mnames                  0041c11c     LIBC:timeset.obj\r
+ 0002:00000144       ??_C@_02JHIA@TZ?$AA@       0041c144     LIBC:tzset.obj\r
+ 0002:00000148       ??_C@_0BH@PHHF@__GLOBAL_HEAP_SELECTED?$AA@ 0041c148     LIBC:heapinit.obj\r
+ 0002:00000160       ??_C@_0BF@BBGL@__MSVCRT_HEAP_SELECT?$AA@ 0041c160     LIBC:heapinit.obj\r
+ 0002:00000178       ??_C@_0P@GGKG@runtime?5error?5?$AA@ 0041c178     LIBC:crt0msg.obj\r
+ 0002:00000188       ??_C@_02PIMC@?$AN?6?$AA@   0041c188     LIBC:crt0msg.obj\r
+ 0002:0000018c       ??_C@_0O@DELO@TLOSS?5error?$AN?6?$AA@ 0041c18c     LIBC:crt0msg.obj\r
+ 0002:0000019c       ??_C@_0N@OMLL@SING?5error?$AN?6?$AA@ 0041c19c     LIBC:crt0msg.obj\r
+ 0002:000001ac       ??_C@_0P@OJAK@DOMAIN?5error?$AN?6?$AA@ 0041c1ac     LIBC:crt0msg.obj\r
+ 0002:000001bc       ??_C@_0CF@EANP@R6028?$AN?6?9?5unable?5to?5initialize?5he@ 0041c1bc     LIBC:crt0msg.obj\r
+ 0002:000001e4       ??_C@_0DF@ECGN@R6027?$AN?6?9?5not?5enough?5space?5for?5lo@ 0041c1e4     LIBC:crt0msg.obj\r
+ 0002:0000021c       ??_C@_0DF@FKAC@R6026?$AN?6?9?5not?5enough?5space?5for?5st@ 0041c21c     LIBC:crt0msg.obj\r
+ 0002:00000254       ??_C@_0CG@DPMN@R6025?$AN?6?9?5pure?5virtual?5function?5c@ 0041c254     LIBC:crt0msg.obj\r
+ 0002:0000027c       ??_C@_0DF@CKIP@R6024?$AN?6?9?5not?5enough?5space?5for?5_o@ 0041c27c     LIBC:crt0msg.obj\r
+ 0002:000002b4       ??_C@_0CJ@GGOE@R6019?$AN?6?9?5unable?5to?5open?5console?5@ 0041c2b4     LIBC:crt0msg.obj\r
+ 0002:000002e0       ??_C@_0CB@LBOB@R6018?$AN?6?9?5unexpected?5heap?5error?$AN?6@ 0041c2e0     LIBC:crt0msg.obj\r
+ 0002:00000304       ??_C@_0CN@FPEG@R6017?$AN?6?9?5unexpected?5multithread?5@ 0041c304     LIBC:crt0msg.obj\r
+ 0002:00000334       ??_C@_0CM@OBIC@R6016?$AN?6?9?5not?5enough?5space?5for?5th@ 0041c334     LIBC:crt0msg.obj\r
+ 0002:00000360       ??_C@_0CB@HPAL@?$AN?6abnormal?5program?5termination?$AN?6@ 0041c360     LIBC:crt0msg.obj\r
+ 0002:00000384       ??_C@_0CM@JOOB@R6009?$AN?6?9?5not?5enough?5space?5for?5en@ 0041c384     LIBC:crt0msg.obj\r
+ 0002:000003b0       ??_C@_0CK@OIBL@R6008?$AN?6?9?5not?5enough?5space?5for?5ar@ 0041c3b0     LIBC:crt0msg.obj\r
+ 0002:000003dc       ??_C@_0CF@LKPB@R6002?$AN?6?9?5floating?5point?5not?5load@ 0041c3dc     LIBC:crt0msg.obj\r
+ 0002:00000404       ??_C@_0CF@JPDF@Microsoft?5Visual?5C?$CL?$CL?5Runtime?5Lib@ 0041c404     LIBC:crt0msg.obj\r
+ 0002:0000042c       ??_C@_02JJJH@?6?6?$AA@     0041c42c     LIBC:crt0msg.obj\r
+ 0002:00000430       ??_C@_0BK@DEOK@Runtime?5Error?$CB?6?6Program?3?5?$AA@ 0041c430     LIBC:crt0msg.obj\r
+ 0002:0000044c       ??_C@_03NAME@?4?4?4?$AA@   0041c44c     LIBC:crt0msg.obj\r
+ 0002:00000450       ??_C@_0BH@NNCD@?$DMprogram?5name?5unknown?$DO?$AA@ 0041c450     LIBC:crt0msg.obj\r
+ 0002:00000468       ??_C@_0BD@NJFP@GetLastActivePopup?$AA@ 0041c468     LIBC:crtmbox.obj\r
+ 0002:0000047c       ??_C@_0BA@GILI@GetActiveWindow?$AA@ 0041c47c     LIBC:crtmbox.obj\r
+ 0002:0000048c       ??_C@_0M@PKCK@MessageBoxA?$AA@ 0041c48c     LIBC:crtmbox.obj\r
+ 0002:00000498       ??_C@_0L@HKL@user32?4dll?$AA@ 0041c498     LIBC:crtmbox.obj\r
+ 0003:00000000       ___xc_a                    0041d000     LIBC:crt0init.obj\r
+ 0003:00000104       ___xc_z                    0041d104     LIBC:crt0init.obj\r
+ 0003:00000208       ___xi_a                    0041d208     LIBC:crt0init.obj\r
+ 0003:00000418       ___xi_z                    0041d418     LIBC:crt0init.obj\r
+ 0003:0000051c       ___xp_a                    0041d51c     LIBC:crt0init.obj\r
+ 0003:00000724       ___xp_z                    0041d724     LIBC:crt0init.obj\r
+ 0003:00000828       ___xt_a                    0041d828     LIBC:crt0init.obj\r
+ 0003:0000092c       ___xt_z                    0041d92c     LIBC:crt0init.obj\r
+ 0003:00000a30       _in                        0041da30     ucp.obj\r
+ 0003:00000a34       _rdev                      0041da34     ucp.obj\r
+ 0003:00000a38       _syserror                  0041da38     ucp.obj\r
+ 0003:00000a3c       _help                      0041da3c     ucp.obj\r
+ 0003:0000177c       _cmdblk                    0041e77c     devhd.obj\r
+ 0003:00001784       _busid                     0041e784     devhd.obj\r
+ 0003:000017c0       _dev_tab                   0041e7c0     devio.obj\r
+ 0003:00001978       _tty_default               0041e978     devtty.obj\r
+ 0003:00001988       _tty_vector                0041e988     devtty.obj\r
+ 0003:000019b0       _ttyinq                    0041e9b0     devtty.obj\r
+ 0003:00001ae0       _baddevmsg                 0041eae0     filesys.obj\r
+ 0003:00001e84       _UZIX                      0041ee84     main.obj\r
+ 0003:00001e94       _HOST                      0041ee94     main.obj\r
+ 0003:000020ac       _stringerr                 0041f0ac     xfs.obj\r
+ 0003:00002638       __iob                      0041f638     LIBC:_file.obj\r
+ 0003:000028c0       __pctype                   0041f8c0     LIBC:ctype.obj\r
+ 0003:000028c4       __pwctype                  0041f8c4     LIBC:ctype.obj\r
+ 0003:000028c8       __ctype                    0041f8c8     LIBC:ctype.obj\r
+ 0003:00002acc       ___mb_cur_max              0041facc     LIBC:nlsdata1.obj\r
+ 0003:00002ad0       ___decimal_point           0041fad0     LIBC:nlsdata1.obj\r
+ 0003:00002ad4       ___decimal_point_length    0041fad4     LIBC:nlsdata1.obj\r
+ 0003:00002ae0       __aexit_rtn                0041fae0     LIBC:crt0.obj\r
+ 0003:00002ae4       ___app_type                0041fae4     LIBC:crt0.obj\r
+ 0003:00002ae8       ___badioinfo               0041fae8     LIBC:ioinit.obj\r
+ 0003:00002af0       ___nullstring              0041faf0     LIBC:output.obj\r
+ 0003:00002af4       ___wnullstring             0041faf4     LIBC:output.obj\r
+ 0003:00002b20       __timezone                 0041fb20     LIBC:timeset.obj\r
+ 0003:00002b24       __daylight                 0041fb24     LIBC:timeset.obj\r
+ 0003:00002b28       __dstbias                  0041fb28     LIBC:timeset.obj\r
+ 0003:00002bac       __tzname                   0041fbac     LIBC:timeset.obj\r
+ 0003:00002bd8       __XcptActTab               0041fbd8     LIBC:winxfltr.obj\r
+ 0003:00002c50       __First_FPE_Indx           0041fc50     LIBC:winxfltr.obj\r
+ 0003:00002c54       __Num_FPE                  0041fc54     LIBC:winxfltr.obj\r
+ 0003:00002c58       __XcptActTabCount          0041fc58     LIBC:winxfltr.obj\r
+ 0003:00002c5c       __fpecode                  0041fc5c     LIBC:winxfltr.obj\r
+ 0003:00002c60       __amblksiz                 0041fc60     LIBC:heapinit.obj\r
+ 0003:00002c64       __NLG_Destination          0041fc64     LIBC:exsup.obj\r
+ 0003:00002d10       ___old_small_block_heap    0041fd10     LIBC:sbheap.obj\r
+ 0003:00004d34       ___old_sbh_threshold       00421d34     LIBC:sbheap.obj\r
+ 0003:00004ea0       __cfltcvt_tab              00421ea0     LIBC:cmiscdat.obj\r
+ 0003:00004ec0       __p_overlay                00421ec0     LIBC:dospawn.obj\r
+ 0003:00004ed0       __lpdays                   00421ed0     LIBC:days.obj\r
+ 0003:00004f04       __days                     00421f04     LIBC:days.obj\r
+ 0003:000059a0       _f_pause                   004229a0     ucp.obj\r
+ 0003:000059a1       _unix_locked_out           004229a1     <common>\r
+ 0003:000059a2       _swapblk                   004229a2     <common>\r
+ 0003:000059a4       _hd_offset                 004229a4     devhd.obj\r
+ 0003:000059a8       _hd_sector                 004229a8     devhd.obj\r
+ 0003:000059ac       _dptr                      004229ac     devhd.obj\r
+ 0003:000059b0       _dlen                      004229b0     devhd.obj\r
+ 0003:000059b4       _cptr                      004229b4     devhd.obj\r
+ 0003:000059b9       _dirty_mask                004229b9     <common>\r
+ 0003:000059ba       _inint                     004229ba     <common>\r
+ 0003:000059bc       _initproc                  004229bc     <common>\r
+ 0003:000059c0       _bufclock                  004229c0     devio.obj\r
+ 0003:000059c8       _swapcnt                   004229c8     <common>\r
+ 0003:000059cd       _traceon                   004229cd     <common>\r
+ 0003:000059ce       _sec                       004229ce     <common>\r
+ 0003:000059d9       _total                     004229d9     <common>\r
+ 0003:000059da       _waitno                    004229da     <common>\r
+ 0003:000059e4       _tod                       004229e4     <common>\r
+ 0003:000059f4       _runticks                  004229f4     <common>\r
+ 0003:000059f6       _root_dev                  004229f6     <common>\r
+ 0003:00005a08       __cflush                   00422a08     LIBC:_file.obj\r
+ 0003:00005a0c       _errno                     00422a0c     LIBC:crt0dat.obj\r
+ 0003:00005a10       __doserrno                 00422a10     LIBC:crt0dat.obj\r
+ 0003:00005a14       __umaskval                 00422a14     LIBC:crt0dat.obj\r
+ 0003:00005a18       __osver                    00422a18     LIBC:crt0dat.obj\r
+ 0003:00005a1c       __winver                   00422a1c     LIBC:crt0dat.obj\r
+ 0003:00005a20       __winmajor                 00422a20     LIBC:crt0dat.obj\r
+ 0003:00005a24       __winminor                 00422a24     LIBC:crt0dat.obj\r
+ 0003:00005a28       ___argc                    00422a28     LIBC:crt0dat.obj\r
+ 0003:00005a2c       ___argv                    00422a2c     LIBC:crt0dat.obj\r
+ 0003:00005a30       ___wargv                   00422a30     LIBC:crt0dat.obj\r
+ 0003:00005a34       __environ                  00422a34     LIBC:crt0dat.obj\r
+ 0003:00005a38       ___initenv                 00422a38     LIBC:crt0dat.obj\r
+ 0003:00005a3c       __wenviron                 00422a3c     LIBC:crt0dat.obj\r
+ 0003:00005a40       ___winitenv                00422a40     LIBC:crt0dat.obj\r
+ 0003:00005a44       __pgmptr                   00422a44     LIBC:crt0dat.obj\r
+ 0003:00005a48       __wpgmptr                  00422a48     LIBC:crt0dat.obj\r
+ 0003:00005a4c       __exitflag                 00422a4c     LIBC:crt0dat.obj\r
+ 0003:00005a50       __C_Termination_Done       00422a50     LIBC:crt0dat.obj\r
+ 0003:00005a54       __C_Exit_Done              00422a54     LIBC:crt0dat.obj\r
+ 0003:00005a70       __aenvptr                  00422a70     LIBC:crt0.obj\r
+ 0003:00005a74       __wenvptr                  00422a74     LIBC:crt0.obj\r
+ 0003:00005a78       ___error_mode              00422a78     LIBC:crt0.obj\r
+ 0003:00005a7c       __stdbuf                   00422a7c     LIBC:_sftbuf.obj\r
+ 0003:00005b44       _swapbase                  00422b44     <common>\r
+ 0003:00005b6c       __pxcptinfoptrs            00422b6c     LIBC:winxfltr.obj\r
+ 0003:00005c78       __adbgmsg                  00422c78     LIBC:crt0msg.obj\r
+ 0003:00005c7c       ?_pnhHeap@@3P6AHI@ZA       00422c7c     LIBC:handler.obj\r
+ 0003:00005c80       __newmode                  00422c80     LIBC:_newmode.obj\r
+ 0003:00005c88       ___lc_handle               00422c88     LIBC:nlsdata2.obj\r
+ 0003:00005ca0       ___lc_codepage             00422ca0     LIBC:nlsdata2.obj\r
+ 0003:00005ca4       ___lc_collate_cp           00422ca4     LIBC:nlsdata2.obj\r
+ 0003:00005ca8       __commode                  00422ca8     LIBC:ncommode.obj\r
+ 0003:00005cc0       __fmode                    00422cc0     LIBC:txtmode.obj\r
+ 0003:00005cc8       _ticks                     00422cc8     <common>\r
+ 0003:00005ccc       _root_ino                  00422ccc     <common>\r
+ 0003:00005cd0       _ibuf                      00422cd0     <common>\r
+ 0003:00005cdc       _ncalls                    00422cdc     <common>\r
+ 0003:00005ce0       _bufpool                   00422ce0     <common>\r
+ 0003:00007158       _osBank                    00424158     <common>\r
+ 0003:0000715c       _disp_tab                  0042415c     <common>\r
+ 0003:00007160       _fs_tab                    00424160     <common>\r
+ 0003:000071cc       _buf_flsh                  004241cc     <common>\r
+ 0003:000071d0       _buf_hits                  004241d0     <common>\r
+ 0003:000071d4       _buf_miss                  004241d4     <common>\r
+ 0003:000071e0       _of_tab                    004241e0     <common>\r
+ 0003:00007360       _i_tab                     00424360     <common>\r
+ 0003:00007f40       _ub                        00424f40     <common>\r
+ 0003:00008f40       _ptab                      00425f40     <common>\r
+ 0003:00009080       _kbuf                      00426080     <common>\r
+ 0003:000090c0       _recv_bufs                 004260c0     <common>\r
+ 0003:00009dc0       _stopflag                  00426dc0     <common>\r
+ 0003:00009e00       _flshflag                  00426e00     <common>\r
+ 0003:00009e40       _tty_data                  00426e40     <common>\r
+ 0003:00009ee0       _cwd                       00426ee0     <common>\r
+ 0003:00009f80       _line                      00426f80     <common>\r
+ 0003:0000ade4       ___mbcodepage              00427de4     <common>\r
+ 0003:0000ae60       ___mbulinfo                00427e60     <common>\r
+ 0003:0000ae6c       ___ismbcodepage            00427e6c     <common>\r
+ 0003:0000ae80       __mbcasemap                00427e80     <common>\r
+ 0003:0000af80       __mbctype                  00427f80     <common>\r
+ 0003:0000b084       ___mblcid                  00428084     <common>\r
+ 0003:0000b088       ___sbh_sizeHeaderList      00428088     <common>\r
+ 0003:0000b09c       ___sbh_indGroupDefer       0042809c     <common>\r
+ 0003:0000b0a0       ___sbh_pHeaderScan         004280a0     <common>\r
+ 0003:0000b0a4       ___sbh_initialized         004280a4     <common>\r
+ 0003:0000b0a8       ___sbh_pHeaderDefer        004280a8     <common>\r
+ 0003:0000b0ac       ___sbh_cntHeaderList       004280ac     <common>\r
+ 0003:0000b0b0       ___sbh_pHeaderList         004280b0     <common>\r
+ 0003:0000b0b4       ___sbh_threshold           004280b4     <common>\r
+ 0003:0000b0b8       __crtheap                  004280b8     <common>\r
+ 0003:0000b0c8       ___active_heap             004280c8     <common>\r
+ 0003:0000b0e0       ___pioinfo                 004280e0     <common>\r
+ 0003:0000b21c       __nhandle                  0042821c     <common>\r
+ 0003:0000b220       __acmdln                   00428220     <common>\r
+ 0003:0000b22c       ___env_initialized         0042822c     <common>\r
+ 0003:0000b23c       ___mbctype_initialized     0042823c     <common>\r
+ 0003:0000b240       ___onexitend               00428240     <common>\r
+ 0003:0000b244       ___onexitbegin             00428244     <common>\r
+ 0003:0000b248       __FPinit                   00428248     <common>\r
+ 0003:0000b24c       ___piob                    0042824c     <common>\r
+ 0003:0000b5a0       __bufin                    004285a0     <common>\r
+ 0003:0000c5a0       __nstream                  004295a0     <common>\r
+ 0004:00000000       __IMPORT_DESCRIPTOR_KERNEL32 0042a000     kernel32:KERNEL32.dll\r
+ 0004:00000014       __NULL_IMPORT_DESCRIPTOR   0042a014     kernel32:KERNEL32.dll\r
+ 0004:0000016c       __imp__GetEnvironmentStringsW@0 0042a16c     kernel32:KERNEL32.dll\r
+ 0004:00000170       __imp__TerminateProcess@8  0042a170     kernel32:KERNEL32.dll\r
+ 0004:00000174       __imp__GetCurrentProcess@0 0042a174     kernel32:KERNEL32.dll\r
+ 0004:00000178       __imp__GetTimeZoneInformation@4 0042a178     kernel32:KERNEL32.dll\r
+ 0004:0000017c       __imp__GetSystemTime@4     0042a17c     kernel32:KERNEL32.dll\r
+ 0004:00000180       __imp__GetLocalTime@4      0042a180     kernel32:KERNEL32.dll\r
+ 0004:00000184       __imp__GetCommandLineA@0   0042a184     kernel32:KERNEL32.dll\r
+ 0004:00000188       __imp__GetVersion@0        0042a188     kernel32:KERNEL32.dll\r
+ 0004:0000018c       __imp__SetHandleCount@4    0042a18c     kernel32:KERNEL32.dll\r
+ 0004:00000190       __imp__GetStdHandle@4      0042a190     kernel32:KERNEL32.dll\r
+ 0004:00000194       __imp__GetFileType@4       0042a194     kernel32:KERNEL32.dll\r
+ 0004:00000198       __imp__GetStartupInfoA@4   0042a198     kernel32:KERNEL32.dll\r
+ 0004:0000019c       __imp__HeapAlloc@12        0042a19c     kernel32:KERNEL32.dll\r
+ 0004:000001a0       __imp__GetLastError@0      0042a1a0     kernel32:KERNEL32.dll\r
+ 0004:000001a4       __imp__FlushFileBuffers@4  0042a1a4     kernel32:KERNEL32.dll\r
+ 0004:000001a8       __imp__WriteFile@20        0042a1a8     kernel32:KERNEL32.dll\r
+ 0004:000001ac       __imp__GetFileAttributesA@4 0042a1ac     kernel32:KERNEL32.dll\r
+ 0004:000001b0       __imp__SetFilePointer@16   0042a1b0     kernel32:KERNEL32.dll\r
+ 0004:000001b4       __imp__MultiByteToWideChar@24 0042a1b4     kernel32:KERNEL32.dll\r
+ 0004:000001b8       __imp__GetStringTypeA@20   0042a1b8     kernel32:KERNEL32.dll\r
+ 0004:000001bc       __imp__GetStringTypeW@16   0042a1bc     kernel32:KERNEL32.dll\r
+ 0004:000001c0       __imp__HeapFree@12         0042a1c0     kernel32:KERNEL32.dll\r
+ 0004:000001c4       __imp__CloseHandle@4       0042a1c4     kernel32:KERNEL32.dll\r
+ 0004:000001c8       __imp__ReadFile@20         0042a1c8     kernel32:KERNEL32.dll\r
+ 0004:000001cc       __imp__WideCharToMultiByte@32 0042a1cc     kernel32:KERNEL32.dll\r
+ 0004:000001d0       __imp__UnhandledExceptionFilter@4 0042a1d0     kernel32:KERNEL32.dll\r
+ 0004:000001d4       __imp__GetModuleFileNameA@12 0042a1d4     kernel32:KERNEL32.dll\r
+ 0004:000001d8       __imp__FreeEnvironmentStringsA@4 0042a1d8     kernel32:KERNEL32.dll\r
+ 0004:000001dc       __imp__FreeEnvironmentStringsW@4 0042a1dc     kernel32:KERNEL32.dll\r
+ 0004:000001e0       __imp__GetEnvironmentStrings@0 0042a1e0     kernel32:KERNEL32.dll\r
+ 0004:000001e4       __imp__ExitProcess@4       0042a1e4     kernel32:KERNEL32.dll\r
+ 0004:000001e8       __imp__GetModuleHandleA@4  0042a1e8     kernel32:KERNEL32.dll\r
+ 0004:000001ec       __imp__GetEnvironmentVariableA@12 0042a1ec     kernel32:KERNEL32.dll\r
+ 0004:000001f0       __imp__GetVersionExA@4     0042a1f0     kernel32:KERNEL32.dll\r
+ 0004:000001f4       __imp__HeapDestroy@4       0042a1f4     kernel32:KERNEL32.dll\r
+ 0004:000001f8       __imp__HeapCreate@12       0042a1f8     kernel32:KERNEL32.dll\r
+ 0004:000001fc       __imp__VirtualFree@12      0042a1fc     kernel32:KERNEL32.dll\r
+ 0004:00000200       __imp__RtlUnwind@16        0042a200     kernel32:KERNEL32.dll\r
+ 0004:00000204       __imp__VirtualAlloc@16     0042a204     kernel32:KERNEL32.dll\r
+ 0004:00000208       __imp__HeapReAlloc@16      0042a208     kernel32:KERNEL32.dll\r
+ 0004:0000020c       __imp__IsBadWritePtr@8     0042a20c     kernel32:KERNEL32.dll\r
+ 0004:00000210       __imp__SetStdHandle@8      0042a210     kernel32:KERNEL32.dll\r
+ 0004:00000214       __imp__GetExitCodeProcess@8 0042a214     kernel32:KERNEL32.dll\r
+ 0004:00000218       __imp__WaitForSingleObject@8 0042a218     kernel32:KERNEL32.dll\r
+ 0004:0000021c       __imp__CreateProcessA@40   0042a21c     kernel32:KERNEL32.dll\r
+ 0004:00000220       __imp__CreateFileA@28      0042a220     kernel32:KERNEL32.dll\r
+ 0004:00000224       __imp__GetCPInfo@8         0042a224     kernel32:KERNEL32.dll\r
+ 0004:00000228       __imp__GetACP@0            0042a228     kernel32:KERNEL32.dll\r
+ 0004:0000022c       __imp__GetOEMCP@0          0042a22c     kernel32:KERNEL32.dll\r
+ 0004:00000230       __imp__GetProcAddress@8    0042a230     kernel32:KERNEL32.dll\r
+ 0004:00000234       __imp__LoadLibraryA@4      0042a234     kernel32:KERNEL32.dll\r
+ 0004:00000238       __imp__CompareStringA@24   0042a238     kernel32:KERNEL32.dll\r
+ 0004:0000023c       __imp__CompareStringW@24   0042a23c     kernel32:KERNEL32.dll\r
+ 0004:00000240       __imp__SetEnvironmentVariableA@8 0042a240     kernel32:KERNEL32.dll\r
+ 0004:00000244       __imp__SetEndOfFile@4      0042a244     kernel32:KERNEL32.dll\r
+ 0004:00000248       __imp__LCMapStringA@24     0042a248     kernel32:KERNEL32.dll\r
+ 0004:0000024c       __imp__LCMapStringW@24     0042a24c     kernel32:KERNEL32.dll\r
+ 0004:00000250       __imp__GetCurrentDirectoryA@8 0042a250     kernel32:KERNEL32.dll\r
+ 0004:00000254       __imp__SetCurrentDirectoryA@4 0042a254     kernel32:KERNEL32.dll\r
+ 0004:00000258       \177KERNEL32_NULL_THUNK_DATA 0042a258     kernel32:KERNEL32.dll\r
 \r
- entry point at        0001:0000f741\r
+ entry point at        0001:0000f4d1\r
 \r
index c3b90dd..a5ddbbe 100644 (file)
 extern uchar *syserror;\r
 \r
 int xls(char *option, char *path);\r
-int xchmod(char *path, char *modes);\r
+int xchmod(char *modes, char *path); /* Nick reversed argument order */\r
+#if 1 /* Nick */\r
+int xchown(char *uidno, char *path);\r
+int xchgrp(char *gidno, char *path);\r
+#endif\r
 int xumask(char *masks);\r
 int xmknod(char *path, char *modes, char *devs, char *devs1);\r
 int xmkdir(char *path);\r
@@ -232,7 +236,7 @@ int xls(option, thepath)
 \r
 /* just to make syntax equal to Solaris, Linux, etc */\r
 int xchmod(modes, path)\r
-       char *path, *modes;\r
+       char *modes, *path; /* Nick reversed argument order */\r
 {\r
        int mode = -1;\r
 \r
@@ -250,6 +254,50 @@ int xchmod(modes, path)
        return 0;\r
 }\r
 \r
+#if 1 /* Nick */\r
+int xchown(char *uidno, char *path)\r
+       {\r
+       int uid = -1;\r
+       struct stat statbuf;\r
+\r
+       sscanf(uidno, "%d", &uid);\r
+       if (uid == -1)\r
+               {\r
+               PF("chown: bad uid\n");\r
+               pse();\r
+               return (-1);\r
+               }\r
+       if (UZIXstat(path, &statbuf) || UZIXchown(path, uid, statbuf.st_gid))\r
+               {\r
+               PF("_chown: error %s\n", stringerr[*syserror]);\r
+               pse();\r
+               return (-1);\r
+               }\r
+       return 0;\r
+       }\r
+\r
+int xchgrp(char *gidno, char *path)\r
+       {\r
+       int gid = -1;\r
+       struct stat statbuf;\r
+\r
+       sscanf(gidno, "%d", &gid);\r
+       if (gid == -1)\r
+               {\r
+               PF("chgrp: bad gid\n");\r
+               pse();\r
+               return (-1);\r
+               }\r
+       if (UZIXstat(path, &statbuf) || UZIXchown(path, statbuf.st_uid, gid))\r
+               {\r
+               PF("_chgrp: error %s\n", stringerr[*syserror]);\r
+               pse();\r
+               return (-1);\r
+               }\r
+       return 0;\r
+}\r
+#endif\r
+\r
 int xumask(masks)\r
        char *masks;\r
 {\r
index 2aaadff..1e9626a 100644 (file)
@@ -1,10 +1,10 @@
 XL4\r
 H 2 areas A global symbols\r
 M utils\r
-S ?CL64180L_4_06_L00 Ref00000000\r
-S ?LEAVE_DIRECT_L09 Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
 S ?ENT_PARM_DIRECT_L09 Ref00000000\r
 S ?SS_CMP_L02 Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
 S .__.ABS. Def00000000\r
 A _DEFAULT size 0 flags 0\r
 A CODE size C5 flags 0\r
@@ -16,7 +16,7 @@ S int_max Def000000AF
 T 00 00 00 00\r
 R 00 00 01 00\r
 T 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 02 00\r
+R 00 00 01 00 02 05 01 00\r
 T 03 00 00 00\r
 R 00 00 01 00\r
 T 03 00 00 00\r
@@ -34,18 +34,18 @@ R 00 00 01 00
 T 27 00 00 00\r
 R 00 00 01 00\r
 T 27 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 01 00\r
+R 00 00 01 00 02 05 00 00\r
 T 2A 00 00 00\r
 R 00 00 01 00\r
 T 2A 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 02 00\r
+R 00 00 01 00 02 05 01 00\r
 T 2D 00 00 00\r
 R 00 00 01 00\r
 T 2D 00 00 00\r
 R 00 00 01 00\r
-T 2D 00 00 00 DD 6E 08 DD 66 09 2B DD 75 08 DD\r
+T 2D 00 00 00 DD 6E 0A DD 66 0B 2B DD 75 0A DD\r
 R 00 00 01 00\r
-T 38 00 00 00 74 09 23 7D B4 28 14\r
+T 38 00 00 00 74 0B 23 7D B4 28 14\r
 R 00 00 01 00\r
 T 3F 00 00 00\r
 R 00 00 01 00\r
@@ -56,18 +56,18 @@ R 00 00 01 00
 T 53 00 00 00\r
 R 00 00 01 00\r
 T 53 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 01 00\r
+R 00 00 01 00 02 05 00 00\r
 T 56 00 00 00\r
 R 00 00 01 00\r
 T 56 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 02 00\r
+R 00 00 01 00 02 05 01 00\r
 T 59 00 00 00\r
 R 00 00 01 00\r
 T 59 00 00 00\r
 R 00 00 01 00\r
-T 59 00 00 00 DD 6E 08 DD 66 09 2B DD 75 08 DD\r
+T 59 00 00 00 DD 6E 0A DD 66 0B 2B DD 75 0A DD\r
 R 00 00 01 00\r
-T 64 00 00 00 74 09 23 7D B4 28 20\r
+T 64 00 00 00 74 0B 23 7D B4 28 20\r
 R 00 00 01 00\r
 T 6B 00 00 00\r
 R 00 00 01 00\r
@@ -80,13 +80,13 @@ R 00 00 01 00
 T 8B 00 00 00\r
 R 00 00 01 00\r
 T 8B 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 01 00\r
+R 00 00 01 00 02 05 00 00\r
 T 8E 00 00 00\r
 R 00 00 01 00\r
 T 8E 00 00 00 CD 00 00 00 00 4B 42 DD 6E 04 DD\r
-R 00 00 01 00 02 05 02 00\r
+R 00 00 01 00 02 05 01 00\r
 T 97 00 00 00 66 05 CD 00 00 00 00 30 08 DD 6E\r
-R 00 00 01 00 02 07 03 00\r
+R 00 00 01 00 02 07 02 00\r
 T A0 00 00 00 04 DD 66 05 18 06\r
 R 00 00 01 00\r
 T A6 00 00 00\r
@@ -96,11 +96,11 @@ R 00 00 01 00
 T AC 00 00 00\r
 R 00 00 01 00\r
 T AC 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 01 00\r
+R 00 00 01 00 02 05 00 00\r
 T AF 00 00 00\r
 R 00 00 01 00\r
 T AF 00 00 00 CD 00 00 00 00 EB CD 00 00 00 00\r
-R 00 00 01 00 02 05 02 00 02 0B 03 00\r
+R 00 00 01 00 02 05 01 00 02 0B 02 00\r
 T B6 00 00 00 30 04 69 60 18 06\r
 R 00 00 01 00\r
 T BC 00 00 00\r
@@ -110,4 +110,4 @@ R 00 00 01 00
 T C2 00 00 00\r
 R 00 00 01 00\r
 T C2 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 01 00\r
+R 00 00 01 00 02 05 00 00\r
diff --git a/src/gboot/build.ban b/src/gboot/build.ban
new file mode 100644 (file)
index 0000000..fd61bc8
--- /dev/null
@@ -0,0 +1,35 @@
+copy ..\gboot.asm\r
+copy ..\io64180.inc\r
+copy ..\diag.inc\r
+copy ..\copyr.inc\r
+copy ..\clears.inc\r
+as-z80 -l -o gboot\r
+@if errorlevel 1 goto failure\r
+link-z80 -f gboot\r
+@if errorlevel 1 goto failure\r
+ihex2bin gboot.i86 ..\..\..\bin\boot.bin\r
+4dos /c crcd ..\..\..\bin\boot.bin\r
+bin2c ..\..\..\bin\boot.bin ..\..\fsutil\boot.c\r
+\r
+copy ..\uzboot.asm\r
+as-z80 -l -o uzboot\r
+@if errorlevel 1 goto failure\r
+copy ..\uzfile.asm\r
+as-z80 -l -o uzfile\r
+@if errorlevel 1 goto failure\r
+copy ..\uzmain.asm\r
+as-z80 -l -o uzmain\r
+@if errorlevel 1 goto failure\r
+copy ..\uzdata.asm\r
+as-z80 -l -o uzdata\r
+@if errorlevel 1 goto failure\r
+link-z80 -f uzboot\r
+@if errorlevel 1 goto failure\r
+ihex2bin uzboot.i86 ..\..\..\bin\uzboot.ldr\r
+\r
+@echo SUCCESS\r
+@goto done\r
+:failure\r
+@echo FAILURE\r
+:done\r
+\r
diff --git a/src/gboot/gboot.asm$ b/src/gboot/gboot.asm$
deleted file mode 100644 (file)
index 29c1295..0000000
+++ /dev/null
@@ -1,793 +0,0 @@
-; gboot.asm\r
-; Generic Hytech boot loader program to occupy 4 sectors at start of each disk\r
-\r
-$ io64180.inc\r
-\r
-LDFILE         equ     0f037h          ; BOOTLDR.BIN entry point\r
-\r
-SUPERBLOCK     equ     4               ; starting position of filesystem\r
-SMOUNTED       equ     12742           ; random number to specify mounted fs\r
-ROOTINODE      equ     1               ; inode number of / for all mounted fs\r
-\r
-BUFSIZE                equ     200h            ; how many bytes per disk block\r
-BUFSIZELOG     equ     9               ; shift count representing the above\r
-\r
-SIZEOF_DINODE_T        equ     64              ; how many bytes per disk inode\r
-DINODESPERBLOCK        equ     8               ; how many disk inodes per disk block\r
-DINODESPERBLOCKLOG equ 3               ; shift count representing the above\r
-\r
-DIRECTBLOCKS   equ     18\r
-INDIRECTBLOCKS equ     1               ; MUST BE 1!\r
-DINDIRECTBLOCKS equ    1               ; MUST BE 1!\r
-\r
-SIZEOF_DIRECT_T        equ     16              ; how many bytes per directory entry\r
-DIRNAMELEN     equ     14              ; how many bytes of these are dir name\r
-\r
-REGION_LOG     equ     14\r
-REGION_BYTES   equ     (1<<REGION_LOG)\r
-REGION_BLOCKS  equ     (REGION_BYTES/BUFSIZE)\r
-\r
-PAGE_LOG       equ     12\r
-PAGE_BYTES     equ     (1<<PAGE_LOG)\r
-PAGE_BLOCKS    equ     (PAGE_BYTES/BUFSIZE)\r
-\r
-HD0_START      equ     512\r
-HD0_SIZE       equ     1536\r
-\r
-       rseg    RCODE\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-start: defm    'XXXXYYMMDDHHMMSS'      ; BOOT.BIN CRC, date and time\r
-\r
-       ; hytech eprom will enter at base+10h\r
-       ld      sp,8000h                ; as we will later set CBAR = 80h\r
-       call    clears\r
-       call    acrlf\r
-       call    initial_boot            ; for compatibility (returns if not ok)\r
-       jr      entry\r
-       defb    0,0\r
-\r
-       ; need a cp/m directory entry at base+20h\r
-       defb    0,'BOOT    BIN',0,0,0,(final+7fh-start)/80h\r
-       defb    0\r
-       defb    ((400h-(final-start)) >> 14) & 1\r
-       defb    ((800h-(final-start)) >> 14) & 2\r
-       defb    ((0c00h-(final-start)) >> 14) & 3\r
-       defb    0,0,0,0,0,0,0,0,0,0,0,0\r
-\r
-entry:\r
-       call    gmess\r
-       defb    'loading /boot/kernel.bin',0dh,0ah,0\r
-\r
-       ld      de,SUPERBLOCK\r
-       ld      hl,block\r
-       call    block_read\r
-\r
-       ld      hl,(block)\r
-       ld      de,SMOUNTED\r
-       or      a\r
-       sbc     hl,de\r
-       jr      nz,black_magic\r
-\r
-       ld      hl,(block+2)\r
-       ld      (reserv),hl\r
-       ld      hl,(block+4)\r
-       ld      (isize),hl\r
-       ld      hl,(block+6)\r
-       ld      (fsize),hl\r
-\r
-       ld      de,ROOTINODE\r
-       ld      hl,name_boot\r
-       call    dir_search              ; returns de = the found inode\r
-       jr      nz,bad_file\r
-\r
-       ld      hl,name_kernel_bin\r
-       call    dir_search              ; returns de = the found inode\r
-       jr      nz,bad_file\r
-\r
-       call    file_scan\r
-\r
-       call    virtual_init            ; modifies CBR (can't call EPROM now)\r
-\r
-       ld      bc,8080h                ; initial spot in virt memory table\r
-       ld      hl,region_list+2        ; -> block no. of 2nd found region\r
-       jr      translate_loope\r
-\r
-translate_loop:\r
-       add     hl,de                   ; restore hl value from comparison\r
-\r
-       call    block_to_bbr            ; calculates a from word at hl (bumped)\r
-       ld      (bc),a                  ; a = required bbr value to access page\r
-       inc     bc\r
-\r
-translate_loope:\r
-       ld      de,(region_ptr)         ; indicates end of region list\r
-       or      a\r
-       sbc     hl,de                   ; see if we've gone past the end\r
-       jr      c,translate_loop\r
-\r
-       ld      hl,region_list          ; there is at least one entry\r
-       call    block_to_bbr            ; a = required bbr value for init code\r
-\r
-kazumi:        ; please preserve a for entering kernel at label runsys!\r
-       ld      sp,parameters-parameters_end ; stack just under copied params\r
-\r
-       ld      hl,parameters           ; pre-initialised parameter block\r
-       ld      de,parameters-parameters_end ; to fit neatly at top of memory\r
-       ld      bc,parameters_end-parameters ; size in bytes to copy\r
-       ldir                            ; copy parameter block for kernel init\r
-\r
- .if 1 ; so as not to corrupt CBR when jumping to the loaded program\r
-       ld      hl,runsys               ; start of small stub program below\r
-       ld      de,8100h                ; -> just after virtual memory table\r
-       push    de\r
-       ld      c,runsys_end-runsys     ; size of small stub program (b=0)\r
-       ldir                            ; copy stub program\r
-       ret                             ; enter stub program (jp 8100h)\r
- .else\r
-       ld      e,30h-8\r
-       out0    (CBR),e                 ; window onto runsys (CBAR = 80h)\r
-       jp      runsys+8000h            ; run the remaining startup from window\r
- .endif\r
-\r
-runsys:        ld      e,84h\r
-       out0    (CBAR),e                ; CA0 = 16k, bank area = 16k, CA1 = 32k\r
-\r
-       out0    (BBR),a                 ; bank area = logical 4000 = abs c:0000\r
-       jp      4000h                   ; execute file from the 1st loaded page\r
- .if 1 ; so as not to corrupt CBR when jumping to the loaded program\r
-runsys_end:\r
- .endif\r
-\r
-black_magic:\r
-       call    gmess\r
-       defb    'bad magic: ',0\r
-       add     hl,de\r
-       jr      reboot_ahexw\r
-\r
-bad_file:\r
-       call    gmess\r
-       defb    'file not found',0dh,0ah,0\r
-       jr      reboot_plain\r
-\r
-; -----------------------------------------------------------------------------\r
-; had some kind of fatal error, the entry points are to save code space\r
-\r
-reboot_ahexw:\r
-       call    ahexw\r
-\r
-reboot_acrlf:\r
-       call    acrlf\r
-\r
-reboot_plain:\r
-       ; try not to surprise the user unnecessarily\r
-       call    gmess\r
-       defb    'doing a clean boot',0dh,0ah,0\r
-\r
-       ; before rebooting, prepare to clobber CP/M drive A: directory\r
-       ld      hl,block\r
-       ld      de,block+1\r
-       ld      bc,BUFSIZE-1\r
-       ld      (hl),0aah               ; clobbering pattern\r
-       ldir                            ; initialise temporary buffer\r
-\r
-       ; perform the clobbering (this ensures a clean boot from EPROM)\r
-       ld      de,304h\r
-       ld      l,c\r
-       ld      h,b ; ld hl,0           ; e:hl -> destination 4:0000\r
-\r
-       ld      b,4                     ; clobber until just before 4:0800\r
-clobber_loop:\r
-       push    bc\r
-\r
-       ld      iy,block                ; copy from d:iy -> destination\r
-       ld      bc,BUFSIZE              ; bytes to copy\r
-       call    copyr                   ; copy them, one byte at a time\r
-\r
-       pop     bc\r
-       djnz    clobber_loop\r
-\r
-       ; ready to reboot, by instructing the WPO chip on motherboard\r
-       ld      a,0aah\r
-       out0    (TRDR),A                ; command byte to reboot the system\r
-       ld      a,13h\r
-       out0    (CNTR),A                ; TE=1, divisor = 3, start transmission\r
-\r
-       ; wait for the reboot to occur, or else we're rather stuck\r
-       jr      $\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-gmess: call    amess\r
-       defb    'gboot: ',0\r
-       jp      amess\r
-\r
-rsel1:\r
- .if 1 ; temporary only\r
- ld de,2 ; save eprom serial no to 2:fc81\r
- call copy_serial_no\r
- .endif\r
-       ld      a,81h\r
-       out0    (TRDR),A                ; command byte to set RSEL=1\r
-       ld      a,13h\r
-       out0    (CNTR),A                ; TE=1, divisor = 3, start transmission\r
-\r
-       sub     a\r
-       dec     a\r
-       jr      nz,$-1\r
-       dec     a\r
-       jr      nz,$-1\r
-       dec     a\r
-       jr      nz,$-1\r
-       dec     a\r
-       jr      nz,$-1                  ; delay for command to be processed\r
- .if 1 ; temporary only\r
- ld de,200h ; restore eprom serial no from 2:fc81\r
-copy_serial_no:\r
- ld hl,0fc81h\r
- push hl\r
- pop iy\r
- ld bc,5\r
- jp copyr\r
- .else\r
-       ret\r
- .endif\r
-\r
-virtual_init:\r
-       call    gmess\r
-       defb    'starting operating system',0dh,0ah,0\r
-\r
-       call    rsel1\r
-\r
-       ld      a,80h\r
-       out0    (CBAR),a                ; CA0 = 0k, bank area = 32k, CA1 = 32k\r
-\r
-       ld      a,4-8 ;0 also works, see bstartup.s01 at label init\r
-       out0    (CBR),a                 ; window onto 0:8000, virt memory table\r
-\r
-       ld      hl,08000h\r
-       ld      de,08001h\r
-       ld      bc,0ffh\r
-       ld      (hl),l ; 0\r
-       ldir                            ; zero out the virtual memory table\r
-       ret\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-file_scan:\r
-       ld      hl,region_list\r
-       ld      (region_ptr),hl\r
-\r
-       ld      hl,inode\r
-       call    inode_read              ; read inode of the target file\r
-\r
-       call    bmap_setup              ; prepare counters to walk the file\r
-       call    bmap_remain             ; get hl = valid bytes in first block\r
-                                       ; and decrement the file size remaining\r
-       ld      a,l\r
-       or      h                       ; any bytes in file?\r
-       jr      z,bad_file_size         ; no, abort proceedings\r
-\r
-file_scan_loop:\r
-       call    bmap_block              ; get de = block no. of current block\r
-                                       ; and increment the block position\r
-       ld      a,e\r
-       or      d\r
-       jr      z,bad_file_block\r
-; ld l,e\r
-; ld h,d\r
-; call ahexw\r
-\r
-       ld      a,e\r
-       and     PAGE_BLOCKS-1           ; check it starts on a page boundary\r
-       jr      nz,bad_alignment\r
-\r
-       ld      hl,(region_ptr)\r
-       ld      (hl),e\r
-       inc     hl\r
-       ld      (hl),d                  ; stash away the starting block no.\r
-       inc     hl\r
-       ld      (region_ptr),hl         ; for the current region (bumped)\r
-\r
-       ld      b,REGION_BLOCKS-1\r
-\r
-file_region_loop:\r
-       push    bc\r
-       push    de\r
-\r
-       call    bmap_remain             ; get hl = valid bytes in current block\r
-                                       ; and decrement the file size remaining\r
-       ld      a,l\r
-       or      h\r
-       jr      z,file_region_final\r
-\r
-       call    bmap_block              ; get de = block no. of current block\r
-                                       ; and increment the block position\r
-       ld      a,e\r
-       or      d\r
-       jr      z,bad_file_block\r
-; ld a,' '\r
-; call abyte\r
-; ld l,e\r
-; ld h,d\r
-; call ahexw\r
-\r
-       ex      de,hl                   ; hl = the actual block no. from file\r
-       pop     de\r
-       inc     de                      ; de = expected, contiguous block no.\r
-\r
-       or      a\r
-       sbc     hl,de\r
-       jr      nz,bad_alignment\r
-\r
-       pop     bc\r
-       djnz    file_region_loop\r
-; call acrlf\r
-\r
-       call    bmap_remain             ; get hl = valid bytes in current block\r
-                                       ; and decrement the file size remaining\r
-       ld      a,l\r
-       or      h                       ; anything left to read?\r
-       jr      nz,file_scan_loop       ; yes (scan is limited by file size)\r
-       ret                             ; last region is = REGION_BLOCKS blocks\r
-\r
-file_region_final:\r
-; call acrlf\r
-       pop     hl                      ; last region is < REGION_BLOCKS blocks\r
-       pop     hl                      ; clean up saved variables, and done\r
-       ret\r
-\r
-bad_file_size:\r
-       call    gmess\r
-       defb    'null file',0dh,0ah,0\r
-       jp      reboot_plain\r
-\r
-bad_file_block:\r
-       call    gmess\r
-       defb    'hole in file',0dh,0ah,0\r
-       jp      reboot_plain\r
-\r
-bad_alignment:\r
-       call    gmess\r
-       defb    'not aligned',0dh,0ah,0\r
-       jp      reboot_plain\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-dir_search:\r
-       ld      (dir_name),hl\r
-\r
-       ld      hl,inode\r
-       call    inode_read              ; read inode of the dir to be searched\r
-\r
-       call    bmap_setup              ; prepare counters to walk the file\r
-       jr      dir_search_loope\r
-\r
-dir_search_loop:\r
-       push    hl                      ; h = count of entries in current block\r
-       call    bmap_block              ; get de = block no. of current block\r
-                                       ; and increment the block position\r
-       ld      a,e\r
-       or      d\r
-       jr      z,bad_dir_block\r
-\r
-       ld      hl,block\r
-       push    hl\r
-       call    block_read\r
-       pop     hl\r
-       pop     bc                      ; b = count of entries in current block\r
-\r
-dir_search_entry_loop:\r
-       push    hl\r
-       inc     hl\r
-       inc     hl\r
-\r
-       ld      de,(dir_name)\r
-       ld      c,DIRNAMELEN\r
-\r
-dir_search_compare_loop:\r
-       ld      a,(de)\r
-       cp      (hl)\r
-       jr      nz,dir_search_compare_bad\r
-       or      a\r
-       jr      z,dir_search_compare_good\r
-\r
-       inc     hl\r
-       inc     de\r
-       dec     c\r
-       jr      nz,dir_search_compare_loop\r
-\r
-dir_search_compare_good:\r
-       pop     hl\r
-       ld      e,(hl)\r
-       inc     hl\r
-       ld      d,(hl)\r
-       ret\r
-\r
-dir_search_compare_bad:\r
-       pop     hl\r
-       ld      de,SIZEOF_DIRECT_T\r
-       add     hl,de\r
-       djnz    dir_search_entry_loop\r
-\r
-dir_search_loope:\r
-       call    bmap_remain             ; get hl = valid bytes in current block\r
-                                       ; and decrement the file size remaining\r
-       add     hl,hl\r
-       add     hl,hl\r
-       add     hl,hl\r
-       add     hl,hl                   ; assumes SIZEOF_DIRECT_T = 16!!\r
-\r
-       ld      a,h                     ; a = valid bytes / SIZEOF_DIRECT_T\r
-       or      a\r
-       jr      nz,dir_search_loop\r
-\r
-       ret\r
-\r
-bad_dir_block:\r
-       call    gmess\r
-       defb    'hole in directory',0dh,0ah,0\r
-       jp      reboot_plain\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-bmap_setup:\r
-       ld      hl,(inode+8)\r
-       ld      (size_remain),hl\r
-       ld      hl,(inode+10)\r
-       ld      (size_remain+2),hl\r
-\r
-       ld      hl,inode+24\r
-       ld      (direct_ptr),hl\r
-       ld      hl,indirect_block+BUFSIZE\r
-       ld      (indirect_ptr),hl\r
-       ld      hl,dindirect_block+BUFSIZE\r
-       ld      (dindirect_ptr),hl\r
-       ret\r
-\r
-bmap_remain:\r
-       ld      hl,(size_remain)\r
-       ld      de,(size_remain+2)\r
-\r
-       ld      bc,BUFSIZE\r
-       or      a\r
-       sbc     hl,bc\r
-       ex      de,hl\r
-       ld      b,0 ; ld bc,0\r
-       sbc     hl,bc\r
-       ex      de,hl\r
-       jr      c,bmap_remain_final\r
-\r
-       ld      (size_remain),hl\r
-       ld      (size_remain+2),de\r
-\r
-       ld      hl,BUFSIZE\r
-       ret                             ; return a complete block of size hl\r
-\r
-bmap_remain_final:\r
-       ld      hl,(size_remain)\r
-       ld      (size_remain),bc ; 0\r
-       ;ld     (size_remain+2),bc ; 0\r
-       ret                             ; return a partial block of size hl\r
-\r
-bmap_block:\r
-       ld      hl,(direct_ptr)\r
-       ld      de,inode+24+DIRECTBLOCKS*2\r
-       or      a\r
-       sbc     hl,de\r
-       jr      nc,bmap_indirect\r
-\r
-       ld      hl,(direct_ptr)\r
-       ld      e,(hl)\r
-       inc     hl\r
-       ld      d,(hl)\r
-       inc     hl\r
-       ld      (direct_ptr),hl\r
-       ret\r
-\r
-bmap_indirect:\r
-       ld      hl,(indirect_ptr)\r
-       ld      de,indirect_block+BUFSIZE\r
-       or      a\r
-       sbc     hl,de\r
-       jr      c,bmap_indirect_already\r
-\r
-       ld      hl,(direct_ptr)\r
-       ld      e,(hl)\r
-       inc     hl\r
-       ld      d,(hl)\r
-       inc     hl\r
-       ld      (direct_ptr),hl\r
-\r
-       ld      hl,indirect_block\r
-       ld      (indirect_ptr),hl\r
-       call    block_read\r
-\r
-bmap_indirect_already:\r
-       ld      hl,(direct_ptr)\r
-       ld      de,inode+24+DIRECTBLOCKS*2+INDIRECTBLOCKS*2+1 ; fudge!\r
-       or      a\r
-       sbc     hl,de\r
-       jr      nc,bmap_dindirect\r
-\r
-       ld      hl,(indirect_ptr)\r
-       ld      e,(hl)\r
-       inc     hl\r
-       ld      d,(hl)\r
-       inc     hl\r
-       ld      (indirect_ptr),hl\r
-       ret\r
-\r
-bmap_dindirect:\r
-       ld      hl,(dindirect_ptr)\r
-       ld      de,dindirect_block+BUFSIZE\r
-       or      a\r
-       sbc     hl,de\r
-       jr      c,bmap_dindirect_already\r
-\r
-       ld      hl,(indirect_ptr)\r
-       ld      e,(hl)\r
-       inc     hl\r
-       ld      d,(hl)\r
-       inc     hl\r
-       ld      (indirect_ptr),hl\r
-\r
-       ld      hl,dindirect_block\r
-       ld      (dindirect_ptr),hl\r
-       call    block_read\r
-\r
-bmap_dindirect_already:\r
-       ld      hl,(dindirect_ptr)\r
-       ld      e,(hl)\r
-       inc     hl\r
-       ld      d,(hl)\r
-       inc     hl\r
-       ld      (dindirect_ptr),hl\r
-       ret\r
-\r
-; -----------------------------------------------------------------------------\r
-; enter with hl -> buffer, de = inode number\r
-\r
-inode_read:\r
-       push    hl\r
-\r
-       ld      a,e\r
-       and     DINODESPERBLOCK-1       ; find inode position within disk block\r
-\r
-       ld      b,DINODESPERBLOCKLOG    ; shift count to find which disk block\r
-inode_shift:\r
-       srl     d\r
-       rr      e\r
-       djnz    inode_shift             ; leaves de = block (relative to itab)\r
-\r
-       ld      hl,(isize)\r
-       scf\r
-       sbc     hl,de                   ; check if block is beyond end of table\r
-       jr      c,bad_inode\r
-\r
-       ld      hl,(reserv)\r
-       add     hl,de\r
-       ex      de,hl                   ; adjust block for start of inode table\r
-\r
-       ld      hl,block\r
-       push    af\r
-       push    hl\r
-       call    block_read\r
-       pop     hl\r
-       pop     de                      ; d = inode position within block\r
-\r
-       ld      bc,SIZEOF_DINODE_T\r
-       ld      e,c\r
-       mlt     de\r
-       add     hl,de\r
-       pop     de                      ; de -> user's buffer for disk inode\r
-       ldir                            ; copy it, freeing up block buffer\r
-       ret\r
-\r
-bad_inode:\r
-       call    gmess\r
-       defb    'bad inode: ',0\r
-       add     a,'0'\r
-       call    abyte\r
-       call    amess\r
-       defb    ', ',0\r
-       ex      de,hl\r
-       jp      reboot_ahexw\r
-\r
-; -----------------------------------------------------------------------------\r
-; enter with hl -> buffer, de = block number\r
-\r
-block_read:\r
-       push    hl\r
-       call    block_xlate             ; a:hl -> data in ramdrive\r
-\r
-       push    hl\r
-       pop     iy\r
-       ld      d,a                     ; d:iy -> data in ramdrive\r
-\r
-       pop     hl\r
-       ld      e,3                     ; e:hl -> user's buffer in seg 3:\r
-       jp      copyr                   ; copy BUFSIZE bytes from d:iy to e:hl\r
-\r
-block_write:\r
-       push    hl\r
-       call    block_xlate             ; a:hl -> data in ramdrive\r
-\r
-       pop     iy\r
-       ld      d,3                     ; d:iy -> user's buffer in seg 3:\r
-\r
-       ld      e,a                     ; e:hl -> data in ramdrive\r
-       jp      copyr                   ; copy BUFSIZE bytes from d:iy to e:hl\r
-\r
-block_xlate:\r
-       ld      hl,HD0_SIZE\r
-       scf\r
-       sbc     hl,de                   ; check whether block no is in range\r
-       jr      c,bad_block\r
-\r
-       ld      bc,BUFSIZE              ; bytes to be copied for 1 block\r
-\r
-       ld      hl,HD0_START\r
-       add     hl,de                   ; hl = block index (from start of ram)\r
-\r
-       ld      a,h\r
-       ld      h,l\r
-       ld      l,c ;0                  ; a:hl = block index * 100h\r
-\r
-       add     hl,hl\r
-       adc     a,a                     ; a:hl = block index * BUFSIZE (200h!!)\r
-       ret\r
-\r
-block_to_bbr:\r
-       ld      a,(hl)\r
-       inc     hl\r
-       ld      d,(hl)                  ; d:a = block no. from start of disk\r
-       inc     hl\r
-\r
-       srl     d\r
-       rra\r
-       srl     d\r
-       rra\r
-       srl     d\r
-       rra                             ; a = block / 8 (PAGE_BLOCKS = 8!!)\r
-\r
-       add     a,HD0_START/PAGE_BLOCKS-4\r
-       ret\r
-\r
-bad_block:\r
-       call    gmess\r
-       defb    'bad block: ',0\r
-       ex      de,hl\r
-       jp      reboot_ahexw\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-initial_boot:\r
-       ld      hl,UZINAM\r
-       call    LDFILE                  ; copy entire KERNEL.BIN data to c:0000\r
-       ret     z                       ; halt if the file could not be found\r
-\r
-       call    gmess\r
-       defb    'loading A:KERNEL.BIN',0dh,0ah,0\r
-\r
-       ld      a,'1'\r
-       ld      (argument_1+7),a        ; so kernel will use /dev/hd1 as root\r
-\r
-loop:  ld      de,(LDMAX)\r
-       or      a\r
-       sbc     hl,de                   ; did we load an entire extent?\r
-       jr      nz,done                 ; no, assume the file is fully loaded\r
-\r
-       add     hl,de                   ; restore hl = LDMAX\r
-       ld      (LDPTR),hl              ; load from where we finished last time\r
-\r
-       ld      a,l\r
-       or      h                       ; did we wrap around to a new segment?\r
-       jr      nz,cont\r
-\r
-       ld      hl,LDSEG\r
-       inc     (hl)                    ; yes, need to advance segment counter\r
-\r
-cont:  ld      hl,4000h\r
-       add     hl,de\r
-       ld      (LDMAX),hl              ; advance LDMAX to load 4000h bytes\r
-\r
-       ld      hl,LDEXT\r
-       inc     (hl)                    ; advance extent counter to next extent\r
-\r
-       ld      hl,UZINAM\r
-       call    LDFILE                  ; copy more CMX.BIN data to LDSEG:LDPTR\r
-       jr      nz,loop\r
-\r
- .if 1 ; virtual memory\r
-       ld      hl,LDEXT\r
-       dec     (hl)                    ; account for extent that wasn't found\r
- .endif\r
-\r
-done:\r
- .if 1 ; virtual memory\r
-       call    virtual_init            ; modifies CBR (can't call EPROM now)\r
-\r
-       ld      a,(LDEXT)\r
-       ld      b,a                     ; how many extents were loaded ?  (-1)\r
-\r
-       ld      hl,8080h                ; initial spot in virt memory table\r
-       ld      a,0c0h                  ; bbr value to access 2nd loaded page\r
-\r
-virtual_loop:\r
-       ld      (hl),a                  ; map 16kbytes into virt memory space\r
-       inc     hl\r
-       add     a,4\r
-       djnz    virtual_loop\r
- .else\r
-       call    rsel1                   ; select RAM for segments 0: and 1:\r
-\r
-       ld      a,80h\r
-       out0    (CBAR),a                ; CA0 = 0k, bank area = 32k, CA1 = 32k\r
- .endif\r
-\r
-       ld      a,0c0h-4                ; bbr value to access 1st loaded page\r
-       jp      kazumi\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-$ diag.inc\r
-$ copyr.inc\r
-$ clears.inc\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-parameters:    defw    2               ; argc\r
-               defw    arguments-parameters_end ; argv\r
-               defw    environment-parameters_end ; envp\r
-arguments:     defw    argument_0-parameters_end\r
-               defw    argument_1-parameters_end\r
-               defw    0               ; terminates the argument list\r
-argument_0:    defb    '/boot/kernel.bin',0\r
-argument_1:    defb    'root=hd0',0\r
-environment:   defw    environment_0-parameters_end\r
-               defw    0               ; termninates the environment list\r
-environment_0: defb    'SN=00000',0\r
-parameters_end:        ; this will equal address 0 after parameters are copied\r
-\r
-name_boot:     defb    'boot',0\r
-name_kernel_bin: defb  'kernel.bin',0\r
-\r
-               ; note: defb 1 is very important here, because if UZINAM ends\r
-               ; up on a 32 byte boundary, the KERNEL.BIN filename (extent 0)\r
-               ; may be seen by the initial_boot routine, preventing the\r
-               ; proper loading of /boot/kernel after formatting the ramdrive\r
-UZINAM:        defb    1,'KERNEL  BIN'         ; LDNAM\r
-LDEXT:         defb    0                       ; LDEXT\r
-LDSEG:         defb    0ch                     ; LDSEG\r
-LDPTR:         defw    0                       ; LDPTR\r
-LDMAX:         defw    4000h                   ; LDMAX\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-final:         ; initialised code and data ends here\r
-\r
-reserv:\r
-isize          equ     reserv+2\r
-fsize          equ     isize+2\r
-\r
-dir_name       equ     fsize+2\r
-size_remain    equ     dir_name+2\r
-\r
-direct_ptr     equ     size_remain+4\r
-indirect_ptr   equ     direct_ptr+2\r
-dindirect_ptr  equ     indirect_ptr+2\r
-\r
-inode          equ     dindirect_ptr+2\r
-block          equ     inode+SIZEOF_DINODE_T\r
-\r
-indirect_block equ     block+BUFSIZE\r
-dindirect_block        equ     indirect_block+BUFSIZE\r
-\r
-region_ptr     equ     dindirect_block+BUFSIZE\r
-region_list    equ     region_ptr+2\r
-\r
-; -----------------------------------------------------------------------------\r
-\r
-       END\r
diff --git a/src/gboot/gboot.map b/src/gboot/gboot.map
deleted file mode 100644 (file)
index 9e67d79..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-Hexadecimal  [32-Bits]\r
-\r
-Area                       Addr        Size        Decimal Bytes (Attributes)\r
---------------------       ----        ----        ------- ----- ------------\r
-.  .ABS.               00000000    00000000 =           0. bytes (ABS,OVR)\r
-\r
-        Value  Global            Value  Global            Value  Global    \r
-        -----  ------            -----  ------            -----  ------    \r
-     00000000  e__DEFAUL |    00000000  l__DEFAUL |    00000000  s__DEFAUL\r
-     00000000  s_RCODE   |    00000000  .__.ABS.  |    00000728  e_RCODE  \r
-     00000728  l_RCODE  \r
-Hexadecimal  [32-Bits]\r
-\r
-Area                       Addr        Size        Decimal Bytes (Attributes)\r
---------------------       ----        ----        ------- ----- ------------\r
-_DEFAULT               00000000    00000000 =           0. bytes (REL,CON)\r
-\r
-        Value  Global            Value  Global            Value  Global    \r
-        -----  ------            -----  ------            -----  ------    \r
-Hexadecimal  [32-Bits]\r
-\r
-Area                       Addr        Size        Decimal Bytes (Attributes)\r
---------------------       ----        ----        ------- ----- ------------\r
-RCODE                  00000000    00000728 =        1832. bytes (REL,CON)\r
-\r
-        Value  Global            Value  Global            Value  Global    \r
-        -----  ------            -----  ------            -----  ------    \r
-     0000059E  abyte     |    000005AB  acrlf     |    000005B4  ahexw    \r
-     000005B9  ahexb     |    000005C2  ahexn     |    000005CC  amess    \r
-     000005DB  copyr     |    000006A3  clears   \r
-\r
-Files Linked                              [ module(s) ]\r
-\r
-gboot                                     [  ]\r
-\r
-\r
-User Base Address Definitions\r
-\r
-_DEFAULT=0\r
diff --git a/src/gboot/gboot.rel b/src/gboot/gboot.rel
deleted file mode 100644 (file)
index b7dfd70..0000000
+++ /dev/null
@@ -1,651 +0,0 @@
-XL4\r
-H 2 areas 9 global symbols\r
-S .__.ABS. Def00000000\r
-A _DEFAULT size 0 flags 0\r
-A RCODE size 728 flags 0\r
-S ahexb Def000005B9\r
-S acrlf Def000005AB\r
-S ahexn Def000005C2\r
-S abyte Def0000059E\r
-S amess Def000005CC\r
-S ahexw Def000005B4\r
-S copyr Def000005DB\r
-S clears Def000006A3\r
-T 00 00 00 00 58 58 58 58 59 59 4D 4D 44 44 48\r
-R 00 00 01 00\r
-T 0B 00 00 00 48 4D 4D 53 53 31 00 80 CD\r
-R 00 00 01 00\r
-T 14 00 00 00 A3 06 00 00 CD AB 05 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 1A 00 00 00 FD 04 00 00 18 22 00 00 00 42 4F\r
-R 00 00 01 00 00 04 01 00\r
-T 23 00 00 00 4F 54 20 20 20 20 42 49 4E 00 00\r
-R 00 00 01 00\r
-T 2E 00 00 00 00 0F 00 01 00 00 00 00 00 00 00\r
-R 00 00 01 00\r
-T 39 00 00 00 00 00 00 00 00 00 00\r
-R 00 00 01 00\r
-T 40 00 00 00\r
-R 00 00 01 00\r
-T 40 00 00 00 CD D2 01 00 00 6C 6F 61 64 69 6E\r
-R 00 00 01 00 00 05 01 00\r
-T 49 00 00 00 67 20 2F 62 6F 6F 74 2F 6B 65 72\r
-R 00 00 01 00\r
-T 54 00 00 00 6E 65 6C 2E 62 69 6E 0D 0A 00 CD\r
-R 00 00 01 00\r
-T 5F 00 00 00 2C 02 00 00 11 04 00 21\r
-R 00 00 01 00 00 04 01 00\r
-T 65 00 00 00 7A 07 00 00 CD AB 04 00 00 2A\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 6B 00 00 00 7A 07 00 00 11 C6 31 B7 ED 52 C2\r
-R 00 00 01 00 00 04 01 00\r
-T 74 00 00 00 79 01 00 00 2A 7C 07 00 00 22\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 7A 00 00 00 28 07 00 00 2A 7E 07 00 00 22\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 80 00 00 00 2A 07 00 00 2A 80 07 00 00 22\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 86 00 00 00 2C 07 00 00 11 01 00 21\r
-R 00 00 01 00 00 04 01 00\r
-T 8C 00 00 00 06 07 00 00 CD 70 02 00 00 20 7B\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 93 00 00 00 21 0B 07 00 00 CD 70 02 00 00 20\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T 9A 00 00 00 73 CD 99 03 00 00 21 94 0D 00 00\r
-R 00 00 01 00 00 06 01 00 00 0B 01 00\r
-T A1 00 00 00 01 14 00 CD 22 03 00 00 38 7B CD\r
-R 00 00 01 00 00 08 01 00\r
-T AA 00 00 00 40 01 00 00 CD 5D 01 00 00 3E F8\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T B1 00 00 00 ED 39 38 CD 51 02 00 00 21 00 80\r
-R 00 00 01 00 00 08 01 00\r
-T BA 00 00 00 CD 22 03 00 00 3E FC ED 39 38 CD\r
-R 00 00 01 00 00 05 01 00\r
-T C3 00 00 00 59 02 00 00 EB CD 22 03 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 0A 01 00\r
-T CA 00 00 00 62 02 00 00 D4 3F 02 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T D0 00 00 00 99 02 00 00 CD 0C 02 00 00 01\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T D6 00 00 00 80 80 21 AA 0D 00 00 18 06\r
-R 00 00 01 00 00 07 01 00\r
-T DD 00 00 00\r
-R 00 00 01 00\r
-T DD 00 00 00 19 CD DA 04 00 00 02 03\r
-R 00 00 01 00 00 06 01 00\r
-T E3 00 00 00\r
-R 00 00 01 00\r
-T E3 00 00 00 ED 5B A8 0D 00 00 B7 ED 52 38 F1\r
-R 00 00 01 00 00 06 01 00\r
-T EC 00 00 00\r
-R 00 00 01 00\r
-T EC 00 00 00 31 CD FF 21 D3 06 00 00 11 CD FF\r
-R 00 00 01 00 00 08 01 00\r
-T F5 00 00 00 01 33 00 ED B0 21 3A 01 00 00 ED\r
-R 00 00 01 00 00 0A 01 00\r
-T FE 00 00 00 5B A4 0D 00 00 D5 0E 06 ED B0 2A\r
-R 00 00 01 00 00 05 01 00\r
-T 07 01 00 00 A0 0D 00 00 ED 5B A6 0D 00 00 C9\r
-R 00 00 01 00 00 04 01 00 00 0A 01 00\r
-T 0E 01 00 00\r
-R 00 00 01 00\r
-T 0E 01 00 00 CD D2 01 00 00 66 69 6C 65 20 6E\r
-R 00 00 01 00 00 05 01 00\r
-T 17 01 00 00 6F 74 20 66 6F 75 6E 64 0D 0A 00\r
-R 00 00 01 00\r
-T 22 01 00 00 18 6B\r
-R 00 00 01 00\r
-T 24 01 00 00\r
-R 00 00 01 00\r
-T 24 01 00 00 CD D2 01 00 00 66 69 6C 65 20 74\r
-R 00 00 01 00 00 05 01 00\r
-T 2D 01 00 00 6F 6F 20 73 68 6F 72 74 0D 0A 00\r
-R 00 00 01 00\r
-T 38 01 00 00 18 55\r
-R 00 00 01 00\r
-T 3A 01 00 00\r
-R 00 00 01 00\r
-T 3A 01 00 00 3E 84 ED 39 3A E9\r
-R 00 00 01 00\r
-T 40 01 00 00\r
-R 00 00 01 00\r
-T 40 01 00 00\r
-R 00 00 01 00\r
-T 40 01 00 00 2A 94 0D 00 00 11 C9 A6 B7 ED 52\r
-R 00 00 01 00 00 05 01 00\r
-T 49 01 00 00 C8 CD D2 01 00 00 62 61 64 20 65\r
-R 00 00 01 00 00 06 01 00\r
-T 52 01 00 00 5F 6D 61 67 69 63 3A 20 00 18 2B\r
-R 00 00 01 00\r
-T 5D 01 00 00\r
-R 00 00 01 00\r
-T 5D 01 00 00 2A 96 0D 00 00 11 03 00 B7 ED 52\r
-R 00 00 01 00 00 05 01 00\r
-T 66 01 00 00 C8 CD D2 01 00 00 62 61 64 20 65\r
-R 00 00 01 00 00 06 01 00\r
-T 6F 01 00 00 5F 66 6F 72 6D 61 74 3A 20 00\r
-R 00 00 01 00\r
-T 79 01 00 00\r
-R 00 00 01 00\r
-T 79 01 00 00 CD D2 01 00 00 62 61 64 20 6D 61\r
-R 00 00 01 00 00 05 01 00\r
-T 82 01 00 00 67 69 63 3A 20 00\r
-R 00 00 01 00\r
-T 88 01 00 00\r
-R 00 00 01 00\r
-T 88 01 00 00 19\r
-R 00 00 01 00\r
-T 89 01 00 00\r
-R 00 00 01 00\r
-T 89 01 00 00 CD B4 05 00 00\r
-R 00 00 01 00 00 05 01 00\r
-T 8C 01 00 00\r
-R 00 00 01 00\r
-T 8C 01 00 00 CD AB 05 00 00\r
-R 00 00 01 00 00 05 01 00\r
-T 8F 01 00 00\r
-R 00 00 01 00\r
-T 8F 01 00 00 CD D2 01 00 00 64 6F 69 6E 67 20\r
-R 00 00 01 00 00 05 01 00\r
-T 98 01 00 00 61 20 63 6C 65 61 6E 20 62 6F 6F\r
-R 00 00 01 00\r
-T A3 01 00 00 74 0D 0A 00 21 7A 07 00 00 11\r
-R 00 00 01 00 00 09 01 00\r
-T AB 01 00 00 7B 07 00 00 01 FF 01 36 AA ED B0\r
-R 00 00 01 00 00 04 01 00\r
-T B4 01 00 00 11 00 00 06 04\r
-R 00 00 01 00\r
-T B9 01 00 00\r
-R 00 00 01 00\r
-T B9 01 00 00 C5 D5 21 7A 07 00 00 CD\r
-R 00 00 01 00 00 07 01 00\r
-T BF 01 00 00 B9 04 00 00 D1 C1 13 10 F3 3E AA\r
-R 00 00 01 00 00 04 01 00\r
-T C8 01 00 00 ED 39 0B 3E 13 ED 39 0A 18 FE CD\r
-R 00 00 01 00\r
-T D3 01 00 00 CC 05 00 00 67 62 6F 6F 74 3A 20\r
-R 00 00 01 00 00 04 01 00\r
-T DC 01 00 00 00 C3 CC 05 00 00\r
-R 00 00 01 00 00 06 01 00\r
-T E0 01 00 00\r
-R 00 00 01 00\r
-T E0 01 00 00 11 02 00 CD 00 02 00 00 3E 81 ED\r
-R 00 00 01 00 00 08 01 00\r
-T E9 01 00 00 39 0B 3E 13 ED 39 0A 97 3D 20 FD\r
-R 00 00 01 00\r
-T F4 01 00 00 3D 20 FD 3D 20 FD 3D 20 FD 11\r
-R 00 00 01 00\r
-T FE 01 00 00 00 02\r
-R 00 00 01 00\r
-T 00 02 00 00\r
-R 00 00 01 00\r
-T 00 02 00 00 21 81 FC E5 FD E1 01 05 00 C3\r
-R 00 00 01 00\r
-T 0A 02 00 00 DB 05 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 0C 02 00 00\r
-R 00 00 01 00\r
-T 0C 02 00 00 CD D2 01 00 00 73 74 61 72 74 69\r
-R 00 00 01 00 00 05 01 00\r
-T 15 02 00 00 6E 67 20 6F 70 65 72 61 74 69 6E\r
-R 00 00 01 00\r
-T 20 02 00 00 67 20 73 79 73 74 65 6D 0D 0A 00\r
-R 00 00 01 00\r
-T 2B 02 00 00 C9\r
-R 00 00 01 00\r
-T 2C 02 00 00\r
-R 00 00 01 00\r
-T 2C 02 00 00 CD E0 01 00 00 3E 80 ED 39 3A 3E\r
-R 00 00 01 00 00 05 01 00\r
-T 35 02 00 00 FC ED 39 38 11 01 80 01 FF 00\r
-R 00 00 01 00\r
-T 3F 02 00 00\r
-R 00 00 01 00\r
-T 3F 02 00 00 6B 62 2B 36 00 79 B0 C8 ED B0 C9\r
-R 00 00 01 00\r
-T 4A 02 00 00\r
-R 00 00 01 00\r
-T 4A 02 00 00 B7 ED 52 D0 19 EB C9\r
-R 00 00 01 00\r
-T 51 02 00 00\r
-R 00 00 01 00\r
-T 51 02 00 00 2A 9C 0D 00 00 11 14 00 18 11\r
-R 00 00 01 00 00 05 01 00\r
-T 59 02 00 00\r
-R 00 00 01 00\r
-T 59 02 00 00 2A A2 0D 00 00 ED 5B 9E 0D 00 00\r
-R 00 00 01 00 00 05 01 00 00 0B 01 00\r
-T 60 02 00 00 18 08\r
-R 00 00 01 00\r
-T 62 02 00 00\r
-R 00 00 01 00\r
-T 62 02 00 00 2A A6 0D 00 00 ED 5B A2 0D 00 00\r
-R 00 00 01 00 00 05 01 00 00 0B 01 00\r
-T 69 02 00 00 13\r
-R 00 00 01 00\r
-T 6A 02 00 00\r
-R 00 00 01 00\r
-T 6A 02 00 00 B7 ED 52 4D 44 C9\r
-R 00 00 01 00\r
-T 70 02 00 00\r
-R 00 00 01 00\r
-T 70 02 00 00 22 2E 07 00 00 CD 99 03 00 00\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T 76 02 00 00\r
-R 00 00 01 00\r
-T 76 02 00 00 01 10 00 21 7A 0D 00 00 CD\r
-R 00 00 01 00 00 08 01 00\r
-T 7D 02 00 00 22 03 00 00 D8 23 ED 5B\r
-R 00 00 01 00 00 04 01 00\r
-T 83 02 00 00 2E 07 00 00 06 0E\r
-R 00 00 01 00 00 04 01 00\r
-T 87 02 00 00\r
-R 00 00 01 00\r
-T 87 02 00 00 23 1A BE 20 EA B7 28 05 13 10 F5\r
-R 00 00 01 00\r
-T 92 02 00 00 1A B7\r
-R 00 00 01 00\r
-T 94 02 00 00\r
-R 00 00 01 00\r
-T 94 02 00 00 ED 5B 7A 0D 00 00 C9\r
-R 00 00 01 00 00 06 01 00\r
-T 99 02 00 00\r
-R 00 00 01 00\r
-T 99 02 00 00 21 AA 0D 00 00 22 A8 0D 00 00 CD\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T A0 02 00 00 A5 03 00 00 CD C4 03 00 00 7D B4\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T A7 02 00 00 28 3E\r
-R 00 00 01 00\r
-T A9 02 00 00\r
-R 00 00 01 00\r
-T A9 02 00 00 CD EC 03 00 00 7B B2 28 49 7B E6\r
-R 00 00 01 00 00 05 01 00\r
-T B2 02 00 00 07 20 59 2A A8 0D 00 00 73 23 72\r
-R 00 00 01 00 00 08 01 00\r
-T BB 02 00 00 23 22 A8 0D 00 00 06 1F\r
-R 00 00 01 00 00 06 01 00\r
-T C1 02 00 00\r
-R 00 00 01 00\r
-T C1 02 00 00 C5 D5 CD C4 03 00 00 7D B4 28 1A\r
-R 00 00 01 00 00 07 01 00\r
-T CA 02 00 00 CD EC 03 00 00 7B B2 28 28 EB D1\r
-R 00 00 01 00 00 05 01 00\r
-T D3 02 00 00 13 B7 ED 52 20 35 C1 10 E5 CD\r
-R 00 00 01 00\r
-T DD 02 00 00 C4 03 00 00 7D B4 20 C6 C9\r
-R 00 00 01 00 00 04 01 00\r
-T E4 02 00 00\r
-R 00 00 01 00\r
-T E4 02 00 00 E1 E1 C9\r
-R 00 00 01 00\r
-T E7 02 00 00\r
-R 00 00 01 00\r
-T E7 02 00 00 CD D2 01 00 00 6E 75 6C 6C 20 66\r
-R 00 00 01 00 00 05 01 00\r
-T F0 02 00 00 69 6C 65 0D 0A 00 C3 8F 01 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T F9 02 00 00\r
-R 00 00 01 00\r
-T F9 02 00 00 CD D2 01 00 00 68 6F 6C 65 20 69\r
-R 00 00 01 00 00 05 01 00\r
-T 02 03 00 00 6E 20 66 69 6C 65 0D 0A 00 C3\r
-R 00 00 01 00\r
-T 0C 03 00 00 8F 01 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 0E 03 00 00\r
-R 00 00 01 00\r
-T 0E 03 00 00 CD D2 01 00 00 6E 6F 74 20 61 6C\r
-R 00 00 01 00 00 05 01 00\r
-T 17 03 00 00 69 67 6E 65 64 0D 0A 00 C3\r
-R 00 00 01 00\r
-T 20 03 00 00 8F 01 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 22 03 00 00\r
-R 00 00 01 00\r
-T 22 03 00 00 E5 C5 ED 43 8E 0D 00 00 22\r
-R 00 00 01 00 00 08 01 00\r
-T 29 03 00 00 90 0D 00 00 21 00 00 22\r
-R 00 00 01 00 00 04 01 00\r
-T 2F 03 00 00 92 0D 00 00 2A 8A 0D 00 00 7D B4\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 36 03 00 00 20 1A\r
-R 00 00 01 00\r
-T 38 03 00 00\r
-R 00 00 01 00\r
-T 38 03 00 00 CD C4 03 00 00 7D B4 28 4F 22\r
-R 00 00 01 00 00 05 01 00\r
-T 40 03 00 00 8A 0D 00 00 CD EC 03 00 00 7B B2\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 47 03 00 00 28 B0 21 7A 07 00 00 22\r
-R 00 00 01 00 00 07 01 00\r
-T 4D 03 00 00 8C 0D 00 00 CD AB 04 00 00\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 52 03 00 00\r
-R 00 00 01 00\r
-T 52 03 00 00 2A 8A 0D 00 00 ED 5B 8E 0D 00 00\r
-R 00 00 01 00 00 05 01 00 00 0B 01 00\r
-T 59 03 00 00 CD 4A 02 00 00 2A 8A 0D 00 00 B7\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T 60 03 00 00 ED 52 22 8A 0D 00 00 2A\r
-R 00 00 01 00 00 07 01 00\r
-T 66 03 00 00 8E 0D 00 00 B7 ED 52 22\r
-R 00 00 01 00 00 04 01 00\r
-T 6C 03 00 00 8E 0D 00 00 2A 92 0D 00 00 19 22\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 73 03 00 00 92 0D 00 00 4B 42 ED 5B\r
-R 00 00 01 00 00 04 01 00\r
-T 79 03 00 00 90 0D 00 00 2A 8C 0D 00 00 ED B0\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 80 03 00 00 22 8C 0D 00 00 ED 53 90 0D 00 00\r
-R 00 00 01 00 00 05 01 00 00 0B 01 00\r
-T 87 03 00 00 2A 8E 0D 00 00 7D B4 20 AA\r
-R 00 00 01 00 00 05 01 00\r
-T 8E 03 00 00\r
-R 00 00 01 00\r
-T 8E 03 00 00 2A 92 0D 00 00 4D 44 D1 B7 ED 52\r
-R 00 00 01 00 00 05 01 00\r
-T 97 03 00 00 E1 C9\r
-R 00 00 01 00\r
-T 99 03 00 00\r
-R 00 00 01 00\r
-T 99 03 00 00 21 3A 07 00 00 CD 5F 04 00 00 21\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T A0 03 00 00 00 00 22 8A 0D 00 00\r
-R 00 00 01 00 00 07 01 00\r
-T A5 03 00 00\r
-R 00 00 01 00\r
-T A5 03 00 00 2A 42 07 00 00 22 30 07 00 00 2A\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T AC 03 00 00 44 07 00 00 22 32 07 00 00 21\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T B2 03 00 00 52 07 00 00 22 34 07 00 00 21\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T B8 03 00 00 7A 0B 00 00 22 36 07 00 00 21\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T BE 03 00 00 7A 0D 00 00 22 38 07 00 00 C9\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T C4 03 00 00\r
-R 00 00 01 00\r
-T C4 03 00 00 2A 30 07 00 00 ED 5B 32 07 00 00\r
-R 00 00 01 00 00 05 01 00 00 0B 01 00\r
-T CB 03 00 00 01 00 02 B7 ED 42 EB 06 00 ED 42\r
-R 00 00 01 00\r
-T D6 03 00 00 EB 38 0B 22 30 07 00 00 ED 53\r
-R 00 00 01 00 00 08 01 00\r
-T DE 03 00 00 32 07 00 00 21 00 02 C9\r
-R 00 00 01 00 00 04 01 00\r
-T E4 03 00 00\r
-R 00 00 01 00\r
-T E4 03 00 00 2A 30 07 00 00 ED 43 30 07 00 00\r
-R 00 00 01 00 00 05 01 00 00 0B 01 00\r
-T EB 03 00 00 C9\r
-R 00 00 01 00\r
-T EC 03 00 00\r
-R 00 00 01 00\r
-T EC 03 00 00 2A 34 07 00 00 11 76 07 00 00 B7\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T F3 03 00 00 ED 52 30 0B 2A 34 07 00 00 5E 23\r
-R 00 00 01 00 00 09 01 00\r
-T FC 03 00 00 56 23 22 34 07 00 00 C9\r
-R 00 00 01 00 00 07 01 00\r
-T 02 04 00 00\r
-R 00 00 01 00\r
-T 02 04 00 00 2A 36 07 00 00 11 7A 0B 00 00 B7\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T 09 04 00 00 ED 52 38 13 2A 34 07 00 00 5E 23\r
-R 00 00 01 00 00 09 01 00\r
-T 12 04 00 00 56 23 22 34 07 00 00 21\r
-R 00 00 01 00 00 07 01 00\r
-T 18 04 00 00 7A 09 00 00 22 36 07 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 1E 04 00 00 AB 04 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 20 04 00 00\r
-R 00 00 01 00\r
-T 20 04 00 00 2A 34 07 00 00 11 79 07 00 00 B7\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T 27 04 00 00 ED 52 30 0B 2A 36 07 00 00 5E 23\r
-R 00 00 01 00 00 09 01 00\r
-T 30 04 00 00 56 23 22 36 07 00 00 C9\r
-R 00 00 01 00 00 07 01 00\r
-T 36 04 00 00\r
-R 00 00 01 00\r
-T 36 04 00 00 2A 38 07 00 00 11 7A 0D 00 00 B7\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T 3D 04 00 00 ED 52 38 13 2A 36 07 00 00 5E 23\r
-R 00 00 01 00 00 09 01 00\r
-T 46 04 00 00 56 23 22 36 07 00 00 21\r
-R 00 00 01 00 00 07 01 00\r
-T 4C 04 00 00 7A 0B 00 00 22 38 07 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 52 04 00 00 AB 04 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 54 04 00 00\r
-R 00 00 01 00\r
-T 54 04 00 00 2A 38 07 00 00 5E 23 56 23 22\r
-R 00 00 01 00 00 05 01 00\r
-T 5C 04 00 00 38 07 00 00 C9\r
-R 00 00 01 00 00 04 01 00\r
-T 5F 04 00 00\r
-R 00 00 01 00\r
-T 5F 04 00 00 E5 7B E6 07 06 03\r
-R 00 00 01 00\r
-T 65 04 00 00\r
-R 00 00 01 00\r
-T 65 04 00 00 CB 3A CB 1B 10 FA 2A 2A 07 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 6E 04 00 00 37 ED 52 38 1A 2A 28 07 00 00 19\r
-R 00 00 01 00 00 0A 01 00\r
-T 77 04 00 00 EB 21 7A 07 00 00 F5 E5 CD\r
-R 00 00 01 00 00 06 01 00\r
-T 7E 04 00 00 AB 04 00 00 E1 D1 01 40 00 59 ED\r
-R 00 00 01 00 00 04 01 00\r
-T 87 04 00 00 5C 19 D1 ED B0 C9\r
-R 00 00 01 00\r
-T 8D 04 00 00\r
-R 00 00 01 00\r
-T 8D 04 00 00 CD D2 01 00 00 62 61 64 20 69 6E\r
-R 00 00 01 00 00 05 01 00\r
-T 96 04 00 00 6F 64 65 3A 20 00 C6 30 CD\r
-R 00 00 01 00\r
-T 9F 04 00 00 9E 05 00 00 CD CC 05 00 00 2C 20\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T A6 04 00 00 00 EB C3 89 01 00 00\r
-R 00 00 01 00 00 07 01 00\r
-T AB 04 00 00\r
-R 00 00 01 00\r
-T AB 04 00 00 E5 CD C5 04 00 00 E5 FD E1 57 E1\r
-R 00 00 01 00 00 06 01 00\r
-T B4 04 00 00 1E 03 C3 DB 05 00 00\r
-R 00 00 01 00 00 07 01 00\r
-T B9 04 00 00\r
-R 00 00 01 00\r
-T B9 04 00 00 E5 CD C5 04 00 00 FD E1 16 03 5F\r
-R 00 00 01 00 00 06 01 00\r
-T C2 04 00 00 C3 DB 05 00 00\r
-R 00 00 01 00 00 05 01 00\r
-T C5 04 00 00\r
-R 00 00 01 00\r
-T C5 04 00 00 21 00 06 37 ED 52 38 1D 01 00 02\r
-R 00 00 01 00\r
-T D0 04 00 00 21 00 02 19 7C 65 69 29 8F C9\r
-R 00 00 01 00\r
-T DA 04 00 00\r
-R 00 00 01 00\r
-T DA 04 00 00 7E 23 56 23 CB 3A 1F CB 3A 1F CB\r
-R 00 00 01 00\r
-T E5 04 00 00 3A 1F C6 3C C9\r
-R 00 00 01 00\r
-T EA 04 00 00\r
-R 00 00 01 00\r
-T EA 04 00 00 CD D2 01 00 00 62 61 64 20 62 6C\r
-R 00 00 01 00 00 05 01 00\r
-T F3 04 00 00 6F 63 6B 3A 20 00 EB C3\r
-R 00 00 01 00\r
-T FB 04 00 00 89 01 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T FD 04 00 00\r
-R 00 00 01 00\r
-T FD 04 00 00 21 16 07 00 00 CD 37 F0 C8 CD\r
-R 00 00 01 00 00 05 01 00\r
-T 05 05 00 00 D2 01 00 00 6C 6F 61 64 69 6E 67\r
-R 00 00 01 00 00 04 01 00\r
-T 0E 05 00 00 20 41 3A 4B 45 52 4E 45 4C 2E 42\r
-R 00 00 01 00\r
-T 19 05 00 00 49 4E 0D 0A 00 3E 31 32\r
-R 00 00 01 00\r
-T 21 05 00 00 F7 06 00 00 ED 5B 26 07 00 00 B7\r
-R 00 00 01 00 00 04 01 00 00 0A 01 00\r
-T 28 05 00 00 ED 52 20 23 19 22 24 07 00 00 7D\r
-R 00 00 01 00 00 0A 01 00\r
-T 31 05 00 00 B4 20 04 21 23 07 00 00 34 21\r
-R 00 00 01 00 00 08 01 00\r
-T 39 05 00 00 00 40 19 22 26 07 00 00 21\r
-R 00 00 01 00 00 08 01 00\r
-T 40 05 00 00 22 07 00 00 34 21 16 07 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 0A 01 00\r
-T 47 05 00 00 37 F0 20 D8 21 22 07 00 00 35\r
-R 00 00 01 00 00 09 01 00\r
-T 4F 05 00 00\r
-R 00 00 01 00\r
-T 4F 05 00 00 CD 2C 02 00 00 FD 21 00 00 21\r
-R 00 00 01 00 00 05 01 00\r
-T 57 05 00 00 94 0D 00 00 11 03 0C 01 14 00 CD\r
-R 00 00 01 00 00 04 01 00\r
-T 60 05 00 00 DB 05 00 00 CD 40 01 00 00 CD\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 66 05 00 00 5D 01 00 00 CD 51 02 00 00 D5 FD\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 6D 05 00 00 E1 11 00 0C 6B 63 CD DB 05 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 76 05 00 00 D5 CD 59 02 00 00 21 00 C0 19 D1\r
-R 00 00 01 00 00 06 01 00\r
-T 7F 05 00 00 CD DB 05 00 00 CD 62 02 00 00 D4\r
-R 00 00 01 00 00 05 01 00 00 0A 01 00\r
-T 86 05 00 00 3F 02 00 00 CD 0C 02 00 00 3A\r
-R 00 00 01 00 00 04 01 00 00 09 01 00\r
-T 8C 05 00 00 22 07 00 00 3C 47 21 80 80 3E BC\r
-R 00 00 01 00 00 04 01 00\r
-T 95 05 00 00\r
-R 00 00 01 00\r
-T 95 05 00 00 77 23 C6 04 10 FA C3 EC 00 00 00\r
-R 00 00 01 00 00 0B 01 00\r
-T 9E 05 00 00\r
-R 00 00 01 00\r
-T 9E 05 00 00 F5 ED 38 05 E6 02 28 F9 F1 ED 39\r
-R 00 00 01 00\r
-T A9 05 00 00 07 C9\r
-R 00 00 01 00\r
-T AB 05 00 00\r
-R 00 00 01 00\r
-T AB 05 00 00 3E 0D CD 9E 05 00 00 3E 0A 18 EA\r
-R 00 00 01 00 00 07 01 00\r
-T B4 05 00 00\r
-R 00 00 01 00\r
-T B4 05 00 00 7C CD B9 05 00 00 7D\r
-R 00 00 01 00 00 06 01 00\r
-T B9 05 00 00\r
-R 00 00 01 00\r
-T B9 05 00 00 F5 0F 0F 0F 0F CD C2 05 00 00 F1\r
-R 00 00 01 00 00 0A 01 00\r
-T C2 05 00 00\r
-R 00 00 01 00\r
-T C2 05 00 00 E6 0F C6 90 27 CE 40 27 18 D2\r
-R 00 00 01 00\r
-T CC 05 00 00\r
-R 00 00 01 00\r
-T CC 05 00 00 E3 F5 7E 23 B7 28 05 CD\r
-R 00 00 01 00\r
-T D4 05 00 00 9E 05 00 00 18 F6 F1 E3 C9\r
-R 00 00 01 00 00 04 01 00\r
-T DB 05 00 00\r
-R 00 00 01 00\r
-T DB 05 00 00 7B FE 04 D2 59 06 00 00 79 E6 1F\r
-R 00 00 01 00 00 08 01 00\r
-T E4 05 00 00 C5 4F 06 00 CD 2B 06 00 00 0C 0D\r
-R 00 00 01 00 00 09 01 00\r
-T ED 05 00 00 28 11 ED 38 30 EE 50 ED 39 30 FD\r
-R 00 00 01 00\r
-T F8 05 00 00 09 DC 55 06 00 00 09 DC\r
-R 00 00 01 00 00 06 01 00\r
-T FE 05 00 00 57 06 00 00\r
-R 00 00 01 00 00 04 01 00\r
-T 00 06 00 00\r
-R 00 00 01 00\r
-T 00 06 00 00 C1 3E 05 CB 38 CB 19 3D 20 F9 18\r
-R 00 00 01 00\r
-T 0B 06 00 00 1A C5 01 20 00 ED 09 26 ED 38 30\r
-R 00 00 01 00\r
-T 16 06 00 00 EE 50 ED 39 30 FD 09 DC\r
-R 00 00 01 00\r
-T 1E 06 00 00 55 06 00 00 09 DC 57 06 00 00 C1\r
-R 00 00 01 00 00 04 01 00 00 0A 01 00\r
-T 25 06 00 00 0B 78 B1 20 E2 C9\r
-R 00 00 01 00\r
-T 2B 06 00 00\r
-R 00 00 01 00\r
-T 2B 06 00 00 ED 09 26 ED 01 27 18 05 3E 01 ED\r
-R 00 00 01 00\r
-T 36 06 00 00 39 26 E5 FD E5 ED 29 23 ED 21 24\r
-R 00 00 01 00\r
-T 41 06 00 00 ED 19 25 E1 ED 29 20 ED 21 21 ED\r
-R 00 00 01 00\r
-T 4C 06 00 00 11 22 E1 3E 02 ED 39 31 C9 14 C9\r
-R 00 00 01 00\r
-T 57 06 00 00 1C C9 C5 AF ED 39 26 ED 39 27 3E\r
-R 00 00 01 00\r
-T 62 06 00 00 04 CB 38 CB 19 3D 20 F9 78 B1 28\r
-R 00 00 01 00\r
-T 6D 06 00 00 0D C5 01 10 00 CD 83 06 00 00 C1\r
-R 00 00 01 00 00 0A 01 00\r
-T 76 06 00 00 0B 78 B1 20 F3 C1 47 79 E6 0F 28\r
-R 00 00 01 00\r
-T 81 06 00 00 20 4F ED 30 26 CC 33 06 00 00 FD\r
-R 00 00 01 00 00 0A 01 00\r
-T 8A 06 00 00 09 DC 55 06 00 00 09 DC\r
-R 00 00 01 00 00 06 01 00\r
-T 90 06 00 00 57 06 00 00 41 0E 01 ED 38 30 EE\r
-R 00 00 01 00 00 04 01 00\r
-T 99 06 00 00 50 ED 39 30 ED 09 26 10 F8\r
-R 00 00 01 00\r
-T A2 06 00 00\r
-R 00 00 01 00\r
-T A2 06 00 00 C9\r
-R 00 00 01 00\r
-T A3 06 00 00\r
-R 00 00 01 00\r
-T A3 06 00 00 3E 74 ED 39 00 ED 39 01 3E 22 ED\r
-R 00 00 01 00\r
-T AE 06 00 00 39 02 ED 39 03 97 ED 39 04 ED 39\r
-R 00 00 01 00\r
-T B9 06 00 00 05 ED 30 08 ED 30 09 ED 39 27 ED\r
-R 00 00 01 00\r
-T C4 06 00 00 39 2F ED 39 29 ED 39 2A ED 39 2B\r
-R 00 00 01 00\r
-T CF 06 00 00 ED 39 2C C9 02 00 D3 FF F3 FF\r
-R 00 00 01 00\r
-T D9 06 00 00 D9 FF EA FF 00 00 2F 62 6F 6F 74\r
-R 00 00 01 00\r
-T E4 06 00 00 2F 6B 65 72 6E 65 6C 2E 62 69 6E\r
-R 00 00 01 00\r
-T EF 06 00 00 00 72 6F 6F 74 3D 68 64 30 00\r
-R 00 00 01 00\r
-T F9 06 00 00 F7 FF 00 00 53 4E 3D 30 30 30 30\r
-R 00 00 01 00\r
-T 04 07 00 00 30 00\r
-R 00 00 01 00\r
-T 06 07 00 00\r
-R 00 00 01 00\r
-T 06 07 00 00 62 6F 6F 74 00 6B 65 72 6E 65 6C\r
-R 00 00 01 00\r
-T 11 07 00 00 2E 62 69 6E 00 01 4B 45 52 4E 45\r
-R 00 00 01 00\r
-T 1C 07 00 00 4C 20 20 42 49 4E 00 0C 00 00\r
-R 00 00 01 00\r
-T 26 07 00 00 00 40\r
-R 00 00 01 00\r
-T 28 07 00 00\r
-R 00 00 01 00\r
-T 28 07 00 00\r
-R 00 00 01 00\r
index 2a922e1..a9e801e 100644 (file)
@@ -1,25 +1,8 @@
-as-z80 -l -o gboot\r
-@if errorlevel 1 goto failure\r
-link-z80 -f gboot\r
-@if errorlevel 1 goto failure\r
-\r
-ihex2bin gboot.i86 ..\..\bin\boot.bin\r
-4dos /c crcd ..\..\bin\boot.bin\r
-bin2c ..\..\bin\boot.bin ..\fsutil\boot.c\r
-\r
-copy checksum.dat \nlddl\r
-copy checksum.dat \nlddl\crc.dat\r
-copy ..\..\bin\boot.bin \nlddl\r
-set country=NLD\r
-crc\r
-copy \nlddl\checksum ..\..\bin\r
-\r
-copy \nlddl\checksum \\darkstar\public\dos622\nlddl\r
-copy \nlddl\boot.bin \\darkstar\public\dos622\nlddl\r
-\r
-@echo SUCCESS\r
-@goto done\r
-:failure\r
-@echo FAILURE\r
-:done\r
+md build\r
+cd build\r
+copy ..\gboot.lnk\r
+copy ..\uzboot.lnk\r
+copy ..\build.ban n.bat\r
+call n\r
+cd ..\r
 \r
diff --git a/src/gboot/uzboot.asm b/src/gboot/uzboot.asm
new file mode 100644 (file)
index 0000000..99c710f
--- /dev/null
@@ -0,0 +1,67 @@
+; uzboot.asm by Nick, based on c0k.asm for UZI180 (creates a kernel executable)\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+$ io64180.inc\r
+\r
+E_MAGIC                equ     0a6c9h\r
+E_FORMAT_KERNEL        equ     3\r
+E_STACK_SIZE   equ     1000h\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       module  _uzboot\r
+\r
+       extern  init\r
+\r
+       extern  e_RCODE                 ; e_hsize\r
+       extern  s_ICODE                 ; e_idata\r
+       extern  s_UDATA0                ; e_udata\r
+       extern  s_CSTACK                ; e_stack\r
+       extern  e_CSTACK                ; e_break\r
+\r
+; -----------------------------------------------------------------------------\r
+; forward definitions of segments, to set the linkage order (c0k must be first)\r
+\r
+       rseg    RCODE\r
+       rseg    ICODE\r
+;      rseg    TEMP\r
+;      rseg    DATA0\r
+;      rseg    WCSTR\r
+       rseg    CONST\r
+       rseg    CSTR\r
+       rseg    IDATA0(NUL)\r
+       rseg    CDATA0\r
+       rseg    ECSTR(NUL)\r
+       rseg    CCSTR\r
+       rseg    CODE(NUL)               ; needs to be at end for banked model\r
+       rseg    UDATA0\r
+       rseg    CSTACK\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       rseg    _DEFAULT                ; means header is discarded at loading\r
+\r
+       defw    E_MAGIC                 ; e_magic\r
+       defw    E_FORMAT_KERNEL         ; e_format\r
+       defd    12345678h               ; e_size\r
+       defw    e_RCODE+14h             ; e_hsize (14h = l__DEFAULT)\r
+       defw    s_ICODE                 ; e_idata\r
+       defw    init                    ; e_entry\r
+       defw    s_UDATA0                ; e_udata\r
+       defw    s_CSTACK                ; e_stack\r
+       defw    e_CSTACK                ; e_break\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+$ diag.inc                             ; this will select RCODE segment\r
+$ copyr.inc                            ; this will select RCODE segment\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       rseg    CSTACK\r
+       defs    E_STACK_SIZE            ; the default stack size is set here\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       END\r
diff --git a/src/gboot/uzboot.lnk b/src/gboot/uzboot.lnk
new file mode 100644 (file)
index 0000000..6fc150b
--- /dev/null
@@ -0,0 +1,12 @@
+-m\r
+-u\r
+-i\r
+-o uzboot\r
+-bl RCODE=0\r
+-bl ICODE=0x8100\r
+-bl CODE=0x804000,0x10000\r
+-bc CODE=0x4000\r
+uzboot\r
+uzfile\r
+uzmain\r
+uzdata\r
diff --git a/src/gboot/uzdata.asm b/src/gboot/uzdata.asm
new file mode 100644 (file)
index 0000000..7f4bac3
--- /dev/null
@@ -0,0 +1,22 @@
+; uzdata.asm by Nick, gunzipper, stub program providing label to access zdata\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+$ io64180.inc\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       module  _uzdata\r
+\r
+       public  zdata\r
+\r
+       rseg    CODE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+zdata::\r
+       ; the actual data is provided by concatenating it to the executable\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       END\r
diff --git a/src/gboot/uzfile.asm b/src/gboot/uzfile.asm
new file mode 100644 (file)
index 0000000..16c12e9
--- /dev/null
@@ -0,0 +1,1255 @@
+; uzfile.asm by Nick, gunzipper, based on zipfile.inc from Hytech EPROM 5.529+\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+$ io64180.inc\r
+\r
+       module  _uzfile\r
+\r
+       public  uzfgo\r
+       public  gzhbuf\r
+       public  gztbuf\r
+       extern  abyte\r
+       extern  ahexb\r
+       extern  ahexw\r
+       extern  acrlf\r
+       extern  bomb\r
+       extern  copyr\r
+       extern  uzmess\r
+\r
+       rseg    RCODE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+bad_format:\r
+       call    uzmess\r
+       db      'not in gzip format',0dh,0ah,0\r
+       jp      bomb\r
+\r
+uzfgo: ; file is deflated, inflate\r
+       ;in0    d,(BBR)\r
+       ;push   de\r
+\r
+       ;ld     e,0\r
+       ;call   winehl                  ; e:hl -> input data\r
+       ;push   hl\r
+       ;pop    iy\r
+       ;out0   (BBR),e                 ; BBR:iy -> input data\r
+\r
+ ld (outptr),hl\r
+ ld hl,outseg\r
+ ld (hl),e ; save absolute address -> output buffer for calls to copyr\r
+\r
+ ld hl,virtbr\r
+ ld (hl),d ; save virtual base address to use when incrementing virtbr:ix\r
+ push iy\r
+ pop ix ; now reading the input data from (ix) instead of (iy)\r
+\r
+ ld l,d\r
+ ld h,80h\r
+ ld a,(hl) ; translate BBR value via virtual memory table for actual use\r
+ out0 (BBR),a ; prepare to read the input data directly from (ix)\r
+\r
+       sub     a                       ; inflation_routine\r
+       ld      (lblock),a              ; last block flag\r
+       ld      (dbits),a               ; dead bits in low dbuf\r
+       call    nxtix                   ; initialise dbuf\r
+\r
+ ld iy,gzhbuf\r
+ ld b,10\r
+ call pread\r
+\r
+ ld hl,(gzhbuf)\r
+ ld de,8b1fh\r
+ or a\r
+ sbc hl,de ; ensure magic number is gzip\r
+ jr nz,bad_format\r
+\r
+ ld hl,(gzhbuf+2)\r
+ ld de,8\r
+ or a\r
+ sbc hl,de ; ensure compression method = 8 and no header options are present\r
+ jr nz,bad_format\r
+\r
+ ld iy,outbuf ; non-repeated data will be stored temporarily at (iy)\r
+\r
+uzf0:  ld      a,(lblock)\r
+       dec     a\r
+ .if 0\r
+ jp z,uzfret\r
+ .else\r
+       jr      z,uzfret                ; inflate_done\r
+ .endif\r
+\r
+ .if 0\r
+ call acrlf\r
+\r
+ ld a,(virtbr)\r
+ call ahexb\r
+ ld a,':'\r
+ call abyte\r
+ push ix\r
+ pop hl\r
+ call ahexw\r
+\r
+ ld a,'='\r
+ call abyte\r
+\r
+ extern zdata\r
+ ld hl,LWRD zdata+10\r
+ ld a,BYTE3 zdata+10\r
+ add hl,hl\r
+ add hl,hl\r
+ rra\r
+ rr h\r
+ rr l\r
+ rra\r
+ rr h\r
+ rr l\r
+ ex de,hl\r
+ ld c,a ; c:de -> absolute start of compressed data\r
+\r
+ push ix\r
+ pop hl\r
+ ld a,(virtbr)\r
+ add hl,hl\r
+ add hl,hl\r
+ rra\r
+ rr h\r
+ rr l\r
+ rra\r
+ rr h\r
+ rr l ; a:hl -> absolute position in compressed data\r
+\r
+ or a\r
+ sbc hl,de\r
+ sbc a,c ; a:hl = absolute offset within compressed data\r
+ call ahexb\r
+ call ahexw\r
+\r
+ ld a,' '\r
+ call abyte\r
+ ld a,16\r
+ ld hl,dbits\r
+ sub (hl)\r
+ call ahexb\r
+ ld a,' '\r
+ call abyte\r
+ call peek\r
+ ld a,c\r
+ and 7\r
+ call ahexb\r
+ call acrlf\r
+ .endif\r
+\r
+       ld      a,1\r
+       call    bits                    ; get_bit\r
+       ld      (lblock),a\r
+\r
+       call    tbl                     ; read_tables\r
+       ;jr     nz,uzfret               ; bad table\r
+\r
+uzf1:\r
+ .if 0\r
+ ld a,'a'\r
+ call abyte\r
+ .endif\r
+\r
+       ;ld     bc,wdog                 ; rwdog\r
+       ;in0    (c)\r
+\r
+       ld      hl,plit                 ; lit_parse_table\r
+       ld      de,llit                 ; lit_bitlen_table\r
+       call    parse                   ; returns de = item\r
+       dec     d\r
+ .if 0\r
+ jp z,uzf2\r
+ .else\r
+       jr      z,uzf2\r
+ .endif\r
+\r
+       ld      (iy),e\r
+       inc     iy\r
+ .if 0\r
+ ld a,e\r
+ call ahexb\r
+ call acrlf\r
+ .endif\r
+ .if 0\r
+ ld a,'b'\r
+ call abyte\r
+ .endif\r
+\r
+ .if 1\r
+       ld      hl,plit                 ; lit_parse_table\r
+       ld      de,llit                 ; lit_bitlen_table\r
+       call    parse                   ; returns de = item\r
+       dec     d\r
+       jr      z,uzf2\r
+\r
+       ld      (iy),e\r
+       inc     iy\r
+ .if 0\r
+ ld a,e\r
+ call ahexb\r
+ call acrlf\r
+ .endif\r
+ .if 0\r
+ ld a,'c'\r
+ call abyte\r
+ .endif\r
+\r
+       ld      hl,plit                 ; lit_parse_table\r
+       ld      de,llit                 ; lit_bitlen_table\r
+       call    parse                   ; returns de = item\r
+       dec     d\r
+       jr      z,uzf2\r
+\r
+       ld      (iy),e\r
+       inc     iy\r
+ .if 0\r
+ ld a,e\r
+ call ahexb\r
+ call acrlf\r
+ .endif\r
+ .if 0\r
+ ld a,'d'\r
+ call abyte\r
+ .endif\r
+\r
+       ld      hl,plit                 ; lit_parse_table\r
+       ld      de,llit                 ; lit_bitlen_table\r
+       call    parse                   ; returns de = item\r
+       dec     d\r
+       jr      z,uzf2\r
+\r
+       ld      (iy),e\r
+       inc     iy\r
+ .if 0\r
+ ld a,e\r
+ call ahexb\r
+ call acrlf\r
+ .endif\r
+ .if 0\r
+ ld a,'e'\r
+ call abyte\r
+ .endif\r
+\r
+       push    iy\r
+       pop     hl\r
+       ld      de,outbuf+100h\r
+       or      a\r
+       sbc     hl,de\r
+       jr      c,uzf1                  ; output buffer still has room\r
+ .if 0\r
+ ld a,'f'\r
+ call abyte\r
+ .endif\r
+\r
+       inc     h                       ; hl now = iy - outbuf (byte count)\r
+       call    oflsh\r
+ .endif\r
+       jr      uzf1\r
+\r
+uzfret:        ; enter with z = success, nz = failure\r
+ .if 0\r
+ ld a,'g'\r
+ call abyte\r
+ .endif\r
+\r
+       ;ld     bc,(zdbuf+16h)          ; uncompressed size, if success\r
+       ;pop    de\r
+       ;out0   (BBR),d\r
+ push iy\r
+ pop hl\r
+ ld de,outbuf\r
+ or a\r
+ sbc hl,de\r
+ call nz,oflsh ; leaves outptr/seg valid for possible checking by our caller\r
+\r
+ ld iy,gztbuf\r
+ ld b,8\r
+ call pread ; retrieve crc/size, our caller is responsible for checking them\r
+\r
+ ld hl,outseg\r
+ ld e,(hl)\r
+ ld hl,(outptr) ; so our caller can calculate the actual decompressed size\r
+ ret\r
+\r
+uzf2:\r
+ .if 0\r
+ ld a,'h'\r
+ call abyte\r
+ .endif\r
+\r
+       ld      a,e\r
+       or      a\r
+ .if 1\r
+ jp z,uzf0\r
+ .else\r
+       jr      z,uzf0                  ; new_table\r
+ .endif\r
+\r
+       ex      de,hl                   ; hl = basic length code\r
+\r
+       cp      9\r
+       jr      c,uzf4                  ; length 3-10 = hl+2, no extra bits\r
+       cp      1dh\r
+       jr      c,uzf3                  ; length 11-258, 1-5 extra bits\r
+\r
+       ld      hl,258                  ; length 258 = hl, no extra bits\r
+       jr      uzf5\r
+\r
+uzf3:  sub     5                       ; a = 4-17h extra bits/4\r
+       rrca\r
+       rrca\r
+       and     7\r
+       ld      b,a                     ; b = 1-5 extra bits\r
+\r
+       ld      a,l\r
+       dec     a                       ; no need to sub 5\r
+       and     3                       ; 4 possible lengths for current b\r
+       or      4\r
+       ld      l,a                     ; hl = 4-7 for algorithm\r
+\r
+       ld      a,b\r
+       add     hl,hl                   ; hl = base length, value 0-0e0h\r
+       djnz    $-1\r
+\r
+       ex      de,hl\r
+       call    bitsb                   ; hl = 1-5 extra bits, value 0-1fh\r
+       add     hl,de                   ; hl = 8-0ffh for lengths 11-258\r
+\r
+       inc     hl\r
+uzf4:  inc     hl\r
+       inc     hl\r
+uzf5:  push    hl\r
+ .if 0\r
+ ld a,'i'\r
+ call abyte\r
+ .endif\r
+\r
+       ld      hl,pdist                ; dist_parse_table\r
+       ld      de,ldist                ; dist_bitlen_table\r
+       call    parse                   ; returns de = item\r
+\r
+       ;ld     a,e\r
+ ex de,hl\r
+ ld a,l\r
+       cp      4\r
+       jr      c,uzf6                  ; de = distance 0-3, no extra bits\r
+\r
+       ;ex     de,hl                   ; hl = basic distance code\r
+\r
+       rrca\r
+       and     0fh\r
+       dec     a\r
+       ld      b,a                     ; b = 1-0bh extra bits\r
+\r
+       ld      a,l\r
+       and     1                       ; 2 possible distances for current b\r
+       or      2\r
+       ld      l,a                     ; hl = 2-3 for algorithm\r
+\r
+       ld      a,b\r
+       add     hl,hl                   ; hl = base distance, value 0-6000h\r
+       djnz    $-1\r
+\r
+       ex      de,hl\r
+       call    bitsw                   ; hl = 0-0bh extra bits, value 0-1fffh\r
+       add     hl,de                   ; de = distance 4-7fffh\r
+\r
+       ;ex     de,hl\r
+uzf6:  ;inc    de                      ; real distance\r
+ inc hl\r
+ push hl\r
+ .if 0\r
+ ld a,'j'\r
+ call abyte\r
+ .endif\r
+\r
+ push iy\r
+ pop hl\r
+ ld de,outbuf\r
+ sub a ;or a\r
+ sbc hl,de ; got anything in output buffer?\r
+ ld c,l\r
+ ld b,h ; zf, bc indicate how many bytes waiting\r
+\r
+ ld iy,outbuf-4000h\r
+ ld d,a ;ld d,0\r
+\r
+ ld hl,outseg\r
+ ld e,(hl)\r
+ ld hl,(outptr)\r
+\r
+ call nz,copyr ; flush anything still in output buffer\r
+ .if 0\r
+ ld a,'k'\r
+ call abyte\r
+ .endif\r
+\r
+       ;push   iy\r
+       ;pop    hl\r
+       ;push   hl\r
+       ;or     a\r
+       ;sbc    hl,de\r
+       ;pop    de\r
+       ;pop    bc\r
+       ;ldir\r
+       ;push   de\r
+       ;pop    iy\r
+ ; e:hl = output location\r
+ ; can't use outptr/seg until e:hl has been saved back\r
+ .if 0\r
+ ex (sp),hl\r
+ call ahexw\r
+ ex (sp),hl\r
+ ld a,','\r
+ call abyte\r
+ .endif\r
+ pop bc ; bc = distance code\r
+ push hl\r
+ or a\r
+ sbc hl,bc ; go backwards as specified by distance code\r
+ ex (sp),hl ; restore e:hl = output location\r
+ pop iy\r
+ ld a,e\r
+ sbc a,0\r
+ ld d,a ; d:iy = output location - distance code\r
+\r
+ .if 0\r
+ ex (sp),hl\r
+ call ahexw\r
+ ex (sp),hl\r
+ call acrlf\r
+ .endif\r
+ pop bc ; bc = length code\r
+ call copyr ; append bc bytes from d:iy to output buffer\r
+\r
+ ld (outptr),hl\r
+ ld hl,outseg\r
+ ld (hl),e\r
+\r
+ ld iy,outbuf ; restart output buffer\r
+\r
+ .if 0\r
+       ld      a,(zfprog)\r
+       or      a\r
+       jp      z,uzf1                  ; skip progress callouts if disabled\r
+\r
+       push    ix\r
+       pop     hl\r
+       in0     a,(BBR)\r
+       rlca\r
+       rlca\r
+       rlca\r
+       rlca\r
+       add     a,h                     ; minor absehl\r
+       call    uzprog                  ; a = index = source address / 100h\r
+ .endif\r
+       jp      uzf1\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+tbl:   ld      a,2\r
+       call    bits                    ; get_bits\r
+       dec     a                       ; 1 = default tables\r
+       jr      nz,tbldyn\r
+\r
+       ld      hl,llit                 ; lit_bitlen_table\r
+       ld      de,llit+1               ; lit_bitlen_table+1\r
+       ld      bc,90h\r
+       ld      (hl),8\r
+       ldir                            ; 90h * bit length 8\r
+       ld      c,70h\r
+       ld      (hl),9\r
+       ldir                            ; 70h * bit length 9\r
+       ld      c,18h\r
+       ld      (hl),7\r
+       ldir                            ; 18h * bit length 7\r
+       ld      c,8-1\r
+       ld      (hl),8                  ; 8 * bit length 8\r
+       ldir\r
+\r
+       ld      hl,ldist                ; dist_bitlen_table\r
+       ld      de,ldist+1\r
+       ld      bc,20h-1\r
+       ld      (hl),5\r
+       ldir                            ; 20h * bit length 5\r
+\r
+       ld      hl,120h\r
+       ld      (nlit),hl               ; num_lit_codes = 120h\r
+       dec     h\r
+       ld      (ndist),hl              ; num_dist_codes = 20h\r
+       jp      tblmak                  ; make_parse_tables\r
+\r
+tbldyn:        dec     a                       ; 2 = dynamic tables\r
+       ;ret    nz                      ; else bad table\r
+ jp nz,bad_block\r
+\r
+       ld      a,5\r
+       call    bitsb                   ; get_bits\r
+       ld      bc,101h\r
+       add     hl,bc\r
+       ld      (nlit),hl               ; num_lit_codes\r
+\r
+       ld      a,5\r
+       call    bitsb\r
+       inc     hl\r
+       ld      (ndist),hl              ; num_dist_codes\r
+\r
+       ld      hl,ltbl                 ; bitlen_bitlens\r
+       ld      bc,13h\r
+       call    zfill                   ; initialise bitlen bitlen table\r
+\r
+       ld      a,4\r
+       call    bits                    ; get_bits\r
+       add     a,4\r
+       ld      b,a                     ; count of bitlen bitlens\r
+       ld      de,lxlat                ; bitlen_order\r
+tbl0:  push    bc\r
+\r
+       ld      a,(de)\r
+       inc     de\r
+       ld      c,a\r
+       ld      b,0\r
+       ld      hl,ltbl                 ; bitlen_bitlens\r
+       add     hl,bc\r
+\r
+       ld      a,3\r
+       call    bits                    ; get_bits\r
+       ld      (hl),a\r
+\r
+       pop     bc\r
+       djnz    tbl0\r
+\r
+       ld      bc,13h\r
+       ld      de,ltbl                 ; bitlen_bitlens\r
+       ld      hl,ptbl                 ; bitlen_parse_table\r
+       call    make                    ; make_parse_table\r
+\r
+       ld      de,llit                 ; lit_bitlen_table\r
+       ld      hl,(nlit)               ; num_lit_codes\r
+       ld      bc,(ndist)              ; num_dist_codes\r
+       add     hl,bc\r
+       add     hl,de\r
+       ld      (lend),hl               ; termination loop counter\r
+tbl1:  ex      de,hl\r
+       push    hl\r
+\r
+       ld      hl,ptbl                 ; bitlen_parse_table\r
+       ld      de,ltbl                 ; bitlen_bitlens\r
+       call    parse\r
+\r
+       ld      a,e\r
+       cp      10h\r
+       jr      c,tbl5                  ; single bitlen\r
+       jr      z,tbl4                  ; 10h = repeated bitlen * 3-6\r
+       cp      11h\r
+       jr      z,tbl2                  ; 11h = repeated zeros * 3-10\r
+\r
+       ld      a,7                     ; 12h = repeated zeros * 11-138\r
+       call    bits                    ; get_bits\r
+       add     a,11\r
+       jr      tbl3\r
+\r
+tbl2:  ld      a,3                     ; 11h = repeated zeros * 3-10\r
+       call    bits                    ; get_bits\r
+       add     a,3\r
+tbl3:  ld      c,a\r
+\r
+       pop     hl\r
+       call    zfill\r
+       jr      tbl6\r
+\r
+tbl4:  ld      a,2                     ; 10h = repeated bitlen * 3-6\r
+       call    bits                    ; get_bits\r
+       add     a,3\r
+       ld      c,a\r
+\r
+       pop     hl\r
+       dec     hl\r
+       call    hlfill\r
+       jr      tbl6\r
+\r
+tbl5:  pop     hl\r
+       ld      (hl),e                  ; single bitlen\r
+\r
+tbl6:  inc     hl\r
+       ld      e,l\r
+       ld      d,h\r
+\r
+       ld      bc,(lend)               ; termination loop counter\r
+       or      a\r
+       sbc     hl,bc\r
+       jr      c,tbl1\r
+\r
+       ld      bc,(ndist)\r
+       ld      hl,ldist-1\r
+       add     hl,bc\r
+       ex      de,hl\r
+       ld      hl,(lend)\r
+       dec     hl\r
+       lddr                            ; move dist_bitlen_table to proper spot\r
+\r
+tblmak:        ld      bc,(nlit)               ; num_lit_codes\r
+       ld      de,llit                 ; lit_bitlen_table\r
+       ld      hl,plit                 ; lit_parse_table + lit_parse_tree\r
+       call    make                    ; make_parse_table\r
+\r
+       ld      bc,(ndist)              ; num_dist_codes\r
+       ld      de,ldist                ; dist_bitlen_table\r
+       ld      hl,pdist                ; dist_parse_table + dist_parse_tree\r
+       ;call   make\r
+       ;ret\r
+\r
+; call with:\r
+; bc = items\r
+; de -> bitlen table, 1 byte per item\r
+; hl -> parse table, 100h words\r
+; parse tree is at hl+200h\r
+\r
+make:  ld      a,c\r
+       or      b\r
+       ret     z\r
+\r
+       ld      (nmake),bc              ; count of items\r
+       ld      (lmake),de              ; pointer to bitlen table\r
+       ld      (pmake),hl              ; pointer to parse table + tree\r
+\r
+       ; scan entries counting each bit length 0-15 to lcount\r
+\r
+       ld      hl,lcount               ; bitlen_counts\r
+       ld      bc,10h*2\r
+       call    zfill\r
+\r
+       ld      de,(lmake)              ; pointer to bitlen table\r
+       ld      bc,(nmake)              ; count of items\r
+make0: push    bc\r
+\r
+       ld      a,(de)\r
+       inc     de\r
+\r
+       ld      c,a\r
+       ld      b,0\r
+       ld      hl,lcount               ; bitlen_counts\r
+       add     hl,bc\r
+       add     hl,bc\r
+       inc     (hl)\r
+       jr      nz,$+4\r
+       inc     hl\r
+       inc     (hl)\r
+\r
+       pop     bc\r
+       dec     bc\r
+       ld      a,c\r
+       or      b\r
+       jr      nz,make0\r
+\r
+       ; assign each bit length 1-15 a starting code to cmake\r
+\r
+       ld      de,0\r
+       ld      bc,2\r
+make1: push    bc\r
+\r
+       ld      hl,cmake                ; current_codes\r
+       add     hl,bc\r
+       ld      (hl),e\r
+       inc     hl\r
+       ld      (hl),d\r
+\r
+       ld      hl,lcount               ; bitlen_counts\r
+       add     hl,bc\r
+       ld      c,(hl)\r
+       inc     hl\r
+       ld      b,(hl)\r
+\r
+       ex      de,hl\r
+       add     hl,bc\r
+       add     hl,hl\r
+       ex      de,hl\r
+\r
+       pop     bc\r
+       inc     c\r
+       inc     c\r
+       ld      a,c\r
+       cp      20h\r
+       jr      c,make1\r
+\r
+       ld      a,e\r
+       or      d\r
+       jr      z,make15\r
+\r
+       ; table is not full, allowed if sum lcount <= 1\r
+\r
+       ld      hl,lcount+2             ; ignore bit length 0\r
+       ld      de,0\r
+       ld      a,15                    ; bit lengths 1-15\r
+make14:        ld      c,(hl)\r
+       inc     hl\r
+       ld      b,(hl)\r
+       inc     hl\r
+       ex      de,hl\r
+       add     hl,bc\r
+       ex      de,hl\r
+       dec     a\r
+       jr      nz,make14\r
+       ld      hl,1\r
+       or      a\r
+       sbc     hl,de\r
+       ;ret    c                       ; bad table if 1 < sum lcount\r
+ jp c,bad_table\r
+\r
+make15:        ; scan entries assigning codes to hmake from cmake\r
+\r
+       ld      de,(lmake)              ; pointer to bitlen table\r
+       ld      bc,(nmake)              ; count of items\r
+       ld      hl,hmake                ; huffman_table\r
+make2: push    bc\r
+\r
+       ld      a,(de)\r
+       inc     de\r
+       or      a\r
+       ld      bc,0\r
+       jr      z,make3\r
+\r
+       push    hl\r
+       ld      c,a\r
+       ld      hl,cmake                ; current_codes\r
+       add     hl,bc\r
+       add     hl,bc\r
+\r
+       ld      c,(hl)\r
+       inc     (hl)\r
+       inc     hl\r
+       ld      b,(hl)\r
+       jr      nz,$+3\r
+       inc     (hl)\r
+       pop     hl\r
+\r
+make3: ld      (hl),c\r
+       inc     hl\r
+       ld      (hl),b\r
+       inc     hl\r
+\r
+       pop     bc\r
+       dec     bc\r
+       ld      a,c\r
+       or      b\r
+       jr      nz,make2\r
+\r
+       ; scan entries bit reversing each code in hmake\r
+\r
+       ld      de,(lmake)              ; pointer to bitlen table\r
+       ld      bc,(nmake)              ; count of items\r
+       ld      hl,hmake                ; huffman_table\r
+make4: push    bc\r
+\r
+       ld      a,(de)\r
+       inc     de\r
+\r
+       push    de\r
+       push    hl\r
+\r
+       ld      e,(hl)\r
+       inc     hl\r
+       ld      d,(hl)\r
+\r
+       or      a\r
+       jr      z,make6\r
+\r
+       ld      hl,0\r
+       ld      b,a\r
+make5: rr      d\r
+       rr      e\r
+       adc     hl,hl\r
+       djnz    make5\r
+       ex      de,hl\r
+\r
+make6: pop     hl\r
+       ld      (hl),e\r
+       inc     hl\r
+       ld      (hl),d\r
+       inc     hl\r
+       pop     de\r
+\r
+       pop     bc\r
+       dec     bc\r
+       ld      a,c\r
+       or      b\r
+       jr      nz,make4\r
+\r
+       ; construct parse table and tree\r
+\r
+       ld      hl,(pmake)              ; pointer to parse table + tree\r
+       ld      bc,100h*2\r
+       call    zfill\r
+       inc     hl\r
+       ld      (trptr),hl              ; tree ptr\r
+\r
+       ld      de,0                    ; index to lmake\r
+make7: ld      hl,hmake\r
+       add     hl,de\r
+       add     hl,de\r
+       ld      c,(hl)\r
+       inc     hl\r
+       ld      b,(hl)\r
+\r
+       ld      hl,(lmake)              ; pointer to bitlen table\r
+       add     hl,de\r
+       ld      a,(hl)\r
+       or      a\r
+       jr      z,make13\r
+       cp      9\r
+       jr      nc,make10\r
+\r
+       ld      b,a\r
+       ld      hl,1\r
+make8: add     hl,hl\r
+       djnz    make8                   ; b = 0 for <= 8 bit huffman code\r
+       ld      (pinc),hl               ; parse table increment\r
+\r
+make9: ld      hl,(pmake)              ; pointer to parse table + tree\r
+       add     hl,bc\r
+       add     hl,bc                   ; huffman code\r
+\r
+       ld      (hl),e\r
+       inc     hl\r
+       ld      (hl),d\r
+\r
+       ld      hl,(pinc)               ; parse table increment\r
+       add     hl,bc\r
+       ld      c,l\r
+       ld      b,h\r
+\r
+       ld      a,b\r
+       or      a\r
+       jr      z,make9\r
+       jr      make13\r
+\r
+make10:        push    de\r
+       push    af\r
+\r
+       ld      a,b\r
+       ld      b,0\r
+       ld      hl,(pmake)              ; pointer to parse table + tree\r
+       add     hl,bc\r
+       add     hl,bc                   ; huffman code, lo 8 bits\r
+       ld      c,a                     ; huffman code, hi 8 bits\r
+\r
+       pop     af\r
+       sub     8\r
+       ld      b,a\r
+\r
+make11:        ld      e,(hl)\r
+       inc     hl\r
+       ld      d,(hl)\r
+\r
+       ld      a,e\r
+       or      d\r
+       jr      nz,make12               ; existing branch\r
+\r
+       ld      de,(trptr)              ; tree ptr\r
+       ld      (hl),d\r
+       dec     hl\r
+       ld      (hl),e\r
+\r
+       push    de\r
+;      rept    4\r
+;      ld      (de),a\r
+;      inc     de\r
+;      endm\r
+ ld (de),a\r
+ inc de\r
+ ld (de),a\r
+ inc de\r
+ ld (de),a\r
+ inc de\r
+ ld (de),a\r
+ inc de\r
+       ld      (trptr),de              ; tree ptr\r
+       pop     de\r
+\r
+make12:        ex      de,hl\r
+\r
+       rr      c\r
+       jr      nc,$+4\r
+       inc     hl\r
+       inc     hl\r
+\r
+       djnz    make11\r
+\r
+       pop     de\r
+       ld      (hl),e\r
+       inc     hl\r
+       ld      (hl),d\r
+\r
+make13:        inc     de\r
+\r
+       ld      hl,(nmake)\r
+       or      a\r
+       sbc     hl,de\r
+       jr      nz,make7\r
+\r
+       ret                             ; z for caller of tbl\r
+\r
+bad_block:\r
+       call    uzmess\r
+       db      'invalid table type',0dh,0ah,0\r
+       jp      bomb\r
+\r
+bad_table:\r
+       call    uzmess\r
+       db      'file has bad table',0dh,0ah,0\r
+       jp      bomb\r
+\r
+; -----------------------------------------------------------------------------\r
+; enter with:\r
+; a = bits to read (1-10h)\r
+\r
+; returns:\r
+; de = preserved\r
+; hl = value\r
+\r
+bitsw: cp      9\r
+       jr      c,bitsb\r
+\r
+       sub     8\r
+       ld      h,a                     ; h = eventual bits in h\r
+       call    peek\r
+ .if 0\r
+       inc     ix                      ; shortcut to flush 8 bits\r
+ .else\r
+       call    nxtix\r
+ .endif\r
+       ld      l,c                     ; l = bits 0-7 of result\r
+\r
+       ld      a,h\r
+       call    bits\r
+       ld      h,a                     ; h = bits 8-n of result\r
+       ret                             ; result in hl\r
+\r
+bitsb: call    bits\r
+       ld      l,a\r
+       ld      h,b                     ; 0\r
+       ret\r
+\r
+; enter with:\r
+; a = bits to read (1-8)\r
+\r
+; returns:\r
+; de = preserved\r
+; a = value\r
+\r
+bits:  push    hl\r
+       ld      l,a\r
+       call    peek\r
+       call    flush\r
+       ld      a,c\r
+       ld      c,l\r
+       ld      hl,bmask-1\r
+       add     hl,bc\r
+       and     (hl)\r
+       pop     hl\r
+       ret                             ; result in hl and a\r
+\r
+; -----------------------------------------------------------------------------\r
+; enter with:\r
+; hl -> parse table\r
+; de -> bitlen table\r
+\r
+; returns:\r
+; de = next item from input\r
+\r
+parse: call    peek                    ; a = index for parse table lookup\r
+       add     hl,bc\r
+       add     hl,bc\r
+       ld      a,(hl)\r
+       inc     hl\r
+       ld      h,(hl)\r
+       ld      l,a                     ; hl = parse table entry\r
+       ex      de,hl                   ; de = parse table entry, hl -> bitlens\r
+\r
+ .if 0\r
+       bit     4,d\r
+ .else\r
+       bit     7,d\r
+ .endif\r
+       jr      z,parse2                ; parse from table\r
+                                       ; parse from tree\r
+ .if 0\r
+       inc     ix                      ; shortcut to flush 8 bits\r
+ .else\r
+       call    nxtix\r
+ .endif\r
+       call    peek                    ; c = bit buffer for tree lookup\r
+\r
+       ld      a,(dbits)\r
+\r
+parse0:        rr      c\r
+       jr      nc,$+4\r
+       inc     de\r
+       inc     de\r
+\r
+       inc     a\r
+       cp      8                       ; dbits = 8?\r
+       jr      c,parse1                ; no, bit buffer ok\r
+\r
+ .if 0\r
+       inc     ix                      ; shortcut to flush 8 bits\r
+       ld      c,(ix)                  ; refresh bit buffer\r
+ .else\r
+       call    nxtix\r
+       ld      a,(dbuf)\r
+       ld      c,a\r
+ .endif\r
+\r
+       sub     a                       ; new byte, no dead bits\r
+\r
+parse1:        ex      de,hl\r
+       ld      e,(hl)\r
+       inc     hl\r
+       ld      d,(hl)\r
+\r
+ .if 0\r
+       bit     4,d\r
+ .else\r
+       bit     7,d\r
+ .endif\r
+       jr      nz,parse0\r
+\r
+       ld      (dbits),a\r
+       ret\r
+\r
+parse2:        add     hl,de\r
+       ld      l,(hl)                  ; l = bitlen table entry\r
+       ;call   flush\r
+       ;ret\r
+\r
+; enter with:\r
+; l = bits to kill\r
+; BBR:ix -> input data\r
+; dbuf = 8 bits from input\r
+; dbits = dead bits 0-7\r
+\r
+; returns:\r
+; bc = preserved\r
+; de = preserved\r
+; hl = preserved\r
+; BBR:ix = advanced\r
+; dbuf = updated\r
+; dbits = advanced\r
+\r
+flush: ld      a,(dbits)\r
+       add     a,l\r
+       ld      (dbits),a\r
+       sub     8\r
+       ret     c\r
+       ld      (dbits),a\r
+\r
+nxtix: ld      a,(ix)\r
+       ld      (dbuf),a\r
+       ;push   bc\r
+       ;ld     bc,1\r
+       ;add    ix,bc\r
+       ;pop    bc\r
+       ;ret    nc                      ; still in same window\r
+ inc ix\r
+ push ix\r
+ ex (sp),hl\r
+ bit 7,h\r
+ pop hl\r
+ ret z ; still in same window (ix < 8000h)\r
+\r
+ .if 0\r
+       ld      a,(zfprog)\r
+       or      a                       ; progress callouts enabled?\r
+       jr      z,skprog                ; skip if not\r
+\r
+       in0     a,(BBR)\r
+       push    af\r
+       push    bc\r
+       push    de\r
+       push    hl\r
+       push    iy\r
+\r
+       add     a,0fh+1\r
+       rlca\r
+       rlca\r
+       rlca\r
+       rlca                            ; convert window to segment\r
+       ld      h,a\r
+       ld      l,0                     ; absolute 0:hl -> new source data\r
+       call    uzprog                  ; call boot1\r
+\r
+       pop     iy\r
+       pop     hl\r
+       pop     de\r
+       pop     bc\r
+       pop     af\r
+       jr      dnprog\r
+ .endif\r
+\r
+skprog:        ;in0    a,(BBR)\r
+dnprog:        ;inc    a\r
+ push hl\r
+ ld hl,virtbr\r
+ inc (hl)\r
+ ld l,(hl)\r
+ ld h,80h\r
+ ld a,(hl) ; translate BBR value via virtual memory table for actual use\r
+ pop hl\r
+       out0    (BBR),a                 ; wrapped into new window\r
\r
+       ;ld     ix,0f000h               ; BBR:ix -> new source data\r
+ ld ix,4000h\r
+       ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+; enter with:\r
+; BBR:ix -> input data\r
+; dbuf = 8 bits from input\r
+; dbits = dead bits 0-7\r
+\r
+; returns:\r
+; bc = next 8 bits (b = 0)\r
+; de = preserved\r
+; hl = preserved\r
+\r
+peek:  ld      bc,(dbuf)               ; b = dbits\r
+       ld      a,b\r
+       or      a\r
+       ret     z\r
+       ld      a,(ix)\r
+peeklp:        rra\r
+       rr      c\r
+       djnz    peeklp\r
+       ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+zfill: sub     a\r
+afill: ld      (hl),a\r
+       dec     bc\r
+hlfill:        ld      e,l\r
+       ld      d,h\r
+       inc     de\r
+       ldir\r
+       ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+pread: ; plain_read\r
+       ld      hl,dbits\r
+       ld      a,(hl)                  ; see if we were already byte aligned\r
+       or      a\r
+       jr      z,preade\r
+       ld      (hl),0                  ; no, we need to flush up to 7 bits\r
+\r
+preadl:        call    nxtix                   ; refresh bit buffer, then advance ix\r
+preade:        ld      a,(dbuf)                ; enter here with a valid bit buffer\r
+\r
+       ld      (iy),a                  ; save in output (no shifting needed)\r
+       inc     iy\r
+\r
+       djnz    preadl                  ; copy up to 100h bytes\r
+       jp      nxtix                   ; refresh bit buffer for our caller\r
+\r
+oflsh: ; output_flush\r
+       ld      c,l\r
+       ld      b,h                     ; bc now = iy - outbuf (byte count)\r
+\r
+       ld      iy,outbuf-4000h         ; because IDATA0 is phys 4000, log 8000\r
+       ld      d,0\r
+\r
+       ld      hl,outseg\r
+       ld      e,(hl)\r
+       ld      hl,(outptr)\r
+\r
+       call    copyr                   ; flush output buffer to output\r
+\r
+       ld      (outptr),hl\r
+       ld      hl,outseg\r
+       ld      (hl),e\r
+\r
+       ld      iy,outbuf               ; restart output buffer\r
+       ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               rseg    IDATA0\r
+bmask:         defs    8\r
+               rseg    CDATA0\r
+               defb    1,3,7,0fh,1fh,3fh,7fh,0ffh\r
+\r
+               rseg    IDATA0\r
+lxlat:         defs    19\r
+               rseg    CDATA0\r
+               defb    16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+               rseg    UDATA0\r
+\r
+; tbl data\r
+\r
+nlit:          defs    2               ; num_lit_codes\r
+ndist:         defs    2               ; num_dist_codes\r
+lend:          defs    2               ; llit + nlit + ndist, loop terminator\r
+\r
+; make data\r
+\r
+nmake:         defs    2               ; count of items\r
+lmake:         defs    2               ; pointer to bitlen table\r
+pmake:         defs    2               ; pointer to parse table + tree\r
+trptr:         defs    2               ; tree ptr\r
+pinc:          defs    2               ; parse table increment\r
+\r
+; peek + flush data\r
+\r
+; retain ordering %\r
+dbuf:          defs    1\r
+dbits:         defs    1               ; dead bits in low dbuf\r
+; %\r
+\r
+; uzfile data\r
+\r
+lblock:                defs    1               ; last_block_flag\r
+\r
+virtbr:                defs    1               ; virtual base register before xlat\r
+gzhbuf:                defs    10              ; gzip header (no extra fields allowed)\r
+gztbuf:                defs    8               ; gzip trailer (crc-32, orig size-32)\r
+\r
+outptr:                defs    2               ; absolute output offset\r
+outseg:                defs    1               ; absolute output segment\r
+outbuf:                defs    103h            ; minimises the need to call copyr\r
+               ; outbuf should be 100h, but we allow an extra 3 bytes, due to\r
+               ; the main loop for decompressing non-repeated data, which is\r
+               ; unrolled 4 times (we test against outbuf+100h every 4 chars)\r
+\r
+; buffers\r
+\r
+ltbl:          defs    13h             ; bitlen_bitlens\r
+lcount:                defs    10h*2           ; bitlen_counts\r
+cmake:         defs    10h*2           ; current_codes\r
+hmake:         defs    120h*2          ; huffman_table\r
+\r
+; llit must be followed by ldist because we unpack lit bitlens and\r
+; dist bitlens together, then move dist bitlens to start at ldist\r
+\r
+; retain ordering %\r
+llit:          defs    120h            ; lit_bitlen_table\r
+ldist:         defs    20h             ; dist_bitlen_table\r
+; %\r
+\r
+ptbl:          defs    100h*2          ; bitlen_parse_table\r
+plit:          defs    (100h+240h)*2   ; lit_parse_table + lit_parse_tree\r
+pdist:         defs    (100h+40h)*2    ; dist_parse_table + dist_parse_tree\r
+\r
+;ztop:         defs    1               ; must be < 0e000h\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+\1a
\ No newline at end of file
diff --git a/src/gboot/uzmain.asm b/src/gboot/uzmain.asm
new file mode 100644 (file)
index 0000000..e5642f8
--- /dev/null
@@ -0,0 +1,233 @@
+; uzmain.asm by Nick, gunzipper, main program and error handling routines\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+$ io64180.inc\r
+\r
+BUFSIZE                equ     200h            ; how many bytes per disk block\r
+BUFSIZELOG     equ     9               ; shift count representing the above\r
+\r
+HD0_START      equ     512\r
+HD0_SIZE       equ     1536\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       module  _uzmain\r
+\r
+       public  init\r
+       public  bomb\r
+       public  uzmess\r
+       extern  abyte\r
+       extern  ahexb\r
+       extern  ahexw\r
+       extern  acrlf\r
+       extern  amess\r
+       extern  copyr\r
+       extern  uzfgo\r
+       extern  gztbuf\r
+       extern  zdata\r
+\r
+       extern  s_CODE\r
+       extern  e_CODE\r
+\r
+       rseg    ICODE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+init::\r
+; now there are the next stack structure:\r
+;      +4 envp\r
+;      +2 argv\r
+; sp-> +0 argc\r
+\r
+       call    uzmess\r
+       defb    'unzipping root filesystem',0dh,0ah,0\r
+\r
+       ld      hl,0\r
+       ld      iy,LWRD zdata\r
+       defb    11h ; ld de,\r
+       defb    4 ; e:hl -> destination, absolute 4:0000 (CP/M A: and B:)\r
+       defb    BYTE3 zdata ; d:iy -> source, virtual zdata (gzipped input)\r
+\r
+       call    uzfgo                   ; we return here only if successful\r
+\r
+       ld      a,e\r
+       sub     4\r
+       ld      e,a\r
+       ld      d,0                     ; de:hl = 32-bit actual size unpacked\r
+ .if 0\r
+ push hl\r
+ ex de,hl\r
+ call ahexw\r
+ ex de,hl\r
+ call ahexw\r
+ ld a,' '\r
+ call abyte\r
+ ld hl,(gztbuf+6)\r
+ call ahexw\r
+ ld hl,(gztbuf+4)\r
+ call ahexw\r
+ call acrlf\r
+ pop hl\r
+ .endif\r
+\r
+       ld      bc,(gztbuf+4)\r
+       or      a\r
+       sbc     hl,bc\r
+       jr      nz,bad_size             ; check low order 16 bits of size\r
+\r
+       ld      hl,(gztbuf+6)\r
+       ;or     a\r
+       sbc     hl,de\r
+       jr      nz,bad_size             ; check high order 16 bits of size\r
+\r
+ .if 0 ; intentionally corrupt inode 20 so that fsck won't run\r
+ jr poox\r
+poo:\r
+ defw 0c1h\r
+ defw 0c0h\r
+poox:\r
+ ld iy,poo-4000h\r
+ ld hl,0f18h\r
+ ld de,4\r
+ ld bc,poox-poo\r
+ call copyr\r
+ .endif\r
+\r
+ .if 0 ; check for accidental corruption of inode 18\r
+ ; dump block 7\r
+ ld a,40h-4\r
+ out0 (BBR),a\r
+ ld hl,4e00h\r
+ ld c,20h\r
+dline:\r
+ ld b,10h\r
+ditem:\r
+ ld a,(hl)\r
+ inc hl\r
+ call ahexb\r
+ ld a,' '\r
+ call abyte\r
+ djnz ditem\r
+ call acrlf\r
+ dec c\r
+ jr nz,dline\r
+ .endif\r
+\r
+       call    uzmess\r
+       defb    'starting kernel via reboot',0dh,0ah,0\r
+\r
+       ld      hl,0\r
+       ; wait for last character to be sent @ 9600\r
+reboot_delay:\r
+       dec     hl\r
+       ld      a,l\r
+       or      h\r
+       jr      nz,reboot_delay\r
+\r
+       jr      success                 ; reboot and run ramdrive boot sector\r
+\r
+bad_size:\r
+       call    uzmess\r
+       db      'bad uncompressed size',0dh,0ah,0\r
+       ;jr     bomb\r
+\r
+bomb::\r
+       ; try not to surprise the user unnecessarily\r
+       call    uzmess\r
+       defb    'doing a clean boot',0dh,0ah,0\r
+\r
+       ; before rebooting, prepare to clobber CP/M drive A: directory\r
+       ld      hl,block\r
+       ld      de,block+1\r
+       ld      bc,BUFSIZE-1\r
+       ld      (hl),0aah               ; clobbering pattern\r
+       ldir                            ; initialise temporary buffer\r
+\r
+       ; perform the clobbering (this ensures a clean boot from EPROM)\r
+ .if 1\r
+       ld      de,0\r
+       ld      b,4\r
+clobber_loop:\r
+       push    bc\r
+       push    de\r
+\r
+       ld      hl,block\r
+       call    block_write\r
+\r
+       pop     de\r
+       pop     bc\r
+       inc     de\r
+       djnz    clobber_loop\r
+ .else\r
+       ld      de,304h\r
+       ld      l,c\r
+       ld      h,b ; ld hl,0           ; e:hl -> destination 4:0000\r
+\r
+       ld      b,4                     ; clobber until just before 4:0800\r
+clobber_loop:\r
+       push    bc\r
+\r
+       ld      iy,block                ; copy from d:iy -> destination\r
+       ld      bc,BUFSIZE              ; bytes to copy\r
+       call    copyr                   ; copy them, one byte at a time\r
+\r
+       pop     bc\r
+       djnz    clobber_loop\r
+ .endif\r
+\r
+success:\r
+       ; ready to reboot, by instructing the WPO chip on motherboard\r
+       ld      a,0aah\r
+       out0    (TRDR),A                ; command byte to reboot the system\r
+       ld      a,13h\r
+       out0    (CNTR),A                ; TE=1, divisor = 3, start transmission\r
+\r
+       ; wait for the reboot to occur, or else we're rather stuck\r
+       jr      $\r
+\r
+block_write:\r
+       push    hl\r
+       call    block_xlate             ; a:hl -> data in ramdrive\r
+\r
+       pop     iy\r
+       ld      d,3                     ; d:iy -> user's buffer in seg 3:\r
+\r
+       ld      e,a                     ; e:hl -> data in ramdrive\r
+       jp      copyr                   ; copy BUFSIZE bytes from d:iy to e:hl\r
+\r
+block_xlate:\r
+       ;ld     hl,HD0_SIZE\r
+       ;scf\r
+       ;sbc    hl,de                   ; check whether block no is in range\r
+       ;jr     c,bad_block\r
+\r
+       ld      bc,BUFSIZE              ; bytes to be copied for 1 block\r
+\r
+       ld      hl,HD0_START\r
+       add     hl,de                   ; hl = block index (from start of ram)\r
+\r
+       ld      a,h\r
+       ld      h,l\r
+       ld      l,c ;0                  ; a:hl = block index * 100h\r
+\r
+       add     hl,hl\r
+       adc     a,a                     ; a:hl = block index * BUFSIZE (200h!!)\r
+       ret\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+uzmess::\r
+       call    amess\r
+       defb    'uzboot: ',0\r
+       jp      amess\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       rseg    UDATA0\r
+\r
+block: defs    BUFSIZE                 ; temporary buffer for clobbering disc\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       END\r
diff --git a/src/gui/0000.scr b/src/gui/0000.scr
new file mode 100644 (file)
index 0000000..cea4476
Binary files /dev/null and b/src/gui/0000.scr differ
diff --git a/src/gui/0001.scr b/src/gui/0001.scr
new file mode 100644 (file)
index 0000000..a9efc69
Binary files /dev/null and b/src/gui/0001.scr differ
diff --git a/src/gui/0001.tmp b/src/gui/0001.tmp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/gui/0002.scr b/src/gui/0002.scr
new file mode 100644 (file)
index 0000000..bb846ee
Binary files /dev/null and b/src/gui/0002.scr differ
diff --git a/src/gui/0003.scr b/src/gui/0003.scr
new file mode 100644 (file)
index 0000000..43d8958
Binary files /dev/null and b/src/gui/0003.scr differ
diff --git a/src/gui/0004.scr b/src/gui/0004.scr
new file mode 100644 (file)
index 0000000..3f812b1
Binary files /dev/null and b/src/gui/0004.scr differ
diff --git a/src/gui/Copy (2) of wnd.c b/src/gui/Copy (2) of wnd.c
new file mode 100644 (file)
index 0000000..da57793
--- /dev/null
@@ -0,0 +1,1138 @@
+/************************************************\r
+ * Graphical User Interface driver (GUI)        *\r
+ * By J.W. Morsink for Retail Vision B.V.       *\r
+ ************************************************/\r
+\r
+#include <wnd.h>\r
+#include "..\libc\malloc-l.h"\r
+#undef NULL\r
+#define NULL   0\r
+\r
+/*void *malloc(size_t size)\r
+  {\r
+  void *ptr;\r
+\r
+  ptr = (void *)sbrk(size);\r
+  return (ptr == (void *)-1) ? NULL : ptr;\r
+  }\r
+\r
+void free(void *ptr)\r
+  {\r
+  }\r
+\r
+*/\r
+#define JOOST_DEBUG\r
+/*#define STR_DEBUG*/\r
+/*#define MALLOC_DEBUG\r
+\r
+/************************************************\r
+ * Global variables for GUI                     *\r
+ ************************************************/\r
+\r
+struct Global_GUI* global;\r
+\r
+/************************************************\r
+ * Graphics                                     *\r
+ ************************************************/\r
+\r
+void GraphicsOpen(){\r
+       struct sgttyb temp;\r
+       char init[]={0x1B,'K'};\r
+\r
+       global->lcd=open("/dev/lcd0",O_RDWR);\r
+       gtty(global->lcd,&temp);\r
+       temp.sg_flags=RAW | UNBUFF;\r
+       stty(global->lcd,&temp);\r
+\r
+       write(global->lcd,init,2);\r
+}\r
+\r
+void GraphicsClose(){\r
+       close(global->lcd);\r
+}\r
+\r
+void Move(int x, int y){\r
+       unsigned char cmd[]={0x1B,'S',0,0};\r
+       cmd[2]=(unsigned char) (x);\r
+       cmd[3]=(unsigned char) (y);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void ClearRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'C',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void DrawRectNC(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'N',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void FillRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'R',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void FillRectNC(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'F',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void GrayRect(int sx,int sy){\r
+       unsigned char cmd[]={0x1B,'h',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void Text(char *s){\r
+       int c=strlen(s);\r
+       write(global->lcd,s,c);\r
+}\r
+\r
+void TouchRegion(int msg, int x, int y, int sx, int sy){\r
+       char touch[]={0x1B,'Z',0,0,0,0,0};\r
+       touch[2]=(unsigned char) (msg);\r
+       touch[3]=(unsigned char) (x);\r
+       touch[4]=(unsigned char) (y);\r
+       touch[5]=(unsigned char) (sx);\r
+       touch[6]=(unsigned char) (sy);\r
+       write(global->lcd,touch,7);\r
+#ifdef JOOST_DEBUG\r
+       printf("Touch: %x,%x,%x,%x,%x\n",msg,x,y,sx,sy); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void ClearScreen(){\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       TouchRegion(0,0,0,0,0x80);\r
+}\r
+\r
+void EnableScreen(unsigned char c){\r
+       char cmd[]={0x1B,'E',0};\r
+       cmd[2]=c;\r
+       write(global->lcd,cmd,3);\r
+}\r
+\r
+void grSetFont(int f){\r
+       char cmd[]={0x1B,0};\r
+       cmd[1]=f & 0xff;\r
+       write(global->lcd,cmd,2);\r
+}\r
+\r
+/************************************************\r
+ * Fonts                                        *\r
+ ************************************************/\r
+\r
+struct Font* fontSearch(int f){\r
+       struct Font* current=global->firstfont;\r
+       while(current!=NULL && current->id!=f)\r
+               current=current->nextfont;\r
+       return current;\r
+}\r
+\r
+void setCurrentFont(int f){\r
+       if(fontSearch(f)!=NULL){\r
+               grSetFont(f);\r
+               global->currentfont=fontSearch(f);\r
+       }\r
+}\r
+\r
+void loadFont(int id,int (*sw)(char*),int (*sh)(char*),int sizedata, void* data){\r
+       struct Font* font=(struct Font*) malloc(sizeof(struct Font));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",font); fflush(stdout);\r
+#endif\r
+       font->id=id;\r
+       font->stringwidth=sw;\r
+       font->stringheight=sh;\r
+       font->nextfont=NULL;\r
+       font->sizefontdata=sizedata;\r
+       font->fontdata=data;\r
+       if(global->firstfont==NULL){\r
+               global->firstfont=font;\r
+               global->currentfont=font;\r
+       }\r
+       else\r
+       {\r
+               struct Font* current=global->firstfont;\r
+               while(current->nextfont!=NULL)\r
+                       current=current->nextfont;\r
+               current->nextfont=font;\r
+       }\r
+}\r
+\r
+int stringwidth(char *str,int extra){\r
+       int w=0,i=0;\r
+       while(str[i]!=0x00){\r
+               switch(str[i]){\r
+               case 'i':\r
+               case 'I':\r
+               case '!':\r
+                       w+=2;\r
+                       break;\r
+               case 'l':\r
+                       w+=3;\r
+                       break;\r
+               case ',':\r
+               case '1':\r
+               case '.':\r
+                       w+=4;\r
+                       break;\r
+               case 'r':\r
+               case 'k':\r
+               case 'j':\r
+                       w+=5;\r
+                       break;\r
+               default:\r
+                       w+=6;\r
+               }\r
+               i++;\r
+               w+=extra;\r
+       }\r
+       return w;\r
+}\r
+\r
+int stringheight(char ch, int extra){\r
+       if(ch<0x80) return 7+extra;\r
+       if(ch>=0xcc && ch<=0xdf) return 1+extra;\r
+}\r
+\r
+int stringheight01(char* ch){\r
+       return stringheight(ch[0],0);\r
+}\r
+\r
+int stringheight2(char* ch){\r
+       return stringheight(ch[0],5);\r
+}\r
+\r
+int stringwidth0(char *str){\r
+       return stringwidth(str,0);\r
+}\r
+\r
+int stringwidth1(char *str){\r
+       return stringwidth(str,2);\r
+}\r
+\r
+int stringwidth2(char *str){\r
+       return stringwidth(str,3);\r
+}\r
+/************************************************\r
+ * Components                                   *\r
+ ************************************************/\r
+\r
+struct Component* Component_new(int x,int y,int sx,int sy){\r
+       struct Component* this=(struct Component*) (malloc(sizeof(struct Component)));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",this); fflush(stdout);\r
+#endif\r
+\r
+       this->id=(++global->id);\r
+       this->x=x;\r
+       this->y=y;\r
+       this->sizex=sx;\r
+       this->sizey=sy;\r
+       this->state=0;\r
+       this->order=0;\r
+       this->font=0;\r
+       this->msg=0;\r
+       this->parent=NULL;\r
+       this->next_sibling=NULL;\r
+       this->first_child=NULL;\r
+       this->handler=NULL;\r
+       this->paint=NULL;\r
+       this->add=NULL;\r
+       this->sizexds=0;\r
+       this->xds=NULL;\r
+       this->label=NULL;\r
+       this->label2=NULL;\r
+       return this;\r
+}\r
+\r
+void Component_setlabel(struct Component* this, char* s){\r
+       int i=0;\r
+       while(s[i]!=0 && i<LABEL_LENGTH){\r
+               this->label[i]=s[i];\r
+               i++;\r
+       }\r
+       this->label[i]=0;\r
+}\r
+\r
+void Component_add(struct Component* this, struct Component* comp){\r
+       struct Component* current=this->first_child;\r
+       if(this->first_child==NULL){\r
+               this->first_child=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       else\r
+       {\r
+               while(current->next_sibling!=NULL){\r
+                       current=current->next_sibling;\r
+               }\r
+               current->next_sibling=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       comp->parent=this;\r
+}\r
+\r
+void Component_paint(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       EnableScreen(0);\r
+       while(current!=NULL){\r
+               current->paint(current);\r
+               current=current->next_sibling;\r
+       }\r
+       EnableScreen(1);\r
+}\r
+\r
+void Component_findXY(struct Component* this, int* x, int* y){\r
+    struct Component* current=this;\r
+    do{\r
+        *x+=current->x;\r
+        *y+=current->y;\r
+        current=current->parent;\r
+    } while(current!=NULL);\r
+}\r
+\r
+struct Component* Component_find(struct Component* this, int msg){\r
+       struct Component* current=this->first_child;\r
+#ifdef JOOST_DEBUG\r
+       printf("Find %x in %x:\n",msg, this->id); fflush(stdout);\r
+#endif\r
+       while(current!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Comp_find: %x, %x\n",msg, current->msg); fflush(stdout);\r
+#endif\r
+               if(current->msg==msg)\r
+                       return current;\r
+               current=current->next_sibling;\r
+       }\r
+       return NULL;\r
+}\r
+\r
+struct Component* Component_delete(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       int id=this->id;\r
+       if(this!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleting component: %d\n",id); fflush(stdout);\r
+#endif\r
+               while(current!=NULL){\r
+                       current=Component_delete(current);\r
+               }\r
+               if(this->parent!=NULL){\r
+                       if(this==this->parent->first_child)\r
+                               this->parent->first_child=this->parent->first_child->next_sibling;\r
+                       else{\r
+                               current=this->parent->first_child;\r
+                               while(this!=current->next_sibling && current->next_sibling!=NULL)\r
+                                       current=current->next_sibling;\r
+                               if(current->next_sibling!=NULL)\r
+                                       current->next_sibling=current->next_sibling->next_sibling;\r
+                       }\r
+               }       \r
+               current=this->next_sibling;\r
+               if(this->sizexds==sizeof(struct StringTableXDS))\r
+               {\r
+                       struct Component* par=this->parent;\r
+                       struct StringTableXDS* stx=(struct StringTableXDS*) this->xds;\r
+                       \r
+#ifdef STR_DEBUG\r
+                       printf("Stringtable @ %x freed!\n",stx->stringtabledata); fflush(stdout);\r
+#endif\r
+\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",stx->stringtabledata); fflush(stdout);\r
+#endif\r
+                       free(stx->stringtabledata);\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",stx->stringtable); fflush(stdout);\r
+#endif\r
+                       free(stx->stringtable);\r
+\r
+                       while((par!=NULL) && (par->sizexds!=sizeof(struct StringTableXDS)))\r
+                               par=par->parent;\r
+                       if(par!=NULL)\r
+                       {\r
+                               stx=(struct StringTableXDS*) par->xds;\r
+                               global->stringtabledata=stx->stringtabledata;\r
+                               global->stringtable=stx->stringtable;\r
+                       }               \r
+               }\r
+               if(this->sizexds>0){\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",this->xds); fflush(stdout);\r
+#endif\r
+                       free(this->xds);\r
+               }\r
+               if((this->state & STRING_FROMTABLE)==0  && this->label!=NULL){\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",this->label); fflush(stdout);\r
+#endif\r
+                       free(this->label);\r
+               }\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",this); fflush(stdout);\r
+#endif\r
+\r
+               free(this);\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleted component: %d\n",id); fflush(stdout);\r
+#endif\r
+       }\r
+       return current;\r
+}\r
+\r
+void Component_delete_children(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL)\r
+               current=Component_delete(current);\r
+}\r
+\r
+void Component_changestate_children(struct Component* this, int andmask, int ormask, int xormask){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL){\r
+               current->state&=(0xffff-andmask);\r
+               current->state|=ormask;\r
+               current->state^=xormask;\r
+               current=current->next_sibling;\r
+       }\r
+       fflush(stdout);\r
+}\r
+\r
+void Component_linkstringtable(struct Component* this){\r
+       struct Component* child=this->first_child;\r
+#ifdef STR_DEBUG\r
+       printf("%d: %x -> %x\n",this->id,this->label-1,global->stringtable[(int) (this->label)-1]); fflush(stdout);\r
+#endif\r
+       if(((int)(this->label))<0x1000 && ((int)(this->label))>0)\r
+               this->label=global->stringtable[(int) (this->label)-1];\r
+       if(((int)(this->label2))<0x1000 && ((int)(this->label2))>0)\r
+               this->label2=global->stringtable[(int) (this->label2)-1];\r
+       while(child!=NULL){\r
+               Component_linkstringtable(child);\r
+               child=child->next_sibling;\r
+       }\r
+\r
+}\r
+\r
+/************************************************\r
+ * Windows                                      *\r
+ ************************************************/\r
+\r
+void Window_handler (struct Component* this, int msg, int param){\r
+       struct Component* current,current2;\r
+       int x=0,y=0;\r
+#ifdef JOOST_DEBUG\r
+       printf("Message in window %d, Msg: %x, Param: %x\n",this->id,msg,param); fflush(stdout);\r
+#endif\r
+       switch(msg){\r
+       case KEY_PRESSED:\r
+               current=this->first_child;\r
+               while(current!=NULL) {\r
+                       if((current->state & STATE_VISIBLE)==(STATE_VISIBLE))\r
+                               current->handler(current,msg,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       case KEY_RELEASED:\r
+               current=this->first_child;\r
+               while(current!=NULL) {\r
+                       if((current->state & STATE_VISIBLE)==(STATE_VISIBLE))\r
+                               current->handler(current,msg,param);\r
+                       current->handler(current,KEY_TYPED,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       case KEY_TYPED:\r
+               current=this->first_child;\r
+               while(current!=NULL) {\r
+                       if((current->state & STATE_VISIBLE)==(STATE_VISIBLE)){\r
+                               current->handler(current,msg,param);\r
+                               if((current->state & STATE_ACTION)!=0 && current->msg==param){\r
+                                       struct ActionXDS* act=(struct ActionXDS*) (current->xds);\r
+#ifdef JOOST_DEBUG\r
+                                       printf("Before actionhandler...\n");\r
+#endif\r
+                                       act->actionhandler(current);\r
+                                       if((act->action & 0xff00)==0){                                          \r
+                                               current=NULL;\r
+                                       }\r
+#ifdef JOOST_DEBUG\r
+                                       printf("After actionhandler...\n");\r
+#endif\r
+                               }\r
+                       }\r
+                       if(current!=NULL)\r
+                               current=current->next_sibling;\r
+               }\r
+               break;\r
+       case WND_REDRAW:\r
+               this->paint(this);\r
+               break;\r
+       case WND_CLOSE:\r
+               this->state=this->state & (0xffff-(STATE_VISIBLE | STATE_ENABLED));\r
+               Component_findXY(this,&x,&y);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               this->parent->handler(this->parent,WND_REDRAW,0);\r
+               break;\r
+       case WND_DESTROY:\r
+               current=this->parent;\r
+               Component_delete(this);\r
+               current->handler(current,WND_REDRAW,0);\r
+               break;\r
+       case WND_BROADCAST:\r
+               current=this->first_child;\r
+               while(current!=NULL){\r
+                       if(current!=(struct Component*) (param) && (current->state & STATE_FOCUS)!=0)\r
+                               current->handler(current,CMP_BROADCAST,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       case APP_QUIT:\r
+               if(this->parent==NULL)\r
+                       global->willquit=1;\r
+               else if((this->state & STATE_APPLICATION)==0)\r
+                       this->parent->handler(this->parent,APP_QUIT,param);\r
+               else{\r
+                       current=this->parent;\r
+                       current->state|=STATE_VISIBLE | STATE_ENABLED;\r
+                       Component_changestate_children(current,0,STATE_VISIBLE,0);\r
+                       this->handler(this,WND_DESTROY,0);\r
+               }\r
+               break;                  \r
+       }\r
+}\r
+\r
+void Window_paint(struct Component* this){\r
+       int x=0,y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               \r
+               EnableScreen(0);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               Move(x,y+global->currentfont->stringheight(this->label)+4);\r
+               DrawRectNC(this->sizex,this->sizey-global->currentfont->stringheight(this->label)-4);\r
+               Move(x,y);\r
+               FillRect(this->sizex,global->currentfont->stringheight(this->label)+5);\r
+               Move(x+2,y+2);\r
+               Text(this->label);\r
+               Component_paint(this);\r
+       }\r
+}\r
+\r
+void Root_paint(struct Component* this){\r
+       EnableScreen(0);\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       GrayRect(0,0x80);\r
+       TouchRegion(0,0,0,0,0x80);\r
+\r
+       Component_paint(this);  \r
+/*     EnableScreen(0);\r
+       Window_paint(this);\r
+       EnableScreen(1);*/\r
+}\r
+\r
+void Window_add(struct Component* this, struct Component* comp){\r
+       Component_add(this,comp);\r
+}\r
+\r
+struct Component* Window_new(int x,int y,int sx,int sy){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->handler=Window_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Buttons                                      *\r
+ ************************************************/\r
+\r
+void Button_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void Button_drawtext(struct Component* this, int x, int y){\r
+       if((this->state & STYLE_MULTILINE)!=0){         \r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label))/2,y+(this->sizey-2*global->currentfont->stringheight(this->label))/2);\r
+               Text(this->label);\r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label2))/2,y+(this->sizey)/2+1);\r
+               Text(this->label2);\r
+       } else {\r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label))/2,y+(this->sizey-global->currentfont->stringheight(this->label))/2+1);\r
+               Text(this->label);\r
+       }               \r
+#ifdef STR_DEBUG\r
+       printf("Drawtext (%d): ""%s"" @ %x\n",this->id,this->label,this->label); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void Button_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               \r
+               if( (this->state & (STATE_ENABLED | STYLE_INVERTED))!=0 && (this->state & (STATE_ENABLED | STYLE_INVERTED))!=(STATE_ENABLED | STYLE_INVERTED) )\r
+                       FillRectNC(this->sizex,this->sizey);\r
+               else\r
+                       DrawRectNC(this->sizex,this->sizey);\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+void Button_add(struct Component* this, struct Component* comp){\r
+       return;\r
+}\r
+\r
+struct Component* Button_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_ENABLED | STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Button_handler;\r
+       this->paint=Button_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+/*void Numpad(struct Component* this, int x, int y){\r
+       int i;\r
+       char s[2]={0,0};\r
+       struct Component* button;\r
+       for(i=0; i<9; i++){\r
+               s[0]=0x31+(char) i;\r
+               button=Button_new(x+(i%3)*0x18,y+0x30-(i/3)*0x18,0x16,0x16,i+0x31);\r
+               Component_setlabel(button,s);\r
+               button->state|=STATE_CASTING;\r
+               this->add(this,button);\r
+       }\r
+       button=Button_new(x+0x18,y+0x48,0x16,0x16,0x30);\r
+       Component_setlabel(button,"0");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+\r
+       button=Button_new(x+0x30,y+0x48,0x16,0x16,0x08);\r
+       Component_setlabel(button,"CE");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+}*/\r
+\r
+/************************************************\r
+ * Toggle-buttons                               *\r
+ ************************************************/\r
+\r
+void ToggleButton_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->state^=STATE_CHECKED;\r
+               this->parent->handler(this->parent, CMP_STATECHANGE, param);\r
+               this->handler(this, WND_REDRAW, 0);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void ToggleButton_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               if((this->state & STATE_ENABLED)!=0 && (this->state & STATE_CHECKED)!=0){\r
+                       FillRectNC(this->sizex,this->sizey);\r
+                       TouchRegion(this->msg,x,y,this->sizex,this->sizey);\r
+               }else{\r
+                       DrawRectNC(this->sizex,this->sizey);\r
+                       TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               }\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+struct Component* ToggleButton_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_ENABLED | STATE_VISIBLE | STATE_CHECKED;\r
+       this->msg=msg;\r
+       this->handler=ToggleButton_handler;\r
+       this->paint=ToggleButton_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Dialogs                                      *\r
+ ************************************************/\r
+\r
+void Dialog_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==CMP_ACTION && param==0xff){\r
+               if((this->state & STYLE_SELFDESTRUCT)!=0)\r
+                       this->handler(this,WND_DESTROY,0);\r
+               else\r
+                       this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_OK, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION && param==0xfe){\r
+               if((this->state & STYLE_SELFDESTRUCT)!=0)\r
+                       this->handler(this,WND_DESTROY,0);\r
+               else\r
+                       this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_CANCEL, this->msg);\r
+\r
+       }\r
+}\r
+\r
+struct Component* Dialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* ok;\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Dialog_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+\r
+       ok=Button_new(sx-0x30,sy-0x1c,0x28,0x14,0xff);\r
+       ok->label=(char*) malloc(3);\r
+       Component_setlabel(ok,"OK");\r
+       this->add(this,ok);\r
+\r
+       ok=Button_new(sx-0x30,sy-0x38,0x28,0x14,0xfe);  /*Cancel*/\r
+       ok->label=(char*) malloc(7);\r
+       Component_setlabel(ok,"Cancel");\r
+       this->add(this,ok);\r
+\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Displays                                     *\r
+ ************************************************/\r
+void Display_handler(struct Component* this, int msg, int param){\r
+       Button_handler(this,msg,param);\r
+       if(msg==CMP_BROADCAST && (this->state & STATE_FOCUS)!=0){\r
+#ifdef JOOST_DEBUG\r
+               printf("strlen = %d->",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               if(param==0x08){\r
+                       if(strlen(this->label)!=0)\r
+                               this->label[strlen(this->label)-1]=0;\r
+               }else{\r
+                       this->label[strlen(this->label)+1]=0;\r
+                       this->label[strlen(this->label)]=(char) param;\r
+               }       \r
+#ifdef JOOST_DEBUG\r
+               printf("%d\n",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+}\r
+\r
+void Display_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       char pwd[64];\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               \r
+               if( (this->state & STYLE_INVERTED)==0)\r
+                       FillRectNC(this->sizex,this->sizey);\r
+               else\r
+                       DrawRectNC(this->sizex,this->sizey);\r
+               Move(x+2,y+(this->sizey-global->currentfont->stringheight(this->label))/2);\r
+               if(this->state & STYLE_PASSWORD){\r
+                       int i;\r
+                       for(i=0; i<strlen(this->label); i++)\r
+                               pwd[i]='*';\r
+                       pwd[i]=0;\r
+                       Text(pwd);\r
+               }else\r
+                       Text(this->label);\r
+\r
+/*             Component_findXY(this,&x,&y);\r
+\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+       \r
+               FillRectNC(this->sizex,this->sizey);\r
+               Move(x+2,y+(this->sizey-global->currentfont->stringheight(this->label))/2);\r
+               Text(this->label);\r
+               TouchRegion((this->state&STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+*/\r
+       }\r
+}\r
+\r
+struct Component* Display_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Button_new(x,y,sx,sy,msg);\r
+       this->state|=STATE_FOCUS;\r
+       Component_setlabel(this,"");\r
+       this->paint=Display_paint;\r
+       this->handler=Display_handler;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Labels                                       *\r
+ ************************************************/\r
+void Label_handler(struct Component* this, int msg, int param){\r
+       return;\r
+}\r
+\r
+void Label_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+struct Component* Label_new(int x, int y, int sx, int sy,char* l){\r
+       struct Component* comp=Component_new(x,y,sx,sy);\r
+       comp->label=l;\r
+       comp->state=STATE_VISIBLE;\r
+       comp->handler=Label_handler;\r
+       comp->paint=Label_paint;\r
+       comp->add=Button_add;\r
+       return comp;\r
+}\r
+ /************************************************\r
+ * Implementation                               *\r
+ ************************************************/\r
+/*\r
+void ScreenDialog_handler(struct Component* this, int msg, int param){\r
+       char cmd[]={0x1B,'V',0};\r
+       Dialog_handler(this,msg,param);\r
+       if(msg==CMP_ACTION){\r
+               if(param=='U')\r
+                       cmd[2]=0;\r
+               else if(param=='D')\r
+                       cmd[2]=1;\r
+               else \r
+                       return;\r
+               write(global->lcd,cmd,3);\r
+       }\r
+}\r
+\r
+struct Component* ScreenDialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* button;\r
+       struct Component* this=Dialog_new(x,y,sx,sy,msg);\r
+       \r
+       button=Button_new(0x04,0x10,0x20,0x14,'U');\r
+       Component_setlabel(button,"Up");\r
+       this->add(this,button);\r
+\r
+       button=Button_new(0x04,0x28,0x20,0x14,'D');\r
+       Component_setlabel(button,"Down");\r
+       this->add(this,button);\r
+\r
+       this->handler=ScreenDialog_handler;\r
+\r
+       return this;\r
+}\r
+*/\r
+void rootWindow_handler(struct Component* this, int msg, int param){\r
+       struct Component* dummy;\r
+       Window_handler(this,msg,param);\r
+}\r
+\r
+\r
+void screenbuilder(struct Component* root, char* filename){\r
+       struct Component* subw;\r
+       struct ActionXDS* action;\r
+       int mode;               \r
+       int fh,rd;\r
+       char buf[SIZE_SCRBLD_RECORD];\r
+       long l;\r
+       int xs,ys;\r
+       xs=0x2b;\r
+       ys=0x1a;\r
+       buf[0]=0;\r
+       fh=open(filename,O_RDONLY);\r
+       do{     \r
+               char comp=0;\r
+               if(buf[0]=='s'){                /* Change size */\r
+                       xs=*((int*)(buf+0x1));\r
+                       ys=*((int*)(buf+0x3));\r
+               }\r
+\r
+               if(buf[0]=='B' || buf[0]=='M'){         /* Button, Multi-line button */\r
+                       subw=Button_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       if(buf[0]=='M') subw->state|=STYLE_MULTILINE;\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='T'){                                        /* Toggle-button */\r
+                       subw=ToggleButton_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='D'){                                        /* Display button */\r
+                       subw=Display_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='L'){                                        /* Label */\r
+                       subw=Label_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf+0x12);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='A'){                        \r
+                       struct ActionXDS a;\r
+                       root->xds=&a;\r
+                       a.action=*((int*)(buf+0x6));\r
+                       a.wParam=*((int*)(buf+0x8));\r
+                       a.lParam=*((long*)(buf+0xa));\r
+                       root_actionhandler(root);\r
+               }\r
+                               \r
+               if(buf[0]=='S'){\r
+                       struct StringTableXDS* stx;\r
+                       read_stringtable(fh,buf);\r
+                       root->xds=(void*) malloc(sizeof(struct StringTableXDS));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",root->xds); fflush(stdout);\r
+#endif\r
+\r
+                       stx=(struct StringTableXDS*) root->xds;\r
+                       root->sizexds=sizeof(struct StringTableXDS);\r
+                       stx->stringtable=global->stringtable;\r
+                       stx->stringtabledata=global->stringtabledata;\r
+#ifdef STR_DEBUG\r
+                       printf("Stringtable created @ %x\n",stx->stringtabledata); fflush(stdout);\r
+#endif\r
+                       comp=0;\r
+               }\r
+               if(comp!=0){\r
+                       if((buf[6] | buf[7])!=0){\r
+                               subw->state|=STATE_ACTION;\r
+                               subw->sizexds=sizeof(struct ActionXDS);\r
+                               subw->xds=(void*) malloc(sizeof(struct ActionXDS));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc Action: %x\n",subw->xds); fflush(stdout);\r
+#endif\r
+\r
+                               action=(struct ActionXDS*) (subw->xds);\r
+                               action->actionhandler=root_actionhandler;\r
+                               action->action=*((int*)(buf+0x6));\r
+                               action->wParam=*((int*)(buf+0x8));\r
+                               action->lParam=*((long*)(buf+0xa));\r
+                       }\r
+                       if((buf[0x0e] | buf[0x0f])!=0) \r
+                               subw->state=*((int*)(buf+0x0e));\r
+                       subw->font=*((int*)(buf+0x10));\r
+\r
+                       subw->label=(char*) (*((int*) (buf+0x12)) & 0x0fff);\r
+                       if(subw->label==NULL) {\r
+                               subw->label=(char*) malloc(LABEL_LENGTH);\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",subw->label); fflush(stdout);\r
+#endif\r
+                               subw->label[0]=0;\r
+                       }\r
+                       else\r
+                               subw->state|=STRING_FROMTABLE;\r
+\r
+                       if((*((int*) (buf+0x12)) &0xf000)>0x1000)\r
+                               subw->label2=(char*)((*((int*) (buf+0x12)) & 0x0fff)+1);\r
+\r
+                       root->add(root,subw);\r
+               }\r
+               \r
+               rd=read(fh,buf,SIZE_SCRBLD_RECORD);\r
+       } while(rd==SIZE_SCRBLD_RECORD);\r
+       close(fh);\r
+       Component_linkstringtable(root);\r
+       root->paint(root);\r
+}\r
+\r
+void root_actionhandler(struct Component* this){\r
+       struct ActionXDS *act;\r
+       struct Component* subw;\r
+       char filename[]={'0','0','0','0','.','s','c','r',0};\r
+\r
+       act=(struct ActionXDS*) (this->xds);\r
+#ifdef JOOST_DEBUG\r
+       printf("0x%x: (0x%x, 0x%x, 0x%lx)",act, act->action, act->wParam, act->lParam);\r
+#endif\r
+       if(act->action==0x0001){                        /*QUIT*/\r
+               this->handler(this,APP_QUIT,0);\r
+       }\r
+       if((act->action & 0xfffe)==0x0002){             /*Open Screen*/\r
+               Component_changestate_children(this->parent,STATE_VISIBLE,0,0);         \r
+               subw=Window_new(0,0,this->parent->sizex,this->parent->sizey);\r
+               subw->state=STATE_VISIBLE | STATE_ENABLED;\r
+               if((act->action & 1)!=0)\r
+                       subw->state|=STATE_APPLICATION;\r
+               subw->handler=rootWindow_handler;\r
+               subw->paint=Root_paint;\r
+               filename[0]=(char) ((act->lParam) &0xff);\r
+               filename[1]=(char) ((act->lParam>>8) &0xff);\r
+               filename[2]=(char) ((act->lParam>>16) &0xff);\r
+               filename[3]=(char) ((act->lParam>>24) &0xff);\r
+               screenbuilder(subw,filename);\r
+               this->parent->add(this->parent,subw);\r
+       }\r
+       if(act->action==0x0004) {                               /* Open MessageBox */\r
+               /*Component_changestate_children(this->parent,0,0,0);*/\r
+               struct Component* label;\r
+               int i;\r
+               subw=Dialog_new(0x05,0x05,this->parent->sizex-0x0a,this->parent->sizey-0x0a,1);\r
+               subw->state=STATE_VISIBLE | STATE_ENABLED | STYLE_SELFDESTRUCT;\r
+               subw->font=0x0030;\r
+               for(i=0; i<(act->wParam>>12)&0x0f; i++){\r
+                       label=Label_new(0x08,0x14+i*0x0c,(subw->sizex & 0xff)-0x10,0x10,global->stringtable[(act->wParam&0xfff)+i-1]);\r
+                       label->font=0x0030;\r
+                       subw->add(subw,label);\r
+               }\r
+               Component_setlabel(subw,"Message Box");\r
+               Component_find(subw,0xff)->font=0x0030;\r
+               Component_delete(Component_find(subw,0xfe));\r
+               this->parent->add(this->parent,subw);\r
+               this->parent->handler(this->parent,WND_REDRAW,0);\r
+       }\r
+#ifdef JOOST_DEBUG\r
+       printf("Before external handler...\n"); fflush(stdout);\r
+#endif\r
+       if(global->actionhandler!=NULL)\r
+               global->actionhandler(this);\r
+\r
+#ifdef JOOST_DEBUG\r
+       printf("After external handler...\n"); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void read_stringtable(int fh,char* buf){\r
+       int siz,bsiz;\r
+       int i=0,j=0;\r
+       char **ptrs;\r
+       char *rawdata;\r
+\r
+       siz=*((int*) (buf+0x01));\r
+       bsiz=*((int*) (buf+0x03));\r
+#ifdef STR_DEBUG\r
+       printf("%d %d\n",siz,bsiz);\r
+#endif\r
+\r
+       ptrs=(char**) malloc(sizeof(char*)*siz);\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",ptrs); fflush(stdout);\r
+#endif\r
+\r
+       rawdata=(char*) malloc(bsiz);\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",rawdata); fflush(stdout);\r
+#endif\r
+\r
+       read(fh,rawdata,bsiz);\r
+       while(i<bsiz && j<siz){\r
+               ptrs[j++]=&(rawdata[i]);\r
+               while(rawdata[i]!=0x00)\r
+                       i++;\r
+               rawdata[i++]=0x00;\r
+       }\r
+       if(j<siz)\r
+               ptrs[j]=&(rawdata[i]);\r
+       global->stringtabledata=rawdata;\r
+       global->stringtable=ptrs;\r
+#ifdef STR_DEBUG\r
+       for(i=0; i<siz; i++)\r
+               printf("%d: %x->""%s""\n",i,global->stringtable[i],global->stringtable[i]);\r
+       fflush(stdout);\r
+#endif\r
+\r
+}\r
+\r
+struct Global_GUI* gui_globals(){\r
+       return global;\r
+}\r
+\r
+\r
+void GUIinit(void){\r
+       global=(struct Global_GUI*) malloc(sizeof(struct Global_GUI));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",global); fflush(stdout);\r
+#endif\r
+\r
+       global->id=0;\r
+       global->willquit=0;\r
+       global->currentfont=NULL;\r
+       global->firstfont=NULL;\r
+       global->stringtable=NULL;\r
+       global->stringtabledata=NULL;\r
+       global->actionhandler=NULL;\r
+       GraphicsOpen();\r
+       loadFont(0x0030,stringwidth0,stringheight01,0,NULL);\r
+       loadFont(0x0031,stringwidth1,stringheight01,0,NULL);\r
+       loadFont(0x0032,stringwidth2,stringheight2,0,NULL);\r
+       global->root=Window_new(0x0,0x0,0x00,0x80);\r
+       global->root->state=STATE_VISIBLE;\r
+       global->root->handler=rootWindow_handler;\r
+       global->root->paint=Root_paint;\r
+}\r
+\r
+void GUIunit(void){\r
+       Component_delete(global->root);\r
+       ClearScreen();\r
+       GraphicsClose();\r
+}\r
+\r
+void GUIgo(char* scr){\r
+       char buf,obuf;\r
+       screenbuilder(global->root,scr);\r
+\r
+       while(read(global->lcd,&buf,1)==1);\r
+\r
+       while(!global->willquit){\r
+               if(read(global->lcd,&buf,1)==1){\r
+                       if(buf!=0)\r
+                               global->root->handler(global->root,KEY_PRESSED,buf);            \r
+                       else\r
+                               global->root->handler(global->root,KEY_RELEASED,obuf);\r
+                       obuf=buf;\r
+               }\r
+       }\r
+}\r
+\r
+/*void main(void){\r
+       GUIinit();\r
+       GUIgo();\r
+       GUIunit();\r
+}*/\r
+\r
diff --git a/src/gui/Copy of wnd.c b/src/gui/Copy of wnd.c
new file mode 100644 (file)
index 0000000..d239770
--- /dev/null
@@ -0,0 +1,941 @@
+/************************************************\r
+ * Graphical User Interface driver (GUI)        *\r
+ * By J.W. Morsink for Retail Vision B.V.       *\r
+ ************************************************/\r
+\r
+#include <wnd.h>\r
+\r
+#define JOOST_DEBUG\r
+\r
+/************************************************\r
+ * Global variables for GUI                     *\r
+ ************************************************/\r
+struct Global_GUI {\r
+       int id;\r
+       int lcd;\r
+       int willquit;\r
+       char *stringtabledata;\r
+       char **stringtable;\r
+       struct Font* currentfont;\r
+       struct Font* firstfont;\r
+       struct Component* root;\r
+};\r
+\r
+struct Global_GUI* global;\r
+\r
+/************************************************\r
+ * Graphics                                     *\r
+ ************************************************/\r
+\r
+void GraphicsOpen(){\r
+       struct sgttyb temp;\r
+       char init[]={0x1B,'K'};\r
+\r
+       global->lcd=open("/dev/lcd0",O_RDWR);\r
+       gtty(global->lcd,&temp);\r
+       temp.sg_flags=RAW | UNBUFF;\r
+       stty(global->lcd,&temp);\r
+\r
+       write(global->lcd,init,2);\r
+}\r
+\r
+void GraphicsClose(){\r
+       close(global->lcd);\r
+}\r
+\r
+void Move(int x, int y){\r
+       unsigned char cmd[]={0x1B,'S',0,0};\r
+       cmd[2]=(unsigned char) (x);\r
+       cmd[3]=(unsigned char) (y);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void ClearRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'C',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void DrawRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'N',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void FillRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'R',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void FillRectNC(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'F',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void Text(char *s){\r
+       int c=strlen(s);\r
+       write(global->lcd,s,c);\r
+}\r
+\r
+void TouchRegion(int msg, int x, int y, int sx, int sy){\r
+       char touch[]={0x1B,'Z',0,0,0,0,0};\r
+       touch[2]=(unsigned char) (msg);\r
+       touch[3]=(unsigned char) (x);\r
+       touch[4]=(unsigned char) (y);\r
+       touch[5]=(unsigned char) (sx);\r
+       touch[6]=(unsigned char) (sy);\r
+       write(global->lcd,touch,7);\r
+#ifdef JOOST_DEBUG\r
+       printf("Touch: %x,%x,%x,%x,%x\n",msg,x,y,sx,sy); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void ClearScreen(){\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       TouchRegion(0,0,0,0,0x80);\r
+}\r
+\r
+void EnableScreen(unsigned char c){\r
+       char cmd[]={0x1B,'E',0};\r
+       cmd[2]=c;\r
+       write(global->lcd,cmd,3);\r
+}\r
+\r
+void grSetFont(int f){\r
+       char cmd[]={0x1B,0};\r
+       cmd[1]=f & 0xff;\r
+       write(global->lcd,cmd,2);\r
+}\r
+\r
+/************************************************\r
+ * Fonts                                        *\r
+ ************************************************/\r
+\r
+struct Font* fontSearch(int f){\r
+       struct Font* current=global->firstfont;\r
+       while(current!=NULL && current->id!=f)\r
+               current=current->nextfont;\r
+       return current;\r
+}\r
+\r
+void setCurrentFont(int f){\r
+       if(fontSearch(f)!=NULL){\r
+               grSetFont(f);\r
+               global->currentfont=fontSearch(f);\r
+       }\r
+}\r
+\r
+void loadFont(int id,int (*sw)(char*),int (*sh)(char*),int sizedata, void* data){\r
+       struct Font* font=(struct Font*) malloc(sizeof(struct Font));\r
+       font->id=id;\r
+       font->stringwidth=sw;\r
+       font->stringheight=sh;\r
+       font->nextfont=NULL;\r
+       font->sizefontdata=sizedata;\r
+       font->fontdata=data;\r
+       if(global->firstfont==NULL){\r
+               global->firstfont=font;\r
+               global->currentfont=font;\r
+       }\r
+       else\r
+       {\r
+               struct Font* current=global->firstfont;\r
+               while(current->nextfont!=NULL)\r
+                       current=current->nextfont;\r
+               current->nextfont=font;\r
+       }\r
+}\r
+\r
+int stringwidth(char *str,int extra){\r
+       int w=0,i=0;\r
+       while(str[i]!=0x00){\r
+               switch(str[i]){\r
+               case 'i':\r
+               case 'I':\r
+               case '!':\r
+                       w+=2;\r
+                       break;\r
+               case 'l':\r
+                       w+=3;\r
+                       break;\r
+               case ',':\r
+               case '1':\r
+               case '.':\r
+                       w+=4;\r
+                       break;\r
+               case 'r':\r
+               case 'k':\r
+               case 'j':\r
+                       w+=5;\r
+                       break;\r
+               default:\r
+                       w+=6;\r
+               }\r
+               i++;\r
+               w+=extra;\r
+       }\r
+       return w;\r
+}\r
+\r
+int stringheight(char ch, int extra){\r
+       if(ch<0x80) return 7+extra;\r
+       if(ch>=0xcc && ch<=0xdf) return 1+extra;\r
+}\r
+\r
+int stringheight01(char* ch){\r
+       return stringheight(ch[0],0);\r
+}\r
+\r
+int stringheight2(char* ch){\r
+       return stringheight(ch[0],5);\r
+}\r
+\r
+int stringwidth0(char *str){\r
+       return stringwidth(str,0);\r
+}\r
+\r
+int stringwidth1(char *str){\r
+       return stringwidth(str,2);\r
+}\r
+\r
+int stringwidth2(char *str){\r
+       return stringwidth(str,3);\r
+}\r
+/************************************************\r
+ * Components                                   *\r
+ ************************************************/\r
+\r
+struct Component* Component_new(int x,int y,int sx,int sy){\r
+       struct Component* this=(struct Component*) (malloc(sizeof(struct Component)));\r
+       this->id=(++global->id);\r
+       this->x=x;\r
+       this->y=y;\r
+       this->sizex=sx;\r
+       this->sizey=sy;\r
+       this->state=0;\r
+       this->order=0;\r
+       this->font=0;\r
+       this->msg=0;\r
+       this->parent=NULL;\r
+       this->next_sibling=NULL;\r
+       this->first_child=NULL;\r
+       this->handler=NULL;\r
+       this->paint=NULL;\r
+       this->add=NULL;\r
+       this->sizexds=0;\r
+       this->xds=NULL;\r
+       this->label[0]=0;\r
+       this->label[LABEL_LENGTH]=0;\r
+       return this;\r
+}\r
+\r
+void Component_setlabel(struct Component* this, char* s){\r
+       int i=0;\r
+       while(s[i]!=0 && i<LABEL_LENGTH){\r
+               this->label[i]=s[i];\r
+               i++;\r
+       }\r
+       this->label[i]=0;\r
+}\r
+\r
+void Component_add(struct Component* this, struct Component* comp){\r
+       struct Component* current=this->first_child;\r
+       if(this->first_child==NULL){\r
+               this->first_child=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       else\r
+       {\r
+               while(current->next_sibling!=NULL){\r
+                       current=current->next_sibling;\r
+               }\r
+               current->next_sibling=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       comp->parent=this;\r
+}\r
+\r
+void Component_paint(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL){\r
+               current->paint(current);\r
+               current=current->next_sibling;\r
+       }\r
+}\r
+\r
+void Component_findXY(struct Component* this, int* x, int* y){\r
+    struct Component* current=this;\r
+    do{\r
+        *x+=current->x;\r
+        *y+=current->y;\r
+        current=current->parent;\r
+    } while(current!=NULL);\r
+}\r
+\r
+struct Component* Component_find(struct Component* this, int msg){\r
+       struct Component* current=this->first_child;\r
+#ifdef JOOST_DEBUG\r
+       printf("Find %x in %x:\n",msg, this->id); fflush(stdout);\r
+#endif\r
+       while(current!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Comp_find: %x, %x\n",msg, current->msg); fflush(stdout);\r
+#endif\r
+               if(current->msg==msg)\r
+                       return current;\r
+               current=current->next_sibling;\r
+       }\r
+       return NULL;\r
+}\r
+\r
+struct Component* Component_delete(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       int id=this->id;\r
+       if(this!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleting component: %d\n",id); fflush(stdout);\r
+#endif\r
+               while(current!=NULL){\r
+                       current=Component_delete(current);\r
+               }\r
+               if(this->parent!=NULL){\r
+                       if(this==this->parent->first_child)\r
+                               this->parent->first_child=this->parent->first_child->next_sibling;\r
+                       else{\r
+                               current=this->parent->first_child;\r
+                               while(this!=current->next_sibling && current->next_sibling!=NULL)\r
+                                       current=current->next_sibling;\r
+                               if(current->next_sibling!=NULL)\r
+                                       current->next_sibling=current->next_sibling->next_sibling;\r
+                       }\r
+               }       \r
+               current=this->next_sibling;\r
+               if(this->sizexds>0)\r
+                       free(this->xds);\r
+               free(this);\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleted component: %d\n",id); fflush(stdout);\r
+#endif\r
+       }\r
+       return current;\r
+}\r
+\r
+void Component_delete_children(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL)\r
+               current=Component_delete(current);\r
+}\r
+\r
+void Component_changestate_children(struct Component* this, int andmask, int ormask, int xormask){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL){\r
+               current->state&=(0xffff-andmask);\r
+               current->state|=ormask;\r
+               current->state^=xormask;\r
+               current=current->next_sibling;\r
+       }\r
+       fflush(stdout);\r
+}\r
+\r
+/************************************************\r
+ * Windows                                      *\r
+ ************************************************/\r
+\r
+void Window_handler (struct Component* this, int msg, int param){\r
+       struct Component* current,current2;\r
+       int x=0,y=0;\r
+#ifdef JOOST_DEBUG\r
+       printf("Message in window %d, Msg: %x, Param: %x\n",this->id,msg,param); fflush(stdout);\r
+#endif\r
+       switch(msg){\r
+       case KEY_TYPED:\r
+               current=this->first_child;\r
+               while(current!=NULL) {\r
+                       if((current->state & STATE_VISIBLE)==(STATE_VISIBLE)){\r
+                               current->handler(current,msg,param);\r
+                               if((current->state & STATE_ACTION)!=0 && current->msg==param){\r
+                                       struct ActionXDS* act=(struct ActionXDS*) (current->xds);\r
+#ifdef JOOST_DEBUG\r
+                                       printf("Before actionhandler...\n");\r
+#endif\r
+                                       act->actionhandler(current);\r
+                                       if((act->action & 0xff00)==0){                                          \r
+                                               current=NULL;\r
+                                       }\r
+#ifdef JOOST_DEBUG\r
+                                       printf("After actionhandler...\n");\r
+#endif\r
+                               }\r
+                       }\r
+                       if(current!=NULL)\r
+                               current=current->next_sibling;\r
+               }\r
+               break;\r
+       case WND_REDRAW:\r
+               this->paint(this);\r
+               break;\r
+       case WND_CLOSE:\r
+               this->state=this->state & (0xffff-(STATE_VISIBLE | STATE_ENABLED));\r
+               Component_findXY(this,&x,&y);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               this->parent->handler(this->parent,WND_REDRAW,0);\r
+               break;\r
+       case WND_DESTROY:\r
+               current=this->parent;\r
+               Component_delete(this);\r
+               current->handler(current,WND_REDRAW,0);\r
+               break;\r
+       case WND_BROADCAST:\r
+               current=this->first_child;\r
+               while(current!=NULL){\r
+                       if(current!=(struct Component*) (param) && (current->state & STATE_FOCUS)!=0)\r
+                               current->handler(current,CMP_BROADCAST,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       case APP_QUIT:\r
+               if(this->parent==NULL)\r
+                       global->willquit=1;\r
+               else if((this->state & STATE_APPLICATION)==0)\r
+                       this->parent->handler(this->parent,APP_QUIT,param);\r
+               else{\r
+                       current=this->parent;\r
+                       current->state|=STATE_VISIBLE | STATE_ENABLED;\r
+                       Component_changestate_children(current,0,STATE_VISIBLE,0);\r
+                       this->handler(this,WND_DESTROY,0);\r
+               }\r
+               break;                  \r
+       }\r
+}\r
+\r
+void Window_paint(struct Component* this){\r
+       int x=0,y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               Move(x,y+global->currentfont->stringheight(this->label)+4);\r
+               DrawRect(this->sizex,this->sizey-global->currentfont->stringheight(this->label)-4);\r
+               Move(x,y);\r
+               FillRect(this->sizex,global->currentfont->stringheight(this->label)+5);\r
+               Move(x+2,y+2);\r
+               Text(this->label);\r
+               Component_paint(this);\r
+       }\r
+}\r
+\r
+void Root_paint(struct Component* this){\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       TouchRegion(0,0,0,0,0x80);\r
+\r
+       Component_paint(this);  \r
+/*     EnableScreen(0);\r
+       Window_paint(this);\r
+       EnableScreen(1);*/\r
+}\r
+\r
+void Window_add(struct Component* this, struct Component* comp){\r
+       Component_add(this,comp);\r
+}\r
+\r
+struct Component* Window_new(int x,int y,int sx,int sy){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->handler=Window_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Buttons                                      *\r
+ ************************************************/\r
+\r
+void Button_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void Button_drawtext(struct Component* this, int x, int y){\r
+       if((this->state & STYLE_MULTILINE)!=0){         \r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label))/2,y+(this->sizey-2*global->currentfont->stringheight(this->label))/2);\r
+               Text(this->label);\r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label+LABEL_LENGTH/2))/2,y+(this->sizey)/2+1);\r
+               Text((this->label)+0x0a);\r
+       } else {\r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label))/2,y+(this->sizey-global->currentfont->stringheight(this->label))/2+1);\r
+               Text(this->label);\r
+       }               \r
+}\r
+\r
+void Button_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               \r
+               if( (this->state & (STATE_ENABLED | STYLE_INVERTED))!=0 && (this->state & (STATE_ENABLED | STYLE_INVERTED))!=(STATE_ENABLED | STYLE_INVERTED) )\r
+                       FillRectNC(this->sizex,this->sizey);\r
+               else\r
+                       DrawRect(this->sizex,this->sizey);\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+void Button_add(struct Component* this, struct Component* comp){\r
+       return;\r
+}\r
+\r
+struct Component* Button_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_ENABLED | STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Button_handler;\r
+       this->paint=Button_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+void Numpad(struct Component* this, int x, int y){\r
+       int i;\r
+       char s[2]={0,0};\r
+       struct Component* button;\r
+       for(i=0; i<9; i++){\r
+               s[0]=0x31+(char) i;\r
+               button=Button_new(x+(i%3)*0x18,y+0x30-(i/3)*0x18,0x16,0x16,i+0x31);\r
+               Component_setlabel(button,s);\r
+               button->state|=STATE_CASTING;\r
+               this->add(this,button);\r
+       }\r
+       button=Button_new(x+0x18,y+0x48,0x16,0x16,0x30);\r
+       Component_setlabel(button,"0");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+\r
+       button=Button_new(x+0x30,y+0x48,0x16,0x16,0x08);\r
+       Component_setlabel(button,"CE");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+}\r
+\r
+/************************************************\r
+ * Toggle-buttons                               *\r
+ ************************************************/\r
+\r
+void ToggleButton_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->state^=STATE_CHECKED;\r
+               this->parent->handler(this->parent, CMP_STATECHANGE, param);\r
+               this->handler(this, WND_REDRAW, 0);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void ToggleButton_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               if((this->state & STATE_ENABLED)!=0 && (this->state & STATE_CHECKED)!=0){\r
+                       FillRectNC(this->sizex,this->sizey);\r
+                       TouchRegion(this->msg,x,y,this->sizex,this->sizey);\r
+               }else{\r
+                       DrawRect(this->sizex,this->sizey);\r
+                       TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               }\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+struct Component* ToggleButton_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_ENABLED | STATE_VISIBLE | STATE_CHECKED;\r
+       this->msg=msg;\r
+       this->handler=ToggleButton_handler;\r
+       this->paint=ToggleButton_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Dialogs                                      *\r
+ ************************************************/\r
+\r
+void Dialog_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==CMP_ACTION && param==0xff){\r
+               if((this->state & STYLE_SELFDESTRUCT)!=0)\r
+                       this->handler(this,WND_DESTROY,0);\r
+               else\r
+                       this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_OK, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION && param==0xfe){\r
+               if((this->state & STYLE_SELFDESTRUCT)!=0)\r
+                       this->handler(this,WND_DESTROY,0);\r
+               else\r
+                       this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_CANCEL, this->msg);\r
+\r
+       }\r
+}\r
+\r
+struct Component* Dialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* ok;\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Dialog_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+\r
+       ok=Button_new(sx-0x30,sy-0x1c,0x28,0x14,0xff);\r
+       Component_setlabel(ok,"OK");\r
+       this->add(this,ok);\r
+\r
+       ok=Button_new(sx-0x30,sy-0x38,0x28,0x14,0xfe);  /*Cancel*/\r
+       Component_setlabel(ok,"Cancel");\r
+       this->add(this,ok);\r
+\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Displays                                     *\r
+ ************************************************/\r
+void Display_handler(struct Component* this, int msg, int param){\r
+       Button_handler(this,msg,param);\r
+       if(msg==CMP_BROADCAST && (this->state & STATE_FOCUS)!=0){\r
+#ifdef JOOST_DEBUG\r
+               printf("strlen = %d->",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               if(param==0x08){\r
+                       if(strlen(this->label)!=0)\r
+                               this->label[strlen(this->label)-1]=0;\r
+               }else{\r
+                       this->label[strlen(this->label)+1]=0;\r
+                       this->label[strlen(this->label)]=(char) param;\r
+               }       \r
+#ifdef JOOST_DEBUG\r
+               printf("%d\n",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+}\r
+\r
+void Display_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               \r
+               if( (this->state & STYLE_INVERTED)==0)\r
+                       FillRectNC(this->sizex,this->sizey);\r
+               else\r
+                       DrawRect(this->sizex,this->sizey);\r
+               Move(x+2,y+(this->sizey-global->currentfont->stringheight(this->label))/2);\r
+               Text(this->label);\r
+\r
+/*             Component_findXY(this,&x,&y);\r
+\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+       \r
+               FillRectNC(this->sizex,this->sizey);\r
+               Move(x+2,y+(this->sizey-global->currentfont->stringheight(this->label))/2);\r
+               Text(this->label);\r
+               TouchRegion((this->state&STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+*/\r
+       }\r
+}\r
+\r
+struct Component* Display_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Button_new(x,y,sx,sy,msg);\r
+       this->state|=STATE_FOCUS;\r
+       Component_setlabel(this,"");\r
+       this->paint=Display_paint;\r
+       this->handler=Display_handler;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Labels                                       *\r
+ ************************************************/\r
+void Label_handler(struct Component* this, int msg, int param){\r
+       return;\r
+}\r
+\r
+void Label_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+struct Component* Label_new(int x, int y, int sx, int sy,char* l){\r
+       struct Component* comp=Component_new(x,y,sx,sy);\r
+       Component_setlabel(comp,l);\r
+       comp->state=STATE_VISIBLE;\r
+       comp->handler=Label_handler;\r
+       comp->paint=Label_paint;\r
+       comp->add=Button_add;\r
+       return comp;\r
+}\r
+/************************************************\r
+ * Implementation                               *\r
+ ************************************************/\r
+/*\r
+void ScreenDialog_handler(struct Component* this, int msg, int param){\r
+       char cmd[]={0x1B,'V',0};\r
+       Dialog_handler(this,msg,param);\r
+       if(msg==CMP_ACTION){\r
+               if(param=='U')\r
+                       cmd[2]=0;\r
+               else if(param=='D')\r
+                       cmd[2]=1;\r
+               else \r
+                       return;\r
+               write(global->lcd,cmd,3);\r
+       }\r
+}\r
+\r
+struct Component* ScreenDialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* button;\r
+       struct Component* this=Dialog_new(x,y,sx,sy,msg);\r
+       \r
+       button=Button_new(0x04,0x10,0x20,0x14,'U');\r
+       Component_setlabel(button,"Up");\r
+       this->add(this,button);\r
+\r
+       button=Button_new(0x04,0x28,0x20,0x14,'D');\r
+       Component_setlabel(button,"Down");\r
+       this->add(this,button);\r
+\r
+       this->handler=ScreenDialog_handler;\r
+\r
+       return this;\r
+}\r
+*/\r
+void rootWindow_handler(struct Component* this, int msg, int param){\r
+       struct Component* dummy;\r
+       Window_handler(this,msg,param);\r
+}\r
+\r
+\r
+void screenbuilder(struct Component* root, char* filename){\r
+       struct Component* subw;\r
+       struct ActionXDS* action;\r
+       int mode;               \r
+       int fh,rd;\r
+       char buf[SIZE_SCRBLD_RECORD];\r
+       long l;\r
+       int xs,ys;\r
+       xs=0x2b;\r
+       ys=0x1a;\r
+       buf[0]=0;\r
+       fh=open(filename,O_RDONLY);\r
+       do{     \r
+               char comp=0;\r
+               if(buf[0]=='s'){                /* Change size */\r
+                       xs=*((int*)(buf+0x1));\r
+                       ys=*((int*)(buf+0x3));\r
+               }\r
+\r
+               if(buf[0]=='B' || buf[0]=='M'){         /* Button, Multi-line button */\r
+                       subw=Button_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       if(buf[0]=='M') subw->state|=STYLE_MULTILINE;\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='T'){                                        /* Toggle-button */\r
+                       subw=ToggleButton_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='D'){                                        /* Display button */\r
+                       subw=Display_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='L'){                                        /* Label */\r
+                       subw=Label_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf+0x12);\r
+                       comp=1;\r
+               }\r
+               if(comp!=0){\r
+                       if((buf[6] | buf[7])!=0){\r
+                               subw->state|=STATE_ACTION;\r
+                               subw->sizexds=sizeof(struct ActionXDS);\r
+                               subw->xds=(void*) malloc(sizeof(struct ActionXDS));\r
+                               action=(struct ActionXDS*) (subw->xds);\r
+                               action->actionhandler=root_actionhandler;\r
+                               action->action=*((int*)(buf+0x6));\r
+                               action->wParam=*((int*)(buf+0x8));\r
+                               action->lParam=*((long*)(buf+0xa));\r
+                       }\r
+                       if((buf[0x0e] | buf[0x0f])!=0) \r
+                               subw->state=*((int*)(buf+0x0e));\r
+                       subw->font=*((int*)(buf+0x10));\r
+                       for(rd=0; rd<20; rd++)\r
+                               subw->label[rd]=buf[rd+0x12];\r
+                       root->add(root,subw);\r
+               }\r
+               \r
+               rd=read(fh,buf,SIZE_SCRBLD_RECORD);\r
+       } while(rd==SIZE_SCRBLD_RECORD);\r
+       close(fh);\r
+       root->paint(root);\r
+}\r
+\r
+void root_actionhandler(struct Component* this){\r
+       struct ActionXDS *act;\r
+       struct Component* subw;\r
+       char filename[]={'0','0','0','0','.','s','c','r',0};\r
+\r
+       act=(struct ActionXDS*) (this->xds);\r
+\r
+       if(act->action==0x0001){                        /*QUIT*/\r
+               this->handler(this,APP_QUIT,0);\r
+       }\r
+       if((act->action & 0xfffe)==0x0002){             /*Open Screen*/\r
+               Component_changestate_children(this->parent,STATE_VISIBLE,0,0);         \r
+               subw=Window_new(0,0,this->parent->sizex,this->parent->sizey);\r
+               subw->state=STATE_VISIBLE | STATE_ENABLED;\r
+               if((act->action & 1)!=0)\r
+                       subw->state|=STATE_APPLICATION;\r
+               subw->handler=rootWindow_handler;\r
+               subw->paint=Root_paint;\r
+               filename[0]=(char) ((act->lParam) &0xff);\r
+               filename[1]=(char) ((act->lParam>>8) &0xff);\r
+               filename[2]=(char) ((act->lParam>>16) &0xff);\r
+               filename[3]=(char) ((act->lParam>>24) &0xff);\r
+               screenbuilder(subw,filename);\r
+               this->parent->add(this->parent,subw);\r
+       }\r
+       if(act->action==0x0004) {                               /* Open MessageBox */\r
+               /*Component_changestate_children(this->parent,0,0,0);*/\r
+               struct Component* label;\r
+               int i;\r
+               subw=Dialog_new(0x05,0x05,this->parent->sizex-0x0a,this->parent->sizey-0x0a,1);\r
+               subw->state=STATE_VISIBLE | STATE_ENABLED | STYLE_SELFDESTRUCT;\r
+               subw->font=0x0030;\r
+               for(i=0; i<(act->wParam>>12)&0x0f; i++){\r
+                       label=Label_new(0x08,0x14+i*0x0c,(subw->sizex & 0xff)-0x10,0x10,global->stringtable[(act->wParam&0xfff)+i]);\r
+                       label->font=0x0030;\r
+                       subw->add(subw,label);\r
+               }\r
+               Component_setlabel(subw,"Message Box");\r
+               Component_find(subw,0xff)->font=0x0030;\r
+               Component_delete(Component_find(subw,0xfe));\r
+               this->parent->add(this->parent,subw);\r
+               this->parent->handler(this->parent,WND_REDRAW,0);\r
+       }\r
+}\r
+\r
+void read_stringtable(){\r
+       int siz,bsiz;\r
+       int i=0,j=0;\r
+       char buf[12];\r
+       char **ptrs;\r
+       char *rawdata;\r
+       int fh=open("strings.txt",O_RDONLY);\r
+       read(fh,buf,12);\r
+       siz=(buf[0]-0x30)*10000+(buf[1]-0x30)*1000+(buf[2]-0x30)*100+(buf[3]-0x30)*10+(buf[4]-0x30);\r
+       bsiz=(buf[5]-0x30)*10000+(buf[6]-0x30)*1000+(buf[7]-0x30)*100+(buf[8]-0x30)*10+(buf[9]-0x30);\r
+\r
+       ptrs=(char**) malloc(sizeof(char*)*siz);\r
+       rawdata=(char*) malloc(bsiz);\r
+       read(fh,rawdata,bsiz);\r
+       while(i<bsiz && j<siz){\r
+               ptrs[j++]=&(rawdata[i]);\r
+               while(rawdata[i]!=0x0d && rawdata[i]!=0x0a)\r
+                       i++;\r
+               rawdata[i++]=0x00;\r
+               rawdata[i++]-0x00;\r
+       }\r
+       ptrs[j]=&(rawdata[i]);\r
+       global->stringtabledata=rawdata;\r
+       global->stringtable=ptrs;\r
+\r
+}\r
+\r
+void GUIinit(void){\r
+       global=(struct Global_GUI*) malloc(sizeof(struct Global_GUI));\r
+       global->id=0;\r
+       global->willquit=0;\r
+       global->currentfont=NULL;\r
+       global->firstfont=NULL;\r
+       GraphicsOpen();\r
+       loadFont(0x0030,stringwidth0,stringheight01,0,NULL);\r
+       loadFont(0x0031,stringwidth1,stringheight01,0,NULL);\r
+       loadFont(0x0032,stringwidth2,stringheight2,0,NULL);\r
+       read_stringtable();\r
+       global->root=Window_new(0x0,0x0,0x00,0x80);\r
+       global->root->state=STATE_VISIBLE;\r
+       global->root->handler=rootWindow_handler;\r
+       global->root->paint=Root_paint;\r
+       Component_setlabel(global->root,"Test-window");\r
+\r
+}\r
+\r
+void GUIunit(void){\r
+       Component_delete(global->root);\r
+       ClearScreen();\r
+       GraphicsClose();\r
+}\r
+\r
+void GUIgo(void){\r
+       char buf;\r
+       screenbuilder(global->root,"0000.scr");\r
+\r
+       while(read(global->lcd,&buf,1)==1);\r
+\r
+       while(!global->willquit){\r
+               if(read(global->lcd,&buf,1)==1)\r
+                       global->root->handler(global->root,KEY_TYPED,buf);\r
+       }\r
+}\r
+\r
+void main(void){\r
+       GUIinit();\r
+       GUIgo();\r
+       GUIunit();\r
+}\r
+\r
diff --git a/src/gui/Copy of wnd.h b/src/gui/Copy of wnd.h
new file mode 100644 (file)
index 0000000..13fe89d
--- /dev/null
@@ -0,0 +1,180 @@
+#ifndef JOOST_WND_H\r
+#define JOOST_WND_H\r
+#include <stdio.h>\r
+#include <syscalls.h>\r
+#include <fcntl.h>\r
+#include <sys\ioctl.h>\r
+#include <sgtty.h>\r
+#include <string.h>\r
+\r
+#define FONT_HEIGHT                    global->currentfont->stringheight\r
+#define FONT_WIDTH(x)          global->currentfont->stringwidth(x)\r
+#define LABEL_LENGTH           0x14\r
+#define SIZE_SCRBLD_RECORD     0x12+LABEL_LENGTH\r
+\r
+\r
+#define STATE_VISIBLE          0x0001\r
+#define STATE_ENABLED          0x0002\r
+#define STATE_CHECKED          0x0004\r
+#define STATE_FOCUS                    0x0008\r
+#define STATE_CASTING          0x0010\r
+#define STATE_ACTION           0x0020\r
+#define STYLE_MULTILINE                0x0040\r
+#define STYLE_INVERTED         0x0080\r
+#define STYLE_SELFDESTRUCT     0x2000\r
+#define STATE_APPLICATION      0x4000\r
+#define STATE_DUMMY                    0x8000\r
+\r
+#define KEY_TYPED                      0x0001\r
+#define WND_OPEN                       0x0101\r
+#define WND_CLOSE                      0x0102\r
+#define WND_REDRAW                     0x0103\r
+#define WND_BROADCAST          0x0104\r
+#define WND_DESTROY                    0x0105\r
+#define CMP_ACTION                     0x0201\r
+#define CMP_STATECHANGE                0x0202\r
+#define CMP_BROADCAST          0x0203\r
+#define DLG_OK                         0x0301\r
+#define DLG_CANCEL                     0x0302\r
+#define APP_QUIT                       0x0401\r
+\r
+struct Font;\r
+struct Component;\r
+\r
+/************************************************\r
+ * Graphics                                     *\r
+ ************************************************/\r
+\r
+void GraphicsOpen();\r
+void GraphicsClose();\r
+void Move(int x, int y);\r
+void ClearRect(int sx, int sy);\r
+void DrawRect(int sx, int sy);\r
+void FillRect(int sx, int sy);\r
+void FillRectNC(int sx, int sy);\r
+void Text(char *s);\r
+void TouchRegion(int msg, int x, int y, int sx, int sy);\r
+void ClearScreen();\r
+void EnableScreen(unsigned char c);\r
+void grSetFont(int f);\r
+\r
+/************************************************\r
+ * Fonts                                        *\r
+ ************************************************/\r
+\r
+struct Font {\r
+       int id;\r
+       int (*stringwidth)(char*);\r
+       int (*stringheight)(char*);\r
+       struct Font* nextfont;\r
+       int sizefontdata;\r
+       void* fontdata;\r
+};\r
+\r
+struct Font* fontSearch(int f);\r
+void setCurrentFont(int f);\r
+void loadFont(int id,int (*sw)(char*),int (*sh)(char*),int sizedata, void* data);\r
+\r
+\r
+/************************************************\r
+ * Components                                   *\r
+ ************************************************/\r
+\r
+struct Component {\r
+       int id;\r
+       int x,y;\r
+       int sizex,sizey;\r
+       int state;\r
+       int order;\r
+       int font;\r
+       char msg;\r
+       struct Component* parent;\r
+       struct Component *next_sibling;\r
+       struct Component *first_child;\r
+       void (*handler) (struct Component*, int, int);\r
+       void (*paint) (struct Component*);\r
+       void (*add) (struct Component*, struct Component*);\r
+       char label[LABEL_LENGTH+1];\r
+       int sizexds;\r
+       void *xds;\r
+};\r
+\r
+struct ActionXDS {\r
+       void (*actionhandler)(struct Component*);\r
+       int action;\r
+       int wParam;\r
+       long lParam;\r
+};\r
+\r
+struct Component* Component_new(int x,int y,int sx,int sy);\r
+void Component_setlabel(struct Component* this, char* s);\r
+void Component_add(struct Component* this, struct Component* comp);\r
+void Component_paint(struct Component* this);\r
+void Component_findXY(struct Component* this, int* x, int* y);\r
+struct Component* Component_find(struct Component* this, int msg);\r
+struct Component* Component_delete(struct Component* this);\r
+void Component_delete_children(struct Component* this);\r
+void Component_changestate_children(struct Component* this, int andmask, int ormask, int xormask);\r
+\r
+/************************************************\r
+ * Windows                                      *\r
+ ************************************************/\r
+\r
+void Window_handler (struct Component* this, int msg, int param);\r
+void Window_paint(struct Component* this);\r
+void Root_paint(struct Component* this);\r
+void Window_add(struct Component* this, struct Component* comp);\r
+struct Component* Window_new(int x,int y,int sx,int sy);\r
+\r
+/************************************************\r
+ * Buttons                                      *\r
+ ************************************************/\r
+\r
+void Button_handler(struct Component* this, int msg, int param);\r
+void Button_drawtext(struct Component* this, int x, int y);\r
+void Button_paint(struct Component* this);\r
+void Button_add(struct Component* this, struct Component* comp);\r
+struct Component* Button_new(int x, int y, int sx, int sy, int msg);\r
+void Numpad(struct Component* this, int x, int y);\r
+\r
+/************************************************\r
+ * Toggle-buttons                               *\r
+ ************************************************/\r
+\r
+void ToggleButton_handler(struct Component* this, int msg, int param);\r
+void ToggleButton_paint(struct Component* this);\r
+struct Component* ToggleButton_new(int x, int y, int sx, int sy, int msg);\r
+\r
+/************************************************\r
+ * Dialogs                                      *\r
+ ************************************************/\r
+\r
+void Dialog_handler(struct Component* this, int msg, int param);\r
+struct Component* Dialog_new(int x, int y, int sx, int sy, int msg);\r
+\r
+/************************************************\r
+ * Displays                                     *\r
+ ************************************************/\r
+void Display_handler(struct Component* this, int msg, int param);\r
+void Display_paint(struct Component* this);\r
+struct Component* Display_new(int x, int y, int sx, int sy, int msg);\r
+\r
+/************************************************\r
+ * Labels                                       *\r
+ ************************************************/\r
+void Label_handler(struct Component* this, int msg, int param);\r
+void Label_paint(struct Component* this);\r
+struct Component* Label_new(int x, int y, int sx, int sy,char* l);\r
+\r
+/************************************************\r
+ * Implementation                               *\r
+ ************************************************/\r
+void rootWindow_handler(struct Component* this, int msg, int param);\r
+void root_actionhandler(struct Component*);\r
+void screenbuilder(struct Component* root, char* filename);\r
+void read_stringtable();\r
+void GUIinit();\r
+void GUIgo();\r
+void GUIunit();\r
+\r
+#endif
\ No newline at end of file
diff --git a/src/gui/cl64180.r01 b/src/gui/cl64180.r01
new file mode 100644 (file)
index 0000000..19dd6c1
Binary files /dev/null and b/src/gui/cl64180.r01 differ
diff --git a/src/gui/grlogin.map b/src/gui/grlogin.map
new file mode 100644 (file)
index 0000000..8f8c2e6
--- /dev/null
@@ -0,0 +1,272 @@
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+.  .ABS.               00000000    00000000 =           0. bytes (ABS,OVR)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00000000  s__DEFAUL |    00000000  l_CCSTR   |    00000000  l_ECSTR  \r
+     00000000  .__.ABS.  |    00000000  ?CL64180L |    00000000  ?CL64180B\r
+     00000014  e__DEFAUL |    00000014  l__DEFAUL |    00000034  l_CONST  \r
+     000000A0  l_CSTR    |    00000158  l_CDATA0  |    00000158  l_IDATA0 \r
+     00000381  l_RCODE   |    000003B3  l_UDATA0  |    00001000  l_CSTACK \r
+     00004000  s_CODE    |    00008100  s_RCODE   |    00008481  e_RCODE  \r
+     00008481  s_CONST   |    000084B5  s_CSTR    |    000084B5  e_CONST  \r
+     00008555  e_CSTR    |    00008555  s_IDATA0  |    00008555  s_CDATA0 \r
+     000086AD  s_UDATA0  |    000086AD  e_CCSTR   |    000086AD  e_ECSTR  \r
+     000086AD  s_CCSTR   |    000086AD  e_CDATA0  |    000086AD  s_ECSTR  \r
+     000086AD  e_IDATA0  |    00008A60  e_UDATA0  |    00008A60  s_CSTACK \r
+     00009A60  e_CSTACK  |    0000C00E  l_CODE    |    0001000E  e_CODE   \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+_DEFAULT               00000000    00000014 =          20. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+RCODE                  00008100    00000381 =         897. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00008100  __init    |    0000811F  ?BANK_LEA |    00008125  ?BANK_FAS\r
+     0000812A  ?S_MUL_L0 |    00008140  ?C_V_SWIT |    00008152  ?ENT_PARM\r
+     0000815E  ?BANK_CAL |    0000816B  ?S_V_SWIT |    00008188  ?ENT_AUTO\r
+     0000819C  ?V_SWITCH |    000081A6  ?SS_CMP_L |    000081B8  ?SS_DIV_L\r
+     000081D4  ?UL_RSHAS |    000081E2  ?SL_RSH_L |    000081F0  ?UL_RSH_L\r
+     0000820B  ?BANK_LEA |    00008217  ?SS_RSH_L |    00008221  ?L_LSH_L0\r
+     00008239  ?S_DIVMOD |    0000824F  ?L_END_AS |    00008258  ?L_XOR_L0\r
+     00008276  ?L_ORASG_ |    0000828F  ?LEAVE_DI |    00008296  ?L_ADDASG\r
+     000082AF  ?S_S_SWIT |    000082C3  ?S_SWITCH |    000082D1  ?S_FIND_S\r
+     000082ED  ?L_NEG_L0 |    000082FF  ?US_MOD_L |    00008308  ?US_DIV_L\r
+     00008316  ?L_MULASG |    00008326  ?L_MUL_L0 |    000083AA  ?S_MULASG\r
+     000083B4  ?L_END_MU |    000083BD  ?UL_DIVAS |    000083CD  ?UL_MOD_L\r
+     000083F2  ?UL_DIV_L |    0000841A  ?L_DIVMOD |    00008472  ?L_NOT_L0\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CONST                  00008481    00000034 =          52. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTR                   000084B5    000000A0 =         160. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+IDATA0                 00008555    00000158 =         344. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00008555  __IO_list |    00008557  stdin     |    0000856F  stdout   \r
+     00008587  stderr    |    000085A5  _path_pas |    000085A7  __sys_err\r
+     000085A9  __sys_ner |    000085AB  __on_exit |    000085AD  __ctype  \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CDATA0                 00008555    00000158 =         344. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+ECSTR                  000086AD    00000000 =           0. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CCSTR                  000086AD    00000000 =           0. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CODE                   00004000    0000C00E =       49166. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     000045C1  GraphicsO |    0000464F  GraphicsC |    00004664  Move     \r
+     000046A3  ClearRect |    000046E6  DrawRectN |    0000472B  FillRect \r
+     00004770  FillRectN |    000047B5  GrayRect  |    000047FA  Text     \r
+     00004827  TouchRegi |    0000487E  ClearScre |    000048BB  EnableScr\r
+     000048F9  grSetFont |    00004936  fontSearc |    00004966  setCurren\r
+     000049F4  loadFont  |    00004A9B  stringwid |    00004B14  stringhei\r
+     00004B31  stringhei |    00004B44  stringhei |    00004B4D  stringwid\r
+     00004B5E  stringwid |    00004B67  stringwid |    00004B70  Component\r
+     00004C1A  Component |    00004C67  Component |    00004CC5  Component\r
+     00004D0B  Component |    00004D4F  Component |    00004D87  Component\r
+     00004F58  Component |    00004F77  Component |    00004FE0  Component\r
+     00005093  Window_ha |    00005360  Window_pa |    000054ED  Root_pain\r
+     00005524  Window_ad |    00005532  Window_ne |    00005584  Button_ha\r
+     0000563B  Button_dr |    000056F7  Button_pa |    000057F0  Button_ad\r
+     000057F6  Button_ne |    00005848  ToggleBut |    000058E4  ToggleBut\r
+     000059D0  ToggleBut |    00005A22  Dialog_ha |    00005ADB  Dialog_ne\r
+     00005BCA  Display_h |    00005C4B  Display_p |    00005D97  Display_n\r
+     00005DF1  Label_han |    00005DF7  Label_pai |    00005E58  Label_new\r
+     00005EB1  rootWindo |    00005ECF  screenbui |    000062A9  root_acti\r
+     000065E1  read_stri |    000066B6  gui_globa |    000066BC  GUIinit  \r
+     000067E3  GUIunit   |    00006808  GUIgo     |    000068BD  login    \r
+     000069CC  login_act |    00006AC5  main      |    00006AFA  setgid   \r
+     00006B14  unix      |    00006B2E  strrchr   |    00006B96  fflush   \r
+     00006DA9  chdir     |    00006DBE  _write    |    00006DDD  setuid   \r
+     00006DF7  lseek     |    00006E24  __stdio_c |    00006E8F  __stdio_i\r
+     00006ECD  setenv    |    00007149  unsetenv  |    000071E9  close    \r
+     000071FE  strlen    |    00007235  strcmp    |    000072D6  perror   \r
+     00007313  execv     |    00007326  ioctl     |    00007351  isatty   \r
+     0000738C  fstat     |    000073A3  free      |    00007483  getpwnam \r
+     000074E5  setpwent  |    0000752A  endpwent  |    00007549  getpwent \r
+     00007567  strcpy    |    0000758E  __getpwen |    00007816  crypt    \r
+     00007AC3  open      |    00007AEE  malloc    |    00007D1A  exit     \r
+     00007D4A  _read     |    00007D69  memcmp    |    00007DD6  execve   \r
+     00007DF5  strerror  |    00007FB2  memset    |    00014000  memcpy   \r
+     000140CE  on_exit   |    00014147  atexit    |    0001415A  printf   \r
+     00014189  unix_long |    000141A3  strchr    |    000141DE  _exit    \r
+     00014279  strtoul   |    000143D0  toupper   |    000143F5  tolower  \r
+     0001441A  atoi      |    00014430  __longtoa |    000145C4  itoa     \r
+     000147AD  vfprintf  |    00014D08  ltoa      |    00014D6B  sbrk     \r
+     00014D80  strcat    |    00014DA0  fputc     |    00014EB2  ultoa    \r
+     00014F07  strtol   \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+UDATA0                 000086AD    000003B3 =         947. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     000086AD  _argc     |    000086AF  _argv     |    000086B1  environ  \r
+     000086B3  errno     |    000086B5  __cleanup |    000086B8  global   \r
+     000089D8  __malloc_ |    000089DC  __malloc_ |    00008A2E  __on_exit\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTACK                 00008A60    00001000 =        4096. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+\r
+Files Linked                              [ module(s) ]\r
+\r
+..\..\lib\c0b.rel                         [ _c0b ]\r
+wnd                                       [ wnd ]\r
+login                                     [ login ]\r
+\r
+\r
+Libraries Linked                          [ object file ]\r
+\r
+..\..\lib\libsysb.lib                     [ relsysb\setgid.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys0b.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strrchr.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fflush.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\chdir.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\write.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMUL.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\setuid.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\lseek.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\stdio0.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\setenv.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\close.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strlen.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcmp.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\CVSWITCH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\perror.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\execv.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\ioctl.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\isatty.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\fstat.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\free.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\getpwnam.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTPARMDIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKCALLDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\setpwent.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcpy.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SVSWITCH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\getpwent.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTAUTODIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\VSWITCHEND.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSCMP.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\crypt.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\open.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULRSHASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\malloc.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLRSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULRSH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\exit.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\read.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVE32.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSRSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LLSH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcmp.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\execve.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SDIVMOD.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\error.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LENDASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memset.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcpy.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atexit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LXOR.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\printf.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys1b.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LORASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strchr.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\_exit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LADDASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtoul.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ctype.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSSWITCH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSWITCHEND.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atoi.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\itoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\vfprintf.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SFINDSIGN.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ltoa.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNEG.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sbrk.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMULASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMUL.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMULASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcat.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LENDMULDIVASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ultoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtol.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIVASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LDIVMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNOT.rel ]\r
+\r
+\r
+User Base Address Definitions\r
+\r
+l RCODE=0x8100\r
+l CODE=0x4000,0x10000\r
+c CODE=0x4000\r
diff --git a/src/gui/hello.map b/src/gui/hello.map
new file mode 100644 (file)
index 0000000..44a45a1
--- /dev/null
@@ -0,0 +1 @@
+Error[e12]: Unable to open file 'hello'\r
diff --git a/src/gui/login.c b/src/gui/login.c
new file mode 100644 (file)
index 0000000..598cf05
--- /dev/null
@@ -0,0 +1,93 @@
+/* login.c\r
+ * descripton:  login into a user account\r
+ * author:      Alistair Riddoch\r
+ * modification: David Murn <scuffer@hups.apana.org.au>\r
+ *              Added password entry\r
+ * modification: Shane Kerr <kerr@wizard.net>\r
+ *              More work on password entry\r
+ */\r
+\r
+/* todo:  add a timeout for serial and network logins */\r
+/* ???   need a signal mechanism (i.e. alarm() and SIGALRM) */\r
+/*       real getpass() ! */\r
+\r
+#include <unistd.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdio.h>\r
+#include <pwd.h>\r
+#include <wnd.h>\r
+\r
+void login(pwd, argv)\r
+       struct passwd *pwd;\r
+       char **argv;\r
+{\r
+       char pname[64];\r
+       char *bname;\r
+\r
+#if 1  /* addition by Nick, please see linux manpage passwd.5 */\r
+       if (!*pwd->pw_shell)\r
+               {\r
+               pwd->pw_shell = "/bin/sh";\r
+               }\r
+#endif\r
+\r
+/*     chown("/dev/tty",pwd->pw_uid,pwd->pw_gid); */\r
+       pname[0] = '-';\r
+       if ((bname = strrchr(pwd->pw_shell, '/')) != NULL)\r
+               bname++;\r
+       else    bname = pwd->pw_shell;\r
+       strcpy(pname+1, bname);\r
+       argv[0] = pname;\r
+       argv[1] = NULL;\r
+       /* we must set first GID, because we're still root\r
+          if UID is set first and we aren't logging as root,\r
+          we won't have permission to change our GID */\r
+       setgid(pwd->pw_gid);\r
+       setuid(pwd->pw_uid);\r
+       chdir(pwd->pw_dir);\r
+       setenv("HOME", pwd->pw_dir, 1);\r
+       setenv("USER", pwd->pw_name, 1);\r
+       execv(pwd->pw_shell, argv);\r
+       perror(pwd->pw_shell);\r
+       exit(1);\r
+}\r
+\r
+void login_actionhandler(struct Component* this){\r
+       char lbuf[20], *pbuf, salt[3], *s;\r
+       struct passwd *pwd;\r
+       int n;\r
+       struct ActionXDS *act;\r
+       struct Component* disp=this;\r
+\r
+       act=(struct ActionXDS*) (this->xds);\r
+       if(act->action==0x0101){\r
+               lbuf[0]=disp->label[0];\r
+               lbuf[1]=disp->label[1];\r
+               lbuf[2]=0;\r
+               disp->label[0]=0;\r
+               pwd = getpwnam(lbuf);\r
+               pbuf=disp->label+2;\r
+               if (pwd != NULL) {\r
+                       salt[0] = pwd->pw_passwd[0];\r
+                       salt[1] = pwd->pw_passwd[1];\r
+                       salt[2] = 0;\r
+                       s = crypt(pbuf, salt);\r
+                       if (!strcmp(s, pwd->pw_passwd)){\r
+                               ClearScreen();\r
+                               login(pwd, NULL);\r
+                       }\r
+               }\r
+               disp->paint(disp);\r
+       }\r
+}\r
+\r
+void main(int argc, char** argv)\r
+{\r
+       GUIinit();\r
+       gui_globals()->actionhandler=login_actionhandler;\r
+       GUIgo("/wnd/logn.scr");\r
+       GUIunit();\r
+}\r
+\r
+\r
diff --git a/src/gui/login.map b/src/gui/login.map
new file mode 100644 (file)
index 0000000..297c5c7
--- /dev/null
@@ -0,0 +1,283 @@
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+.  .ABS.               00000000    00000000 =           0. bytes (ABS,OVR)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00000000  s__DEFAUL |    00000000  l_CCSTR   |    00000000  l_ECSTR  \r
+     00000000  .__.ABS.  |    00000000  ?CL64180L |    00000000  ?CL64180B\r
+     00000014  e__DEFAUL |    00000014  l__DEFAUL |    0000002F  l_CONST  \r
+     00000148  l_CSTR    |    00000170  l_CDATA0  |    00000170  l_IDATA0 \r
+     000003B5  l_UDATA0  |    00000430  l_RCODE   |    00001000  l_CSTACK \r
+     00004000  s_CODE    |    00008100  s_RCODE   |    00008530  e_RCODE  \r
+     00008530  s_CONST   |    0000855F  s_CSTR    |    0000855F  e_CONST  \r
+     000086A7  e_CSTR    |    000086A7  s_IDATA0  |    000086A7  s_CDATA0 \r
+     00008817  s_UDATA0  |    00008817  e_CCSTR   |    00008817  e_ECSTR  \r
+     00008817  s_CCSTR   |    00008817  e_CDATA0  |    00008817  s_ECSTR  \r
+     00008817  e_IDATA0  |    00008BCC  e_UDATA0  |    00008BCC  s_CSTACK \r
+     00009BCC  e_CSTACK  |    0000C27F  l_CODE    |    0001027F  e_CODE   \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+_DEFAULT               00000000    00000014 =          20. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+RCODE                  00008100    00000430 =        1072. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00008100  __init    |    0000811F  ?L_MUL_L0 |    000081A3  ?BANK_LEA\r
+     000081A9  ?BANK_FAS |    000081AE  ?S_MUL_L0 |    000081C4  ?C_V_SWIT\r
+     000081D6  ?L_ADDASG |    000081EF  ?ENT_PARM |    000081FB  ?BANK_CAL\r
+     00008208  ?S_S_SWIT |    0000821C  ?S_V_SWIT |    00008239  ?S_SWITCH\r
+     00008247  ?SL_MOD_L |    0000827A  ?ENT_AUTO |    0000828E  ?V_SWITCH\r
+     00008298  ?SL_DIV_L |    000082C8  ?SS_CMP_L |    000082DA  ?L_INC_L0\r
+     000082E2  ?US_MOD_L |    000082EB  ?SS_DIV_L |    00008307  ?UL_RSHAS\r
+     00008315  ?US_DIV_L |    00008323  ?SL_RSH_L |    00008331  ?UL_RSH_L\r
+     0000834C  ?L_DIVMOD |    000083A4  ?BANK_LEA |    000083B0  ?SS_RSH_L\r
+     000083BA  ?L_LSH_L0 |    000083D2  ?S_DIVMOD |    000083E8  ?S_MULASG\r
+     000083F2  ?L_END_AS |    000083FB  ?L_NOT_L0 |    0000840A  ?L_XOR_L0\r
+     00008428  ?L_ORASG_ |    00008441  ?LEAVE_DI |    00008448  ?L_FIND_S\r
+     0000848C  ?UL_DIVAS |    0000849C  ?UL_MOD_L |    000084C1  ?S_FIND_S\r
+     000084DD  ?UL_DIV_L |    00008505  ?L_NEG_L0 |    00008517  ?L_MULASG\r
+     00008527  ?L_END_MU\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CONST                  00008530    0000002F =          47. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTR                   0000855F    00000148 =         328. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+IDATA0                 000086A7    00000170 =         368. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     000086BF  __IO_list |    000086C1  stdin     |    000086D9  stdout   \r
+     000086F1  stderr    |    0000870F  _path_pas |    00008711  __sys_err\r
+     00008713  __sys_ner |    00008715  __on_exit |    00008717  __ctype  \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CDATA0                 000086A7    00000170 =         368. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+ECSTR                  00008817    00000000 =           0. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CCSTR                  00008817    00000000 =           0. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CODE                   00004000    0000C27F =       49791. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     0000472B  GraphicsO |    000047C7  GraphicsC |    000047DF  Move     \r
+     0000481E  ClearRect |    00004861  DrawRectN |    000048A6  FillRect \r
+     000048EB  FillRectN |    00004930  GrayRect  |    00004975  Text     \r
+     000049A1  TouchRegi |    000049F8  ClearScre |    00004A35  EnableScr\r
+     00004A73  grSetFont |    00004AB0  fontSearc |    00004AE0  setCurren\r
+     00004B7C  loadFont  |    00004C23  stringwid |    00004C9C  stringhei\r
+     00004CB9  stringhei |    00004CCC  stringhei |    00004CD5  stringwid\r
+     00004CE6  stringwid |    00004CEF  stringwid |    00004CF8  Component\r
+     00004DA2  Component |    00004DEF  Component |    00004E4D  Component\r
+     00004E93  Component |    00004ED7  Component |    00004F0F  Component\r
+     000050E0  Component |    000050FF  Component |    00005168  Component\r
+     0000521B  Window_ha |    00005485  Window_pa |    00005611  Root_pain\r
+     00005648  Window_ad |    00005656  Window_ne |    000056A8  Button_ha\r
+     0000575F  Button_dr |    0000582D  Button_pa |    00005900  Button_ad\r
+     00005906  Button_ne |    00005958  ToggleBut |    000059F1  ToggleBut\r
+     00005ADD  ToggleBut |    00005B2F  Dialog_ha |    00005BE8  Dialog_ne\r
+     00005CD7  Display_h |    00005D55  Display_p |    00005E72  Display_n\r
+     00005ECC  Label_han |    00005ED2  Label_pai |    00005F33  Label_new\r
+     00005F8C  Transacti |    000065CA  rootWindo |    000065E8  screenbui\r
+     000069B0  root_acti |    00006CE5  read_stri |    00006DBA  gui_globa\r
+     00006DC0  GUIinit   |    00006EF0  GUIunit   |    00006F15  GUIgo    \r
+     00006F94  login     |    000070BD  login_act |    00007213  main     \r
+     0000727A  setgid    |    00007294  unix      |    000072AE  sprintf  \r
+     000072F2  strrchr   |    0000735A  fflush    |    0000756D  chdir    \r
+     00007582  _write    |    000075A1  setuid    |    000075BB  printf   \r
+     000075EA  lseek     |    00007617  __stdio_c |    00007682  __stdio_i\r
+     000076C0  setenv    |    0000793C  unsetenv  |    000079DC  close    \r
+     000079F1  strlen    |    00007A28  strcmp    |    00007AC9  perror   \r
+     00007B06  execv     |    00007B19  ioctl     |    00007B44  isatty   \r
+     00007B7F  fstat     |    00007B96  free      |    00007C76  getpwnam \r
+     00007CD8  setpwent  |    00007D1D  endpwent  |    00007D3C  getpwent \r
+     00007D5A  strcpy    |    00014000  __getpwen |    00014288  atoi     \r
+     0001441E  vfprintf  |    00014979  ltoa      |    000149DC  atol     \r
+     000149F2  __longtoa |    00014B86  itoa      |    00014BEF  crypt    \r
+     00014E9C  fputs     |    00014EFA  open      |    00014F25  malloc   \r
+     00015151  exit      |    00015181  _read     |    000151A0  memcmp   \r
+     0001520D  execve    |    0001522C  strerror  |    000153E9  memset   \r
+     00015429  memcpy    |    000154F7  on_exit   |    00015570  atexit   \r
+     00015583  strcat    |    000155A3  unix_long |    000155BD  strchr   \r
+     000155F8  _exit     |    00015693  strtoul   |    000157EA  fputc    \r
+     000158FC  toupper   |    00015921  tolower   |    00015946  ultoa    \r
+     0001599B  strtol    |    00015A43  sbrk     \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+UDATA0                 00008817    000003B5 =         949. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00008817  _argc     |    00008819  _argv     |    0000881B  environ  \r
+     0000881D  errno     |    0000881F  __cleanup |    00008822  global   \r
+     00008824  trans     |    00008B44  __malloc_ |    00008B48  __malloc_\r
+     00008B9A  __on_exit\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTACK                 00008BCC    00001000 =        4096. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+\r
+Files Linked                              [ module(s) ]\r
+\r
+..\..\lib\c0b.rel                         [ _c0b ]\r
+wnd                                       [ wnd ]\r
+login                                     [ login ]\r
+\r
+\r
+Libraries Linked                          [ object file ]\r
+\r
+..\..\lib\libsysb.lib                     [ relsysb\setgid.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys0b.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\sprintf.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMUL.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strrchr.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fflush.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\chdir.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\write.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMUL.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\setuid.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\printf.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\lseek.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\stdio0.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\setenv.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\close.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strlen.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcmp.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\CVSWITCH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\perror.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\execv.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\ioctl.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LADDASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\isatty.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\fstat.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\free.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\getpwnam.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTPARMDIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKCALLDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\setpwent.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcpy.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSSWITCH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SVSWITCH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSWITCHEND.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLMOD.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\getpwent.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTAUTODIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\VSWITCHEND.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atoi.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLDIV.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\vfprintf.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ltoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atol.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSCMP.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\itoa.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LINC.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\crypt.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputs.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\open.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULRSHASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\malloc.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLRSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULRSH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\exit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LDIVMOD.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\read.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVE32.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSRSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LLSH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcmp.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\execve.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SDIVMOD.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\error.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMULASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LENDASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNOT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memset.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcpy.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atexit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LXOR.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcat.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys1b.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LORASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strchr.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\_exit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtoul.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ctype.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ultoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtol.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LFINDSIGN.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIVASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SFINDSIGN.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIV.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sbrk.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNEG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMULASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LENDMULDIVASG.rel ]\r
+\r
+\r
+User Base Address Definitions\r
+\r
+l RCODE=0x8100\r
+l CODE=0x4000,0x10000\r
+c CODE=0x4000\r
diff --git a/src/gui/login.rel b/src/gui/login.rel
new file mode 100644 (file)
index 0000000..ca89380
--- /dev/null
@@ -0,0 +1,231 @@
+XL4\r
+H 3 areas 1B global symbols\r
+M login\r
+S setgid Ref00000000\r
+S GUIunit Ref00000000\r
+S ?BANK_FAST_LEAVE_L08 Ref00000000\r
+S ClearScreen Ref00000000\r
+S strrchr Ref00000000\r
+S gui_globals Ref00000000\r
+S chdir Ref00000000\r
+S setuid Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
+S setenv Ref00000000\r
+S strcmp Ref00000000\r
+S perror Ref00000000\r
+S execv Ref00000000\r
+S GUIgo Ref00000000\r
+S ?ENT_PARM_DIRECT_L09 Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S getpwnam Ref00000000\r
+S strcpy Ref00000000\r
+S ?ENT_AUTO_DIRECT_L09 Ref00000000\r
+S crypt Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S GUIinit Ref00000000\r
+S exit Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 23D flags 0\r
+S login_actionhandler Def0000010F\r
+S login Def00000000\r
+S main Def00000208\r
+A CSTR size 20 flags 0\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 FD E5 DD E5 C5 21 C0 FF 39 F9 D5\r
+R 00 00 01 00\r
+T 0B 00 00 00 DD E1 21 0C 00 19 7E 23 66 6F AF\r
+R 00 00 01 00\r
+T 16 00 00 00 B6 20 08\r
+R 00 00 01 00\r
+T 19 00 00 00\r
+R 00 00 01 00\r
+T 19 00 00 00 DD 36 0C 00 00 00 00 DD 36 0D\r
+R 00 00 01 00 09 07 02 00\r
+T 20 00 00 00 00 00 00 00\r
+R 00 00 01 00 89 04 02 00\r
+T 21 00 00 00\r
+R 00 00 01 00\r
+T 21 00 00 00 21 00 00 39 36 2D 01 2F 00 DD 5E\r
+R 00 00 01 00\r
+T 2C 00 00 00 0C DD 56 0D 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 04 00\r
+T 33 00 00 00 00 00 00 00 CD 00 00 00 00 E5 FD\r
+R 00 00 01 00 02 04 04 00 02 09 0F 00\r
+T 3A 00 00 00 E1 7D B4 28 04\r
+R 00 00 01 00\r
+T 3F 00 00 00\r
+R 00 00 01 00\r
+T 3F 00 00 00 FD 23 18 09\r
+R 00 00 01 00\r
+T 43 00 00 00\r
+R 00 00 01 00\r
+T 43 00 00 00 DD 6E 0C DD 66 0D E5 FD E1\r
+R 00 00 01 00\r
+T 4C 00 00 00\r
+R 00 00 01 00\r
+T 4C 00 00 00 FD E5 C1 21 00 00 39 11 01 00 19\r
+R 00 00 01 00\r
+T 57 00 00 00 EB 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 11 00 02 0B 11 00\r
+T 5D 00 00 00 CD 00 00 00 00 21 00 00 39 E5 21\r
+R 00 00 01 00 02 05 0F 00\r
+T 66 00 00 00 42 00 39 7E 23 66 6F C1 71 23 70\r
+R 00 00 01 00\r
+T 71 00 00 00 21 40 00 39 47 23 66 68 23 23 AF\r
+R 00 00 01 00\r
+T 7C 00 00 00 77 23 77 DD 5E 06 DD 56 07 3E\r
+R 00 00 01 00\r
+T 86 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 00 00 02 09 00 00\r
+T 8B 00 00 00 00 00 00 00 DD 5E 04 DD 56 05 3E\r
+R 00 00 01 00 02 04 0F 00\r
+T 94 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 07 00 02 09 07 00\r
+T 99 00 00 00 00 00 00 00 DD 5E 0A DD 56 0B 3E\r
+R 00 00 01 00 02 04 0F 00\r
+T A2 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 06 00 02 09 06 00\r
+T A7 00 00 00 00 00 00 00 21 01 00 E5 DD 4E 0A\r
+R 00 00 01 00 02 04 0F 00\r
+T B0 00 00 00 DD 46 0B 11 08 00 00 00 3E\r
+R 00 00 01 00 00 08 02 00\r
+T B7 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 09 00 02 09 09 00\r
+T BC 00 00 00 00 00 00 00 F1 21 01 00 E5 DD 4E\r
+R 00 00 01 00 02 04 0F 00\r
+T C5 00 00 00 00 DD 46 01 11 0D 00 00 00 3E\r
+R 00 00 01 00 00 09 02 00\r
+T CD 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 09 00 02 09 09 00\r
+T D2 00 00 00 00 00 00 00 F1 21 40 00 39 4E 23\r
+R 00 00 01 00 02 04 0F 00\r
+T DB 00 00 00 46 DD 5E 0C DD 56 0D 3E\r
+R 00 00 01 00\r
+T E3 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0C 00 02 09 0C 00\r
+T E8 00 00 00 00 00 00 00 DD 5E 0C DD 56 0D 3E\r
+R 00 00 01 00 02 04 0F 00\r
+T F1 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0B 00 02 09 0B 00\r
+T F6 00 00 00 00 00 00 00 11 01 00 3E\r
+R 00 00 01 00 02 04 0F 00\r
+T FC 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 16 00 02 09 16 00\r
+T 01 01 00 00 00 00 00 00 21 42 00 39 F9 DD E1\r
+R 00 00 01 00 02 04 0F 00\r
+T 0A 01 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 02 00\r
+T 0F 01 00 00\r
+R 00 00 01 00\r
+T 0F 01 00 00 CD 00 00 00 00 E0 FF FD E5 DD 6E\r
+R 00 00 01 00 02 05 12 00\r
+T 18 01 00 00 02 DD 66 03 E5 FD E1 21 26 00 DD\r
+R 00 00 01 00\r
+T 23 01 00 00 4E 02 DD 46 03 09 46 23 66 68 23\r
+R 00 00 01 00\r
+T 2E 01 00 00 23 23 46 23 66 68 01 01 01 A7 ED\r
+R 00 00 01 00\r
+T 39 01 00 00 42 C2 03 02 00 00\r
+R 00 00 01 00 00 06 01 00\r
+T 3D 01 00 00\r
+R 00 00 01 00\r
+T 3D 01 00 00 FD 6E 20 FD 66 21 46 DD 70 EC FD\r
+R 00 00 01 00\r
+T 48 01 00 00 6E 20 FD 66 21 23 46 DD 70 ED DD\r
+R 00 00 01 00\r
+T 53 01 00 00 36 EE 00 FD 6E 20 FD 66 21 36 00\r
+R 00 00 01 00\r
+T 5E 01 00 00 21 0E 00 39 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 10 00\r
+T 66 01 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 10 00 02 09 0F 00\r
+T 6D 01 00 00 E0 DD 74 E1 FD 4E 20 FD 46 21 03\r
+R 00 00 01 00\r
+T 78 01 00 00 03 DD 71 EA DD 70 EB 7D B4 28 71\r
+R 00 00 01 00\r
+T 83 01 00 00\r
+R 00 00 01 00\r
+T 83 01 00 00 23 23 7E 23 66 6F 46 DD 70 E2 DD\r
+R 00 00 01 00\r
+T 8E 01 00 00 6E E0 DD 66 E1 23 23 46 23 66 68\r
+R 00 00 01 00\r
+T 99 01 00 00 23 46 DD 70 E3 DD 36 E4 00 21\r
+R 00 00 01 00\r
+T A3 01 00 00 04 00 39 4D 44 DD 5E EA DD 56 EB\r
+R 00 00 01 00\r
+T AE 01 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 13 00 02 0A 13 00\r
+T B4 01 00 00 00 00 00 00 DD 75 E8 DD 74 E9 DD\r
+R 00 00 01 00 02 04 0F 00\r
+T BD 01 00 00 4E E0 DD 46 E1 03 03 69 60 4E 23\r
+R 00 00 01 00\r
+T C8 01 00 00 46 DD 5E E8 DD 56 E9 3E\r
+R 00 00 01 00\r
+T D0 01 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0A 00 02 09 0A 00\r
+T D5 01 00 00 00 00 00 00 7D B4 20 19\r
+R 00 00 01 00 02 04 0F 00\r
+T DB 01 00 00\r
+R 00 00 01 00\r
+T DB 01 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 03 00 02 0A 03 00\r
+T E1 01 00 00 00 00 00 00 01 00 00 DD 5E E0 DD\r
+R 00 00 01 00 02 04 0F 00\r
+T EA 01 00 00 56 E1 3E 00 00 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T EF 01 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 0F 00\r
+T F4 01 00 00\r
+R 00 00 01 00\r
+T F4 01 00 00\r
+R 00 00 01 00\r
+T F4 01 00 00 FD E5 D1 FD 7E 1C FD 6E 1A FD 66\r
+R 00 00 01 00\r
+T FF 01 00 00 1B CD 00 00 00 00\r
+R 00 00 01 00 02 06 0F 00\r
+T 03 02 00 00\r
+R 00 00 01 00\r
+T 03 02 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 08 00\r
+T 08 02 00 00\r
+R 00 00 01 00\r
+T 08 02 00 00 CD 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 0E 00 2B 0A 15 00\r
+T 0E 02 00 00 00 00 00 00 CD 00 00 00 00 3E\r
+R 00 00 01 00 02 04 15 00 02 09 0F 00\r
+T 14 02 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 05 00 02 09 05 00\r
+T 19 02 00 00 00 00 00 00 01 10 00 09 36\r
+R 00 00 01 00 02 04 0F 00\r
+T 20 02 00 00 0F 01 00 00 23 36 0F 01 00 00 23\r
+R 00 00 01 00 09 04 01 00 89 0A 01 00\r
+T 25 02 00 00 36 0F 01 00 00 11 12 00 00 00 3E\r
+R 00 00 01 00 29 05 01 00 00 0A 02 00\r
+T 2B 02 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0D 00 02 09 0D 00\r
+T 30 02 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 0F 00 2B 09 01 00\r
+T 35 02 00 00 00 00 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 02 04 01 00 02 09 0F 00\r
+T 3B 02 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 08 00\r
+T 00 00 00 00\r
+R 00 00 02 00\r
+T 00 00 00 00 2F 62 69 6E 2F 73 68 00\r
+R 00 00 02 00\r
+T 08 00 00 00\r
+R 00 00 02 00\r
+T 08 00 00 00 48 4F 4D 45 00\r
+R 00 00 02 00\r
+T 0D 00 00 00\r
+R 00 00 02 00\r
+T 0D 00 00 00 55 53 45 52 00\r
+R 00 00 02 00\r
+T 12 00 00 00\r
+R 00 00 02 00\r
+T 12 00 00 00 2F 77 6E 64 2F 6C 6F 67 6E 2E 73\r
+R 00 00 02 00\r
+T 1D 00 00 00 63 72 00\r
+R 00 00 02 00\r
diff --git a/src/gui/m.bat b/src/gui/m.bat
new file mode 100644 (file)
index 0000000..b5bd020
--- /dev/null
@@ -0,0 +1,27 @@
+iccz80 -S -w -mb -v1 -z9 -A -I..\..\include\ wnd\r
+@if errorlevel 1 goto failure\r
+del wnd.r01\r
+as-z80 -l -o wnd.s01\r
+@if errorlevel 1 goto failure\r
+\r
+iccz80 -S -w -mb -v1 -z9 -A -I..\..\include\ login\r
+@if errorlevel 1 goto failure\r
+del login.r01\r
+as-z80 -l -o login.s01\r
+@if errorlevel 1 goto failure\r
+\r
+link-z80 -f wnd\r
+@if errorlevel 1 goto failure\r
+ihex2bin -l grlogin.i86 ..\..\bin\banked\grlogin\r
+@if errorlevel 1 goto failure\r
+\r
+cd ..\..\bin\r
+call appinst.bat\r
+cd ..\src\gui\r
+\r
+@echo SUCCESS\r
+@goto done\r
+:failure\r
+@echo FAILURE\r
+:done\r
+\r
diff --git a/src/gui/p.bat b/src/gui/p.bat
new file mode 100644 (file)
index 0000000..43e20c8
--- /dev/null
@@ -0,0 +1,2 @@
+@echo off\r
+set path=c:\iar\z80\bin;%path%\r
diff --git a/src/gui/t.bat b/src/gui/t.bat
new file mode 100644 (file)
index 0000000..f7e61fb
--- /dev/null
@@ -0,0 +1,33 @@
+iccz80 -S -w -mb -v1 -z9 -A -I..\..\include\ wnd\r
+@if errorlevel 1 goto failure\r
+del wnd.r01\r
+as-z80 -l -o wnd.s01\r
+@if errorlevel 1 goto failure\r
+\r
+iccz80 -S -w -mb -v1 -z9 -A -I..\..\include\ trans\r
+@if errorlevel 1 goto failure\r
+del trans.r01\r
+as-z80 -l -o trans.s01\r
+@if errorlevel 1 goto failure\r
+\r
+iccz80 -S -w -mb -v1 -z9 -A -I..\..\include\ test\r
+@if errorlevel 1 goto failure\r
+del test.r01\r
+as-z80 -l -o test.s01\r
+@if errorlevel 1 goto failure\r
+\r
+link-z80 -f test\r
+@if errorlevel 1 goto failure\r
+ihex2bin -l test.i86 ..\..\bin\banked\test\r
+@if errorlevel 1 goto failure\r
+\r
+cd ..\..\bin\r
+call appinst.bat\r
+cd ..\src\gui\r
+\r
+@echo SUCCESS\r
+@goto done\r
+:failure\r
+@echo FAILURE\r
+:done\r
+\r
diff --git a/src/gui/test.c b/src/gui/test.c
new file mode 100644 (file)
index 0000000..2ef63cb
--- /dev/null
@@ -0,0 +1,10 @@
+#include <wnd.h>\r
+#include <trans.h>\r
+\r
+void main(void){\r
+       GUIinit();\r
+       Transaction_init();\r
+       gui_globals()->actionhandler=Transaction_handler;\r
+       GUIgo("/wnd/0000.scr"); /* Nick added /wnd/ */\r
+       GUIunit();\r
+}
\ No newline at end of file
diff --git a/src/gui/test.lnk b/src/gui/test.lnk
new file mode 100644 (file)
index 0000000..e1e593e
--- /dev/null
@@ -0,0 +1,15 @@
+-k ..\..\lib\r
+-l libcb.lib\r
+-l libsysb.lib\r
+-l libiar.lib\r
+-m\r
+-u\r
+-i\r
+-o test\r
+-bl RCODE=0x8100\r
+-bl CODE=0x4000,0x10000\r
+-bc CODE=0x4000\r
+..\..\lib\c0b.rel\r
+wnd\r
+trans\r
+test\r
diff --git a/src/gui/test.map b/src/gui/test.map
new file mode 100644 (file)
index 0000000..6cb50e5
--- /dev/null
@@ -0,0 +1,248 @@
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+.  .ABS.               00000000    00000000 =           0. bytes (ABS,OVR)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00000000  s__DEFAUL |    00000000  l_CCSTR   |    00000000  l_ECSTR  \r
+     00000000  .__.ABS.  |    00000000  ?CL64180L |    00000000  ?CL64180B\r
+     00000014  e__DEFAUL |    00000014  l__DEFAUL |    00000034  l_CONST  \r
+     000000E3  l_CSTR    |    00000166  l_CDATA0  |    00000166  l_IDATA0 \r
+     00000247  l_UDATA0  |    000003AF  l_RCODE   |    00001000  l_CSTACK \r
+     00004000  s_CODE    |    00008100  s_RCODE   |    000084AF  e_RCODE  \r
+     000084AF  s_CONST   |    000084E3  s_CSTR    |    000084E3  e_CONST  \r
+     000085C6  e_CSTR    |    000085C6  s_IDATA0  |    000085C6  s_CDATA0 \r
+     0000872C  s_UDATA0  |    0000872C  e_CCSTR   |    0000872C  e_ECSTR  \r
+     0000872C  s_CCSTR   |    0000872C  e_CDATA0  |    0000872C  s_ECSTR  \r
+     0000872C  e_IDATA0  |    00008973  e_UDATA0  |    00008973  s_CSTACK \r
+     00009973  e_CSTACK  |    0000C141  l_CODE    |    00010141  e_CODE   \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+_DEFAULT               00000000    00000014 =          20. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+RCODE                  00008100    000003AF =         943. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00008100  __init    |    0000811F  ?L_MUL_L0 |    000081A3  ?BANK_LEA\r
+     000081A9  ?BANK_FAS |    000081AE  ?S_MUL_L0 |    000081C4  ?C_V_SWIT\r
+     000081D6  ?L_ADDASG |    000081EF  ?ENT_PARM |    000081FB  ?BANK_CAL\r
+     00008208  ?S_S_SWIT |    0000821C  ?S_V_SWIT |    00008239  ?S_SWITCH\r
+     00008247  ?SL_MOD_L |    0000827A  ?ENT_AUTO |    0000828E  ?V_SWITCH\r
+     00008298  ?SL_DIV_L |    000082C8  ?SS_CMP_L |    000082DA  ?L_INC_L0\r
+     000082E2  ?US_MOD_L |    000082EB  ?SS_DIV_L |    00008307  ?US_DIV_L\r
+     00008315  ?SL_RSH_L |    00008323  ?L_DIVMOD |    0000837B  ?BANK_LEA\r
+     00008387  ?SS_RSH_L |    00008391  ?S_DIVMOD |    000083A7  ?S_MULASG\r
+     000083B1  ?L_NOT_L0 |    000083C0  ?LEAVE_DI |    000083C7  ?L_FIND_S\r
+     0000840B  ?UL_DIVAS |    0000841B  ?UL_MOD_L |    00008440  ?S_FIND_S\r
+     0000845C  ?UL_DIV_L |    00008484  ?L_NEG_L0 |    00008496  ?L_END_MU\r
+     0000849F  ?L_MULASG\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CONST                  000084AF    00000034 =          52. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTR                   000084E3    000000E3 =         227. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+IDATA0                 000085C6    00000166 =         358. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     000085DE  __IO_list |    000085E0  stdin     |    000085F8  stdout   \r
+     00008610  stderr    |    0000862A  __on_exit |    0000862C  __ctype  \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CDATA0                 000085C6    00000166 =         358. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+ECSTR                  0000872C    00000000 =           0. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CCSTR                  0000872C    00000000 =           0. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CODE                   00004000    0000C141 =       49473. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00004640  GraphicsO |    000046CE  GraphicsC |    000046E3  Move     \r
+     00004722  ClearRect |    00004765  DrawRectN |    000047AA  FillRect \r
+     000047EF  FillRectN |    00004834  GrayRect  |    00004879  Text     \r
+     000048A6  TouchRegi |    000048FD  ClearScre |    0000493A  EnableScr\r
+     00004978  grSetFont |    000049B5  fontSearc |    000049E5  setCurren\r
+     00004A73  loadFont  |    00004B1A  stringwid |    00004B93  stringhei\r
+     00004BB0  stringhei |    00004BC3  stringhei |    00004BCC  stringwid\r
+     00004BDD  stringwid |    00004BE6  stringwid |    00004BEF  Component\r
+     00004C99  Component |    00004CE6  Component |    00004D44  Component\r
+     00004D8A  Component |    00004DCE  Component |    00004E06  Component\r
+     00004FD7  Component |    00004FF6  Component |    0000505F  Component\r
+     00005112  Window_ha |    000053DF  Window_pa |    0000556C  Root_pain\r
+     000055A3  Window_ad |    000055B1  Window_ne |    00005603  Button_ha\r
+     000056BA  Button_dr |    00005776  Button_pa |    0000586F  Button_ad\r
+     00005875  Button_ne |    000058C7  ToggleBut |    00005963  ToggleBut\r
+     00005A4F  ToggleBut |    00005AA1  Dialog_ha |    00005B5A  Dialog_ne\r
+     00005C49  Display_h |    00005CCA  Display_p |    00005E16  Display_n\r
+     00005E70  Label_han |    00005E76  Label_pai |    00005ED7  Label_new\r
+     00005F30  rootWindo |    00005F4E  screenbui |    00006328  root_acti\r
+     00006660  read_stri |    00006735  gui_globa |    0000673B  GUIinit  \r
+     00006862  GUIunit   |    00006887  GUIgo     |    0000693C  Transacti\r
+     000069B1  Transacti |    00006FD3  main      |    00007011  sprintf  \r
+     00007055  fflush    |    00007268  _write    |    00007287  lseek    \r
+     000072B4  __stdio_c |    0000731F  __stdio_i |    0000735D  close    \r
+     00007372  strlen    |    000073A9  ioctl     |    000073D4  isatty   \r
+     0000740F  fstat     |    00007426  free      |    00007506  strcpy   \r
+     0000752D  atoi      |    000076C3  vfprintf  |    00007C1E  ltoa     \r
+     00007C81  atol      |    00007C97  __longtoa |    00007E2B  itoa     \r
+     00007E94  open      |    00014000  malloc    |    0001422C  exit     \r
+     0001425C  _read     |    0001427B  unix      |    00014295  memcpy   \r
+     00014363  on_exit   |    000143DC  atexit    |    000143EF  strcat   \r
+     0001440F  unix_long |    00014429  _exit     |    0001443E  fputc    \r
+     00014550  ultoa     |    000145A5  strtol    |    0001464D  sbrk     \r
+     000146E8  strtoul   |    0001483F  toupper   |    00014864  tolower  \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+UDATA0                 0000872C    00000247 =         583. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     0000872C  _argc     |    0000872E  _argv     |    00008730  environ  \r
+     00008732  errno     |    00008734  __cleanup |    00008737  global   \r
+     00008739  trans     |    0000893B  __malloc_ |    0000893F  __malloc_\r
+     00008941  __on_exit\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTACK                 00008973    00001000 =        4096. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+\r
+Files Linked                              [ module(s) ]\r
+\r
+..\..\lib\c0b.rel                         [ _c0b ]\r
+wnd                                       [ wnd ]\r
+trans                                     [ trans ]\r
+test                                      [ test ]\r
+\r
+\r
+Libraries Linked                          [ object file ]\r
+\r
+..\..\lib\libcb.lib                       [ relcb\sprintf.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMUL.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fflush.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\write.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMUL.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\lseek.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\stdio0.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\close.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strlen.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\CVSWITCH.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\ioctl.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LADDASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\isatty.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\fstat.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\free.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTPARMDIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKCALLDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcpy.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSSWITCH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SVSWITCH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSWITCHEND.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTAUTODIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\VSWITCHEND.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atoi.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLDIV.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\vfprintf.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ltoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atol.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSCMP.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\itoa.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LINC.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\open.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\malloc.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLRSH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\exit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LDIVMOD.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\read.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVE32.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSRSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SDIVMOD.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys0b.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMULASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNOT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcpy.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atexit.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcat.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys1b.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\_exit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ultoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtol.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LFINDSIGN.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIVASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SFINDSIGN.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIV.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sbrk.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNEG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LENDMULDIVASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtoul.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ctype.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMULASG.rel ]\r
+\r
+\r
+User Base Address Definitions\r
+\r
+l RCODE=0x8100\r
+l CODE=0x4000,0x10000\r
+c CODE=0x4000\r
diff --git a/src/gui/test.rel b/src/gui/test.rel
new file mode 100644 (file)
index 0000000..3862ba0
--- /dev/null
@@ -0,0 +1,47 @@
+XL4\r
+H 3 areas B global symbols\r
+M test\r
+S GUIunit Ref00000000\r
+S ?BANK_FAST_LEAVE_L08 Ref00000000\r
+S gui_globals Ref00000000\r
+S GUIgo Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S Transaction_handler Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S Transaction_init Ref00000000\r
+S GUIinit Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 3E flags 0\r
+S main Def00000000\r
+A CSTR size E flags 0\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 C5 D5 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 08 00\r
+T 05 00 00 00 00 00 00 00 CD 00 00 00 00 3E\r
+R 00 00 01 00 02 04 08 00 02 09 04 00\r
+T 0B 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 07 00 02 09 07 00\r
+T 10 00 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 04 00 2B 09 02 00\r
+T 15 00 00 00 00 00 00 00 CD 00 00 00 00 01\r
+R 00 00 01 00 02 04 02 00 02 09 04 00\r
+T 1B 00 00 00 10 00 09 36 00 00 00 00 23 36\r
+R 00 00 01 00 0B 08 05 00\r
+T 22 00 00 00 00 00 00 00 23 36 00 00 00 00 11\r
+R 00 00 01 00 8B 04 05 00 2B 0A 05 00\r
+T 27 00 00 00 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 09 03 00\r
+T 2C 00 00 00 00 00 00 00 CD 00 00 00 00 3E\r
+R 00 00 01 00 02 04 03 00 02 09 04 00\r
+T 32 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 00 00 02 09 00 00\r
+T 37 00 00 00 00 00 00 00 D1 C1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 04 00 02 0B 01 00\r
+T 00 00 00 00\r
+R 00 00 02 00\r
+T 00 00 00 00 2F 77 6E 64 2F 30 30 30 30 2E 73\r
+R 00 00 02 00\r
+T 0B 00 00 00 63 72 00\r
+R 00 00 02 00\r
diff --git a/src/gui/trans.c b/src/gui/trans.c
new file mode 100644 (file)
index 0000000..c41491a
--- /dev/null
@@ -0,0 +1,124 @@
+#include <wnd.h>\r
+#include <trans.h>\r
+#include "..\libc\malloc-l.h"\r
+#undef NULL\r
+#define NULL   0\r
+\r
+/************************************************\r
+ * Transactions                                 *\r
+ ************************************************/\r
+\r
+struct Global_Trans* trans;\r
+\r
+void Transaction_init(){\r
+       trans=(struct Global_Trans*) malloc(sizeof(struct Global_Trans));\r
+       trans->first=(struct Transaction*) malloc(sizeof(struct Transaction));\r
+       trans->first->next=NULL;\r
+       trans->first->barcode[0]=0;\r
+       trans->first->stuks=0;\r
+       trans->first->prijs=0;\r
+}\r
+\r
+void Transaction_handler(struct Component* this){\r
+       struct ActionXDS *act;\r
+\r
+       act=(struct ActionXDS*) (this->xds);\r
+\r
+       if(trans==NULL){\r
+               Transaction_init();\r
+       }\r
+\r
+       if(act->action==0x1000)         /* Transaction module init*/\r
+       {\r
+               trans->barcode=act->lParam & 0xff;\r
+               trans->stuks=(act->lParam>>8) & 0xff;\r
+               trans->prijs=(act->lParam>>16) & 0xff;\r
+               Component_setlabel(Component_find(this,trans->barcode),"Barcode");\r
+               Component_setlabel(Component_find(this,trans->stuks),"Stuks");\r
+               Component_setlabel(Component_find(this,trans->prijs),"Prijs");\r
+       }\r
+\r
+       if(act->action>=0x1010 && act->action<=0x1012){\r
+               struct Component* display;\r
+               struct Transaction* tr=trans->first;\r
+               while(tr->next!=NULL)\r
+                       tr=tr->next;\r
+               display=Component_find(this->parent,act->wParam);\r
+               Component_setlabel(this, display->label);\r
+               Component_setlabel(display,"");\r
+               display->paint(display);\r
+               switch(act->action){\r
+               case 0x1010:\r
+                       strcpy(tr->barcode,this->label);\r
+                       break;\r
+               case 0x1011:\r
+                       tr->stuks=atoi(this->label);\r
+                       break;\r
+               case 0x1012:\r
+                       tr->prijs=atol(this->label);\r
+                       break;\r
+               }\r
+               this->paint(this);\r
+       }\r
+\r
+       if(act->action==0x101e){\r
+               int prn,i;\r
+               struct sgttyb temp;\r
+               struct Transaction* tr;\r
+               long totaal=0;\r
+               char s[80];\r
+\r
+               tr=trans->first;\r
+\r
+               prn=open("/dev/printer",O_WRONLY);\r
+               gtty(prn,&temp);\r
+               temp.sg_flags=RAW | UNBUFF;\r
+               stty(prn,&temp);\r
+               while(tr!=NULL){\r
+                       if(tr->stuks!=0){\r
+                               if(tr->stuks==1)\r
+                                       sprintf(s,"%13s Verkoopartikel  \x7c%7ld,%02ld\r\n",tr->barcode,tr->prijs/100,tr->prijs%100);\r
+                               else\r
+                                       sprintf(s,"%13s Verkoopartikel\r\n%4dx @ \x7c %7ld,%02ld          \x7c%7ld,%02ld\r\n",tr->barcode,tr->stuks,tr->prijs/100,tr->prijs%100,(tr->stuks*tr->prijs)/100,(tr->stuks*tr->prijs)%100);\r
+                               totaal+=tr->stuks*tr->prijs;\r
+                               write(prn,s,strlen(s));\r
+                       }\r
+                       tr=tr->next;\r
+               }\r
+               sprintf(s,"\r\n%13sTotaal:%10s\x7c%7ld,%02ld\r\n\r\n\r\n","","",totaal/100,totaal%100);\r
+               write(prn,s,strlen(s));\r
+               close(prn);\r
+               tr=trans->first;\r
+               while(tr!=NULL){\r
+                       free(tr);\r
+                       tr=tr->next;\r
+               }\r
+               trans->first=(struct Transaction*) malloc(sizeof(struct Transaction));\r
+               trans->first->next=NULL;\r
+               trans->first->barcode[0]=0;\r
+               trans->first->stuks=0;\r
+               trans->first->prijs=0;\r
+\r
+       }\r
+\r
+       if(act->action==0x101f){\r
+               struct Transaction* tr=trans->first;\r
+               while(tr->next!=NULL)\r
+                       tr=tr->next;\r
+               trans->barcode=act->lParam & 0xff;\r
+               trans->stuks=(act->lParam>>8) & 0xff;\r
+               trans->prijs=(act->lParam>>16) & 0xff;\r
+               Component_setlabel(Component_find(this->parent,trans->barcode),"Barcode");\r
+               Component_setlabel(Component_find(this->parent,trans->stuks),"Stuks");\r
+               Component_setlabel(Component_find(this->parent,trans->prijs),"Prijs");\r
+               this->parent->paint(this->parent);\r
+               tr->next=(struct Transaction*) malloc(sizeof(struct Transaction));\r
+               tr=tr->next;\r
+               tr->next=NULL;\r
+               tr->barcode[0]=0;\r
+               tr->stuks=0;\r
+               tr->prijs=0;\r
+       }\r
+\r
+}\r
\r
diff --git a/src/gui/trans.h b/src/gui/trans.h
new file mode 100644 (file)
index 0000000..b483343
--- /dev/null
@@ -0,0 +1,16 @@
+#include <wnd.h>\r
+struct Transaction{\r
+       char barcode[14];\r
+       int stuks;\r
+       long prijs;\r
+       struct Transaction* next;\r
+};\r
+\r
+struct Global_Trans{\r
+       int barcode,stuks,prijs;\r
+       struct Transaction* first;\r
+};\r
+\r
+void Transaction_init();\r
+void Transaction_handler(struct Component* this);\r
\r
diff --git a/src/gui/trans.rel b/src/gui/trans.rel
new file mode 100644 (file)
index 0000000..0fc49de
--- /dev/null
@@ -0,0 +1,638 @@
+XL4\r
+H 4 areas 1D global symbols\r
+M trans\r
+S ?L_MUL_L03 Ref00000000\r
+S sprintf Ref00000000\r
+S ?BANK_FAST_LEAVE_L08 Ref00000000\r
+S _write Ref00000000\r
+S Component_find Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
+S close Ref00000000\r
+S strlen Ref00000000\r
+S ioctl Ref00000000\r
+S ?L_ADDASG_L03 Ref00000000\r
+S free Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S strcpy Ref00000000\r
+S ?S_S_SWITCH_L06 Ref00000000\r
+S ?SL_MOD_L03 Ref00000000\r
+S ?ENT_AUTO_DIRECT_L09 Ref00000000\r
+S atoi Ref00000000\r
+S ?SL_DIV_L03 Ref00000000\r
+S atol Ref00000000\r
+S ?SS_CMP_L02 Ref00000000\r
+S open Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S ?SL_RSH_L03 Ref00000000\r
+S malloc Ref00000000\r
+S Component_setlabel Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 697 flags 0\r
+S Transaction_handler Def00000075\r
+S Transaction_init Def00000000\r
+A CSTR size A8 flags 0\r
+A UDATA0 size 2 flags 0\r
+S trans Def00000000\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 C5 D5 11 08 00 CD 6D 00 00 00 22\r
+R 00 00 01 00 00 0A 01 00\r
+T 09 00 00 00 00 00 00 00 01 06 00 09 E5 CD\r
+R 00 00 01 00 00 04 03 00\r
+T 11 00 00 00 6A 00 00 00 4D 44 E1 71 23 70 21\r
+R 00 00 01 00 00 04 01 00\r
+T 1A 00 00 00 06 00 ED 4B 00 00 00 00 09 56 23\r
+R 00 00 01 00 00 08 03 00\r
+T 23 00 00 00 66 6A 11 14 00 19 AF 77 23 77 21\r
+R 00 00 01 00\r
+T 2E 00 00 00 06 00 ED 4B 00 00 00 00 09 7E 23\r
+R 00 00 01 00 00 08 03 00\r
+T 37 00 00 00 66 6F 72 21 06 00 ED 4B\r
+R 00 00 01 00\r
+T 3F 00 00 00 00 00 00 00 09 56 23 66 6A 11\r
+R 00 00 01 00 00 04 03 00\r
+T 47 00 00 00 0E 00 19 AF 77 23 77 21 06 00 ED\r
+R 00 00 01 00\r
+T 52 00 00 00 4B 00 00 00 00 09 46 23 66 68 01\r
+R 00 00 01 00 00 05 03 00\r
+T 5B 00 00 00 10 00 09 77 23 77 23 77 23 77 D1\r
+R 00 00 01 00\r
+T 66 00 00 00 C1 C3 00 00 00 00\r
+R 00 00 01 00 02 06 02 00\r
+T 6A 00 00 00\r
+R 00 00 01 00\r
+T 6A 00 00 00 11 16 00\r
+R 00 00 01 00\r
+T 6D 00 00 00\r
+R 00 00 01 00\r
+T 6D 00 00 00 3E 00 00 00 00 21 00 00 00 00 C3\r
+R 00 00 01 00 2B 05 17 00 02 0A 17 00\r
+T 73 00 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 75 00 00 00\r
+R 00 00 01 00\r
+T 75 00 00 00 CD 00 00 00 00 9E FF FD E5 21\r
+R 00 00 01 00 02 05 0F 00\r
+T 7D 00 00 00 26 00 DD 4E 02 DD 46 03 09 46 DD\r
+R 00 00 01 00\r
+T 88 00 00 00 70 9E 23 66 DD 74 9F 2A\r
+R 00 00 01 00\r
+T 90 00 00 00 00 00 00 00 7D B4 20 08\r
+R 00 00 01 00 00 04 03 00\r
+T 96 00 00 00\r
+R 00 00 01 00\r
+T 96 00 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 9C 00 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 9E 00 00 00\r
+R 00 00 01 00\r
+T 9E 00 00 00 68 DD 66 9F 23 23 23 3E 10 23 AE\r
+R 00 00 01 00\r
+T A9 00 00 00 2B B6 20 64\r
+R 00 00 01 00\r
+T AD 00 00 00\r
+R 00 00 01 00\r
+T AD 00 00 00 21 07 00 48 DD 46 9F 09 6E 67 E5\r
+R 00 00 01 00\r
+T B8 00 00 00 2A 00 00 00 00 C1 71 23 70 2A\r
+R 00 00 01 00 00 05 03 00\r
+T C0 00 00 00 00 00 00 00 23 23 E5 CD\r
+R 00 00 01 00 00 04 03 00\r
+T C6 00 00 00 D7 05 00 00 E1 71 23 70 21 04 00\r
+R 00 00 01 00 00 04 01 00\r
+T CF 00 00 00 ED 4B 00 00 00 00 09 E5 21 07 00\r
+R 00 00 01 00 00 06 03 00\r
+T D8 00 00 00 DD 5E 9E DD 56 9F 19 5E 23 56 23\r
+R 00 00 01 00\r
+T E3 00 00 00 4E 23 46 EB 3E 10 CD EB 05 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T EC 00 00 00 E1 71 23 70 2A 00 00 00 00 4E 23\r
+R 00 00 01 00 00 09 03 00\r
+T F5 00 00 00 46 DD 5E 02 DD 56 03 CD\r
+R 00 00 01 00\r
+T FD 00 00 00 12 06 00 00 DD 5E 02 DD 56 03 CD\r
+R 00 00 01 00 00 04 01 00\r
+T 06 01 00 00 F2 05 00 00 DD 5E 02 DD 56 03 CD\r
+R 00 00 01 00 00 04 01 00\r
+T 0F 01 00 00 2F 06 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 11 01 00 00\r
+R 00 00 01 00\r
+T 11 01 00 00 DD 6E 9E DD 66 9F 23 23 23 46 23\r
+R 00 00 01 00\r
+T 1C 01 00 00 66 68 01 10 90 3E 80 AC 67 ED 42\r
+R 00 00 01 00\r
+T 27 01 00 00 DA 56 02 00 00 DD 6E 9E DD 66 9F\r
+R 00 00 01 00 00 05 01 00\r
+T 30 01 00 00 23 23 23 4E 23 46 21 12 10 CD\r
+R 00 00 01 00\r
+T 3A 01 00 00 00 00 00 00 DA 56 02 00 00\r
+R 00 00 01 00 02 04 13 00 00 09 01 00\r
+T 3F 01 00 00\r
+R 00 00 01 00\r
+T 3F 01 00 00\r
+R 00 00 01 00\r
+T 3F 01 00 00\r
+R 00 00 01 00\r
+T 3F 01 00 00 21 06 00 ED 4B 00 00 00 00 09 46\r
+R 00 00 01 00 00 09 03 00\r
+T 48 01 00 00 23 66 68\r
+R 00 00 01 00\r
+T 4B 01 00 00\r
+R 00 00 01 00\r
+T 4B 01 00 00 DD 75 A2 DD 74 A3\r
+R 00 00 01 00\r
+T 51 01 00 00\r
+R 00 00 01 00\r
+T 51 01 00 00 21 14 00 DD 4E A2 DD 46 A3 09 7E\r
+R 00 00 01 00\r
+T 5C 01 00 00 23 B6 28 0A\r
+R 00 00 01 00\r
+T 60 01 00 00\r
+R 00 00 01 00\r
+T 60 01 00 00 21 14 00 09 56 23 66 6A 18 E1\r
+R 00 00 01 00\r
+T 6A 01 00 00\r
+R 00 00 01 00\r
+T 6A 01 00 00 21 05 00 DD 4E 9E DD 46 9F 09 4E\r
+R 00 00 01 00\r
+T 75 01 00 00 23 46 21 11 00 DD 5E 02 DD 56 03\r
+R 00 00 01 00\r
+T 80 01 00 00 19 5E 23 56 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 04 00\r
+T 87 01 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 04 00 02 09 0B 00\r
+T 8E 01 00 00 A0 DD 74 A1 01 20 00 09 4E 23 46\r
+R 00 00 01 00\r
+T 99 01 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 18 00\r
+T A1 01 00 00 21 00 00 00 00 CD 00 00 00 00 01\r
+R 00 00 01 00 02 05 18 00 02 0A 0B 00\r
+T A8 01 00 00 14 00 00 00 DD 5E A0 DD 56 A1 3E\r
+R 00 00 01 00 00 04 02 00\r
+T B1 01 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 18 00 02 09 18 00\r
+T B6 01 00 00 00 00 00 00 DD 5E A0 4B DD 56 A1\r
+R 00 00 01 00 02 04 0B 00\r
+T BF 01 00 00 CD 43 06 00 00 DD 6E 9E DD 66 9F\r
+R 00 00 01 00 00 05 01 00\r
+T C8 01 00 00 23 23 23 5E 23 56 CD 00 00 00 00\r
+R 00 00 01 00 02 0B 0D 00\r
+T D1 01 00 00 10 10 03 00 4C 02 00 00\r
+R 00 00 01 00 00 08 01 00\r
+T D7 01 00 00 DD 01 00 00 FA 01 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T DB 01 00 00 1F 02 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T DD 01 00 00\r
+R 00 00 01 00\r
+T DD 01 00 00 21 20 00 DD 4E 02 DD 46 03 09 4E\r
+R 00 00 01 00\r
+T E8 01 00 00 23 46 DD 5E A2 DD 56 A3 3E\r
+R 00 00 01 00\r
+T F1 01 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0C 00 02 09 0C 00\r
+T F6 01 00 00 00 00 00 00 18 52\r
+R 00 00 01 00 02 04 0B 00\r
+T FA 01 00 00\r
+R 00 00 01 00\r
+T FA 01 00 00 21 0E 00 DD 4E A2 DD 46 A3 09 E5\r
+R 00 00 01 00\r
+T 05 02 00 00 21 20 00 DD 4E 02 DD 46 03 09 5E\r
+R 00 00 01 00\r
+T 10 02 00 00 23 56 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 10 00\r
+T 15 02 00 00 00 00 00 00 CD 00 00 00 00 4D 44\r
+R 00 00 01 00 02 04 10 00 02 09 0B 00\r
+T 1C 02 00 00 E1 18 2A\r
+R 00 00 01 00\r
+T 1F 02 00 00\r
+R 00 00 01 00\r
+T 1F 02 00 00 21 20 00 DD 4E 02 DD 46 03 09 5E\r
+R 00 00 01 00\r
+T 2A 02 00 00 23 56 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 12 00\r
+T 2F 02 00 00 00 00 00 00 CD 00 00 00 00 7C 07\r
+R 00 00 01 00 02 04 12 00 02 09 0B 00\r
+T 36 02 00 00 9F 4F 41 E5 21 10 00 DD 5E A2 DD\r
+R 00 00 01 00\r
+T 41 02 00 00 56 A3 19 D1 73 23 72 23\r
+R 00 00 01 00\r
+T 49 02 00 00\r
+R 00 00 01 00\r
+T 49 02 00 00 71 23 70\r
+R 00 00 01 00\r
+T 4C 02 00 00\r
+R 00 00 01 00\r
+T 4C 02 00 00 DD 5E 02 4B DD 56 03 CD\r
+R 00 00 01 00\r
+T 54 02 00 00 43 06 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 56 02 00 00\r
+R 00 00 01 00\r
+T 56 02 00 00 DD 6E 9E DD 66 9F 23 23 23 46 23\r
+R 00 00 01 00\r
+T 61 02 00 00 66 68 01 1E 10 A7 ED 42 C2\r
+R 00 00 01 00\r
+T 6A 02 00 00 B3 04 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 6C 02 00 00\r
+R 00 00 01 00\r
+T 6C 02 00 00 AF DD 77 AC DD 77 AD DD 77 AE DD\r
+R 00 00 01 00\r
+T 77 02 00 00 77 AF 21 06 00 ED 4B 00 00 00 00\r
+R 00 00 01 00 00 0B 03 00\r
+T 80 02 00 00 09 46 23 66 68 E5 FD E1 21 01 00\r
+R 00 00 01 00\r
+T 8B 02 00 00 E5 21 15 00 00 00 E5 3E\r
+R 00 00 01 00 00 06 02 00\r
+T 91 02 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 14 00 02 09 14 00\r
+T 96 02 00 00 00 00 00 00 F1 F1 DD 75 A0 DD 74\r
+R 00 00 01 00 02 04 0B 00\r
+T 9F 02 00 00 A1 21 08 00 39 E5 21 00 00 E5 DD\r
+R 00 00 01 00\r
+T AA 02 00 00 6E A0 DD 66 A1 E5 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 08 00\r
+T B2 02 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 08 00 02 0A 0B 00\r
+T B9 02 00 00 F1 F1 DD 36 A8 60 DD 36 A9 00 21\r
+R 00 00 01 00\r
+T C4 02 00 00 08 00 39 E5 21 01 00 E5 DD 6E A0\r
+R 00 00 01 00\r
+T CF 02 00 00 DD 66 A1 E5 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 08 00\r
+T D6 02 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 0B 00\r
+T DD 02 00 00 F1\r
+R 00 00 01 00\r
+T DE 02 00 00\r
+R 00 00 01 00\r
+T DE 02 00 00 FD E5 E1 7D B4 CA C8 03 00 00\r
+R 00 00 01 00 00 0A 01 00\r
+T E6 02 00 00\r
+R 00 00 01 00\r
+T E6 02 00 00 FD 7E 0E FD B6 0F CA BC 03 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T EF 02 00 00\r
+R 00 00 01 00\r
+T EF 02 00 00 3E 01 FD AE 0E FD B6 0F 20 29\r
+R 00 00 01 00\r
+T F9 02 00 00\r
+R 00 00 01 00\r
+T F9 02 00 00 6F 67 E5 2E 64 E5 CD 5A 06 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 02 03 00 00 C5 E5 6F 67 E5 2E 64 E5 CD\r
+R 00 00 01 00\r
+T 0B 03 00 00 69 06 00 00 C5 E5 FD E5 21\r
+R 00 00 01 00 00 04 01 00\r
+T 12 03 00 00 22 00 00 00 E5 21 20 00 39 E5 CD\r
+R 00 00 01 00 00 04 02 00\r
+T 1B 03 00 00 52 06 00 00 21 0E 00 18 68\r
+R 00 00 01 00 00 04 01 00\r
+T 22 03 00 00\r
+R 00 00 01 00\r
+T 22 03 00 00 21 00 00 E5 2E 64 E5 FD 6E 0E FD\r
+R 00 00 01 00\r
+T 2D 03 00 00 66 0F 7C 07 9F 4F 41 C5 E5 CD\r
+R 00 00 01 00\r
+T 37 03 00 00 78 06 00 00 CD 00 00 00 00 C5 E5\r
+R 00 00 01 00 00 04 01 00 02 09 0E 00\r
+T 3E 03 00 00 21 00 00 E5 2E 64 E5 FD 6E 0E FD\r
+R 00 00 01 00\r
+T 49 03 00 00 66 0F 7C 07 9F 4F 41 C5 E5 CD\r
+R 00 00 01 00\r
+T 53 03 00 00 78 06 00 00 CD 00 00 00 00 C5 E5\r
+R 00 00 01 00 00 04 01 00 02 09 11 00\r
+T 5A 03 00 00 21 00 00 E5 2E 64 E5 CD\r
+R 00 00 01 00\r
+T 62 03 00 00 5A 06 00 00 C5 E5 21 00 00 E5 2E\r
+R 00 00 01 00 00 04 01 00\r
+T 6B 03 00 00 64 E5 CD 69 06 00 00 C5 E5 FD 6E\r
+R 00 00 01 00 00 07 01 00\r
+T 74 03 00 00 0E FD 66 0F E5 FD E5 21\r
+R 00 00 01 00\r
+T 7C 03 00 00 45 00 00 00 E5 21 2A 00 39 E5 CD\r
+R 00 00 01 00 00 04 02 00\r
+T 85 03 00 00 52 06 00 00 21 18 00\r
+R 00 00 01 00 00 04 01 00\r
+T 8A 03 00 00\r
+R 00 00 01 00\r
+T 8A 03 00 00 39 F9\r
+R 00 00 01 00\r
+T 8C 03 00 00\r
+R 00 00 01 00\r
+T 8C 03 00 00 21 10 00 39 E5 FD 5E 0E FD 56 0F\r
+R 00 00 01 00\r
+T 97 03 00 00 7A 07 9F 4F 41 C5 D5 CD\r
+R 00 00 01 00\r
+T 9F 03 00 00 78 06 00 00 EB E1 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 0B 09 00\r
+T A6 03 00 00 21 14 00 39 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 07 00\r
+T AE 03 00 00 00 00 00 00 CD 00 00 00 00 E5 21\r
+R 00 00 01 00 02 04 07 00 02 09 0B 00\r
+T B5 03 00 00 16 00 39 CD 87 06 00 00 F1\r
+R 00 00 01 00 00 08 01 00\r
+T BC 03 00 00\r
+R 00 00 01 00\r
+T BC 03 00 00 FD 6E 14 FD 66 15 E5 FD E1 C3\r
+R 00 00 01 00\r
+T C6 03 00 00 DE 02 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T C8 03 00 00\r
+R 00 00 01 00\r
+T C8 03 00 00 6F 67 E5 2E 64 E5 DD 4E AE DD 46\r
+R 00 00 01 00\r
+T D3 03 00 00 AF DD 6E AC DD 66 AD CD\r
+R 00 00 01 00\r
+T DB 03 00 00 00 00 00 00 C5 E5 6F 67 E5 2E 64\r
+R 00 00 01 00 02 04 0E 00\r
+T E4 03 00 00 E5 DD 4E AE DD 46 AF DD 6E AC DD\r
+R 00 00 01 00\r
+T EF 03 00 00 66 AD CD 00 00 00 00 C5 E5 21\r
+R 00 00 01 00 02 07 11 00\r
+T F7 03 00 00 14 00 00 00 E5 E5 21 85 00 00 00\r
+R 00 00 01 00 00 04 02 00 00 0B 02 00\r
+T FE 03 00 00 E5 21 22 00 39 E5 CD 52 06 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 07 04 00 00 21 10 00 39 F9 21 14 00 39 EB 3E\r
+R 00 00 01 00\r
+T 12 04 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 07 00 02 09 07 00\r
+T 17 04 00 00 00 00 00 00 E5 21 16 00 39 CD\r
+R 00 00 01 00 02 04 0B 00\r
+T 1F 04 00 00 87 06 00 00 F1 DD 5E A0 DD 56 A1\r
+R 00 00 01 00 00 04 01 00\r
+T 28 04 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 06 00 02 0A 06 00\r
+T 2E 04 00 00 00 00 00 00 21 06 00 ED 4B\r
+R 00 00 01 00 02 04 0B 00\r
+T 35 04 00 00 00 00 00 00 09 46 23 66 68\r
+R 00 00 01 00 00 04 03 00\r
+T 3C 04 00 00\r
+R 00 00 01 00\r
+T 3C 04 00 00 E5 FD E1\r
+R 00 00 01 00\r
+T 3F 04 00 00\r
+R 00 00 01 00\r
+T 3F 04 00 00 7D B4 28 13\r
+R 00 00 01 00\r
+T 43 04 00 00\r
+R 00 00 01 00\r
+T 43 04 00 00 FD E5 D1 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 0A 00\r
+T 49 04 00 00 00 00 00 00 CD 00 00 00 00 FD 6E\r
+R 00 00 01 00 02 04 0A 00 02 09 0B 00\r
+T 50 04 00 00 14 FD 66 15 18 E6\r
+R 00 00 01 00\r
+T 56 04 00 00\r
+R 00 00 01 00\r
+T 56 04 00 00 21 06 00 ED 4B 00 00 00 00 09 E5\r
+R 00 00 01 00 00 09 03 00\r
+T 5F 04 00 00 CD 6A 00 00 00 EB E1 73 23 72 21\r
+R 00 00 01 00 00 05 01 00\r
+T 68 04 00 00 06 00 ED 4B 00 00 00 00 09 56 23\r
+R 00 00 01 00 00 08 03 00\r
+T 71 04 00 00 66 6A 11 14 00 19 AF 77 23 77 21\r
+R 00 00 01 00\r
+T 7C 04 00 00 06 00 ED 4B 00 00 00 00 09 7E 23\r
+R 00 00 01 00 00 08 03 00\r
+T 85 04 00 00 66 6F 72 21 06 00 ED 4B\r
+R 00 00 01 00\r
+T 8D 04 00 00 00 00 00 00 09 56 23 66 6A 11\r
+R 00 00 01 00 00 04 03 00\r
+T 95 04 00 00 0E 00 19 AF 77 23 77 21 06 00 ED\r
+R 00 00 01 00\r
+T A0 04 00 00 4B 00 00 00 00 09 46 23 66 68 01\r
+R 00 00 01 00 00 05 03 00\r
+T A9 04 00 00 10 00 09 77 23 77 23 77 23 77\r
+R 00 00 01 00\r
+T B3 04 00 00\r
+R 00 00 01 00\r
+T B3 04 00 00 DD 6E 9E DD 66 9F 23 23 23 46 23\r
+R 00 00 01 00\r
+T BE 04 00 00 66 68 01 1F 10 A7 ED 42 C2\r
+R 00 00 01 00\r
+T C7 04 00 00 D2 05 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T C9 04 00 00\r
+R 00 00 01 00\r
+T C9 04 00 00 21 06 00 ED 4B 00 00 00 00 09 46\r
+R 00 00 01 00 00 09 03 00\r
+T D2 04 00 00 23 66 68\r
+R 00 00 01 00\r
+T D5 04 00 00\r
+R 00 00 01 00\r
+T D5 04 00 00 DD 75 A0 DD 74 A1\r
+R 00 00 01 00\r
+T DB 04 00 00\r
+R 00 00 01 00\r
+T DB 04 00 00 21 14 00 DD 4E A0 DD 46 A1 09 7E\r
+R 00 00 01 00\r
+T E6 04 00 00 23 B6 28 0A\r
+R 00 00 01 00\r
+T EA 04 00 00\r
+R 00 00 01 00\r
+T EA 04 00 00 21 14 00 09 56 23 66 6A 18 E1\r
+R 00 00 01 00\r
+T F4 04 00 00\r
+R 00 00 01 00\r
+T F4 04 00 00 21 07 00 DD 4E 9E DD 46 9F 09 6E\r
+R 00 00 01 00\r
+T FF 04 00 00 67 E5 2A 00 00 00 00 C1 71 23 70\r
+R 00 00 01 00 00 07 03 00\r
+T 08 05 00 00 2A 00 00 00 00 23 23 E5 CD\r
+R 00 00 01 00 00 05 03 00\r
+T 0F 05 00 00 D7 05 00 00 E1 71 23 70 21 04 00\r
+R 00 00 01 00 00 04 01 00\r
+T 18 05 00 00 ED 4B 00 00 00 00 09 E5 21 07 00\r
+R 00 00 01 00 00 06 03 00\r
+T 21 05 00 00 DD 5E 9E DD 56 9F 19 5E 23 56 23\r
+R 00 00 01 00\r
+T 2C 05 00 00 4E 23 46 EB 3E 10 CD EB 05 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 35 05 00 00 E1 71 23 70 2A 00 00 00 00 4E 23\r
+R 00 00 01 00 00 09 03 00\r
+T 3E 05 00 00 46 21 11 00 DD 5E 02 DD 56 03 19\r
+R 00 00 01 00\r
+T 49 05 00 00 5E 23 56 CD 12 06 00 00 21 11 00\r
+R 00 00 01 00 00 08 01 00\r
+T 52 05 00 00 DD 5E 02 DD 56 03 19 5E 23 56 CD\r
+R 00 00 01 00\r
+T 5D 05 00 00 F2 05 00 00 21 11 00 DD 5E 02 DD\r
+R 00 00 01 00 00 04 01 00\r
+T 66 05 00 00 56 03 19 5E 23 56 CD 2F 06 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 6F 05 00 00 21 11 00 DD 4E 02 DD 46 03 09 5E\r
+R 00 00 01 00\r
+T 7A 05 00 00 23 56 21 11 00 09 46 23 66 68 01\r
+R 00 00 01 00\r
+T 85 05 00 00 1A 00 CD 47 06 00 00 21 14 00 DD\r
+R 00 00 01 00 00 07 01 00\r
+T 8E 05 00 00 4E A0 DD 46 A1 09 E5 CD\r
+R 00 00 01 00\r
+T 96 05 00 00 6A 00 00 00 EB E1 73 23 72 21\r
+R 00 00 01 00 00 04 01 00\r
+T 9E 05 00 00 14 00 09 56 23 66 6A DD 75 A0 DD\r
+R 00 00 01 00\r
+T A9 05 00 00 74 A1 01 14 00 09 AF 77 23 77 DD\r
+R 00 00 01 00\r
+T B4 05 00 00 6E A0 DD 66 A1 70 21 0E 00 DD 4E\r
+R 00 00 01 00\r
+T BF 05 00 00 A0 DD 46 A1 09 77 23 77 21 10 00\r
+R 00 00 01 00\r
+T CA 05 00 00 09 77 23 77 23 77 23 77\r
+R 00 00 01 00\r
+T D2 05 00 00\r
+R 00 00 01 00\r
+T D2 05 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 05 00\r
+T D7 05 00 00\r
+R 00 00 01 00\r
+T D7 05 00 00 21 07 00 DD 4E 9E DD 46 9F 09 5E\r
+R 00 00 01 00\r
+T E2 05 00 00 23 56 23 4E 23 46 EB 3E 08\r
+R 00 00 01 00\r
+T EB 05 00 00\r
+R 00 00 01 00\r
+T EB 05 00 00 CD 00 00 00 00 06 00 4D C9\r
+R 00 00 01 00 02 05 16 00\r
+T F2 05 00 00\r
+R 00 00 01 00\r
+T F2 05 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 04 00 02 0A 04 00\r
+T F8 05 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 0B 00 2B 0A 18 00\r
+T FE 05 00 00 00 00 00 00 01 08 00 00 00 CD\r
+R 00 00 01 00 02 04 18 00 00 09 02 00\r
+T 04 06 00 00 00 00 00 00 21 04 00 ED 5B\r
+R 00 00 01 00 02 04 0B 00\r
+T 0B 06 00 00 00 00 00 00 19 4E 23 46 C9\r
+R 00 00 01 00 00 04 03 00\r
+T 12 06 00 00\r
+R 00 00 01 00\r
+T 12 06 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 04 00 02 0A 04 00\r
+T 18 06 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 0B 00 2B 0A 18 00\r
+T 1E 06 00 00 00 00 00 00 01 00 00 00 00 CD\r
+R 00 00 01 00 02 04 18 00 00 09 02 00\r
+T 24 06 00 00 00 00 00 00 2A 00 00 00 00 23 23\r
+R 00 00 01 00 02 04 0B 00 00 09 03 00\r
+T 2B 06 00 00 4E 23 46 C9\r
+R 00 00 01 00\r
+T 2F 06 00 00\r
+R 00 00 01 00\r
+T 2F 06 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 04 00 02 0A 04 00\r
+T 35 06 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 0B 00 2B 0A 18 00\r
+T 3B 06 00 00 00 00 00 00 01 0E 00 00 00 C3\r
+R 00 00 01 00 02 04 18 00 00 09 02 00\r
+T 41 06 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 43 06 00 00\r
+R 00 00 01 00\r
+T 43 06 00 00 42 21 1A 00\r
+R 00 00 01 00\r
+T 47 06 00 00\r
+R 00 00 01 00\r
+T 47 06 00 00 09 4E 23 46 23 7E 69 60 C3\r
+R 00 00 01 00\r
+T 50 06 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 52 06 00 00\r
+R 00 00 01 00\r
+T 52 06 00 00 3E 00 00 00 00 21 00 00 00 00 C3\r
+R 00 00 01 00 2B 05 01 00 02 0A 01 00\r
+T 58 06 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 5A 06 00 00\r
+R 00 00 01 00\r
+T 5A 06 00 00 FD 4E 12 FD 46 13 FD 6E 10 FD 66\r
+R 00 00 01 00\r
+T 65 06 00 00 11 C3 00 00 00 00\r
+R 00 00 01 00 02 06 0E 00\r
+T 69 06 00 00\r
+R 00 00 01 00\r
+T 69 06 00 00 FD 4E 12 FD 46 13 FD 6E 10 FD 66\r
+R 00 00 01 00\r
+T 74 06 00 00 11 C3 00 00 00 00\r
+R 00 00 01 00 02 06 11 00\r
+T 78 06 00 00\r
+R 00 00 01 00\r
+T 78 06 00 00 FD 4E 12 FD 46 13 FD 6E 10 FD 66\r
+R 00 00 01 00\r
+T 83 06 00 00 11 C3 00 00 00 00\r
+R 00 00 01 00 02 06 00 00\r
+T 87 06 00 00\r
+R 00 00 01 00\r
+T 87 06 00 00 4D 44 DD 5E A0 DD 56 A1 3E\r
+R 00 00 01 00\r
+T 90 06 00 00 00 00 00 00 21 00 00 00 00 C3\r
+R 00 00 01 00 2B 04 03 00 02 09 03 00\r
+T 95 06 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 00 00 00 00\r
+R 00 00 02 00\r
+T 00 00 00 00 42 61 72 63 6F 64 65 00\r
+R 00 00 02 00\r
+T 08 00 00 00\r
+R 00 00 02 00\r
+T 08 00 00 00 53 74 75 6B 73 00\r
+R 00 00 02 00\r
+T 0E 00 00 00\r
+R 00 00 02 00\r
+T 0E 00 00 00 50 72 69 6A 73 00\r
+R 00 00 02 00\r
+T 14 00 00 00\r
+R 00 00 02 00\r
+T 14 00 00 00 00\r
+R 00 00 02 00\r
+T 15 00 00 00\r
+R 00 00 02 00\r
+T 15 00 00 00 2F 64 65 76 2F 70 72 69 6E 74 65\r
+R 00 00 02 00\r
+T 20 00 00 00 72 00\r
+R 00 00 02 00\r
+T 22 00 00 00\r
+R 00 00 02 00\r
+T 22 00 00 00 25 31 33 73 20 56 65 72 6B 6F 6F\r
+R 00 00 02 00\r
+T 2D 00 00 00 70 61 72 74 69 6B 65 6C 20 20 7C\r
+R 00 00 02 00\r
+T 38 00 00 00 25 37 6C 64 2C 25 30 32 6C 64 0D\r
+R 00 00 02 00\r
+T 43 00 00 00 0A 00\r
+R 00 00 02 00\r
+T 45 00 00 00\r
+R 00 00 02 00\r
+T 45 00 00 00 25 31 33 73 20 56 65 72 6B 6F 6F\r
+R 00 00 02 00\r
+T 50 00 00 00 70 61 72 74 69 6B 65 6C 0D 0A 25\r
+R 00 00 02 00\r
+T 5B 00 00 00 34 64 78 20 40 20 7C 20 25 37 6C\r
+R 00 00 02 00\r
+T 66 00 00 00 64 2C 25 30 32 6C 64 20 20 20 20\r
+R 00 00 02 00\r
+T 71 00 00 00 20 20 20 20 20 20 7C 25 37 6C 64\r
+R 00 00 02 00\r
+T 7C 00 00 00 2C 25 30 32 6C 64 0D 0A 00\r
+R 00 00 02 00\r
+T 85 00 00 00\r
+R 00 00 02 00\r
+T 85 00 00 00 0D 0A 25 31 33 73 54 6F 74 61 61\r
+R 00 00 02 00\r
+T 90 00 00 00 6C 3A 25 31 30 73 7C 25 37 6C 64\r
+R 00 00 02 00\r
+T 9B 00 00 00 2C 25 30 32 6C 64 0D 0A 0D 0A 0D\r
+R 00 00 02 00\r
+T A6 00 00 00 0A 00\r
+R 00 00 02 00\r
+T 00 00 00 00\r
+R 00 00 03 00\r
+T 00 00 00 00\r
+R 00 00 03 00\r
diff --git a/src/gui/wnd.c b/src/gui/wnd.c
new file mode 100644 (file)
index 0000000..bb795a9
--- /dev/null
@@ -0,0 +1,1141 @@
+/************************************************\r
+ * Graphical User Interface driver (GUI)        *\r
+ * By J.W. Morsink for Retail Vision B.V.       *\r
+ ************************************************/\r
+\r
+#include <wnd.h>\r
+#include "..\libc\malloc-l.h"\r
+#undef NULL\r
+#define NULL   0\r
+\r
+/*void *malloc(size_t size)\r
+  {\r
+  void *ptr;\r
+\r
+  ptr = (void *)sbrk(size);\r
+  return (ptr == (void *)-1) ? NULL : ptr;\r
+  }\r
+\r
+void free(void *ptr)\r
+  {\r
+  }\r
+\r
+*/\r
+/*#define JOOST_DEBUG\r
+/*#define STR_DEBUG*/\r
+/*#define MALLOC_DEBUG\r
+\r
+/************************************************\r
+ * Global variables for GUI                     *\r
+ ************************************************/\r
+\r
+struct Global_GUI* global;\r
+\r
+/************************************************\r
+ * Graphics                                     *\r
+ ************************************************/\r
+\r
+void GraphicsOpen(){\r
+       struct sgttyb temp;\r
+       char init[]={0x1B,'K'};\r
+\r
+       global->lcd=open("/dev/lcd0",O_RDWR);\r
+       gtty(global->lcd,&temp);\r
+       temp.sg_flags=RAW | UNBUFF;\r
+       stty(global->lcd,&temp);\r
+\r
+       write(global->lcd,init,2);\r
+}\r
+\r
+void GraphicsClose(){\r
+       close(global->lcd);\r
+}\r
+\r
+void Move(int x, int y){\r
+       unsigned char cmd[]={0x1B,'S',0,0};\r
+       cmd[2]=(unsigned char) (x);\r
+       cmd[3]=(unsigned char) (y);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void ClearRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'C',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void DrawRectNC(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'N',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void FillRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'R',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void FillRectNC(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'F',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void GrayRect(int sx,int sy){\r
+       unsigned char cmd[]={0x1B,'h',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(global->lcd,cmd,4);\r
+}\r
+\r
+void Text(char *s){\r
+       int c=strlen(s);\r
+       write(global->lcd,s,c);\r
+}\r
+\r
+void TouchRegion(int msg, int x, int y, int sx, int sy){\r
+       char touch[]={0x1B,'Z',0,0,0,0,0};\r
+       touch[2]=(unsigned char) (msg);\r
+       touch[3]=(unsigned char) (x);\r
+       touch[4]=(unsigned char) (y);\r
+       touch[5]=(unsigned char) (sx);\r
+       touch[6]=(unsigned char) (sy);\r
+       write(global->lcd,touch,7);\r
+#ifdef JOOST_DEBUG\r
+       printf("Touch: %x,%x,%x,%x,%x\n",msg,x,y,sx,sy); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void ClearScreen(){\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       TouchRegion(0,0,0,0,0x80);\r
+}\r
+\r
+void EnableScreen(unsigned char c){\r
+       char cmd[]={0x1B,'E',0};\r
+       cmd[2]=c;\r
+       write(global->lcd,cmd,3);\r
+}\r
+\r
+void grSetFont(int f){\r
+       char cmd[]={0x1B,0};\r
+       cmd[1]=f & 0xff;\r
+       write(global->lcd,cmd,2);\r
+}\r
+\r
+/************************************************\r
+ * Fonts                                        *\r
+ ************************************************/\r
+\r
+struct Font* fontSearch(int f){\r
+       struct Font* current=global->firstfont;\r
+       while(current!=NULL && current->id!=f)\r
+               current=current->nextfont;\r
+       return current;\r
+}\r
+\r
+void setCurrentFont(int f){\r
+       if(fontSearch(f)!=NULL){\r
+               grSetFont(f);\r
+               global->currentfont=fontSearch(f);\r
+       }\r
+}\r
+\r
+void loadFont(int id,int (*sw)(char*),int (*sh)(char*),int sizedata, void* data){\r
+       struct Font* font=(struct Font*) malloc(sizeof(struct Font));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",font); fflush(stdout);\r
+#endif\r
+       font->id=id;\r
+       font->stringwidth=sw;\r
+       font->stringheight=sh;\r
+       font->nextfont=NULL;\r
+       font->sizefontdata=sizedata;\r
+       font->fontdata=data;\r
+       if(global->firstfont==NULL){\r
+               global->firstfont=font;\r
+               global->currentfont=font;\r
+       }\r
+       else\r
+       {\r
+               struct Font* current=global->firstfont;\r
+               while(current->nextfont!=NULL)\r
+                       current=current->nextfont;\r
+               current->nextfont=font;\r
+       }\r
+}\r
+\r
+int stringwidth(char *str,int extra){\r
+       int w=0,i=0;\r
+       while(str[i]!=0x00){\r
+               switch(str[i]){\r
+               case 'i':\r
+               case 'I':\r
+               case '!':\r
+                       w+=2;\r
+                       break;\r
+               case 'l':\r
+                       w+=3;\r
+                       break;\r
+               case ',':\r
+               case '1':\r
+               case '.':\r
+                       w+=4;\r
+                       break;\r
+               case 'r':\r
+               case 'k':\r
+               case 'j':\r
+                       w+=5;\r
+                       break;\r
+               default:\r
+                       w+=6;\r
+               }\r
+               i++;\r
+               w+=extra;\r
+       }\r
+       return w;\r
+}\r
+\r
+int stringheight(char ch, int extra){\r
+       if(ch<0x80) return 7+extra;\r
+       if(ch>=0xcc && ch<=0xdf) return 1+extra;\r
+}\r
+\r
+int stringheight01(char* ch){\r
+       return stringheight(ch[0],0);\r
+}\r
+\r
+int stringheight2(char* ch){\r
+       return stringheight(ch[0],5);\r
+}\r
+\r
+int stringwidth0(char *str){\r
+       return stringwidth(str,0);\r
+}\r
+\r
+int stringwidth1(char *str){\r
+       return stringwidth(str,2);\r
+}\r
+\r
+int stringwidth2(char *str){\r
+       return stringwidth(str,3);\r
+}\r
+/************************************************\r
+ * Components                                   *\r
+ ************************************************/\r
+\r
+struct Component* Component_new(int x,int y,int sx,int sy){\r
+       struct Component* this=(struct Component*) (malloc(sizeof(struct Component)));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",this); fflush(stdout);\r
+#endif\r
+\r
+       this->id=(++global->id);\r
+       this->x=x;\r
+       this->y=y;\r
+       this->sizex=sx;\r
+       this->sizey=sy;\r
+       this->state=0;\r
+       this->order=0;\r
+       this->font=0;\r
+       this->msg=0;\r
+       this->parent=NULL;\r
+       this->next_sibling=NULL;\r
+       this->first_child=NULL;\r
+       this->handler=NULL;\r
+       this->paint=NULL;\r
+       this->add=NULL;\r
+       this->sizexds=0;\r
+       this->xds=NULL;\r
+       this->label=NULL;\r
+       this->label2=NULL;\r
+       return this;\r
+}\r
+\r
+void Component_setlabel(struct Component* this, char* s){\r
+       int i=0;\r
+       while(s[i]!=0 && i<LABEL_LENGTH){\r
+               this->label[i]=s[i];\r
+               i++;\r
+       }\r
+       this->label[i]=0;\r
+}\r
+\r
+void Component_add(struct Component* this, struct Component* comp){\r
+       struct Component* current=this->first_child;\r
+       if(this->first_child==NULL){\r
+               this->first_child=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       else\r
+       {\r
+               while(current->next_sibling!=NULL){\r
+                       current=current->next_sibling;\r
+               }\r
+               current->next_sibling=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       comp->parent=this;\r
+}\r
+\r
+void Component_paint(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       EnableScreen(0);\r
+       while(current!=NULL){\r
+               current->paint(current);\r
+               current=current->next_sibling;\r
+       }\r
+       EnableScreen(1);\r
+}\r
+\r
+void Component_findXY(struct Component* this, int* x, int* y){\r
+    struct Component* current=this;\r
+    do{\r
+        *x+=current->x;\r
+        *y+=current->y;\r
+        current=current->parent;\r
+    } while(current!=NULL);\r
+}\r
+\r
+struct Component* Component_find(struct Component* this, int msg){\r
+       struct Component* current=this->first_child;\r
+#ifdef JOOST_DEBUG\r
+       printf("Find %x in %x:\n",msg, this->id); fflush(stdout);\r
+#endif\r
+       while(current!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Comp_find: %x, %x\n",msg, current->msg); fflush(stdout);\r
+#endif\r
+               if(current->msg==msg)\r
+                       return current;\r
+               current=current->next_sibling;\r
+       }\r
+       return NULL;\r
+}\r
+\r
+struct Component* Component_delete(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       int id=this->id;\r
+       if(this!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleting component: %d\n",id); fflush(stdout);\r
+#endif\r
+               while(current!=NULL){\r
+                       current=Component_delete(current);\r
+               }\r
+               if(this->parent!=NULL){\r
+                       if(this==this->parent->first_child)\r
+                               this->parent->first_child=this->parent->first_child->next_sibling;\r
+                       else{\r
+                               current=this->parent->first_child;\r
+                               while(this!=current->next_sibling && current->next_sibling!=NULL)\r
+                                       current=current->next_sibling;\r
+                               if(current->next_sibling!=NULL)\r
+                                       current->next_sibling=current->next_sibling->next_sibling;\r
+                       }\r
+               }       \r
+               current=this->next_sibling;\r
+               if(this->sizexds==sizeof(struct StringTableXDS))\r
+               {\r
+                       struct Component* par=this->parent;\r
+                       struct StringTableXDS* stx=(struct StringTableXDS*) this->xds;\r
+                       \r
+#ifdef STR_DEBUG\r
+                       printf("Stringtable @ %x freed!\n",stx->stringtabledata); fflush(stdout);\r
+#endif\r
+\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",stx->stringtabledata); fflush(stdout);\r
+#endif\r
+                       free(stx->stringtabledata);\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",stx->stringtable); fflush(stdout);\r
+#endif\r
+                       free(stx->stringtable);\r
+\r
+                       while((par!=NULL) && (par->sizexds!=sizeof(struct StringTableXDS)))\r
+                               par=par->parent;\r
+                       if(par!=NULL)\r
+                       {\r
+                               stx=(struct StringTableXDS*) par->xds;\r
+                               global->stringtabledata=stx->stringtabledata;\r
+                               global->stringtable=stx->stringtable;\r
+                       }               \r
+               }\r
+               if(this->sizexds>0){\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",this->xds); fflush(stdout);\r
+#endif\r
+                       free(this->xds);\r
+               }\r
+               if((this->state & STRING_FROMTABLE)==0  && this->label!=NULL){\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",this->label); fflush(stdout);\r
+#endif\r
+                       free(this->label);\r
+               }\r
+#ifdef MALLOC_DEBUG\r
+       printf("free: %x\n",this); fflush(stdout);\r
+#endif\r
+\r
+               free(this);\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleted component: %d\n",id); fflush(stdout);\r
+#endif\r
+       }\r
+       return current;\r
+}\r
+\r
+void Component_delete_children(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL)\r
+               current=Component_delete(current);\r
+}\r
+\r
+void Component_changestate_children(struct Component* this, int andmask, int ormask, int xormask){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL){\r
+               current->state&=(0xffff-andmask);\r
+               current->state|=ormask;\r
+               current->state^=xormask;\r
+               current=current->next_sibling;\r
+       }\r
+       fflush(stdout);\r
+}\r
+\r
+void Component_linkstringtable(struct Component* this){\r
+       struct Component* child=this->first_child;\r
+#ifdef STR_DEBUG\r
+       printf("%d: %x -> %x\n",this->id,this->label-1,global->stringtable[(int) (this->label)-1]); fflush(stdout);\r
+#endif\r
+       if(((int)(this->label))<0x1000 && ((int)(this->label))>0)\r
+               this->label=global->stringtable[(int) (this->label)-1];\r
+       if(((int)(this->label2))<0x1000 && ((int)(this->label2))>0)\r
+               this->label2=global->stringtable[(int) (this->label2)-1];\r
+       while(child!=NULL){\r
+               Component_linkstringtable(child);\r
+               child=child->next_sibling;\r
+       }\r
+\r
+}\r
+\r
+/************************************************\r
+ * Windows                                      *\r
+ ************************************************/\r
+\r
+void Window_handler (struct Component* this, int msg, int param){\r
+       struct Component* current,current2;\r
+       int x=0,y=0;\r
+#ifdef JOOST_DEBUG\r
+       printf("Message in window %d, Msg: %x, Param: %x\n",this->id,msg,param); fflush(stdout);\r
+#endif\r
+       switch(msg){\r
+       case KEY_PRESSED:\r
+               current=this->first_child;\r
+               while(current!=NULL) {\r
+                       if((current->state & STATE_VISIBLE)==(STATE_VISIBLE))\r
+                               current->handler(current,msg,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       case KEY_RELEASED:\r
+               current=this->first_child;\r
+               while(current!=NULL) {\r
+                       if((current->state & STATE_VISIBLE)!=0){\r
+                               current->handler(current,msg,param);\r
+                               current->handler(current,KEY_TYPED,param);\r
+                               if((current->state & (STATE_ACTION | STATE_ENABLED))==(STATE_ACTION | STATE_ENABLED) && current->msg==param)\r
+                                       current=NULL;\r
+                       }                       \r
+                       if(current!=NULL)\r
+                               current=current->next_sibling;\r
+               }\r
+               break;\r
+       case KEY_TYPED:\r
+               current=this;\r
+               if((current->state & STATE_VISIBLE)==(STATE_VISIBLE)){\r
+                               \r
+                               if((current->state & STATE_ACTION)!=0 && current->msg==param){\r
+                                       struct ActionXDS* act=(struct ActionXDS*) (current->xds);\r
+#ifdef JOOST_DEBUG\r
+                                       printf("Before actionhandler...\n");\r
+#endif\r
+                                       act->actionhandler(current);\r
+                                       if((act->action & 0xff00)==0){                                          \r
+                                               current=NULL;\r
+                                       }\r
+#ifdef JOOST_DEBUG\r
+                                       printf("After actionhandler...\n");\r
+#endif\r
+                               }\r
+               }\r
+               if(current!=NULL)\r
+                       current=current->next_sibling;\r
+               \r
+               break;\r
+       case WND_REDRAW:\r
+               this->paint(this);\r
+               break;\r
+       case WND_CLOSE:\r
+               this->state=this->state & (0xffff-(STATE_VISIBLE | STATE_ENABLED));\r
+               Component_findXY(this,&x,&y);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               this->parent->handler(this->parent,WND_REDRAW,0);\r
+               break;\r
+       case WND_DESTROY:\r
+               current=this->parent;\r
+               Component_delete(this);\r
+               current->handler(current,WND_REDRAW,0);\r
+               break;\r
+       case WND_BROADCAST:\r
+               current=this->first_child;\r
+               while(current!=NULL){\r
+                       if(current!=(struct Component*) (param) && (current->state & STATE_FOCUS)!=0)\r
+                               current->handler(current,CMP_BROADCAST,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       case APP_QUIT:\r
+               if(this->parent==NULL)\r
+                       global->willquit=1;\r
+               else if((this->state & STATE_APPLICATION)==0)\r
+                       this->parent->handler(this->parent,APP_QUIT,param);\r
+               else{\r
+                       current=this->parent;\r
+                       current->state|=STATE_VISIBLE | STATE_ENABLED;\r
+                       Component_changestate_children(current,0,STATE_VISIBLE,0);\r
+                       this->handler(this,WND_DESTROY,0);\r
+               }\r
+               break;                  \r
+       }\r
+}\r
+\r
+void Window_paint(struct Component* this){\r
+       int x=0,y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               \r
+               EnableScreen(0);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               Move(x,y+global->currentfont->stringheight(this->label)+4);\r
+               DrawRectNC(this->sizex,this->sizey-global->currentfont->stringheight(this->label)-4);\r
+               Move(x,y);\r
+               FillRect(this->sizex,global->currentfont->stringheight(this->label)+5);\r
+               Move(x+2,y+14); /* Nick 2); */\r
+               Text(this->label);\r
+               Component_paint(this);\r
+       }\r
+}\r
+\r
+void Root_paint(struct Component* this){\r
+       EnableScreen(0);\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       GrayRect(0,0x80);\r
+       TouchRegion(0,0,0,0,0x80);\r
+\r
+       Component_paint(this);  \r
+/*     EnableScreen(0);\r
+       Window_paint(this);\r
+       EnableScreen(1);*/\r
+}\r
+\r
+void Window_add(struct Component* this, struct Component* comp){\r
+       Component_add(this,comp);\r
+}\r
+\r
+struct Component* Window_new(int x,int y,int sx,int sy){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->handler=Window_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Buttons                                      *\r
+ ************************************************/\r
+\r
+void Button_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void Button_drawtext(struct Component* this, int x, int y){\r
+       if((this->state & STYLE_MULTILINE)!=0){         \r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label))/2,y+(this->sizey-2*global->currentfont->stringheight(this->label))/2+12); /* Nick +7 */\r
+               Text(this->label);\r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label2))/2,y+(this->sizey)/2+10); /* Nick 1); */\r
+               Text(this->label2);\r
+       } else {\r
+               Move(x+(this->sizex-global->currentfont->stringwidth(this->label))/2,y+(this->sizey-global->currentfont->stringheight(this->label))/2+13); /* Nick 1); */\r
+               Text(this->label);\r
+       }               \r
+#ifdef STR_DEBUG\r
+       printf("Drawtext (%d): ""%s"" @ %x\n",this->id,this->label,this->label); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void Button_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               \r
+               if( (this->state & (STATE_ENABLED | STYLE_INVERTED))!=0 && (this->state & (STATE_ENABLED | STYLE_INVERTED))!=(STATE_ENABLED | STYLE_INVERTED) )\r
+                       FillRectNC(this->sizex,this->sizey);\r
+               else\r
+                       DrawRectNC(this->sizex,this->sizey);\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+void Button_add(struct Component* this, struct Component* comp){\r
+       return;\r
+}\r
+\r
+struct Component* Button_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_ENABLED | STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Button_handler;\r
+       this->paint=Button_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+/*void Numpad(struct Component* this, int x, int y){\r
+       int i;\r
+       char s[2]={0,0};\r
+       struct Component* button;\r
+       for(i=0; i<9; i++){\r
+               s[0]=0x31+(char) i;\r
+               button=Button_new(x+(i%3)*0x18,y+0x30-(i/3)*0x18,0x16,0x16,i+0x31);\r
+               Component_setlabel(button,s);\r
+               button->state|=STATE_CASTING;\r
+               this->add(this,button);\r
+       }\r
+       button=Button_new(x+0x18,y+0x48,0x16,0x16,0x30);\r
+       Component_setlabel(button,"0");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+\r
+       button=Button_new(x+0x30,y+0x48,0x16,0x16,0x08);\r
+       Component_setlabel(button,"CE");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+}*/\r
+\r
+/************************************************\r
+ * Toggle-buttons                               *\r
+ ************************************************/\r
+\r
+void ToggleButton_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->state^=STATE_CHECKED;\r
+               this->parent->handler(this->parent, CMP_STATECHANGE, param);\r
+               this->handler(this, WND_REDRAW, 0);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void ToggleButton_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               if((this->state & STATE_ENABLED)!=0 && (this->state & STATE_CHECKED)!=0){\r
+                       FillRectNC(this->sizex,this->sizey);\r
+                       TouchRegion(this->msg,x,y,this->sizex,this->sizey);\r
+               }else{\r
+                       DrawRectNC(this->sizex,this->sizey);\r
+                       TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               }\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+struct Component* ToggleButton_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_ENABLED | STATE_VISIBLE | STATE_CHECKED;\r
+       this->msg=msg;\r
+       this->handler=ToggleButton_handler;\r
+       this->paint=ToggleButton_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Dialogs                                      *\r
+ ************************************************/\r
+\r
+void Dialog_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==CMP_ACTION && param==0xff){\r
+               if((this->state & STYLE_SELFDESTRUCT)!=0)\r
+                       this->handler(this,WND_DESTROY,0);\r
+               else\r
+                       this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_OK, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION && param==0xfe){\r
+               if((this->state & STYLE_SELFDESTRUCT)!=0)\r
+                       this->handler(this,WND_DESTROY,0);\r
+               else\r
+                       this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_CANCEL, this->msg);\r
+\r
+       }\r
+}\r
+\r
+struct Component* Dialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* ok;\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state|=STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Dialog_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+\r
+       ok=Button_new(sx-0x30,sy-0x1c,0x28,0x14,0xff);\r
+       ok->label=(char*) malloc(3);\r
+       Component_setlabel(ok,"OK");\r
+       this->add(this,ok);\r
+\r
+       ok=Button_new(sx-0x30,sy-0x38,0x28,0x14,0xfe);  /*Cancel*/\r
+       ok->label=(char*) malloc(7);\r
+       Component_setlabel(ok,"Cancel");\r
+       this->add(this,ok);\r
+\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Displays                                     *\r
+ ************************************************/\r
+void Display_handler(struct Component* this, int msg, int param){\r
+       Button_handler(this,msg,param);\r
+       if(msg==CMP_BROADCAST && (this->state & STATE_FOCUS)!=0){\r
+#ifdef JOOST_DEBUG\r
+               printf("strlen = %d->",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               if(param==0x08){\r
+                       if(strlen(this->label)!=0)\r
+                               this->label[strlen(this->label)-1]=0;\r
+               }else{\r
+                       this->label[strlen(this->label)+1]=0;\r
+                       this->label[strlen(this->label)]=(char) param;\r
+               }       \r
+#ifdef JOOST_DEBUG\r
+               printf("%d\n",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+}\r
+\r
+void Display_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       char pwd[64];\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               \r
+               if( (this->state & STYLE_INVERTED)==0)\r
+                       FillRectNC(this->sizex,this->sizey);\r
+               else\r
+                       DrawRectNC(this->sizex,this->sizey);\r
+               Move(x+2,y+(this->sizey-global->currentfont->stringheight(this->label))/2+7);\r
+               if(this->state & STYLE_PASSWORD){\r
+                       int i;\r
+                       for(i=0; i<strlen(this->label); i++)\r
+                               pwd[i]='*';\r
+                       pwd[i]=0;\r
+                       Text(pwd);\r
+               }else\r
+                       Text(this->label);\r
+\r
+/*             Component_findXY(this,&x,&y);\r
+\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+       \r
+               FillRectNC(this->sizex,this->sizey);\r
+               Move(x+2,y+(this->sizey-global->currentfont->stringheight(this->label))/2+12); /x Nick +7 x/\r
+               Text(this->label);\r
+               TouchRegion((this->state&STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+*/\r
+       }\r
+}\r
+\r
+struct Component* Display_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Button_new(x,y,sx,sy,msg);\r
+       this->state|=STATE_FOCUS;\r
+       Component_setlabel(this,"");\r
+       this->paint=Display_paint;\r
+       this->handler=Display_handler;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Labels                                       *\r
+ ************************************************/\r
+void Label_handler(struct Component* this, int msg, int param){\r
+       return;\r
+}\r
+\r
+void Label_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       if(global->currentfont->id!=this->font)\r
+               setCurrentFont(this->font);\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Button_drawtext(this,x,y);\r
+       }\r
+}\r
+\r
+struct Component* Label_new(int x, int y, int sx, int sy,char* l){\r
+       struct Component* comp=Component_new(x,y,sx,sy);\r
+       comp->label=l;\r
+       comp->state=STATE_VISIBLE;\r
+       comp->handler=Label_handler;\r
+       comp->paint=Label_paint;\r
+       comp->add=Button_add;\r
+       return comp;\r
+}\r
+ /************************************************\r
+ * Implementation                               *\r
+ ************************************************/\r
+/*\r
+void ScreenDialog_handler(struct Component* this, int msg, int param){\r
+       char cmd[]={0x1B,'V',0};\r
+       Dialog_handler(this,msg,param);\r
+       if(msg==CMP_ACTION){\r
+               if(param=='U')\r
+                       cmd[2]=0;\r
+               else if(param=='D')\r
+                       cmd[2]=1;\r
+               else \r
+                       return;\r
+               write(global->lcd,cmd,3);\r
+       }\r
+}\r
+\r
+struct Component* ScreenDialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* button;\r
+       struct Component* this=Dialog_new(x,y,sx,sy,msg);\r
+       \r
+       button=Button_new(0x04,0x10,0x20,0x14,'U');\r
+       Component_setlabel(button,"Up");\r
+       this->add(this,button);\r
+\r
+       button=Button_new(0x04,0x28,0x20,0x14,'D');\r
+       Component_setlabel(button,"Down");\r
+       this->add(this,button);\r
+\r
+       this->handler=ScreenDialog_handler;\r
+\r
+       return this;\r
+}\r
+*/\r
+void rootWindow_handler(struct Component* this, int msg, int param){\r
+       struct Component* dummy;\r
+       Window_handler(this,msg,param);\r
+}\r
+\r
+\r
+void screenbuilder(struct Component* root, char* filename){\r
+       struct Component* subw;\r
+       struct ActionXDS* action;\r
+       int mode;               \r
+       int fh,rd;\r
+       char buf[SIZE_SCRBLD_RECORD];\r
+       long l;\r
+       int xs,ys;\r
+       xs=0x2b;\r
+       ys=0x1a;\r
+       buf[0]=0;\r
+       fh=open(filename,O_RDONLY);\r
+       do{     \r
+               char comp=0;\r
+               if(buf[0]=='s'){                /* Change size */\r
+                       xs=*((int*)(buf+0x1));\r
+                       ys=*((int*)(buf+0x3));\r
+               }\r
+\r
+               if(buf[0]=='B' || buf[0]=='M'){         /* Button, Multi-line button */\r
+                       subw=Button_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       if(buf[0]=='M') subw->state|=STYLE_MULTILINE;\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='T'){                                        /* Toggle-button */\r
+                       subw=ToggleButton_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='D'){                                        /* Display button */\r
+                       subw=Display_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf[5]);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='L'){                                        /* Label */\r
+                       subw=Label_new(buf[1]*xs,buf[2]*ys,buf[3]*xs-3,buf[4]*ys-3,buf+0x12);\r
+                       comp=1;\r
+               }\r
+               if(buf[0]=='A'){                        \r
+                       struct ActionXDS a;\r
+                       root->xds=&a;\r
+                       a.action=*((int*)(buf+0x6));\r
+                       a.wParam=*((int*)(buf+0x8));\r
+                       a.lParam=*((long*)(buf+0xa));\r
+                       root_actionhandler(root);\r
+               }\r
+                               \r
+               if(buf[0]=='S'){\r
+                       struct StringTableXDS* stx;\r
+                       read_stringtable(fh,buf);\r
+                       root->xds=(void*) malloc(sizeof(struct StringTableXDS));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",root->xds); fflush(stdout);\r
+#endif\r
+\r
+                       stx=(struct StringTableXDS*) root->xds;\r
+                       root->sizexds=sizeof(struct StringTableXDS);\r
+                       stx->stringtable=global->stringtable;\r
+                       stx->stringtabledata=global->stringtabledata;\r
+#ifdef STR_DEBUG\r
+                       printf("Stringtable created @ %x\n",stx->stringtabledata); fflush(stdout);\r
+#endif\r
+                       comp=0;\r
+               }\r
+               if(comp!=0){\r
+                       if((buf[6] | buf[7])!=0){\r
+                               subw->state|=STATE_ACTION;\r
+                               subw->sizexds=sizeof(struct ActionXDS);\r
+                               subw->xds=(void*) malloc(sizeof(struct ActionXDS));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc Action: %x\n",subw->xds); fflush(stdout);\r
+#endif\r
+\r
+                               action=(struct ActionXDS*) (subw->xds);\r
+                               action->actionhandler=root_actionhandler;\r
+                               action->action=*((int*)(buf+0x6));\r
+                               action->wParam=*((int*)(buf+0x8));\r
+                               action->lParam=*((long*)(buf+0xa));\r
+                       }\r
+                       if((buf[0x0e] | buf[0x0f])!=0) \r
+                               subw->state=*((int*)(buf+0x0e));\r
+                       subw->font=*((int*)(buf+0x10));\r
+\r
+                       subw->label=(char*) (*((int*) (buf+0x12)) & 0x0fff);\r
+                       if(subw->label==NULL) {\r
+                               subw->label=(char*) malloc(LABEL_LENGTH);\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",subw->label); fflush(stdout);\r
+#endif\r
+                               subw->label[0]=0;\r
+                       }\r
+                       else\r
+                               subw->state|=STRING_FROMTABLE;\r
+\r
+                       if((*((int*) (buf+0x12)) &0xf000)>0x1000)\r
+                               subw->label2=(char*)((*((int*) (buf+0x12)) & 0x0fff)+1);\r
+\r
+                       root->add(root,subw);\r
+               }\r
+               \r
+               rd=read(fh,buf,SIZE_SCRBLD_RECORD);\r
+       } while(rd==SIZE_SCRBLD_RECORD);\r
+       close(fh);\r
+       Component_linkstringtable(root);\r
+       root->paint(root);\r
+}\r
+\r
+void root_actionhandler(struct Component* this){\r
+       struct ActionXDS *act;\r
+       struct Component* subw;\r
+       char filename[]={'/','w','n','d','/','0','0','0','0','.','s','c','r',0}; /* Nick added /wnd/ */\r
+\r
+       act=(struct ActionXDS*) (this->xds);\r
+#ifdef JOOST_DEBUG\r
+       printf("0x%x: (0x%x, 0x%x, 0x%lx)",act, act->action, act->wParam, act->lParam);\r
+#endif\r
+       if(act->action==0x0001){                        /*QUIT*/\r
+               this->handler(this,APP_QUIT,0);\r
+       }\r
+       if((act->action & 0xfffe)==0x0002){             /*Open Screen*/\r
+               Component_changestate_children(this->parent,STATE_VISIBLE,0,0);         \r
+               subw=Window_new(0,0,this->parent->sizex,this->parent->sizey);\r
+               subw->state=STATE_VISIBLE | STATE_ENABLED;\r
+               if((act->action & 1)!=0)\r
+                       subw->state|=STATE_APPLICATION;\r
+               subw->handler=rootWindow_handler;\r
+               subw->paint=Root_paint;\r
+               filename[5]=(char) ((act->lParam) &0xff); /* Nick 5 formerly 0 */\r
+               filename[6]=(char) ((act->lParam>>8) &0xff); /* Nick 6 formerly 1 */\r
+               filename[7]=(char) ((act->lParam>>16) &0xff); /* Nick 7 formerly 2 */\r
+               filename[8]=(char) ((act->lParam>>24) &0xff); /* Nick 8 formerly 3 */\r
+               screenbuilder(subw,filename);\r
+               this->parent->add(this->parent,subw);\r
+       }\r
+       if(act->action==0x0004) {                               /* Open MessageBox */\r
+               /*Component_changestate_children(this->parent,0,0,0);*/\r
+               struct Component* label;\r
+               int i;\r
+               subw=Dialog_new(0x05,0x05,this->parent->sizex-0x0a,this->parent->sizey-0x0a,1);\r
+               subw->state=STATE_VISIBLE | STATE_ENABLED | STYLE_SELFDESTRUCT;\r
+               subw->font=0x0030;\r
+               for(i=0; i<(act->wParam>>12)&0x0f; i++){\r
+                       label=Label_new(0x08,0x14+i*0x0c,(subw->sizex & 0xff)-0x10,0x10,global->stringtable[(act->wParam&0xfff)+i-1]);\r
+                       label->font=0x0030;\r
+                       subw->add(subw,label);\r
+               }\r
+               Component_setlabel(subw,"Message Box");\r
+               Component_find(subw,0xff)->font=0x0030;\r
+               Component_delete(Component_find(subw,0xfe));\r
+               this->parent->add(this->parent,subw);\r
+               this->parent->handler(this->parent,WND_REDRAW,0);\r
+       }\r
+#ifdef JOOST_DEBUG\r
+       printf("Before external handler...\n"); fflush(stdout);\r
+#endif\r
+       if(global->actionhandler!=NULL)\r
+               global->actionhandler(this);\r
+\r
+#ifdef JOOST_DEBUG\r
+       printf("After external handler...\n"); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void read_stringtable(int fh,char* buf){\r
+       int siz,bsiz;\r
+       int i=0,j=0;\r
+       char **ptrs;\r
+       char *rawdata;\r
+\r
+       siz=*((int*) (buf+0x01));\r
+       bsiz=*((int*) (buf+0x03));\r
+#ifdef STR_DEBUG\r
+       printf("%d %d\n",siz,bsiz);\r
+#endif\r
+\r
+       ptrs=(char**) malloc(sizeof(char*)*siz);\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",ptrs); fflush(stdout);\r
+#endif\r
+\r
+       rawdata=(char*) malloc(bsiz);\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",rawdata); fflush(stdout);\r
+#endif\r
+\r
+       read(fh,rawdata,bsiz);\r
+       while(i<bsiz && j<siz){\r
+               ptrs[j++]=&(rawdata[i]);\r
+               while(rawdata[i]!=0x00)\r
+                       i++;\r
+               rawdata[i++]=0x00;\r
+       }\r
+       if(j<siz)\r
+               ptrs[j]=&(rawdata[i]);\r
+       global->stringtabledata=rawdata;\r
+       global->stringtable=ptrs;\r
+#ifdef STR_DEBUG\r
+       for(i=0; i<siz; i++)\r
+               printf("%d: %x->""%s""\n",i,global->stringtable[i],global->stringtable[i]);\r
+       fflush(stdout);\r
+#endif\r
+\r
+}\r
+\r
+struct Global_GUI* gui_globals(){\r
+       return global;\r
+}\r
+\r
+\r
+void GUIinit(void){\r
+       global=(struct Global_GUI*) malloc(sizeof(struct Global_GUI));\r
+#ifdef MALLOC_DEBUG\r
+       printf("malloc: %x\n",global); fflush(stdout);\r
+#endif\r
+\r
+       global->id=0;\r
+       global->willquit=0;\r
+       global->currentfont=NULL;\r
+       global->firstfont=NULL;\r
+       global->stringtable=NULL;\r
+       global->stringtabledata=NULL;\r
+       global->actionhandler=NULL;\r
+       GraphicsOpen();\r
+       loadFont(0x0030,stringwidth0,stringheight01,0,NULL);\r
+       loadFont(0x0031,stringwidth1,stringheight01,0,NULL);\r
+       loadFont(0x0032,stringwidth2,stringheight2,0,NULL);\r
+       global->root=Window_new(0x0,0x0,0x00,0x80);\r
+       global->root->state=STATE_VISIBLE;\r
+       global->root->handler=rootWindow_handler;\r
+       global->root->paint=Root_paint;\r
+}\r
+\r
+void GUIunit(void){\r
+       Component_delete(global->root);\r
+       ClearScreen();\r
+       GraphicsClose();\r
+}\r
+\r
+void GUIgo(char* scr){\r
+       char buf,obuf;\r
+       screenbuilder(global->root,scr);\r
+\r
+       while(read(global->lcd,&buf,1)==1);\r
+\r
+       while(!global->willquit){\r
+               if(read(global->lcd,&buf,1)==1){\r
+                       if(buf!=0)\r
+                               global->root->handler(global->root,KEY_PRESSED,buf);            \r
+                       else\r
+                               global->root->handler(global->root,KEY_RELEASED,obuf);\r
+                       obuf=buf;\r
+               }\r
+       }\r
+}\r
+\r
+/*void main(void){\r
+       GUIinit();\r
+       GUIgo();\r
+       GUIunit();\r
+}*/\r
+\r
diff --git a/src/gui/wnd.cbackup b/src/gui/wnd.cbackup
new file mode 100644 (file)
index 0000000..d7f96da
--- /dev/null
@@ -0,0 +1,658 @@
+#include <stdio.h>\r
+#include <syscalls.h>\r
+#include <fcntl.h>\r
+#include <sys\ioctl.h>\r
+#include <sgtty.h>\r
+#include <string.h>\r
+\r
+/*#define JOOST_DEBUG*/\r
+\r
+#define FONT_HEIGHT            7\r
+#define FONT_WIDTH             6\r
+\r
+#define STATE_VISIBLE  0x0001\r
+#define STATE_ENABLED  0x0002\r
+#define STATE_CHECKED  0x0004\r
+#define STATE_FOCUS            0x0008\r
+#define STATE_CASTING  0x0010\r
+#define STATE_ACTION   0x0020\r
+\r
+#define KEY_TYPED              0x0001\r
+#define WND_OPEN               0x0101\r
+#define WND_CLOSE              0x0102\r
+#define WND_REDRAW             0x0103\r
+#define WND_BROADCAST   0x0104\r
+#define CMP_ACTION             0x0201\r
+#define CMP_STATECHANGE        0x0202\r
+#define CMP_BROADCAST  0x0203\r
+#define DLG_OK                 0x0301\r
+#define DLG_CANCEL             0x0302\r
+\r
+int id=0;\r
+int lcd;\r
+int willquit;\r
+\r
+/************************************************\r
+ * Graphics                                     *\r
+ ************************************************/\r
+\r
+void GraphicsOpen(){\r
+       struct sgttyb temp;\r
+       char init[]={0x1B,'K'};\r
+\r
+       lcd=open("/dev/lcd0",O_RDWR);\r
+       gtty(lcd,&temp);\r
+       temp.sg_flags=RAW | UNBUFF;\r
+       stty(lcd,&temp);\r
+\r
+       write(lcd,init,2);\r
+}\r
+\r
+void Move(int x, int y){\r
+       unsigned char cmd[]={0x1B,'S',0,0};\r
+       cmd[2]=(unsigned char) (x);\r
+       cmd[3]=(unsigned char) (y);\r
+       write(lcd,cmd,4);\r
+}\r
+\r
+void ClearRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'C',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(lcd,cmd,4);\r
+}\r
+\r
+void DrawRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'N',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(lcd,cmd,4);\r
+}\r
+\r
+void FillRect(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'R',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(lcd,cmd,4);\r
+}\r
+\r
+void FillRectNC(int sx, int sy){\r
+       unsigned char cmd[]={0x1B,'F',0,0};\r
+       cmd[2]=(unsigned char) (sx);\r
+       cmd[3]=(unsigned char) (sy);\r
+       write(lcd,cmd,4);\r
+}\r
+\r
+void Text(char *s){\r
+       int c=strlen(s);\r
+       write(lcd,s,c);\r
+}\r
+\r
+void TouchRegion(int msg, int x, int y, int sx, int sy){\r
+       char touch[]={0x1B,'Z',0,0,0,0,0};\r
+       touch[2]=(unsigned char) (msg);\r
+       touch[3]=(unsigned char) (x);\r
+       touch[4]=(unsigned char) (y);\r
+       touch[5]=(unsigned char) (sx);\r
+       touch[6]=(unsigned char) (sy);\r
+       write(lcd,touch,7);\r
+#ifdef JOOST_DEBUG\r
+       printf("Touch: %x,%x,%x,%x,%x\n",msg,x,y,sx,sy); fflush(stdout);\r
+#endif\r
+}\r
+\r
+void ClearScreen(){\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       TouchRegion(0,0,0,0,0x80);\r
+}\r
+\r
+void EnableScreen(unsigned char c){\r
+       char cmd[]={0x1B,'E',0};\r
+       cmd[2]=c;\r
+       write(lcd,cmd,3);\r
+}\r
+\r
+/************************************************\r
+ * Components                                   *\r
+ ************************************************/\r
+\r
+struct Component {\r
+       int id;\r
+       int x,y;\r
+       int sizex,sizey;\r
+       int state;\r
+       int order;\r
+       char msg;\r
+       struct Component* parent;\r
+       struct Component *next_sibling;\r
+       struct Component *first_child;\r
+       void (*handler) (struct Component*, int, int);\r
+       void (*paint) (struct Component*);\r
+       void (*add) (struct Component*, struct Component*);\r
+       char label[20];\r
+       int sizexds;\r
+       void *xds;\r
+};\r
+\r
+struct ActionXDS {\r
+       void (*actionhandler)(struct Component*, int);\r
+       int action;\r
+       int wParam;\r
+       long lParam;\r
+};\r
+\r
+struct Component* root;\r
+\r
+struct Component* Component_new(int x,int y,int sx,int sy){\r
+       struct Component* this=(struct Component*) (malloc(sizeof(struct Component)));\r
+       this->id=(++id);\r
+       this->x=x;\r
+       this->y=y;\r
+       this->sizex=sx;\r
+       this->sizey=sy;\r
+       this->state=0;\r
+       this->order=0;\r
+       this->msg=0;\r
+       this->parent=NULL;\r
+       this->next_sibling=NULL;\r
+       this->first_child=NULL;\r
+       this->handler=NULL;\r
+       this->paint=NULL;\r
+       this->add=NULL;\r
+       this->sizexds=0;\r
+       this->xds=NULL;\r
+       this->label[0]=0;\r
+       return this;\r
+}\r
+\r
+void Component_setlabel(struct Component* this, char* s){\r
+       int i=0;\r
+       while(s[i]!=0 && i<20){\r
+               this->label[i]=s[i];\r
+               i++;\r
+       }\r
+       this->label[i]=0;\r
+}\r
+\r
+void Component_add(struct Component* this, struct Component* comp){\r
+       struct Component* current=this->first_child;\r
+       if(this->first_child==NULL){\r
+               this->first_child=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       else\r
+       {\r
+               while(current->next_sibling!=NULL){\r
+                       current=current->next_sibling;\r
+               }\r
+               current->next_sibling=comp;\r
+               comp->next_sibling=NULL;\r
+       }\r
+       comp->parent=this;\r
+}\r
+void Component_paint(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       while(current!=NULL){\r
+               current->paint(current);\r
+               current=current->next_sibling;\r
+       }\r
+}\r
+\r
+\r
+void Component_findXY(struct Component* this, int* x, int* y){\r
+       struct Component* current=this;\r
+       do{\r
+               *x+=current->x;\r
+               *y+=current->y;\r
+               current=current->parent;\r
+       } while(current!=NULL);\r
+}\r
+\r
+struct Component* Component_find(struct Component* this, int msg){\r
+       struct Component* current=this->first_child;\r
+#ifdef JOOST_DEBUG\r
+       printf("Find %x in %x:\n",msg, this->id); fflush(stdout);\r
+#endif\r
+       while(current!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Comp_find: %x, %x\n",msg, current->msg); fflush(stdout);\r
+#endif\r
+               if(current->msg==msg)\r
+                       return current;\r
+               current=current->next_sibling;\r
+       }\r
+       return NULL;\r
+}\r
+\r
+struct Component* Component_delete(struct Component* this){\r
+       struct Component* current=this->first_child;\r
+       int id=this->id;\r
+       if(this!=NULL){\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleting component: %d\n",id); fflush(stdout);\r
+#endif\r
+               while(current!=NULL){\r
+                       current=Component_delete(current);\r
+               }\r
+               if(this->parent!=NULL){\r
+                       if(this==this->parent->first_child)\r
+                               this->parent->first_child=this->parent->first_child->next_sibling;\r
+                       else{\r
+                               current=this->parent->first_child;\r
+                               while(this!=current->next_sibling && current->next_sibling!=NULL)\r
+                                       current=current->next_sibling;\r
+                               if(current->next_sibling!=NULL)\r
+                                       current->next_sibling=current->next_sibling->next_sibling;\r
+                       }\r
+               }       \r
+               current=this->next_sibling;\r
+               if(this->sizexds>0)\r
+                       free(this->xds);\r
+               free(this);\r
+#ifdef JOOST_DEBUG\r
+               printf("Deleted component: %d\n",id); fflush(stdout);\r
+#endif\r
+       }\r
+       return current;\r
+}\r
+\r
+\r
+/************************************************\r
+ * Windows                                      *\r
+ ************************************************/\r
+\r
+void Window_handler (struct Component* this, int msg, int param){\r
+       struct Component* current;\r
+       int x=0,y=0;\r
+#ifdef JOOST_DEBUG\r
+       printf("Message in window %d, Msg: %x, Param: %x\n",this->id,msg,param); fflush(stdout);\r
+#endif\r
+       switch(msg){\r
+       case KEY_TYPED:\r
+               current=this->first_child;\r
+               while(current!=NULL) {\r
+                       current->handler(current,msg,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       case WND_REDRAW:\r
+               this->paint(this);\r
+               break;\r
+       case WND_CLOSE:\r
+               Component_findXY(this,&x,&y);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               this->parent->handler(this->parent,WND_REDRAW,0);\r
+               break;\r
+       case WND_BROADCAST:\r
+               current=this->first_child;\r
+               while(current!=NULL){\r
+                       if(current!=(struct Component*) (param) && (current->state & STATE_FOCUS)!=0)\r
+                               current->handler(current,CMP_BROADCAST,param);\r
+                       current=current->next_sibling;\r
+               }\r
+               break;\r
+       }\r
+}\r
+\r
+void Window_paint(struct Component* this){\r
+       int x=0,y=0;\r
+       struct Component* current;\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               Move(x,y+FONT_HEIGHT+4);\r
+               DrawRect(this->sizex,this->sizey-FONT_HEIGHT-4);\r
+               Move(x,y);\r
+               FillRect(this->sizex, FONT_HEIGHT+5);\r
+               Move(x+2,y+2);\r
+               Text(this->label);\r
+               Component_paint(this);\r
+       }\r
+}\r
+\r
+void Root_paint(struct Component* this){\r
+       Move(0,0);\r
+       ClearRect(0,0x80);\r
+       Component_paint(this);  \r
+/*     EnableScreen(0);\r
+       Window_paint(this);\r
+       EnableScreen(1);*/\r
+}\r
+\r
+void Window_add(struct Component* this, struct Component* comp){\r
+       Component_add(this,comp);\r
+}\r
+\r
+struct Component* Window_new(int x,int y,int sx,int sy){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->handler=Window_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Buttons                                      *\r
+ ************************************************/\r
+\r
+void Button_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void Button_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               if((this->state & STATE_ENABLED)!=0){\r
+                       FillRectNC(this->sizex,this->sizey);\r
+                       Move(x+(this->sizex-FONT_WIDTH*strlen(this->label))/2,y+(this->sizey-FONT_HEIGHT)/2);\r
+                       Text(this->label);\r
+                       TouchRegion(this->msg,x,y,this->sizex,this->sizey);\r
+               }else{\r
+                       DrawRect(this->sizex,this->sizey);\r
+                       Move(x+(this->sizex-FONT_WIDTH*strlen(this->label))/2,y+(this->sizey-FONT_HEIGHT)/2);\r
+                       Text(this->label);\r
+                       TouchRegion(0,x,y,this->sizex,this->sizey);\r
+               }               \r
+       }\r
+}\r
+\r
+void Button_add(struct Component* this, struct Component* comp){\r
+       \r
+}\r
+\r
+struct Component* Button_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state=this->state | STATE_ENABLED | STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Button_handler;\r
+       this->paint=Button_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Toggle-buttons                               *\r
+ ************************************************/\r
+\r
+void ToggleButton_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==KEY_TYPED && this->msg==param && (this->state & (STATE_VISIBLE | STATE_ENABLED))!=0){\r
+               this->state^=STATE_CHECKED;\r
+               this->parent->handler(this->parent, CMP_STATECHANGE, param);\r
+               this->handler(this, WND_REDRAW, 0);\r
+               if((this->state & STATE_CASTING)!=0)\r
+                       this->parent->handler(this->parent, WND_BROADCAST, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION)\r
+               this->parent->handler(this->parent, CMP_ACTION, param);\r
+}\r
+\r
+void ToggleButton_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+               if((this->state & STATE_ENABLED)!=0 && (this->state & STATE_CHECKED)!=0){\r
+                       FillRectNC(this->sizex,this->sizey);\r
+                       Move(x+2,y+(this->sizey-FONT_HEIGHT)/2);\r
+                       Text(this->label);\r
+                       TouchRegion(this->msg,x,y,this->sizex,this->sizey);\r
+               }else{\r
+                       DrawRect(this->sizex,this->sizey);\r
+                       Move(x+2,y+(this->sizey-FONT_HEIGHT)/2);\r
+                       Text(this->label);\r
+                       TouchRegion((this->state & STATE_ENABLED)?this->msg:0,x,y,this->sizex,this->sizey);\r
+               }               \r
+       }\r
+}\r
+\r
+struct Component* ToggleButton_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state=this->state | STATE_ENABLED | STATE_VISIBLE | STATE_CHECKED;\r
+       this->msg=msg;\r
+       this->handler=ToggleButton_handler;\r
+       this->paint=ToggleButton_paint;\r
+       this->add=Button_add;\r
+       \r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Dialogs                                      *\r
+ ************************************************/\r
+\r
+void Dialog_handler(struct Component* this, int msg, int param){\r
+       Window_handler(this,msg,param);\r
+       if(msg==CMP_ACTION && param=='O'){\r
+               this->state=this->state & (0xffff-(STATE_VISIBLE | STATE_ENABLED));\r
+               this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_OK, this->msg);\r
+       }\r
+       if(msg==CMP_ACTION && param=='C'){\r
+               this->state=this->state & (0xffff-(STATE_VISIBLE | STATE_ENABLED));\r
+               this->handler(this,WND_CLOSE,0);\r
+               this->parent->handler(this->parent, DLG_CANCEL, this->msg);\r
+       }\r
+}\r
+\r
+struct Component* Dialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* ok;\r
+       struct Component* this=Component_new(x,y,sx,sy);\r
+       this->state=this->state | STATE_VISIBLE;\r
+       this->msg=msg;\r
+       this->handler=Dialog_handler;\r
+       this->paint=Window_paint;\r
+       this->add=Window_add;\r
+\r
+       ok=Button_new(sx-0x30,sy-0x1c,0x28,0x14,'O');\r
+       Component_setlabel(ok,"OK");\r
+       this->add(this,ok);\r
+\r
+       ok=Button_new(sx-0x30,sy-0x38,0x28,0x14,'C');  /*Cancel*/\r
+       Component_setlabel(ok,"Cancel");\r
+       this->add(this,ok);\r
+\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Displays                                     *\r
+ ************************************************/\r
+void Display_handler(struct Component* this, int msg, int param){\r
+       Button_handler(this,msg,param);\r
+       if(msg==CMP_BROADCAST && (this->state & STATE_FOCUS)!=0){\r
+#ifdef JOOST_DEBUG\r
+               printf("strlen = %d->",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               if(param==0x08){\r
+                       if(strlen(this->label)!=0)\r
+                               this->label[strlen(this->label)-1]=0;\r
+               }else{\r
+                       this->label[strlen(this->label)+1]=0;\r
+                       this->label[strlen(this->label)]=(char) param;\r
+               }       \r
+#ifdef JOOST_DEBUG\r
+               printf("%d\n",strlen(this->label)); fflush(stdout);\r
+#endif\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+}\r
+\r
+void Display_paint(struct Component* this){\r
+       int x=0, y=0;\r
+       struct Component* current;\r
+       if((this->state & STATE_VISIBLE)!=0){\r
+               Component_findXY(this,&x,&y);\r
+\r
+               Move(x,y);\r
+               ClearRect(this->sizex,this->sizey);\r
+       \r
+               FillRectNC(this->sizex,this->sizey);\r
+               Move(x+2,y+(this->sizey-FONT_HEIGHT)/2);\r
+               Text(this->label);\r
+               if((this->state & STATE_ENABLED)!=0)\r
+                       TouchRegion(this->msg,x,y,this->sizex,this->sizey);\r
+       }\r
+}\r
+\r
+struct Component* Display_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* this=Button_new(x,y,sx,sy,msg);\r
+       this->state|=STATE_FOCUS;\r
+       Component_setlabel(this,"");\r
+       this->paint=Display_paint;\r
+       this->handler=Display_handler;\r
+       return this;\r
+}\r
+\r
+/************************************************\r
+ * Implementation                               *\r
+ ************************************************/\r
+\r
+void ScreenDialog_handler(struct Component* this, int msg, int param){\r
+       char cmd[]={0x1B,'V',0};\r
+       Dialog_handler(this,msg,param);\r
+       if(msg==CMP_ACTION){\r
+               if(param=='U')\r
+                       cmd[2]=0;\r
+               else if(param=='D')\r
+                       cmd[2]=1;\r
+               else \r
+                       return;\r
+               write(lcd,cmd,3);\r
+       }\r
+}\r
+\r
+struct Component* ScreenDialog_new(int x, int y, int sx, int sy, int msg){\r
+       struct Component* button;\r
+       struct Component* this=Dialog_new(x,y,sx,sy,msg);\r
+       \r
+       button=Button_new(0x04,0x10,0x20,0x14,'U');\r
+       Component_setlabel(button,"Up");\r
+       this->add(this,button);\r
+\r
+       button=Button_new(0x04,0x28,0x20,0x14,'D');\r
+       Component_setlabel(button,"Down");\r
+       this->add(this,button);\r
+\r
+       this->handler=ScreenDialog_handler;\r
+\r
+       return this;\r
+}\r
+\r
+void rootWindow_handler(struct Component* this, int msg, int param){\r
+       struct Component* dummy;\r
+       Window_handler(this,msg,param);\r
+       if(msg==DLG_OK && param=='!')\r
+               willquit=1;\r
+       if(msg==DLG_CANCEL && param=='!'){\r
+               Component_delete(Component_find(this,'!'));\r
+               Component_find(this,'Q')->state|=STATE_ENABLED;\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+\r
+       if((msg==DLG_CANCEL || msg==DLG_OK) && param=='#'){\r
+               Component_delete(Component_find(this,'#'));\r
+               Component_find(this,'S')->state|=STATE_ENABLED;\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+\r
+       if(msg==CMP_ACTION && param=='Q'){\r
+               dummy=Dialog_new(0x02,0x02,0xfc,0x7c,'!');\r
+               dummy->state=dummy->state | STATE_VISIBLE;\r
+               Component_setlabel(dummy,"Really quit?");\r
+               this->add(root,dummy);\r
+               Component_find(this,'Q')->state&=0xffff-STATE_ENABLED;\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+\r
+       if(msg==CMP_ACTION && param=='S'){\r
+               dummy=ScreenDialog_new(0x02,0x02,0xfc,0x7c,'#');\r
+               dummy->state=dummy->state | STATE_VISIBLE;\r
+               Component_setlabel(dummy,"Screen contrast");\r
+               \r
+               this->add(root,dummy);\r
+               Component_find(this,'S')->state&=0xffff-STATE_ENABLED;\r
+               this->handler(this,WND_REDRAW,0);\r
+       }\r
+}\r
+\r
+void Numpad(struct Component* this, int x, int y){\r
+       int i;\r
+       char s[2]={0,0};\r
+       struct Component* button;\r
+       for(i=0; i<9; i++){\r
+               s[0]=0x31+(char) i;\r
+               button=Button_new(x+(i%3)*0x18,y+0x30-(i/3)*0x18,0x16,0x16,i+0x31);\r
+               Component_setlabel(button,s);\r
+               button->state|=STATE_CASTING;\r
+               this->add(this,button);\r
+       }\r
+       button=Button_new(x+0x18,y+0x48,0x16,0x16,0x30);\r
+       Component_setlabel(button,"0");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+\r
+       button=Button_new(x+0x30,y+0x48,0x16,0x16,0x08);\r
+       Component_setlabel(button,"CE");\r
+       button->state|=STATE_CASTING;\r
+       this->add(this,button);\r
+}\r
+\r
+void main(void){\r
+       struct Component* subw;\r
+       char buf;\r
+       willquit=0;\r
+       GraphicsOpen();\r
+       root=Window_new(0x0,0x0,0x00,0x80);\r
+       root->state=STATE_VISIBLE;\r
+       root->handler=rootWindow_handler;\r
+       root->paint=Root_paint;\r
+       Component_setlabel(root,"Test-window");\r
+\r
+       subw=Button_new(0xc0,0x60,0x30,0x18,'Q');\r
+       Component_setlabel(subw,"Quit");\r
+       root->add(root,subw);\r
+\r
+       subw=ToggleButton_new(0xc0,0x40,0x30,0x18,'T');\r
+       Component_setlabel(subw," Toggle!");\r
+       root->add(root,subw);\r
+\r
+       subw=Button_new(0xc0,0x20,0x30,0x18,'S');\r
+       Component_setlabel(subw,"Screen");\r
+       root->add(root,subw);\r
+\r
+       subw=Display_new(0x10,0x02,0x46,0x18,'@');\r
+       root->add(root,subw);\r
+\r
+       Numpad(root,0x10,0x1f);\r
+\r
+       root->paint(root);\r
+\r
+       while(read(lcd,&buf,1)==1);\r
+\r
+       while(!willquit){\r
+               if(read(lcd,&buf,1)==1)\r
+                       root->handler(root,KEY_TYPED,buf);\r
+       }\r
+\r
+       Component_delete(root);\r
+       ClearScreen();\r
+}
\ No newline at end of file
diff --git a/src/gui/wnd.h b/src/gui/wnd.h
new file mode 100644 (file)
index 0000000..dcf45c3
--- /dev/null
@@ -0,0 +1,201 @@
+#ifndef JOOST_WND_H\r
+#define JOOST_WND_H\r
+#include <stdio.h>\r
+#include <syscalls.h>\r
+#include <fcntl.h>\r
+#include <sys\ioctl.h>\r
+#include <sgtty.h>\r
+#include <string.h>\r
+\r
+#define FONT_HEIGHT                    global->currentfont->stringheight\r
+#define FONT_WIDTH(x)          global->currentfont->stringwidth(x)\r
+#define LABEL_LENGTH           0x14\r
+#define SIZE_SCRBLD_RECORD     0x14\r
+\r
+\r
+#define STATE_VISIBLE          0x0001\r
+#define STATE_ENABLED          0x0002\r
+#define STATE_CHECKED          0x0004\r
+#define STATE_FOCUS                    0x0008\r
+#define STATE_CASTING          0x0010\r
+#define STATE_ACTION           0x0020\r
+#define STYLE_MULTILINE                0x0040\r
+#define STYLE_INVERTED         0x0080\r
+#define STYLE_PASSWORD         0x0100\r
+#define STYLE_SELFDESTRUCT     0x1000\r
+#define STATE_APPLICATION      0x2000\r
+#define STRING_FROMTABLE       0x4000\r
+#define STATE_DUMMY                    0x8000\r
+\r
+#define KEY_PRESSED                    0x0001\r
+#define KEY_RELEASED           0x0002\r
+#define KEY_TYPED                      0x0003\r
+#define WND_OPEN                       0x0101\r
+#define WND_CLOSE                      0x0102\r
+#define WND_REDRAW                     0x0103\r
+#define WND_BROADCAST          0x0104\r
+#define WND_DESTROY                    0x0105\r
+#define CMP_ACTION                     0x0201\r
+#define CMP_STATECHANGE                0x0202\r
+#define CMP_BROADCAST          0x0203\r
+#define DLG_OK                         0x0301\r
+#define DLG_CANCEL                     0x0302\r
+#define APP_QUIT                       0x0401\r
+\r
+struct Global_GUI {\r
+       int id;\r
+       int lcd;\r
+       int willquit;\r
+       char *stringtabledata;\r
+       char **stringtable;\r
+       struct Font* currentfont;\r
+       struct Font* firstfont;\r
+       struct Component* root;\r
+       void (*actionhandler) (struct Component*);\r
+};\r
+\r
+/************************************************\r
+ * Graphics                                     *\r
+ ************************************************/\r
+\r
+void GraphicsOpen();\r
+void GraphicsClose();\r
+void Move(int x, int y);\r
+void ClearRect(int sx, int sy);\r
+void DrawRect(int sx, int sy);\r
+void FillRect(int sx, int sy);\r
+void FillRectNC(int sx, int sy);\r
+void GrayRect(int sx, int sy);\r
+void Text(char *s);\r
+void TouchRegion(int msg, int x, int y, int sx, int sy);\r
+void ClearScreen();\r
+void EnableScreen(unsigned char c);\r
+void grSetFont(int f);\r
+\r
+/************************************************\r
+ * Fonts                                        *\r
+ ************************************************/\r
+\r
+struct Font {\r
+       int id;\r
+       int (*stringwidth)(char*);\r
+       int (*stringheight)(char*);\r
+       struct Font* nextfont;\r
+       int sizefontdata;\r
+       void* fontdata;\r
+};\r
+\r
+struct Font* fontSearch(int f);\r
+void setCurrentFont(int f);\r
+void loadFont(int id,int (*sw)(char*),int (*sh)(char*),int sizedata, void* data);\r
+\r
+\r
+/************************************************\r
+ * Components                                   *\r
+ ************************************************/\r
+\r
+struct Component {\r
+       int id;\r
+       int x,y;\r
+       int sizex,sizey;\r
+       int state;\r
+       int order;\r
+       int font;\r
+       char msg;\r
+       struct Component* parent;\r
+       struct Component *next_sibling;\r
+       struct Component *first_child;\r
+       void (*handler) (struct Component*, int, int);\r
+       void (*paint) (struct Component*);\r
+       void (*add) (struct Component*, struct Component*);\r
+       char* label;\r
+       char* label2;\r
+       int sizexds;\r
+       void *xds;\r
+};\r
+\r
+struct ActionXDS {\r
+       void (*actionhandler)(struct Component*);\r
+       int action;\r
+       int wParam;\r
+       long lParam;\r
+};\r
+\r
+struct StringTableXDS {\r
+       char *stringtabledata;\r
+       char **stringtable;\r
+};\r
+\r
+struct Component* Component_new(int x,int y,int sx,int sy);\r
+void Component_setlabel(struct Component* this, char* s);\r
+void Component_add(struct Component* this, struct Component* comp);\r
+void Component_paint(struct Component* this);\r
+void Component_findXY(struct Component* this, int* x, int* y);\r
+struct Component* Component_find(struct Component* this, int msg);\r
+struct Component* Component_delete(struct Component* this);\r
+void Component_delete_children(struct Component* this);\r
+void Component_changestate_children(struct Component* this, int andmask, int ormask, int xormask);\r
+void Component_linkstringtable(struct Component* this);\r
+\r
+/************************************************\r
+ * Windows                                      *\r
+ ************************************************/\r
+\r
+void Window_handler (struct Component* this, int msg, int param);\r
+void Window_paint(struct Component* this);\r
+void Root_paint(struct Component* this);\r
+void Window_add(struct Component* this, struct Component* comp);\r
+struct Component* Window_new(int x,int y,int sx,int sy);\r
+       \r
+/************************************************\r
+ * Buttons                                      *\r
+ ************************************************/\r
+\r
+void Button_handler(struct Component* this, int msg, int param);\r
+void Button_drawtext(struct Component* this, int x, int y);\r
+void Button_paint(struct Component* this);\r
+void Button_add(struct Component* this, struct Component* comp);\r
+struct Component* Button_new(int x, int y, int sx, int sy, int msg);\r
+\r
+/************************************************\r
+ * Toggle-buttons                               *\r
+ ************************************************/\r
+\r
+void ToggleButton_handler(struct Component* this, int msg, int param);\r
+void ToggleButton_paint(struct Component* this);\r
+struct Component* ToggleButton_new(int x, int y, int sx, int sy, int msg);\r
+\r
+/************************************************\r
+ * Dialogs                                      *\r
+ ************************************************/\r
+\r
+void Dialog_handler(struct Component* this, int msg, int param);\r
+struct Component* Dialog_new(int x, int y, int sx, int sy, int msg);\r
+\r
+/************************************************\r
+ * Displays                                     *\r
+ ************************************************/\r
+void Display_handler(struct Component* this, int msg, int param);\r
+void Display_paint(struct Component* this);\r
+struct Component* Display_new(int x, int y, int sx, int sy, int msg);\r
+\r
+/************************************************\r
+ * Labels                                       *\r
+ ************************************************/\r
+void Label_handler(struct Component* this, int msg, int param);\r
+void Label_paint(struct Component* this);\r
+struct Component* Label_new(int x, int y, int sx, int sy,char* l);\r
+\r
+/************************************************\r
+ * Implementation                               *\r
+ ************************************************/\r
+void rootWindow_handler(struct Component* this, int msg, int param);\r
+void root_actionhandler(struct Component*);\r
+void screenbuilder(struct Component* root, char* filename);\r
+void read_stringtable(int fh,char* buf);\r
+struct Global_GUI* gui_globals();\r
+void GUIinit();\r
+void GUIgo(char* scr);\r
+void GUIunit();\r
+\r
+#endif
\ No newline at end of file
diff --git a/src/gui/wnd.ihx b/src/gui/wnd.ihx
new file mode 100644 (file)
index 0000000..be61cb6
--- /dev/null
@@ -0,0 +1,1068 @@
+:020000040000FA\r
+:10810000C30381ED73A6C3114AC7CDF9BFCD458125\r
+:10811000DD210000DD39DD6E04DD66052212C5DDDE\r
+:108120004E02DD4603ED4310C5DD5E00DD5601ED78\r
+:10813000530EC5CD3AABEBD52A16C57DB4C44481E8\r
+:10814000D1C319C0E9214AC7110EC5CD6E8111A056\r
+:10815000C321A0C30132C2CD6381114AC721A0C38C\r
+:1081600001A0C3AFED42C54D44E1C8EDB0C9AFE5D4\r
+:10817000ED52E1C8121318F77BF5ED3804E602283A\r
+:10818000F9F1ED3906C93E0DCD79813E0A18EAEBC9\r
+:108190007CCD95817DF50F0F0F0FCD9E81F1E60F00\r
+:1081A000C69027CE402718D1E3F57E23B72805CD0A\r
+:1081B000798118F6F1E3C90405C8CB2ACB1B10FA64\r
+:1081C000C9F5E5CD2C827B2F5F7A2F57E1F1C9F5F8\r
+:1081D000C5E5AFCD1082F5CD2C82F1B72803131879\r
+:1081E000067B2F5F7A2F57E1C1F1C9F5E5CD2C82CF\r
+:1081F000EBE1F1C9F5E5C53E01CD1082F5CD2C824C\r
+:10820000F1EBB72007AF935F3E009A57C1E1F1C988\r
+:10821000CB782809AF914F3E0098473E01CB7AC8F2\r
+:10822000F5AF935F3E009A57F1EE01C92100003E81\r
+:1082300011CB13CB123DC8CB15CB14ED4230F20954\r
+:1082400018EFF5C5E5784251676BED4CED6CED5CD0\r
+:1082500079858257E1C1F1C9C5E5F57CEE80677883\r
+:10826000EE8047F1A7ED42E1C1C95E2356CD4282BF\r
+:10827000722B73C9B7C8CB28CB19CB1CCB1D3D20A3\r
+:10828000F5C9E3D5DDE5DD210000DD39DD5609DD89\r
+:108290007409DD5E08DD7508D5C5F5DD6E0462ED97\r
+:1082A0006CDD5605ED5C1959DD5607ED5C19DD5E98\r
+:1082B0000650ED5C19E5DD5E04DD56FEED5CDD6E1D\r
+:1082C00005DD6607ED6C19DD4606ED4C09E5DD5E62\r
+:1082D00004DD5607ED5CDD6E05DD6606ED6CAF195D\r
+:1082E00017F5DD5E04DD5606ED5C4A0600AF0917A2\r
+:1082F00055C14CE10984C1814D47EBF1D1D1DDE19C\r
+:10830000D133333333C9EBE3F5DDE5DD210000DDA7\r
+:1083100039C5D5DD5609DD7409DD5E08DD7508CD8A\r
+:10832000FA83E1C1CD5A84DDE1F1D13333C9EBE306\r
+:10833000F5DDE5DD210000DD39C5D5DD5609DD744B\r
+:1083400009DD5E08DD7508AFCDB683CDFA83E1C1E6\r
+:10835000B7CC5A84C45284DDE1F1D13333C9EBE3A5\r
+:10836000F5DDE5DD210000DD39C5D5DD5609DD741B\r
+:1083700009DD5E08DD7508CDFA83DDF9DDE1F1D1B7\r
+:108380003333C9EBE3F5DDE5DD210000DD39C5D58B\r
+:10839000DD5609DD7409DD5E08DD75083E01CDB6E8\r
+:1083A00083CDFA83B72006CD5A84CD5284DDF9DD22\r
+:1083B000E1F1D13333C9CB7A2818424BDD6607DDB2\r
+:1083C0006E06CD5A84CD52845059DD7407DD750692\r
+:1083D0003E01DDCBFF7EC8F5DD46FFDD4EFEDD66EE\r
+:1083E000FDDD6EFCCD5A84CD5284DD70FFDD71FE63\r
+:1083F000DD74FDDD75FCF1EE01C9F5210000010021\r
+:1084000000DD36F82118021937DDCBFC16DDCBFD77\r
+:1084100016DDCBFE16DDCBFF16DD35F8282ECB1191\r
+:10842000CB10CB15CB14ED5238DD201078DD96073C\r
+:1084300038D5200879DD960638CD180479DD960602\r
+:108440004F78DD9E074730C12BA718BDF1E5606965\r
+:10845000C1C92CC024C00CC004C9F57D2F6F7C2F6E\r
+:1084600067792F4F782F47F1C9F5AF956F3E009C84\r
+:10847000673E00994F3E009847F1C9C5D55E235627\r
+:10848000234E2346EBCD8282C39B84C5D55E235603\r
+:10849000234E2346EBCD0683C39B84EB702B712BBD\r
+:1084A000722B73C9F57E83775F237E8A7757237E8D\r
+:1084B00089774F237E8877472B2B2BF1C9E3F5D59E\r
+:1084C0007B96235F7A9E23577B96237A9E23C3D184\r
+:1084D000843004EB2329195E2356EBD1F1E3C9E381\r
+:1084E000F5C54E2346237BEDB12002232309C30E9D\r
+:1084F00085E3F5C54E23462378B1280D0B7B9623E3\r
+:1085000020F57A9620F12323230909C30E85090952\r
+:108510007E23666FC1F1E3C9E1C5D5DDE5DD21004C\r
+:1085200000DD39E9E1C5D5DDE5DD210000DD395E9D\r
+:10853000235623EB39F9EBE9DDF9DDE1D1C1C9DDE2\r
+:10854000F9DDE1D13333C9E9CD2485F8FF210600F7\r
+:1085500039EB2123C1010200EDB02A18C52323E520\r
+:108560000303C50150C1C5CD89C0F1F14D44E1718E\r
+:10857000237021000039E5210000E52A18C52323D6\r
+:108580004E2346C5CD3BC0F1F1F1DD36FC60DD3652\r
+:10859000FD0021000039E5210100E52A18C523234B\r
+:1085A0004E2346C5CD3BC0F1F1F1210200E52E0876\r
+:1085B000394D442A18C523235E2356CD09C1F1C382\r
+:1085C0003885D52A18C523235E2356CD09C0D1C9C5\r
+:1085D000CD2485FCFF21000039EB2125C1010400D9\r
+:1085E000EDB0DD4602DD70FEDD4604DD70FF2104E6\r
+:1085F00000E52B2BC3B0854DC3B2852A18C52323B4\r
+:108600005E23C3BA85CD09C1F1C33885CD2485FC6D\r
+:10861000FF21000039EB2129C1010400EDB0DD4646\r
+:1086200002DD70FEDD4604DD70FF210400E52B2B2A\r
+:10863000C3B0854DC3F8852A18C5C3B68523C300CA\r
+:108640008623C3BA85CD09C1F1C33885CD2485FC05\r
+:10865000FF21000039EB212DC1010400EDB0DD4602\r
+:1086600002DD70FEDD4604DD70FF210400E52B2BEA\r
+:10867000C3B0854DC3F8852A18C5C33A8623C3B84D\r
+:108680008523C30286CD09C1F1C33885CD2485FC7D\r
+:10869000FF21000039EB2131C1010400EDB0DD46BE\r
+:1086A00002DD70FEDD4604DD70FF210400E52B2BAA\r
+:1086B000C3B0854DC3F8852A18C5C33A8623C37E47\r
+:1086C0008623C3BA85CD09C1F1C33885CD2485FC85\r
+:1086D000FF21000039EB2135C1010400EDB0DD467A\r
+:1086E00002DD70FEDD4604DD70FF210400E52B2B6A\r
+:1086F000C3B0854DC3F8852A18C5C33A8623C37E07\r
+:108700008623C3C286CD09C1F1C33885C5FDE5DD29\r
+:10871000E5D5DDE1CD4EB6E5DDE5C12A18C523235B\r
+:108720005E2356CD09C1F1DDE1FDE1C1C9CD24854E\r
+:10873000F8FF21000039EB2139C1010700EDB0DD60\r
+:108740004602DD70FADD4604DD70FBDD4608DD70B3\r
+:10875000FCDD460ADD70FDDD460CDD70FE21070004\r
+:10876000E52E02C3B0854DC3F8852A18C5C33A86E5\r
+:1087700023C37E8623C3C286CD09C1F1C33885C514\r
+:10878000D5CD9487E56CE5E54D44EBCD2D87E1E152\r
+:10879000E1D1C1C90100005950CDD08501800058F8\r
+:1087A00050CD0C86218000C9CD2485FCFF2100001E\r
+:1087B00039EB2140C1010300EDB0DD4602DD70FE62\r
+:1087C000210300E52BC3B0854DC3F8852A18C5C326\r
+:1087D0003A8623C37E8623C3C286CD09C1F1C3383E\r
+:1087E00085CD2485FEFF21000039EB2143C1010224\r
+:1087F00000EDB0DD4602DD70FF210200E5C3B0856B\r
+:108800004DC3F8852A18C5C33A8623C37E8623C381\r
+:10881000C286CD09C1F1C33885CD24850000210C65\r
+:1088200000ED4B18C50946236668EB7BB228166B32\r
+:108830006246236668DD4E02DD4603ED42280621CE\r
+:1088400006001918E1EBC33885C5DDE5D5DDE1CDBE\r
+:1088500019887DB4281BDDE5D1CDE187210A00ED23\r
+:108860004B18C509E5DDE5D1CD19884D44E17123EB\r
+:1088700070DDE1C1C9CD2485FCFFFDE5110C00CD03\r
+:108880000489DD4E0271DD46032370DD6E04FD7543\r
+:1088900002DD6605FD7403DD6E08FD7504DD660905\r
+:1088A000FD7405AFFD7706FD7707DD6E0AFD7508DF\r
+:1088B000DD660BFD7409DD6E0CFD750ADD660DFDD0\r
+:1088C000740B210C00ED4B18C5097E23B6210C005A\r
+:1088D000ED4B18C5092010FDE5C1712370210A0078\r
+:1088E000ED4B18C509181246236668EB21060019DE\r
+:1088F0007E23B62106001920EEFDE5C1712370FD2F\r
+:10890000E1C33885CDE3B2E5FDE1C9FDE5DDE5C5AF\r
+:10891000D5DD210000FD210000FDE5210200394EDA\r
+:108920002346E1097EB72850FDE5E1095ECDDF84ED\r
+:108930000A00212C2E3149696A6B6C726689618943\r
+:10894000578961896189528952895C895C895C890E\r
+:1089500052890102001812010300180D01040018C9\r
+:10896000080105001803010600DD09210200394E47\r
+:108970002346DD09FD2318A1DDE5E1F1F1DDE1FD8F\r
+:10898000E1C9CD18857BFE80300621070009180C4F\r
+:10899000FECC38083EDFBB3803696023C33885CD81\r
+:1089A00018850100001A5FCD8289C33885CD1885EE\r
+:1089B000010500C3A589C5D5010000CD0B89F1C112\r
+:1089C000C9C5D5010200CD0B89F1C1C9C5D50103C7\r
+:1089D00000CD0B89F1C1C9CD24850000FDE511252D\r
+:1089E00000CD04892A18C55E235613722B73FDE54A\r
+:1089F000E1732372DD6E02FD7502DD6603FD740313\r
+:108A0000FD7104FD7005DD6E08FD7506DD6609FD6E\r
+:108A10007407DD6E0AFD7508DD660BFD7409AFFD98\r
+:108A2000770AFD770BFD770CFD770DFD770EFD774F\r
+:108A30000FFD7710FD7711FD7712FD7713FD771489\r
+:108A4000FD7715FD7716FD7717FD7718FD7719FD72\r
+:108A5000771AFD771BFD771CFD7721FD7722FD77C7\r
+:108A600023FD7724FD771DFD771EFD771FFD772001\r
+:108A7000FDE5E1FDE1C33885CD24850000FDE5DDA0\r
+:108A80006E02DD6603E5FDE1110000DD6E04DD66CA\r
+:108A900005197EB728210114806B6278AC67ED421E\r
+:108AA0003015FD6E1DFD661E19E5DD6E04DD6605E3\r
+:108AB0001946E1701318D4FD6E1DFD661E193600AF\r
+:108AC000FDE1C33885CD24850000FDE55950211511\r
+:108AD00000DD4E02DD4603097E23666FE5FDE121E0\r
+:108AE0001500097E23B62009211500097323721889\r
+:108AF00019FD7E13FDB614280BFD6E13FD6614E5FB\r
+:108B0000FDE118EDFD7313FD721421130019772395\r
+:108B10007721110019DD4E0271DD46032370FDE15E\r
+:108B2000C33885C5FDE5DDE52115001946236668D6\r
+:108B3000E5DDE17DB42814DDE5D1DD6E19DD661AD1\r
+:108B4000CD4785DD6E13DD661418E5DDE1FDE1C17D\r
+:108B5000C9CD24850000FDE5DD6E02DD6603E5FD7F\r
+:108B6000E1DD6E04DD66057EFD860277237EFD8EE7\r
+:108B70000377DD6E08DD66097EFD860477237EFDC2\r
+:108B80008E0577FD6E11FD6612E5FDE17DB420D105\r
+:108B9000FDE1C33885CD24850000211500DD4E029E\r
+:108BA000DD46030946236668EB7BB2281B211000D3\r
+:108BB000194E0600DD6E04DD6605A7ED422003EBCD\r
+:108BC00018082113001918DC6F67C33885CD248578\r
+:108BD000F8FFFDE5DD6E02DD6603E5FDE1FD6E15E6\r
+:108BE000DD75F8FD6616DD74F9FDE5E17DB4CA8634\r
+:108BF0008DDD7EF8DDB6F92811DD5EF8DD56F9CDA4\r
+:108C0000CD8BDD75F8DD74F918E7FD7E11FDB61228\r
+:108C1000CA9C8CFD6E11FD66120115000946236683\r
+:108C200068FDE5C1A7ED42FD6E11FD66120115005C\r
+:108C3000092009E5FD6E11FD66121850462366688D\r
+:108C4000DD75F8DD74F9211300DD4EF8DD46F90914\r
+:108C500046236668FDE5C1A7ED422819211300DD12\r
+:108C60004EF8DD46F9097E23B6280A21130009567D\r
+:108C700023666A18CB211300DD4EF8DD46F9097E24\r
+:108C800023B6281821130009E5211300094623669D\r
+:108C900068011300094E2346E1712370FD6E13DD58\r
+:108CA00075F8FD6614DD74F93E04FDAE21FDB622B3\r
+:108CB000C2528DFD6E11DD75FCFD6612DD74FDFD89\r
+:108CC0006E23DD75FEFD6624DD74FF5E2356CD77D1\r
+:108CD000AFDD6EFEDD66FF23235E2356CD77AFDD6D\r
+:108CE0007EFCDDB6FD2820212100DD4EFCDD46FDA9\r
+:108CF000093E04AE23B6280F2111000956DD72FC8F\r
+:108D00002366DD74FD18D8DD7EFCDDB6FD28432129\r
+:108D10002300DD4EFCDD46FD0946DD70FE2366DDE9\r
+:108D200074FF210600ED4B18C509E5DD6EFEDD661A\r
+:108D3000FF5E2356E1732372210800ED4B18C5092D\r
+:108D4000E5DD4EFEDD46FF030369604E2346E1711B\r
+:108D50002370FD4E21FD4622210000CD58823009AE\r
+:108D6000FD5E23FD5624CD77AFFDCB0B762011FDA4\r
+:108D70007E1DFDB61E2809FD5E1DFD561ECD77AF7A\r
+:108D8000FDE5D1CD77AFDD6EF8DD66F9FDE1C338E5\r
+:108D900085C5FDE5DDE52115001946236668E5DD9D\r
+:108DA000E17DB42808DDE5D1CDCD8B18F1DDE1FD05\r
+:108DB000E1C1C9CD24850000FDE5211500DD5E027D\r
+:108DC000DD5603195623666AE5FDE17DB4283D2191\r
+:108DD0000A00FDE5C109DD7E04DD56052F5F7A2F0F\r
+:108DE000577EA377237EA277210A00097EDDB6088D\r
+:108DF00077237EDDB60977210A00097EDDAE0A778A\r
+:108E0000237EDDAE0B772113000918B811DCC4CD29\r
+:108E100084ACFDE1C33885C5FDE5DDE5D5DDE121A7\r
+:108E200015001946236668E5FDE1211D001946235A\r
+:108E300066680100903E80AC67ED42302EDD4E1D2D\r
+:108E4000DD461E210000CD58823020DD6E1DDD661E\r
+:108E50001E29E5210800ED4B18C5094E2346E109FE\r
+:108E60002B2B46DD701D2366DD741EDD6E1FDD6657\r
+:108E7000200100903E80AC67ED42302EDD4E1FDDBC\r
+:108E80004620210000CD58823020DD6E1FDD662097\r
+:108E900029E5210800ED4B18C5094E2346E1092BB1\r
+:108EA0002B46DD701F2366DD7420FDE5E17DB428CF\r
+:108EB00011FDE5D1CD178EFD6E13FD6614E5FDE1C4\r
+:108EC00018E8DDE1FDE1C1C9CD2485D2FFFDE5AFA4\r
+:108ED000DD77F9DD77FADD77FBDD77FC5950CDF1F1\r
+:108EE000840600010002010301040105010104F3ED\r
+:108EF000906C9002902B90798F8A8FFD8E211500B7\r
+:108F0000DD4E02DD46030946236668E5FDE17DB4DA\r
+:108F10002864FDCB0A46284FDD6E08DD6609E5DDD5\r
+:108F20004E04DD4605CD3191E1FDCB0A6E2838FDBA\r
+:108F30004E100600DD6E08DD6609A7ED422028FD13\r
+:108F40006E23DD75FDFD6624DD74FEFDE5D146234F\r
+:108F50006668CD4785DD6EFDDD66FE23232366AFA3\r
+:108F6000B42004FD210000FDE5E17DB428A0FD6EE4\r
+:108F700013FD66141895C3F390DD5E024BDD5603B6\r
+:108F800042211900CD2991C3F390210A00DD4E0240\r
+:108F9000DD4603097EE6FC77212B0039E52B2B4DBE\r
+:108FA00044DD5E02DD5603CD518BE1210800DD4E2C\r
+:108FB00002DD4603095E2356D5210600095E2356CD\r
+:108FC000D5DD6EFBDD66FCE5DD4EF9DD46FA110010\r
+:108FD00000CD2D87E1E1E1210000E52E11DD5E02EB\r
+:108FE000DD5603195E2356211100DD4E02DD4603D6\r
+:108FF00009462366680117000946236668010301D4\r
+:109000001826211100DD4E02DD4603095623666A4B\r
+:10901000E5FDE15950CDCD8B210000E5010301FDB7\r
+:10902000E5D1FD6E17FD6618C3EF90211500DD4EEA\r
+:1090300002DD46030946236668E5FDE17DB4282983\r
+:10904000DD6E08DD6609FDE5C1ED422814FDCB0AA1\r
+:109050005E280EDD6E08DD6609E5010302CD319163\r
+:10906000E1FD6E13FD661418D0C3F390211100DDED\r
+:109070004E02DD4603097E23B6200E210400ED4B8F\r
+:1090800018C50936012377186A210A000923CB6E17\r
+:109090002025DD6E08DD6609E52111005950195EB5\r
+:1090A000235621110009462366680117000946234B\r
+:1090B00066680101041838211100095623666AE523\r
+:1090C000FDE1110A00197EF603776A62E523E54A9D\r
+:1090D00042FDE5D1CDB38DE1E1210000E5DD5E0289\r
+:1090E0004BDD5603422E170946236668010501CD64\r
+:1090F0004785E1FDE1C338852346211100DD5E028D\r
+:10910000DD5603195E2356CD958BEB0178C1CD78E2\r
+:109110008A211100DD4E02DD4603095E235621112E\r
+:109120000009462366680119000946236668C3479B\r
+:1091300085FDE5D1FD6E17FD6618C34785C5DDE5E4\r
+:10914000F5F5D5DDE121020039AF7723772B2B2B05\r
+:10915000772377210A00ED4B18C5097E23666F46F9\r
+:10916000236668E5210E00194E2346E1A7ED42284B\r
+:1091700003CD6092DDCB0A46CA1B9221000039E57F\r
+:10918000CD5692E121000039CD2192E5DD6E06DD5C\r
+:109190006607E5210400394E2346C5234E234611B8\r
+:1091A0000000CD2D87E1E1E1DD5E1DDD561E210AC7\r
+:1091B00000ED4B18C509CDAC92E5210200394E23D4\r
+:1091C00046E109010400094D4421020039CD4192D4\r
+:1091D000CDAC924D44DD6E08DD6609A7ED4201FC81\r
+:1091E000FF094D44CDC192210000394E234623CDC5\r
+:1091F000419246236668CDB092010500094D44DDD9\r
+:109200005E06DD5607CD8C86210000394E234603CD\r
+:109210000323CDCA92DDE5D1CD238BE1E1DDE1C1B0\r
+:10922000C94E2346235E2356CDD085DD4E08DD464C\r
+:1092300009DD5E06DD5607CD0C86DD6E08DD6609AC\r
+:10924000C95E2356CDD085DD5E1DDD561E210A0088\r
+:10925000ED4B18C509C923234D44DDE5D1C3518B1E\r
+:10926000DD5E0EDD560FC34988210A00ED4B18C59F\r
+:109270000946236668232346236668CD47854D4407\r
+:10928000DD6E06DD6607A7ED42EB010200CDCF8162\r
+:10929000FDE5E119EBC9CD47854D44DD6E08DD667E\r
+:1092A00009A7ED42EB010200CDCF81C97E23666F95\r
+:1092B0000104000946236668C34785DD4E08DD4684\r
+:1092C00009DD5E06DD5607C34C865E23561313CDBB\r
+:1092D000D085DD5E1DDD561EC30C87CD1885CD946F\r
+:1092E00087E56CE5E54D44EBCD2D87E1E1E1DD5E01\r
+:1092F00002DD5603CD238BC33885C5D5CDC58AE1A4\r
+:10930000E1C9DDE5C5D5210A00394E2346C52B2B21\r
+:109310002B4E2346C5210600394E2346CDD789F171\r
+:10932000F1E5DDE10117000936C823368EDD361977\r
+:109330003DDD361A91DD361BFADD361C92DDE5E1A6\r
+:10934000F1F1DDE1C9CD1885FDE5D5FDE1DD6E0862\r
+:10935000DD6609E5CDC88EE13E01DDAE04DDB60572\r
+:109360002054FD4E1047DD6E08DD6609ED422046B3\r
+:10937000FD7E0AE603283FDD6E08DD6609E5FD5E39\r
+:1093800011FD5612FD6E11FD66120E17CDE393E12D\r
+:10939000FDCB0A662820FD4E100600C5FD5E11FDBE\r
+:1093A0005612FD6E11FD66120E17094623666801FE\r
+:1093B0000401CD4785E1210102DD4E04DD4605A70C\r
+:1093C000ED42200BDD6E08DD6609E5CDD493E1FDAD\r
+:1093D000E1C33885FD5E11FD5612FD6E11FD66126A\r
+:1093E0000117000946236668010102C34785FDE5B0\r
+:1093F000DDE5D5DDE1C5FDE1210A0019CB76DD5EB5\r
+:109400001DDD561E210A00ED4B18C5097E23666F2F\r
+:109410000104000946236668CA9E94CD4785294DFC\r
+:1094200044DD6E08DD6609A7ED42EB010200CDCFF9\r
+:1094300081210600394623666819E5DD5E1DDD568B\r
+:109440001E210A00ED4B18C5097E23666F23237E7B\r
+:1094500023666FCD4785EBDD6E06DD6607A7ED520F\r
+:10946000EB010200CDCF81FDE5E119EBC1CDCF923B\r
+:10947000DD5E08DD5609010200CDCF8121060039ED\r
+:1094800046236668194D4403C5DD5E1FDD5620CDB9\r
+:109490006992C1CDD085DD5E1FDD56201823CD96A3\r
+:1094A000922106003946236668194D4403C5DD5EE6\r
+:1094B0001DDD561ECD6992C1CDD085DD5E1DDD5608\r
+:1094C0001ECD0C87DDE1FDE1C9C5DDE5F5F5D5DD96\r
+:1094D000E121020039AF7723772B2B2B77237721DC\r
+:1094E0000A00ED4B18C5097E23666F46236668E5C2\r
+:1094F000210E00194E2346E1A7ED422803CD6092CC\r
+:10950000DDCB0A46285E21000039E5CD5692E121E7\r
+:10951000000039CD2192E5DD6E06DD6607E5210408\r
+:1095200000394E2346C5234E2346DDCB0A4E28077D\r
+:10953000DD5E1016001803110000CD2D87E1E1E17A\r
+:10954000DD7E0AE682280EDD7E0AE682EE822805AE\r
+:10955000CD6A951803CDBB92210000394E2346C534\r
+:10956000CD7995E1E1E1DDE1C1C9DD4E08DD4609D6\r
+:10957000DD5E06DD5607C3CC86234E2346DDE5D1EE\r
+:10958000C3EE93C5D5E1E1C9CD24850000FDE5DD3D\r
+:109590006E0ADD660BE5DD6E08DD6609E5CDCE956C\r
+:1095A000F1F1E5FDE1010A00097EF60377DD460CE5\r
+:1095B000FD7010FD361745FD361893FD3619C9FDAF\r
+:1095C000361A94FD361B83FD361C95C3708ADD5E0A\r
+:1095D00002DD5603C3D789CD2485FCFFFDE52104B8\r
+:1095E0000039EB2145C1010200EDB0AFDD77FCDDB4\r
+:1095F00077FD010980DD6EFCDD66FD78AC67ED422C\r
+:10960000D28896DD7EFCC631DD77FE213100DD4E4D\r
+:10961000FCDD46FD09E5211600E5E5010300DD5E00\r
+:10962000FCDD56FDCDCF810E18CD4282DD6E08DD0A\r
+:109630006609A7ED520E3009E50E03DD5EFCDD562E\r
+:10964000FDCDF4810E18CD4282DD6E04DD66051974\r
+:10965000EBC1CD8895F1F1F1E5FDE1210400394D33\r
+:1096600044FDE5D1CD1097FDE5DD5E024BDD5603EF\r
+:1096700042211B000946236668C1CD4785DD34FCC5\r
+:109680002003DD34FDC3F295213000E52E16E5E51B\r
+:109690002E48DD4E08DD4609094D44211800DD5EE7\r
+:1096A00004DD5605CD2A97F1F1F1E5FDE1015AC13E\r
+:1096B000CD0F97FDE5DD5E024BDD560342211B0019\r
+:1096C000097E23666FC1CD4785210800E52E16E58A\r
+:1096D000E52E48DD4E08DD4609094D44213000DD08\r
+:1096E0005E04DD5605CD2A97F1F1F1E5FDE1015C5F\r
+:1096F000C1CD0F97FDE5DD5E024BDD560342211B18\r
+:10970000000946236668C1CD4785FDE1C33885EB76\r
+:10971000CD788AFDCB0AE6C9DD4E0ADD460B094D40\r
+:109720004421D0FFDD5E08DD560919EBC38895CDD5\r
+:109730001885FDE5D5FDE1DD6E08DD6609E5CDC8DE\r
+:109740008EE13E01DDAE04DDB6052078FD4E10470A\r
+:10975000DD6E08DD6609ED42206AFD7E0AE603281B\r
+:1097600063FD7E0AEE04FD770ADD6E08DD6609E51D\r
+:10977000FD5E11FD5612FD6E11FD66120E170946B3\r
+:10978000236668010202CD4785E1210000E501035F\r
+:1097900001FDE5D1FD6E17FD6618CD4785E1FDCBD6\r
+:1097A0000A662820FD4E100600C5FD5E11FD56120A\r
+:1097B000FD6E11FD66120E1709462366680104014D\r
+:1097C000CD4785E1210102DD4E04DD4605A7ED42CE\r
+:1097D000200BDD6E08DD6609E5CDD493E1FDE1C324\r
+:1097E0003885C5DDE5F5F5D5DDE121020039AF7736\r
+:1097F00023772B2B2B772377210A00ED4B18C509F4\r
+:109800007E23666F46236668E5210E00194E2346C7\r
+:10981000E1A7ED422803CD6092DDCB0A46CAB0989D\r
+:1098200021000039E5CD5692E1210000394E234652\r
+:10983000235E2356CDD085DD4E08DD4609DD5E066C\r
+:10984000DD5607CD0C86DDCB0A4E2825DDCB0A562A\r
+:10985000281FCD6A95DD6E08DD6609E5DD6E06DD43\r
+:109860006607E5210400394E2346C5234E234618DA\r
+:1098700023CDBB92DD6E08DD6609E5DD6E06DD6693\r
+:1098800007E5210400394E2346C5234E2346DDCB90\r
+:109890000A4E2807DD5E1016001803110000CD2DBA\r
+:1098A00087E1E1E1210000394E2346C5CD7995E1FC\r
+:1098B000E1E1DDE1C1C9CD24850000FDE5DD6E0AF1\r
+:1098C000DD660BE5DD6E08DD6609E5CDCE95F1F1CF\r
+:1098D000E5FDE1010A00097EF60777DD460CFD7023\r
+:1098E00010FD36172FFD361897FD3619E2FD361A92\r
+:1098F00097FD361B83FD361C95C3708ACD1885FDF8\r
+:10990000E5D5FDE1DD6E08DD6609E5CDC88EE12116\r
+:109910000102DD4E04DD4605A7ED4220463EFFDD97\r
+:10992000AE08DDB609203CFDCB0B66E52805010538\r
+:10993000011803010201FDE5D1FD6E17FD6618CD8A\r
+:109940004785E1FD4E100600C5FD5E11FD5612FD76\r
+:109950006E11FD66120E170946236668010103CDDC\r
+:109960004785E1210102DD4E04DD4605A7ED4220D9\r
+:10997000463EFEDDAE08DDB609203CFDCB0B66E5BC\r
+:1099800028050105011803010201FDE5D1FD6E174F\r
+:10999000FD6618CD4785E1FD4E100600C5FD5E1140\r
+:1099A000FD5612FD6E11FD66120E170946236668FC\r
+:1099B000010203CD4785E1FDE1C33885CD2485FE55\r
+:1099C000FFFDE5DD6E0ADD660BE5DD6E08DD66098F\r
+:1099D000E5CDCE95F1F1E5FDE1010A0009CBC6DD4B\r
+:1099E000460CFD7010FD3617FCFD361898FD361933\r
+:1099F0003DFD361A91FD361BFAFD361C9221FF0003\r
+:109A0000E52E14E52E28E521E4FFCD1897F1F1F1BC\r
+:109A1000DD75FEDD74FF011D0009E5110300CDE3D6\r
+:109A2000B24D44E1712370015FC1CD609A21FE0007\r
+:109A3000E52E14E52E28E521C8FFCD1897F1F1F1A8\r
+:109A4000DD75FEDD74FF011D0009E5110700CDE3A2\r
+:109A5000B24D44E17123700162C1CD609AC3708A36\r
+:109A6000DD5EFEDD56FFCD788ADD4EFEDD46FFFD74\r
+:109A7000E5D1FD6E1BFD661CCD4785C9CD1885FD62\r
+:109A8000E5D5FDE1DD6E08DD6609E5CD4593E12113\r
+:109A90000302DD4E04DD4605A7ED422046FDCB0A5C\r
+:109AA0005E28403E08DDAE08DDB609FD5E1DFD56B0\r
+:109AB0001E200FCD4EB67DB42815CDE89A2B36006A\r
+:109AC000180DCDEE9A233600CDE89ADD46087021B8\r
+:109AD0000000E5010301FDE5D1FD6E17FD6618CD1F\r
+:109AE0004785E1FDE1C33885FD5E1DFD561ECD4E67\r
+:109AF000B6FD4E1DFD461E09C9C5DDE5F5F5D5DDF2\r
+:109B0000E121020039AF7723772B2B2B77237721A5\r
+:109B10000A00ED4B18C5097E23666F46236668E58B\r
+:109B2000210E00194E2346E1A7ED422803CD609295\r
+:109B3000DDCB0A46CAB99B21000039E5CD5692E13A\r
+:109B400021000039CD2192E5DD6E06DD6607E521B5\r
+:109B50000400394E2346C5234E2346DDCB0A4E284A\r
+:109B600007DD5E1016001803110000CD2D87E1E11E\r
+:109B7000E1DDCB0A7EDD4E08DD4609DD5E06DD5601\r
+:109B8000072005CDCC861803CD4C86DD5E1DDD5645\r
+:109B90001E210A00ED4B18C5094623666801040022\r
+:109BA0000946236668CD969268603946236668192F\r
+:109BB0004D4421020039CDCA92E1E1DDE1C1C9DDA8\r
+:109BC000E5C5D5210C00394E2346C52B2B2B4E2342\r
+:109BD00046C52B2B2B4E2346C5210800394E234664\r
+:109BE000CD8895F1F1F1E5DDE1010A0009CBDE0157\r
+:109BF00069C1DDE5D1CD788ADD3619F9DD361A9AED\r
+:109C0000DD36177CDD36189AC33D93C5D5E1E1C931\r
+:109C1000C5DDE5F5F5D5DDE121020039AF77237724\r
+:109C20002B2B2B772377210A00ED4B18C5097E23B8\r
+:109C3000666F46236668E5210E00194E2346E1A7AC\r
+:109C4000ED422803CD6092DDCB0A462815210000A5\r
+:109C500039E5CD5692E1210000394E2346C5CD7934\r
+:109C600095E1E1E1DDE1C1C9CD24850000FDE5DD3F\r
+:109C70006E0ADD660BE5DD6E08DD6609E5CDCE9585\r
+:109C8000F1F1E5FDE1011D0009DD4E0C71DD460D30\r
+:109C90002370FD360A01FD360B00FD36170BFD362D\r
+:109CA000189CFD361910FD361A9CFD361B83FD36B7\r
+:109CB0001C95C3708ACD24859EFFFDE5212300DD20\r
+:109CC0004E02DD46030946DD709E2366DD749F2A41\r
+:109CD0001AC57DB42066110800CDE3B2221AC50171\r
+:109CE000060009E5111600CDE3B24D44E171237081\r
+:109CF000210600ED4B1AC5095623666A1114001996\r
+:109D0000AF772377210600ED4B1AC5097E23666FD6\r
+:109D100072210600ED4B1AC5095623666A110E0022\r
+:109D200019AF772377210600ED4B1AC50946236644\r
+:109D3000680110000977237723772377DD6E9EDD96\r
+:109D4000669F23233E1023AE2BB6204B210600DD59\r
+:109D50004E9EDD469F096E67E52A1AC5C1712370C4\r
+:109D60002A1AC52323E5CD2FA2E171237021040017\r
+:109D7000ED4B1AC509E5210600DD5E9EDD569F19F3\r
+:109D80005E2356234E2346EB3E10CD43A2E1CDE5A4\r
+:109D9000A1CD22A2CDF890DD6E9EDD669F232346E5\r
+:109DA0002366680110903E80AC67ED42DAC39EDD09\r
+:109DB0006E9EDD669F23234E2346211210CD5882CE\r
+:109DC000DAC39E210600ED4B1AC50946236668DDFD\r
+:109DD00075A2DD74A3211400DD4EA2DD46A3097E29\r
+:109DE00023B6280A211400095623666A18E12104C3\r
+:109DF00000DD4E9EDD469F094E2346211100DD5EAB\r
+:109E000002DD5603195E2356CD958BDD75A0DD74FA\r
+:109E1000A1011D00094E2346DD5E02DD5603CD780B\r
+:109E20008A0169C1DD5EA0DD56A1CD788ADD5EA024\r
+:109E30004BDD56A142211900CD2991DD6E9EDD66D4\r
+:109E40009F23235E2356CDBD8410100300B59E557D\r
+:109E50009E6D9E8D9E211D00DD4E02DD4603094E46\r
+:109E60002346DD5EA2DD56A3CD31B61848210E0093\r
+:109E7000DD4EA2DD46A309E5211D00DD4E02DD46D3\r
+:109E800003095E2356CD18AC4D44E11825211D0071\r
+:109E9000DD4E02DD4603095E2356CD29AC7C079FCB\r
+:109EA0004F41E5211000DD5EA2DD56A319D17323D9\r
+:109EB0007223712370DD5E024BDD560342211900CF\r
+:109EC000CD2991DD6E9EDD669F23234623666801C2\r
+:109ED0001E10A7ED42C2FFA0AFDD77ACDD77ADDD90\r
+:109EE00077AEDD77AF210600ED4B1AC50946236634\r
+:109EF00068E5FDE1210100E5217EC1E5CD89C0F1E4\r
+:109F0000F1DD75A0DD74A121080039E5210000E52F\r
+:109F1000DD6EA0DD66A1E5CD3BC0F1F1F1DD36A837\r
+:109F200060DD36A90021080039E5210100E5DD6E7C\r
+:109F3000A0DD66A1E5CD3BC0F1F1F1FDE5E17DB429\r
+:109F4000CA20A0FD7E0EFDB60FCA14A03E01FDAED4\r
+:109F50000EFDB60F20296F67E52E64E5CD4AA2C538\r
+:109F6000E56F67E52E64E5CD59A2C5E5FDE5218BDA\r
+:109F7000C1E521200039E5CD57B5210E0018682133\r
+:109F80000000E52E64E5FD6E0EFD660F7C079F4F19\r
+:109F900041C5E5CD68A2CD8383C5E5210000E52E4E\r
+:109FA00064E5FD6E0EFD660F7C079F4F41C5E5CD54\r
+:109FB00068A2CD2E83C5E5210000E52E64E5CD4ADB\r
+:109FC000A2C5E5210000E52E64E5CD59A2C5E5FD59\r
+:109FD0006E0EFD660FE5FDE521AEC1E5212A0039D3\r
+:109FE000E5CD57B521180039F921100039E5FD5E9E\r
+:109FF0000EFD560F7A079F4F41C5D5CD68A2EBE104\r
+:10A00000CDA48421140039EBCD4EB6E521160039DC\r
+:10A01000CDDAA1F1FD6E14FD6615E5FDE1C33B9FB0\r
+:10A020006F67E52E64E5DD4EAEDD46AFDD6EACDD7F\r
+:10A0300066ADCD8383C5E56F67E52E64E5DD4EAE85\r
+:10A04000DD46AFDD6EACDD66ADCD2E83C5E52169A5\r
+:10A05000C1E5E521EEC1E521220039E5CD57B52165\r
+:10A06000100039F921140039EBCD4EB6E521160068\r
+:10A0700039CDDAA1F1DD5EA0DD56A1CD09C0210602\r
+:10A0800000ED4B1AC50946236668E5FDE17DB4285D\r
+:10A090000EFDE5D1CD77AFFD6E14FD661518EB21F1\r
+:10A0A0000600ED4B1AC509E5111600CDE3B2EBE150\r
+:10A0B000732372210600ED4B1AC5095623666A11F7\r
+:10A0C000140019AF772377210600ED4B1AC5097EDE\r
+:10A0D00023666F72210600ED4B1AC5095623666A86\r
+:10A0E000110E0019AF772377210600ED4B1AC50931\r
+:10A0F000462366680110000977237723772377DDED\r
+:10A100006E9EDD669F232346236668011F10A7ED20\r
+:10A1100042C2D5A1210600ED4B1AC5094623666847\r
+:10A12000DD75A0DD74A1211400DD4EA0DD46A1097E\r
+:10A130007E23B6280A211400095623666A18E121F5\r
+:10A140000600DD4E9EDD469F096E67E52A1AC5C1F1\r
+:10A150007123702A1AC52323E5CD2FA2E171237044\r
+:10A16000210400ED4B1AC509E5210600DD5E9EDDE8\r
+:10A17000569F195E2356234E2346EB3E10CD43A235\r
+:10A18000E1CDE5A1CD22A2CDF890211400DD4EA0B5\r
+:10A19000DD46A109E5111600CDE3B2EBE1732372B0\r
+:10A1A000211400095623666ADD75A0DD74A101142F\r
+:10A1B0000009AF772377DD6EA0DD66A170210E0068\r
+:10A1C000DD4EA0DD46A10977237721100009772312\r
+:10A1D0007723772377FDE1C338854D44DD5EA0DD2D\r
+:10A1E00056A1C309C17123702A1AC54E23462111F5\r
+:10A1F00000DD5E02DD5603195E2356CD958BEB0123\r
+:10A200006AC1CD788A2A1AC523234E23462111001C\r
+:10A21000DD5E02DD5603195E2356CD958BEB017290\r
+:10A22000C1C9CD788A210400ED5B1AC5194EC92138\r
+:10A230000600DD4E9EDD469F095E2356234E2346D3\r
+:10A24000EB3E08CD748206004DC9FD4E12FD46134B\r
+:10A25000FD6E10FD6611C38383FD4E12FD4613FD96\r
+:10A260006E10FD6611C32E83FD4E12FD4613FD6E6A\r
+:10A2700010FD6611C38282C5D5210600394E2346E2\r
+:10A28000C5210400394E2346CDC88EE1E1E1C9CD98\r
+:10A290002485CEFFFDE5DD36D800210000E5C5CDE3\r
+:10A2A00089C0F1F1DD75D4DD74D5DD36F02BDD36F6\r
+:10A2B000F100DD36F21ADD36F300DD36F400DD7E26\r
+:10A2C000D8FE732018DD6ED9DD66DADD75F0DD7439\r
+:10A2D000F1DD6EDBDD66DCDD75F2DD74F3DD7ED88D\r
+:10A2E000FE422807DD7ED8FE4D2037DD4EDD06001C\r
+:10A2F000C5CDBCA5D5DD4EDBDD5EF0DD56F1CDC5AF\r
+:10A30000A5D5CDD9A5D5CDCCA5C1CD8895F1F1F1F7\r
+:10A31000E5FDE1DD7ED8FE4D2004FDCB0AF6DD36FD\r
+:10A32000F401DD7ED8FE54202CDD4EDD0600C5CDC7\r
+:10A33000BCA5D5DD4EDBDD5EF0DD56F1CDC5A5D586\r
+:10A34000CDD9A5D5CDCCA5C1CDB698F1F1F1E5FD1E\r
+:10A35000E1DD36F401DD7ED8FE44202CDD4EDD0645\r
+:10A3600000C5CDBCA5D5DD4EDBDD5EF0DD56F1CD03\r
+:10A37000C5A5D5CDD9A5D5CDCCA5C1CDBF9BF1F176\r
+:10A38000F1E5FDE1DD36F401DD7ED8FE4C202F2124\r
+:10A390000C003901120009E5CDBCA5D5DD4EDBDD91\r
+:10A3A0005EF0DD56F1CDC5A5D5CDD9A5D5CDCCA5D1\r
+:10A3B000C1CD689CF1F1F1E5FDE1DD36F401DD7E12\r
+:10A3C000D8FE41204C212300DD4E02DD460309E585\r
+:10A3D000212B0039EBE1732372DD6EDEDD66DFDDFC\r
+:10A3E00075F7DD74F8DD6EE0DD66E1DD75F9DD74CD\r
+:10A3F000FA211600394E2346235E2356DD71FBDD1C\r
+:10A4000070FCDD73FDDD72FEDD5E02DD5603CDE521\r
+:10A41000A5DD7ED8FE53206C210C00394D44DD5E55\r
+:10A42000D4DD56D5CDDAA8212300DD4E02DD46036A\r
+:10A4300009E5110400CDE3B2EBE17323722123009F\r
+:10A440000956DD72F52366DD74F621210009360414\r
+:10A450002336006ADD66F62323E5210800ED4B185C\r
+:10A46000C5095E2356E1732372210600ED4B18C522\r
+:10A470000946236668E5DD6EF5DD66F6C171237079\r
+:10A48000DD36F400AFDDB6F4CA7DA5DD7EDEDDB6D7\r
+:10A49000DF2865FDCB0AEEFD36210AFD36220011CC\r
+:10A4A0000A00CDE3B2FD7523FD7424FD6E23DD7536\r
+:10A4B000D0FD6624DD74D136E52336A5DD6ED0DD12\r
+:10A4C00066D12323DD4EDE71DD46DF2370210400DB\r
+:10A4D000DD4ED0DD46D109DD5EE073DD56E123724D\r
+:10A4E00021060009E5211800395E2356234E234634\r
+:10A4F000E173237223712370DD7EE6DDB6E7280C5D\r
+:10A50000DD6EE6FD750ADD66E7FD740BDD6EE8FDC8\r
+:10A51000750EDD66E9FD740FDD6EEAFD751DDD7EED\r
+:10A52000EBE60FFD771EFD7E1DFDB61E20161114F5\r
+:10A5300000CDE3B2FD751DFD741EFD6E1DFD661E92\r
+:10A5400036001804FDCB0BF6DD7EEB2E004DE6F059\r
+:10A55000472610ED423010DD6EEADD7EEBE60F6738\r
+:10A5600023FD751FFD7420FDE5DD5E024BDD560306\r
+:10A5700042211B000946236668C1CD47852114008E\r
+:10A58000E52E0E394D44DD5ED4DD56D5CDAFC0F19C\r
+:10A590003E14ADB4CABAA2DD5ED4DD56D5CD09C035\r
+:10A5A000DD5E02DD5603CD178EDD5E024BDD560308\r
+:10A5B00042211900CD2991FDE1C33885DD4EDCDD56\r
+:10A5C0005EF2DD56F3CD42821B1B1BC9DD5ED95006\r
+:10A5D000DD4EF0DD46F1C34282DD4EDADD5EF2DDB6\r
+:10A5E00056F3C34282CD2485EEFFFDE5DD6E02DD2C\r
+:10A5F0006603E5FDE121060039EB2147C1010900B1\r
+:10A60000EDB0FD6E23DD75EEFD6624DD74EF2323D2\r
+:10A610003E01AE23B62011C5010104FDE5D1FD6E5A\r
+:10A6200017FD6618CD4785E1DD6EEEDD66EF23236D\r
+:10A6300046236668CB853E02ADB4C23EA76F67E590\r
+:10A64000E5010100FD5E11FD5612CDB38DE1E1FD86\r
+:10A650006E11FD6612010800094E2346C5FD6E11FC\r
+:10A66000FD6612010600094E2346C501000059503F\r
+:10A67000CD0293F1F1DD75F0DD74F1010A000936C8\r
+:10A68000032370DD6EEEDD66EF2323CB46280C69D5\r
+:10A6900060DD4EF0DD46F10923CBEE211700DD4EE3\r
+:10A6A000F0DD46F10936772336A22119000936DBA1\r
+:10A6B000233692210600DD5EEEDD56EF195EEBDDFE\r
+:10A6C00075F2210600DD4EEEDD46EF095E235623CE\r
+:10A6D0004E2346EB3E08CD7482DD75F3210600DD86\r
+:10A6E0004EEEDD46EF095E2356234E2346EB3E1029\r
+:10A6F000CD7482DD75F4210600DD4EEEDD46EF09F6\r
+:10A700005E2356234E2346EB3E18CD7482DD75F54D\r
+:10A71000210600394D44DD5EF0DD56F1CD8FA2DD1E\r
+:10A720004EF0DD46F1C5FD5E11FD5612FD6E11FDC8\r
+:10A730006612011B000946236668C1CD4785DD6EA0\r
+:10A74000EEDD66EF23233E04AE23B6C2CFA821017F\r
+:10A7500000E5FD6E11FD66120108000946236668DA\r
+:10A7600001F6FF09E5FD6E11FD66120106000946BE\r
+:10A7700023666801F6FF09E50105005950CDBC9933\r
+:10A78000F1F1F1DD75F0DD74F1010A000936032302\r
+:10A790003610210E00DD4EF0DD46F109363023364D\r
+:10A7A00000AFDD77FDDD77FE210400DD4EEEDD46F6\r
+:10A7B000EF095E2356060CCDB7814B42DD6EFDDD01\r
+:10A7C00066FECD588230043E011801AFE60FCA6222\r
+:10A7D000A8210400DD4EEEDD46EF0946237E68E643\r
+:10A7E0000F67DD4EFDDD46FE0929E5210800ED5B22\r
+:10A7F00018C5195E2356E1192B2B5E2356D521105F\r
+:10A8000000E52E06DD5EF0DD56F1196E260001F042\r
+:10A81000FF09E5DD6EFDDD66FE29294D44290901AC\r
+:10A820001400094D44110800CD689CF1F1F1DD756B\r
+:10A83000FBDD74FC010E000936302370DD4EFBDDBC\r
+:10A8400046FCC5DD5EF04BDD56F142211B0009469A\r
+:10A85000236668C1CD4785DD34FD2003DD34FEC3AA\r
+:10A86000A8A70111C2DD5EF0DD56F1CD788A01FFA7\r
+:10A8700000DD5EF0DD56F1CD958B010E000936301E\r
+:10A8800023700EFEDD5EF0DD56F1CD958BEBCDCD68\r
+:10A890008BDD4EF0DD46F1C5FD5E11FD5612FD6EFD\r
+:10A8A00011FD6612011B000946236668C1CD47856C\r
+:10A8B000210000E5FD5E11FD5612FD6E11FD6612D0\r
+:10A8C0000117000946236668010301CD4785E1FDB4\r
+:10A8D000E5D1CDB59CFDE1C33885CD2485F8FFFDDC\r
+:10A8E000E5030ADD77FE030ADD77FF0369604EDDCD\r
+:10A8F00071FC2346DD70FDDD6EFE6729EBCDE3B212\r
+:10A90000DD75FADD74FB5950CD0489C54D44DD5E1B\r
+:10A9100002DD5603CDAFC0F1110000AFDD77F8DDE9\r
+:10A9200077F9DD4EFCDD46FD6B62CD58823035CDCA\r
+:10A93000A0A9303023DD75F8DD74F92B29DD4EFA3E\r
+:10A94000DD46FB09E5FDE5E1194D44E1712370FDAC\r
+:10A95000E5E1197EB728031318F56B6213FDE5C115\r
+:10A96000097718BECDA0A9301329DD4EFADD46FBCC\r
+:10A9700009E5FDE5E1194D44E1712370210600ED83\r
+:10A980004B18C509FDE5C1712370210800ED4B1876\r
+:10A99000C509DD4EFA71DD46FB2370FDE1C3388544\r
+:10A9A000DD4EFEDD46FFDD6EF8DD66F9C35882C57B\r
+:10A9B000D5111000CDE3B22218C5210000221AC51E\r
+:10A9C0002A18C5AF772377210400ED4B18C5097706\r
+:10A9D0002377210A00ED4B18C509772377210C0056\r
+:10A9E000ED4B18C509772377210800ED4B18C509F1\r
+:10A9F000772377210600ED4B18C509772377CD48DB\r
+:10AA000085210000E5E5219F89E501B68911300027\r
+:10AA1000CD7588E1E1E1210000E5E5219F89E501AF\r
+:10AA2000C189113100CD7588E1E1E1210000E5E542\r
+:10AA300021AD89E501CC89113200CD7588E1E1E1D4\r
+:10AA4000210E00ED4B18C509E5118000D55AD54BF4\r
+:10AA500042CD0293F1F14D44E1712370210E00EDDE\r
+:10AA60004B18C5095623666A110A0019360123726C\r
+:10AA7000210E00ED4B18C5095623666A11170019FF\r
+:10AA800036772336A2210E00ED4B18C50946236602\r
+:10AA9000680119000936DB233692D1C1C9C5D52119\r
+:10AAA0000E00ED4B18C5095E2356CDCD8BCD7F87AB\r
+:10AAB000CDC285D1C1C9CD2485FEFF011DC2210EA5\r
+:10AAC00000ED5B18C5195E2356CD8FA2210100E56C\r
+:10AAD0002339CD2DABF13E01ADB428F0210400EDBA\r
+:10AAE0004B18C5097E23B62041210100E52339CD4D\r
+:10AAF0002DABF13E01ADB420E3DDB6FE28DE4F06FE\r
+:10AB000000C5210E00ED5B18C5195E2356210E000D\r
+:10AB1000ED4B18C5094623666801170009462366F0\r
+:10AB200068010100CD4785E118B2C338854D442A3C\r
+:10AB300018C523235E2356C3AFC0CDAFA9CDB6AA97\r
+:10AB4000C39DAACD2485FCFF2AA8C32BDD75FCDD9F\r
+:10AB500074FD21FFFF22A8C32100002216C5DDCB12\r
+:10AB6000FD7E2043DD6EFCDD66FD2929011CC50943\r
+:10AB700046236668DD75FEDD74FFDD6EFCDD66FD77\r
+:10AB80002929011EC5094E2346DD5E02DD5603DD7F\r
+:10AB90006EFEDD66FFCD4785DD6EFCDD66FD2BDDDF\r
+:10ABA00075FCDD74FD18B7C33885CD18852AA8C398\r
+:10ABB000CB7C200E010A802AA8C33E80AC67ED4200\r
+:10ABC000380B210C002214C521FFFF183C2143AB98\r
+:10ABD0002216C5DD7E02DDB603282B2AA8C329294B\r
+:10ABE000011CC509DD4E02DD46037123702AA8C38E\r
+:10ABF0002929011EC509DD4E04DD46057123702A91\r
+:10AC0000A8C32322A8C3210000C33885CD1885011D\r
+:10AC10000000CDAAABC33885CD1885210A00E50117\r
+:10AC20000000CD85B6F1C33885CD1885210A00E531\r
+:10AC3000010000CD85B6F1C33F85CD1885160021F2\r
+:10AC4000AAC3197EE604280EDD7E02EE206FDD7EAB\r
+:10AC500003EE00671806DD6E02DD6603C33885CD9E\r
+:10AC60001885160021AAC3197EE602280EDD7E0291\r
+:10AC7000EE206FDD7E03EE00671806DD6E02DD66F6\r
+:10AC800003C33885CD2485F8FFAFDD77FEDD77FF80\r
+:10AC9000DD7E02DDB603206411C4C4CD84AC7DB476\r
+:10ACA000201411DCC4CD84AC7DB4200A11F4C4CDD1\r
+:10ACB00084AC7DB4280621FFFFC376AE2AC2C4DD72\r
+:10ACC0007502DD7403DD7E02DDB6032829DD5E0238\r
+:10ACD000DD5603CD84AC7DB4280621FFFFC376AEDC\r
+:10ACE000211600DD4E02DD4603095623666ADD7536\r
+:10ACF00002DD740318CF210000C376AE210C00DD05\r
+:10AD00004E02DD4603097EE680CAD1AD210600DD94\r
+:10AD10004E02DD4603095E23560A6F030A67A7ED5C\r
+:10AD200052DD75FADD74FB7DB4CACFAD210600DDBE\r
+:10AD30004E02DD46030946236668DD75F8DD74F9C9\r
+:10AD4000DD6EFADD66FBE5DD4EF8DD46F9210A0031\r
+:10AD5000DD5E02DD5603195E2356CD09C1F1DD75B6\r
+:10AD6000FCDD74FD4D44210000CD5882301E2100D1\r
+:10AD700000397EDD86FC77237EDD8EFD77210200A3\r
+:10AD8000397EDD96FC77237EDD9EFD77DD4EFCDD92\r
+:10AD900046FD210000CD588238A6DD7EFCDDA6FDF3\r
+:10ADA0003C20092A14C53E04ADB42894DD7EFADDAA\r
+:10ADB000B6FB281B210C00DD4E02DD4603097EF6A2\r
+:10ADC0000077237EF60277DD36FEFFDD36FFFF18C3\r
+:10ADD00065210C00DD4E02DD4603097EE640285663\r
+:10ADE000DD6E02DD66034E2346DD6E02DD66032363\r
+:10ADF000235623666AA7ED42DD75FADD74FB4D44E8\r
+:10AE0000210000CD5882302E210100E5DD4EFADD13\r
+:10AE100046FBA7210000ED427C079F4F41C5E5217D\r
+:10AE20000A00DD4E02DD4603095E2356CD61C0F106\r
+:10AE3000F1F1CB782800210C00DD4E02DD4603093C\r
+:10AE40007EE63F77237EE6FA7769602323E52104D7\r
+:10AE500000DD4E02DD460309E521060009562366A2\r
+:10AE60006AE56960C1712370E1712370E17123703B\r
+:10AE7000DD6EFEDD66FFC33885CD2485FEFFCDED9A\r
+:10AE8000B5210C000946236668DD75FEDD74FF7D83\r
+:10AE9000E6402813DD5E04DD5605CD84AC7DB42884\r
+:10AEA0000621FFFFC374AFDD7EFEE6206FDD7EFF6F\r
+:10AEB000E603673E20ADB4280621FFFFC374AF212F\r
+:10AEC0000800DD4E04DD4605095E23560A6F030ABD\r
+:10AED00067A7ED523813DD5E04DD5605CD84AC7DE9\r
+:10AEE000B4280621FFFFC374AFDD6E04DD66054E96\r
+:10AEF000234603702B710B6960DD460270210C0044\r
+:10AF0000DD4E04DD4605097EF68077237EF6007768\r
+:10AF10003E0ADDAE02DDB6032007DD7EFEE601203F\r
+:10AF200007DD7EFEE6022812DD5E04DD5605CD84D7\r
+:10AF3000AC7DB4280521FFFF183ADD7EFEE603282C\r
+:10AF400018210400DD4E04DD460509E5210600094F\r
+:10AF50004E2346E17123701816210400DD4E04DDF6\r
+:10AF6000460509E5210800094E2346E1712370DDFD\r
+:10AF70006E022600C33885CD2485FCFF21FCFFDD51\r
+:10AF80004E02DD460309DD75FEDD74FF23237E23BB\r
+:10AF9000B6280621FFFFC354B02A48C5DD75FCDD85\r
+:10AFA00074FDDD4EFCDD46FDDD6EFEDD66FFA7EDCA\r
+:10AFB000423817DD6EFCDD66FD232346236668DD1F\r
+:10AFC0004EFEDD46FFA7ED423053DD6EFCDD66FD33\r
+:10AFD00023234E2346DD6EFCDD66FDA7ED423829B6\r
+:10AFE000DD4EFEDD46FFDD6EFCDD66FDA7ED423881\r
+:10AFF00016DD6EFCDD66FD23234E2346DD6EFEDD91\r
+:10B0000066FFA7ED4230021814DD6EFCDD66FD23FD\r
+:10B010002346236668DD75FCDD74FD1885DD6EFE54\r
+:10B02000DD66FF2323E5DD4EFCDD46FD030369609D\r
+:10B030004E2346E1712370DD6EFCDD66FD2323DDCA\r
+:10B040004EFEDD46FF712370DD6EFCDD66FD22489D\r
+:10B05000C5210000C33885CD2485E2FF21000039D9\r
+:10B060004D44DD5E02DD5603CD29C07DA43C28128F\r
+:10B07000DD7EE6E6006FDD7EE7E6F0673E20ACB5FC\r
+:10B0800028052100001803210100C33885CD24853F\r
+:10B09000D6FFDD6E08DD6609DD75F8DD74F9210087\r
+:10B0A0000039DD75FADD74FB212C0039DD75FCDD1E\r
+:10B0B00074FD213800397ED60A77DD4E0ADD460B55\r
+:10B0C000212400CD58823811010280DD6E0ADD6630\r
+:10B0D0000B3E80AC67ED423003C310B2DD6EFCDD89\r
+:10B0E00066FD23237EE60047237EE680B02831AF4D\r
+:10B0F000DDB60C282BDD6EF8DD66F923DD75F8DD95\r
+:10B1000074F92B362DDD4E04DD4605DD6E02DD665D\r
+:10B1100003CD6984DD7502DD7403DD7104DD700526\r
+:10B12000DD6EFCDD66FD23237E23B62002184EDD96\r
+:10B130006E0ADD660B7C079F4F41C5E5DD4E04DDE1\r
+:10B140004605DD6E02DD6603CD5E83E5DD6EFADD6C\r
+:10B1500066FB23DD75FADD74FB2BC171212C0039F0\r
+:10B16000DD5E0ADD560B7A079F4F41CD8B84DD6E85\r
+:10B17000FCDD66FD23237E23B620B41830DD5E029D\r
+:10B18000DD5603DD4E0ADD460BCDEB81DD6EFADDCB\r
+:10B1900066FB23DD75FADD74FB2B73DD5E02DD5685\r
+:10B1A00003CDC181DD6EFCDD66FD732372DD6EFCB7\r
+:10B1B000DD66FD7E23B620C5210000394D44DD6EDD\r
+:10B1C000FADD66FBA7ED42DD75FFAFDDB6FF284077\r
+:10B1D000DD6EFADD66FB2BDD75FADD74FB46DD7096\r
+:10B1E000FE78FE0A300ADD7EFEC630DD77FE1809E5\r
+:10B1F000DD7EFEDD860EDD77FEDD6EF8DD66F92391\r
+:10B20000DD75F8DD74F92BDD46FE70DD35FF18BA0B\r
+:10B21000DD6EF8DD66F93600DD6E08DD6609C338DF\r
+:10B2200085CD2485FEFFDD36FE41DDCB097E281667\r
+:10B23000DD36FE61DD4E08DD4609A7210000ED4246\r
+:10B24000DD7508DD7409DD6EFEE50E01C5DD6E08F5\r
+:10B25000DD6609E5DD6E04DD6605E53E0ADDAE0866\r
+:10B26000DDB609200DDD5E02DD56037A079F4F41F2\r
+:10B270001809DD5E02DD5603010000CD8DB0F1F14D\r
+:10B28000F1F1C33885CD2485FEFFDD36FE41DDCBEF\r
+:10B290000B7E2816DD36FE61DD4E0ADD460BA7214A\r
+:10B2A0000000ED42DD750ADD740BDD6EFEE53E0A41\r
+:10B2B000DDAE0ADDB60B20043E011801AF4FC5DD3F\r
+:10B2C0006E0ADD660BE5DD6E08DD6609E5DD4E0420\r
+:10B2D000DD4605DD5E02DD5603CD8DB0F1F1F1F105\r
+:10B2E000C33885CD2485FAFFDD6E02DD6603232396\r
+:10B2F00023CB3CCB1DCB3CCB1D23DD75FEDD74FF8A\r
+:10B300002A48C5DD75FCDD74FD7DB42011DD36FCF9\r
+:10B3100044DD36FDC52144C52246C52248C5DD6E43\r
+:10B32000FCDD66FD232346236668DD75FADD74FBCC\r
+:10B33000DD6EFADD66FB232346236668DD4EFADD0B\r
+:10B3400046FBA7ED42CAD3B3DD6EFADD66FB4623AA\r
+:10B3500066682929DD4EFADD46FB09E503036960CD\r
+:10B360004E2346E1A7ED42206ADD6EFADD66FB233F\r
+:10B370002346236668ED4B48C5A7ED422015DD6ED8\r
+:10B38000FADD66FB2323462366682323462366688B\r
+:10B390002248C5DD6EFADD66FB23237E23666F4EF1\r
+:10B3A0002346DD6EFADD66FB7E8177237E8877DDBE\r
+:10B3B0006EFADD66FB2323E5DD4EFADD46FB030373\r
+:10B3C00069604E2346030369604E2346E171237092\r
+:10B3D000C330B3DD6EFADD66FB46236668DD4EFEE4\r
+:10B3E000DD46FFA7ED42DA91B4DD6EFADD66FB467D\r
+:10B3F000236668DD4EFEDD46FFA7ED42201CDD6EB4\r
+:10B40000FCDD66FD2323E5DD4EFADD46FB03036923\r
+:10B41000604E2346E17123701856DD6EFEDD66FF37\r
+:10B420002929DD4EFADD46FB092248C5DD6EFCDD2B\r
+:10B4300066FD2323ED5B48C57323722A48C5232389\r
+:10B44000E5030369604E2346E1712370DD6EFADD8A\r
+:10B4500066FB46236668DD4EFEDD46FFA7ED42E54E\r
+:10B460002A48C5D1732372DD6EFADD66FB71237045\r
+:10B47000DD6EFCDD66FD2248C5DD6EFADD66FB2370\r
+:10B4800023AF772377210400DD4EFADD46FB091850\r
+:10B49000222A48C5DD4EFADD46FBA7ED42204511C4\r
+:10B4A0000004CDC9C0DD75FADD74FB7DA43C200627\r
+:10B4B000210000C33885DD6EFADD66FB36002336D9\r
+:10B4C00001DD6EFADD66FB2323AF772377210400CD\r
+:10B4D000DD4EFADD46FB09EBCD77AF2A48C5DD75B9\r
+:10B4E000FADD74FBDD6EFADD66FBDD75FCDD74FDF7\r
+:10B4F000DD6EFADD66FB232346236668DD75FADD23\r
+:10B5000074FBC330B3CD2485FCFFDD6E02DD660322\r
+:10B51000DD75FCDD74FDDD71FEDD70FFDD6E08DDC7\r
+:10B5200066092BDD7508DD7409237DB42820DD6EE6\r
+:10B53000FEDD66FF23DD75FEDD74FF2B46DD6EFC50\r
+:10B54000DD66FD23DD75FCDD74FD2B7018CEDD6E30\r
+:10B5500002DD6603C33885CD2485FCFF210E00394A\r
+:10B5600001020009DD75FCDD74FDDD4E08DD4609D4\r
+:10B57000ED43AAC4E5DD4E0ADD460B11AAC4CDC6D3\r
+:10B58000BAF1DD75FEDD74FF2AAAC43600DD6EFE59\r
+:10B59000DD66FFC33885CD2485FEFF2AC2C4DD7574\r
+:10B5A000FEDD74FF11DCC4CD84AC11F4C4CD84ACD9\r
+:10B5B000DD7EFEDDB6FF2832DD5EFEDD56FFCD848A\r
+:10B5C000AC210A00DD4EFEDD46FF095E2356CD09A3\r
+:10B5D000C0210A000936FF2336FF21160009562331\r
+:10B5E000666ADD75FEDD74FF18C6C33885D52A0C82\r
+:10B5F000C57DB420021822210000220CC5110100D3\r
+:10B60000CD57B07DB4280C21E8C47EF60177237EA7\r
+:10B61000F600771196B5CD0CACD1C9CD1885D5CD36\r
+:10B620004EB6D119EBCD31B6DD6E02DD6603C338FF\r
+:10B6300085CD18855950CD4EB623E5DD4E04DD4647\r
+:10B6400005DD5E02DD5603CD05B5F1C33885CD2499\r
+:10B6500085FEFFDD6E02DD6603DD75FEDD74FFDD58\r
+:10B660006EFEDD66FFAFB6280ADD34FE2003DD3452\r
+:10B67000FF18ECDD4E02DD4603DD6EFEDD66FFA742\r
+:10B68000ED42C33885CD2485F8FFAFDD77FCDD774B\r
+:10B69000FDDD6E02DD6603DD75FEDD74FFDD6EFE31\r
+:10B6A000DD66FF4E060021AAC3097EE610280ADDEA\r
+:10B6B00034FE2003DD34FF18E4DD6EFEDD66FF7E20\r
+:10B6C000FE2D2012DD34FC2003DD34FDDD34FE20B0\r
+:10B6D00003DD34FF1813DD6EFEDD66FF7EFE2B20DA\r
+:10B6E00008DD34FE2003DD34FFDD6E08DD6609E58C\r
+:10B6F000DD4E04DD4605DD5EFEDD56FFCDAEB7F165\r
+:10B70000DD75F8DD74F9DD71FADD70FBDD7EFCDDE1\r
+:10B71000B6FD2805CD6984180CDD4EFADD46FBDD4B\r
+:10B720006EF8DD66F9C33F85CD2485FEFFDD36FE6C\r
+:10B73000FFDD36FFFFDD5E02160021AAC3197EE69B\r
+:10B7400008280FDD4E02060021D0FF09DD75FEDD61\r
+:10B7500074FFDD4E02060021AAC3097EE604280F0D\r
+:10B76000DD4E02060021A9FF09DD75FEDD74FFDD57\r
+:10B770004E02060021AAC3097EE602280FDD4E0212\r
+:10B78000060021B0FF09DD75FEDD74FFDD4E04DD2E\r
+:10B790004605DD6EFEDD66FFCD58823808DD36FEDB\r
+:10B7A000FFDD36FFFFDD6EFEDD66FFC33885CD248D\r
+:10B7B00085FAFF110280DD6E08DD66093E80AC6708\r
+:10B7C000ED52380EDD4E08DD4609212400CD5882A9\r
+:10B7D0003007AFDD7708DD7709DD6E02DD66034EE9\r
+:10B7E000060021AAC3097EE610280ADD34022003E0\r
+:10B7F000DD340318E4DD6E02DD66037EFE2B200AD5\r
+:10B80000DD34022003DD3403186DDD7E08DDB6096A\r
+:10B810002065DD6E02DD66037EFE30205ADD6E029D\r
+:10B82000DD6603237EEE20FE582017DD360810DD8E\r
+:10B83000360900210800397EC60277237ECE0077C4\r
+:10B840001835DD6E02DD6603237EEE20FE422017F2\r
+:10B85000DD360802DD360900210800397EC6027790\r
+:10B86000237ECE00771810DD360808DD360900DDAE\r
+:10B8700034022003DD3403DD7E08DDB6092008DD57\r
+:10B8800036080ADD360900AFDD77FADD77FBDD77B4\r
+:10B89000FCDD77FDDD4E08DD4609DD6E02DD660369\r
+:10B8A0005ECD28B7DD75FEDD74FF7DA43C282E211A\r
+:10B8B000000039DD5E08DD56097A079F4F41CD7BD8\r
+:10B8C0008421000039DD5EFEDD56FF7A079F4F417F\r
+:10B8D000CDA484DD34022003DD340318B7DD7E04FB\r
+:10B8E000DDB6052811DD6E02DD6603E5DD6E04DDE3\r
+:10B8F0006605C1712370DD4EFCDD46FDDD6EFADDAF\r
+:10B9000066FBC33F85CD2485FEFFDD36FE41DDCBE2\r
+:10B910000B7E2816DD36FE61DD4E0ADD460BA721C3\r
+:10B920000000ED42DD750ADD740BDD6EFEE50E00F4\r
+:10B93000C5DD6E0ADD660BE5DD6E08DD6609E5DD59\r
+:10B940004E04DD4605DD5E02DD5603CD8DB0F1F11E\r
+:10B95000F1F1C33885CD2485FAFFAFDD77FBDD77C4\r
+:10B96000FC5950CD4EB6DD75FDDD74FEDD6E04DD97\r
+:10B9700066057EFE2D2014DD6E04DD660523DD7573\r
+:10B9800004DD74052B46DD700A180EAFDDB60A28FB\r
+:10B9900008DD34FD2003DD34FEDD7E10DDA6113C24\r
+:10B9A000281DDD4EFDDD46FEDD6E10DD6611CD5835\r
+:10B9B00082300CDD6E10DD6611DD75FDDD74FEDD9F\r
+:10B9C0004EFDDD46FEDD6E0EDD660FCD5882300C7D\r
+:10B9D000DD6EFDDD66FEDD750EDD740FDD6E0EDDE8\r
+:10B9E000660FDD75FBDD74FC211400397EDD96FDEC\r
+:10B9F00077237EDD9EFE77DD7E0EDDB60F2009DD2E\r
+:10BA00007EFDDDB6FECABDBADD7E08DDB609203496\r
+:10BA1000DD7E0EDDB60F282CDD7EFDDDB6FE280FA7\r
+:10BA2000AFDDB60A2809DD7E0CFE3020021823DDCA\r
+:10BA3000460CDD70FADD6E0EDD660F2BDD750EDD5A\r
+:10BA4000740F184EDD7EFDDDB6FE2833AFDDB60A7D\r
+:10BA5000280CDD460ADD70FADD360A001812DD6EAC\r
+:10BA600004DD660523DD7504DD74052B46DD70FA03\r
+:10BA7000DD6EFDDD66FE2BDD75FDDD74FE1813DD6C\r
+:10BA8000460CDD70FADD6E0EDD660F2BDD750EDD0A\r
+:10BA9000740FDD4E02DD4603DD5EFA1600CD79AE91\r
+:10BAA000DD7EFAFE0A20133E01DDAE12DDB6132064\r
+:10BAB00009DD5E02DD5603CD84ACC3F7B9DD6EFB54\r
+:10BAC000DD66FCC33885CD2485A2FFAFDD77B0DD10\r
+:10BAD00077B1210C00DD5E02DD5603197EE6034FCF\r
+:10BAE000237EE60047DD71FDDD70FE210C00197E2E\r
+:10BAF000E6FC77237EE6FF77DD6E04DD6605AFB6F4\r
+:10BB0000CAA8BFDD6E04DD66057EFE25C265BF3EA8\r
+:10BB100002DDAEFDDDB6FE2009DD5E02DD5603CDA1\r
+:10BB200084ACAFDD77A4DD77A5DD36B300DD36B2BA\r
+:10BB300020DD36ACFFDD36ADFFAFDD77AADD77ABBC\r
+:10BB4000DD36A8FFDD36A9FFDD36AE0ADD36AF00F3\r
+:10BB5000211B0039DD75B5DD74B6DD36B400AFDD0F\r
+:10BB600077A6DD77A7AFDD77A2DD77A3DD340420EC\r
+:10BB700003DD3405DD6E04DD66057EFE30380BDD49\r
+:10BB80006E04DD66053E39BE3002186521000039BD\r
+:10BB9000010A00CD6A82DD6E04DD66054E060021D5\r
+:10BBA000D0FF094D44210000397E8177237E8877BC\r
+:10BBB000DD7EAADDB6AB280EDD6EA2DD66A3DD75E7\r
+:10BBC000A8DD74A91821DD7EA2DDB6A3200DDD7EDF\r
+:10BBD000B2FE202006DD36B230188ADD6EA2DD66A8\r
+:10BBE000A3DD75ACDD74ADDD34042003DD34051850\r
+:10BBF00083DD6E04DD66055ECDDF84140000202148\r
+:10BC0000232A2B2D2E5862636468696C6F707375DC\r
+:10BC10007861BF78BD80BDF4BE53BD49BDD4BCE9D9\r
+:10BC2000BCDFBCE9BCB1BE3FBD6EBDC9BC4BBC56A0\r
+:10BC3000BC6ABC63BC93BE56BC3BBCDD6E04DD6617\r
+:10BC4000052BDD7504DD7405C365BFDD36A401DD9C\r
+:10BC500036A500C365BBDD6E04DD660546DD70B349\r
+:10BC6000C365BBDD36B401C365BB216600397EC642\r
+:10BC70000277237ECE00772B6E672B2B46236668D8\r
+:10BC8000DD75A2DD74A3DD7EAADDB6AB280EDD6E08\r
+:10BC9000A2DD66A3DD75A8DD74A9182ADD6EA2DD1C\r
+:10BCA00066A3DD75ACDD74ADCB7C281ADD36A4014E\r
+:10BCB000DD36A500DD4EA2DD46A3A7210000ED4242\r
+:10BCC000DD75ACDD74ADC365BBDD36AA01DD36AB19\r
+:10BCD00000C365BBDD36A601DD36A700C365BBAF7B\r
+:10BCE000DD77A6DD77A7C365BB210A00E5211D002E\r
+:10BCF00039E5DD7EA6DDB6A7281D216A00397EC69E\r
+:10BD00000477237ECE00772B6E6701FCFF095E234C\r
+:10BD100056234E2346181A216A00397EC60277231D\r
+:10BD20007ECE00772B6E672B2B5E23567A079F4FB4\r
+:10BD300041CD85B2F1F1DD75B5DD74B6C318BFDD57\r
+:10BD400036AE02DD36AF001837DD36AE08DD36AF71\r
+:10BD500000182DAFDD77A6DD77A7DD36B230DD36F2\r
+:10BD6000AC05DD36AD00DD36A808DD36A900DD36D0\r
+:10BD7000AE10DD36AF001808DD36AEF0DD36AFFFB1\r
+:10BD8000DD7EA6DDB6A7281E216600397EC60477B3\r
+:10BD9000237ECE00772B6E6701FCFF095E235623BE\r
+:10BDA0004E2346EB1819216600397EC60277237EA2\r
+:10BDB000CE00772B6E672B2B46236668010000DDD3\r
+:10BDC00075B9DD74BADD71BBDD70BCDD5EAEDD560C\r
+:10BDD000AFD5211D003901040009E5DD4EBBDD466C\r
+:10BDE000BCDD5EB9DD56BACD05B9F1F1DD75B5DD65\r
+:10BDF00074B6DD36B726DD36B8C2AFDDB6B4CA904C\r
+:10BE0000BE3E02DDAEAEDDB6AF200ADD36B727DDC1\r
+:10BE100036B8C218493E08DDAEAEDDB6AF2018DD3B\r
+:10BE20007EB9DDB6BADDB6BBDDB6BC2808DD36B7F7\r
+:10BE30002ADD36B8C218273E10DDAEAEDDB6AF2023\r
+:10BE40000ADD36B72CDD36B8C218133E0FDDAEAEB4\r
+:10BE5000DDA6AF3C2008DD36B72FDD36B8C2DD6E7B\r
+:10BE6000B7DD66B8AFB62828DD36B200DD4EB7DDE7\r
+:10BE700046B8211B00395D54CD31B6DD4EB5DD46E7\r
+:10BE8000B6211B00395D54CD1BB6DD75B5DD74B62A\r
+:10BE9000C318BFDD6E04DD6605234E0600DD71A20A\r
+:10BEA000DD70A379B02808DD34042003DD340518E3\r
+:10BEB0001C216600397EC60277237ECE00772B6E6A\r
+:10BEC000672B2B46236668DD75A2DD74A3DD46A2D1\r
+:10BED000DD6EB5DD66B670DD6EB5DD66B6233600A7\r
+:10BEE000AFDDB6B4280CDD6EB5DD66B646DD70B2EA\r
+:10BEF0001822181C216600397EC60277237ECE00E8\r
+:10BF0000772B6E672B2B46236668DD75B5DD74B61F\r
+:10BF1000DD36B220DD36B300DD6EFDDD66FEE5DD2B\r
+:10BF20006EA8DD66A9E5DD6EACDD66ADE5DD6EB261\r
+:10BF3000E5DD6EB3E5DD6EA4DD66A5E5DD4EB5DDC0\r
+:10BF400046B6DD5E02DD5603CD55B9EB210C003956\r
+:10BF5000F9EB4D44210E00397E8177237E887718D6\r
+:10BF60000218021838DD4E02DD4603DD6E04DD6680\r
+:10BF7000055E1600CD79AEDD34B02003DD34B1DDD1\r
+:10BF80006E04DD66057EFE0A20133E01DDAEFDDD9A\r
+:10BF9000B6FE2009DD5E02DD5603CD84ACDD34043F\r
+:10BFA0002003DD3405C3F8BA210C00DD4E02DD4666\r
+:10BFB00003097EDDB6FD77237EDDB6FE773E02DD2A\r
+:10BFC000AEFDDDB6FE2009DD5E02DD5603CD84AC9C\r
+:10BFD0003E01DDAEFDDDB6FE2016210400DD4E0281\r
+:10BFE000DD460309E5210600094E2346E171237071\r
+:10BFF000DD6EB0DD66B1C33885CD1885D521020070\r
+:10C00000E5CDD9C0F1F1C33885CD1885D52106001D\r
+:10C01000E5CDD9C0F1F1C33885CD1885D5210B0008\r
+:10C02000E5CDD9C0F1F1C33885CD1885C5D5210D31\r
+:10C0300000E5CDD9C0F1F1F1C33885CD1885DD6EAD\r
+:10C040000CDD660DE5DD6E0ADD660BE5DD6E08DDF7\r
+:10C050006609E5210F00E5CDD9C0F1F1F1F1C33852\r
+:10C0600085CD1885DD6E0CDD660DE5DD6E0ADD66BD\r
+:10C070000BE5DD6E08DD6609E5D5211900E5CDF19A\r
+:10C08000C0F1F1F1F1F1C33F85CD1885DD6E0CDD16\r
+:10C09000660DE5DD6E0ADD660BE5DD6E08DD660921\r
+:10C0A000E5211400E5CDD9C0F1F1F1F1C33885CD1A\r
+:10C0B0001885DD6E08DD6609E5C5D5211700E5CDDB\r
+:10C0C000D9C0F1F1F1F1C33885CD1885D52118001B\r
+:10C0D000E5CDD9C0F1F1C3388521020039C5D55E5F\r
+:10C0E0002356234D44F730062214C521FFFFD1C14A\r
+:10C0F000C921020039D55E2356234D44F73008226A\r
+:10C1000014C521FFFF4D44D1C9CD1885DD6E08DD72\r
+:10C110006609E5C5D5212400E5CDD9C0F1F1F1F1DD\r
+:10C12000C338851B4B1B5300001B4300001B4E00F4\r
+:10C13000001B5200001B4600001B5A0000000000BC\r
+:10C140001B45001B000000303030302E736372003E\r
+:10C150002F6465762F6C6364300030004345004FD8\r
+:10C160004B0043616E63656C0000426172636F64F3\r
+:10C1700065005374756B73005072696A73002F64A5\r
+:10C1800065762F7072696E74657200253133732085\r
+:10C190005665726B6F6F70617274696B656C20208D\r
+:10C1A0007C25376C642C2530326C640D0A002531F7\r
+:10C1B0003373205665726B6F6F70617274696B6553\r
+:10C1C0006C0D0A253464782040207C2025376C646F\r
+:10C1D0002C2530326C64202020202020202020209C\r
+:10C1E0007C25376C642C2530326C640D0A000D0AF6\r
+:10C1F00025313373546F7461616C3A253130737C2F\r
+:10C2000025376C642C2530326C640D0A0D0A0D0A3A\r
+:10C21000004D65737361676520426F780030303080\r
+:10C22000302E7363720000306200300030780030CE\r
+:10C2300058004AC74AC74AC700000000010101016F\r
+:10C24000010101010111111111110101010101018E\r
+:10C250000101010101010101010101011020202062\r
+:10C26000202020202020202020202020484848482E\r
+:10C270004848484848482020202020202042424268\r
+:10C2800042424202020202020202020202020202CE\r
+:10C290000202020202020220202020202044444404\r
+:10C2A000444444040404040404040404040404048E\r
+:10C2B00004040404040404202020200100000000E1\r
+:10C2C000000000000000000000000000000000006E\r
+:10C2D000000000000000000000000000000000005E\r
+:10C2E000000000000000000000000000000000004E\r
+:10C2F000000000000000000000000000000000003E\r
+:10C30000000000000000000000000000000000002D\r
+:10C31000000000000000000000000000000000001D\r
+:10C32000000000000000000000000000000000000D\r
+:10C3300000000000000000000000000000000000FD\r
+:10C34000FFFF0000FFFFFFFF2000000000000000D3\r
+:10C350000000000000004AC54AC54AC54AC54AC691\r
+:10C3600000001000000000000000000000004AC6AD\r
+:10C370004AC64AC64AC64AC701002000000000005B\r
+:10C3800000000000000002C502C502C502C504C5C8\r
+:10C390000200220000000000000000000000010078\r
+:00000001FF\r
diff --git a/src/gui/wnd.lnk b/src/gui/wnd.lnk
new file mode 100644 (file)
index 0000000..5db953d
--- /dev/null
@@ -0,0 +1,14 @@
+-k ..\..\lib\r
+-l libcb.lib\r
+-l libsysb.lib\r
+-l libiar.lib\r
+-m\r
+-u\r
+-i\r
+-o grlogin\r
+-bl RCODE=0x8100\r
+-bl CODE=0x4000,0x10000\r
+-bc CODE=0x4000\r
+..\..\lib\c0b.rel\r
+wnd\r
+login\r
diff --git a/src/gui/wnd.map b/src/gui/wnd.map
new file mode 100644 (file)
index 0000000..b5732b9
--- /dev/null
@@ -0,0 +1,283 @@
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+.  .ABS.               00000000    00000000 =           0. bytes (ABS,OVR)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00000000  s__DEFAUL |    00000000  l_CCSTR   |    00000000  l_ECSTR  \r
+     00000000  .__.ABS.  |    00000000  ?CL64180L |    00000000  ?CL64180B\r
+     00000014  e__DEFAUL |    00000014  l__DEFAUL |    0000002F  l_CONST  \r
+     00000153  l_CSTR    |    00000170  l_CDATA0  |    00000170  l_IDATA0 \r
+     000003B5  l_UDATA0  |    00000430  l_RCODE   |    00001000  l_CSTACK \r
+     00004000  s_CODE    |    00008100  s_RCODE   |    00008530  e_RCODE  \r
+     00008530  s_CONST   |    0000855F  s_CSTR    |    0000855F  e_CONST  \r
+     000086B2  e_CSTR    |    000086B2  s_IDATA0  |    000086B2  s_CDATA0 \r
+     00008822  s_UDATA0  |    00008822  e_CCSTR   |    00008822  e_ECSTR  \r
+     00008822  s_CCSTR   |    00008822  e_CDATA0  |    00008822  s_ECSTR  \r
+     00008822  e_IDATA0  |    00008BD7  e_UDATA0  |    00008BD7  s_CSTACK \r
+     00009BD7  e_CSTACK  |    0000C257  l_CODE    |    00010257  e_CODE   \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+_DEFAULT               00000000    00000014 =          20. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+RCODE                  00008100    00000430 =        1072. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00008100  __init    |    0000811F  ?L_MUL_L0 |    000081A3  ?BANK_LEA\r
+     000081A9  ?BANK_FAS |    000081AE  ?S_MUL_L0 |    000081C4  ?C_V_SWIT\r
+     000081D6  ?L_ADDASG |    000081EF  ?ENT_PARM |    000081FB  ?BANK_CAL\r
+     00008208  ?S_S_SWIT |    0000821C  ?S_V_SWIT |    00008239  ?S_SWITCH\r
+     00008247  ?SL_MOD_L |    0000827A  ?ENT_AUTO |    0000828E  ?V_SWITCH\r
+     00008298  ?SL_DIV_L |    000082C8  ?SS_CMP_L |    000082DA  ?L_INC_L0\r
+     000082E2  ?US_MOD_L |    000082EB  ?SS_DIV_L |    00008307  ?UL_RSHAS\r
+     00008315  ?US_DIV_L |    00008323  ?SL_RSH_L |    00008331  ?UL_RSH_L\r
+     0000834C  ?L_DIVMOD |    000083A4  ?BANK_LEA |    000083B0  ?SS_RSH_L\r
+     000083BA  ?L_LSH_L0 |    000083D2  ?S_DIVMOD |    000083E8  ?S_MULASG\r
+     000083F2  ?L_END_AS |    000083FB  ?L_NOT_L0 |    0000840A  ?L_XOR_L0\r
+     00008428  ?L_ORASG_ |    00008441  ?LEAVE_DI |    00008448  ?L_FIND_S\r
+     0000848C  ?UL_DIVAS |    0000849C  ?UL_MOD_L |    000084C1  ?S_FIND_S\r
+     000084DD  ?UL_DIV_L |    00008505  ?L_NEG_L0 |    00008517  ?L_MULASG\r
+     00008527  ?L_END_MU\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CONST                  00008530    0000002F =          47. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTR                   0000855F    00000153 =         339. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+IDATA0                 000086B2    00000170 =         368. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     000086CA  __IO_list |    000086CC  stdin     |    000086E4  stdout   \r
+     000086FC  stderr    |    0000871A  _path_pas |    0000871C  __sys_err\r
+     0000871E  __sys_ner |    00008720  __on_exit |    00008722  __ctype  \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CDATA0                 000086B2    00000170 =         368. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+ECSTR                  00008822    00000000 =           0. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CCSTR                  00008822    00000000 =           0. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CODE                   00004000    0000C257 =       49751. bytes (NUL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00004736  GraphicsO |    000047D2  GraphicsC |    000047EA  Move     \r
+     00004829  ClearRect |    0000486C  DrawRectN |    000048B1  FillRect \r
+     000048F6  FillRectN |    0000493B  GrayRect  |    00004980  Text     \r
+     000049AC  TouchRegi |    00004A03  ClearScre |    00004A40  EnableScr\r
+     00004A7E  grSetFont |    00004ABB  fontSearc |    00004AEB  setCurren\r
+     00004B87  loadFont  |    00004C2E  stringwid |    00004CA7  stringhei\r
+     00004CC4  stringhei |    00004CD7  stringhei |    00004CE0  stringwid\r
+     00004CF1  stringwid |    00004CFA  stringwid |    00004D03  Component\r
+     00004DAD  Component |    00004DFA  Component |    00004E58  Component\r
+     00004E9E  Component |    00004EE2  Component |    00004F1A  Component\r
+     000050EB  Component |    0000510A  Component |    00005173  Component\r
+     00005226  Window_ha |    00005490  Window_pa |    0000561C  Root_pain\r
+     00005653  Window_ad |    00005661  Window_ne |    000056B3  Button_ha\r
+     0000576A  Button_dr |    00005838  Button_pa |    0000590B  Button_ad\r
+     00005911  Button_ne |    00005963  ToggleBut |    000059FC  ToggleBut\r
+     00005AE8  ToggleBut |    00005B3A  Dialog_ha |    00005BF3  Dialog_ne\r
+     00005CE2  Display_h |    00005D60  Display_p |    00005E7D  Display_n\r
+     00005ED7  Label_han |    00005EDD  Label_pai |    00005F3E  Label_new\r
+     00005F97  Transacti |    000065D5  rootWindo |    000065F3  screenbui\r
+     000069BB  root_acti |    00006CF0  read_stri |    00006DC5  gui_globa\r
+     00006DCB  GUIinit   |    00006EFB  GUIunit   |    00006F20  GUIgo    \r
+     00006F9F  login     |    000070C8  login_act |    0000723B  main     \r
+     000072A2  setgid    |    000072BC  unix      |    000072D6  sprintf  \r
+     0000731A  strrchr   |    00007382  fflush    |    00007595  chdir    \r
+     000075AA  _write    |    000075C9  setuid    |    000075E3  printf   \r
+     00007612  lseek     |    0000763F  __stdio_c |    000076AA  __stdio_i\r
+     000076E8  setenv    |    00007964  unsetenv  |    00007A04  close    \r
+     00007A19  strlen    |    00007A50  strcmp    |    00007AF1  perror   \r
+     00007B2E  execv     |    00007B41  ioctl     |    00007B6C  isatty   \r
+     00007BA7  fstat     |    00007BBE  free      |    00007C9E  getpwnam \r
+     00007D00  setpwent  |    00007D45  endpwent  |    00007D64  getpwent \r
+     00007D82  strcpy    |    00014000  __getpwen |    00014288  atoi     \r
+     0001441E  vfprintf  |    00014979  ltoa      |    000149DC  atol     \r
+     000149F2  __longtoa |    00014B86  itoa      |    00014BEF  crypt    \r
+     00014E9C  fputs     |    00014EFA  open      |    00014F25  malloc   \r
+     00015151  exit      |    00015181  _read     |    000151A0  memcmp   \r
+     0001520D  execve    |    0001522C  strerror  |    000153E9  memset   \r
+     00015429  memcpy    |    000154F7  on_exit   |    00015570  atexit   \r
+     00015583  strcat    |    000155A3  unix_long |    000155BD  strchr   \r
+     000155F8  _exit     |    00015693  strtoul   |    000157EA  fputc    \r
+     000158FC  toupper   |    00015921  tolower   |    00015946  ultoa    \r
+     0001599B  strtol    |    00015A43  sbrk     \r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+UDATA0                 00008822    000003B5 =         949. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+     00008822  _argc     |    00008824  _argv     |    00008826  environ  \r
+     00008828  errno     |    0000882A  __cleanup |    0000882D  global   \r
+     0000882F  trans     |    00008B4F  __malloc_ |    00008B53  __malloc_\r
+     00008BA5  __on_exit\r
+Hexadecimal  [32-Bits]\r
+\r
+Area                       Addr        Size        Decimal Bytes (Attributes)\r
+--------------------       ----        ----        ------- ----- ------------\r
+CSTACK                 00008BD7    00001000 =        4096. bytes (REL,CON)\r
+\r
+        Value  Global            Value  Global            Value  Global    \r
+        -----  ------            -----  ------            -----  ------    \r
+\r
+Files Linked                              [ module(s) ]\r
+\r
+..\..\lib\c0b.rel                         [ _c0b ]\r
+wnd                                       [ wnd ]\r
+login                                     [ login ]\r
+\r
+\r
+Libraries Linked                          [ object file ]\r
+\r
+..\..\lib\libsysb.lib                     [ relsysb\setgid.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys0b.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\sprintf.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMUL.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strrchr.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fflush.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\chdir.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\write.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMUL.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\setuid.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\printf.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\lseek.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\stdio0.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\setenv.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\close.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strlen.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcmp.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\CVSWITCH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\perror.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\execv.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\ioctl.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LADDASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\isatty.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\fstat.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\free.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\getpwnam.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTPARMDIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKCALLDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\setpwent.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcpy.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSSWITCH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SVSWITCH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSWITCHEND.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLMOD.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\getpwent.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ENTAUTODIRECT.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\VSWITCHEND.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atoi.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLDIV.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\vfprintf.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ltoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atol.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSCMP.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\itoa.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LINC.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\crypt.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputs.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\open.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULRSHASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\USDIV.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LIBVERSION.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\malloc.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SLRSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULRSH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\exit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LDIVMOD.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\read.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\BANKLEAVE32.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SSRSH.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LLSH.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcmp.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\execve.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SDIVMOD.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\error.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SMULASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LENDASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNOT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memset.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\memcpy.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\atexit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LXOR.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strcat.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sys1b.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LORASG.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strchr.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\_exit.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LEAVEDIRECT.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtoul.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\fputc.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ctype.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\ultoa.rel ]\r
+..\..\lib\libcb.lib                       [ relcb\strtol.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LFINDSIGN.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIVASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULMOD.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\SFINDSIGN.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\ULDIV.rel ]\r
+..\..\lib\libsysb.lib                     [ relsysb\sbrk.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LNEG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LMULASG.rel ]\r
+..\..\lib\libiar.lib                      [ reliar\LENDMULDIVASG.rel ]\r
+\r
+\r
+User Base Address Definitions\r
+\r
+l RCODE=0x8100\r
+l CODE=0x4000,0x10000\r
+c CODE=0x4000\r
diff --git a/src/gui/wnd.rel b/src/gui/wnd.rel
new file mode 100644 (file)
index 0000000..cec1bfd
--- /dev/null
@@ -0,0 +1,3437 @@
+XL4\r
+H 5 areas 57 global symbols\r
+M wnd\r
+S ?BANK_FAST_LEAVE_L08 Ref00000000\r
+S fflush Ref00000000\r
+S _write Ref00000000\r
+S ?S_MUL_L02 Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
+S close Ref00000000\r
+S strlen Ref00000000\r
+S ?C_V_SWITCH_L06 Ref00000000\r
+S ioctl Ref00000000\r
+S free Ref00000000\r
+S ?ENT_PARM_DIRECT_L09 Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S stdout Ref00000000\r
+S ?S_V_SWITCH_L06 Ref00000000\r
+S ?ENT_AUTO_DIRECT_L09 Ref00000000\r
+S ?SS_CMP_L02 Ref00000000\r
+S open Ref00000000\r
+S ?SS_DIV_L02 Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S ?SL_RSH_L03 Ref00000000\r
+S malloc Ref00000000\r
+S _read Ref00000000\r
+S ?SS_RSH_L02 Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 22FC flags 0\r
+S Window_new Def00000F71\r
+S stringheight2 Def00000583\r
+S GraphicsOpen Def00000000\r
+S Component_findXY Def0000074A\r
+S Text Def00000239\r
+S GUIunit Def00002222\r
+S Button_new Def00001235\r
+S setCurrentFont Def000003A5\r
+S ToggleButton_new Def0000140F\r
+S ClearScreen Def000002BD\r
+S gui_globals Def000020F5\r
+S Component_delete_children Def00000997\r
+S Component_paint Def00000704\r
+S stringheight Def00000553\r
+S Window_paint Def00000D9F\r
+S Component_find Def0000078E\r
+S Window_handler Def00000AD2\r
+S FillRect Def0000016A\r
+S loadFont Def00000433\r
+S Button_paint Def00001136\r
+S rootWindow_handler Def000018F0\r
+S ToggleButton_paint Def00001323\r
+S Dialog_new Def0000151A\r
+S Button_handler Def00000FC3\r
+S read_stringtable Def00002020\r
+S ToggleButton_handler Def00001287\r
+S GUIgo Def00002247\r
+S Component_add Def000006A6\r
+S grSetFont Def00000338\r
+S Display_new Def000017D6\r
+S Window_add Def00000F63\r
+S GrayRect Def000001F4\r
+S Component_changestate_children Def000009B6\r
+S Button_add Def0000122F\r
+S Component_delete Def000007C6\r
+S FillRectNC Def000001AF\r
+S stringwidth0 Def0000058C\r
+S screenbuilder Def0000190E\r
+S TouchRegion Def00000266\r
+S GraphicsClose Def0000008E\r
+S EnableScreen Def000002FA\r
+S stringwidth1 Def0000059D\r
+S stringwidth2 Def000005A6\r
+S Label_new Def00001897\r
+S fontSearch Def00000375\r
+S DrawRectNC Def00000125\r
+S Dialog_handler Def00001461\r
+S Button_drawtext Def0000107A\r
+S stringheight01 Def00000570\r
+S Display_paint Def0000168A\r
+S Display_handler Def00001609\r
+S ClearRect Def000000E2\r
+S stringwidth Def000004DA\r
+S Move Def000000A3\r
+S GUIinit Def000020FB\r
+S Label_paint Def00001836\r
+S Component_new Def000005AF\r
+S Label_handler Def00001830\r
+S Component_setlabel Def00000659\r
+S root_actionhandler Def00001CE8\r
+S Root_paint Def00000F2C\r
+S Component_linkstringtable Def00000A1F\r
+A CSTR size 21 flags 0\r
+A CONST size 34 flags 0\r
+A UDATA0 size 2 flags 0\r
+S global Def00000000\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 CD 00 00 00 00 F8 FF 21 06 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T 09 00 00 00 EB 21 00 00 00 00 01 02 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 12 00 00 00 2A 00 00 00 00 23 23 E5 03 03 C5\r
+R 00 00 01 00 00 05 04 00\r
+T 1B 00 00 00 01 00 00 00 00 C5 3E 00 00 00 00\r
+R 00 00 01 00 00 05 02 00 2B 0B 10 00\r
+T 21 00 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 10 00 02 0A 0B 00\r
+T 28 00 00 00 F1 4D 44 E1 71 23 70 21 00 00 39\r
+R 00 00 01 00\r
+T 33 00 00 00 E5 21 00 00 E5 2A 00 00 00 00 23\r
+R 00 00 01 00 00 0A 04 00\r
+T 3C 00 00 00 23 4E 23 46 C5 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 08 00\r
+T 44 00 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 02 04 08 00 02 09 0B 00\r
+T 4B 00 00 00 F1 DD 36 FC 60 DD 36 FD 00 21\r
+R 00 00 01 00\r
+T 55 00 00 00 00 00 39 E5 21 01 00 E5 2A\r
+R 00 00 01 00\r
+T 5E 00 00 00 00 00 00 00 23 23 4E 23 46 C5 3E\r
+R 00 00 01 00 00 04 04 00\r
+T 67 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+T 6C 00 00 00 00 00 00 00 F1 F1 F1 21 02 00 E5\r
+R 00 00 01 00 02 04 0B 00\r
+T 75 00 00 00 2E 08\r
+R 00 00 01 00\r
+T 77 00 00 00\r
+R 00 00 01 00\r
+T 77 00 00 00 39 4D\r
+R 00 00 01 00\r
+T 79 00 00 00\r
+R 00 00 01 00\r
+T 79 00 00 00 44 2A 00 00 00 00\r
+R 00 00 01 00 00 06 04 00\r
+T 7D 00 00 00\r
+R 00 00 01 00\r
+T 7D 00 00 00 23 23\r
+R 00 00 01 00\r
+T 7F 00 00 00\r
+R 00 00 01 00\r
+T 7F 00 00 00 5E 23\r
+R 00 00 01 00\r
+T 81 00 00 00\r
+R 00 00 01 00\r
+T 81 00 00 00 56 3E 00 00 00 00\r
+R 00 00 01 00 2B 06 02 00\r
+T 84 00 00 00\r
+R 00 00 01 00\r
+T 84 00 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 02 05 02 00 02 0A 0B 00\r
+T 8B 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T 8E 00 00 00\r
+R 00 00 01 00\r
+T 8E 00 00 00 D5 2A 00 00 00 00 23 23 5E 23 56\r
+R 00 00 01 00 00 06 04 00\r
+T 97 00 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 05 00 02 0A 05 00\r
+T 9D 00 00 00 00 00 00 00 D1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 0A 00 00\r
+T A3 00 00 00\r
+R 00 00 01 00\r
+T A3 00 00 00 CD 00 00 00 00 FC FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T AC 00 00 00 EB 21 02 00 00 00 01 04 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T B5 00 00 00 DD 46 02 DD 70 FE DD 46 04 DD 70\r
+R 00 00 01 00\r
+T C0 00 00 00 FF 21 04 00 E5 2B 2B C3\r
+R 00 00 01 00\r
+T C8 00 00 00 77 00 00 00 4D\r
+R 00 00 01 00 00 04 01 00\r
+T CB 00 00 00\r
+R 00 00 01 00\r
+T CB 00 00 00 C3 79 00 00 00 2A 00 00 00 00 23\r
+R 00 00 01 00 00 05 01 00 00 0A 04 00\r
+T D2 00 00 00 23\r
+R 00 00 01 00\r
+T D3 00 00 00\r
+R 00 00 01 00\r
+T D3 00 00 00 5E 23\r
+R 00 00 01 00\r
+T D5 00 00 00\r
+R 00 00 01 00\r
+T D5 00 00 00 56 3E 00 00 00 00\r
+R 00 00 01 00 2B 06 02 00\r
+T D8 00 00 00\r
+R 00 00 01 00\r
+T D8 00 00 00 C3 84 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T DF 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T E2 00 00 00\r
+R 00 00 01 00\r
+T E2 00 00 00 CD 00 00 00 00 FC FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T EB 00 00 00 EB 21 06 00 00 00 01 04 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T F4 00 00 00 DD 46 02 DD 70 FE DD 46 04 DD 70\r
+R 00 00 01 00\r
+T FF 00 00 00 FF 21 04 00 E5 2B 2B C3\r
+R 00 00 01 00\r
+T 07 01 00 00 77 00 00 00 4D C3 CB 00 00 00 2A\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T 0E 01 00 00 00 00 00 00\r
+R 00 00 01 00 00 04 04 00\r
+T 10 01 00 00\r
+R 00 00 01 00\r
+T 10 01 00 00 C3 7D 00 00 00 23 C3 D3 00 00 00\r
+R 00 00 01 00 00 05 01 00 00 0B 01 00\r
+T 17 01 00 00 23 56 3E 00 00 00 00\r
+R 00 00 01 00 2B 07 02 00\r
+T 1B 01 00 00\r
+R 00 00 01 00\r
+T 1B 01 00 00 C3 84 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T 22 01 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T 25 01 00 00\r
+R 00 00 01 00\r
+T 25 01 00 00 CD 00 00 00 00 FC FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T 2E 01 00 00 EB 21 0A 00 00 00 01 04 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 37 01 00 00 DD 46 02 DD 70 FE DD 46 04 DD 70\r
+R 00 00 01 00\r
+T 42 01 00 00 FF 21 04 00 E5 2B 2B C3\r
+R 00 00 01 00\r
+T 4A 01 00 00 77 00 00 00 4D C3 CB 00 00 00 2A\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T 51 01 00 00 00 00 00 00 C3 10 01 00 00 23\r
+R 00 00 01 00 00 04 04 00 00 09 01 00\r
+T 57 01 00 00\r
+R 00 00 01 00\r
+T 57 01 00 00 C3 7F 00 00 00 23 C3 D5 00 00 00\r
+R 00 00 01 00 00 05 01 00 00 0B 01 00\r
+T 5E 01 00 00 3E 00 00 00 00 C3 1B 01 00 00 CD\r
+R 00 00 01 00 2B 05 02 00 00 0A 01 00\r
+T 64 01 00 00 00 00 00 00 F1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 0A 04 00\r
+T 6A 01 00 00\r
+R 00 00 01 00\r
+T 6A 01 00 00 CD 00 00 00 00 FC FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T 73 01 00 00 EB 21 0E 00 00 00 01 04 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 7C 01 00 00 DD 46 02 DD 70 FE DD 46 04 DD 70\r
+R 00 00 01 00\r
+T 87 01 00 00 FF 21 04 00 E5 2B 2B C3\r
+R 00 00 01 00\r
+T 8F 01 00 00 77 00 00 00 4D C3 CB 00 00 00 2A\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T 96 01 00 00 00 00 00 00 C3 10 01 00 00 23 C3\r
+R 00 00 01 00 00 04 04 00 00 09 01 00\r
+T 9D 01 00 00 57 01 00 00 23\r
+R 00 00 01 00 00 04 01 00\r
+T A0 01 00 00\r
+R 00 00 01 00\r
+T A0 01 00 00 C3 81 00 00 00 3E 00 00 00 00 C3\r
+R 00 00 01 00 00 05 01 00 2B 0A 02 00\r
+T A6 01 00 00 D8 00 00 00 CD 00 00 00 00 F1 C3\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T AD 01 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 04 00\r
+T AF 01 00 00\r
+R 00 00 01 00\r
+T AF 01 00 00 CD 00 00 00 00 FC FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T B8 01 00 00 EB 21 12 00 00 00 01 04 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T C1 01 00 00 DD 46 02 DD 70 FE DD 46 04 DD 70\r
+R 00 00 01 00\r
+T CC 01 00 00 FF 21 04 00 E5 2B 2B C3\r
+R 00 00 01 00\r
+T D4 01 00 00 77 00 00 00 4D C3 CB 00 00 00 2A\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T DB 01 00 00 00 00 00 00 C3 10 01 00 00 23 C3\r
+R 00 00 01 00 00 04 04 00 00 09 01 00\r
+T E2 01 00 00 57 01 00 00 23 C3 A0 01 00 00 3E\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T E9 01 00 00 00 00 00 00\r
+R 00 00 01 00 2B 04 02 00\r
+T EA 01 00 00\r
+R 00 00 01 00\r
+T EA 01 00 00 C3 84 00 00 00 CD 00 00 00 00 F1\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T F1 01 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T F4 01 00 00\r
+R 00 00 01 00\r
+T F4 01 00 00 CD 00 00 00 00 FC FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T FD 01 00 00 EB 21 16 00 00 00 01 04 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 06 02 00 00 DD 46 02 DD 70 FE DD 46 04 DD 70\r
+R 00 00 01 00\r
+T 11 02 00 00 FF 21 04 00 E5 2B 2B C3\r
+R 00 00 01 00\r
+T 19 02 00 00 77 00 00 00 4D C3 CB 00 00 00 2A\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T 20 02 00 00 00 00 00 00 C3 10 01 00 00 23 C3\r
+R 00 00 01 00 00 04 04 00 00 09 01 00\r
+T 27 02 00 00 57 01 00 00 23 C3 A0 01 00 00 3E\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T 2E 02 00 00 00 00 00 00 C3 EA 01 00 00 CD\r
+R 00 00 01 00 2B 04 02 00 00 09 01 00\r
+T 33 02 00 00 00 00 00 00 F1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 0A 04 00\r
+T 39 02 00 00\r
+R 00 00 01 00\r
+T 39 02 00 00 C5 FD E5 DD E5 D5 DD E1 3E\r
+R 00 00 01 00\r
+T 42 02 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 06 00 02 09 06 00\r
+T 47 02 00 00 00 00 00 00 E5 DD E5 C1 2A\r
+R 00 00 01 00 02 04 0B 00\r
+T 4E 02 00 00 00 00 00 00 23 23 5E 23 56 3E\r
+R 00 00 01 00 00 04 04 00\r
+T 56 02 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 02 00 02 09 02 00\r
+T 5B 02 00 00 00 00 00 00 F1\r
+R 00 00 01 00 02 04 0B 00\r
+T 5E 02 00 00\r
+R 00 00 01 00\r
+T 5E 02 00 00 DD E1 FD E1 C1 C3 00 00 00 00\r
+R 00 00 01 00 02 0A 00 00\r
+T 66 02 00 00\r
+R 00 00 01 00\r
+T 66 02 00 00 CD 00 00 00 00 F8 FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T 6F 02 00 00 EB 21 1A 00 00 00 01 07 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 78 02 00 00 DD 46 02 DD 70 FA DD 46 04 DD 70\r
+R 00 00 01 00\r
+T 83 02 00 00 FB DD 46 0A DD 70 FC DD 46 0C DD\r
+R 00 00 01 00\r
+T 8E 02 00 00 70 FD DD 46 0E DD 70 FE 21 07 00\r
+R 00 00 01 00\r
+T 99 02 00 00 E5 2E 02 C3 77 00 00 00 4D C3\r
+R 00 00 01 00 00 08 01 00\r
+T A1 02 00 00 CB 00 00 00 2A 00 00 00 00 C3\r
+R 00 00 01 00 00 04 01 00 00 09 04 00\r
+T A7 02 00 00 10 01 00 00 23 C3 57 01 00 00 23\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T AE 02 00 00 C3 A0 01 00 00 3E 00 00 00 00 C3\r
+R 00 00 01 00 00 05 01 00 2B 0A 02 00\r
+T B4 02 00 00 EA 01 00 00 CD 00 00 00 00 F1 C3\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T BB 02 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 04 00\r
+T BD 02 00 00\r
+R 00 00 01 00\r
+T BD 02 00 00 C5 D5 CD D7 02 00 00 CD\r
+R 00 00 01 00 00 07 01 00\r
+T C3 02 00 00 00 00 00 00 21 80 00 E5 6C E5 E5\r
+R 00 00 01 00 02 04 0B 00\r
+T CC 02 00 00 CD EF 02 00 00 E1 E1 E1 D1 C1 C3\r
+R 00 00 01 00 00 05 01 00\r
+T D5 02 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 00 00\r
+T D7 02 00 00\r
+R 00 00 01 00\r
+T D7 02 00 00 01 00 00 59 50 3E A3 00 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T DF 02 00 00 A3 00 00 00 CD 00 00 00 00 01\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T E5 02 00 00 80 00 58 50 3E E2 00 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T EC 02 00 00 E2 00 00 00 C9\r
+R 00 00 01 00 00 04 01 00\r
+T EF 02 00 00\r
+R 00 00 01 00\r
+T EF 02 00 00 4D 44 EB\r
+R 00 00 01 00\r
+T F2 02 00 00\r
+R 00 00 01 00\r
+T F2 02 00 00 3E 66 02 00 00 21 66 02 00 00 C3\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T F8 02 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T FA 02 00 00\r
+R 00 00 01 00\r
+T FA 02 00 00 CD 00 00 00 00 FC FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T 03 03 00 00 EB 21 21 00 00 00 01 03 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 0C 03 00 00 DD 46 02 DD 70 FE 21 03 00 E5 2B\r
+R 00 00 01 00\r
+T 17 03 00 00 C3 77 00 00 00 4D C3 CB 00 00 00\r
+R 00 00 01 00 00 05 01 00 00 0B 01 00\r
+T 1E 03 00 00 2A 00 00 00 00 C3 10 01 00 00 23\r
+R 00 00 01 00 00 05 04 00 00 0A 01 00\r
+T 25 03 00 00 C3 57 01 00 00 23 C3 A0 01 00 00\r
+R 00 00 01 00 00 05 01 00 00 0B 01 00\r
+T 2C 03 00 00 3E 00 00 00 00 C3 EA 01 00 00 CD\r
+R 00 00 01 00 2B 05 02 00 00 0A 01 00\r
+T 32 03 00 00 00 00 00 00 F1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 0A 04 00\r
+T 38 03 00 00\r
+R 00 00 01 00\r
+T 38 03 00 00 CD 00 00 00 00 FE FF 21 00 00 39\r
+R 00 00 01 00 02 05 0E 00\r
+T 41 03 00 00 EB 21 24 00 00 00 01 02 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 4A 03 00 00 DD 46 02 DD 70 FF 21 02 00 E5 C3\r
+R 00 00 01 00\r
+T 55 03 00 00 77 00 00 00 4D C3 CB 00 00 00 2A\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T 5C 03 00 00 00 00 00 00 C3 10 01 00 00 23 C3\r
+R 00 00 01 00 00 04 04 00 00 09 01 00\r
+T 63 03 00 00 57 01 00 00 23 C3 A0 01 00 00 3E\r
+R 00 00 01 00 00 04 01 00 00 0A 01 00\r
+T 6A 03 00 00 00 00 00 00 C3 EA 01 00 00 CD\r
+R 00 00 01 00 2B 04 02 00 00 09 01 00\r
+T 6F 03 00 00 00 00 00 00 F1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 0A 04 00\r
+T 75 03 00 00\r
+R 00 00 01 00\r
+T 75 03 00 00 CD 00 00 00 00 00 00 21 0C 00 ED\r
+R 00 00 01 00 02 05 0E 00\r
+T 7E 03 00 00 4B 00 00 00 00 09\r
+R 00 00 01 00 00 05 04 00\r
+T 82 03 00 00\r
+R 00 00 01 00\r
+T 82 03 00 00 46 23 66 68 EB\r
+R 00 00 01 00\r
+T 87 03 00 00\r
+R 00 00 01 00\r
+T 87 03 00 00 7B B2 28 16 6B 62 46 23 66 68 DD\r
+R 00 00 01 00\r
+T 92 03 00 00 4E 02 DD 46 03 ED 42 28 06\r
+R 00 00 01 00\r
+T 9B 03 00 00\r
+R 00 00 01 00\r
+T 9B 03 00 00\r
+R 00 00 01 00\r
+T 9B 03 00 00\r
+R 00 00 01 00\r
+T 9B 03 00 00 21 08 00 19 18 E1\r
+R 00 00 01 00\r
+T A1 03 00 00\r
+R 00 00 01 00\r
+T A1 03 00 00 EB C3 00 00 00 00\r
+R 00 00 01 00 02 06 04 00\r
+T A5 03 00 00\r
+R 00 00 01 00\r
+T A5 03 00 00 CD 00 00 00 00 3E 75 03 00 00 21\r
+R 00 00 01 00 02 05 0A 00 29 0A 01 00\r
+T AB 03 00 00 75 03 00 00 CD 22 04 00 00 28 29\r
+R 00 00 01 00 00 04 01 00 00 09 01 00\r
+T B2 03 00 00\r
+R 00 00 01 00\r
+T B2 03 00 00 DD 5E 02 DD 56 03 3E 38 03 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T BA 03 00 00 21 38 03 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T C1 03 00 00 0A 00 ED 4B 00 00 00 00 09 E5 DD\r
+R 00 00 01 00 00 08 04 00\r
+T CA 03 00 00 5E 02 DD 56 03 3E 75 03 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T D2 03 00 00 75 03 00 00 CD 2D 04 00 00 E1 71\r
+R 00 00 01 00 00 04 01 00 00 09 01 00\r
+T D9 03 00 00 23 70\r
+R 00 00 01 00\r
+T DB 03 00 00\r
+R 00 00 01 00\r
+T DB 03 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T DE 03 00 00\r
+R 00 00 01 00\r
+T DE 03 00 00 ED 4B 00 00 00 00 09 46 23 66 68\r
+R 00 00 01 00 00 06 04 00\r
+T E7 03 00 00\r
+R 00 00 01 00\r
+T E7 03 00 00 23 23 4E 23 46 23 7E 69 60 CD\r
+R 00 00 01 00\r
+T F1 03 00 00 00 00 00 00 4D 44 FD 6E 06 FD 66\r
+R 00 00 01 00 02 04 0B 00\r
+T FA 03 00 00 07 A7 ED 42 EB 01 02 00 CD\r
+R 00 00 01 00\r
+T 03 04 00 00 00 00 00 00 DD 6E 04 DD 66 05 19\r
+R 00 00 01 00 02 04 11 00\r
+T 0C 04 00 00 EB 3E A3 00 00 00 21 A3 00 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 12 04 00 00 C9\r
+R 00 00 01 00\r
+T 13 04 00 00\r
+R 00 00 01 00\r
+T 13 04 00 00 CD 00 00 00 00 4D 44 FD 6E 08 FD\r
+R 00 00 01 00 02 05 0B 00\r
+T 1C 04 00 00 66 09 A7 ED 42 C9\r
+R 00 00 01 00\r
+T 22 04 00 00\r
+R 00 00 01 00\r
+T 22 04 00 00 CD 00 00 00 00 7D B4 C9\r
+R 00 00 01 00 02 05 0B 00\r
+T 28 04 00 00\r
+R 00 00 01 00\r
+T 28 04 00 00 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 05 14 00 02 0A 14 00\r
+T 2D 04 00 00\r
+R 00 00 01 00\r
+T 2D 04 00 00 CD 00 00 00 00 4D 44 C9\r
+R 00 00 01 00 02 05 0B 00\r
+T 33 04 00 00\r
+R 00 00 01 00\r
+T 33 04 00 00 CD 00 00 00 00 FC FF FD E5 11\r
+R 00 00 01 00 02 05 0E 00\r
+T 3B 04 00 00 0E 00 CD CE 04 00 00 DD 4E 02 71\r
+R 00 00 01 00 00 07 01 00\r
+T 44 04 00 00 DD 46 03 23 70 DD 46 0C DD 6E 0A\r
+R 00 00 01 00\r
+T 4F 04 00 00 FD 75 02 DD 66 0B FD 74 03 FD 70\r
+R 00 00 01 00\r
+T 5A 04 00 00 04 DD 46 10 DD 6E 0E FD 75 05 DD\r
+R 00 00 01 00\r
+T 65 04 00 00 66 0F FD 74 06 FD 70 07 AF FD 77\r
+R 00 00 01 00\r
+T 70 04 00 00 08 FD 77 09 DD 6E 12 FD 75 0A DD\r
+R 00 00 01 00\r
+T 7B 04 00 00 66 13 FD 74 0B DD 6E 14 FD 75 0C\r
+R 00 00 01 00\r
+T 86 04 00 00 DD 66 15 FD 74 0D 21 0C 00 ED 4B\r
+R 00 00 01 00\r
+T 91 04 00 00 00 00 00 00 09 7E 23 B6 21 0C 00\r
+R 00 00 01 00 00 04 04 00\r
+T 9A 04 00 00 ED 4B 00 00 00 00 09 20 10\r
+R 00 00 01 00 00 06 04 00\r
+T A1 04 00 00\r
+R 00 00 01 00\r
+T A1 04 00 00 FD E5 C1 71 23 70 21 0A 00 ED 4B\r
+R 00 00 01 00\r
+T AC 04 00 00 00 00 00 00 09 18 12\r
+R 00 00 01 00 00 04 04 00\r
+T B1 04 00 00\r
+R 00 00 01 00\r
+T B1 04 00 00 46 23 66 68 EB\r
+R 00 00 01 00\r
+T B6 04 00 00\r
+R 00 00 01 00\r
+T B6 04 00 00 21 08 00 19 7E 23 B6 21 08 00 19\r
+R 00 00 01 00\r
+T C1 04 00 00 20 EE\r
+R 00 00 01 00\r
+T C3 04 00 00\r
+R 00 00 01 00\r
+T C3 04 00 00\r
+R 00 00 01 00\r
+T C3 04 00 00 FD E5 C1 71 23 70\r
+R 00 00 01 00\r
+T C9 04 00 00\r
+R 00 00 01 00\r
+T C9 04 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T CE 04 00 00\r
+R 00 00 01 00\r
+T CE 04 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 14 00 02 0A 14 00\r
+T D4 04 00 00 00 00 00 00 E5 FD E1 C9\r
+R 00 00 01 00 02 04 0B 00\r
+T DA 04 00 00\r
+R 00 00 01 00\r
+T DA 04 00 00 FD E5 DD E5 C5 D5 DD 21 00 00 FD\r
+R 00 00 01 00\r
+T E5 04 00 00 21 00 00\r
+R 00 00 01 00\r
+T E8 04 00 00\r
+R 00 00 01 00\r
+T E8 04 00 00 FD E5 21 02 00 39 4E 23 46 E1 09\r
+R 00 00 01 00\r
+T F3 04 00 00 7E B7 28 50\r
+R 00 00 01 00\r
+T F7 04 00 00\r
+R 00 00 01 00\r
+T F7 04 00 00 FD E5 E1 09 5E CD 00 00 00 00\r
+R 00 00 01 00 02 0A 07 00\r
+T FF 04 00 00 0A 00 21 2C 2E 31 49 69 6A 6B 6C\r
+R 00 00 01 00\r
+T 0A 05 00 00 72 35 05 00 00 30 05 00 00\r
+R 00 00 01 00 00 05 01 00 00 09 01 00\r
+T 0F 05 00 00 26 05 00 00 30 05 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 13 05 00 00 30 05 00 00 21 05 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 17 05 00 00 21 05 00 00 2B 05 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 1B 05 00 00 2B 05 00 00 2B 05 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 1F 05 00 00 21 05 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 21 05 00 00\r
+R 00 00 01 00\r
+T 21 05 00 00 01 02 00 18 12\r
+R 00 00 01 00\r
+T 26 05 00 00\r
+R 00 00 01 00\r
+T 26 05 00 00 01 03 00 18 0D\r
+R 00 00 01 00\r
+T 2B 05 00 00\r
+R 00 00 01 00\r
+T 2B 05 00 00 01 04 00 18 08\r
+R 00 00 01 00\r
+T 30 05 00 00\r
+R 00 00 01 00\r
+T 30 05 00 00 01 05 00 18 03\r
+R 00 00 01 00\r
+T 35 05 00 00\r
+R 00 00 01 00\r
+T 35 05 00 00 01 06 00\r
+R 00 00 01 00\r
+T 38 05 00 00\r
+R 00 00 01 00\r
+T 38 05 00 00 DD 09\r
+R 00 00 01 00\r
+T 3A 05 00 00\r
+R 00 00 01 00\r
+T 3A 05 00 00 21 02 00 39 4E 23 46 DD 09 FD 23\r
+R 00 00 01 00\r
+T 45 05 00 00 18 A1\r
+R 00 00 01 00\r
+T 47 05 00 00\r
+R 00 00 01 00\r
+T 47 05 00 00 DD E5 E1 F1 F1 DD E1 FD E1 C3\r
+R 00 00 01 00\r
+T 51 05 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 00 00\r
+T 53 05 00 00\r
+R 00 00 01 00\r
+T 53 05 00 00 CD 00 00 00 00 7B FE 80 30 06\r
+R 00 00 01 00 02 05 0A 00\r
+T 5B 05 00 00\r
+R 00 00 01 00\r
+T 5B 05 00 00 21 07 00 09 18 0C\r
+R 00 00 01 00\r
+T 61 05 00 00\r
+R 00 00 01 00\r
+T 61 05 00 00 FE CC 38 08 3E DF BB 38 03\r
+R 00 00 01 00\r
+T 6A 05 00 00\r
+R 00 00 01 00\r
+T 6A 05 00 00\r
+R 00 00 01 00\r
+T 6A 05 00 00\r
+R 00 00 01 00\r
+T 6A 05 00 00 69 60 23\r
+R 00 00 01 00\r
+T 6D 05 00 00\r
+R 00 00 01 00\r
+T 6D 05 00 00\r
+R 00 00 01 00\r
+T 6D 05 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T 70 05 00 00\r
+R 00 00 01 00\r
+T 70 05 00 00 CD 00 00 00 00 01 00 00\r
+R 00 00 01 00 02 05 0A 00\r
+T 76 05 00 00\r
+R 00 00 01 00\r
+T 76 05 00 00 1A 5F 3E 53 05 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 7B 05 00 00 53 05 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 81 05 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 04 00\r
+T 83 05 00 00\r
+R 00 00 01 00\r
+T 83 05 00 00 CD 00 00 00 00 01 05 00 C3\r
+R 00 00 01 00 02 05 0A 00\r
+T 8A 05 00 00 76 05 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 8C 05 00 00\r
+R 00 00 01 00\r
+T 8C 05 00 00 CD 00 00 00 00 01 00 00\r
+R 00 00 01 00 02 05 0A 00\r
+T 92 05 00 00\r
+R 00 00 01 00\r
+T 92 05 00 00 3E DA 04 00 00 21 DA 04 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 98 05 00 00 00 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 09 04 00\r
+T 9D 05 00 00\r
+R 00 00 01 00\r
+T 9D 05 00 00 CD 00 00 00 00 01 02 00 C3\r
+R 00 00 01 00 02 05 0A 00\r
+T A4 05 00 00 92 05 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T A6 05 00 00\r
+R 00 00 01 00\r
+T A6 05 00 00 CD 00 00 00 00 01 03 00 C3\r
+R 00 00 01 00 02 05 0A 00\r
+T AD 05 00 00 92 05 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T AF 05 00 00\r
+R 00 00 01 00\r
+T AF 05 00 00 CD 00 00 00 00 00 00 FD E5 11\r
+R 00 00 01 00 02 05 0E 00\r
+T B7 05 00 00 28 00 CD CE 04 00 00 2A\r
+R 00 00 01 00 00 07 01 00\r
+T BD 05 00 00 00 00 00 00 5E 23 56 13 72 2B 73\r
+R 00 00 01 00 00 04 04 00\r
+T C6 05 00 00 FD E5 E1 73 23 72 DD 6E 02 FD 75\r
+R 00 00 01 00\r
+T D1 05 00 00 02 DD 66 03 FD 74 03 FD 71 04 FD\r
+R 00 00 01 00\r
+T DC 05 00 00 70 05 DD 6E 0A FD 75 06 DD 66 0B\r
+R 00 00 01 00\r
+T E7 05 00 00 FD 74 07 DD 6E 0C FD 75 08 DD 66\r
+R 00 00 01 00\r
+T F2 05 00 00 0D FD 74 09 AF FD 77 0A FD 77 0B\r
+R 00 00 01 00\r
+T FD 05 00 00 FD 77 0C FD 77 0D FD 77 0E FD 77\r
+R 00 00 01 00\r
+T 08 06 00 00 0F FD 77 10 FD 77 11 FD 77 12 FD\r
+R 00 00 01 00\r
+T 13 06 00 00 77 13 FD 77 14 FD 77 15 FD 77 16\r
+R 00 00 01 00\r
+T 1E 06 00 00 FD 77 17 FD 77 18 FD 77 19 FD 77\r
+R 00 00 01 00\r
+T 29 06 00 00 1A FD 77 1B FD 77 1C FD 77 1D FD\r
+R 00 00 01 00\r
+T 34 06 00 00 77 1E FD 77 1F FD 77 24 FD 77 25\r
+R 00 00 01 00\r
+T 3F 06 00 00 FD 77 26 FD 77 27 FD 77 20 FD 77\r
+R 00 00 01 00\r
+T 4A 06 00 00 21 FD 77 22 FD 77 23\r
+R 00 00 01 00\r
+T 51 06 00 00\r
+R 00 00 01 00\r
+T 51 06 00 00 FD E5 E1 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 0A 04 00\r
+T 59 06 00 00\r
+R 00 00 01 00\r
+T 59 06 00 00 CD 00 00 00 00 00 00 FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T 62 06 00 00 02 DD 66 03 E5 FD E1 11 00 00\r
+R 00 00 01 00\r
+T 6C 06 00 00\r
+R 00 00 01 00\r
+T 6C 06 00 00 DD 6E 04 DD 66 05 19 7E B7 28 21\r
+R 00 00 01 00\r
+T 77 06 00 00 01 14 80 6B 62 78 AC 67 ED 42 30\r
+R 00 00 01 00\r
+T 82 06 00 00 15\r
+R 00 00 01 00\r
+T 83 06 00 00\r
+R 00 00 01 00\r
+T 83 06 00 00\r
+R 00 00 01 00\r
+T 83 06 00 00\r
+R 00 00 01 00\r
+T 83 06 00 00 FD 6E 20 FD 66 21 19 E5 DD 6E 04\r
+R 00 00 01 00\r
+T 8E 06 00 00 DD 66 05 19 46 E1 70 13 18 D4\r
+R 00 00 01 00\r
+T 98 06 00 00\r
+R 00 00 01 00\r
+T 98 06 00 00 FD 6E 20 FD 66 21 19 36 00 FD E1\r
+R 00 00 01 00\r
+T A3 06 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T A6 06 00 00\r
+R 00 00 01 00\r
+T A6 06 00 00 CD 00 00 00 00 00 00 FD E5 59 50\r
+R 00 00 01 00 02 05 0E 00\r
+T AF 06 00 00 21 15 00 DD 4E 02 DD 46 03 09 7E\r
+R 00 00 01 00\r
+T BA 06 00 00 23 66 6F E5 FD E1 21 15 00 09 7E\r
+R 00 00 01 00\r
+T C5 06 00 00 23 B6 20 09\r
+R 00 00 01 00\r
+T C9 06 00 00\r
+R 00 00 01 00\r
+T C9 06 00 00 21 15 00 09 73 23 72 18 19\r
+R 00 00 01 00\r
+T D2 06 00 00\r
+R 00 00 01 00\r
+T D2 06 00 00\r
+R 00 00 01 00\r
+T D2 06 00 00 FD 7E 13 FD B6 14 28 0B\r
+R 00 00 01 00\r
+T DA 06 00 00\r
+R 00 00 01 00\r
+T DA 06 00 00 FD 6E 13 FD 66 14 E5 FD E1 18 ED\r
+R 00 00 01 00\r
+T E5 06 00 00\r
+R 00 00 01 00\r
+T E5 06 00 00 FD 73 13 FD 72 14\r
+R 00 00 01 00\r
+T EB 06 00 00\r
+R 00 00 01 00\r
+T EB 06 00 00 21 13 00 19 77 23 77\r
+R 00 00 01 00\r
+T F2 06 00 00\r
+R 00 00 01 00\r
+T F2 06 00 00 21 11 00 19 DD 4E 02 71 DD 46 03\r
+R 00 00 01 00\r
+T FD 06 00 00 23 70 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 09 04 00\r
+T 04 07 00 00\r
+R 00 00 01 00\r
+T 04 07 00 00 C5 FD E5 DD E5 21 15 00 19 46 23\r
+R 00 00 01 00\r
+T 0F 07 00 00 66 68 E5 DD E1 CD 40 07 00 00\r
+R 00 00 01 00 00 0A 01 00\r
+T 17 07 00 00\r
+R 00 00 01 00\r
+T 17 07 00 00 DD E5 E1 7D B4 28 1A\r
+R 00 00 01 00\r
+T 1E 07 00 00\r
+R 00 00 01 00\r
+T 1E 07 00 00 DD E5 D1 DD 7E 1C DD 6E 1A DD 66\r
+R 00 00 01 00\r
+T 29 07 00 00 1B CD 00 00 00 00 DD 6E 13 DD 66\r
+R 00 00 01 00 02 06 0B 00\r
+T 32 07 00 00 14 E5 DD E1 18 DF\r
+R 00 00 01 00\r
+T 38 07 00 00\r
+R 00 00 01 00\r
+T 38 07 00 00 1E 01 CD 42 07 00 00 C3\r
+R 00 00 01 00 00 07 01 00\r
+T 3E 07 00 00 5E 02 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 40 07 00 00\r
+R 00 00 01 00\r
+T 40 07 00 00 1E 00\r
+R 00 00 01 00\r
+T 42 07 00 00\r
+R 00 00 01 00\r
+T 42 07 00 00 3E FA 02 00 00 21 FA 02 00 00 C3\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 48 07 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 4A 07 00 00\r
+R 00 00 01 00\r
+T 4A 07 00 00 CD 00 00 00 00 00 00 FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T 53 07 00 00 02 DD 66 03 E5 FD E1\r
+R 00 00 01 00\r
+T 5A 07 00 00\r
+R 00 00 01 00\r
+T 5A 07 00 00 DD 6E 04 DD 66 05 7E FD 86 02 77\r
+R 00 00 01 00\r
+T 65 07 00 00 23 7E FD 8E 03 77 DD 6E 0A DD 66\r
+R 00 00 01 00\r
+T 70 07 00 00 0B 7E FD 86 04 77 23 7E FD 8E 05\r
+R 00 00 01 00\r
+T 7B 07 00 00 77 FD 6E 11 FD 66 12 E5 FD E1 7D\r
+R 00 00 01 00\r
+T 86 07 00 00 B4 20 D1\r
+R 00 00 01 00\r
+T 89 07 00 00\r
+R 00 00 01 00\r
+T 89 07 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 8E 07 00 00\r
+R 00 00 01 00\r
+T 8E 07 00 00 CD 00 00 00 00 00 00 21 15 00 DD\r
+R 00 00 01 00 02 05 0E 00\r
+T 97 07 00 00 4E 02 DD 46 03 09\r
+R 00 00 01 00\r
+T 9D 07 00 00\r
+R 00 00 01 00\r
+T 9D 07 00 00 46 23 66 68 EB\r
+R 00 00 01 00\r
+T A2 07 00 00\r
+R 00 00 01 00\r
+T A2 07 00 00 7B B2 28 1B\r
+R 00 00 01 00\r
+T A6 07 00 00\r
+R 00 00 01 00\r
+T A6 07 00 00 21 10 00 19 4E 06 00 DD 6E 04 DD\r
+R 00 00 01 00\r
+T B1 07 00 00 66 05 A7 ED 42 20 03\r
+R 00 00 01 00\r
+T B8 07 00 00\r
+R 00 00 01 00\r
+T B8 07 00 00 EB 18 08\r
+R 00 00 01 00\r
+T BB 07 00 00\r
+R 00 00 01 00\r
+T BB 07 00 00 21 13 00 19 18 DC\r
+R 00 00 01 00\r
+T C1 07 00 00\r
+R 00 00 01 00\r
+T C1 07 00 00 6F 67\r
+R 00 00 01 00\r
+T C3 07 00 00\r
+R 00 00 01 00\r
+T C3 07 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T C6 07 00 00\r
+R 00 00 01 00\r
+T C6 07 00 00 CD 00 00 00 00 F8 FF FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T CF 07 00 00 02 DD 66 03 E5 FD E1 FD 6E 15 DD\r
+R 00 00 01 00\r
+T DA 07 00 00 75 F8 FD 66 16 DD 74 F9 FD E5 E1\r
+R 00 00 01 00\r
+T E5 07 00 00 7D B4 CA 79 09 00 00\r
+R 00 00 01 00 00 07 01 00\r
+T EA 07 00 00\r
+R 00 00 01 00\r
+T EA 07 00 00\r
+R 00 00 01 00\r
+T EA 07 00 00 DD 7E F8 DD B6 F9 28 11\r
+R 00 00 01 00\r
+T F2 07 00 00\r
+R 00 00 01 00\r
+T F2 07 00 00 DD 5E F8 DD 56 F9 CD 8F 09 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T FB 07 00 00 DD 75 F8 DD 74 F9 18 E7\r
+R 00 00 01 00\r
+T 03 08 00 00\r
+R 00 00 01 00\r
+T 03 08 00 00 FD 7E 11 FD B6 12 CA 95 08 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 0C 08 00 00\r
+R 00 00 01 00\r
+T 0C 08 00 00 FD 6E 11 FD 66 12 01 15 00 09 46\r
+R 00 00 01 00\r
+T 17 08 00 00 23 66 68 FD E5 C1 A7 ED 42 FD 6E\r
+R 00 00 01 00\r
+T 22 08 00 00 11 FD 66 12 01 15 00 09 20 09\r
+R 00 00 01 00\r
+T 2C 08 00 00\r
+R 00 00 01 00\r
+T 2C 08 00 00 E5 FD 6E 11 FD 66 12 18 50\r
+R 00 00 01 00\r
+T 35 08 00 00\r
+R 00 00 01 00\r
+T 35 08 00 00 46 23 66 68\r
+R 00 00 01 00\r
+T 39 08 00 00\r
+R 00 00 01 00\r
+T 39 08 00 00 DD 75 F8 DD 74 F9\r
+R 00 00 01 00\r
+T 3F 08 00 00\r
+R 00 00 01 00\r
+T 3F 08 00 00 21 13 00 DD 4E F8 DD 46 F9 09 46\r
+R 00 00 01 00\r
+T 4A 08 00 00 23 66 68 FD E5 C1 A7 ED 42 28 19\r
+R 00 00 01 00\r
+T 55 08 00 00 21 13 00 DD 4E F8 DD 46 F9 09 7E\r
+R 00 00 01 00\r
+T 60 08 00 00 23 B6 28 0A\r
+R 00 00 01 00\r
+T 64 08 00 00\r
+R 00 00 01 00\r
+T 64 08 00 00\r
+R 00 00 01 00\r
+T 64 08 00 00\r
+R 00 00 01 00\r
+T 64 08 00 00 21 13 00 09 56 23 66 6A 18 CB\r
+R 00 00 01 00\r
+T 6E 08 00 00\r
+R 00 00 01 00\r
+T 6E 08 00 00 21 13 00 DD 4E F8 DD 46 F9 09 7E\r
+R 00 00 01 00\r
+T 79 08 00 00 23 B6 28 18\r
+R 00 00 01 00\r
+T 7D 08 00 00\r
+R 00 00 01 00\r
+T 7D 08 00 00 21 13 00 09 E5 21 13 00\r
+R 00 00 01 00\r
+T 85 08 00 00\r
+R 00 00 01 00\r
+T 85 08 00 00 09 46 23 66 68 01 13 00 09 4E 23\r
+R 00 00 01 00\r
+T 90 08 00 00 46 E1 71 23 70\r
+R 00 00 01 00\r
+T 95 08 00 00\r
+R 00 00 01 00\r
+T 95 08 00 00\r
+R 00 00 01 00\r
+T 95 08 00 00\r
+R 00 00 01 00\r
+T 95 08 00 00 FD 6E 13 DD 75 F8 FD 66 14 DD 74\r
+R 00 00 01 00\r
+T A0 08 00 00 F9 3E 04 FD AE 24 FD B6 25 C2\r
+R 00 00 01 00\r
+T AA 08 00 00 45 09 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T AC 08 00 00\r
+R 00 00 01 00\r
+T AC 08 00 00 FD 6E 11 DD 75 FC FD 66 12 DD 74\r
+R 00 00 01 00\r
+T B7 08 00 00 FD FD 6E 26 DD 75 FE FD 66 27 DD\r
+R 00 00 01 00\r
+T C2 08 00 00 74 FF CD 84 09 00 00 DD 6E FE DD\r
+R 00 00 01 00 00 07 01 00\r
+T CB 08 00 00 66 FF 23 23 CD 84 09 00 00\r
+R 00 00 01 00 00 09 01 00\r
+T D2 08 00 00\r
+R 00 00 01 00\r
+T D2 08 00 00 DD 7E FC DD B6 FD 28 20 21 24 00\r
+R 00 00 01 00\r
+T DD 08 00 00 DD 4E FC DD 46 FD 09 3E 04 AE 23\r
+R 00 00 01 00\r
+T E8 08 00 00 B6 28 0F\r
+R 00 00 01 00\r
+T EB 08 00 00\r
+R 00 00 01 00\r
+T EB 08 00 00\r
+R 00 00 01 00\r
+T EB 08 00 00\r
+R 00 00 01 00\r
+T EB 08 00 00 21 11 00 09 56 DD 72 FC 23 66 DD\r
+R 00 00 01 00\r
+T F6 08 00 00 74 FD 18 D8\r
+R 00 00 01 00\r
+T FA 08 00 00\r
+R 00 00 01 00\r
+T FA 08 00 00 DD 7E FC DD B6 FD 28 43\r
+R 00 00 01 00\r
+T 02 09 00 00\r
+R 00 00 01 00\r
+T 02 09 00 00 21 26 00 DD 4E FC DD 46 FD 09 46\r
+R 00 00 01 00\r
+T 0D 09 00 00 DD 70 FE 23 66 DD 74 FF 21 06 00\r
+R 00 00 01 00\r
+T 18 09 00 00 ED 4B 00 00 00 00 09 E5 DD 6E FE\r
+R 00 00 01 00 00 06 04 00\r
+T 21 09 00 00 DD 66 FF 5E 23 56 E1 73 23 72 21\r
+R 00 00 01 00\r
+T 2C 09 00 00 08 00 ED 4B 00 00 00 00 09 E5 DD\r
+R 00 00 01 00 00 08 04 00\r
+T 35 09 00 00 4E FE DD 46 FF 03 03 69 60 4E 23\r
+R 00 00 01 00\r
+T 40 09 00 00 46 E1 71 23 70\r
+R 00 00 01 00\r
+T 45 09 00 00\r
+R 00 00 01 00\r
+T 45 09 00 00\r
+R 00 00 01 00\r
+T 45 09 00 00 FD 4E 24 FD 46 25 21 00 00 CD\r
+R 00 00 01 00\r
+T 4F 09 00 00 00 00 00 00 30 09\r
+R 00 00 01 00 02 04 0F 00\r
+T 53 09 00 00\r
+R 00 00 01 00\r
+T 53 09 00 00 FD 5E 26 FD 56 27 CD 87 09 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 5C 09 00 00\r
+R 00 00 01 00\r
+T 5C 09 00 00 FD CB 0B 76 20 11 FD 7E 20 FD B6\r
+R 00 00 01 00\r
+T 67 09 00 00 21 28 09\r
+R 00 00 01 00\r
+T 6A 09 00 00\r
+R 00 00 01 00\r
+T 6A 09 00 00\r
+R 00 00 01 00\r
+T 6A 09 00 00\r
+R 00 00 01 00\r
+T 6A 09 00 00 FD 5E 20 FD 56 21 CD 87 09 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 73 09 00 00\r
+R 00 00 01 00\r
+T 73 09 00 00 FD E5 D1 CD 87 09 00 00\r
+R 00 00 01 00 00 08 01 00\r
+T 79 09 00 00\r
+R 00 00 01 00\r
+T 79 09 00 00 DD 6E F8 DD 66 F9 FD E1 C3\r
+R 00 00 01 00\r
+T 82 09 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 04 00\r
+T 84 09 00 00\r
+R 00 00 01 00\r
+T 84 09 00 00 5E 23 56\r
+R 00 00 01 00\r
+T 87 09 00 00\r
+R 00 00 01 00\r
+T 87 09 00 00 3E 00 00 00 00 21 00 00 00 00 C3\r
+R 00 00 01 00 2B 05 09 00 02 0A 09 00\r
+T 8D 09 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 8F 09 00 00\r
+R 00 00 01 00\r
+T 8F 09 00 00 3E C6 07 00 00 21 C6 07 00 00 C3\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 95 09 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 97 09 00 00\r
+R 00 00 01 00\r
+T 97 09 00 00 C5 FD E5 DD E5 21 15 00 19 46 23\r
+R 00 00 01 00\r
+T A2 09 00 00 66 68\r
+R 00 00 01 00\r
+T A4 09 00 00\r
+R 00 00 01 00\r
+T A4 09 00 00 E5 DD E1\r
+R 00 00 01 00\r
+T A7 09 00 00\r
+R 00 00 01 00\r
+T A7 09 00 00 7D B4 28 08\r
+R 00 00 01 00\r
+T AB 09 00 00\r
+R 00 00 01 00\r
+T AB 09 00 00 DD E5 D1 CD 8F 09 00 00 18 F1\r
+R 00 00 01 00 00 08 01 00\r
+T B3 09 00 00\r
+R 00 00 01 00\r
+T B3 09 00 00 C3 5E 02 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T B6 09 00 00\r
+R 00 00 01 00\r
+T B6 09 00 00 CD 00 00 00 00 00 00 FD E5 21\r
+R 00 00 01 00 02 05 0E 00\r
+T BE 09 00 00 15 00 DD 5E 02 DD 56 03 19\r
+R 00 00 01 00\r
+T C7 09 00 00\r
+R 00 00 01 00\r
+T C7 09 00 00 56 23 66 6A E5 FD E1\r
+R 00 00 01 00\r
+T CE 09 00 00\r
+R 00 00 01 00\r
+T CE 09 00 00 7D B4 28 3D\r
+R 00 00 01 00\r
+T D2 09 00 00\r
+R 00 00 01 00\r
+T D2 09 00 00 21 0A 00 FD E5 C1 09 DD 7E 04 DD\r
+R 00 00 01 00\r
+T DD 09 00 00 56 05 2F 5F 7A 2F 57 7E A3 77 23\r
+R 00 00 01 00\r
+T E8 09 00 00 7E A2 77 21 0A 00 09 7E DD B6 0A\r
+R 00 00 01 00\r
+T F3 09 00 00 77 23 7E DD B6 0B 77 21 0A 00 09\r
+R 00 00 01 00\r
+T FE 09 00 00 7E DD AE 0C 77 23 7E DD AE 0D 77\r
+R 00 00 01 00\r
+T 09 0A 00 00 21 13 00 09 18 B8\r
+R 00 00 01 00\r
+T 0F 0A 00 00\r
+R 00 00 01 00\r
+T 0F 0A 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 02 05 0C 00 2B 0A 01 00\r
+T 15 0A 00 00 00 00 00 00 CD 00 00 00 00 FD E1\r
+R 00 00 01 00 02 04 01 00 02 09 0B 00\r
+T 1C 0A 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T 1F 0A 00 00\r
+R 00 00 01 00\r
+T 1F 0A 00 00 C5 FD E5 DD E5 D5 DD E1 21 15 00\r
+R 00 00 01 00\r
+T 2A 0A 00 00 19 46 23 66 68 E5 FD E1 21 20 00\r
+R 00 00 01 00\r
+T 35 0A 00 00 19 46 23 66 68 01 00 90 3E 80 AC\r
+R 00 00 01 00\r
+T 40 0A 00 00 67 ED 42 30 2E DD 4E 20 DD 46 21\r
+R 00 00 01 00\r
+T 4B 0A 00 00 21 00 00 CD 00 00 00 00 30 20\r
+R 00 00 01 00 02 08 0F 00\r
+T 53 0A 00 00\r
+R 00 00 01 00\r
+T 53 0A 00 00\r
+R 00 00 01 00\r
+T 53 0A 00 00\r
+R 00 00 01 00\r
+T 53 0A 00 00 DD 6E 20 DD 66 21 29 E5 21 08 00\r
+R 00 00 01 00\r
+T 5E 0A 00 00 ED 4B 00 00 00 00 09 4E 23 46 E1\r
+R 00 00 01 00 00 06 04 00\r
+T 67 0A 00 00 09 2B 2B 46 DD 70 20 23 66 DD 74\r
+R 00 00 01 00\r
+T 72 0A 00 00 21\r
+R 00 00 01 00\r
+T 73 0A 00 00\r
+R 00 00 01 00\r
+T 73 0A 00 00 DD 6E 22 DD 66 23 01 00 90 3E 80\r
+R 00 00 01 00\r
+T 7E 0A 00 00 AC 67 ED 42 30 2E DD 4E 22 DD 46\r
+R 00 00 01 00\r
+T 89 0A 00 00 23 21 00 00 CD 00 00 00 00 30 20\r
+R 00 00 01 00 02 09 0F 00\r
+T 92 0A 00 00\r
+R 00 00 01 00\r
+T 92 0A 00 00\r
+R 00 00 01 00\r
+T 92 0A 00 00\r
+R 00 00 01 00\r
+T 92 0A 00 00 DD 6E 22 DD 66 23 29 E5 21 08 00\r
+R 00 00 01 00\r
+T 9D 0A 00 00 ED 4B 00 00 00 00 09 4E 23 46 E1\r
+R 00 00 01 00 00 06 04 00\r
+T A6 0A 00 00 09 2B 2B 46 DD 70 22 23 66 DD 74\r
+R 00 00 01 00\r
+T B1 0A 00 00 23\r
+R 00 00 01 00\r
+T B2 0A 00 00\r
+R 00 00 01 00\r
+T B2 0A 00 00\r
+R 00 00 01 00\r
+T B2 0A 00 00 FD E5 E1 7D B4 28 16\r
+R 00 00 01 00\r
+T B9 0A 00 00\r
+R 00 00 01 00\r
+T B9 0A 00 00 FD E5 D1 3E 1F 0A 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T BF 0A 00 00 1F 0A 00 00 CD 00 00 00 00 FD 6E\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T C6 0A 00 00 13 FD 66 14 E5 FD E1 18 E3\r
+R 00 00 01 00\r
+T CF 0A 00 00\r
+R 00 00 01 00\r
+T CF 0A 00 00 C3 5E 02 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T D2 0A 00 00\r
+R 00 00 01 00\r
+T D2 0A 00 00 CD 00 00 00 00 D0 FF FD E5 AF DD\r
+R 00 00 01 00 02 05 0E 00\r
+T DB 0A 00 00 77 FA DD 77 FB DD 77 FC DD 77 FD\r
+R 00 00 01 00\r
+T E6 0A 00 00 59 50 CD 00 00 00 00 08 00 01 00\r
+R 00 00 01 00 02 07 0D 00\r
+T EF 0A 00 00 02 00 03 00 02 01 03 01 04 01\r
+R 00 00 01 00\r
+T F9 0A 00 00 05 01 01 04 6B 0D 00 00\r
+R 00 00 01 00 00 08 01 00\r
+T FF 0A 00 00 D9 0C 00 00 6C 0C 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 03 0B 00 00 98 0C 00 00 E0 0B 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 07 0B 00 00 F1 0B 00 00 A5 0B 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 0B 0B 00 00 40 0B 00 00 0F 0B 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 0F 0B 00 00\r
+R 00 00 01 00\r
+T 0F 0B 00 00 21 15 00 DD 4E 02 DD 46 03 09 46\r
+R 00 00 01 00\r
+T 1A 0B 00 00 23 66 68\r
+R 00 00 01 00\r
+T 1D 0B 00 00\r
+R 00 00 01 00\r
+T 1D 0B 00 00 E5 FD E1\r
+R 00 00 01 00\r
+T 20 0B 00 00\r
+R 00 00 01 00\r
+T 20 0B 00 00 7D B4 28 19\r
+R 00 00 01 00\r
+T 24 0B 00 00\r
+R 00 00 01 00\r
+T 24 0B 00 00 FD CB 0A 46 28 0B\r
+R 00 00 01 00\r
+T 2A 0B 00 00\r
+R 00 00 01 00\r
+T 2A 0B 00 00 DD 6E 0A DD 66 0B E5 CD\r
+R 00 00 01 00\r
+T 32 0B 00 00 70 0D 00 00 E1\r
+R 00 00 01 00 00 04 01 00\r
+T 35 0B 00 00\r
+R 00 00 01 00\r
+T 35 0B 00 00 FD 6E 13 FD 66 14 18 E0\r
+R 00 00 01 00\r
+T 3D 0B 00 00\r
+R 00 00 01 00\r
+T 3D 0B 00 00 C3 6B 0D 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 40 0B 00 00\r
+R 00 00 01 00\r
+T 40 0B 00 00 21 15 00 DD 4E 02 DD 46 03 09 46\r
+R 00 00 01 00\r
+T 4B 0B 00 00 23 66 68\r
+R 00 00 01 00\r
+T 4E 0B 00 00\r
+R 00 00 01 00\r
+T 4E 0B 00 00 E5 FD E1\r
+R 00 00 01 00\r
+T 51 0B 00 00\r
+R 00 00 01 00\r
+T 51 0B 00 00 7D B4 28 4D\r
+R 00 00 01 00\r
+T 55 0B 00 00\r
+R 00 00 01 00\r
+T 55 0B 00 00 FD CB 0A 46 28 38\r
+R 00 00 01 00\r
+T 5B 0B 00 00\r
+R 00 00 01 00\r
+T 5B 0B 00 00 DD 6E 0A DD 66 0B E5 CD\r
+R 00 00 01 00\r
+T 63 0B 00 00 70 0D 00 00 E1 DD 6E 0A DD 66 0B\r
+R 00 00 01 00 00 04 01 00\r
+T 6C 0B 00 00 E5 01 03 00 CD 76 0D 00 00 E1 FD\r
+R 00 00 01 00 00 09 01 00\r
+T 75 0B 00 00 7E 0A E6 22 6F 26 00 3E 22 AD 20\r
+R 00 00 01 00\r
+T 80 0B 00 00 12 FD 4E 10 44 DD 6E 0A DD 66 0B\r
+R 00 00 01 00\r
+T 8B 0B 00 00 ED 42 20 04\r
+R 00 00 01 00\r
+T 8F 0B 00 00\r
+R 00 00 01 00\r
+T 8F 0B 00 00\r
+R 00 00 01 00\r
+T 8F 0B 00 00\r
+R 00 00 01 00\r
+T 8F 0B 00 00 FD 21 00 00\r
+R 00 00 01 00\r
+T 93 0B 00 00\r
+R 00 00 01 00\r
+T 93 0B 00 00\r
+R 00 00 01 00\r
+T 93 0B 00 00 FD E5 E1 7D B4 28 B7\r
+R 00 00 01 00\r
+T 9A 0B 00 00\r
+R 00 00 01 00\r
+T 9A 0B 00 00 FD 6E 13 FD 66 14 18 AC\r
+R 00 00 01 00\r
+T A2 0B 00 00\r
+R 00 00 01 00\r
+T A2 0B 00 00\r
+R 00 00 01 00\r
+T A2 0B 00 00 C3 6B 0D 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T A5 0B 00 00\r
+R 00 00 01 00\r
+T A5 0B 00 00 DD 6E 02 DD 66 03 E5 FD E1 21\r
+R 00 00 01 00\r
+T AF 0B 00 00 0A 00 DD 4E 02 DD 46 03 09 CB 46\r
+R 00 00 01 00\r
+T BA 0B 00 00 28 21\r
+R 00 00 01 00\r
+T BC 0B 00 00\r
+R 00 00 01 00\r
+T BC 0B 00 00 FD CB 0A 6E 28 1B FD 4E 10 47 DD\r
+R 00 00 01 00\r
+T C7 0B 00 00 6E 0A DD 66 0B A7 ED 42 20 0C\r
+R 00 00 01 00\r
+T D1 0B 00 00\r
+R 00 00 01 00\r
+T D1 0B 00 00\r
+R 00 00 01 00\r
+T D1 0B 00 00\r
+R 00 00 01 00\r
+T D1 0B 00 00 FD 6E 26 FD 66 27 FD E5 D1 CD\r
+R 00 00 01 00\r
+T DB 0B 00 00 95 0D 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T DD 0B 00 00\r
+R 00 00 01 00\r
+T DD 0B 00 00\r
+R 00 00 01 00\r
+T DD 0B 00 00\r
+R 00 00 01 00\r
+T DD 0B 00 00\r
+R 00 00 01 00\r
+T DD 0B 00 00\r
+R 00 00 01 00\r
+T DD 0B 00 00\r
+R 00 00 01 00\r
+T DD 0B 00 00 C3 6B 0D 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T E0 0B 00 00\r
+R 00 00 01 00\r
+T E0 0B 00 00 DD 5E 02 4B DD 56 03 42 21 1A 00\r
+R 00 00 01 00\r
+T EB 0B 00 00 CD 94 0D 00 00 C3 6B 0D 00 00\r
+R 00 00 01 00 00 05 01 00 00 0A 01 00\r
+T F1 0B 00 00\r
+R 00 00 01 00\r
+T F1 0B 00 00 21 0A 00 DD 4E 02 DD 46 03 09 7E\r
+R 00 00 01 00\r
+T FC 0B 00 00 E6 FC 77 21 2E 00 39 E5 2B 2B 4D\r
+R 00 00 01 00\r
+T 07 0C 00 00 44 DD 5E 02 DD 56 03 CD\r
+R 00 00 01 00\r
+T 0F 0C 00 00 8C 0D 00 00 E1 21 08 00 DD 4E 02\r
+R 00 00 01 00 00 04 01 00\r
+T 18 0C 00 00 DD 46 03 09 5E 23 56 D5 21 06 00\r
+R 00 00 01 00\r
+T 23 0C 00 00 09 5E 23 56 D5 DD 6E FC DD 66 FD\r
+R 00 00 01 00\r
+T 2E 0C 00 00 E5 DD 4E FA DD 46 FB 11 00 00 CD\r
+R 00 00 01 00\r
+T 39 0C 00 00 F2 02 00 00 E1 E1 E1 21 00 00 E5\r
+R 00 00 01 00 00 04 01 00\r
+T 42 0C 00 00 2E 11 DD 5E 02 DD 56 03 19 5E 23\r
+R 00 00 01 00\r
+T 4D 0C 00 00 56 21 11 00 DD 4E 02 DD 46 03 09\r
+R 00 00 01 00\r
+T 58 0C 00 00 46 23 66 68 01 17 00 09 4E 23 46\r
+R 00 00 01 00\r
+T 63 0C 00 00 23 7E 69 60 01 03 01 18 29\r
+R 00 00 01 00\r
+T 6C 0C 00 00\r
+R 00 00 01 00\r
+T 6C 0C 00 00 21 11 00 DD 4E 02 DD 46 03 09 56\r
+R 00 00 01 00\r
+T 77 0C 00 00 23 66 6A E5 FD E1 59 50 CD\r
+R 00 00 01 00\r
+T 80 0C 00 00 8F 09 00 00 21 00 00 E5 01 03 01\r
+R 00 00 01 00 00 04 01 00\r
+T 89 0C 00 00 FD E5 D1 FD 7E 19 FD 6E 17 FD 66\r
+R 00 00 01 00\r
+T 94 0C 00 00 18\r
+R 00 00 01 00\r
+T 95 0C 00 00\r
+R 00 00 01 00\r
+T 95 0C 00 00 C3 67 0D 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 98 0C 00 00\r
+R 00 00 01 00\r
+T 98 0C 00 00 21 15 00 DD 4E 02 DD 46 03 09 46\r
+R 00 00 01 00\r
+T A3 0C 00 00 23 66 68\r
+R 00 00 01 00\r
+T A6 0C 00 00\r
+R 00 00 01 00\r
+T A6 0C 00 00 E5 FD E1\r
+R 00 00 01 00\r
+T A9 0C 00 00\r
+R 00 00 01 00\r
+T A9 0C 00 00 7D B4 28 29\r
+R 00 00 01 00\r
+T AD 0C 00 00\r
+R 00 00 01 00\r
+T AD 0C 00 00 DD 6E 0A DD 66 0B FD E5 C1 ED 42\r
+R 00 00 01 00\r
+T B8 0C 00 00 28 14 FD CB 0A 5E 28 0E\r
+R 00 00 01 00\r
+T C0 0C 00 00\r
+R 00 00 01 00\r
+T C0 0C 00 00\r
+R 00 00 01 00\r
+T C0 0C 00 00\r
+R 00 00 01 00\r
+T C0 0C 00 00 DD 6E 0A DD 66 0B E5 01 03 02 CD\r
+R 00 00 01 00\r
+T CB 0C 00 00 76 0D 00 00 E1\r
+R 00 00 01 00 00 04 01 00\r
+T CE 0C 00 00\r
+R 00 00 01 00\r
+T CE 0C 00 00 FD 6E 13 FD 66 14 18 D0\r
+R 00 00 01 00\r
+T D6 0C 00 00\r
+R 00 00 01 00\r
+T D6 0C 00 00 C3 6B 0D 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T D9 0C 00 00\r
+R 00 00 01 00\r
+T D9 0C 00 00 21 11 00 DD 4E 02 DD 46 03 09 7E\r
+R 00 00 01 00\r
+T E4 0C 00 00 23 B6 20 0E\r
+R 00 00 01 00\r
+T E8 0C 00 00\r
+R 00 00 01 00\r
+T E8 0C 00 00 21 04 00 ED 4B 00 00 00 00 09 36\r
+R 00 00 01 00 00 09 04 00\r
+T F1 0C 00 00 01 23 77 18 75\r
+R 00 00 01 00\r
+T F6 0C 00 00\r
+R 00 00 01 00\r
+T F6 0C 00 00 21 0A 00 09 23 CB 6E 20 28\r
+R 00 00 01 00\r
+T FF 0C 00 00\r
+R 00 00 01 00\r
+T FF 0C 00 00 DD 6E 0A DD 66 0B E5 21 11 00 59\r
+R 00 00 01 00\r
+T 0A 0D 00 00 50 19 5E 23 56 21 11 00 09 46 23\r
+R 00 00 01 00\r
+T 15 0D 00 00 66 68 01 17 00 09 4E 23 46 23 7E\r
+R 00 00 01 00\r
+T 20 0D 00 00 69 60 01 01 04 18 40\r
+R 00 00 01 00\r
+T 27 0D 00 00\r
+R 00 00 01 00\r
+T 27 0D 00 00 21 11 00 09 56 23 66 6A E5 FD E1\r
+R 00 00 01 00\r
+T 32 0D 00 00 11 0A 00 19 7E F6 03 77 6A 62 E5\r
+R 00 00 01 00\r
+T 3D 0D 00 00 23 E5 4A 42 FD E5 D1 3E\r
+R 00 00 01 00\r
+T 45 0D 00 00 B6 09 00 00 21 B6 09 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 4A 0D 00 00 00 00 00 00 E1 E1 21 00 00 E5 DD\r
+R 00 00 01 00 02 04 0B 00\r
+T 53 0D 00 00 5E 02 4B DD 56 03 42 2E 17 09 4E\r
+R 00 00 01 00\r
+T 5E 0D 00 00 23 46 23 7E 69 60 01 05 01\r
+R 00 00 01 00\r
+T 67 0D 00 00\r
+R 00 00 01 00\r
+T 67 0D 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 02 05 0B 00\r
+T 6B 0D 00 00\r
+R 00 00 01 00\r
+T 6B 0D 00 00\r
+R 00 00 01 00\r
+T 6B 0D 00 00\r
+R 00 00 01 00\r
+T 6B 0D 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 70 0D 00 00\r
+R 00 00 01 00\r
+T 70 0D 00 00 DD 4E 04 DD 46 05\r
+R 00 00 01 00\r
+T 76 0D 00 00\r
+R 00 00 01 00\r
+T 76 0D 00 00 FD E5 D1 FD 7E 19 FD 6E 17 FD 66\r
+R 00 00 01 00\r
+T 81 0D 00 00 18 C3 00 00 00 00\r
+R 00 00 01 00 02 06 0B 00\r
+T 85 0D 00 00\r
+R 00 00 01 00\r
+T 85 0D 00 00 23 23\r
+R 00 00 01 00\r
+T 87 0D 00 00\r
+R 00 00 01 00\r
+T 87 0D 00 00 4D 44 DD E5 D1\r
+R 00 00 01 00\r
+T 8C 0D 00 00\r
+R 00 00 01 00\r
+T 8C 0D 00 00 3E 4A 07 00 00 21 4A 07 00 00 C3\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 92 0D 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 94 0D 00 00\r
+R 00 00 01 00\r
+T 94 0D 00 00 09\r
+R 00 00 01 00\r
+T 95 0D 00 00\r
+R 00 00 01 00\r
+T 95 0D 00 00 4E 23 46 23 7E 69 60 C3\r
+R 00 00 01 00\r
+T 9D 0D 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 9F 0D 00 00\r
+R 00 00 01 00\r
+T 9F 0D 00 00 CD 00 00 00 00 FC FF FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T A8 0D 00 00 02 DD 66 03 E5 FD E1 AF DD 77 FE\r
+R 00 00 01 00\r
+T B3 0D 00 00 DD 77 FF DD 77 FC DD 77 FD 21\r
+R 00 00 01 00\r
+T BD 0D 00 00 0A 00 ED 4B 00 00 00 00 09 7E 23\r
+R 00 00 01 00 00 08 04 00\r
+T C6 0D 00 00 66 6F 46 23 66 68 FD 4E 0E FD 46\r
+R 00 00 01 00\r
+T D1 0D 00 00 0F A7 ED 42 28 09\r
+R 00 00 01 00\r
+T D7 0D 00 00\r
+R 00 00 01 00\r
+T D7 0D 00 00 FD 5E 0E FD 56 0F CD 24 0F 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T E0 0D 00 00\r
+R 00 00 01 00\r
+T E0 0D 00 00 FD CB 0A 46 CA DC 0E 00 00\r
+R 00 00 01 00 00 09 01 00\r
+T E7 0D 00 00\r
+R 00 00 01 00\r
+T E7 0D 00 00 21 02 00 39 E5 23 23 4D 44 FD E5\r
+R 00 00 01 00\r
+T F2 0D 00 00 D1 CD 8C 0D 00 00 E1 CD\r
+R 00 00 01 00 00 06 01 00\r
+T F8 0D 00 00 40 07 00 00 DD 4E FC DD 46 FD DD\r
+R 00 00 01 00 00 04 01 00\r
+T 01 0E 00 00 5E FE DD 56 FF 3E A3 00 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T 09 0E 00 00 A3 00 00 00 CD 00 00 00 00 FD 4E\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 10 0E 00 00 08 FD 46 09 FD 5E 06 FD 56 07 3E\r
+R 00 00 01 00\r
+T 1B 0E 00 00 E2 00 00 00 21 E2 00 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 20 0E 00 00 00 00 00 00 FD 6E 08 FD 66 09 E5\r
+R 00 00 01 00 02 04 0B 00\r
+T 29 0E 00 00 FD 6E 06 FD 66 07 E5 DD 6E FC DD\r
+R 00 00 01 00\r
+T 34 0E 00 00 66 FD E5 DD 4E FE DD 46 FF 11\r
+R 00 00 01 00\r
+T 3E 0E 00 00 00 00 CD F2 02 00 00 E1 E1 E1 FD\r
+R 00 00 01 00 00 07 01 00\r
+T 47 0E 00 00 5E 20 FD 56 21 21 0A 00 ED 4B\r
+R 00 00 01 00\r
+T 51 0E 00 00 00 00 00 00 09 7E 23 66 6F CD\r
+R 00 00 01 00 00 04 04 00\r
+T 59 0E 00 00 E1 0E 00 00 DD 4E FC DD 46 FD 09\r
+R 00 00 01 00 00 04 01 00\r
+T 62 0E 00 00 11 04 00 19 4D 44 CD EF 0E 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 6B 0E 00 00 7E 23 66 6F 01 05 00 09 4E 23 46\r
+R 00 00 01 00\r
+T 76 0E 00 00 23 7E 69 60 CD 13 04 00 00 01\r
+R 00 00 01 00 00 09 01 00\r
+T 7E 0E 00 00 FC FF 09 4D 44 FD 5E 06 FD 56 07\r
+R 00 00 01 00\r
+T 89 0E 00 00 3E 25 01 00 00 21 25 01 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 8F 0E 00 00 00 00 00 00 DD 4E FC DD 46 FD CD\r
+R 00 00 01 00 02 04 0B 00\r
+T 98 0E 00 00 EF 0E 00 00 46 23 66 68 CD\r
+R 00 00 01 00 00 04 01 00\r
+T 9F 0E 00 00 E1 0E 00 00 01 05 00 09 4D 44 FD\r
+R 00 00 01 00 00 04 01 00\r
+T A8 0E 00 00 5E 06 FD 56 07 3E 6A 01 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T B0 0E 00 00 6A 01 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T B6 0E 00 00 0E 00 DD 4E FC DD 46 FD 09 4D 44\r
+R 00 00 01 00\r
+T C1 0E 00 00 DD 5E FE DD 56 FF 13 13 3E\r
+R 00 00 01 00\r
+T CA 0E 00 00 A3 00 00 00 21 A3 00 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T CF 0E 00 00 0C 0F 00 00 FD E5 D1 3E\r
+R 00 00 01 00 00 04 01 00\r
+T D5 0E 00 00 04 07 00 00 21 04 07 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T DA 0E 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T DC 0E 00 00\r
+R 00 00 01 00\r
+T DC 0E 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T E1 0E 00 00\r
+R 00 00 01 00\r
+T E1 0E 00 00 01 05 00 09 4E 23 46 23 7E 69 60\r
+R 00 00 01 00\r
+T EC 0E 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 0B 00\r
+T EF 0E 00 00\r
+R 00 00 01 00\r
+T EF 0E 00 00 DD 5E FE DD 56 FF 3E A3 00 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T F7 0E 00 00 21 A3 00 00 00 CD 00 00 00 00 FD\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T FE 0E 00 00 5E 20 FD 56 21 21 0A 00 ED 4B\r
+R 00 00 01 00\r
+T 08 0F 00 00 00 00 00 00 09 C9\r
+R 00 00 01 00 00 04 04 00\r
+T 0C 0F 00 00\r
+R 00 00 01 00\r
+T 0C 0F 00 00 CD 00 00 00 00 FD 5E 20 FD 56 21\r
+R 00 00 01 00 02 05 0B 00\r
+T 15 0F 00 00 3E 39 02 00 00 21 39 02 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 1B 0F 00 00 00 00 00 00 C9\r
+R 00 00 01 00 02 04 0B 00\r
+T 1E 0F 00 00\r
+R 00 00 01 00\r
+T 1E 0F 00 00 DD 5E 0E DD 56 0F\r
+R 00 00 01 00\r
+T 24 0F 00 00\r
+R 00 00 01 00\r
+T 24 0F 00 00 3E A5 03 00 00 21 A5 03 00 00 C3\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 2A 0F 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 2C 0F 00 00\r
+R 00 00 01 00\r
+T 2C 0F 00 00 CD 00 00 00 00 CD 40 07 00 00 CD\r
+R 00 00 01 00 02 05 0A 00 00 0A 01 00\r
+T 33 0F 00 00 D7 02 00 00 CD 00 00 00 00 01\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 39 0F 00 00 80 00 58 50 3E F4 01 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 40 0F 00 00 F4 01 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 46 0F 00 00 80 00 E5 6C E5 E5 CD EF 02 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 4F 0F 00 00 E1 E1 E1 DD 5E 02 DD 56 03 3E\r
+R 00 00 01 00\r
+T 59 0F 00 00 04 07 00 00 21 04 07 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 5E 0F 00 00 00 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 09 04 00\r
+T 63 0F 00 00\r
+R 00 00 01 00\r
+T 63 0F 00 00 CD 00 00 00 00 3E A6 06 00 00 21\r
+R 00 00 01 00 02 05 0A 00 29 0A 01 00\r
+T 69 0F 00 00 A6 06 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 6F 0F 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 04 00\r
+T 71 0F 00 00\r
+R 00 00 01 00\r
+T 71 0F 00 00 CD 00 00 00 00 00 00 FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T 7A 0F 00 00 0C DD 66 0D E5 DD 6E 0A DD 66 0B\r
+R 00 00 01 00\r
+T 85 0F 00 00 E5 CD B5 0F 00 00 F1 F1 E5 FD E1\r
+R 00 00 01 00 00 06 01 00\r
+T 8E 0F 00 00 01 17 00 09 36 D2 0A 00 00 23 36\r
+R 00 00 01 00 09 09 01 00\r
+T 96 0F 00 00 D2 0A 00 00 23 36 D2 0A 00 00 FD\r
+R 00 00 01 00 89 04 01 00 29 0A 01 00\r
+T 9B 0F 00 00 36 1A 9F 0D 00 00 FD 36 1B\r
+R 00 00 01 00 09 06 01 00\r
+T A1 0F 00 00 9F 0D 00 00 FD 36 1C 9F 0D 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T A6 0F 00 00 FD 36 1D 63 0F 00 00 FD 36 1E\r
+R 00 00 01 00 09 07 01 00\r
+T AD 0F 00 00 63 0F 00 00 FD 36 1F 63 0F 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T B2 0F 00 00 C3 51 06 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T B5 0F 00 00\r
+R 00 00 01 00\r
+T B5 0F 00 00 DD 5E 02 DD 56 03 3E AF 05 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T BD 0F 00 00 21 AF 05 00 00 C3 00 00 00 00\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T C3 0F 00 00\r
+R 00 00 01 00\r
+T C3 0F 00 00 CD 00 00 00 00 FD E5 D5 FD E1 DD\r
+R 00 00 01 00 02 05 0A 00\r
+T CC 0F 00 00 6E 0A DD 66 0B E5 3E D2 0A 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T D4 0F 00 00 21 D2 0A 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T DB 0F 00 00 3E 03 DD AE 04 DD B6 05 20 3E FD\r
+R 00 00 01 00\r
+T E6 0F 00 00 4E 10 47 DD 6E 0A DD 66 0B ED 42\r
+R 00 00 01 00\r
+T F1 0F 00 00 20 30 FD 7E 0A E6 03 28 29\r
+R 00 00 01 00\r
+T FA 0F 00 00\r
+R 00 00 01 00\r
+T FA 0F 00 00\r
+R 00 00 01 00\r
+T FA 0F 00 00\r
+R 00 00 01 00\r
+T FA 0F 00 00 DD 6E 0A DD 66 0B E5 FD 5E 11 FD\r
+R 00 00 01 00\r
+T 05 10 00 00 56 12 FD 6E 11 FD 66 12 0E 17 CD\r
+R 00 00 01 00\r
+T 10 10 00 00 50 10 00 00 E1 FD CB 0A 66 28 0A\r
+R 00 00 01 00 00 04 01 00\r
+T 19 10 00 00\r
+R 00 00 01 00\r
+T 19 10 00 00 FD 4E 10 06 00 C5 CD 5E 10 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 22 10 00 00 E1\r
+R 00 00 01 00\r
+T 23 10 00 00\r
+R 00 00 01 00\r
+T 23 10 00 00\r
+R 00 00 01 00\r
+T 23 10 00 00 21 01 02 DD 4E 04 DD 46 05 A7 ED\r
+R 00 00 01 00\r
+T 2E 10 00 00 42 20 0B\r
+R 00 00 01 00\r
+T 31 10 00 00\r
+R 00 00 01 00\r
+T 31 10 00 00 DD 6E 0A DD 66 0B E5 CD\r
+R 00 00 01 00\r
+T 39 10 00 00 41 10 00 00 E1\r
+R 00 00 01 00 00 04 01 00\r
+T 3C 10 00 00\r
+R 00 00 01 00\r
+T 3C 10 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 41 10 00 00\r
+R 00 00 01 00\r
+T 41 10 00 00 FD 5E 11 FD 56 12 FD 6E 11 FD 66\r
+R 00 00 01 00\r
+T 4C 10 00 00 12 01 17 00\r
+R 00 00 01 00\r
+T 50 10 00 00\r
+R 00 00 01 00\r
+T 50 10 00 00 09 4E 23 46 23 7E 69 60 01 01 02\r
+R 00 00 01 00\r
+T 5B 10 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 0B 00\r
+T 5E 10 00 00\r
+R 00 00 01 00\r
+T 5E 10 00 00 FD 5E 11 FD 56 12 FD 6E 11 FD 66\r
+R 00 00 01 00\r
+T 69 10 00 00 12 0E 17 09 4E 23 46 23 7E 69 60\r
+R 00 00 01 00\r
+T 74 10 00 00 01 04 01 C3 00 00 00 00\r
+R 00 00 01 00 02 08 0B 00\r
+T 7A 10 00 00\r
+R 00 00 01 00\r
+T 7A 10 00 00 CD 00 00 00 00 FD E5 D5 FD E1 21\r
+R 00 00 01 00 02 05 0A 00\r
+T 83 10 00 00 0A 00 19 CB 76 FD 5E 20 FD 56 21\r
+R 00 00 01 00\r
+T 8E 10 00 00 21 0A 00 ED 4B 00 00 00 00 09 7E\r
+R 00 00 01 00 00 09 04 00\r
+T 97 10 00 00 23 66 6F 01 05 00 09 4E 23 46 23\r
+R 00 00 01 00\r
+T A2 10 00 00 7E 69 60 28 53\r
+R 00 00 01 00\r
+T A7 10 00 00\r
+R 00 00 01 00\r
+T A7 10 00 00 CD 00 00 00 00 29 4D 44 FD 6E 08\r
+R 00 00 01 00 02 05 0B 00\r
+T B0 10 00 00 FD 66 09 A7 ED 42 CD 27 11 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T B9 10 00 00 0E 0C 09 E5 FD 5E 20 FD 56 21 21\r
+R 00 00 01 00\r
+T C4 10 00 00 0A 00 ED 4B 00 00 00 00 09 7E 23\r
+R 00 00 01 00 00 08 04 00\r
+T CD 10 00 00 66 6F CD E7 03 00 00 C1 CD\r
+R 00 00 01 00 00 07 01 00\r
+T D4 10 00 00 0C 0F 00 00 FD 5E 08 FD 56 09 CD\r
+R 00 00 01 00 00 04 01 00\r
+T DD 10 00 00 28 11 00 00 0E 0A 09 E5 FD 5E 22\r
+R 00 00 01 00 00 04 01 00\r
+T E6 10 00 00 FD 56 23 69 60 CD DE 03 00 00 C1\r
+R 00 00 01 00 00 0A 01 00\r
+T EF 10 00 00 CD 00 00 00 00 FD 5E 22 FD 56 23\r
+R 00 00 01 00 02 05 0B 00\r
+T F8 10 00 00 18 20\r
+R 00 00 01 00\r
+T FA 10 00 00\r
+R 00 00 01 00\r
+T FA 10 00 00 CD 13 04 00 00 CD 27 11 00 00 0E\r
+R 00 00 01 00 00 05 01 00 00 0A 01 00\r
+T 01 11 00 00 0D 09 E5 FD 5E 20 FD 56 21 21\r
+R 00 00 01 00\r
+T 0B 11 00 00 0A 00 CD DE 03 00 00 C1 CD\r
+R 00 00 01 00 00 07 01 00\r
+T 12 11 00 00 00 00 00 00 FD 5E 20 FD 56 21\r
+R 00 00 01 00 02 04 0B 00\r
+T 1A 11 00 00\r
+R 00 00 01 00\r
+T 1A 11 00 00 3E 39 02 00 00 21 39 02 00 00\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 1F 11 00 00\r
+R 00 00 01 00\r
+T 1F 11 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 0B 00\r
+T 22 11 00 00\r
+R 00 00 01 00\r
+T 22 11 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 27 11 00 00\r
+R 00 00 01 00\r
+T 27 11 00 00 EB\r
+R 00 00 01 00\r
+T 28 11 00 00\r
+R 00 00 01 00\r
+T 28 11 00 00 01 02 00 CD 00 00 00 00 DD 6E 0A\r
+R 00 00 01 00 02 08 11 00\r
+T 31 11 00 00 DD 66 0B 19 C9\r
+R 00 00 01 00\r
+T 36 11 00 00\r
+R 00 00 01 00\r
+T 36 11 00 00 C5 DD E5 F5 F5 D5 DD E1 21 02 00\r
+R 00 00 01 00\r
+T 41 11 00 00 39 AF 77 23 77 2B 2B 2B 77 23 77\r
+R 00 00 01 00\r
+T 4C 11 00 00 21 0A 00 ED 4B 00 00 00 00 09 7E\r
+R 00 00 01 00 00 09 04 00\r
+T 55 11 00 00 23 66 6F 46 23 66 68 E5 21 0E 00\r
+R 00 00 01 00\r
+T 60 11 00 00 19 4E 23 46 E1 A7 ED 42 28 03\r
+R 00 00 01 00\r
+T 6A 11 00 00\r
+R 00 00 01 00\r
+T 6A 11 00 00 CD 1E 0F 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 6D 11 00 00\r
+R 00 00 01 00\r
+T 6D 11 00 00 DD CB 0A 46 CA 06 12 00 00\r
+R 00 00 01 00 00 09 01 00\r
+T 74 11 00 00\r
+R 00 00 01 00\r
+T 74 11 00 00 21 00 00 39 E5 CD 85 0D 00 00 E1\r
+R 00 00 01 00 00 0A 01 00\r
+T 7D 11 00 00 21 00 00 39 CD 0E 12 00 00 CD\r
+R 00 00 01 00 00 09 01 00\r
+T 85 11 00 00 00 00 00 00 DD 6E 08 DD 66 09 E5\r
+R 00 00 01 00 02 04 0B 00\r
+T 8E 11 00 00 DD 6E 06 DD 66 07 E5 21 04 00 39\r
+R 00 00 01 00\r
+T 99 11 00 00 4E 23 46 C5 23 4E 23 46 DD CB 0A\r
+R 00 00 01 00\r
+T A4 11 00 00 4E 28 07 DD 5E 10 16 00 18 03\r
+R 00 00 01 00\r
+T AE 11 00 00\r
+R 00 00 01 00\r
+T AE 11 00 00 11 00 00\r
+R 00 00 01 00\r
+T B1 11 00 00\r
+R 00 00 01 00\r
+T B1 11 00 00 CD F2 02 00 00 E1 E1 E1 DD 7E 0A\r
+R 00 00 01 00 00 05 01 00\r
+T BA 11 00 00 E6 82 28 1C DD 7E 0A E6 82 EE 82\r
+R 00 00 01 00\r
+T C5 11 00 00 28 13\r
+R 00 00 01 00\r
+T C7 11 00 00\r
+R 00 00 01 00\r
+T C7 11 00 00\r
+R 00 00 01 00\r
+T C7 11 00 00\r
+R 00 00 01 00\r
+T C7 11 00 00 DD 4E 08 DD 46 09 DD 5E 06 DD 56\r
+R 00 00 01 00\r
+T D2 11 00 00 07 3E AF 01 00 00 21 AF 01 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T D8 11 00 00 18 11\r
+R 00 00 01 00\r
+T DA 11 00 00\r
+R 00 00 01 00\r
+T DA 11 00 00 DD 4E 08 DD 46 09 DD 5E 06 DD 56\r
+R 00 00 01 00\r
+T E5 11 00 00 07 3E 25 01 00 00 21 25 01 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T EB 11 00 00\r
+R 00 00 01 00\r
+T EB 11 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 0B 00\r
+T EE 11 00 00\r
+R 00 00 01 00\r
+T EE 11 00 00 21 00 00 39 4E 23 46 C5 23 4E 23\r
+R 00 00 01 00\r
+T F9 11 00 00 46 DD E5 D1 3E 7A 10 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 00 12 00 00 7A 10 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 06 12 00 00\r
+R 00 00 01 00\r
+T 06 12 00 00 E1 E1 DD E1 C1 C3 00 00 00 00\r
+R 00 00 01 00 02 0A 00 00\r
+T 0E 12 00 00\r
+R 00 00 01 00\r
+T 0E 12 00 00 4E 23 46 23\r
+R 00 00 01 00\r
+T 12 12 00 00\r
+R 00 00 01 00\r
+T 12 12 00 00 5E 23 56 3E A3 00 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T 18 12 00 00 A3 00 00 00 CD 00 00 00 00 DD 4E\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 1F 12 00 00 08 DD 46 09 DD 5E 06 DD 56 07 3E\r
+R 00 00 01 00\r
+T 2A 12 00 00 E2 00 00 00 21 E2 00 00 00 C9\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 2F 12 00 00\r
+R 00 00 01 00\r
+T 2F 12 00 00 CD 00 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 0A 00 02 0A 04 00\r
+T 35 12 00 00\r
+R 00 00 01 00\r
+T 35 12 00 00 CD 00 00 00 00 00 00 FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T 3E 12 00 00 0C DD 66 0D E5 DD 6E 0A DD 66 0B\r
+R 00 00 01 00\r
+T 49 12 00 00 E5 CD B5 0F 00 00 F1 F1 E5 FD E1\r
+R 00 00 01 00 00 06 01 00\r
+T 52 12 00 00 01 0A 00 09 7E F6 03 77 DD 46 0E\r
+R 00 00 01 00\r
+T 5D 12 00 00 FD 70 10 FD 36 17 C3 0F 00 00 FD\r
+R 00 00 01 00 09 0A 01 00\r
+T 65 12 00 00 36 18 C3 0F 00 00 FD 36 19\r
+R 00 00 01 00 89 06 01 00\r
+T 6B 12 00 00 C3 0F 00 00 FD 36 1A 36 11 00 00\r
+R 00 00 01 00 29 04 01 00 09 0B 01 00\r
+T 70 12 00 00 FD 36 1B 36 11 00 00 FD 36 1C\r
+R 00 00 01 00 89 07 01 00\r
+T 77 12 00 00 36 11 00 00 FD 36 1D 2F 12 00 00\r
+R 00 00 01 00 29 04 01 00 09 0B 01 00\r
+T 7C 12 00 00 FD 36 1E 2F 12 00 00 FD 36 1F\r
+R 00 00 01 00 89 07 01 00\r
+T 83 12 00 00 2F 12 00 00 C3 51 06 00 00\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 87 12 00 00\r
+R 00 00 01 00\r
+T 87 12 00 00 CD 00 00 00 00 FD E5 D5 FD E1 DD\r
+R 00 00 01 00 02 05 0A 00\r
+T 90 12 00 00 6E 0A DD 66 0B E5 3E D2 0A 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 98 12 00 00 21 D2 0A 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T 9F 12 00 00 3E 03 DD AE 04 DD B6 05 20 5C FD\r
+R 00 00 01 00\r
+T AA 12 00 00 4E 10 47 DD 6E 0A DD 66 0B ED 42\r
+R 00 00 01 00\r
+T B5 12 00 00 20 4E FD 7E 0A E6 03 28 47\r
+R 00 00 01 00\r
+T BE 12 00 00\r
+R 00 00 01 00\r
+T BE 12 00 00\r
+R 00 00 01 00\r
+T BE 12 00 00\r
+R 00 00 01 00\r
+T BE 12 00 00 FD 7E 0A EE 04 FD 77 0A DD 6E 0A\r
+R 00 00 01 00\r
+T C9 12 00 00 DD 66 0B E5 FD 5E 11 FD 56 12 FD\r
+R 00 00 01 00\r
+T D4 12 00 00 6E 11 FD 66 12 0E 17 09 4E 23 46\r
+R 00 00 01 00\r
+T DF 12 00 00 23 7E 69 60 01 02 02 CD\r
+R 00 00 01 00\r
+T E7 12 00 00 00 00 00 00 E1 21 00 00 E5 01\r
+R 00 00 01 00 02 04 0B 00\r
+T EF 12 00 00 03 01 CD 76 0D 00 00 E1 FD CB 0A\r
+R 00 00 01 00 00 07 01 00\r
+T F8 12 00 00 66 28 0A\r
+R 00 00 01 00\r
+T FB 12 00 00\r
+R 00 00 01 00\r
+T FB 12 00 00 FD 4E 10 06 00 C5 CD 5E 10 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 04 13 00 00 E1\r
+R 00 00 01 00\r
+T 05 13 00 00\r
+R 00 00 01 00\r
+T 05 13 00 00\r
+R 00 00 01 00\r
+T 05 13 00 00 21 01 02 DD 4E 04 DD 46 05 A7 ED\r
+R 00 00 01 00\r
+T 10 13 00 00 42 20 0B\r
+R 00 00 01 00\r
+T 13 13 00 00\r
+R 00 00 01 00\r
+T 13 13 00 00 DD 6E 0A DD 66 0B E5 CD\r
+R 00 00 01 00\r
+T 1B 13 00 00 41 10 00 00 E1\r
+R 00 00 01 00 00 04 01 00\r
+T 1E 13 00 00\r
+R 00 00 01 00\r
+T 1E 13 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 23 13 00 00\r
+R 00 00 01 00\r
+T 23 13 00 00 C5 DD E5 F5 F5 D5 DD E1 21 02 00\r
+R 00 00 01 00\r
+T 2E 13 00 00 39 AF 77 23 77 2B 2B 2B 77 23 77\r
+R 00 00 01 00\r
+T 39 13 00 00 21 0A 00 ED 4B 00 00 00 00 09 7E\r
+R 00 00 01 00 00 09 04 00\r
+T 42 13 00 00 23 66 6F 46 23 66 68 E5 21 0E 00\r
+R 00 00 01 00\r
+T 4D 13 00 00 19 4E 23 46 E1 A7 ED 42 28 03\r
+R 00 00 01 00\r
+T 57 13 00 00\r
+R 00 00 01 00\r
+T 57 13 00 00 CD 1E 0F 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 5A 13 00 00\r
+R 00 00 01 00\r
+T 5A 13 00 00 DD CB 0A 46 CA 0C 14 00 00\r
+R 00 00 01 00 00 09 01 00\r
+T 61 13 00 00\r
+R 00 00 01 00\r
+T 61 13 00 00 21 00 00 39 E5 CD 85 0D 00 00 E1\r
+R 00 00 01 00 00 0A 01 00\r
+T 6A 13 00 00 21 00 00 39 CD 0E 12 00 00 CD\r
+R 00 00 01 00 00 09 01 00\r
+T 72 13 00 00 00 00 00 00 DD CB 0A 4E 28 36 DD\r
+R 00 00 01 00 02 04 0B 00\r
+T 7B 13 00 00 CB 0A 56 28 30\r
+R 00 00 01 00\r
+T 80 13 00 00\r
+R 00 00 01 00\r
+T 80 13 00 00\r
+R 00 00 01 00\r
+T 80 13 00 00\r
+R 00 00 01 00\r
+T 80 13 00 00 DD 4E 08 DD 46 09 DD 5E 06 DD 56\r
+R 00 00 01 00\r
+T 8B 13 00 00 07 3E AF 01 00 00 21 AF 01 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 91 13 00 00 CD 00 00 00 00 DD 6E 08 DD 66 09\r
+R 00 00 01 00 02 05 0B 00\r
+T 9A 13 00 00 E5 DD 6E 06 DD 66 07 E5 21 04 00\r
+R 00 00 01 00\r
+T A5 13 00 00 39 4E 23 46 C5 23 4E 23 46 18 34\r
+R 00 00 01 00\r
+T B0 13 00 00\r
+R 00 00 01 00\r
+T B0 13 00 00 DD 4E 08 DD 46 09 DD 5E 06 DD 56\r
+R 00 00 01 00\r
+T BB 13 00 00 07 3E 25 01 00 00 21 25 01 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T C1 13 00 00 CD 00 00 00 00 DD 6E 08 DD 66 09\r
+R 00 00 01 00 02 05 0B 00\r
+T CA 13 00 00 E5 DD 6E 06 DD 66 07 E5 21 04 00\r
+R 00 00 01 00\r
+T D5 13 00 00 39 4E 23 46 C5 23 4E 23 46 DD CB\r
+R 00 00 01 00\r
+T E0 13 00 00 0A 4E 28 07\r
+R 00 00 01 00\r
+T E4 13 00 00\r
+R 00 00 01 00\r
+T E4 13 00 00 DD 5E 10 16 00 18 03\r
+R 00 00 01 00\r
+T EB 13 00 00\r
+R 00 00 01 00\r
+T EB 13 00 00 11 00 00\r
+R 00 00 01 00\r
+T EE 13 00 00\r
+R 00 00 01 00\r
+T EE 13 00 00 CD F2 02 00 00 E1 E1 E1\r
+R 00 00 01 00 00 05 01 00\r
+T F4 13 00 00\r
+R 00 00 01 00\r
+T F4 13 00 00 21 00 00 39 4E 23 46 C5 23 4E 23\r
+R 00 00 01 00\r
+T FF 13 00 00 46 DD E5 D1 3E 7A 10 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 06 14 00 00 7A 10 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 0C 14 00 00\r
+R 00 00 01 00\r
+T 0C 14 00 00 C3 06 12 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 0F 14 00 00\r
+R 00 00 01 00\r
+T 0F 14 00 00 CD 00 00 00 00 00 00 FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T 18 14 00 00 0C DD 66 0D E5 DD 6E 0A DD 66 0B\r
+R 00 00 01 00\r
+T 23 14 00 00 E5 CD B5 0F 00 00 F1 F1 E5 FD E1\r
+R 00 00 01 00 00 06 01 00\r
+T 2C 14 00 00 01 0A 00 09 7E F6 07 77 DD 46 0E\r
+R 00 00 01 00\r
+T 37 14 00 00 FD 70 10 FD 36 17 87 12 00 00 FD\r
+R 00 00 01 00 09 0A 01 00\r
+T 3F 14 00 00 36 18 87 12 00 00 FD 36 19\r
+R 00 00 01 00 89 06 01 00\r
+T 45 14 00 00 87 12 00 00 FD 36 1A 23 13 00 00\r
+R 00 00 01 00 29 04 01 00 09 0B 01 00\r
+T 4A 14 00 00 FD 36 1B 23 13 00 00 FD 36 1C\r
+R 00 00 01 00 89 07 01 00\r
+T 51 14 00 00 23 13 00 00 FD 36 1D 2F 12 00 00\r
+R 00 00 01 00 29 04 01 00 09 0B 01 00\r
+T 56 14 00 00 FD 36 1E 2F 12 00 00 FD 36 1F\r
+R 00 00 01 00 89 07 01 00\r
+T 5D 14 00 00 2F 12 00 00 C3 51 06 00 00\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 61 14 00 00\r
+R 00 00 01 00\r
+T 61 14 00 00 CD 00 00 00 00 FD E5 D5 FD E1 DD\r
+R 00 00 01 00 02 05 0A 00\r
+T 6A 14 00 00 6E 0A DD 66 0B E5 3E D2 0A 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 72 14 00 00 21 D2 0A 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T 79 14 00 00 21 01 02 DD 4E 04 DD 46 05 A7 ED\r
+R 00 00 01 00\r
+T 84 14 00 00 42 20 40 3E FF DD AE 0A DD B6 0B\r
+R 00 00 01 00\r
+T 8F 14 00 00 20 36\r
+R 00 00 01 00\r
+T 91 14 00 00\r
+R 00 00 01 00\r
+T 91 14 00 00\r
+R 00 00 01 00\r
+T 91 14 00 00\r
+R 00 00 01 00\r
+T 91 14 00 00 FD CB 0B 66 E5 28 05\r
+R 00 00 01 00\r
+T 98 14 00 00\r
+R 00 00 01 00\r
+T 98 14 00 00 01 05 01 18 03\r
+R 00 00 01 00\r
+T 9D 14 00 00\r
+R 00 00 01 00\r
+T 9D 14 00 00 01 02 01\r
+R 00 00 01 00\r
+T A0 14 00 00\r
+R 00 00 01 00\r
+T A0 14 00 00 CD 76 0D 00 00 E1\r
+R 00 00 01 00 00 05 01 00\r
+T A4 14 00 00\r
+R 00 00 01 00\r
+T A4 14 00 00 FD 4E 10 06 00 C5 FD 5E 11 FD 56\r
+R 00 00 01 00\r
+T AF 14 00 00 12 FD 6E 11 FD 66 12 0E 17 09 4E\r
+R 00 00 01 00\r
+T BA 14 00 00 23 46 23 7E 69 60 01 01 03 CD\r
+R 00 00 01 00\r
+T C4 14 00 00 00 00 00 00 E1\r
+R 00 00 01 00 02 04 0B 00\r
+T C7 14 00 00\r
+R 00 00 01 00\r
+T C7 14 00 00 21 01 02 DD 4E 04 DD 46 05 A7 ED\r
+R 00 00 01 00\r
+T D2 14 00 00 42 20 40 3E FE DD AE 0A DD B6 0B\r
+R 00 00 01 00\r
+T DD 14 00 00 20 36\r
+R 00 00 01 00\r
+T DF 14 00 00\r
+R 00 00 01 00\r
+T DF 14 00 00\r
+R 00 00 01 00\r
+T DF 14 00 00\r
+R 00 00 01 00\r
+T DF 14 00 00 FD CB 0B 66 E5 28 05\r
+R 00 00 01 00\r
+T E6 14 00 00\r
+R 00 00 01 00\r
+T E6 14 00 00 01 05 01 18 03\r
+R 00 00 01 00\r
+T EB 14 00 00\r
+R 00 00 01 00\r
+T EB 14 00 00 01 02 01\r
+R 00 00 01 00\r
+T EE 14 00 00\r
+R 00 00 01 00\r
+T EE 14 00 00 CD 76 0D 00 00 E1\r
+R 00 00 01 00 00 05 01 00\r
+T F2 14 00 00\r
+R 00 00 01 00\r
+T F2 14 00 00 FD 4E 10 06 00 C5 FD 5E 11 FD 56\r
+R 00 00 01 00\r
+T FD 14 00 00 12 FD 6E 11 FD 66 12 0E 17 09 4E\r
+R 00 00 01 00\r
+T 08 15 00 00 23 46 23 7E 69 60 01 02 03 CD\r
+R 00 00 01 00\r
+T 12 15 00 00 00 00 00 00 E1\r
+R 00 00 01 00 02 04 0B 00\r
+T 15 15 00 00\r
+R 00 00 01 00\r
+T 15 15 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 1A 15 00 00\r
+R 00 00 01 00\r
+T 1A 15 00 00 CD 00 00 00 00 FE FF FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T 23 15 00 00 0C DD 66 0D E5 DD 6E 0A DD 66 0B\r
+R 00 00 01 00\r
+T 2E 15 00 00 E5 CD B5 0F 00 00 F1 F1 E5 FD E1\r
+R 00 00 01 00 00 06 01 00\r
+T 37 15 00 00 01 0A 00 09 CB C6 DD 46 0E FD 70\r
+R 00 00 01 00\r
+T 42 15 00 00 10 FD 36 17 61 14 00 00 FD 36 18\r
+R 00 00 01 00 09 08 01 00\r
+T 4A 15 00 00 61 14 00 00 FD 36 19 61 14 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T 4F 15 00 00 FD 36 1A 9F 0D 00 00 FD 36 1B\r
+R 00 00 01 00 09 07 01 00\r
+T 56 15 00 00 9F 0D 00 00 FD 36 1C 9F 0D 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T 5B 15 00 00 FD 36 1D 63 0F 00 00 FD 36 1E\r
+R 00 00 01 00 09 07 01 00\r
+T 62 15 00 00 63 0F 00 00 FD 36 1F 63 0F 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T 67 15 00 00 21 FF 00 E5 2E 14 E5 2E 28 E5 21\r
+R 00 00 01 00\r
+T 72 15 00 00 E4 FF CD CC 15 00 00 F1 F1 F1 DD\r
+R 00 00 01 00 00 07 01 00\r
+T 7B 15 00 00 75 FE DD 74 FF 01 20 00 09 E5 11\r
+R 00 00 01 00\r
+T 86 15 00 00 03 00 CD 28 04 00 00 E1 71 23 70\r
+R 00 00 01 00 00 07 01 00\r
+T 8F 15 00 00 01 0A 00 00 00 CD E8 15 00 00 CD\r
+R 00 00 01 00 00 05 02 00 00 0A 01 00\r
+T 96 15 00 00 00 00 00 00 21 FE 00 E5 2E 14 E5\r
+R 00 00 01 00 02 04 0B 00\r
+T 9F 15 00 00 2E 28 E5 21 C8 FF CD CC 15 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T A8 15 00 00 F1 F1 F1 DD 75 FE DD 74 FF 01\r
+R 00 00 01 00\r
+T B2 15 00 00 20 00 09 E5 11 07 00 CD\r
+R 00 00 01 00\r
+T BA 15 00 00 28 04 00 00 E1 71 23 70 01\r
+R 00 00 01 00 00 04 01 00\r
+T C1 15 00 00 0D 00 00 00 CD E8 15 00 00 CD\r
+R 00 00 01 00 00 04 02 00 00 09 01 00\r
+T C7 15 00 00 00 00 00 00 C3 51 06 00 00\r
+R 00 00 01 00 02 04 0B 00 00 09 01 00\r
+T CC 15 00 00\r
+R 00 00 01 00\r
+T CC 15 00 00 DD 4E 0C DD 46 0D 09 4D 44 21\r
+R 00 00 01 00\r
+T D6 15 00 00 D0 FF DD 5E 0A DD 56 0B 19 EB\r
+R 00 00 01 00\r
+T E0 15 00 00\r
+R 00 00 01 00\r
+T E0 15 00 00 3E 35 12 00 00 21 35 12 00 00 C3\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T E6 15 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T E8 15 00 00\r
+R 00 00 01 00\r
+T E8 15 00 00 DD 5E FE DD 56 FF 3E 59 06 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T F0 15 00 00 21 59 06 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T F7 15 00 00 4E FE DD 46 FF FD E5 D1 FD 7E 1F\r
+R 00 00 01 00\r
+T 02 16 00 00 FD 6E 1D FD 66 1E C9\r
+R 00 00 01 00\r
+T 09 16 00 00\r
+R 00 00 01 00\r
+T 09 16 00 00 CD 00 00 00 00 FD E5 D5 FD E1 DD\r
+R 00 00 01 00 02 05 0A 00\r
+T 12 16 00 00 6E 0A DD 66 0B E5 3E C3 0F 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 1A 16 00 00 21 C3 0F 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T 21 16 00 00 21 03 02 DD 4E 04 DD 46 05 A7 ED\r
+R 00 00 01 00\r
+T 2C 16 00 00 42 20 40 FD CB 0A 5E 28 3A\r
+R 00 00 01 00\r
+T 35 16 00 00\r
+R 00 00 01 00\r
+T 35 16 00 00\r
+R 00 00 01 00\r
+T 35 16 00 00\r
+R 00 00 01 00\r
+T 35 16 00 00 3E 08 DD AE 0A DD B6 0B FD 5E 20\r
+R 00 00 01 00\r
+T 40 16 00 00 FD 56 21 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 06 00\r
+T 46 16 00 00 00 00 00 00 20 0D\r
+R 00 00 01 00 02 04 06 00\r
+T 4A 16 00 00\r
+R 00 00 01 00\r
+T 4A 16 00 00 CD 22 04 00 00 28 15\r
+R 00 00 01 00 00 05 01 00\r
+T 4F 16 00 00\r
+R 00 00 01 00\r
+T 4F 16 00 00 CD 74 16 00 00 2B 36 00\r
+R 00 00 01 00 00 05 01 00\r
+T 55 16 00 00\r
+R 00 00 01 00\r
+T 55 16 00 00 18 0D\r
+R 00 00 01 00\r
+T 57 16 00 00\r
+R 00 00 01 00\r
+T 57 16 00 00 CD 7F 16 00 00 23 36 00 CD\r
+R 00 00 01 00 00 05 01 00\r
+T 5E 16 00 00 74 16 00 00 DD 46 0A 70\r
+R 00 00 01 00 00 04 01 00\r
+T 64 16 00 00\r
+R 00 00 01 00\r
+T 64 16 00 00 21 00 00 E5 01 03 01 CD\r
+R 00 00 01 00\r
+T 6C 16 00 00 76 0D 00 00 E1\r
+R 00 00 01 00 00 04 01 00\r
+T 6F 16 00 00\r
+R 00 00 01 00\r
+T 6F 16 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 74 16 00 00\r
+R 00 00 01 00\r
+T 74 16 00 00 FD 5E 20 FD 56 21 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 06 00\r
+T 7C 16 00 00 21 00 00 00 00\r
+R 00 00 01 00 02 05 06 00\r
+T 7F 16 00 00\r
+R 00 00 01 00\r
+T 7F 16 00 00 CD 00 00 00 00 FD 4E 20 FD 46 21\r
+R 00 00 01 00 02 05 0B 00\r
+T 88 16 00 00 09 C9\r
+R 00 00 01 00\r
+T 8A 16 00 00\r
+R 00 00 01 00\r
+T 8A 16 00 00 C5 FD E5 DD E5 21 B8 FF 39 F9 D5\r
+R 00 00 01 00\r
+T 95 16 00 00 DD E1 AF 77 23 77 23 77 23 77 21\r
+R 00 00 01 00\r
+T A0 16 00 00 0A 00 ED 4B 00 00 00 00 09 7E 23\r
+R 00 00 01 00 00 08 04 00\r
+T A9 16 00 00 66 6F 46 23 66 68 E5 21 0E 00 19\r
+R 00 00 01 00\r
+T B4 16 00 00 4E 23 46 E1 A7 ED 42 28 03\r
+R 00 00 01 00\r
+T BD 16 00 00\r
+R 00 00 01 00\r
+T BD 16 00 00 CD 1E 0F 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T C0 16 00 00\r
+R 00 00 01 00\r
+T C0 16 00 00 DD CB 0A 46 CA CE 17 00 00\r
+R 00 00 01 00 00 09 01 00\r
+T C7 16 00 00\r
+R 00 00 01 00\r
+T C7 16 00 00 21 02 00 39 E5 2B 2B CD\r
+R 00 00 01 00\r
+T CF 16 00 00 87 0D 00 00 E1 21 02 00 39 4E 23\r
+R 00 00 01 00 00 04 01 00\r
+T D8 16 00 00 46 2B 2B 2B CD 12 12 00 00 CD\r
+R 00 00 01 00 00 09 01 00\r
+T E0 16 00 00 00 00 00 00 DD 6E 08 DD 66 09 E5\r
+R 00 00 01 00 02 04 0B 00\r
+T E9 16 00 00 DD 6E 06 DD 66 07 E5 21 06 00 39\r
+R 00 00 01 00\r
+T F4 16 00 00 4E 23 46 C5 2B 2B 2B 4E 23 46 DD\r
+R 00 00 01 00\r
+T FF 16 00 00 CB 0A 4E 28 07 DD 5E 10 16 00 18\r
+R 00 00 01 00\r
+T 0A 17 00 00 03\r
+R 00 00 01 00\r
+T 0B 17 00 00\r
+R 00 00 01 00\r
+T 0B 17 00 00 11 00 00\r
+R 00 00 01 00\r
+T 0E 17 00 00\r
+R 00 00 01 00\r
+T 0E 17 00 00 CD F2 02 00 00 E1 E1 E1 DD CB 0A\r
+R 00 00 01 00 00 05 01 00\r
+T 17 17 00 00 7E DD 4E 08 DD 46 09 DD 5E 06 DD\r
+R 00 00 01 00\r
+T 22 17 00 00 56 07 20 07\r
+R 00 00 01 00\r
+T 26 17 00 00\r
+R 00 00 01 00\r
+T 26 17 00 00 3E AF 01 00 00 21 AF 01 00 00 18\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 2C 17 00 00 05\r
+R 00 00 01 00\r
+T 2D 17 00 00\r
+R 00 00 01 00\r
+T 2D 17 00 00 3E 25 01 00 00 21 25 01 00 00\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 32 17 00 00\r
+R 00 00 01 00\r
+T 32 17 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 0B 00\r
+T 35 17 00 00\r
+R 00 00 01 00\r
+T 35 17 00 00 DD 5E 20 DD 56 21 21 0A 00 ED 4B\r
+R 00 00 01 00\r
+T 40 17 00 00 00 00 00 00 09 46 23 66 68 01\r
+R 00 00 01 00 00 04 04 00\r
+T 48 17 00 00 05 00 09 4E 23 46 23 7E 69 60 CD\r
+R 00 00 01 00\r
+T 53 17 00 00 2D 04 00 00 DD 6E 08 DD 66 09 A7\r
+R 00 00 01 00 00 04 01 00\r
+T 5C 17 00 00 ED 42 EB 01 02 00 CD 00 00 00 00\r
+R 00 00 01 00 02 0B 11 00\r
+T 65 17 00 00 69 60 39 46 23 66 68 19 01 07 00\r
+R 00 00 01 00\r
+T 70 17 00 00 09 4D 44 21 00 00 39 5E 23 56 13\r
+R 00 00 01 00\r
+T 7B 17 00 00 13 3E A3 00 00 00 21 A3 00 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 81 17 00 00 CD 00 00 00 00 DD CB 0B 46 28 36\r
+R 00 00 01 00 02 05 0B 00\r
+T 8A 17 00 00\r
+R 00 00 01 00\r
+T 8A 17 00 00 FD 21 00 00\r
+R 00 00 01 00\r
+T 8E 17 00 00\r
+R 00 00 01 00\r
+T 8E 17 00 00 DD 5E 20 DD 56 21 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 06 00\r
+T 96 17 00 00 21 00 00 00 00 CD 2D 04 00 00 FD\r
+R 00 00 01 00 02 05 06 00 00 0A 01 00\r
+T 9D 17 00 00 E5 E1 A7 ED 42 21 06 00 30 0B\r
+R 00 00 01 00\r
+T A7 17 00 00\r
+R 00 00 01 00\r
+T A7 17 00 00 39 FD E5 C1 09 36 2A FD 23 18 DC\r
+R 00 00 01 00\r
+T B2 17 00 00\r
+R 00 00 01 00\r
+T B2 17 00 00 39 FD E5 C1 09 36 00 21 06 00 39\r
+R 00 00 01 00\r
+T BD 17 00 00 EB 18 06\r
+R 00 00 01 00\r
+T C0 17 00 00\r
+R 00 00 01 00\r
+T C0 17 00 00 DD 5E 20 DD 56 21\r
+R 00 00 01 00\r
+T C6 17 00 00\r
+R 00 00 01 00\r
+T C6 17 00 00 3E 39 02 00 00 21 39 02 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T CC 17 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T CE 17 00 00\r
+R 00 00 01 00\r
+T CE 17 00 00\r
+R 00 00 01 00\r
+T CE 17 00 00 21 48 00 39 F9 C3 5E 02 00 00\r
+R 00 00 01 00 00 0A 01 00\r
+T D6 17 00 00\r
+R 00 00 01 00\r
+T D6 17 00 00 CD 00 00 00 00 00 00 FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T DF 17 00 00 0E DD 66 0F E5 DD 6E 0C DD 66 0D\r
+R 00 00 01 00\r
+T EA 17 00 00 E5 DD 6E 0A DD 66 0B E5 DD 5E 02\r
+R 00 00 01 00\r
+T F5 17 00 00 DD 56 03 CD E0 15 00 00 F1 F1 F1\r
+R 00 00 01 00 00 08 01 00\r
+T FE 17 00 00 E5 FD E1 01 0A 00 09 CB DE 01\r
+R 00 00 01 00\r
+T 08 18 00 00 14 00 00 00 FD E5 D1 3E\r
+R 00 00 01 00 00 04 02 00\r
+T 0E 18 00 00 59 06 00 00 21 59 06 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 13 18 00 00 00 00 00 00 FD 36 1A 8A 16 00 00\r
+R 00 00 01 00 02 04 0B 00 09 0B 01 00\r
+T 19 18 00 00 FD 36 1B 8A 16 00 00 FD 36 1C\r
+R 00 00 01 00 89 07 01 00\r
+T 20 18 00 00 8A 16 00 00 FD 36 17 09 16 00 00\r
+R 00 00 01 00 29 04 01 00 09 0B 01 00\r
+T 25 18 00 00 FD 36 18 09 16 00 00 FD 36 19\r
+R 00 00 01 00 89 07 01 00\r
+T 2C 18 00 00 09 16 00 00 C3 51 06 00 00\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 30 18 00 00\r
+R 00 00 01 00\r
+T 30 18 00 00 CD 00 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 0A 00 02 0A 04 00\r
+T 36 18 00 00\r
+R 00 00 01 00\r
+T 36 18 00 00 C5 DD E5 F5 F5 D5 DD E1 21 02 00\r
+R 00 00 01 00\r
+T 41 18 00 00 39 AF 77 23 77 2B 2B 2B 77 23 77\r
+R 00 00 01 00\r
+T 4C 18 00 00 21 0A 00 ED 4B 00 00 00 00 09 7E\r
+R 00 00 01 00 00 09 04 00\r
+T 55 18 00 00 23 66 6F 46 23 66 68 E5 21 0E 00\r
+R 00 00 01 00\r
+T 60 18 00 00 19 4E 23 46 E1 A7 ED 42 28 03\r
+R 00 00 01 00\r
+T 6A 18 00 00\r
+R 00 00 01 00\r
+T 6A 18 00 00 CD 1E 0F 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 6D 18 00 00\r
+R 00 00 01 00\r
+T 6D 18 00 00 DD CB 0A 46 28 21\r
+R 00 00 01 00\r
+T 73 18 00 00\r
+R 00 00 01 00\r
+T 73 18 00 00 21 00 00 39 E5 CD 85 0D 00 00 E1\r
+R 00 00 01 00 00 0A 01 00\r
+T 7C 18 00 00 21 00 00 39 4E 23 46 C5 23 4E 23\r
+R 00 00 01 00\r
+T 87 18 00 00 46 DD E5 D1 3E 7A 10 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 8E 18 00 00 7A 10 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 94 18 00 00\r
+R 00 00 01 00\r
+T 94 18 00 00 C3 06 12 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 97 18 00 00\r
+R 00 00 01 00\r
+T 97 18 00 00 CD 00 00 00 00 00 00 FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T A0 18 00 00 0C DD 66 0D E5 DD 6E 0A DD 66 0B\r
+R 00 00 01 00\r
+T AB 18 00 00 E5 CD B5 0F 00 00 F1 F1 E5 FD E1\r
+R 00 00 01 00 00 06 01 00\r
+T B4 18 00 00 01 20 00 09 DD 4E 0E 71 DD 46 0F\r
+R 00 00 01 00\r
+T BF 18 00 00 23 70 FD 36 0A 01 FD 36 0B 00 FD\r
+R 00 00 01 00\r
+T CA 18 00 00 36 17 30 18 00 00 FD 36 18\r
+R 00 00 01 00 09 06 01 00\r
+T D0 18 00 00 30 18 00 00 FD 36 19 30 18 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T D5 18 00 00 FD 36 1A 36 18 00 00 FD 36 1B\r
+R 00 00 01 00 09 07 01 00\r
+T DC 18 00 00 36 18 00 00 FD 36 1C 36 18 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T E1 18 00 00 FD 36 1D 2F 12 00 00 FD 36 1E\r
+R 00 00 01 00 09 07 01 00\r
+T E8 18 00 00 2F 12 00 00 FD 36 1F 2F 12 00 00\r
+R 00 00 01 00 89 04 01 00 29 0B 01 00\r
+T ED 18 00 00 C3 51 06 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T F0 18 00 00\r
+R 00 00 01 00\r
+T F0 18 00 00 CD 00 00 00 00 00 00 DD 6E 0A DD\r
+R 00 00 01 00 02 05 0E 00\r
+T F9 18 00 00 66 0B E5 DD 5E 02 DD 56 03 3E\r
+R 00 00 01 00\r
+T 03 19 00 00 D2 0A 00 00 21 D2 0A 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 08 19 00 00 00 00 00 00 E1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00 02 0A 04 00\r
+T 0E 19 00 00\r
+R 00 00 01 00\r
+T 0E 19 00 00 CD 00 00 00 00 CE FF FD E5 DD 36\r
+R 00 00 01 00 02 05 0E 00\r
+T 17 19 00 00 D8 00 21 00 00 E5 C5 3E\r
+R 00 00 01 00\r
+T 1F 19 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 10 00 02 09 10 00\r
+T 24 19 00 00 00 00 00 00 F1 F1 DD 75 D4 DD 74\r
+R 00 00 01 00 02 04 0B 00\r
+T 2D 19 00 00 D5 DD 36 F0 2B DD 36 F1 00 DD 36\r
+R 00 00 01 00\r
+T 38 19 00 00 F2 1A DD 36 F3 00\r
+R 00 00 01 00\r
+T 3E 19 00 00\r
+R 00 00 01 00\r
+T 3E 19 00 00 DD 36 F4 00 DD 7E D8 FE 73 20 18\r
+R 00 00 01 00\r
+T 49 19 00 00\r
+R 00 00 01 00\r
+T 49 19 00 00 DD 6E D9 DD 66 DA DD 75 F0 DD 74\r
+R 00 00 01 00\r
+T 54 19 00 00 F1 DD 6E DB DD 66 DC DD 75 F2 DD\r
+R 00 00 01 00\r
+T 5F 19 00 00 74 F3\r
+R 00 00 01 00\r
+T 61 19 00 00\r
+R 00 00 01 00\r
+T 61 19 00 00 DD 7E D8 FE 42 28 07 DD 7E D8 FE\r
+R 00 00 01 00\r
+T 6C 19 00 00 4D 20 4F\r
+R 00 00 01 00\r
+T 6F 19 00 00\r
+R 00 00 01 00\r
+T 6F 19 00 00\r
+R 00 00 01 00\r
+T 6F 19 00 00\r
+R 00 00 01 00\r
+T 6F 19 00 00 DD 4E DD 06 00 C5 CD D8 1C 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 78 19 00 00 D5 DD 4E DB DD 5E F0 DD 56 F1 CD\r
+R 00 00 01 00\r
+T 83 19 00 00 E1 1C 00 00 D5 DD 4E DA DD 5E F2\r
+R 00 00 01 00 00 04 01 00\r
+T 8C 19 00 00 DD 56 F3 CD 00 00 00 00 D5 DD 5E\r
+R 00 00 01 00 02 08 03 00\r
+T 95 19 00 00 D9 50 DD 4E F0 DD 46 F1 CD\r
+R 00 00 01 00\r
+T 9E 19 00 00 00 00 00 00 3E 35 12 00 00 21\r
+R 00 00 01 00 02 04 03 00 29 09 01 00\r
+T A3 19 00 00 35 12 00 00 C1 CD 00 00 00 00 F1\r
+R 00 00 01 00 00 04 01 00 02 0A 0B 00\r
+T AA 19 00 00 F1 F1 E5 FD E1 DD 7E D8 FE 4D 20\r
+R 00 00 01 00\r
+T B5 19 00 00 04\r
+R 00 00 01 00\r
+T B6 19 00 00\r
+R 00 00 01 00\r
+T B6 19 00 00 FD CB 0A F6\r
+R 00 00 01 00\r
+T BA 19 00 00\r
+R 00 00 01 00\r
+T BA 19 00 00 DD 36 F4 01\r
+R 00 00 01 00\r
+T BE 19 00 00\r
+R 00 00 01 00\r
+T BE 19 00 00 DD 7E D8 FE 54 20 44\r
+R 00 00 01 00\r
+T C5 19 00 00\r
+R 00 00 01 00\r
+T C5 19 00 00 DD 4E DD 06 00 C5 CD D8 1C 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T CE 19 00 00 D5 DD 4E DB DD 5E F0 DD 56 F1 CD\r
+R 00 00 01 00\r
+T D9 19 00 00 E1 1C 00 00 D5 DD 4E DA DD 5E F2\r
+R 00 00 01 00 00 04 01 00\r
+T E2 19 00 00 DD 56 F3 CD 00 00 00 00 D5 DD 5E\r
+R 00 00 01 00 02 08 03 00\r
+T EB 19 00 00 D9 50 DD 4E F0 DD 46 F1 CD\r
+R 00 00 01 00\r
+T F4 19 00 00 00 00 00 00 3E 0F 14 00 00 21\r
+R 00 00 01 00 02 04 03 00 29 09 01 00\r
+T F9 19 00 00 0F 14 00 00 C1 CD 00 00 00 00 F1\r
+R 00 00 01 00 00 04 01 00 02 0A 0B 00\r
+T 00 1A 00 00 F1 F1 E5 FD E1 DD 36 F4 01\r
+R 00 00 01 00\r
+T 09 1A 00 00\r
+R 00 00 01 00\r
+T 09 1A 00 00 DD 7E D8 FE 44 20 44\r
+R 00 00 01 00\r
+T 10 1A 00 00\r
+R 00 00 01 00\r
+T 10 1A 00 00 DD 4E DD 06 00 C5 CD D8 1C 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 19 1A 00 00 D5 DD 4E DB DD 5E F0 DD 56 F1 CD\r
+R 00 00 01 00\r
+T 24 1A 00 00 E1 1C 00 00 D5 DD 4E DA DD 5E F2\r
+R 00 00 01 00 00 04 01 00\r
+T 2D 1A 00 00 DD 56 F3 CD 00 00 00 00 D5 DD 5E\r
+R 00 00 01 00 02 08 03 00\r
+T 36 1A 00 00 D9 50 DD 4E F0 DD 46 F1 CD\r
+R 00 00 01 00\r
+T 3F 1A 00 00 00 00 00 00 3E D6 17 00 00 21\r
+R 00 00 01 00 02 04 03 00 29 09 01 00\r
+T 44 1A 00 00 D6 17 00 00 C1 CD 00 00 00 00 F1\r
+R 00 00 01 00 00 04 01 00 02 0A 0B 00\r
+T 4B 1A 00 00 F1 F1 E5 FD E1 DD 36 F4 01\r
+R 00 00 01 00\r
+T 54 1A 00 00\r
+R 00 00 01 00\r
+T 54 1A 00 00 DD 7E D8 FE 4C 20 47\r
+R 00 00 01 00\r
+T 5B 1A 00 00\r
+R 00 00 01 00\r
+T 5B 1A 00 00 21 0C 00 39 01 12 00 09 E5 CD\r
+R 00 00 01 00\r
+T 65 1A 00 00 D8 1C 00 00 D5 DD 4E DB DD 5E F0\r
+R 00 00 01 00 00 04 01 00\r
+T 6E 1A 00 00 DD 56 F1 CD E1 1C 00 00 D5 DD 4E\r
+R 00 00 01 00 00 08 01 00\r
+T 77 1A 00 00 DA DD 5E F2 DD 56 F3 CD\r
+R 00 00 01 00\r
+T 7F 1A 00 00 00 00 00 00 D5 DD 5E D9 50 DD 4E\r
+R 00 00 01 00 02 04 03 00\r
+T 88 1A 00 00 F0 DD 46 F1 CD 00 00 00 00 3E\r
+R 00 00 01 00 02 09 03 00\r
+T 90 1A 00 00 97 18 00 00 21 97 18 00 00 C1 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 96 1A 00 00 00 00 00 00 F1 F1 F1 E5 FD E1 DD\r
+R 00 00 01 00 02 04 0B 00\r
+T 9F 1A 00 00 36 F4 01\r
+R 00 00 01 00\r
+T A2 1A 00 00\r
+R 00 00 01 00\r
+T A2 1A 00 00 DD 7E D8 FE 41 20 51\r
+R 00 00 01 00\r
+T A9 1A 00 00\r
+R 00 00 01 00\r
+T A9 1A 00 00 21 26 00 DD 4E 02 DD 46 03 09 E5\r
+R 00 00 01 00\r
+T B4 1A 00 00 21 2B 00 39 EB E1 73 23 72 DD 6E\r
+R 00 00 01 00\r
+T BF 1A 00 00 DE DD 66 DF DD 75 F8 DD 74 F9 DD\r
+R 00 00 01 00\r
+T CA 1A 00 00 6E E0 DD 66 E1 DD 75 FA DD 74 FB\r
+R 00 00 01 00\r
+T D5 1A 00 00 21 16 00 39 4E 23 46 23 5E 23 56\r
+R 00 00 01 00\r
+T E0 1A 00 00 DD 71 FC DD 70 FD DD 73 FE DD 72\r
+R 00 00 01 00\r
+T EB 1A 00 00 FF DD 5E 02 DD 56 03 3E\r
+R 00 00 01 00\r
+T F3 1A 00 00 E8 1C 00 00 21 E8 1C 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T F8 1A 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T FA 1A 00 00\r
+R 00 00 01 00\r
+T FA 1A 00 00 DD 7E D8 FE 53 20 71\r
+R 00 00 01 00\r
+T 01 1B 00 00\r
+R 00 00 01 00\r
+T 01 1B 00 00 21 0C 00 39 4D 44 DD 5E D4 DD 56\r
+R 00 00 01 00\r
+T 0C 1B 00 00 D5 3E 20 20 00 00 21 20 20 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 12 1B 00 00 CD 00 00 00 00 21 26 00 DD 4E 02\r
+R 00 00 01 00 02 05 0B 00\r
+T 1B 1B 00 00 DD 46 03 09 E5 11 04 00 CD\r
+R 00 00 01 00\r
+T 24 1B 00 00 D0 1C 00 00 EB E1 73 23 72 21\r
+R 00 00 01 00 00 04 01 00\r
+T 2C 1B 00 00 26 00 09 56 DD 72 F5 23 66 DD 74\r
+R 00 00 01 00\r
+T 37 1B 00 00 F6 21 24 00 09 36 04 23 36 00 6A\r
+R 00 00 01 00\r
+T 42 1B 00 00 DD 66 F6 23 23 E5 21 08 00 ED 4B\r
+R 00 00 01 00\r
+T 4D 1B 00 00 00 00 00 00 09 5E 23 56 E1 73 23\r
+R 00 00 01 00 00 04 04 00\r
+T 56 1B 00 00 72 21 06 00 ED 4B 00 00 00 00 09\r
+R 00 00 01 00 00 0A 04 00\r
+T 5F 1B 00 00 46 23 66 68 E5 DD 6E F5 DD 66 F6\r
+R 00 00 01 00\r
+T 6A 1B 00 00 C1 71 23 70 DD 36 F4 00\r
+R 00 00 01 00\r
+T 72 1B 00 00\r
+R 00 00 01 00\r
+T 72 1B 00 00 AF DD B6 F4 CA 72 1C 00 00\r
+R 00 00 01 00 00 09 01 00\r
+T 79 1B 00 00\r
+R 00 00 01 00\r
+T 79 1B 00 00 DD 7E DE DD B6 DF 28 69\r
+R 00 00 01 00\r
+T 81 1B 00 00\r
+R 00 00 01 00\r
+T 81 1B 00 00 FD CB 0A EE FD 36 24 0B FD 36 25\r
+R 00 00 01 00\r
+T 8C 1B 00 00 00 11 0B 00 CD D0 1C 00 00 FD 75\r
+R 00 00 01 00 00 09 01 00\r
+T 95 1B 00 00 26 FD 74 27 FD 6E 26 DD 75 D0 FD\r
+R 00 00 01 00\r
+T A0 1B 00 00 66 27 DD 74 D1 36 E8 1C 00 00 23\r
+R 00 00 01 00 09 0A 01 00\r
+T A8 1B 00 00 36 E8 1C 00 00 23 36 E8 1C 00 00\r
+R 00 00 01 00 89 05 01 00 29 0B 01 00\r
+T AD 1B 00 00 DD 6E D0 DD 66 D1 23 23 23 DD 4E\r
+R 00 00 01 00\r
+T B8 1B 00 00 DE 71 DD 46 DF 23 70 21 05 00 DD\r
+R 00 00 01 00\r
+T C3 1B 00 00 4E D0 DD 46 D1 09 DD 5E E0 73 DD\r
+R 00 00 01 00\r
+T CE 1B 00 00 56 E1 23 72 21 07 00 09 E5 21\r
+R 00 00 01 00\r
+T D8 1B 00 00 18 00 39 5E 23 56 23 4E 23 46 E1\r
+R 00 00 01 00\r
+T E3 1B 00 00 73 23 72 23 71 23 70\r
+R 00 00 01 00\r
+T EA 1B 00 00\r
+R 00 00 01 00\r
+T EA 1B 00 00 DD 7E E6 DD B6 E7 28 0C\r
+R 00 00 01 00\r
+T F2 1B 00 00\r
+R 00 00 01 00\r
+T F2 1B 00 00 DD 6E E6 FD 75 0A DD 66 E7 FD 74\r
+R 00 00 01 00\r
+T FD 1B 00 00 0B\r
+R 00 00 01 00\r
+T FE 1B 00 00\r
+R 00 00 01 00\r
+T FE 1B 00 00 DD 6E E8 FD 75 0E DD 66 E9 FD 74\r
+R 00 00 01 00\r
+T 09 1C 00 00 0F DD 6E EA FD 75 20 DD 7E EB E6\r
+R 00 00 01 00\r
+T 14 1C 00 00 0F FD 77 21 FD 7E 20 FD B6 21 20\r
+R 00 00 01 00\r
+T 1F 1C 00 00 16\r
+R 00 00 01 00\r
+T 20 1C 00 00\r
+R 00 00 01 00\r
+T 20 1C 00 00 11 14 00 CD D0 1C 00 00 FD 75 20\r
+R 00 00 01 00 00 08 01 00\r
+T 29 1C 00 00 FD 74 21 FD 6E 20 FD 66 21 36 00\r
+R 00 00 01 00\r
+T 34 1C 00 00 18 04\r
+R 00 00 01 00\r
+T 36 1C 00 00\r
+R 00 00 01 00\r
+T 36 1C 00 00 FD CB 0B F6\r
+R 00 00 01 00\r
+T 3A 1C 00 00\r
+R 00 00 01 00\r
+T 3A 1C 00 00 DD 7E EB 2E 00 4D E6 F0 47 26 10\r
+R 00 00 01 00\r
+T 45 1C 00 00 ED 42 30 10\r
+R 00 00 01 00\r
+T 49 1C 00 00\r
+R 00 00 01 00\r
+T 49 1C 00 00 DD 6E EA DD 7E EB E6 0F 67 23 FD\r
+R 00 00 01 00\r
+T 54 1C 00 00 75 22 FD 74 23\r
+R 00 00 01 00\r
+T 59 1C 00 00\r
+R 00 00 01 00\r
+T 59 1C 00 00 FD E5 DD 5E 02 4B DD 56 03 42 21\r
+R 00 00 01 00\r
+T 64 1C 00 00 1D 00 09 4E 23 46 23 7E 69 60 C1\r
+R 00 00 01 00\r
+T 6F 1C 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 0B 00\r
+T 72 1C 00 00\r
+R 00 00 01 00\r
+T 72 1C 00 00 21 14 00 E5 2E 0E 39 4D 44 DD 5E\r
+R 00 00 01 00\r
+T 7D 1C 00 00 D4 DD 56 D5 CD C8 1C 00 00 F1 3E\r
+R 00 00 01 00 00 09 01 00\r
+T 86 1C 00 00 14 AD B4 CA 3E 19 00 00\r
+R 00 00 01 00 00 08 01 00\r
+T 8C 1C 00 00\r
+R 00 00 01 00\r
+T 8C 1C 00 00 DD 5E D4 DD 56 D5 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 05 00\r
+T 94 1C 00 00 21 00 00 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 02 05 05 00 02 0A 0B 00\r
+T 9B 1C 00 00 5E 02 DD 56 03 3E 1F 0A 00 00 21\r
+R 00 00 01 00 29 0A 01 00\r
+T A3 1C 00 00 1F 0A 00 00 CD 00 00 00 00 DD 5E\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T AA 1C 00 00 02 4B DD 56 03 42 21 1A 00 09 4E\r
+R 00 00 01 00\r
+T B5 1C 00 00 23 46 23 7E 69 60 C3 1F 11 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T BE 1C 00 00\r
+R 00 00 01 00\r
+T BE 1C 00 00 4D 44 2A 00 00 00 00 23 23 5E 23\r
+R 00 00 01 00 00 07 04 00\r
+T C7 1C 00 00 56\r
+R 00 00 01 00\r
+T C8 1C 00 00\r
+R 00 00 01 00\r
+T C8 1C 00 00 3E 00 00 00 00 21 00 00 00 00 C3\r
+R 00 00 01 00 2B 05 15 00 02 0A 15 00\r
+T CE 1C 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T D0 1C 00 00\r
+R 00 00 01 00\r
+T D0 1C 00 00 3E 00 00 00 00 21 00 00 00 00 C3\r
+R 00 00 01 00 2B 05 14 00 02 0A 14 00\r
+T D6 1C 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T D8 1C 00 00\r
+R 00 00 01 00\r
+T D8 1C 00 00 DD 4E DC DD 5E F2 DD 56 F3\r
+R 00 00 01 00\r
+T E1 1C 00 00\r
+R 00 00 01 00\r
+T E1 1C 00 00 CD 00 00 00 00 1B 1B 1B C9\r
+R 00 00 01 00 02 05 03 00\r
+T E8 1C 00 00\r
+R 00 00 01 00\r
+T E8 1C 00 00 CD 00 00 00 00 EA FF FD E5 DD 6E\r
+R 00 00 01 00 02 05 0E 00\r
+T F1 1C 00 00 02 DD 66 03 E5 FD E1 21 06 00 39\r
+R 00 00 01 00\r
+T FC 1C 00 00 EB 21 26 00 00 00 01 0E 00 ED B0\r
+R 00 00 01 00 00 06 03 00\r
+T 05 1D 00 00 FD 6E 26 DD 75 EA FD 66 27 DD 74\r
+R 00 00 01 00\r
+T 10 1D 00 00 EB 23 23 23 3E 01 AE 23 B6 20 08\r
+R 00 00 01 00\r
+T 1B 1D 00 00\r
+R 00 00 01 00\r
+T 1B 1D 00 00 C5 01 01 04 CD 76 0D 00 00 E1\r
+R 00 00 01 00 00 09 01 00\r
+T 23 1D 00 00\r
+R 00 00 01 00\r
+T 23 1D 00 00 DD 6E EA DD 66 EB 23 23 23 46 23\r
+R 00 00 01 00\r
+T 2E 1D 00 00 66 68 CB 85 3E 02 AD B4 C2\r
+R 00 00 01 00\r
+T 37 1D 00 00 53 1E 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 39 1D 00 00\r
+R 00 00 01 00\r
+T 39 1D 00 00 6F 67 E5 E5 01 01 00 FD 5E 11 FD\r
+R 00 00 01 00\r
+T 44 1D 00 00 56 12 3E B6 09 00 00 21\r
+R 00 00 01 00 29 07 01 00\r
+T 49 1D 00 00 B6 09 00 00 CD 00 00 00 00 E1 E1\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 50 1D 00 00 FD 6E 11 FD 66 12 01 08 00 09 4E\r
+R 00 00 01 00\r
+T 5B 1D 00 00 23 46 C5 FD 6E 11 FD 66 12 01\r
+R 00 00 01 00\r
+T 65 1D 00 00 06 00 09 4E 23 46 C5 01 00 00 59\r
+R 00 00 01 00\r
+T 70 1D 00 00 50 3E 71 0F 00 00 21 71 0F 00 00\r
+R 00 00 01 00 29 06 01 00 00 0B 01 00\r
+T 76 1D 00 00 CD 00 00 00 00 F1 F1 DD 75 EC DD\r
+R 00 00 01 00 02 05 0B 00\r
+T 7F 1D 00 00 74 ED 01 0A 00 09 36 03 23 70 DD\r
+R 00 00 01 00\r
+T 8A 1D 00 00 6E EA DD 66 EB 23 23 23 CB 46 28\r
+R 00 00 01 00\r
+T 95 1D 00 00 0C\r
+R 00 00 01 00\r
+T 96 1D 00 00\r
+R 00 00 01 00\r
+T 96 1D 00 00 69 60 DD 4E EC DD 46 ED 09 23 CB\r
+R 00 00 01 00\r
+T A1 1D 00 00 EE\r
+R 00 00 01 00\r
+T A2 1D 00 00\r
+R 00 00 01 00\r
+T A2 1D 00 00 21 17 00 DD 4E EC DD 46 ED 09 36\r
+R 00 00 01 00\r
+T AD 1D 00 00 F0 18 00 00 23 36 F0 18 00 00 23\r
+R 00 00 01 00 09 04 01 00 89 0A 01 00\r
+T B2 1D 00 00 36 F0 18 00 00 21 1A 00 09 36\r
+R 00 00 01 00 29 05 01 00\r
+T B9 1D 00 00 2C 0F 00 00 23 36 2C 0F 00 00 23\r
+R 00 00 01 00 09 04 01 00 89 0A 01 00\r
+T BE 1D 00 00 36 2C 0F 00 00 21 07 00 DD 5E EA\r
+R 00 00 01 00 29 05 01 00\r
+T C6 1D 00 00 DD 56 EB 19 5E EB DD 75 F3 21\r
+R 00 00 01 00\r
+T D0 1D 00 00 07 00 DD 4E EA DD 46 EB 09 5E 23\r
+R 00 00 01 00\r
+T DB 1D 00 00 56 23 4E 23 46 EB 3E 08 CD\r
+R 00 00 01 00\r
+T E4 1D 00 00 00 00 00 00 DD 75 F4 21 07 00 DD\r
+R 00 00 01 00 02 04 13 00\r
+T ED 1D 00 00 4E EA DD 46 EB 09 5E 23 56 23 4E\r
+R 00 00 01 00\r
+T F8 1D 00 00 23 46 EB 3E 10 CD 00 00 00 00 DD\r
+R 00 00 01 00 02 0A 13 00\r
+T 01 1E 00 00 75 F5 21 07 00 DD 4E EA DD 46 EB\r
+R 00 00 01 00\r
+T 0C 1E 00 00 09 5E 23 56 23 4E 23 46 EB 3E 18\r
+R 00 00 01 00\r
+T 17 1E 00 00 CD 00 00 00 00 DD 75 F6 21 06 00\r
+R 00 00 01 00 02 05 13 00\r
+T 20 1E 00 00 39 4D 44 DD 5E EC DD 56 ED 3E\r
+R 00 00 01 00\r
+T 2A 1E 00 00 0E 19 00 00 21 0E 19 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 2F 1E 00 00 00 00 00 00 DD 4E EC DD 46 ED C5\r
+R 00 00 01 00 02 04 0B 00\r
+T 38 1E 00 00 FD 5E 11 FD 56 12 FD 6E 11 FD 66\r
+R 00 00 01 00\r
+T 43 1E 00 00 12 01 1D 00 09 4E 23 46 23 7E 69\r
+R 00 00 01 00\r
+T 4E 1E 00 00 60 C1 CD 00 00 00 00\r
+R 00 00 01 00 02 07 0B 00\r
+T 53 1E 00 00\r
+R 00 00 01 00\r
+T 53 1E 00 00 DD 6E EA DD 66 EB 23 23 23 3E 04\r
+R 00 00 01 00\r
+T 5E 1E 00 00 AE 23 B6 C2 F1 1F 00 00\r
+R 00 00 01 00 00 08 01 00\r
+T 64 1E 00 00\r
+R 00 00 01 00\r
+T 64 1E 00 00 21 01 00 E5 FD 6E 11 FD 66 12 01\r
+R 00 00 01 00\r
+T 6F 1E 00 00 08 00 09 46 23 66 68 01 F6 FF 09\r
+R 00 00 01 00\r
+T 7A 1E 00 00 E5 FD 6E 11 FD 66 12 01 06 00 09\r
+R 00 00 01 00\r
+T 85 1E 00 00 46 23 66 68 01 F6 FF 09 E5 01\r
+R 00 00 01 00\r
+T 8F 1E 00 00 05 00 59 50 3E 1A 15 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 96 1E 00 00 1A 15 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 9D 1E 00 00 F1 DD 75 EC DD 74 ED 01 0A 00 09\r
+R 00 00 01 00\r
+T A8 1E 00 00 36 03 23 36 10 21 0E 00 DD 4E EC\r
+R 00 00 01 00\r
+T B3 1E 00 00 DD 46 ED 09 36 30 23 36 00 AF DD\r
+R 00 00 01 00\r
+T BE 1E 00 00 77 FE DD 77 FF\r
+R 00 00 01 00\r
+T C3 1E 00 00\r
+R 00 00 01 00\r
+T C3 1E 00 00 21 05 00 DD 4E EA DD 46 EB 09 5E\r
+R 00 00 01 00\r
+T CE 1E 00 00 23 56 06 0C CD 00 00 00 00 4B 42\r
+R 00 00 01 00 02 09 16 00\r
+T D7 1E 00 00 DD 6E FE DD 66 FF CD 00 00 00 00\r
+R 00 00 01 00 02 0B 0F 00\r
+T E0 1E 00 00 30 04 3E 01 18 01\r
+R 00 00 01 00\r
+T E6 1E 00 00\r
+R 00 00 01 00\r
+T E6 1E 00 00 AF\r
+R 00 00 01 00\r
+T E7 1E 00 00\r
+R 00 00 01 00\r
+T E7 1E 00 00 E6 0F CA 85 1F 00 00\r
+R 00 00 01 00 00 07 01 00\r
+T EC 1E 00 00\r
+R 00 00 01 00\r
+T EC 1E 00 00 21 05 00 DD 4E EA DD 46 EB 09 46\r
+R 00 00 01 00\r
+T F7 1E 00 00 23 7E 68 E6 0F 67 DD 4E FE DD 46\r
+R 00 00 01 00\r
+T 02 1F 00 00 FF 09 29 E5 21 08 00 ED 5B\r
+R 00 00 01 00\r
+T 0B 1F 00 00 00 00 00 00 19 5E 23 56 E1 19 2B\r
+R 00 00 01 00 00 04 04 00\r
+T 14 1F 00 00 2B 5E 23 56 D5 21 10 00 E5 2E 06\r
+R 00 00 01 00\r
+T 1F 1F 00 00 DD 5E EC DD 56 ED 19 6E 26 00 01\r
+R 00 00 01 00\r
+T 2A 1F 00 00 F0 FF 09 E5 DD 6E FE DD 66 FF 29\r
+R 00 00 01 00\r
+T 35 1F 00 00 29 4D 44 29 09 01 14 00 09 4D 44\r
+R 00 00 01 00\r
+T 40 1F 00 00 11 08 00 3E 97 18 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T 46 1F 00 00 97 18 00 00 CD 00 00 00 00 F1 F1\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 4D 1F 00 00 F1 DD 75 FC DD 74 FD 01 0E 00 09\r
+R 00 00 01 00\r
+T 58 1F 00 00 36 30 23 70 DD 4E FC DD 46 FD C5\r
+R 00 00 01 00\r
+T 63 1F 00 00 DD 5E EC 4B DD 56 ED 42 21 1D 00\r
+R 00 00 01 00\r
+T 6E 1F 00 00 09 4E 23 46 23 7E 69 60 C1 CD\r
+R 00 00 01 00\r
+T 78 1F 00 00 00 00 00 00 DD 34 FE 20 03 DD 34\r
+R 00 00 01 00 02 04 0B 00\r
+T 81 1F 00 00 FF\r
+R 00 00 01 00\r
+T 82 1F 00 00\r
+R 00 00 01 00\r
+T 82 1F 00 00 C3 C3 1E 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 85 1F 00 00\r
+R 00 00 01 00\r
+T 85 1F 00 00 01 15 00 00 00 DD 5E EC DD 56 ED\r
+R 00 00 01 00 00 05 02 00\r
+T 8E 1F 00 00 3E 59 06 00 00 21 59 06 00 00 CD\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 94 1F 00 00 00 00 00 00 01 FF 00 CD\r
+R 00 00 01 00 02 04 0B 00\r
+T 9A 1F 00 00 12 20 00 00 01 0E 00 09 36 30 23\r
+R 00 00 01 00 00 04 01 00\r
+T A3 1F 00 00 70 0E FE CD 12 20 00 00 EB CD\r
+R 00 00 01 00 00 08 01 00\r
+T AB 1F 00 00 8F 09 00 00 DD 4E EC DD 46 ED C5\r
+R 00 00 01 00 00 04 01 00\r
+T B4 1F 00 00 FD 5E 11 FD 56 12 FD 6E 11 FD 66\r
+R 00 00 01 00\r
+T BF 1F 00 00 12 01 1D 00 09 4E 23 46 23 7E 69\r
+R 00 00 01 00\r
+T CA 1F 00 00 60 C1 CD 00 00 00 00 21 00 00 E5\r
+R 00 00 01 00 02 07 0B 00\r
+T D3 1F 00 00 FD 5E 11 FD 56 12 FD 6E 11 FD 66\r
+R 00 00 01 00\r
+T DE 1F 00 00 12 01 17 00 09 4E 23 46 23 7E 69\r
+R 00 00 01 00\r
+T E9 1F 00 00 60 01 03 01 CD 00 00 00 00 E1\r
+R 00 00 01 00 02 09 0B 00\r
+T F1 1F 00 00\r
+R 00 00 01 00\r
+T F1 1F 00 00 21 10 00 ED 4B 00 00 00 00 09 7E\r
+R 00 00 01 00 00 09 04 00\r
+T FA 1F 00 00 23 B6 23 B6 28 0D\r
+R 00 00 01 00\r
+T 00 20 00 00\r
+R 00 00 01 00\r
+T 00 20 00 00 FD E5 D1 21 10 00 ED 4B\r
+R 00 00 01 00\r
+T 08 20 00 00 00 00 00 00 CD 94 0D 00 00\r
+R 00 00 01 00 00 04 04 00 00 09 01 00\r
+T 0D 20 00 00\r
+R 00 00 01 00\r
+T 0D 20 00 00 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 07 04 00\r
+T 12 20 00 00\r
+R 00 00 01 00\r
+T 12 20 00 00 DD 5E EC DD 56 ED 3E 8E 07 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 1A 20 00 00 21 8E 07 00 00 C3 00 00 00 00\r
+R 00 00 01 00 00 05 01 00 02 0A 0B 00\r
+T 20 20 00 00\r
+R 00 00 01 00\r
+T 20 20 00 00 CD 00 00 00 00 F8 FF FD E5 03 0A\r
+R 00 00 01 00 02 05 0E 00\r
+T 29 20 00 00 DD 77 FE 03 0A DD 77 FF 03 69 60\r
+R 00 00 01 00\r
+T 34 20 00 00 4E DD 71 FC 23 46 DD 70 FD DD 6E\r
+R 00 00 01 00\r
+T 3F 20 00 00 FE 67 29 EB CD D0 1C 00 00 DD 75\r
+R 00 00 01 00 00 09 01 00\r
+T 48 20 00 00 FA DD 74 FB 59 50 CD CE 04 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 51 20 00 00 C5 4D 44 DD 5E 02 DD 56 03 CD\r
+R 00 00 01 00\r
+T 5B 20 00 00 C8 1C 00 00 F1 11 00 00 AF DD 77\r
+R 00 00 01 00 00 04 01 00\r
+T 64 20 00 00 F8 DD 77 F9\r
+R 00 00 01 00\r
+T 68 20 00 00\r
+R 00 00 01 00\r
+T 68 20 00 00 DD 4E FC DD 46 FD 6B 62 CD\r
+R 00 00 01 00\r
+T 71 20 00 00 00 00 00 00 30 35 CD E6 20 00 00\r
+R 00 00 01 00 02 04 0F 00 00 0B 01 00\r
+T 78 20 00 00 30 30\r
+R 00 00 01 00\r
+T 7A 20 00 00\r
+R 00 00 01 00\r
+T 7A 20 00 00\r
+R 00 00 01 00\r
+T 7A 20 00 00\r
+R 00 00 01 00\r
+T 7A 20 00 00 23 DD 75 F8 DD 74 F9 2B 29 DD 4E\r
+R 00 00 01 00\r
+T 85 20 00 00 FA DD 46 FB 09 E5 FD E5 E1 19 4D\r
+R 00 00 01 00\r
+T 90 20 00 00 44 E1 71 23 70\r
+R 00 00 01 00\r
+T 95 20 00 00\r
+R 00 00 01 00\r
+T 95 20 00 00 FD E5 E1 19 7E B7 28 03\r
+R 00 00 01 00\r
+T 9D 20 00 00\r
+R 00 00 01 00\r
+T 9D 20 00 00 13 18 F5\r
+R 00 00 01 00\r
+T A0 20 00 00\r
+R 00 00 01 00\r
+T A0 20 00 00 6B 62 13 FD E5 C1 09 77 18 BE\r
+R 00 00 01 00\r
+T AA 20 00 00\r
+R 00 00 01 00\r
+T AA 20 00 00 CD E6 20 00 00 30 13\r
+R 00 00 01 00 00 05 01 00\r
+T AF 20 00 00\r
+R 00 00 01 00\r
+T AF 20 00 00 29 DD 4E FA DD 46 FB 09 E5 FD E5\r
+R 00 00 01 00\r
+T BA 20 00 00 E1 19 4D 44 E1 71 23 70\r
+R 00 00 01 00\r
+T C2 20 00 00\r
+R 00 00 01 00\r
+T C2 20 00 00 21 06 00 ED 4B 00 00 00 00 09 FD\r
+R 00 00 01 00 00 09 04 00\r
+T CB 20 00 00 E5 C1 71 23 70 21 08 00 ED 4B\r
+R 00 00 01 00\r
+T D5 20 00 00 00 00 00 00 09 DD 4E FA 71 DD 46\r
+R 00 00 01 00 00 04 04 00\r
+T DE 20 00 00 FB 23 70 FD E1 C3 00 00 00 00\r
+R 00 00 01 00 02 0A 04 00\r
+T E6 20 00 00\r
+R 00 00 01 00\r
+T E6 20 00 00 DD 4E FE DD 46 FF DD 6E F8 DD 66\r
+R 00 00 01 00\r
+T F1 20 00 00 F9 C3 00 00 00 00\r
+R 00 00 01 00 02 06 0F 00\r
+T F5 20 00 00\r
+R 00 00 01 00\r
+T F5 20 00 00 2A 00 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 00 05 04 00 02 0A 00 00\r
+T FB 20 00 00\r
+R 00 00 01 00\r
+T FB 20 00 00 C5 D5 11 13 00 CD D0 1C 00 00 22\r
+R 00 00 01 00 00 0A 01 00\r
+T 04 21 00 00 00 00 00 00 AF 77 23 77 21 04 00\r
+R 00 00 01 00 00 04 04 00\r
+T 0D 21 00 00 ED 4B 00 00 00 00 09 77 23 77 21\r
+R 00 00 01 00 00 06 04 00\r
+T 16 21 00 00 0A 00 ED 4B 00 00 00 00 09 77 23\r
+R 00 00 01 00 00 08 04 00\r
+T 1F 21 00 00 77 21 0C 00 ED 4B 00 00 00 00 09\r
+R 00 00 01 00 00 0A 04 00\r
+T 28 21 00 00 77 23 77 21 08 00 ED 4B\r
+R 00 00 01 00\r
+T 30 21 00 00 00 00 00 00 09 77 23 77 21 06 00\r
+R 00 00 01 00 00 04 04 00\r
+T 39 21 00 00 ED 4B 00 00 00 00 09 77 23 77 21\r
+R 00 00 01 00 00 06 04 00\r
+T 42 21 00 00 10 00 ED 4B 00 00 00 00 09 77 23\r
+R 00 00 01 00 00 08 04 00\r
+T 4B 21 00 00 77 23 77 3E 00 00 00 00 21\r
+R 00 00 01 00 29 08 01 00\r
+T 51 21 00 00 00 00 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 57 21 00 00 00 00 E5 E5 0E 70 05 00 00 C5 21\r
+R 00 00 01 00 29 09 01 00\r
+T 5F 21 00 00 70 05 00 00 E5 0E 8C 05 00 00 C5\r
+R 00 00 01 00 00 04 01 00 29 0A 01 00\r
+T 65 21 00 00 21 8C 05 00 00 E5 11 30 00 CD\r
+R 00 00 01 00 00 05 01 00\r
+T 6D 21 00 00 1A 22 00 00 21 0C 00 39 F9 21\r
+R 00 00 01 00 00 04 01 00\r
+T 75 21 00 00 00 00 E5 E5 0E 70 05 00 00 C5 21\r
+R 00 00 01 00 29 09 01 00\r
+T 7D 21 00 00 70 05 00 00 E5 0E 9D 05 00 00 C5\r
+R 00 00 01 00 00 04 01 00 29 0A 01 00\r
+T 83 21 00 00 21 9D 05 00 00 E5 11 31 00 CD\r
+R 00 00 01 00 00 05 01 00\r
+T 8B 21 00 00 1A 22 00 00 21 0C 00 39 F9 21\r
+R 00 00 01 00 00 04 01 00\r
+T 93 21 00 00 00 00 E5 E5 0E 83 05 00 00 C5 21\r
+R 00 00 01 00 29 09 01 00\r
+T 9B 21 00 00 83 05 00 00 E5 0E A6 05 00 00 C5\r
+R 00 00 01 00 00 04 01 00 29 0A 01 00\r
+T A1 21 00 00 21 A6 05 00 00 E5 11 32 00 CD\r
+R 00 00 01 00 00 05 01 00\r
+T A9 21 00 00 1A 22 00 00 21 0C 00 39 F9 21\r
+R 00 00 01 00 00 04 01 00\r
+T B1 21 00 00 0E 00 ED 4B 00 00 00 00 09 E5 11\r
+R 00 00 01 00 00 08 04 00\r
+T BA 21 00 00 80 00 D5 5A D5 4B 42 3E\r
+R 00 00 01 00\r
+T C2 21 00 00 71 0F 00 00 21 71 0F 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T C7 21 00 00 00 00 00 00 F1 F1 4D 44 E1 71 23\r
+R 00 00 01 00 02 04 0B 00\r
+T D0 21 00 00 70 21 0E 00 ED 4B 00 00 00 00 09\r
+R 00 00 01 00 00 0A 04 00\r
+T D9 21 00 00 56 23 66 6A 11 0A 00 19 36 01 23\r
+R 00 00 01 00\r
+T E4 21 00 00 72 21 0E 00 ED 4B 00 00 00 00 09\r
+R 00 00 01 00 00 0A 04 00\r
+T ED 21 00 00 56 23 66 6A 11 17 00 19 36\r
+R 00 00 01 00\r
+T F6 21 00 00 F0 18 00 00 23 36 F0 18 00 00 23\r
+R 00 00 01 00 09 04 01 00 89 0A 01 00\r
+T FB 21 00 00 36 F0 18 00 00 21 0E 00 ED 4B\r
+R 00 00 01 00 29 05 01 00\r
+T 02 22 00 00 00 00 00 00 09 46 23 66 68 01\r
+R 00 00 01 00 00 04 04 00\r
+T 0A 22 00 00 1A 00 09 36 2C 0F 00 00 23 36\r
+R 00 00 01 00 09 08 01 00\r
+T 11 22 00 00 2C 0F 00 00 23 36 2C 0F 00 00 D1\r
+R 00 00 01 00 89 04 01 00 29 0A 01 00\r
+T 16 22 00 00 C1 C3 00 00 00 00\r
+R 00 00 01 00 02 06 00 00\r
+T 1A 22 00 00\r
+R 00 00 01 00\r
+T 1A 22 00 00 3E 33 04 00 00 21 33 04 00 00 C3\r
+R 00 00 01 00 29 05 01 00 00 0A 01 00\r
+T 20 22 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 0B 00\r
+T 22 22 00 00\r
+R 00 00 01 00\r
+T 22 22 00 00 C5 D5 21 0E 00 ED 4B 00 00 00 00\r
+R 00 00 01 00 00 0B 04 00\r
+T 2B 22 00 00 09 5E 23 56 CD 8F 09 00 00 3E\r
+R 00 00 01 00 00 09 01 00\r
+T 33 22 00 00 BD 02 00 00 21 BD 02 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 38 22 00 00 00 00 00 00 3E 8E 00 00 00 21\r
+R 00 00 01 00 02 04 0B 00 29 09 01 00\r
+T 3D 22 00 00 8E 00 00 00 CD 00 00 00 00 D1 C1\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 44 22 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 00 00\r
+T 47 22 00 00\r
+R 00 00 01 00\r
+T 47 22 00 00 CD 00 00 00 00 FE FF DD 4E 02 DD\r
+R 00 00 01 00 02 05 0E 00\r
+T 50 22 00 00 46 03 21 0E 00 ED 5B 00 00 00 00\r
+R 00 00 01 00 00 0B 04 00\r
+T 59 22 00 00 19 5E 23 56 3E 0E 19 00 00 21\r
+R 00 00 01 00 29 09 01 00\r
+T 60 22 00 00 0E 19 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 0B 00\r
+T 65 22 00 00\r
+R 00 00 01 00\r
+T 65 22 00 00 21 01 00 E5 23 39 CD BE 1C 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 6E 22 00 00 F1 3E 01 AD B4 28 F0\r
+R 00 00 01 00\r
+T 75 22 00 00\r
+R 00 00 01 00\r
+T 75 22 00 00\r
+R 00 00 01 00\r
+T 75 22 00 00\r
+R 00 00 01 00\r
+T 75 22 00 00 21 04 00 ED 4B 00 00 00 00 09 7E\r
+R 00 00 01 00 00 09 04 00\r
+T 7E 22 00 00 23 B6 20 77\r
+R 00 00 01 00\r
+T 82 22 00 00\r
+R 00 00 01 00\r
+T 82 22 00 00 21 01 00 E5 23 39 CD BE 1C 00 00\r
+R 00 00 01 00 00 0B 01 00\r
+T 8B 22 00 00 F1 3E 01 AD B4 20 E3\r
+R 00 00 01 00\r
+T 92 22 00 00\r
+R 00 00 01 00\r
+T 92 22 00 00 DD B6 FE 28 2B\r
+R 00 00 01 00\r
+T 97 22 00 00\r
+R 00 00 01 00\r
+T 97 22 00 00 4F 06 00 C5 21 0E 00 ED 5B\r
+R 00 00 01 00\r
+T A0 22 00 00 00 00 00 00 19 5E 23 56 21 0E 00\r
+R 00 00 01 00 00 04 04 00\r
+T A9 22 00 00 ED 4B 00 00 00 00 09 46 23 66 68\r
+R 00 00 01 00 00 06 04 00\r
+T B2 22 00 00 01 17 00 09 4E 23 46 23 7E 69 60\r
+R 00 00 01 00\r
+T BD 22 00 00 01 01 00 18 2A\r
+R 00 00 01 00\r
+T C2 22 00 00\r
+R 00 00 01 00\r
+T C2 22 00 00 DD 4E FF 47 C5 21 0E 00 ED 5B\r
+R 00 00 01 00\r
+T CC 22 00 00 00 00 00 00 19 5E 23 56 21 0E 00\r
+R 00 00 01 00 00 04 04 00\r
+T D5 22 00 00 ED 4B 00 00 00 00 09 46 23 66 68\r
+R 00 00 01 00 00 06 04 00\r
+T DE 22 00 00 01 17 00 09 4E 23 46 23 7E 69 60\r
+R 00 00 01 00\r
+T E9 22 00 00 01 02 00\r
+R 00 00 01 00\r
+T EC 22 00 00\r
+R 00 00 01 00\r
+T EC 22 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 02 05 0B 00\r
+T F0 22 00 00\r
+R 00 00 01 00\r
+T F0 22 00 00 DD 46 FE DD 70 FF\r
+R 00 00 01 00\r
+T F6 22 00 00\r
+R 00 00 01 00\r
+T F6 22 00 00 C3 75 22 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T F9 22 00 00\r
+R 00 00 01 00\r
+T F9 22 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 04 00\r
+T 00 00 00 00\r
+R 00 00 02 00\r
+T 00 00 00 00 2F 64 65 76 2F 6C 63 64 30 00\r
+R 00 00 02 00\r
+T 0A 00 00 00\r
+R 00 00 02 00\r
+T 0A 00 00 00 4F 4B 00\r
+R 00 00 02 00\r
+T 0D 00 00 00\r
+R 00 00 02 00\r
+T 0D 00 00 00 43 61 6E 63 65 6C 00\r
+R 00 00 02 00\r
+T 14 00 00 00\r
+R 00 00 02 00\r
+T 14 00 00 00 00\r
+R 00 00 02 00\r
+T 15 00 00 00\r
+R 00 00 02 00\r
+T 15 00 00 00 4D 65 73 73 61 67 65 20 42 6F 78\r
+R 00 00 02 00\r
+T 20 00 00 00 00\r
+R 00 00 02 00\r
+T 00 00 00 00\r
+R 00 00 03 00\r
+T 00 00 00 00 1B 4B\r
+R 00 00 03 00\r
+T 02 00 00 00\r
+R 00 00 03 00\r
+T 02 00 00 00 1B 53 00 00\r
+R 00 00 03 00\r
+T 06 00 00 00\r
+R 00 00 03 00\r
+T 06 00 00 00 1B 43 00 00\r
+R 00 00 03 00\r
+T 0A 00 00 00\r
+R 00 00 03 00\r
+T 0A 00 00 00 1B 4E 00 00\r
+R 00 00 03 00\r
+T 0E 00 00 00\r
+R 00 00 03 00\r
+T 0E 00 00 00 1B 52 00 00\r
+R 00 00 03 00\r
+T 12 00 00 00\r
+R 00 00 03 00\r
+T 12 00 00 00 1B 46 00 00\r
+R 00 00 03 00\r
+T 16 00 00 00\r
+R 00 00 03 00\r
+T 16 00 00 00 1B 68 00 00\r
+R 00 00 03 00\r
+T 1A 00 00 00\r
+R 00 00 03 00\r
+T 1A 00 00 00 1B 5A 00 00 00 00 00\r
+R 00 00 03 00\r
+T 21 00 00 00\r
+R 00 00 03 00\r
+T 21 00 00 00 1B 45 00\r
+R 00 00 03 00\r
+T 24 00 00 00\r
+R 00 00 03 00\r
+T 24 00 00 00 1B 00\r
+R 00 00 03 00\r
+T 26 00 00 00\r
+R 00 00 03 00\r
+T 26 00 00 00 2F 77 6E 64 2F 30 30 30 30 2E 73\r
+R 00 00 03 00\r
+T 31 00 00 00 63 72 00\r
+R 00 00 03 00\r
+T 00 00 00 00\r
+R 00 00 04 00\r
+T 00 00 00 00\r
+R 00 00 04 00\r
diff --git a/src/gui/wnd.xcl b/src/gui/wnd.xcl
new file mode 100644 (file)
index 0000000..86b193b
--- /dev/null
@@ -0,0 +1,13 @@
+-cz80\r
+-Z(CODE)RCODE,CODE,ZVECT,CONST,CSTR,CDATA0,CCSTR=8100\r
+-Z(DATA)DATA0,IDATA0,UDATA0,ECSTR,WCSTR,TEMP,CSTACK+200\r
+..\libc\cstartup\r
+wnd\r
+login\r
+..\libc\libc\r
+..\libc\syscalls\syscalls\r
+cl64180\r
+-x\r
+-l wnd.map\r
+-FINTEL-EXTENDED -Y1\r
+-o wnd.ihx\r
diff --git a/src/gui/wnd.xls b/src/gui/wnd.xls
new file mode 100644 (file)
index 0000000..c3438ce
Binary files /dev/null and b/src/gui/wnd.xls differ
diff --git a/src/gui/wnd.zip b/src/gui/wnd.zip
new file mode 100644 (file)
index 0000000..205d545
Binary files /dev/null and b/src/gui/wnd.zip differ
index 90016bb..46726c7 100644 (file)
@@ -21,6 +21,7 @@
 #include <time.h>\r
 #include <sgtty.h> /* Nick */\r
 #include <unix.h>\r
+#include <ctype.h> /* Nick */\r
 #include <sys/wait.h>\r
 \r
 static firsttime = 1;\r
@@ -40,45 +41,126 @@ struct exec_struct tty_list[NUM_TTYS] =
 };\r
 \r
 void process_inittab(void)\r
-{\r
+       {\r
        FILE *fdm;\r
-       char cmd[128], *p; /* [64], *p; */\r
-       static char *_argv[3]; /* [2] = { 0, 0 }; */\r
+       char cmd[128], *p;\r
+       char silent;\r
+       int i, argc;\r
+       char *argv[18];\r
        int pid;\r
 \r
-        if ((fdm = fopen("/etc/inittab", "r")) != NULL) {\r
-               while (!feof(fdm)) {\r
-                       if (fgets(cmd, sizeof(cmd)-1, fdm)==NULL) break;\r
-                       if (cmd[0] != '#') {\r
-                               if (NULL != (p = strchr(cmd, '\n'))) *p=0;\r
-                               if (cmd[0] > ' ') {\r
-                                       printf("init: executing %s\n", cmd);\r
-                                       pid = fork();\r
-                                       if (pid==-1) {\r
-                                               printf("init: can't execute %s\n", cmd);\r
-                                               continue;\r
-                                       }\r
-                                       if (pid==0) {\r
-                                               _argv[0] = cmd;\r
-                                               _argv[1] = NULL;\r
-                                               execve(_argv[0], _argv, environ);\r
-                                               if (errno == ESHELL)\r
-                                                       {\r
-                                                       _argv[0] = _PATH_BSHELL;\r
-                                                       _argv[1] = cmd;\r
-                                                       _argv[2] = NULL;\r
-                                                       execve(_argv[0], _argv, environ);\r
-                                                       }\r
-                                               printf("init: can't execute %s\n", cmd);\r
-                                               exit(1);\r
-                                       }\r
-                                       wait(&pid);\r
+       printf("Processing /etc/inittab\n");\r
+       fflush(stdout);\r
+\r
+       fdm = fopen("/etc/inittab", "r");\r
+        if (fdm == NULL)\r
+               {\r
+               perror("can't open /etc/inittab");\r
+               return;\r
+               }\r
+\r
+       while (feof(fdm) == 0)\r
+               {\r
+               if (fgets(cmd, sizeof(cmd)-1, fdm) == NULL)\r
+                       {\r
+                       break;\r
+                       }\r
+/* printf("@@@ %s", cmd); */\r
+               /* check for comment lines */\r
+               p = cmd;\r
+               while (isspace(*p))\r
+                       {\r
+                       p++;\r
+                       }\r
+\r
+               if (*p == '#')\r
+                       {\r
+                       continue;\r
+                       }\r
+\r
+               /* check for silent lines */\r
+               silent = 0;\r
+               if (*p == '@')\r
+                       {\r
+                       silent = 1;\r
+                       p++;\r
+                       }\r
+\r
+               /* convert line into arguments */\r
+               argc = 0;\r
+               while (argc < 16)\r
+                       {\r
+                       while (isspace(*p))\r
+                               {\r
+                               p++;\r
+                               }\r
+                       if (*p == 0)\r
+                               {\r
+                               break;\r
+                               }\r
+                       argv[1 + argc++] = p;\r
+                       while (*p && isspace(*p) == 0)\r
+                               {\r
+                               p++;\r
                                }\r
+                       if (*p == 0)\r
+                               {\r
+                               break;\r
+                               }\r
+                       *p = 0;\r
+                       }\r
+\r
+               /* got a command to execute? */\r
+               if (argc < 1)\r
+                       {\r
+                       continue;\r
+                       }\r
+\r
+               /* pacify the user, unless silent */\r
+               if (silent == 0)\r
+                       {\r
+                       printf("%s", argv[1]);\r
+                       for (i = 1; i < argc; i++)\r
+                               {\r
+                               printf(" %s", argv[1 + i]);\r
+                               }\r
+                       printf("\n");\r
+                       fflush(stdout);\r
                        }\r
+\r
+               /* fork and execute the program */\r
+               pid = fork();\r
+               if (pid == -1)\r
+                       {\r
+                       if (silent == 0)\r
+                               {\r
+                               perror("can't fork");\r
+                               }\r
+                       continue;\r
+                       }\r
+\r
+               if (pid == 0)\r
+                       {\r
+                       argv[1 + argc] = NULL;\r
+                       execve(argv[1], argv + 1, environ);\r
+                       if (errno == ESHELL)\r
+                               {\r
+                               argv[0] = _PATH_BSHELL;\r
+                               execve(argv[0], argv, environ);\r
+                               }\r
+                       if (silent == 0)\r
+                               {\r
+                               perror("can't execute");\r
+                               }\r
+                       _exit(1); /* don't close handles in this case!!!!! */\r
+                       }\r
+\r
+               /* wait for child to complete */\r
+               wait(&pid);\r
                }\r
-               fclose(fdm);\r
+\r
+       fclose(fdm);\r
        }\r
-}\r
 \r
 int determine_tty(int pid)\r
 {\r
@@ -92,7 +174,7 @@ int determine_tty(int pid)
 }\r
 \r
 void generate_mtab(void)\r
-{\r
+       {\r
 #if 1 /* Nick, new getfsys() convention */\r
        filesys_t fsys;\r
 #else\r
@@ -105,11 +187,11 @@ void generate_mtab(void)
 #else\r
        char mtabline[] = "/dev/fdX\t/\trw\n";\r
 #endif\r
-       char *s = "failed";\r
        FILE *fdm;\r
 \r
 #if 1 /* Nick */\r
-       printf("init: creating /etc/mtab: ");\r
+       printf("Generating /etc/mtab\n");\r
+       fflush(stdout);\r
 #else\r
        printf("Updating /etc/mtab: ");\r
 #endif\r
@@ -127,66 +209,94 @@ void generate_mtab(void)
                        {\r
                        j = MINOR(fsys->s_dev);\r
 #endif\r
-                       unlink("/etc/mtab");\r
+                       if (unlink("/etc/mtab") < 0)\r
+                               {\r
+                               perror("can't unlink /etc/mtab");\r
+                               break;\r
+                               }\r
                        mtabline[7] = j + '0';\r
-                       if ((fdm = fopen("/etc/mtab", "w")) != NULL)\r
+                       if ((fdm = fopen("/etc/mtab", "w")) == NULL)\r
                                {\r
-                               if (fputs(mtabline, fdm) != EOF)\r
-                                       s = "ok";\r
-                               fclose(fdm);\r
+                               perror("can't create /etc/mtab");\r
+                               break;\r
                                }\r
+                       if (fputs(mtabline, fdm) == EOF)\r
+                               {\r
+                               perror("can't write /etc/mtab");\r
+                               break;\r
+                               }\r
+                       fclose(fdm);\r
                        break;\r
                        }\r
                }\r
-       printf("%s\n", s);\r
-}\r
+       }\r
 \r
 #if 1 /* Nick, we want mtab preserved over bootup */\r
 #define PLENGTH 40\r
 \r
-void process_mtab(void)\r
+void process_fstab(void)\r
        {\r
        int r;\r
-       FILE *mtb;\r
+       FILE *fdf, *fdm;\r
        char line[PLENGTH];\r
        char mf1[PLENGTH], mf2[PLENGTH], mf3[PLENGTH];\r
 \r
-       if ((mtb = fopen("/etc/mtab", "r")) == NULL)\r
+       printf("Processing /etc/fstab\n");\r
+       fflush(stdout);\r
+\r
+       if ((fdf = fopen("/etc/fstab", "r")) == NULL)\r
                {\r
-#if 1\r
-               generate_mtab();\r
-#else\r
-               printf("init: can't open /etc/mtab\n");\r
-#endif\r
+               perror("can't open /etc/fstab");\r
                return;\r
                }\r
-       while (!feof(mtb))\r
+\r
+       while (feof(fdf) == 0)\r
                {\r
-               if (fgets(line, PLENGTH, mtb))\r
+               if (fgets(line, PLENGTH, fdf) == NULL)\r
                        {\r
-                       mf1[0] = mf2[0] = mf3[0] = '\0';\r
-                       r = sscanf(line, "%s%s%s", mf1, mf2, mf3);\r
-                       if (r > 1 && strcmp(mf2, "/"))\r
-                               {\r
-                               if (r > 2)\r
-                                       {\r
-                                       r = !strcmp(mf3, "ro");\r
-                                       }\r
-                               else\r
-                                       {\r
-                                       r = 0; /* default to read/write */\r
-                                       }\r
-                               r = mount(mf1, mf2, r);\r
-                               if (r < 0)\r
-                                       {\r
-                                       fprintf(stderr,\r
-                                           "init: failed to mount %s on %s\n",\r
-                                           mf1, mf2);\r
-                                       }\r
-                               }\r
+                       break;\r
+                       }\r
+\r
+               mf1[0] = mf2[0] = mf3[0] = '\0';\r
+               r = sscanf(line, "%s%s%s", mf1, mf2, mf3);\r
+               if (r < 2 || strcmp(mf2, "/") == 0)\r
+                       {\r
+                       continue;\r
+                       }\r
+\r
+               if (r > 2)\r
+                       {\r
+                       r = !strcmp(mf3, "ro");\r
+                       }\r
+               else\r
+                       {\r
+                       r = 0; /* default to read/write */\r
+                       }\r
+               r = mount(mf1, mf2, r);\r
+               if (r < 0)\r
+                       {\r
+                       perror("mount failed");\r
+                       continue;\r
                        }\r
+\r
+               fdm = fopen("/etc/mtab", "a");\r
+               if (fdm == NULL)\r
+                       {\r
+                       perror("can't open /etc/mtab");\r
+                       continue;\r
+                       }\r
+\r
+               sprintf(line,"%s\t%s\tr%c\n", mf1, mf2, r ? 'o' : 'w');\r
+               if (fputs(line, fdm) == EOF)\r
+                       {\r
+                       perror("can't write /etc/mtab");\r
+                       continue;\r
+                       }\r
+\r
+               fclose(fdm);\r
                }\r
-       fclose(mtb);\r
+\r
+       fclose(fdf);\r
        }\r
 #endif\r
 \r
@@ -224,13 +334,10 @@ int spawn_tty(unsigned num, char **argv)
        dup2(fd, STDOUT_FILENO);\r
        dup2(fd, STDERR_FILENO);\r
        if (firsttime) {\r
-#if 1 /* Nick, we want mtab preserved over bootup */\r
-               process_mtab();\r
-#else\r
                generate_mtab();\r
-#endif\r
+               process_fstab();\r
                process_inittab();\r
-               printf("Spawning tty #%d (%s): ok\n", num, p->tty_name);\r
+               printf("\nSpawning tty #%d (%s): ok\n", num, p->tty_name);\r
        }\r
        setenv("TTY", p->tty_name, 1);\r
        setenv("TERM",\r
@@ -344,6 +451,7 @@ VOID main(int argc, char *argv[])
        time_t mytimet;\r
 #if 1 /* Nick */\r
        struct tm *tmbuf;\r
+       char *tmptr;\r
 #endif\r
 #endif\r
 \r
@@ -360,7 +468,7 @@ VOID main(int argc, char *argv[])
 #if 1 /* Nick */\r
        /* reopen_console(); */\r
 \r
-       printf("Date/time: ");\r
+       printf("Time/date: ");\r
        fflush(stdout);\r
 \r
        time(&mytimet);\r
@@ -370,7 +478,17 @@ VOID main(int argc, char *argv[])
                }\r
        tmbuf = localtime(&mytimet);\r
 \r
+#if 1\r
+       tmptr = asctime(tmbuf);\r
+       tmptr[3] = 0; /* terminate day of week */\r
+       tmptr[7] = 0; /* terminate month */\r
+       tmptr[10] = 0; /* terminate day of month */\r
+       tmptr[19] = 0; /* terminate time of day */\r
+       printf("%s %s %s %s %s",\r
+              tmptr + 11, tmptr, tmptr + 8, tmptr + 4, tmptr + 20);\r
+#else\r
        printf("%s", asctime(tmbuf)); /* has embedded newline */\r
+#endif\r
        fflush(stdout);\r
 \r
        if (tmbuf->tm_year < 103) /* 2003 */\r
@@ -378,7 +496,7 @@ VOID main(int argc, char *argv[])
        for (;;)\r
 #endif\r
                {\r
-               printf("Enter date/time (hh:mm[:ss] dd/mm/yyyy): ");\r
+               printf("Enter time/date (hh:mm[:ss] dd/mm/yyyy): ");\r
                fflush(stdout);\r
                read(0, buf, 39);\r
                p=strchr(buf, '\n');\r
@@ -387,7 +505,7 @@ VOID main(int argc, char *argv[])
                *p=0;\r
                if (!conv_time(buf, p+1, &tt))\r
                        {\r
-                       printf("Bad date/time format\n");\r
+                       printf("Bad time/date format\n");\r
 #if 1 /* Nick */\r
                        }\r
                else\r
@@ -399,8 +517,19 @@ VOID main(int argc, char *argv[])
                                }\r
                        else\r
                                {\r
-                               printf("New date/time: %s", ctime(&mytimet));\r
+#if 1\r
+                               tmptr = ctime(&mytimet);\r
+                               tmptr[3] = 0; /* terminate day of week */\r
+                               tmptr[7] = 0; /* terminate month */\r
+                               tmptr[10] = 0; /* terminate day of month */\r
+                               tmptr[19] = 0; /* terminate time of day */\r
+                               printf("New time/date: %s %s %s %s %s",\r
+                                      tmptr + 11, tmptr, tmptr + 8, tmptr + 4,\r
+                                      tmptr + 20);\r
+#else\r
+                               printf("New time/date: %s", ctime(&mytimet));\r
                                /* has embedded newline */\r
+#endif\r
                                }\r
                        }\r
                }\r
index a136882..e0f7b87 100644 (file)
@@ -69,91 +69,91 @@ rem build uzi
 copy ..\uzi\asmdef.inc\r
 copy ..\uzi\z180.inc\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\main\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\main\r
 @if errorlevel 1 goto failure\r
 del main.r01\r
 as-z80 -l -o main.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\data\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\data\r
 @if errorlevel 1 goto failure\r
 del data.r01\r
 as-z80 -l -o data.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\devflop\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\devflop\r
 @if errorlevel 1 goto failure\r
 del devflop.r01\r
 as-z80 -l -o devflop.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\devhd\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\devhd\r
 @if errorlevel 1 goto failure\r
 del devhd.r01\r
 as-z80 -l -o devhd.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\devio\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\devio\r
 @if errorlevel 1 goto failure\r
 del devio.r01\r
 as-z80 -l -o devio.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\devmisc\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\devmisc\r
 @if errorlevel 1 goto failure\r
 del devmisc.r01\r
 as-z80 -l -o devmisc.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\devtty\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\devtty\r
 @if errorlevel 1 goto failure\r
 del devtty.r01\r
 as-z80 -l -o devtty.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\filesys\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\filesys\r
 @if errorlevel 1 goto failure\r
 del filesys.r01\r
 as-z80 -l -o filesys.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\machdep\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\machdep\r
 @if errorlevel 1 goto failure\r
 del machdep.r01\r
 as-z80 -l -o machdep.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\process\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\process\r
 @if errorlevel 1 goto failure\r
 del process.r01\r
 as-z80 -l -o process.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\scall1\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\scall1\r
 @if errorlevel 1 goto failure\r
 del scall1.r01\r
 as-z80 -l -o scall1.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\scall2\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\scall2\r
 @if errorlevel 1 goto failure\r
 del scall2.r01\r
 as-z80 -l -o scall2.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\scall3\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\scall3\r
 @if errorlevel 1 goto failure\r
 del scall3.r01\r
 as-z80 -l -o scall3.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\systrace\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\systrace\r
 @if errorlevel 1 goto failure\r
 del systrace.r01\r
 as-z80 -l -o systrace.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=1 ..\uzi\xip\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -I..\libc\ -DDEBUG=2 ..\uzi\xip\r
 @if errorlevel 1 goto failure\r
 del xip.r01\r
 as-z80 -l -o xip.s01\r
@@ -185,73 +185,79 @@ copy ..\libc\_exit.asm _exit.s01
 as-z80 -l -o _exit.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\kprintf\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\dprintf\r
+@if errorlevel 1 goto failure\r
+del dprintf.r01\r
+as-z80 -l -o dprintf.s01\r
+@if errorlevel 1 goto failure\r
+\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\kprintf\r
 @if errorlevel 1 goto failure\r
 del kprintf.r01\r
 as-z80 -l -o kprintf.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\vfprintf\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\vfprintf\r
 @if errorlevel 1 goto failure\r
 del vfprintf.r01\r
 as-z80 -l -o vfprintf.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\itoa\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\itoa\r
 @if errorlevel 1 goto failure\r
 del itoa.r01\r
 as-z80 -l -o itoa.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\ltoa\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\ltoa\r
 @if errorlevel 1 goto failure\r
 del ltoa.r01\r
 as-z80 -l -o ltoa.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\ultoa\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\ultoa\r
 @if errorlevel 1 goto failure\r
 del ultoa.r01\r
 as-z80 -l -o ultoa.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\strlen\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\strlen\r
 @if errorlevel 1 goto failure\r
 del strlen.r01\r
 as-z80 -l -o strlen.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\strcat\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\strcat\r
 @if errorlevel 1 goto failure\r
 del strcat.r01\r
 as-z80 -l -o strcat.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\strcpy\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\strcpy\r
 @if errorlevel 1 goto failure\r
 del strcpy.r01\r
 as-z80 -l -o strcpy.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\strncmp\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\strncmp\r
 @if errorlevel 1 goto failure\r
 del strncmp.r01\r
 as-z80 -l -o strncmp.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\memcpy\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\memcpy\r
 @if errorlevel 1 goto failure\r
 del memcpy.r01\r
 as-z80 -l -o memcpy.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\abort\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\abort\r
 @if errorlevel 1 goto failure\r
 del abort.r01\r
 as-z80 -l -o abort.s01\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -DDEBUG=1 ..\libc\exit\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\cmx\ -I..\uzi\ -DDEBUG=2 ..\libc\exit\r
 @if errorlevel 1 goto failure\r
 del exit.r01\r
 as-z80 -l -o exit.s01\r
@@ -264,13 +270,13 @@ link-z80 -f kernel
 ihex2bin -l kernel.i86 ..\..\..\bin\kernel.bin\r
 @if errorlevel 1 goto failure\r
 \r
-copy ..\..\..\bin\kernel.bin \nlddl\r
-set country=NLD\r
-crc\r
-copy \nlddl\checksum ..\..\..\bin\r
+rem copy ..\..\..\bin\kernel.bin \nlddl\r
+rem set country=NLD\r
+rem crc\r
+rem copy \nlddl\checksum ..\..\..\bin\r
 \r
-copy \nlddl\checksum \\darkstar\public\dos622\nlddl\r
-copy \nlddl\kernel.bin \\darkstar\public\dos622\nlddl\r
+rem copy \nlddl\checksum \\darkstar\public\dos622\nlddl\r
+rem copy \nlddl\kernel.bin \\darkstar\public\dos622\nlddl\r
 \r
 @echo SUCCESS\r
 @goto done\r
index 53a0e92..3708d15 100644 (file)
@@ -68,6 +68,7 @@ _apibus_setup::
        public  _apibus_priority\r
 \r
 _apibus_priority::\r
+if 0 ; 08apr03 patch to avoid BAD COMMAND error on TPG hardware\r
        ; enter with e = priority value to be set\r
        ; upper nibble is priority (1-7), lower nibble is device (1-8)\r
 \r
@@ -99,6 +100,7 @@ set_priority:
 \r
        pop     de\r
        pop     bc\r
+endif\r
        jp      ?BANK_FAST_LEAVE_L08\r
 \r
 ; -----------------------------------------------------------------------------\r
index 7b1af16..ea8fc2d 100644 (file)
@@ -11,7 +11,7 @@ BITELOG               equ     5
 PBITE          equ     16\r
 PBITELOG       equ     4\r
 \r
-       extern  abyte, ahexw, ahexn, acrlf\r
+       extern  abyte, ahexn, ahexb, ahexw, acrlf\r
 \r
 ; copy routine\r
 ; ------------\r
@@ -93,6 +93,65 @@ copyr:
        call    acrlf\r
 \r
        pop     hl\r
+ .endif\r
+ .if 0 ; disk block monitor\r
+ ld a,e\r
+ cp 4\r
+ jr nz,nowrm\r
+ push bc\r
+ push hl\r
+ ld bc,0e00h\r
+ or a\r
+ sbc hl,bc\r
+ pop hl\r
+ pop bc\r
+ jr nz,nowrm\r
+ ; e:hl -> 4:0e00, disk block 7\r
+ call nomon\r
+\r
+mon:\r
+ push bc\r
+ push hl\r
+ in0 a,(BBR)\r
+ push af\r
+ ld a,40h-4\r
+ out0 (BBR),a\r
+ ld hl,4e00h ; bbr:hl -> 4:0e00, disk block 7\r
+ ld c,20h\r
+dline:\r
+ ld b,10h\r
+ditem:\r
+ ld a,(hl)\r
+ inc hl\r
+ call ahexb\r
+ ld a,' '\r
+ call abyte\r
+ djnz ditem\r
+ call acrlf\r
+ dec c\r
+ jr nz,dline\r
+ pop af\r
+ out0 (BBR),a\r
+ pop hl\r
+ pop bc\r
+ ret\r
+\r
+nowrm:\r
+ ld a,d\r
+ cp 4\r
+ jr nz,nomon\r
+ push bc\r
+ push hl\r
+ push iy\r
+ pop hl\r
+ ld bc,0e00h\r
+ or a\r
+ sbc hl,bc\r
+ pop hl\r
+ pop bc\r
+ call z,mon ; if d:iy -> 4:0e00, disk block 7\r
+\r
+nomon:\r
  .endif\r
        ld      a,e\r
        cp      4\r
index c741e49..b8c7f0f 100644 (file)
@@ -24,6 +24,10 @@ _abyte::
        public  abyte\r
 \r
 abyte::\r
+ .if 1\r
+ ei ; a bit naughty but avoids inadvertent BAD COMMAND when line is busy\r
+ .endif\r
+\r
  .if 0 ; 0=enable abytes, 1=disable abytes (doesn't affect the code size)\r
  ret\r
  .else\r
index 7a7a699..2a389ec 100644 (file)
@@ -38,6 +38,7 @@ flopasm
 utils\r
 systrace\r
 xip\r
+dprintf\r
 kprintf\r
 vfprintf\r
 itoa\r
similarity index 79%
rename from src/kernel/libc/vendor.h
rename to src/kernel/libc/VENDOR.H
index 7c5b7c4..ac96c04 100644 (file)
@@ -2,10 +2,13 @@
 \r
 #ifndef UTIL /* ensures we don't do anything when compiling utils under MSVC */\r
 \r
+#define dprintf _dprintf\r
 #define kprintf _kprintf\r
+#define ub _ub\r
 \r
 #if 1 /* Nick, see kprintf.c */\r
 int kprintf(char *, ...); /* ensures IAR won't try to pass register params */\r
+int dprintf(char debuglevel, char *fmt, ...);\r
 #else\r
 void kprintf(char *, ...); /* ensures IAR won't try to pass register params */\r
 #endif\r
diff --git a/src/kernel/libc/dprintf.c b/src/kernel/libc/dprintf.c
new file mode 100644 (file)
index 0000000..ea99c9a
--- /dev/null
@@ -0,0 +1,59 @@
+/* dprintf.c\r
+ *    Dale Schumacher                        399 Beacon Ave.\r
+ *    (alias: Dalnefre')                     St. Paul, MN  55104\r
+ *    dal@syntel.UUCP                        United States of America\r
+ *\r
+ * Altered to use stdarg, made the core function vfprintf.\r
+ * Hooked into the stdio package using 'inside information'\r
+ * Altered sizeof() assumptions, now assumes all integers except chars\r
+ * will be either\r
+ *  sizeof(xxx) == sizeof(long) or sizeof(xxx) == sizeof(short)\r
+ *\r
+ * -RDB\r
+ */\r
+\r
+/* #include "printf.h" */\r
+#include "vendor.h" /* Nick, must come first */\r
+\r
+#include <types.h>\r
+#include <fcntl.h>\r
+#if 1\r
+#include <stdarg.h>\r
+#define va_strt      va_start\r
+#else\r
+#include <varargs.h>\r
+#define va_strt(p,i) va_start(p)\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#include "unix.h" /* Nick for udata.u_debugme */\r
+#include "config.h" /* Nick for udata.u_debugme */\r
+#include "extern.h" /* Nick for udata.u_debugme */\r
+\r
+int dprintf(char debuglevel, char *fmt, ...)\r
+{\r
+#ifdef DEBUG\r
+       va_list ptr;\r
+       int rv;\r
+\r
+       if (udata.u_debugme < debuglevel)\r
+               {\r
+               return 0;\r
+               }\r
+\r
+       va_strt(ptr, fmt);\r
+#if 1 /* Nick */\r
+       rv = vfprintf(NULL, fmt, ptr);\r
+#else\r
+       rv = vfprintf(stdout, fmt, ptr);\r
+#endif\r
+       va_end(ptr);\r
+       return rv;\r
+#else\r
+       return 0;\r
+#endif\r
+}\r
+\r
diff --git a/src/kernel/libc/dprintf.h b/src/kernel/libc/dprintf.h
new file mode 100644 (file)
index 0000000..20e582c
--- /dev/null
@@ -0,0 +1,9 @@
+/* dprintf.h for uzi180 by Nick - subroutines based on /uzi/libc source */\r
+\r
+#ifndef __DPRINTF_H\r
+#define __DPRINTF_H\r
+\r
+int dprintf(char *fmt, ...);\r
+\r
+#endif /* __DPRINTF_H */\r
+\r
index 9e0ee5a..6eb8a69 100644 (file)
@@ -79,7 +79,7 @@ extern devsw_t dev_tab[]; /* Nick */
 \r
 #define TTYDEV  BOOT_TTY  /* Device used by kernel for messages, panics */\r
 #define SWAPDEV 3         /* Device for swapping. */\r
-#define NBUFS   20 /*10*/        /* Number of block buffers */\r
+#define NBUFS   10 /* DEBUGGING 20 */ /*10*/        /* Number of block buffers */\r
 \r
 #if 1 /* Nick UZIX compatibility */\r
 \r
index a542b88..de95395 100644 (file)
@@ -73,9 +73,8 @@ int wd_read(uchar minor, uchar rawflag)
     int setup();\r
 \r
 /* kputchar(minor + '0'); */\r
-#if DEBUG > 1\r
- kputchar('<');\r
- kputchar(8);\r
+#if DEBUG >= 2\r
+ dprintf(2, "<\x08");\r
 #endif\r
 \r
 #ifdef APIBUS\r
@@ -89,9 +88,8 @@ int wd_read(uchar minor, uchar rawflag)
 \r
     chkstat (scsiop(), 1);\r
 \r
-#if DEBUG > 1\r
- kputchar(' ');\r
- kputchar(8);\r
+#if DEBUG >= 2\r
+ dprintf(2, " \x08");\r
 #endif\r
 \r
     return 0; /* success.. formerly count of bytes read */\r
@@ -103,9 +101,8 @@ int wd_write(uchar minor, uchar rawflag)
     int setup();\r
 \r
 /* kputchar(minor + '0'); */\r
-#if DEBUG > 1\r
- kputchar('>');\r
- kputchar(8);\r
+#if DEBUG >= 2\r
+ dprintf(2, ">\x08");\r
 #endif\r
 \r
 #ifdef APIBUS\r
@@ -118,9 +115,8 @@ int wd_write(uchar minor, uchar rawflag)
 \r
     chkstat (scsiop(), 0);\r
 \r
-#if DEBUG > 1\r
- kputchar(' ');\r
- kputchar(8);\r
+#if DEBUG >= 2\r
+ dprintf(2, " \x08");\r
 #endif\r
 \r
     return 0; /* success.. formerly count of bytes written */\r
index 703bf29..3c25b57 100644 (file)
@@ -82,7 +82,7 @@ bufptr freebuf(uchar waitfor);
 \r
 uint bufclock = 0;     /* Time-stamp counter for LRU */\r
 \r
-#if DEBUG > 0\r
+#if DEBUG\r
 uint buf_hits; /* buffer pool hits */\r
 uint buf_miss; /* buffer pool misses */\r
 uint buf_flsh; /* buffer pool flushes */\r
@@ -93,18 +93,22 @@ void *bread(dev_t dev, blkno_t blk, uchar rewrite)
 {\r
        register bufptr bp = bufpool;\r
 \r
+#if DEBUG >= 3\r
+ dprintf(3, "bread(%u, %u, %u) starting\n", dev, blk, rewrite);\r
+#endif\r
+\r
 #if 1 /* Nick */\r
        if (bp = bfind(dev, blk))\r
                {\r
                if (bp->bf_busy)\r
                        panic("want busy block %d, device %d", blk, dev);\r
-#if DEBUG > 0\r
+#if DEBUG\r
                ++buf_hits;\r
 #endif\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
   {\r
-  kprintf("chit 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+  dprintf(5, ("chit 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
   }\r
 #endif\r
                goto Done;\r
@@ -115,7 +119,7 @@ void *bread(dev_t dev, blkno_t blk, uchar rewrite)
                if (bp->bf_dev == dev && bp->bf_blk == blk) {\r
                        if (bp->bf_busy)        /* ??? */\r
                                panic("want busy block %d at dev %d",blk,dev);\r
-#if DEBUG > 0\r
+#if DEBUG\r
                        ++buf_hits;\r
 #endif\r
                        goto Done;\r
@@ -123,7 +127,7 @@ void *bread(dev_t dev, blkno_t blk, uchar rewrite)
                ++bp;\r
        }\r
 #endif\r
-#if DEBUG > 0\r
+#if DEBUG\r
        ++buf_miss;\r
 #endif\r
        /* block not found in pool - allocate free buffer for them */\r
@@ -137,33 +141,44 @@ void *bread(dev_t dev, blkno_t blk, uchar rewrite)
                if (bdread(bp) < 0) { /* device can define the error */\r
                        if (udata.u_error == 0)\r
                                udata.u_error = EIO;\r
-Err:                   return NULL;\r
+Err:\r
+#if DEBUG >= 3\r
+ dprintf(3, "bread() returning NULL, error %u\n", udata.u_error);\r
+#endif\r
+                       return NULL;\r
                }\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
   {\r
-  kprintf("read 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+  dprintf(5, ("read 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
   }\r
 #endif\r
        }\r
 Done:  if (rewrite > 1)                /* we need really zeroed block */\r
  {\r
                bzero(bp->bf_data, BUFSIZE);\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
   {\r
-  kprintf("zero 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+  dprintf(5, ("zero 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
   }\r
 #endif\r
  }\r
        bp->bf_busy++;                  /* was always zero */\r
        bp->bf_time = ++bufclock;       /* Time stamp it */\r
+#if DEBUG >= 3\r
+ dprintf(3, "bread() returning %u, success\n", bp - bufpool);\r
+#endif\r
        return (bp->bf_data);\r
 }\r
 \r
 /* free not needed now buffer */\r
 int bfree(bufptr bp, uchar dirty)\r
 {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bfree(%u, %u) starting\n", bp - bufpool, dirty);\r
+#endif\r
+\r
        bp->bf_dirty |= dirty;\r
        bp->bf_busy = 0;\r
        if (bp->bf_dirty && bp->bf_dev == NULLDEV)\r
@@ -174,29 +189,35 @@ int bfree(bufptr bp, uchar dirty)
 #else\r
        if (bp->bf_dirty >= 2 && !dirty_mask) { /* Extra dirty */\r
 #endif\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
   {\r
-  kprintf("wri2 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+  dprintf(5, ("wri2 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
   }\r
 #endif\r
                if (bdwrite(bp) < 0) {\r
                        udata.u_error = EIO;\r
+#if DEBUG >= 3\r
+ dprintf(3, "bfree() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                        return (-1);\r
                }\r
                bp->bf_prio = bp->bf_dirty = 0;\r
        }\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  else\r
   {\r
   if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
    {\r
-   kprintf("free 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+   dprintf(5, ("free 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
    }\r
   }\r
 #endif\r
        if (!bp->bf_prio)\r
                wakeup(bufpool);\r
+#if DEBUG >= 3\r
+ dprintf(3, "bfree() returning 0, success\n");\r
+#endif\r
        return 0;\r
 }\r
 \r
@@ -207,7 +228,13 @@ int bfree(bufptr bp, uchar dirty)
 void *zerobuf(uchar waitfor)\r
 {\r
        static int blk = 0;\r
-       register bufptr bp = freebuf(waitfor);\r
+       register bufptr bp; /* = freebuf(waitfor); Nick see below */\r
+\r
+#if DEBUG >= 3\r
+ dprintf(3, "zerobuf(%u) starting\n", waitfor);\r
+#endif\r
+\r
+       bp = freebuf(waitfor); /* Nick see above */\r
 \r
        if (bp) {\r
                bp->bf_dev = NULLDEV;\r
@@ -215,8 +242,14 @@ void *zerobuf(uchar waitfor)
                bp->bf_busy = 1;\r
                bp->bf_time = ++bufclock;\r
                bzero(bp->bf_data, BUFSIZE);\r
+#if DEBUG >= 3\r
+ dprintf(3, "zerobuf() returning %d, found\n", bp - bufpool);\r
+#endif\r
                return bp->bf_data;\r
        }\r
+#if DEBUG >= 3\r
+ dprintf(3, "zerobuf() returning NULL, not found\n", bp - bufpool);\r
+#endif\r
        return NULL;\r
 }\r
 \r
@@ -225,6 +258,10 @@ void bufsync(void)
 {\r
        register bufptr bp = bufpool;\r
 \r
+#if DEBUG >= 3\r
+ dprintf(3, "bufsync() starting\n");\r
+#endif\r
+\r
 #if 0\r
        /* dirty_mask logic is now handled by i_sync() and wr_inode() */\r
        dirty_mask = 0;\r
@@ -233,10 +270,10 @@ void bufsync(void)
                if (bp->bf_dev != NULLDEV &&\r
                    bp->bf_dirty &&\r
                    !bp->bf_prio) {\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
   {\r
-  kprintf("sync 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+  dprintf(5, ("sync 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
   }\r
 #endif\r
                        if (!bdwrite(bp))\r
@@ -244,6 +281,9 @@ void bufsync(void)
                }\r
                ++bp;\r
        }\r
+#if DEBUG >= 3\r
+ dprintf(3, "bufsync() returning\n");\r
+#endif\r
 }\r
 \r
 #if 1 /* Nick */\r
@@ -251,22 +291,22 @@ bufptr bfind(int dev, blkno_t blk)
 {\r
     register bufptr bp;\r
 \r
-#if DEBUG > 1\r
kprintf("bfind(%u, %u) starting\n", dev, blk);\r
+#if DEBUG >= 3\r
dprintf(3, "bfind(%u, %u) starting\n", dev, blk);\r
 #endif\r
 \r
     for (bp=bufpool; bp < bufpool+NBUFS; ++bp)\r
     {\r
         if (bp->bf_dev == dev && bp->bf_blk == blk)\r
  {\r
-#if DEBUG > 1\r
kprintf("bfind() returning %d, found\n", bp - bufpool);\r
+#if DEBUG >= 3\r
dprintf(3, "bfind() returning %d, found\n", bp - bufpool);\r
 #endif\r
             return (bp);\r
  }\r
     }\r
-#if DEBUG > 1\r
kprintf("bfind() returning NULL, not found\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bfind() returning NULL, not found\n");\r
 #endif\r
     return (NULL);\r
 }\r
@@ -283,6 +323,10 @@ bufptr freebuf(uchar waitfor)
        register bufptr oldest = NULL;\r
        register uint oldtime = 0;\r
 \r
+#if DEBUG >= 3\r
+ dprintf(3, "freebuf(%u) starting\n", waitfor);\r
+#endif\r
+\r
        /* Try to find a non-busy buffer and\r
         * write out the data if it is dirty\r
         */\r
@@ -316,13 +360,13 @@ bufptr freebuf(uchar waitfor)
                if (oldest->bf_dev == NULLDEV)\r
                        panic("attempt to write-back zerobuf");\r
 #endif\r
-#if DEBUG > 0\r
+#if DEBUG\r
                ++buf_flsh;\r
 #endif\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
   {\r
-  kprintf("wri1 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+  dprintf(5, ("wri1 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
   }\r
 #endif\r
                if (bdwrite(oldest) < 0) {\r
@@ -331,19 +375,22 @@ Err:                      return NULL;
                }\r
                oldest->bf_dirty = 0;\r
        }\r
-#if DEBUG > 10\r
+#if DEBUG >= 5\r
  else\r
   {\r
   if (bp->bf_dev == 0 && bp->bf_blk == 222)\r
    {\r
-   kprintf("toss 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
+   dprintf(5, ("toss 0x%04x 0x%02x\n", bp, bp->bf_data[0x3f]);\r
    }\r
   }\r
+#endif\r
+#if DEBUG >= 3\r
+ dprintf(3, "freebuf() returning %d, found\n", oldest - bufpool);\r
 #endif\r
        return oldest;\r
 }\r
 \r
-#if DEBUG > 0\r
+#if DEBUG\r
 /* dump buffers info for debug */\r
 void bufdump(void)\r
 {\r
index 0513ec1..17d55f1 100644 (file)
@@ -86,8 +86,8 @@ int tty_read(uchar minor, uchar rawflag)
     char c;\r
     int  remq();\r
 \r
-#if DEBUG > 1\r
kprintf("tty_read(%d, %d) starting\n", minor, rawflag);\r
+#if DEBUG >= 2\r
dprintf(2, "tty_read(%d, %d) starting\n", minor, rawflag);\r
 #endif\r
 \r
        /* Minor == 0 means that it is the controlling tty of the process */\r
@@ -98,8 +98,8 @@ int tty_read(uchar minor, uchar rawflag)
 \r
     if ((minor < 1) || (minor > NTTYS+1)) {\r
         udata.u_error = ENODEV;\r
-#if DEBUG > 1\r
kprintf("tty_read() returning -1, error %d\n", udata.u_error);\r
+#if DEBUG >= 2\r
dprintf(2, "tty_read() returning -1, error %d\n", udata.u_error);\r
 #endif\r
         return (-1);\r
     }\r
@@ -127,8 +127,8 @@ int tty_read(uchar minor, uchar rawflag)
             /* In unbuffered mode, don't wait when no input */\r
             if (tty_data[minor].t_flags & UNBUFF)\r
  {\r
-#if DEBUG > 1\r
kprintf("tty_read() returning %d, success\n", nread);\r
+#if DEBUG >= 2\r
dprintf(2, "tty_read() returning %d, success\n", nread);\r
 #endif\r
                 return(nread);\r
  }\r
@@ -137,8 +137,8 @@ int tty_read(uchar minor, uchar rawflag)
             psleep (&ttyinq[minor]);\r
             if (udata.u_cursig || udata.u_ptab->p_pending) {     /* messy */\r
                 udata.u_error = EINTR;\r
-#if DEBUG > 1\r
kprintf("tty_read() returning -1, error %d\n", udata.u_error);\r
+#if DEBUG >= 2\r
dprintf(2, "tty_read() returning -1, error %d\n", udata.u_error);\r
 #endif\r
                 return (-1);\r
             }\r
@@ -149,8 +149,8 @@ int tty_read(uchar minor, uchar rawflag)
 #endif\r
         if ((nread++ == 0) && (c == tty_data[minor].t_eof))   /* ^D */\r
  {\r
-#if DEBUG > 1\r
kprintf("tty_read() returning 0, eof\n");\r
+#if DEBUG >= 2\r
dprintf(2, "tty_read() returning 0, eof\n");\r
 #endif\r
             return(0);\r
  }\r
@@ -170,8 +170,8 @@ int tty_read(uchar minor, uchar rawflag)
 #endif\r
         ++udata.u_base;\r
     } \r
-#if DEBUG > 1\r
kprintf("tty_read() returning %d, success\n", nread);\r
+#if DEBUG >= 2\r
dprintf(2, "tty_read() returning %d, success\n", nread);\r
 #endif\r
     return(nread);\r
 }\r
@@ -369,7 +369,7 @@ void tty_inproc(int minor, char c)
     {\r
         if ((mode & RAW) == 0)       /* if mode == COOKED or CBREAK */\r
         {\r
-#ifdef DEBUG\r
+#if DEBUG\r
           if (c == 0x1a)                /* ^Z */\r
               {\r
               idump();                  /*   (For debugging) */\r
index 649c4de..3fbfbc9 100644 (file)
@@ -84,7 +84,7 @@ extern blkno_t swapblk;
 extern uint16 waitno;   /* Serial number of processes entering wait state */\r
 \r
 #ifdef DEBUG\r
-extern char traceon;   /* Nick flag to enable/disable tracing via keyboard */\r
+extern char traceon;   /* Nick to enable/disable tracing via keyboard */\r
 #endif\r
 \r
 #if 1 /* Nick UZIX compatible */\r
@@ -125,6 +125,7 @@ extern char traceon;        /* Nick flag to enable/disable tracing via keyboard */
 \r
 #ifdef UTIL /* Nick */\r
 #define kprintf printf\r
+#define dprintf /* parameters will be evaluated, to no effect */\r
 #define kputchar putchar\r
 #define _putc putchar\r
 #define uput(sptr, uptr, nbytes) (bcopy((sptr), (uptr), (nbytes)))\r
index 1beaec0..efd385a 100644 (file)
@@ -105,8 +105,8 @@ int wr_inode(inoptr ino)
 {\r
        dinode_t *buf;\r
 \r
-#if DEBUG > 1\r
kprintf("wr_inode(%u) starting\n", ino - i_tab);\r
+#if DEBUG >= 3\r
dprintf(3, "wr_inode(%u) starting\n", ino - i_tab);\r
 #endif\r
 \r
        magic(ino, "wr_inode");\r
@@ -116,8 +116,8 @@ int wr_inode(inoptr ino)
                        ino->c_num), 0)) == NULL)\r
  {\r
 Err:\r
-#if DEBUG > 1\r
kprintf("wr_inode() returning -1, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "wr_inode() returning -1, error %u\n", udata.u_error);\r
 #endif\r
                        return -1;\r
  }\r
@@ -132,8 +132,8 @@ Err:
                        goto Err;\r
        }\r
        ino->c_dirty = 0;       /* unmark modif flag */\r
-#if DEBUG > 1\r
kprintf("wr_inode() returning 0, success\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "wr_inode() returning 0, success\n", udata.u_error);\r
 #endif\r
        return 0;\r
 }\r
@@ -142,15 +142,15 @@ Err:
  */\r
 void i_ref(inoptr ino)\r
 {\r
-#if DEBUG > 1\r
kprintf("i_ref(%u) starting\n", ino - i_tab);\r
+#if DEBUG >= 4\r
dprintf(4, "i_ref(%u) starting\n", ino - i_tab);\r
 #endif\r
 \r
        magic(ino, "i_ref");\r
        if (++ino->c_refs >= 12 * ITABSIZE) /* Arbitrary limit */\r
                panic(refstoinode, "too many", ino - i_tab);\r
-#if DEBUG > 1\r
kprintf("i_ref() returning, refs %u\n", ino->c_refs);\r
+#if DEBUG >= 4\r
dprintf(4, "i_ref() returning, refs %u\n", ino->c_refs);\r
 #endif\r
 }\r
 \r
@@ -160,8 +160,8 @@ void i_ref(inoptr ino)
  */\r
 void i_deref(inoptr ino)\r
 {\r
-#if DEBUG > 1\r
kprintf("i_deref(%u) starting\n", ino - i_tab);\r
+#if DEBUG >= 4\r
dprintf(4, "i_deref(%u) starting\n", ino - i_tab);\r
 #endif\r
 \r
        magic(ino, "i_deref");\r
@@ -184,8 +184,8 @@ void i_deref(inoptr ino)
                if (ino->c_dirty)\r
                        wr_inode(ino);\r
        }\r
-#if DEBUG > 1\r
kprintf("i_deref() returning, refs %u\n", ino->c_refs);\r
+#if DEBUG >= 4\r
dprintf(4, "i_deref() returning, refs %u\n", ino->c_refs);\r
 #endif\r
 }\r
 \r
@@ -197,8 +197,8 @@ void i_free(dev_t devno, ino_t ino)
 {\r
        register fsptr dev = getfs(devno);\r
 \r
-#if DEBUG > 1\r
kprintf("i_free(%u, %u) starting\n", devno, ino);\r
+#if DEBUG >= 4\r
dprintf(4, "i_free(%u, %u) starting\n", devno, ino);\r
 #endif\r
 \r
        if (ino <= ROOTINODE || ino >= devinodes(dev))\r
@@ -211,16 +211,16 @@ void i_free(dev_t devno, ino_t ino)
                if (bitmap_set(devno, ino, 0, dev->s_bitmap_inode,\r
                                dev->s_bitmap_block) != 1)\r
                        {\r
-#if DEBUG > 1\r
kprintf("i_free() returning, error\n");\r
+#if DEBUG >= 4\r
dprintf(4, "i_free() returning, error\n");\r
 #endif\r
                        return; /* always an i/o error (or very bad !!) */\r
                        }\r
 \r
                ++dev->s_tinode;\r
 #if 0 /* remove support for the original UZI filesystem */\r
-#if DEBUG > 1\r
kprintf("i_free() returning, success\n");\r
+#if DEBUG >= 4\r
dprintf(4, "i_free() returning, success\n");\r
 #endif\r
                return; /* crude way to skip inode list processing */\r
                }\r
@@ -232,8 +232,8 @@ void i_free(dev_t devno, ino_t ino)
        if (dev->s_ninode < FSFREEINODES)\r
                dev->s_inode[dev->s_ninode++] = ino;\r
 #endif\r
-#if DEBUG > 1\r
kprintf("i_free() returning, success\n");\r
+#if DEBUG >= 4\r
dprintf(4, "i_free() returning, success\n");\r
 #endif\r
 }\r
 \r
@@ -540,10 +540,13 @@ inoptr i_open(dev_t devno, ino_t ino)
        dinode_t *buf;\r
        inoptr ip, nindex;\r
        uchar i, newn, mode0;\r
+#if 1 /* Nick free bitmap */\r
+       uchar refs0;\r
+#endif\r
        static inoptr nexti = i_tab;    /* rover ptr */\r
 \r
-#if DEBUG > 1\r
kprintf("i_open(%u, %u) starting\n", devno, ino);\r
+#if DEBUG >= 3\r
dprintf(3, "i_open(%u, %u) starting\n", devno, ino);\r
 #endif\r
 \r
        if ((dev = findfs(devno)) == NULL)\r
@@ -554,9 +557,9 @@ inoptr i_open(dev_t devno, ino_t ino)
                        goto Err;       /* errno is already set by i_alloc */\r
                ++newn;\r
        }\r
-/* kprintf("ino = %u\n", ino); */\r
-/* kprintf("dev -> %u\n", dev - fs_tab); */\r
-/* kprintf("devinodes(dev) = %u\n", devinodes(dev)); */\r
+/* dprintf(2, "ino = %u\n", ino); */\r
+/* dprintf(2, "dev -> %u\n", dev - fs_tab); */\r
+/* dprintf(2, "devinodes(dev) = %u\n", devinodes(dev)); */\r
        if (ino < ROOTINODE || ino >= devinodes(dev)) {\r
                warning(badinomsg, "i_open", ino);\r
                goto Err;\r
@@ -565,28 +568,28 @@ inoptr i_open(dev_t devno, ino_t ino)
        nindex = NULL;\r
        i = 0;\r
        ip = nexti;\r
-/* kprintf("{ "); */\r
+/* dprintf(2, "{ "); */\r
        while (i != ITABSIZE) {\r
                nexti = ip;\r
                if (++ip >= i_tab + ITABSIZE)\r
                        ip = i_tab;\r
-/* kprintf("%u ", ip - i_tab); */\r
+/* dprintf(2, "%u ", ip - i_tab); */\r
                if (ip->c_refs == 0)\r
                        nindex = ip;    /* candidate for discarding */\r
                if (ip->c_dev == devno && ip->c_num == ino) {\r
                        nindex = ip;\r
-/* kprintf("} "); */\r
+/* dprintf(2, "} "); */\r
                        goto found;     /* really found */\r
                }\r
                ++i;\r
        }\r
-/* kprintf("} "); */\r
+/* dprintf(2, "} "); */\r
        /* Not already in table - take last candidate */\r
        if (nindex == NULL) {   /* No unrefed slots in inode table */\r
                udata.u_error = ENFILE;\r
                goto Err;\r
        }\r
-/* kprintf("reading(%u, %u) ", inodeblock(dev, ino), inodeoffset(ino)); */\r
+/* dprintf(2, "reading(%u, %u) ", inodeblock(dev, ino), inodeoffset(ino)); */\r
        /* discard oldest? inode from table and read the inode from disk */\r
        buf = (dinode_t *)bread(devno, inodeblock(dev, ino), 0);\r
        if (buf == NULL) goto Err;\r
@@ -598,25 +601,37 @@ inoptr i_open(dev_t devno, ino_t ino)
        nindex->c_num = ino;\r
        nindex->c_ro = dev->s_ronly;\r
 found:\r
-/* kprintf("found(%u, 0%o) ", nindex->c_node.i_nlink, nindex->c_node.i_mode); */\r
+/* dprintf(2, "found(%u, 0%o) ", nindex->c_node.i_nlink, nindex->c_node.i_mode); */\r
        mode0 = (getmode(nindex) == 0);\r
+#if 1 /* Nick free bitmap */\r
+       /* need to check for the special case of working on an erased file */\r
+       refs0 = (nindex->c_refs == 0) && (nindex->c_node.i_nlink == 0);\r
+#endif\r
        if (newn) {     /* RO fs can't do i_alloc()! */\r
                /* newly allocated disk inode must be clean */\r
+#if 1 /* Nick free bitmap */\r
+               if (!refs0 || !mode0)\r
+#else\r
                if (nindex->c_node.i_nlink || !mode0)\r
+#endif\r
                        goto badino;\r
        }       /* and vice versa */\r
+#if 1 /* Nick free bitmap */\r
+       else if (refs0 || mode0)\r
+#else\r
        else if (nindex->c_node.i_nlink == 0 || mode0)\r
+#endif\r
                goto badino;\r
        i_ref(nindex);          /* yet one ref */\r
-#if DEBUG > 1\r
kprintf("i_open() returning %u, success\n", nindex - i_tab);\r
+#if DEBUG >= 3\r
dprintf(3, "i_open() returning %u, success\n", nindex - i_tab);\r
 #endif\r
        return nindex;\r
 \r
 badino: warning(badinomsg, "i_open (disk)", ino); /* nindex - i_tab); */\r
 Err:\r
-#if DEBUG > 1\r
kprintf("i_open() returning NULL, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "i_open() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
        return NULL;\r
 }\r
@@ -637,8 +652,8 @@ int ch_link(inoptr wd, char *oldname, char *newname, inoptr nindex)
        direct_t curentry;\r
        int i;\r
 \r
-#if DEBUG > 1\r
kprintf("ch_link(%u, \"%s\", \"%s\", %u) starting\n",\r
+#if DEBUG >= 3\r
dprintf(3, "ch_link(%u, \"%s\", \"%s\", %u) starting\n",\r
          wd - i_tab, oldname, newname, nindex - i_tab);\r
 #endif\r
 \r
@@ -693,8 +708,8 @@ int ch_link(inoptr wd, char *oldname, char *newname, inoptr nindex)
        if (udata.u_error)\r
  {\r
 Err:\r
-#if DEBUG > 1\r
kprintf("ch_link() returning 0, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "ch_link() returning 0, error %u\n", udata.u_error);\r
 #endif\r
                return 0;\r
  }\r
@@ -704,8 +719,8 @@ Err:
                wd->c_node.i_size += BUFSIZE;\r
        }\r
        setftim(wd, A_TIME | M_TIME | C_TIME); /* And sets c_dirty */\r
-#if DEBUG > 1\r
kprintf("ch_link() returning 1, success\n");\r
+#if DEBUG >= 3\r
dprintf(3, "ch_link() returning 1, success\n");\r
 #endif\r
        return 1;\r
 }\r
@@ -763,8 +778,8 @@ int namecomp(uchar *n1, uchar *n2)
 {\r
        uchar n = DIRNAMELEN;\r
 \r
-#if DEBUG > 2\r
kprintf("namecomp(\"%s\", \"%s\") starting\n", n1, n2);\r
+#if DEBUG >= 5\r
dprintf(5, "namecomp(\"%s\", \"%s\") starting\n", n1, n2);\r
 #endif\r
 \r
        while (*n1 && *n1 != '/') {\r
@@ -772,22 +787,22 @@ int namecomp(uchar *n1, uchar *n2)
                        goto NotEq;\r
                if (--n == 0)\r
  {\r
-#if DEBUG > 2\r
kprintf("namecomp() returning -1, error\n");\r
+#if DEBUG >= 5\r
dprintf(5, "namecomp() returning -1, error\n");\r
 #endif\r
                        return (-1);    /* first name too long - ignore this */\r
  }\r
        }\r
        if (*n2 == '\0' || *n2 == '/')\r
  {\r
-#if DEBUG > 2\r
kprintf("namecomp() returning -1, match\n");\r
+#if DEBUG >= 5\r
dprintf(5, "namecomp() returning -1, match\n");\r
 #endif\r
                return 1;               /* names matched */\r
  }\r
 NotEq:\r
-#if DEBUG > 2\r
kprintf("namecomp() returning 0, no match\n");\r
+#if DEBUG >= 5\r
dprintf(5, "namecomp() returning 0, no match\n");\r
 #endif\r
        return 0;\r
 }\r
@@ -806,21 +821,21 @@ inoptr newfile(inoptr pino, char *name)
 {\r
        register inoptr nindex;\r
 \r
-#if DEBUG > 1\r
kprintf("newfile(%u, \"%s\") starting\n", pino - i_tab, name);\r
+#if DEBUG >= 3\r
dprintf(3, "newfile(%u, \"%s\") starting\n", pino - i_tab, name);\r
 #endif\r
 \r
        if ((getperm(pino) & S_IOWRITE) == 0) {\r
                udata.u_error = EPERM;\r
-#if DEBUG > 1\r
kprintf("newfile() returning NULL, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "newfile() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
                return 0;\r
        }\r
        if ((nindex = i_open(pino->c_dev, NULLINO)) == NULL)\r
  {\r
-#if DEBUG > 1\r
kprintf("newfile() returning NULL, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "newfile() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
                goto Ret;                       /* can't create new inode */\r
  }\r
@@ -839,14 +854,14 @@ inoptr newfile(inoptr pino, char *name)
 #endif\r
                i_deref(nindex);        /* can't enter new file to directory */\r
                nindex = NULL;\r
-#if DEBUG > 1\r
kprintf("newfile() returning NULL, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "newfile() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
        }\r
-#if DEBUG > 1\r
+#if DEBUG >= 3\r
  else\r
   {\r
-  kprintf("newfile() returning %u, success\n", nindex - i_tab);\r
+  dprintf(3, "newfile() returning %u, success\n", nindex - i_tab);\r
   }\r
 #endif\r
 Ret:   i_deref(pino);\r
@@ -859,14 +874,14 @@ int doclose(uchar fd)
        register inoptr ino = getinode(fd);\r
        uchar oftindex;\r
 \r
-#if DEBUG > 1\r
kprintf("doclose(%u) starting\n", (unsigned int)fd);\r
+#if DEBUG >= 3\r
dprintf(3, "doclose(%u) starting\n", (unsigned int)fd);\r
 #endif\r
 \r
        if (ino == NULL)\r
  {\r
-#if DEBUG > 1\r
kprintf("doclose() returning -1, error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "doclose() returning -1, error\n");\r
 #endif\r
                return (-1);\r
  }\r
@@ -877,8 +892,8 @@ int doclose(uchar fd)
                d_close(DEVNUM(ino));\r
        udata.u_files[fd] = -1;\r
        oft_deref(oftindex);\r
-#if DEBUG > 1\r
kprintf("doclose() returning 0, success\n");\r
+#if DEBUG >= 3\r
dprintf(3, "doclose() returning 0, success\n");\r
 #endif\r
        return 0;\r
 }\r
@@ -894,8 +909,8 @@ ino_t i_alloc(dev_t devno)
        dinode_t *buf, *bp;\r
        fsptr dev = getfs(devno);\r
 \r
-#if DEBUG > 1\r
kprintf("i_alloc(%u) starting\n", devno);\r
+#if DEBUG >= 4\r
dprintf(4, "i_alloc(%u) starting\n", devno);\r
 #endif\r
 \r
        if (dev->s_ronly) {\r
@@ -937,8 +952,8 @@ found_inode:
                if (ino <= ROOTINODE || ino >= devinodes(dev))\r
                        goto Corrupt;\r
                --dev->s_tinode;\r
-#if DEBUG > 1\r
kprintf("i_alloc() returning %u, success\n", ino);\r
+#if DEBUG >= 4\r
dprintf(4, "i_alloc() returning %u, success\n", ino);\r
 #endif\r
                return ino;\r
 #if 0 /* remove support for the original UZI filesystem */\r
@@ -949,7 +964,7 @@ found_inode:
        sys_sync();     /* Make on-disk inodes consistent */\r
        k = 0;\r
        blk = 0;\r
-/* kprintf("[ "); */\r
+/* dprintf(2, "[ "); */\r
        while (blk != dev->s_isize) {\r
                if ((bp = buf = (dinode_t *)bread(devno, blk+dev->s_reserv, 0)) == NULL)\r
                        goto Err;\r
@@ -957,7 +972,7 @@ found_inode:
                while (j != DINODESPERBLOCK) {\r
                        if (bp->i_mode == 0 && bp->i_nlink == 0)\r
 /* { */\r
-/* kprintf("%d ", blockinodes(blk) + j); */\r
+/* dprintf(2, "%d ", blockinodes(blk) + j); */\r
                                dev->s_inode[k++] = blockinodes(blk) + j;\r
 /* } */\r
                        if (k == FSFREEINODES) {\r
@@ -973,7 +988,7 @@ found_inode:
                        break;\r
        }\r
 Done:\r
-/* kprintf("] "); */\r
+/* dprintf(2, "] "); */\r
        if (k == 0) {   /* no free inodes on disk */\r
                if (dev->s_tinode)\r
                        goto Corrupt;\r
@@ -987,8 +1002,8 @@ Corrupt:warning(badfsmsg, "i_alloc", devno);
        dev->s_mounted = ~SMOUNTED;     /* mark device as bad */\r
 Err:   udata.u_error = ENOSPC;\r
 Err1:\r
-#if DEBUG > 1\r
kprintf("i_alloc() returning NULLINO, error %u\n", udata.u_error);\r
+#if DEBUG >= 4\r
dprintf(4, "i_alloc() returning NULLINO, error %u\n", udata.u_error);\r
 #endif\r
        return NULLINO;\r
 }\r
@@ -1011,8 +1026,8 @@ blkno_t blk_alloc(dev_t devno, uchar dirty) /* Nick dirty */
        register fsptr dev = getfs(devno);\r
 /* int i; */\r
 \r
-#if DEBUG > 1\r
kprintf("blk_alloc(%u, %u) starting\n", devno, (unsigned)dirty);\r
+#if DEBUG >= 4\r
dprintf(4, "blk_alloc(%u, %u) starting\n", devno, (unsigned)dirty);\r
 #endif\r
 \r
        if (dev->s_ronly) {\r
@@ -1043,17 +1058,17 @@ blkno_t blk_alloc(dev_t devno, uchar dirty) /* Nick dirty */
                goto Corrupt;\r
 #else\r
        nf = dev->s_nfree;\r
-/* kprintf("nf = %u\n", nf); */\r
+/* dprintf(2, "nf = %u\n", nf); */\r
        if (nf <= 0 || nf > FSFREEBLOCKS)\r
 /* { */\r
-/* kprintf("nf out of range\n"); */\r
+/* dprintf(2, "nf out of range\n"); */\r
                goto Corrupt;\r
 /* } */\r
 #endif\r
        if (0 == (newno = dev->s_free[--dev->s_nfree])) {\r
                if (dev->s_tfree != 0)\r
 /* { */\r
-/* kprintf("dev->s_tfree != 0\n"); */\r
+/* dprintf(2, "dev->s_tfree != 0\n"); */\r
                        goto Corrupt;\r
 /* } */\r
                ++dev->s_nfree;\r
@@ -1063,15 +1078,15 @@ blkno_t blk_alloc(dev_t devno, uchar dirty) /* Nick dirty */
        if (dev->s_nfree == 0) {\r
                if ((buf = bread(devno, newno, 0)) == NULL)\r
                        goto Err;\r
-/* kprintf("buf[0] = %u\n", ((blkno_t *)buf)[0]); */\r
+/* dprintf(2, "buf[0] = %u\n", ((blkno_t *)buf)[0]); */\r
                dev->s_nfree = ((blkno_t *)buf)[0];\r
                bcopy(((blkno_t *)buf)+1,dev->s_free,sizeof(dev->s_free));\r
-/* kprintf("< "); */\r
+/* dprintf(2, "< "); */\r
 /* for (i = 0; i < dev->s_nfree; i++) */\r
 /*  { */\r
-/*  kprintf("%u ", dev->s_free[i]); */\r
+/*  dprintf(2, "%u ", dev->s_free[i]); */\r
 /*  } */\r
-/* kprintf("> "); */\r
+/* dprintf(2, "> "); */\r
                if (brelse((bufptr)buf) < 0)\r
                        goto Err;\r
        }\r
@@ -1082,7 +1097,7 @@ found_block:
        validblk(devno, newno);\r
        if (dev->s_tfree == 0)\r
 /* { */\r
-/* kprintf("dev->s_tfree == 0\n"); */\r
+/* dprintf(2, "dev->s_tfree == 0\n"); */\r
                goto Corrupt;\r
 /* } */\r
        --dev->s_tfree;\r
@@ -1095,8 +1110,8 @@ found_block:
        if (bawrite((bufptr)buf) < 0)                   /* write back */\r
 #endif\r
                goto Err;\r
-#if DEBUG > 1\r
kprintf("blk_alloc() returning %u, success\n", newno);\r
+#if DEBUG >= 4\r
dprintf(4, "blk_alloc() returning %u, success\n", newno);\r
 #endif\r
        return newno;\r
 \r
@@ -1104,8 +1119,8 @@ Corrupt:warning(badfsmsg, "blk_alloc", devno);
        dev->s_mounted = ~SMOUNTED;\r
 Err:   udata.u_error = ENOSPC;\r
 Err1:\r
-#if DEBUG > 1\r
kprintf("blk_alloc() returning 0, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "blk_alloc() returning 0, error %u\n", udata.u_error);\r
 #endif\r
        return 0;\r
 }\r
@@ -1123,15 +1138,15 @@ void blk_free(dev_t devno, blkno_t blk)
 #endif\r
        register fsptr dev = getfs(devno);\r
 \r
-#if DEBUG > 1\r
kprintf("blk_free(%u, %u) starting\n", devno, blk);\r
+#if DEBUG >= 4\r
dprintf(4, "blk_free(%u, %u) starting\n", devno, blk);\r
 #endif\r
 \r
        if (dev->s_ronly || blk == 0)\r
  {\r
 End:\r
-#if DEBUG > 1\r
kprintf("blk_free() returning, error\n");\r
+#if DEBUG >= 4\r
dprintf(4, "blk_free() returning, error\n");\r
 #endif\r
                return;\r
  }\r
@@ -1157,8 +1172,8 @@ End:
 \r
                ++dev->s_tfree;\r
 #if 0 /* remove support for the original UZI filesystem */\r
-#if DEBUG > 1\r
kprintf("blk_free() returning, success\n");\r
+#if DEBUG >= 4\r
dprintf(4, "blk_free() returning, success\n");\r
 #endif\r
                return; /* crude way to skip free list processing */\r
                }\r
@@ -1179,8 +1194,8 @@ End:
        ++dev->s_tfree;\r
        dev->s_free[dev->s_nfree++] = blk;\r
 #endif\r
-#if DEBUG > 1\r
kprintf("blk_free() returning, success\n");\r
+#if DEBUG >= 4\r
dprintf(4, "blk_free() returning, success\n");\r
 #endif\r
 }\r
 \r
@@ -1191,16 +1206,16 @@ uchar oft_alloc(void)
        register ofptr op = of_tab;\r
        uchar j = 0;\r
 \r
-#if DEBUG > 1\r
kprintf("oft_alloc() starting\n");\r
+#if DEBUG >= 4\r
dprintf(4, "oft_alloc() starting\n");\r
 #endif\r
 \r
        while (j != OFTSIZE) {\r
                if (op->o_refs == 0) {\r
                        bzero(op, sizeof(oft_t)); /* zero out all fields */\r
                        op->o_refs++;\r
-#if DEBUG > 1\r
kprintf("oft_alloc() returning %u, success\n", (unsigned int)j);\r
+#if DEBUG >= 4\r
dprintf(4, "oft_alloc() returning %u, success\n", (unsigned int)j);\r
 #endif\r
                        return j;\r
                }\r
@@ -1208,8 +1223,8 @@ uchar oft_alloc(void)
                ++j;\r
        }\r
        udata.u_error = ENFILE;\r
-#if DEBUG > 1\r
kprintf("oft_alloc() returning -1, error %u\n", udata.u_error);\r
+#if DEBUG >= 4\r
dprintf(4, "oft_alloc() returning -1, error %u\n", udata.u_error);\r
 #endif\r
        return (-1);\r
 }\r
@@ -1221,16 +1236,16 @@ void oft_deref(uchar of)
 {\r
        register ofptr op = of_tab + of;\r
 \r
-#if DEBUG > 1\r
kprintf("oft_deref(%u) starting\n", (unsigned int)of);\r
+#if DEBUG >= 4\r
dprintf(4, "oft_deref(%u) starting\n", (unsigned int)of);\r
 #endif\r
 \r
        if (--op->o_refs == 0 && op->o_inode != NULL) {\r
                i_deref(op->o_inode);\r
                op->o_inode = NULL;\r
        }\r
-#if DEBUG > 1\r
kprintf("oft_deref() returning, refs %u\n", op->o_refs);\r
+#if DEBUG >= 4\r
dprintf(4, "oft_deref() returning, refs %u\n", op->o_refs);\r
 #endif\r
 }\r
 \r
@@ -1241,15 +1256,15 @@ uchar uf_alloc(void)
        register uchar j = 0;\r
        register uchar *p = udata.u_files;\r
 \r
-#if DEBUG > 1\r
kprintf("uf_alloc() starting\n");\r
+#if DEBUG >= 4\r
dprintf(4, "uf_alloc() starting\n");\r
 #endif\r
 \r
        while (j != UFTSIZE) {\r
                if (freefileentry(*p))\r
  {\r
-#if DEBUG > 1\r
kprintf("uf_alloc() returning %u, success\n", (unsigned int)j);\r
+#if DEBUG >= 4\r
dprintf(4, "uf_alloc() returning %u, success\n", (unsigned int)j);\r
 #endif\r
                        return j;\r
  }\r
@@ -1257,8 +1272,8 @@ uchar uf_alloc(void)
                ++j;\r
        }\r
        udata.u_error = ENFILE;\r
-#if DEBUG > 1\r
kprintf("uf_alloc() returning -1, error %u\n", udata.u_error);\r
+#if DEBUG >= 4\r
dprintf(4, "uf_alloc() returning -1, error %u\n", udata.u_error);\r
 #endif\r
        return (-1);\r
 }\r
@@ -1280,8 +1295,8 @@ uchar isdevice(inoptr ino)
  */\r
 void freeblk(dev_t dev, blkno_t blk, uchar level)\r
 {\r
-#if DEBUG > 2\r
kprintf("freeblk(%u, %u, %u) starting\n", dev, blk, (unsigned int)level);\r
+#if DEBUG >= 3\r
dprintf(3, "freeblk(%u, %u, %u) starting\n", dev, blk, (unsigned int)level);\r
 #endif\r
 \r
        if (blk != 0) {\r
@@ -1298,14 +1313,14 @@ void freeblk(dev_t dev, blkno_t blk, uchar level)
                        }\r
                }\r
                blk_free(dev, blk);\r
-#if DEBUG > 2\r
kprintf("freeblk() returning, success\n");\r
+#if DEBUG >= 3\r
dprintf(3, "freeblk() returning, success\n");\r
 #endif\r
        }\r
-#if DEBUG > 2\r
+#if DEBUG >= 3\r
  else\r
   {\r
-  kprintf("freeblk() returning, error\n");\r
+  dprintf(3, "freeblk() returning, error\n");\r
   }\r
 #endif\r
 }\r
@@ -1320,8 +1335,8 @@ void f_trunc(inoptr ino)
        blkno_t *blk = ip->i_addr;\r
        register uchar j;\r
 \r
-#if DEBUG > 1\r
kprintf("f_trunc(%u) starting\n", ino - i_tab);\r
+#if DEBUG >= 3\r
dprintf(3, "f_trunc(%u) starting\n", ino - i_tab);\r
 #endif\r
 \r
        /* First deallocate the double indirect blocks */\r
@@ -1337,8 +1352,8 @@ void f_trunc(inoptr ino)
        bzero(ip->i_addr, sizeof(blkno_t)*TOTALREFBLOCKS);\r
        ino->c_dirty = 1;\r
        ip->i_size = 0;\r
-#if DEBUG > 1\r
kprintf("f_trunc() returning\n");\r
+#if DEBUG >= 3\r
dprintf(3, "f_trunc() returning\n");\r
 #endif\r
 }\r
 \r
@@ -1354,15 +1369,15 @@ blkno_t bmap(inoptr ip, blkno_t bn, uchar rdflg)
        register uint i, j, sh;\r
        register blkno_t *bp, nb;\r
 \r
-#if DEBUG > 1\r
kprintf("bmap(%u, %u, %u) starting\n", ip - i_tab, bn, (unsigned int)rdflg);\r
-/* kprintf("xx %u %u\n", i_tab[38].c_node.i_addr[3], udata.u_page); */\r
+#if DEBUG >= 3\r
dprintf(3, "bmap(%u, %u, %u) starting\n", ip - i_tab, bn, (unsigned int)rdflg);\r
+/* dprintf(2, "xx %u %u\n", i_tab[38].c_node.i_addr[3], udata.u_page); */\r
 #endif\r
 \r
        if (isdevice(ip))       /* block devices */\r
  {\r
-#if DEBUG > 1\r
kprintf("bmap() returning %u, direct\n", bn);\r
+#if DEBUG >= 3\r
dprintf(3, "bmap() returning %u, direct\n", bn);\r
 #endif\r
                return bn;      /* map directly */\r
  }\r
@@ -1406,8 +1421,8 @@ blkno_t bmap(inoptr ip, blkno_t bn, uchar rdflg)
                if ((bp = (blkno_t *)bread(dev, nb, 0)) == NULL)\r
  {\r
 Err:\r
-#if DEBUG > 1\r
kprintf("bmap() returning NULLBLK, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "bmap() returning NULLBLK, error %u\n", udata.u_error);\r
 #endif\r
                        return NULLBLK;\r
  }\r
@@ -1435,8 +1450,8 @@ Err:
                ++j;\r
        }\r
 Ok:\r
-#if DEBUG > 1\r
kprintf("bmap() returning %u, success\n", nb);\r
+#if DEBUG >= 3\r
dprintf(3, "bmap() returning %u, success\n", nb);\r
 #endif\r
        return nb;\r
 }\r
@@ -1546,11 +1561,11 @@ Ok:     fp->s_mounted = ~SMOUNTED;
  register int i;\r
  for (i = SUPERBLOCK; i < 0x400; ++i)\r
   {\r
-  kprintf("reading sector 0x%x\n", i);\r
+  dprintf(2, "reading sector 0x%x\n", i);\r
   buf = bread(dev, i, 0);\r
   if (*(int *)buf == SMOUNTED)\r
    {\r
-   kprintf("formatted at sector 0x%x\n", i - SUPERBLOCK);\r
+   dprintf(2, "formatted at sector 0x%x\n", i - SUPERBLOCK);\r
    panic("stop");\r
    }\r
   brelse((bufptr)buf);\r
index be33170..fae005f 100644 (file)
@@ -54,7 +54,7 @@
 #define HD0_Start 0            /* sentinel value indicating the ramdrive */\r
 #define HD0_Size  0x600                /* define a harddrive of size 768 kbytes */\r
 \r
-#define HD1_Start 0x39 /*0x239 /*0x259 /*0x2bb /* just after HYTDISK.DAT finishes */\r
+#define HD1_Start 0x59 /*0x239 /*0x259 /*0x2bb /* just after HYTDISK.DAT finishes */\r
 #define HD1_Size  0x2000       /* define a harddrive of size 4 Mbytes */\r
 #else\r
 #define HD0_Start 3000    /* 1st Drive Start.  CP/M uses first 3000 "tracks" */\r
index 1a32788..a66309c 100644 (file)
@@ -176,7 +176,7 @@ void kputs(s)
 #endif\r
 #endif\r
 \r
-#if DEBUG > 0\r
+#if DEBUG >= 1\r
 /* _idump() dumps state of all inodes\r
  */\r
 static void _idump(void)\r
index eb3c286..229c500 100644 (file)
@@ -1,6 +1,6 @@
 /* main.c for uzi180 by Nick - initialises CMX and then starts UZI as a task */\r
 \r
-#define POLLED /* causes console I/O to be output via abyte() */\r
+/* #define POLLED */ /* causes console I/O to be output via abyte() */\r
 \r
 #include "vendor.h" /* Nick, must come first */\r
 #include <cxfuncs.h>\r
@@ -429,12 +429,12 @@ int scsiop(void)
   return 0;\r
 #endif\r
 \r
-#if DEBUG > 1\r
      kprintf("scsiop: %c %u+%u,%u -> 0x%x\n", cmdblk[1],\r
-                                                (unsigned int)hd_sector,\r
-                                                (unsigned int)hd_offset,\r
-                                                (unsigned int)cmdblk[7],\r
-                                                (unsigned int)dptr);\r
+#if DEBUG >= 2\r
dprintf(2, "scsiop: %c %u+%u,%u -> 0x%x\n", cmdblk[1],\r
+                                            (unsigned int)hd_sector,\r
+                                            (unsigned int)hd_offset,\r
+                                            (unsigned int)cmdblk[7],\r
+                                            (unsigned int)dptr);\r
 #endif\r
 \r
        /* check for special hd_offset indicating the ramdrive is wanted */\r
@@ -447,11 +447,11 @@ int scsiop(void)
                switch(cmdblk[1])\r
                        {\r
                case 'R':\r
-/* kprintf("R %08lx -> %08lx, %04x\n", hd_sector, hd_offset, j); */\r
+/* dprintf(2, "R %08lx -> %08lx, %04x\n", hd_sector, hd_offset, j); */\r
                        copyr(hd_sector, hd_offset, j);\r
                        break;\r
                case 'W':\r
-/* kprintf("W %08lx -> %08lx, %04x\n", hd_offset, hd_sector, j); */\r
+/* dprintf(2, "W %08lx -> %08lx, %04x\n", hd_offset, hd_sector, j); */\r
                        copyr(hd_offset, hd_sector, j);\r
                        break;\r
                        }\r
index 5ed822f..98c7887 100644 (file)
@@ -72,7 +72,7 @@ init2()
        /* User's file table\r
         */\r
     for (j=udata.u_files; j < (udata.u_files+UFTSIZE); ++j)\r
-        *j = -1;\r
+        *j = -1; /* please see freefileentry() macro in unix.h */\r
 \r
 /* abyte('c'); */\r
     ei_absolute(); /* Nick */\r
@@ -277,6 +277,9 @@ ptptr p;
 {\r
     register char *j;\r
 \r
+/* abyte('['); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+\r
     /* Note that ptab_alloc clears most of the entry */\r
     di_absolute(); /* Nick */\r
     /* p_swap is replaced by p_page for UZI180 Banked memory access.  It is\r
@@ -317,10 +320,22 @@ ptptr p;
     p->p_priority = MAXTICKS;\r
 #endif\r
 \r
+/* abyte('\\'); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+/* di_absolute(); */\r
+\r
     for (j=udata.u_files; j < (udata.u_files+UFTSIZE); ++j)\r
+#if 1 /* Nick, to sidestep signed vs unsigned char issues */\r
+       if (freefileentry(*j) == 0)\r
+#else\r
         if (*j >= 0)\r
+#endif\r
            ++of_tab[*j].o_refs;\r
     ei_absolute(); /* Nick */\r
+\r
+/* abyte(']'); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+\r
 }\r
 \r
 \r
@@ -335,6 +350,9 @@ ptab_alloc()
     register ptptr pp;\r
     static int nextpid = 0;\r
 \r
+/* abyte('('); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+\r
     di_absolute(); /* Nick */\r
     for (p=ptab; p < ptab+PTABSIZE; ++p)\r
     {\r
@@ -342,6 +360,14 @@ ptab_alloc()
             goto found;\r
     }\r
     ei_absolute(); /* Nick */\r
+\r
+#if DEBUG >= 2 /* Nick */\r
+    dprintf(2, "process table full\n");\r
+#endif\r
+\r
+/* abyte('*'); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+\r
     return (NULL);\r
 \r
 found:\r
@@ -364,6 +390,14 @@ nogood:
     p->p_status = P_FORKING;\r
 \r
     ei_absolute(); /* Nick */\r
+\r
+#if DEBUG >= 2 /* Nick */\r
+    dprintf(2, "process %d starting\n", p->p_pid);\r
+#endif\r
+\r
+/* abyte(')'); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+\r
     return (p);\r
 }\r
 \r
@@ -457,7 +491,7 @@ unix2()
     ei_absolute(); /* Nick */\r
 /* abyte('1'); */\r
 \r
-#if DEBUG > 0 && !defined(UTIL)\r
+#if DEBUG && !defined(UTIL)\r
     if (traceon)\r
         {\r
 #if 1\r
@@ -476,7 +510,7 @@ unix2()
         udata.u_retval = (*disp_tab[udata.u_callno])();\r
 /* abyte('3'); */\r
 \r
-#if DEBUG > 0 && !defined(UTIL)\r
+#if DEBUG && !defined(UTIL)\r
     if (traceon)\r
         {\r
 #if 1\r
@@ -535,8 +569,8 @@ chksigs()
         if (udata.u_sigvec[j] == SIG_DFL)\r
         {\r
             ei_absolute(); /* Nick */\r
-#ifdef DEBUG\r
-            kprintf("process terminated by signal %d: ", j); /* Nick %d */\r
+#if DEBUG >= 2\r
+            dprintf(2, "process terminated by signal %d: ", j); /* Nick %d */\r
 #endif\r
             doexit (0, j);\r
         }\r
index c6414fe..467b352 100644 (file)
@@ -949,12 +949,12 @@ inoptr n_creat(char *name, bool_t new, mode_t mode)
 #if 1\r
        char fname[15];\r
 #endif\r
-#if DEBUG > 1\r
+#if DEBUG >= 3\r
  char *buf;\r
 \r
  buf = tmpbuf();\r
  ugets(name, buf, 512);\r
kprintf("n_creat(\"%s\", %d, 0%o)\n", buf, new, mode);\r
dprintf(3, "n_creat(\"%s\", %d, 0%o)\n", buf, new, mode);\r
  brelse((bufptr)buf);\r
 #endif\r
 \r
@@ -1023,16 +1023,16 @@ inoptr n_creat(char *name, bool_t new, mode_t mode)
 #else\r
                goto Err;\r
 #endif\r
-#if DEBUG > 1\r
kprintf("n_creat() returning %u, success\n", ino - i_tab);\r
+#if DEBUG >= 3\r
dprintf(3, "n_creat() returning %u, success\n", ino - i_tab);\r
 #endif\r
        return ino;\r
 \r
 Err1:  i_deref(parent);\r
 Err:   if (ino)\r
                i_deref(ino);\r
-#if DEBUG > 1\r
kprintf("n_creat() returning NULL, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "n_creat() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
        return NULL;\r
 }\r
@@ -1049,14 +1049,14 @@ void readwritei(char write, inoptr ino)
        dev_t dev = ino->c_dev;\r
        bool_t ispipe = 0;\r
 \r
-#if DEBUG > 1\r
kprintf("readwritei(%u, %u) starting\n", (unsigned int)write, ino - i_tab);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei(%u, %u) starting\n", (unsigned int)write, ino - i_tab);\r
 #endif\r
 \r
        if (write && ino->c_ro) {\r
                UERR = EROFS;\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                return;\r
        }\r
@@ -1065,8 +1065,8 @@ void readwritei(char write, inoptr ino)
                UCNT = write ? cdwrite(DEVNUM(ino)) : cdread(DEVNUM(ino));\r
                if ((int)UCNT != -1)\r
                        addoff(&UOFFS, UCNT);\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                return;\r
        case S_IFLNK:   /* sym link */\r
@@ -1081,8 +1081,8 @@ void readwritei(char write, inoptr ino)
                        /* See if offset is beyond end of file */\r
                        if ((unsigned long)UOFFS >= (unsigned long)ISIZE(ino)) {\r
                                UCNT = 0;\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                                return;\r
                        }\r
@@ -1102,8 +1102,8 @@ void readwritei(char write, inoptr ino)
                                        UCNT = -1;\r
                                        UERR = EPIPE;\r
                                        ssig(udata.u_ptab, SIGPIPE);\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                                        return;\r
                                }\r
@@ -1151,8 +1151,8 @@ loop:             while (todo) {
                                         * it's not really an error. it just means EOF... */\r
                                        if (UERR == EFAULT)\r
                                                UERR = 0;\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                                        return;\r
                                }\r
@@ -1172,8 +1172,8 @@ loop:             while (todo) {
                                bp = bread(dev, pblk, (amount == BUFSIZE));\r
                                if (bp == NULL)\r
  {\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                                        return;\r
  }\r
@@ -1191,8 +1191,8 @@ loop:             while (todo) {
 #endif\r
                                if (bfree((bufptr)bp, 2) < 0)\r
  {\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                                        return;\r
  }\r
@@ -1211,8 +1211,8 @@ loop:             while (todo) {
 #endif\r
                                if (brelse((bufptr)bp) < 0)\r
  {\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                                        return;\r
  }\r
@@ -1240,16 +1240,16 @@ loop:           while (todo) {
                                ino->c_dirty = 1;\r
                        }\r
                }\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, success\n");\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, success\n");\r
 #endif\r
                return;\r
        default:\r
 error:         UERR = ENODEV;\r
                if (!write)\r
                        UCNT = -1;\r
-#if DEBUG > 1\r
kprintf("readwritei() returning, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "readwritei() returning, error %u\n", udata.u_error);\r
 #endif\r
                return;\r
        }\r
@@ -1261,16 +1261,16 @@ inoptr rwsetup(uchar fd, void *base, uint cnt, uchar rdflag)
        register inoptr ino;\r
        register ofptr oftp;\r
 \r
-#if DEBUG > 1\r
kprintf("rwsetup(%u, 0x%x, %u, %u) starting\n",\r
+#if DEBUG >= 3\r
dprintf(3, "rwsetup(%u, 0x%x, %u, %u) starting\n",\r
          (unsigned int)fd, base, cnt, (unsigned int)rdflag);\r
 #endif\r
 \r
        if ((ino = getinode(fd)) == NULL)       /* check fd */\r
  {\r
 Err1:\r
-#if DEBUG > 1\r
kprintf("rwsetup() returning NULL, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "rwsetup() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
                return NULL;\r
  }\r
@@ -1287,8 +1287,8 @@ Err1:
 #if 1 /* Nick */\r
        udata.u_sysio = 0;      /* transfer is to be done on behalf of user */\r
 #endif\r
-#if DEBUG > 1\r
kprintf("rwsetup() returning %u, success\n", ino - i_tab);\r
+#if DEBUG >= 3\r
dprintf(3, "rwsetup() returning %u, success\n", ino - i_tab);\r
 #endif\r
        return ino;\r
 }\r
@@ -1322,7 +1322,7 @@ int pdat(struct s_pdata *ubuf) {
                        bcopy(tmpbuf->u_name, ubuf->u_name, DIRNAMELEN);\r
                        ubuf->u_insys = tmpbuf->u_insys;\r
                        ubuf->u_callno = tmpbuf->u_callno;\r
-#if DEBUG > 1\r
+#if DEBUG\r
                        ubuf->u_traceme = tmpbuf->u_traceme;\r
 #else\r
                        ubuf->u_traceme = 0;\r
index 3635a15..33c691f 100644 (file)
@@ -318,15 +318,19 @@ int16 val2;
     register int16 j;\r
     register ptptr p;\r
 \r
-#if DEBUG > 1\r
-    kprintf ("process %d exiting\n", udata.u_ptab->p_pid);\r
+#if DEBUG >= 2\r
+    dprintf(2, "process %d exiting\n", udata.u_ptab->p_pid);\r
 #endif\r
 \r
     di();\r
 \r
     for (j=0; j < UFTSIZE; ++j)\r
     {\r
+#if 1 /* Nick, to sidestep signed vs unsigned char issues */\r
+       if (freefileentry(udata.u_files[j]) == 0)\r
+#else\r
         if (udata.u_files[j] >= 0)      /* Portable equivalent of == -1 */\r
+#endif\r
             doclose (j);\r
     }\r
 \r
@@ -347,7 +351,7 @@ int16 val2;
     /* See if we have any children. Set child's parents to our parent */\r
     for (p=ptab; p < ptab+PTABSIZE; ++p)\r
     {\r
-        if (p->p_status  &&  p->p_pptr == udata.u_ptab  &&  p != udata.u_ptab)\r
+        if (p->p_status && p->p_pptr == udata.u_ptab && p != udata.u_ptab)\r
             p->p_pptr = udata.u_ptab->p_pptr;\r
     }\r
     ei();\r
@@ -597,13 +601,21 @@ int sys_getset(void)
                udata.u_mask = parm1 & S_UMASK;\r
                return old;\r
        case SET_TRACE:\r
-#if DEBUG > 1\r
-               if (parm1 < 0)                  traceon = 1;\r
-               else if (parm1 > 0)             udata.u_traceme = 1;\r
-               else if (udata.u_traceme)       udata.u_traceme = 0;\r
-               else                            traceon = 0;\r
+#if DEBUG\r
+               old = udata.u_traceme;\r
+               udata.u_traceme = parm1;\r
+               return old;\r
+#else\r
+               goto Ok;\r
 #endif\r
+       case SET_DEBUG:\r
+#if DEBUG\r
+               old = udata.u_debugme;\r
+               udata.u_debugme = parm1;\r
+               return old;\r
+#else\r
                goto Ok;\r
+#endif\r
        }\r
        UERR = EPERM;\r
 Err:   return (-1);\r
index ffae234..68c3e7d 100644 (file)
@@ -180,6 +180,9 @@ void systrace_entry(void)
        unsigned int value;\r
        unsigned char type;\r
 \r
+/* abyte('{'); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+\r
 /* kprintf("word at 0x83f8 = 0x%x\n", ugetw(0x83f8)); */\r
 \r
         kprintf ("\tpid %d, call %d",\r
@@ -219,6 +222,9 @@ void systrace_exit(void)
        {\r
        register unsigned char type;\r
 \r
+/* abyte('}'); */\r
+/* ahexw(*(int *)(0xc931 + 0x9a)); */\r
+\r
         kprintf ("\t\tpid %d, call %d, ret ",\r
                 udata.u_ptab->p_pid, udata.u_callno);\r
 \r
index d75b5c5..4ec9c3d 100644 (file)
@@ -709,7 +709,8 @@ typedef struct u_data {
     uzitime_t      u_cstime;\r
     char        u_page;         /* Process' MMU Base Address */\r
     inoptr      u_root;         /* Index into inode table of chroot target */\r
-    char        u_traceme;     /* added by Nick, used only when DEBUG > 1 */\r
+    char        u_traceme;     /* added by Nick, used only ifdef DEBUG */\r
+    char        u_debugme;     /* added by Nick, used only ifdef DEBUG */\r
 #if 1\r
     char        u_files[UFTSIZE];       /* Process file table:\r
                                   indices into open file table. */\r
@@ -962,6 +963,7 @@ typedef struct s_kdata {
 #define        SET_PRIO        9       /* set process priority */\r
 #define        SET_UMASK       10      /* get/set umask */\r
 #define        SET_TRACE       11      /* set trace flag */\r
+#define        SET_DEBUG       12      /* set debug flag */\r
 \r
 #endif\r
 \r
index 1884199..32434c4 100644 (file)
@@ -18,6 +18,7 @@
 #define di_absolute _di_absolute\r
 #define doexec _doexec\r
 #define dofork _dofork\r
+#define dprintf _dprintf\r
 #define dptr _dptr\r
 #define dTbl _dTbl\r
 #define ei _ei\r
@@ -64,6 +65,7 @@
 \r
 #if 1 /* Nick, see kprintf.c */\r
 int kprintf(char *, ...); /* ensures IAR won't try to pass register params */\r
+int dprintf(char debuglevel, char *fmt, ...);\r
 #else\r
 void kprintf(char *, ...); /* ensures IAR won't try to pass register params */\r
 #endif\r
index 1f4e3ef..af25ba8 100644 (file)
 #include "filesys.h" /* prototypes added by Nick */\r
 #include "xip.h" /* prototypes added by Nick */\r
 \r
+#if 0\r
+#undef DEBUG\r
+#define DEBUG 3 /* TEMPORARY! */\r
+#endif\r
+\r
 #ifdef UTIL /* rather a hack indeed */\r
 #define        EISALIGN        42              /* 42 File is already aligned */\r
 #define        ENOALIGN        43              /* 43 File is not aligned */\r
@@ -63,8 +68,8 @@ int bitmap_align(inoptr ino, off_t size)
        inoptr other;\r
        int flag, exclude, indirection;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_align(%u, %ld) starting\n", ino - i_tab, size);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align(%u, %ld) starting\n", ino - i_tab, size);\r
 #endif\r
 \r
 /* return 0; */\r
@@ -75,8 +80,8 @@ int bitmap_align(inoptr ino, off_t size)
        if (dev->s_bitmap_immov >= dev->s_bitmap_final)\r
                {\r
                udata.u_error = ENOLCKFS; /* not a locking filesystem */\r
-#if DEBUG > 2\r
kprintf("bitmap_align() returning -1 a\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align() returning -1 a\n");\r
 #endif\r
                return -1;\r
                }\r
@@ -90,8 +95,8 @@ int bitmap_align(inoptr ino, off_t size)
        if ((ino->c_node.i_mode & S_IFMT) != S_IFREG)\r
                {\r
                udata.u_error = ENOREGALIGN; /* file not regular or aligned */\r
-#if DEBUG > 2\r
kprintf("bitmap_ualign() returning -1 b\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_ualign() returning -1 b\n");\r
 #endif\r
                return -1;\r
                }\r
@@ -101,8 +106,8 @@ int bitmap_align(inoptr ino, off_t size)
        if (regions > (BUFSIZE / sizeof(blkno_t)))\r
                {\r
                udata.u_error = ENOSPC; /* size specified is too large */\r
-#if DEBUG > 2\r
kprintf("bitmap_align() returning -1 c\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align() returning -1 c\n");\r
 #endif\r
                return -1;\r
                }\r
@@ -149,7 +154,7 @@ int bitmap_align(inoptr ino, off_t size)
                }\r
 \r
 #if DEBUG > 1\r
kprintf("processing my inode %d\n", ino->c_num);\r
dprintf(2, "processing my inode %d\n", ino->c_num);\r
 #endif\r
 \r
        /* move the file's data into unoccupied blocks of each region */\r
@@ -235,13 +240,15 @@ int bitmap_align(inoptr ino, off_t size)
                        }\r
 \r
 #if DEBUG > 1\r
kprintf("processing other inode %d\n", other->c_num);\r
dprintf(2, "processing other inode %d\n", other->c_num);\r
 #endif\r
+#if 0 /* don't bother, since the S_IFMT bits will be invalid anyway */\r
                if (other->c_node.i_mode == 0)\r
                        {\r
                        i_deref(other);\r
                        continue; /* inode bitmap is bad, try to continue */\r
                        }\r
+#endif\r
 \r
                /* check mode */\r
                flag = other->c_node.i_mode & S_IFMT;\r
@@ -282,7 +289,7 @@ int bitmap_align(inoptr ino, off_t size)
                                        indirection = 2;\r
                                        }\r
                                blk = other->c_node.i_addr[i];\r
- if (blk == 3840) kprintf("bad @ %d,%d 0x%04x\n", other->c_num, i, &other->c_node.i_addr[i]);\r
+/* if (blk == 3840) dprintf(3, "bad @ %d,%d 0x%04x\n", other->c_num, i, &other->c_node.i_addr[i]); */\r
                                if (blk)\r
                                        {\r
                                        pos = bitmap_align_recurse(dev, /*pos,*/\r
@@ -342,8 +349,8 @@ bitmap_align_error:
                                       dev->s_bitmap_final);\r
                        }\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_align() returning -1 d\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align() returning -1 d\n");\r
 #endif\r
                return -1;\r
                }\r
@@ -352,8 +359,8 @@ bitmap_align_error:
        ino->c_dirty = 1;\r
        i_sync();       /* flushing inodes */\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_align() returning 0, success\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align() returning 0, success\n");\r
 #endif\r
        return 0; /* successfully aligned the file */\r
        }\r
@@ -365,8 +372,8 @@ int bitmap_ualign(inoptr ino, off_t size)
        fsptr dev;\r
        dev_t devno;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_ualign(%u, %ld) starting\n", ino - i_tab, size);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_ualign(%u, %ld) starting\n", ino - i_tab, size);\r
 #endif\r
 \r
        /* prepare to access the given inode */\r
@@ -377,8 +384,8 @@ int bitmap_ualign(inoptr ino, off_t size)
        region = bitmap_examine(dev, ino, size, &regions, &blocks);\r
        if (region == NULL)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_ualign() returning -1 a\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_ualign() returning -1 a\n");\r
 #endif\r
                return -1; /* error code has been setup by bitmap_examine() */\r
                }\r
@@ -397,8 +404,8 @@ int bitmap_ualign(inoptr ino, off_t size)
                        {\r
                        /* disk i/o error, or corrupt filesystem */\r
                        /* udata.u_error = ENXIO */;\r
-#if DEBUG > 2\r
kprintf("bitmap_ualign() returning -1 f\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_ualign() returning -1 f\n");\r
 #endif\r
                        return -1;\r
                        }\r
@@ -415,8 +422,8 @@ int bitmap_ualign(inoptr ino, off_t size)
        ino->c_dirty = 1;\r
        i_sync();       /* flushing inodes */\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_ualign() returning 0\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_ualign() returning 0\n");\r
 #endif\r
        return 0;\r
        }\r
@@ -428,11 +435,16 @@ blkno_t *bitmap_examine(fsptr dev, inoptr ino, off_t size,
        blkno_t blk, pos, /*inc,*/ newno;\r
        blkno_t *region, regions, blocks;\r
 \r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_examine(%d, %d, %ld, 0x%x, 0x%x) starting\n",\r
+         dev - fs_tab, ino - i_tab, size, regioncount, blockcount);\r
+#endif\r
+\r
        if (dev->s_bitmap_immov >= dev->s_bitmap_final)\r
                {\r
                udata.u_error = ENOLCKFS; /* not a locking filesystem */\r
-#if DEBUG > 2\r
kprintf("bitmap_examine() returning NULL a\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_examine() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
                return NULL;\r
                }\r
@@ -441,16 +453,16 @@ blkno_t *bitmap_examine(fsptr dev, inoptr ino, off_t size,
        if ((ino->c_node.i_mode & S_IFMT) == S_IFREG)\r
                {\r
                udata.u_error = ENOALIGN; /* file is not aligned */\r
-#if DEBUG > 2\r
kprintf("bitmap_examine() returning NULL b\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_examine() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
                return NULL;\r
                }\r
        if ((ino->c_node.i_mode & S_IFMT) != S_IFALIGN)\r
                {\r
                udata.u_error = ENOREGALIGN; /* file not regular or aligned */\r
-#if DEBUG > 2\r
kprintf("bitmap_examine() returning NULL c\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_examine() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
                return NULL;\r
                }\r
@@ -460,8 +472,8 @@ blkno_t *bitmap_examine(fsptr dev, inoptr ino, off_t size,
        if (regions > (BUFSIZE / sizeof(blkno_t)))\r
                {\r
                udata.u_error = ENOSPC; /* size specified is too large */\r
-#if DEBUG > 2\r
kprintf("bitmap_examine() returning NULL c\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_examine() returning NULL, error %u\n", udata.u_error);\r
 #endif\r
                return NULL;\r
                }\r
@@ -484,8 +496,8 @@ blkno_t *bitmap_examine(fsptr dev, inoptr ino, off_t size,
                if ((blk & (PAGE_BLOCKS-1)) || blk == NULLBLK)\r
                        {\r
                        udata.u_error = ENOALIGN; /* alignment bad */\r
-#if DEBUG > 2\r
kprintf("bitmap_examine() returning NULL d\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_examine() returning NULL, error %u a\n", udata.u_error);\r
 #endif\r
                        return NULL;\r
                        }\r
@@ -500,8 +512,8 @@ blkno_t *bitmap_examine(fsptr dev, inoptr ino, off_t size,
                        if (newno != blk) /*|| newno == NULLBLK)*/\r
                                {\r
                                udata.u_error = ENOALIGN; /* alignment bad */\r
-#if DEBUG > 2\r
kprintf("bitmap_examine() returning NULL e\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_examine() returning NULL, error %u b\n", udata.u_error);\r
 #endif\r
                                return NULL;\r
                                }\r
@@ -511,6 +523,9 @@ blkno_t *bitmap_examine(fsptr dev, inoptr ino, off_t size,
 \r
        *regioncount = regions;\r
        *blockcount = blocks;\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_examine() returning 0x%x (%d, %d)\n", region, regions, blocks);\r
+#endif\r
        return region;\r
        }\r
 \r
@@ -521,12 +536,17 @@ blkno_t bitmap_align_chase(fsptr dev, inoptr ino, blkno_t blk, blkno_t pos,
        int i, occupied;\r
        bufptr buf, other;\r
 \r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_chase(%d, %d, %d, %d, 0x%x, %d, %d) starting\n",\r
+         dev - fs_tab, ino - i_tab, blk, pos, region, regions, blocks);\r
+#endif\r
+\r
        /* check we have been passed a valid block number */\r
        if (blk < (dev->s_reserv + dev->s_isize) || blk >= dev->s_fsize)\r
                {\r
                udata.u_error = ECORRUPTFS;\r
-#if DEBUG > 0\r
kprintf("bitmap_align_chase() 1 ino = %d, blk = %d, pos = %d\n",\r
+#if DEBUG\r
dprintf(1, "bitmap_align_chase() 1 ino = %d, blk = %d, pos = %d\n",\r
          ino->c_num, blk, pos);\r
 #endif\r
                return (blkno_t)-1; /* filesystem is corrupt */\r
@@ -548,9 +568,12 @@ blkno_t bitmap_align_chase(fsptr dev, inoptr ino, blkno_t blk, blkno_t pos,
                                blk >= dev->s_fsize)\r
                        {\r
                        udata.u_error = ECORRUPTFS;\r
-#if DEBUG > 0\r
kprintf("bitmap_align_chase() 2 ino = %d, blk = %d, pos = %d\n",\r
+#if DEBUG\r
dprintf(1, "bitmap_align_chase() 2 ino = %d, blk = %d, pos = %d\n",\r
          ino->c_num, blk, pos);\r
+#endif\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_chase() returning -1, error %u\n", udata.u_error);\r
 #endif\r
                        return (blkno_t)-1; /* filesystem is corrupt */\r
                        }\r
@@ -559,6 +582,9 @@ blkno_t bitmap_align_chase(fsptr dev, inoptr ino, blkno_t blk, blkno_t pos,
                pos = bitmap_align_reverse(blk, region, regions, blocks);\r
                if (pos == (blkno_t)-1)\r
                        {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_chase() returning %d, ok\n", blk);\r
+#endif\r
                        return blk; /* success, return the just-freed block */\r
                        }\r
 \r
@@ -573,8 +599,8 @@ blkno_t bitmap_align_bmap(inoptr ino, blkno_t newno, blkno_t pos)
        blkno_t blk;\r
        bufptr buf, other;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_align_bmap(%u, %u) starting\n", ino - i_tab, pos);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align_bmap(%u, %u) starting\n", ino - i_tab, pos);\r
 #endif\r
 \r
        devno = ino->c_dev;\r
@@ -639,8 +665,8 @@ blkno_t bitmap_align_bmap(inoptr ino, blkno_t newno, blkno_t pos)
        if (buf == NULL)\r
                {\r
 Err:\r
-#if DEBUG > 2\r
kprintf("bitmap_align_bmap() returning -1, error %u\n", udata.u_error);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align_bmap() returning -1, error %u\n", udata.u_error);\r
 #endif\r
                return (blkno_t)-1;\r
                }\r
@@ -665,29 +691,29 @@ Ok:
                goto Err;\r
                }\r
 \r
-#if DEBUG > 2\r
kprintf("getting block %d -> %d, errno = %d\n", blk, newno, udata.u_error);\r
+#if DEBUG >= 2\r
dprintf(2, "getting block %d -> %d, errno = %d\n", blk, newno, udata.u_error);\r
 #endif\r
 \r
        /* really move the block by manipulating cache entries */\r
        other = (bufptr)bfind(devno, newno); /* hanging around in cache? */\r
        if (other)\r
                {\r
-/* kprintf("bufpool entry %d = block %d, dirty 0\n", other - bufpool, blk); */\r
+/* dprintf(3, "bufpool entry %d = block %d, dirty 0\n", other - bufpool, blk); */\r
                other->bf_blk = blk; /* swap, for minimal overhead */\r
                other->bf_dirty = 0; /* try to avoid writing back */\r
                }\r
 \r
        /* revise the original cache entry to show the new block */\r
        buf->bf_blk = newno; /* original value is in variable blk */\r
-/* kprintf("bufpool entry %d = block %d, dirty 1\n", buf - bufpool, newno); */\r
+/* dprintf(3, "bufpool entry %d = block %d, dirty 1\n", buf - bufpool, newno); */\r
        if (bawrite(buf) < 0) /* dirty, but delay writing for the moment */\r
                {\r
                goto Err;\r
                }\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_align_bmap() returning %u, success\n", blk);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_align_bmap() returning %u, success\n", blk);\r
 #endif\r
        return blk;\r
 }\r
@@ -698,8 +724,8 @@ blkno_t bitmap_align_reverse(blkno_t blk,
        blkno_t i, k;\r
        blkno_t pos;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_align_reverse(%u) starting\n", blk);\r
+#if DEBUG > 3\r
dprintf(4, "bitmap_align_reverse(%u) starting\n", blk);\r
 #endif\r
 \r
        /* perform a reverse lookup of blk via the region list */\r
@@ -714,8 +740,8 @@ blkno_t bitmap_align_reverse(blkno_t blk,
                        {\r
                        /* yes, return the computed logical pos in file */\r
                        pos += blk - region[i];\r
-#if DEBUG > 2\r
kprintf("bitmap_align_reverse() returning %u, found\n", pos);\r
+#if DEBUG > 3\r
dprintf(4, "bitmap_align_reverse() returning %u, found\n", pos);\r
 #endif\r
                        return pos;\r
                        }\r
@@ -725,8 +751,8 @@ blkno_t bitmap_align_reverse(blkno_t blk,
                }\r
 \r
        /* the given blk was not found in any region of the list */\r
-#if DEBUG > 2\r
kprintf("bitmap_align_reverse() returning -1, not found\n");\r
+#if DEBUG > 3\r
dprintf(4, "bitmap_align_reverse() returning -1, not found\n");\r
 #endif\r
        return -1;\r
        }\r
@@ -745,15 +771,25 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
        char tempdirty;\r
        blkno_t pos, chase;\r
 \r
+#if DEBUG > 3\r
+ dprintf(4, "bitmap_align_recurse"\r
+         "(%d, %d, %d, 0x%x, 0x%x, %d, 0x%x, %d, %d) starting\n",\r
+         dev - fs_tab, ino - i_tab, exclude, parent, dirty, indirection,\r
+         region, regions, blocks);\r
+#endif\r
+\r
        /* check we have been passed a valid block number */\r
        blk = *parent;\r
        if (blk < (dev->s_reserv + dev->s_isize) || blk >= dev->s_fsize)\r
                {\r
                /* filesystem is corrupt, invalid block */\r
                udata.u_error = ECORRUPTFS;\r
-#if DEBUG > 0\r
kprintf("bitmap_align_recurse() ino = %d, blk = %d, ind = %d, par = 0x%04x\n",\r
+#if DEBUG\r
dprintf(1, "bitmap_align_recurse() ino = %d, blk = %d, ind = %d, par = 0x%04x\n",\r
          ino->c_num, blk, indirection, parent);\r
+#endif\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
 #endif\r
                return (blkno_t)-1;\r
                }\r
@@ -785,6 +821,9 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
        if (moveable == 0 && indirection == 0)\r
                {\r
                /* no action is needed (no move and not indirect) */\r
+#if DEBUG > 3\r
+ dprintf(4, "bitmap_align_recurse() returning -1, no action, ok\n");\r
+#endif\r
                return (blkno_t)-1;\r
                }\r
 \r
@@ -793,6 +832,9 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
        buf = (bufptr)bread(devno, blk, 0);\r
        if (buf == NULL)\r
                {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                return (blkno_t)-1; /* disk i/o error reading the block itself */\r
                }\r
 \r
@@ -816,7 +858,7 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
                for (i = 0; i < BUFSIZE / sizeof(blkno_t); i++)\r
                        {\r
                        newno = ((blkno_t *)buf)[i];\r
- if (newno == 3840) kprintf("bad # %d,%d 0x%04x\n", buf->bf_blk, i, &((blkno_t *)buf)[i]);\r
+/* if (newno == 3840) dprintf(3, "bad # %d,%d 0x%04x\n", buf->bf_blk, i, &((blkno_t *)buf)[i]); */\r
                        if (newno)\r
                                {\r
                                if (exclude == 2) /* it's the target file */\r
@@ -826,6 +868,9 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
 \r
                                        if (bfree(buf, buf->bf_dirty) < 0)\r
                                                {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                                                return (blkno_t)-1; /* disk i/o error */\r
                                                }\r
 \r
@@ -838,6 +883,9 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
                                        buf = (bufptr)bread(devno, blk, 0);\r
                                        if (buf == NULL)\r
                                                {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                                                return (blkno_t)-1; /* disk i/o error */\r
                                                }\r
 \r
@@ -863,6 +911,9 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
                                                {\r
                                                if (bfree(buf, buf->bf_dirty) < 0)\r
                                                        {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                                                        return (blkno_t)-1; /* disk i/o error */\r
                                                        }\r
                                                }\r
@@ -876,12 +927,18 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
                                                buf = (bufptr)bread(devno, blk, 0);\r
                                                if (buf == NULL)\r
                                                        {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                                                        return (blkno_t)-1; /* disk i/o error */\r
                                                        }\r
                                                }\r
 \r
                                        if (newno == (blkno_t)-1)\r
                                                {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                                                return (blkno_t)-1;\r
                                                }\r
 \r
@@ -891,6 +948,9 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
                                                dev->s_bitmap_immov) != 1)\r
                                                {\r
                                                /* i/o error, or corrupt filesystem */\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                                                return (blkno_t)-1;\r
                                                }\r
                                        }\r
@@ -909,6 +969,9 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
                                newno >= dev->s_fsize)\r
                        {\r
                        udata.u_error = ENOSPC; /* may overwrite ENXIO !! */\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                        return (blkno_t)-1;\r
                        }\r
 \r
@@ -918,37 +981,49 @@ blkno_t bitmap_align_recurse(fsptr dev, inoptr ino, int exclude,
                /* inform parent that its allocation entries were changed */\r
                *dirty = 1;\r
 \r
-#if DEBUG > 2\r
kprintf("putting block %d -> %d, errno = %d\n", blk, newno, udata.u_error);\r
+#if DEBUG >= 2\r
dprintf(2, "putting block %d -> %d, errno = %d\n", blk, newno, udata.u_error);\r
 #endif\r
 \r
                /* really move the block by manipulating cache entries */\r
                other = (bufptr)bfind(devno, newno); /* hanging around in cache? */\r
                if (other)\r
                        {\r
-/* kprintf("bufpool entry %d = block %d, dirty 0\n", other - bufpool, blk); */\r
+/* dprintf(3, "bufpool entry %d = block %d, dirty 0\n", other - bufpool, blk); */\r
                        other->bf_blk = blk; /* swap, for minimal overhead */\r
                        other->bf_dirty = 0; /* try to avoid writing back */\r
                        }\r
 \r
                /* revise the original cache entry to show the new block */\r
-/* kprintf("bufpool entry %d = block %d, dirty 2\n", buf - bufpool, newno); */\r
+/* dprintf(3, "bufpool entry %d = block %d, dirty 2\n", buf - bufpool, newno); */\r
                buf->bf_blk = newno; /* original value is in variable blk */\r
                if (bfree(buf, 2) < 0) /* very dirty, write back immediately */\r
                        {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                        return (blkno_t)-1; /* disk i/o error writing back */\r
                        }\r
 \r
+#if DEBUG > 3\r
+ dprintf(4, "bitmap_align_recurse() returning %d, moved, ok\n", chase);\r
+#endif\r
                return chase; /* indicate which spot was just freed */\r
                }\r
        else\r
                {\r
                if (bfree(buf, buf->bf_dirty) < 0)\r
                        {\r
+#if DEBUG >= 3\r
+ dprintf(3, "bitmap_align_recurse() returning -1, error %u\n", udata.u_error);\r
+#endif\r
                        return (blkno_t)-1; /* disk i/o error writing back */\r
                        }\r
                }\r
 \r
+#if DEBUG > 3\r
+ dprintf(4, "bitmap_align_recurse() returning -1, ok\n");\r
+#endif\r
        return (blkno_t)-1; /* successfully traversed the block and its children */\r
        }\r
 \r
@@ -958,8 +1033,8 @@ blkno_t bitmap_search(dev_t devno, int size, blkno_t start, blkno_t final)
        blkno_t i, j, lm, blk;\r
        unsigned long bits, mask; /* assumes REGION_BLOCKS <= 32 */\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_search(%u, %d, %u, %u) starting\n",\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_search(%u, %d, %u, %u) starting\n",\r
          devno, size, start, final);\r
 #endif\r
 \r
@@ -1004,8 +1079,8 @@ blkno_t bitmap_search(dev_t devno, int size, blkno_t start, blkno_t final)
                buf = bread(devno, j >> BUFSIZELOG, 0);\r
                if (buf == NULL)\r
                        {\r
-#if DEBUG > 2\r
kprintf("bitmap_search() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_search() returning -1, i/o error\n");\r
 #endif\r
                        return (blkno_t)-1; /* should indicate i/o error */\r
                        }\r
@@ -1027,14 +1102,14 @@ blkno_t bitmap_search(dev_t devno, int size, blkno_t start, blkno_t final)
                                /* don't write it back, our caller will */\r
                                if (brelse((bufptr)buf) < 0)\r
                                        {\r
-#if DEBUG > 2\r
kprintf("bitmap_search() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_search() returning -1, i/o error\n");\r
 #endif\r
                                        return (blkno_t)-1;\r
                                        }\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_search() returning %u, success\n", blk);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_search() returning %u, success\n", blk);\r
 #endif\r
                                return blk;\r
                                }\r
@@ -1045,8 +1120,8 @@ blkno_t bitmap_search(dev_t devno, int size, blkno_t start, blkno_t final)
                /* nothing found this time, release block and loop */\r
                if (brelse((bufptr)buf) < 0)\r
                        {\r
-#if DEBUG > 2\r
kprintf("bitmap_search() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_search() returning -1, i/o error\n");\r
 #endif\r
                        return (blkno_t)-1;\r
                        }\r
@@ -1056,8 +1131,8 @@ blkno_t bitmap_search(dev_t devno, int size, blkno_t start, blkno_t final)
                }\r
 \r
        /* no '0' string found within the bitmap limits */\r
-#if DEBUG > 2\r
kprintf("bitmap_search() returning -1, bitmap full\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_search() returning -1, bitmap full\n");\r
 #endif\r
        return (blkno_t)-1; /* not an error, bitmap was really full */\r
        }\r
@@ -1068,8 +1143,8 @@ int bitmap_reserve(dev_t devno, blkno_t blk, int size, int flag,
        blkno_t i, j, lm;\r
        char *buf, *p, mask;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_reserve(%u, %u, %d, %d, %u, %u) starting\n",\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve(%u, %u, %d, %d, %u, %u) starting\n",\r
          devno, blk, size, flag, start, final);\r
 #endif\r
 \r
@@ -1077,8 +1152,8 @@ int bitmap_reserve(dev_t devno, blkno_t blk, int size, int flag,
        j = start + (blk >> 3);\r
        if (j >= final)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_reserve() returning -1, out of range\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve() returning -1, out of range\n");\r
 #endif\r
                return -1; /* block out of range, very bad */\r
                }\r
@@ -1087,8 +1162,8 @@ int bitmap_reserve(dev_t devno, blkno_t blk, int size, int flag,
        buf = bread(devno, j >> BUFSIZELOG, 0);\r
        if (buf == NULL)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_reserve() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve() returning -1, i/o error\n");\r
 #endif\r
                return -1; /* should indicate i/o error */\r
                }\r
@@ -1109,8 +1184,8 @@ int bitmap_reserve(dev_t devno, blkno_t blk, int size, int flag,
                        /* gone past the end of the current bitmap block */\r
                        if (j >= final)\r
                                {\r
-#if DEBUG > 2\r
kprintf("bitmap_reserve() returning -1, out of range\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve() returning -1, out of range\n");\r
 #endif\r
                        return -1; /* out of range */\r
                                }\r
@@ -1118,8 +1193,8 @@ int bitmap_reserve(dev_t devno, blkno_t blk, int size, int flag,
                        /* need to flush the modifications done so far */\r
                        if (bawrite((bufptr)buf) < 0)\r
                                {\r
-#if DEBUG > 2\r
kprintf("bitmap_reserve() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve() returning -1, i/o error\n");\r
 #endif\r
                                return -1; /* i/o error */\r
                                }\r
@@ -1128,8 +1203,8 @@ int bitmap_reserve(dev_t devno, blkno_t blk, int size, int flag,
                        buf = bread(devno, j >> BUFSIZELOG, 0);\r
                        if (buf == NULL)\r
                                {\r
-#if DEBUG > 2\r
kprintf("bitmap_reserve() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve() returning -1, i/o error\n");\r
 #endif\r
                                return -1; /* i/o error */\r
                                }\r
@@ -1156,14 +1231,14 @@ int bitmap_reserve(dev_t devno, blkno_t blk, int size, int flag,
        /* ready to write back the modified bitmap block */\r
        if (bawrite((bufptr)buf) < 0)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_reserve() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve() returning -1, i/o error\n");\r
 #endif\r
                return -1; /* should indicate i/o error */\r
                }\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_reserve() returning 0, success\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_reserve() returning 0, success\n");\r
 #endif\r
        return 0;\r
        }\r
@@ -1175,8 +1250,8 @@ blkno_t bitmap_find(dev_t devno, blkno_t blk, int flag, int toggle,
        char *buf, *p, mask;\r
        blkno_t i, j, lm;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_find(%u, %u, %d, %d, %u, %u) starting\n",\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_find(%u, %u, %d, %d, %u, %u) starting\n",\r
                devno, blk, flag, toggle, start, final);\r
 #endif\r
 \r
@@ -1197,8 +1272,8 @@ blkno_t bitmap_find(dev_t devno, blkno_t blk, int flag, int toggle,
                buf = bread(devno, j >> BUFSIZELOG, 0);\r
                if (buf == NULL)\r
                        {\r
-#if DEBUG > 2\r
kprintf("bitmap_find() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_find() returning -1, i/o error\n");\r
 #endif\r
                        return (blkno_t)-1; /* should indicate i/o error */\r
                        }\r
@@ -1231,8 +1306,8 @@ blkno_t bitmap_find(dev_t devno, blkno_t blk, int flag, int toggle,
                                        *p ^= 1 << i;\r
                                        if (bawrite((bufptr)buf) < 0)\r
                                                {\r
-#if DEBUG > 2\r
kprintf("bitmap_find() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_find() returning -1, i/o error\n");\r
 #endif\r
                                                return (blkno_t)-1; /* i/o */\r
                                                }\r
@@ -1241,15 +1316,15 @@ blkno_t bitmap_find(dev_t devno, blkno_t blk, int flag, int toggle,
                                        {\r
                                        if (brelse((bufptr)buf) < 0)\r
                                                {\r
-#if DEBUG > 2\r
kprintf("bitmap_find() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_find() returning -1, i/o error\n");\r
 #endif\r
                                                return (blkno_t)-1; /* i/o */\r
                                                }\r
                                        }\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_find() returning %u, success\n", blk);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_find() returning %u, success\n", blk);\r
 #endif\r
                                return blk;\r
                                }\r
@@ -1260,8 +1335,8 @@ blkno_t bitmap_find(dev_t devno, blkno_t blk, int flag, int toggle,
                /* nothing found this time, release block and loop */\r
                if (brelse((bufptr)buf) < 0)\r
                        {\r
-#if DEBUG > 2\r
kprintf("bitmap_find() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_find() returning -1, i/o error\n");\r
 #endif\r
                        return (blkno_t)-1;\r
                        }\r
@@ -1272,8 +1347,8 @@ blkno_t bitmap_find(dev_t devno, blkno_t blk, int flag, int toggle,
 \r
        /* no 'flag' bit found within the bitmap limits */\r
        blk = (j - start) << 3;\r
-#if DEBUG > 2\r
kprintf("bitmap_find() returning %u, bitmap full\n", blk);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_find() returning %u, bitmap full\n", blk);\r
 #endif\r
        return blk; /* not an error, bitmap was really full */\r
        }\r
@@ -1283,16 +1358,16 @@ int bitmap_get(dev_t devno, blkno_t blk, blkno_t start, blkno_t final)
        blkno_t i, j;\r
        char *buf, *p;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_get(%u, %u, %u, %u) starting\n", devno, blk, start, final);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_get(%u, %u, %u, %u) starting\n", devno, blk, start, final);\r
 #endif\r
 \r
        /* calculate byte position within bitmap for this block */\r
        j = start + (blk >> 3);\r
        if (j >= final)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_get() returning -1, out of range\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_get() returning -1, out of range\n");\r
 #endif\r
                return -1; /* block out of range, very bad */\r
                }\r
@@ -1302,8 +1377,8 @@ int bitmap_get(dev_t devno, blkno_t blk, blkno_t start, blkno_t final)
        buf = bread(devno, j >> BUFSIZELOG, 0);\r
        if (buf == NULL)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_get() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_get() returning -1, i/o error\n");\r
 #endif\r
                return -1; /* should indicate i/o error */\r
                }\r
@@ -1314,14 +1389,14 @@ int bitmap_get(dev_t devno, blkno_t blk, blkno_t start, blkno_t final)
 \r
        if (brelse((bufptr)buf) < 0)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_get() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_get() returning -1, i/o error\n");\r
 #endif\r
                return -1;\r
                }\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_get() returning %d, success\n", i);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_get() returning %d, success\n", i);\r
 #endif\r
        return i;\r
        }\r
@@ -1332,8 +1407,8 @@ int bitmap_set(dev_t devno, blkno_t blk, int flag,
        blkno_t i, j;\r
        char *buf, *p, mask;\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_set(%u, %u, %d, %u, %u) starting\n",\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_set(%u, %u, %d, %u, %u) starting\n",\r
         devno, blk, flag, start, final);\r
 #endif\r
 \r
@@ -1341,8 +1416,8 @@ int bitmap_set(dev_t devno, blkno_t blk, int flag,
        j = start + (blk >> 3);\r
        if (j >= final)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_set() returning -1, out of range\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_set() returning -1, out of range\n");\r
 #endif\r
                return -1; /* block out of range, very bad */\r
                }\r
@@ -1352,8 +1427,8 @@ int bitmap_set(dev_t devno, blkno_t blk, int flag,
        buf = bread(devno, j >> BUFSIZELOG, 0);\r
        if (buf == NULL)\r
                {\r
-#if DEBUG > 2\r
kprintf("bitmap_set() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_set() returning -1, i/o error\n");\r
 #endif\r
                return -1; /* should indicate i/o error */\r
                }\r
@@ -1369,8 +1444,8 @@ int bitmap_set(dev_t devno, blkno_t blk, int flag,
                *p ^= mask;\r
                if (bawrite((bufptr)buf) < 0)\r
                        {\r
-#if DEBUG > 2\r
kprintf("bitmap_set() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_set() returning -1, i/o error\n");\r
 #endif\r
                        return -1; /* should indicate i/o error */\r
                        }\r
@@ -1379,15 +1454,15 @@ int bitmap_set(dev_t devno, blkno_t blk, int flag,
                {\r
                if (brelse((bufptr)buf) < 0)\r
                        {\r
-#if DEBUG > 2\r
kprintf("bitmap_set() returning -1, i/o error\n");\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_set() returning -1, i/o error\n");\r
 #endif\r
                        return -1; /* should indicate i/o error */\r
                        }\r
                }\r
 \r
-#if DEBUG > 2\r
kprintf("bitmap_set() returning %d, success\n", j);\r
+#if DEBUG >= 3\r
dprintf(3, "bitmap_set() returning %d, success\n", j);\r
 #endif\r
        return j;\r
        }\r
index 97a07cd..d06db47 100644 (file)
@@ -1,3 +1,4 @@
+md build\r
 cd build\r
 copy ..\build.ban n.bat\r
 call n\r
index e834b89..403ff84 100644 (file)
@@ -346,6 +346,13 @@ as-z80 -l -o systrace.s01
 @if errorlevel 1 goto failure\r
 copy systrace.rel ..\..\..\lib\relsysb\r
 \r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DMAKE_ALL -H_sysdebug ..\sysdebug\r
+@if errorlevel 1 goto failure\r
+del sysdebug.r01\r
+as-z80 -l -o sysdebug.s01\r
+@if errorlevel 1 goto failure\r
+copy sysdebug.rel ..\..\..\lib\relsysb\r
+\r
 iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DMAKE_ALL -H_time ..\time\r
 @if errorlevel 1 goto failure\r
 del time.r01\r
index da32baa..32d2d4e 100644 (file)
@@ -346,6 +346,13 @@ as-z80 -l -o systrace.s01
 @if errorlevel 1 goto failure\r
 copy systrace.rel ..\..\..\lib\relsysl\r
 \r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DMAKE_ALL -H_sysdebug ..\sysdebug\r
+@if errorlevel 1 goto failure\r
+del sysdebug.r01\r
+as-z80 -l -o sysdebug.s01\r
+@if errorlevel 1 goto failure\r
+copy sysdebug.rel ..\..\..\lib\relsysl\r
+\r
 iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DMAKE_ALL -H_time ..\time\r
 @if errorlevel 1 goto failure\r
 del time.r01\r
index 6c98251..503b75f 100644 (file)
@@ -47,6 +47,7 @@ relsysb\symlink.rel
 relsysb\sync.rel\r
 relsysb\sys0b.rel\r
 relsysb\sys1b.rel\r
+relsysb\sysdebug.rel\r
 relsysb\systrace.rel\r
 relsysb\time.rel\r
 relsysb\times.rel\r
index 1cb0d32..e77395d 100644 (file)
@@ -47,6 +47,7 @@ relsysl\symlink.rel
 relsysl\sync.rel\r
 relsysl\sys0l.rel\r
 relsysl\sys1l.rel\r
+relsysl\sysdebug.rel\r
 relsysl\systrace.rel\r
 relsysl\time.rel\r
 relsysl\times.rel\r
index d9914c1..c4aa93b 100644 (file)
@@ -77,6 +77,7 @@
 #define L_setprio\r
 #define L_umask\r
 #define L_systrace\r
+#define L_sysdebug /* Nick */\r
 #endif\r
 \r
 #endif\r
diff --git a/src/libsys/sysdebug.c b/src/libsys/sysdebug.c
new file mode 100644 (file)
index 0000000..723b00b
--- /dev/null
@@ -0,0 +1,32 @@
+/********** MSX-UZIX version of syscalls ************/\r
+/* UNIX sysdebug(int onoff); */\r
+\r
+#include "syscalls.h"\r
+\r
+#define __str3(x)      __STRING(x)\r
+#define __str2(x)      __str3(x)\r
+#define __str1(x)      __str2(x)\r
+\r
+#ifdef L_sysdebug\r
+#ifndef HI_TECH_C\r
+UNIX sysdebug(int onoff)\r
+       {\r
+#if 0\r
+       return unix_set(SET_DEBUG, onoff);\r
+#else\r
+       return unix(7, SET_DEBUG, onoff);\r
+#endif\r
+       }\r
+#else\r
+       asm("   psect text,class=CODE");\r
+        asm("   global __setset");\r
+       asm("   global  _sysdebug");\r
+       asm("   signat  _sysdebug,4154");\r
+       asm("_sysdebug:");\r
+       asm("   push de");\r
+       asm("   ld de," __str1(SET_DEBUG));\r
+       asm("   jp __setset");\r
+#endif\r
+#endif\r
+\r
+\r
diff --git a/src/link-z80/link-z80.exe b/src/link-z80/link-z80.exe
deleted file mode 100644 (file)
index f6760bf..0000000
Binary files a/src/link-z80/link-z80.exe and /dev/null differ
diff --git a/src/link-z80/link-z80.map b/src/link-z80/link-z80.map
deleted file mode 100644 (file)
index 18e3cb5..0000000
+++ /dev/null
@@ -1,520 +0,0 @@
- link-z80\r
-\r
- Timestamp is 3e663ef6 (Thu Mar 06 05:16:22 2003)\r
-\r
- Preferred load address is 00400000\r
-\r
- Start         Length     Name                   Class\r
- 0001:00000000 000112f3H .text                   CODE\r
- 0002:00000000 000005ccH .rdata                  DATA\r
- 0002:000005cc 00000000H .edata                  DATA\r
- 0003:00000000 00000104H .CRT$XCA                DATA\r
- 0003:00000104 00000104H .CRT$XCZ                DATA\r
- 0003:00000208 00000104H .CRT$XIA                DATA\r
- 0003:0000030c 00000109H .CRT$XIC                DATA\r
- 0003:00000418 00000104H .CRT$XIZ                DATA\r
- 0003:0000051c 00000104H .CRT$XPA                DATA\r
- 0003:00000620 00000104H .CRT$XPX                DATA\r
- 0003:00000724 00000104H .CRT$XPZ                DATA\r
- 0003:00000828 00000104H .CRT$XTA                DATA\r
- 0003:0000092c 00000104H .CRT$XTZ                DATA\r
- 0003:00000a30 000023ddH .data                   DATA\r
- 0003:00002e10 00001f34H .bss                    DATA\r
- 0004:00000000 00000014H .idata$2                DATA\r
- 0004:00000014 00000014H .idata$3                DATA\r
- 0004:00000028 000000fcH .idata$4                DATA\r
- 0004:00000124 000000fcH .idata$5                DATA\r
- 0004:00000220 00000444H .idata$6                DATA\r
-\r
-  Address         Publics by Value              Rva+Base     Lib:Object\r
-\r
- 0001:00000350       _newarea                   00401350 f   lkarea.obj\r
- 0001:00000466       _lkparea                   00401466 f   lkarea.obj\r
- 0001:00000593       _lnkarea                   00401593 f   lkarea.obj\r
- 0001:000007b5       _lnksect                   004017b5 f   lkarea.obj\r
- 0001:00000ce0       _eval                      00401ce0 f   lkeval.obj\r
- 0001:00000d68       _expr                      00401d68 f   lkeval.obj\r
- 0001:00000faa       _term                      00401faa f   lkeval.obj\r
- 0001:0000131a       _digit                     0040231a f   lkeval.obj\r
- 0001:000013cf       _oprio                     004023cf f   lkeval.obj\r
- 0001:00001620       _newhead                   00402620 f   lkhead.obj\r
- 0001:00001720       _module                    00402720 f   lkhead.obj\r
- 0001:000017d0       _getid                     004027d0 f   lklex.obj\r
- 0001:0000183c       _getfid                    0040283c f   lklex.obj\r
- 0001:0000188f       _getnb                     0040288f f   lklex.obj\r
- 0001:000018b0       _skip                      004028b0 f   lklex.obj\r
- 0001:000018ea       _get                       004028ea f   lklex.obj\r
- 0001:00001918       _unget                     00402918 f   lklex.obj\r
- 0001:00001930       _getmap                    00402930 f   lklex.obj\r
- 0001:00001a80       _getline                   00402a80 f   lklex.obj\r
- 0001:00001cc0       _more                      00402cc0 f   lklex.obj\r
- 0001:00001cfd       _endline                   00402cfd f   lklex.obj\r
- 0001:00001e90       _addpath                   00402e90 f   lklibr.obj\r
- 0001:00001f21       _addlib                    00402f21 f   lklibr.obj\r
- 0001:00001f83       _addfile                   00402f83 f   lklibr.obj\r
- 0001:000021a7       _search                    004031a7 f   lklibr.obj\r
- 0001:00002228       _fndsym                    00403228 f   lklibr.obj\r
- 0001:000026df       _library                   004036df f   lklibr.obj\r
- 0001:0000271c       _loadfile                  0040371c f   lklibr.obj\r
- 0001:00002a20       _newpag                    00403a20 f   lklist.obj\r
- 0001:00002a62       _dgt                       00403a62 f   lklist.obj\r
- 0001:00002aaf       _slew                      00403aaf f   lklist.obj\r
- 0001:000030cb       _lstarea                   004040cb f   lklist.obj\r
- 0001:0000361a       _lkulist                   0040461a f   lklist.obj\r
- 0001:0000374f       _lkalist                   0040474f f   lklist.obj\r
- 0001:00003a53       _lkglist                   00404a53 f   lklist.obj\r
- 0001:00004430       _main                      00405430 f   lkmain.obj\r
- 0001:000047a1       _lkexit                    004057a1 f   lkmain.obj\r
- 0001:00004831       _link                      00405831 f   lkmain.obj\r
- 0001:00004aea       _map                       00405aea f   lkmain.obj\r
- 0001:00004df3       _parse                     00405df3 f   lkmain.obj\r
- 0001:000053bc       _doparse                   004063bc f   lkmain.obj\r
- 0001:0000546b       _bassav                    0040646b f   lkmain.obj\r
- 0001:000054fd       _setbas                    004064fd f   lkmain.obj\r
- 0001:00005828       _gblsav                    00406828 f   lkmain.obj\r
- 0001:000058ba       _setgbl                    004068ba f   lkmain.obj\r
- 0001:000059d8       _afile                     004069d8 f   lkmain.obj\r
- 0001:00005bbc       _fndidx                    00406bbc f   lkmain.obj\r
- 0001:00005c32       _usage                     00406c32 f   lkmain.obj\r
- 0001:000062b0       _lkout                     004072b0 f   lkout.obj\r
- 0001:000062f2       _ixx                       004072f2 f   lkout.obj\r
- 0001:000064a2       _iflush                    004074a2 f   lkout.obj\r
- 0001:00006617       _sxx                       00407617 f   lkout.obj\r
- 0001:000067e1       _sflush                    004077e1 f   lkout.obj\r
- 0001:00006ac0       _reloc                     00407ac0 f   lkrloc.obj\r
- 0001:00006b50       _relt                      00407b50 f   lkrloc.obj\r
- 0001:00006ba3       _relr                      00407ba3 f   lkrloc.obj\r
- 0001:000071d1       _relp                      004081d1 f   lkrloc.obj\r
- 0001:000073d5       _rele                      004083d5 f   lkrloc.obj\r
- 0001:00007400       _evword                    00408400 f   lkrloc.obj\r
- 0001:00007446       _adb_1b                    00408446 f   lkrloc.obj\r
- 0001:0000746c       _adb_2b                    0040846c f   lkrloc.obj\r
- 0001:00007522       _adb_3b                    00408522 f   lkrloc.obj\r
- 0001:00007632       _adb_4b                    00408632 f   lkrloc.obj\r
- 0001:0000779b       _adb_xb                    0040879b f   lkrloc.obj\r
- 0001:000078d2       _adb_lo                    004088d2 f   lkrloc.obj\r
- 0001:0000794e       _adb_hi                    0040894e f   lkrloc.obj\r
- 0001:000079ca       _adb_byte3                 004089ca f   lkrloc.obj\r
- 0001:00007a46       _adb_byte4                 00408a46 f   lkrloc.obj\r
- 0001:00007ac2       _adw_xb                    00408ac2 f   lkrloc.obj\r
- 0001:00007b31       _relerr                    00408b31 f   lkrloc.obj\r
- 0001:00007b63       _errdmp                    00408b63 f   lkrloc.obj\r
- 0001:00007ce8       _prntval                   00408ce8 f   lkrloc.obj\r
- 0001:00007da7       _relerp                    00408da7 f   lkrloc.obj\r
- 0001:00007dd9       _erpdmp                    00408dd9 f   lkrloc.obj\r
- 0001:00008360       _syminit                   00409360 f   lksym.obj\r
- 0001:0000838c       _newsym                    0040938c f   lksym.obj\r
- 0001:0000855a       _lkpsym                    0040955a f   lksym.obj\r
- 0001:00008601       _symval                    00409601 f   lksym.obj\r
- 0001:0000862d       _symdef                    0040962d f   lksym.obj\r
- 0001:000086a4       _symmod                    004096a4 f   lksym.obj\r
- 0001:00008760       _symeq                     00409760 f   lksym.obj\r
- 0001:00008805       _hash                      00409805 f   lksym.obj\r
- 0001:00008866       _strsto                    00409866 f   lksym.obj\r
- 0001:000088e5       _new                       004098e5 f   lksym.obj\r
- 0001:00008aa2       _fprintf                   00409aa2 f   LIBC:fprintf.obj\r
- 0001:00008ad4       ___initstdio               00409ad4 f   LIBC:_file.obj\r
- 0001:00008b79       ___endstdio                00409b79 f   LIBC:_file.obj\r
- 0001:00008b90       _strcpy                    00409b90 f   LIBC:strcat.obj\r
- 0001:00008ba0       _strcat                    00409ba0 f   LIBC:strcat.obj\r
- 0001:00008c80       _strlen                    00409c80 f   LIBC:strlen.obj\r
- 0001:00008cfb       _fclose                    00409cfb f   LIBC:fclose.obj\r
- 0001:00008d51       _fgets                     00409d51 f   LIBC:fgets.obj\r
- 0001:00008da8       _free                      00409da8 f   LIBC:free.obj\r
- 0001:00008dd7       __fsopen                   00409dd7 f   LIBC:fopen.obj\r
- 0001:00008df7       _fopen                     00409df7 f   LIBC:fopen.obj\r
- 0001:00008e0a       _sprintf                   00409e0a f   LIBC:sprintf.obj\r
- 0001:00008e5c       _malloc                    00409e5c f   LIBC:malloc.obj\r
- 0001:00008e6e       __nh_malloc                00409e6e f   LIBC:malloc.obj\r
- 0001:00008e9a       __heap_alloc               00409e9a f   LIBC:malloc.obj\r
- 0001:00008ee0       _strchr                    00409ee0 f   LIBC:strchr.obj\r
- 0001:00008ee6       ___from_strstr_to_strchr   00409ee6 f   LIBC:strchr.obj\r
- 0001:00008fa0       _strncmp                   00409fa0 f   LIBC:strncmp.obj\r
- 0001:00008fd8       _sscanf                    00409fd8 f   LIBC:sscanf.obj\r
- 0001:00009010       _strcmp                    0040a010 f   LIBC:strcmp.obj\r
- 0001:00009094       __flsbuf                   0040a094 f   LIBC:_flsbuf.obj\r
- 0001:000091b0       _strncpy                   0040a1b0 f   LIBC:strncpy.obj\r
- 0001:000092ae       __cinit                    0040a2ae f   LIBC:crt0dat.obj\r
- 0001:000092db       _exit                      0040a2db f   LIBC:crt0dat.obj\r
- 0001:000092ec       __exit                     0040a2ec f   LIBC:crt0dat.obj\r
- 0001:000092fd       __cexit                    0040a2fd f   LIBC:crt0dat.obj\r
- 0001:0000930c       __c_exit                   0040a30c f   LIBC:crt0dat.obj\r
- 0001:000093d0       _strrchr                   0040a3d0 f   LIBC:strrchr.obj\r
- 0001:000093f7       _mainCRTStartup            0040a3f7 f   LIBC:crt0.obj\r
- 0001:000094d6       __amsg_exit                0040a4d6 f   LIBC:crt0.obj\r
- 0001:0000951f       __stbuf                    0040a51f f   LIBC:_sftbuf.obj\r
- 0001:000095ac       __ftbuf                    0040a5ac f   LIBC:_sftbuf.obj\r
- 0001:000095e9       __output                   0040a5e9 f   LIBC:output.obj\r
- 0001:00009df3       __ioinit                   0040adf3 f   LIBC:ioinit.obj\r
- 0001:00009f9e       __ioterm                   0040af9e f   LIBC:ioinit.obj\r
- 0001:00009fc1       _calloc                    0040afc1 f   LIBC:calloc.obj\r
- 0001:0000a03e       __fcloseall                0040b03e f   LIBC:closeall.obj\r
- 0001:0000a096       _fflush                    0040b096 f   LIBC:fflush.obj\r
- 0001:0000a0d1       __flush                    0040b0d1 f   LIBC:fflush.obj\r
- 0001:0000a12d       __flushall                 0040b12d f   LIBC:fflush.obj\r
- 0001:0000a1a3       __close                    0040b1a3 f   LIBC:close.obj\r
- 0001:0000a256       __freebuf                  0040b256 f   LIBC:_freebuf.obj\r
- 0001:0000a281       __filbuf                   0040b281 f   LIBC:_filbuf.obj\r
- 0001:0000a35a       __heap_init                0040b35a f   LIBC:heapinit.obj\r
- 0001:0000a396       __heap_term                0040b396 f   LIBC:heapinit.obj\r
- 0001:0000a40b       __get_sbh_threshold        0040b40b f   LIBC:sbheap.obj\r
- 0001:0000a411       __set_sbh_threshold        0040b411 f   LIBC:sbheap.obj\r
- 0001:0000a428       ___sbh_heap_init           0040b428 f   LIBC:sbheap.obj\r
- 0001:0000a466       ___sbh_find_block          0040b466 f   LIBC:sbheap.obj\r
- 0001:0000a491       ___sbh_free_block          0040b491 f   LIBC:sbheap.obj\r
- 0001:0000a7bc       ___sbh_alloc_block         0040b7bc f   LIBC:sbheap.obj\r
- 0001:0000aac5       ___sbh_alloc_new_region    0040bac5 f   LIBC:sbheap.obj\r
- 0001:0000ab76       ___sbh_alloc_new_group     0040bb76 f   LIBC:sbheap.obj\r
- 0001:0000ac71       ___sbh_resize_block        0040bc71 f   LIBC:sbheap.obj\r
- 0001:0000af67       ___sbh_heapmin             0040bf67 f   LIBC:sbheap.obj\r
- 0001:0000b038       ___sbh_heap_check          0040c038 f   LIBC:sbheap.obj\r
- 0001:0000b367       __openfile                 0040c367 f   LIBC:_open.obj\r
- 0001:0000b4d7       __getstream                0040c4d7 f   LIBC:stream.obj\r
- 0001:0000b54f       ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z 0040c54f f   LIBC:handler.obj\r
- 0001:0000b55f       ?_query_new_handler@@YAP6AHI@ZXZ 0040c55f f   LIBC:handler.obj\r
- 0001:0000b565       __callnewh                 0040c565 f   LIBC:handler.obj\r
- 0001:0000b580       __input                    0040c580 f   LIBC:input.obj\r
- 0001:0000c031       __lseek                    0040d031 f   LIBC:lseek.obj\r
- 0001:0000c0cb       __write                    0040d0cb f   LIBC:write.obj\r
- 0001:0000c278       __getbuf                   0040d278 f   LIBC:_getbuf.obj\r
- 0001:0000c2bc       __isatty                   0040d2bc f   LIBC:isatty.obj\r
- 0001:0000c2e2       __XcptFilter               0040d2e2 f   LIBC:winxfltr.obj\r
- 0001:0000c466       __setenvp                  0040d466 f   LIBC:stdenvp.obj\r
- 0001:0000c51f       __setargv                  0040d51f f   LIBC:stdargv.obj\r
- 0001:0000c76c       ___crtGetEnvironmentStringsA 0040d76c f   LIBC:a_env.obj\r
- 0001:0000c8a0       __global_unwind2           0040d8a0 f   LIBC:exsup.obj\r
- 0001:0000c8e2       __local_unwind2            0040d8e2 f   LIBC:exsup.obj\r
- 0001:0000c93a       __NLG_Return2              0040d93a f   LIBC:exsup.obj\r
- 0001:0000c94a       __abnormal_termination     0040d94a f   LIBC:exsup.obj\r
- 0001:0000c96d       __NLG_Notify1              0040d96d f   LIBC:exsup.obj\r
- 0001:0000c976       __NLG_Notify               0040d976 f   LIBC:exsup.obj\r
- 0001:0000c989       __NLG_Dispatch             0040d989 f   LIBC:exsup.obj\r
- 0001:0000c998       __except_handler3          0040d998 f   LIBC:exsup3.obj\r
- 0001:0000ca55       __seh_longjmp_unwind@4     0040da55 f   LIBC:exsup3.obj\r
- 0001:0000ca70       __FF_MSGBANNER             0040da70 f   LIBC:crt0msg.obj\r
- 0001:0000caa9       __NMSG_WRITE               0040daa9 f   LIBC:crt0msg.obj\r
- 0001:0000cbfc       __GET_RTERRMSG             0040dbfc f   LIBC:crt0msg.obj\r
- 0001:0000cc2d       _wctomb                    0040dc2d f   LIBC:wctomb.obj\r
- 0001:0000cca0       __aulldiv                  0040dca0 f   LIBC:ulldiv.obj\r
- 0001:0000cd10       __aullrem                  0040dd10 f   LIBC:ullrem.obj\r
- 0001:0000cd90       _memset                    0040dd90 f   LIBC:memset.obj\r
- 0001:0000cde8       __commit                   0040dde8 f   LIBC:commit.obj\r
- 0001:0000ce3f       __dosmaperr                0040de3f f   LIBC:dosmap.obj\r
- 0001:0000cea6       __alloc_osfhnd             0040dea6 f   LIBC:osfinfo.obj\r
- 0001:0000cf3b       __set_osfhnd               0040df3b f   LIBC:osfinfo.obj\r
- 0001:0000cfb2       __free_osfhnd              0040dfb2 f   LIBC:osfinfo.obj\r
- 0001:0000d02c       __get_osfhandle            0040e02c f   LIBC:osfinfo.obj\r
- 0001:0000d069       __open_osfhandle           0040e069 f   LIBC:osfinfo.obj\r
- 0001:0000d106       __read                     0040e106 f   LIBC:read.obj\r
- 0001:0000d300       _memmove                   0040e300 f   LIBC:memmove.obj\r
- 0001:0000d635       __open                     0040e635 f   LIBC:open.obj\r
- 0001:0000d64c       __sopen                    0040e64c f   LIBC:open.obj\r
- 0001:0000d905       _mbtowc                    0040e905 f   LIBC:mbtowc.obj\r
- 0001:0000d9cd       _isalpha                   0040e9cd f   LIBC:_ctype.obj\r
- 0001:0000d9fb       _isupper                   0040e9fb f   LIBC:_ctype.obj\r
- 0001:0000da23       _islower                   0040ea23 f   LIBC:_ctype.obj\r
- 0001:0000da4b       _isdigit                   0040ea4b f   LIBC:_ctype.obj\r
- 0001:0000da73       _isxdigit                  0040ea73 f   LIBC:_ctype.obj\r
- 0001:0000daa0       _isspace                   0040eaa0 f   LIBC:_ctype.obj\r
- 0001:0000dac8       _ispunct                   0040eac8 f   LIBC:_ctype.obj\r
- 0001:0000daf0       _isalnum                   0040eaf0 f   LIBC:_ctype.obj\r
- 0001:0000db1e       _isprint                   0040eb1e f   LIBC:_ctype.obj\r
- 0001:0000db4c       _isgraph                   0040eb4c f   LIBC:_ctype.obj\r
- 0001:0000db7a       _iscntrl                   0040eb7a f   LIBC:_ctype.obj\r
- 0001:0000dba2       ___isascii                 0040eba2 f   LIBC:_ctype.obj\r
- 0001:0000dbaf       ___toascii                 0040ebaf f   LIBC:_ctype.obj\r
- 0001:0000dbb7       ___iscsymf                 0040ebb7 f   LIBC:_ctype.obj\r
- 0001:0000dbf4       ___iscsym                  0040ebf4 f   LIBC:_ctype.obj\r
- 0001:0000dc31       __isctype                  0040ec31 f   LIBC:isctype.obj\r
- 0001:0000dcb0       __allmul                   0040ecb0 f   LIBC:llmul.obj\r
- 0001:0000dcf0       __allshl                   0040ecf0 f   LIBC:llshl.obj\r
- 0001:0000dd0f       _ungetc                    0040ed0f f   LIBC:ungetc.obj\r
- 0001:0000dd7d       __setmbcp                  0040ed7d f   LIBC:mbctype.obj\r
- 0001:0000e141       __getmbcp                  0040f141 f   LIBC:mbctype.obj\r
- 0001:0000e151       ___initmbctable            0040f151 f   LIBC:mbctype.obj\r
- 0001:0000e170       _memcpy                    0040f170 f   LIBC:memcpy.obj\r
- 0001:0000e4a5       ___crtMessageBoxA          0040f4a5 f   LIBC:crtmbox.obj\r
- 0001:0000e52e       __fptrap                   0040f52e f   LIBC:crt0fp.obj\r
- 0001:0000e537       __chsize                   0040f537 f   LIBC:chsize.obj\r
- 0001:0000e67d       ___crtGetStringTypeA       0040f67d f   LIBC:a_str.obj\r
- 0001:0000e7c6       ___crtLCMapStringA         0040f7c6 f   LIBC:a_map.obj\r
- 0001:0000ea15       __setmode                  0040fa15 f   LIBC:setmode.obj\r
- 0001:0000ea90       __chkstk                   0040fa90 f   LIBC:chkstk.obj\r
- 0001:0000ea90       __alloca_probe             0040fa90 f   LIBC:chkstk.obj\r
- 0001:0000eac0       _HeapFree@12               0040fac0 f   kernel32:KERNEL32.dll\r
- 0001:0000eac6       _HeapAlloc@12              0040fac6 f   kernel32:KERNEL32.dll\r
- 0001:0000eacc       _ExitProcess@4             0040facc f   kernel32:KERNEL32.dll\r
- 0001:0000ead2       _TerminateProcess@8        0040fad2 f   kernel32:KERNEL32.dll\r
- 0001:0000ead8       _GetCurrentProcess@0       0040fad8 f   kernel32:KERNEL32.dll\r
- 0001:0000eade       _GetCommandLineA@0         0040fade f   kernel32:KERNEL32.dll\r
- 0001:0000eae4       _GetVersion@0              0040fae4 f   kernel32:KERNEL32.dll\r
- 0001:0000eaea       _SetHandleCount@4          0040faea f   kernel32:KERNEL32.dll\r
- 0001:0000eaf0       _GetStdHandle@4            0040faf0 f   kernel32:KERNEL32.dll\r
- 0001:0000eaf6       _GetFileType@4             0040faf6 f   kernel32:KERNEL32.dll\r
- 0001:0000eafc       _GetStartupInfoA@4         0040fafc f   kernel32:KERNEL32.dll\r
- 0001:0000eb02       _GetLastError@0            0040fb02 f   kernel32:KERNEL32.dll\r
- 0001:0000eb08       _CloseHandle@4             0040fb08 f   kernel32:KERNEL32.dll\r
- 0001:0000eb0e       _HeapDestroy@4             0040fb0e f   kernel32:KERNEL32.dll\r
- 0001:0000eb14       _HeapCreate@12             0040fb14 f   kernel32:KERNEL32.dll\r
- 0001:0000eb1a       _VirtualFree@12            0040fb1a f   kernel32:KERNEL32.dll\r
- 0001:0000eb20       _VirtualAlloc@16           0040fb20 f   kernel32:KERNEL32.dll\r
- 0001:0000eb26       _HeapReAlloc@16            0040fb26 f   kernel32:KERNEL32.dll\r
- 0001:0000eb2c       _IsBadWritePtr@8           0040fb2c f   kernel32:KERNEL32.dll\r
- 0001:0000eb32       _SetFilePointer@16         0040fb32 f   kernel32:KERNEL32.dll\r
- 0001:0000eb38       _WriteFile@20              0040fb38 f   kernel32:KERNEL32.dll\r
- 0001:0000eb3e       _UnhandledExceptionFilter@4 0040fb3e f   kernel32:KERNEL32.dll\r
- 0001:0000eb44       _GetModuleFileNameA@12     0040fb44 f   kernel32:KERNEL32.dll\r
- 0001:0000eb4a       _FreeEnvironmentStringsA@4 0040fb4a f   kernel32:KERNEL32.dll\r
- 0001:0000eb50       _FreeEnvironmentStringsW@4 0040fb50 f   kernel32:KERNEL32.dll\r
- 0001:0000eb56       _WideCharToMultiByte@32    0040fb56 f   kernel32:KERNEL32.dll\r
- 0001:0000eb5c       _GetEnvironmentStrings@0   0040fb5c f   kernel32:KERNEL32.dll\r
- 0001:0000eb62       _GetEnvironmentStringsW@0  0040fb62 f   kernel32:KERNEL32.dll\r
- 0001:0000eb68       _RtlUnwind@16              0040fb68 f   kernel32:KERNEL32.dll\r
- 0001:0000eb6e       _FlushFileBuffers@4        0040fb6e f   kernel32:KERNEL32.dll\r
- 0001:0000eb74       _SetStdHandle@8            0040fb74 f   kernel32:KERNEL32.dll\r
- 0001:0000eb7a       _ReadFile@20               0040fb7a f   kernel32:KERNEL32.dll\r
- 0001:0000eb80       _CreateFileA@28            0040fb80 f   kernel32:KERNEL32.dll\r
- 0001:0000eb86       _MultiByteToWideChar@24    0040fb86 f   kernel32:KERNEL32.dll\r
- 0001:0000eb8c       _GetCPInfo@8               0040fb8c f   kernel32:KERNEL32.dll\r
- 0001:0000eb92       _GetACP@0                  0040fb92 f   kernel32:KERNEL32.dll\r
- 0001:0000eb98       _GetOEMCP@0                0040fb98 f   kernel32:KERNEL32.dll\r
- 0001:0000eb9e       _GetProcAddress@8          0040fb9e f   kernel32:KERNEL32.dll\r
- 0001:0000eba4       _LoadLibraryA@4            0040fba4 f   kernel32:KERNEL32.dll\r
- 0001:0000ebaa       _SetEndOfFile@4            0040fbaa f   kernel32:KERNEL32.dll\r
- 0001:0000ebb0       _GetStringTypeA@20         0040fbb0 f   kernel32:KERNEL32.dll\r
- 0001:0000ebb6       _GetStringTypeW@16         0040fbb6 f   kernel32:KERNEL32.dll\r
- 0001:0000ebbc       _LCMapStringA@24           0040fbbc f   kernel32:KERNEL32.dll\r
- 0001:0000ebc2       _LCMapStringW@24           0040fbc2 f   kernel32:KERNEL32.dll\r
- 0002:0000002c       ___lookuptable             0041302c     LIBC:output.obj\r
- 0002:00000088       ??_C@_1O@POHA@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 00413088     LIBC:output.obj\r
- 0002:00000098       ??_C@_06ONKE@?$CInull?$CJ?$AA@ 00413098     LIBC:output.obj\r
- 0002:000000a0       ??_C@_0P@GGKG@runtime?5error?5?$AA@ 004130a0     LIBC:crt0msg.obj\r
- 0002:000000b0       ??_C@_02PIMC@?$AN?6?$AA@   004130b0     LIBC:crt0msg.obj\r
- 0002:000000b4       ??_C@_0O@DELO@TLOSS?5error?$AN?6?$AA@ 004130b4     LIBC:crt0msg.obj\r
- 0002:000000c4       ??_C@_0N@OMLL@SING?5error?$AN?6?$AA@ 004130c4     LIBC:crt0msg.obj\r
- 0002:000000d4       ??_C@_0P@OJAK@DOMAIN?5error?$AN?6?$AA@ 004130d4     LIBC:crt0msg.obj\r
- 0002:000000e4       ??_C@_0CF@EANP@R6028?$AN?6?9?5unable?5to?5initialize?5he@ 004130e4     LIBC:crt0msg.obj\r
- 0002:0000010c       ??_C@_0DF@ECGN@R6027?$AN?6?9?5not?5enough?5space?5for?5lo@ 0041310c     LIBC:crt0msg.obj\r
- 0002:00000144       ??_C@_0DF@FKAC@R6026?$AN?6?9?5not?5enough?5space?5for?5st@ 00413144     LIBC:crt0msg.obj\r
- 0002:0000017c       ??_C@_0CG@DPMN@R6025?$AN?6?9?5pure?5virtual?5function?5c@ 0041317c     LIBC:crt0msg.obj\r
- 0002:000001a4       ??_C@_0DF@CKIP@R6024?$AN?6?9?5not?5enough?5space?5for?5_o@ 004131a4     LIBC:crt0msg.obj\r
- 0002:000001dc       ??_C@_0CJ@GGOE@R6019?$AN?6?9?5unable?5to?5open?5console?5@ 004131dc     LIBC:crt0msg.obj\r
- 0002:00000208       ??_C@_0CB@LBOB@R6018?$AN?6?9?5unexpected?5heap?5error?$AN?6@ 00413208     LIBC:crt0msg.obj\r
- 0002:0000022c       ??_C@_0CN@FPEG@R6017?$AN?6?9?5unexpected?5multithread?5@ 0041322c     LIBC:crt0msg.obj\r
- 0002:0000025c       ??_C@_0CM@OBIC@R6016?$AN?6?9?5not?5enough?5space?5for?5th@ 0041325c     LIBC:crt0msg.obj\r
- 0002:00000288       ??_C@_0CB@HPAL@?$AN?6abnormal?5program?5termination?$AN?6@ 00413288     LIBC:crt0msg.obj\r
- 0002:000002ac       ??_C@_0CM@JOOB@R6009?$AN?6?9?5not?5enough?5space?5for?5en@ 004132ac     LIBC:crt0msg.obj\r
- 0002:000002d8       ??_C@_0CK@OIBL@R6008?$AN?6?9?5not?5enough?5space?5for?5ar@ 004132d8     LIBC:crt0msg.obj\r
- 0002:00000304       ??_C@_0CF@LKPB@R6002?$AN?6?9?5floating?5point?5not?5load@ 00413304     LIBC:crt0msg.obj\r
- 0002:0000032c       ??_C@_0CF@JPDF@Microsoft?5Visual?5C?$CL?$CL?5Runtime?5Lib@ 0041332c     LIBC:crt0msg.obj\r
- 0002:00000354       ??_C@_02JJJH@?6?6?$AA@     00413354     LIBC:crt0msg.obj\r
- 0002:00000358       ??_C@_0BK@DEOK@Runtime?5Error?$CB?6?6Program?3?5?$AA@ 00413358     LIBC:crt0msg.obj\r
- 0002:00000374       ??_C@_03NAME@?4?4?4?$AA@   00413374     LIBC:crt0msg.obj\r
- 0002:00000378       ??_C@_0BH@NNCD@?$DMprogram?5name?5unknown?$DO?$AA@ 00413378     LIBC:crt0msg.obj\r
- 0002:00000390       ??_C@_0BD@NJFP@GetLastActivePopup?$AA@ 00413390     LIBC:crtmbox.obj\r
- 0002:000003a4       ??_C@_0BA@GILI@GetActiveWindow?$AA@ 004133a4     LIBC:crtmbox.obj\r
- 0002:000003b4       ??_C@_0M@PKCK@MessageBoxA?$AA@ 004133b4     LIBC:crtmbox.obj\r
- 0002:000003c0       ??_C@_0L@HKL@user32?4dll?$AA@ 004133c0     LIBC:crtmbox.obj\r
- 0002:000003cc       ??_C@_01A@?$AA?$AA@        004133cc     LIBC:a_str.obj\r
- 0002:000003d0       ??_C@_13A@?$AA?$AA?$AA?$AA@ 004133d0     LIBC:a_str.obj\r
- 0003:00000000       ___xc_a                    00414000     LIBC:crt0init.obj\r
- 0003:00000104       ___xc_z                    00414104     LIBC:crt0init.obj\r
- 0003:00000208       ___xi_a                    00414208     LIBC:crt0init.obj\r
- 0003:00000418       ___xi_z                    00414418     LIBC:crt0init.obj\r
- 0003:0000051c       ___xp_a                    0041451c     LIBC:crt0init.obj\r
- 0003:00000724       ___xp_z                    00414724     LIBC:crt0init.obj\r
- 0003:00000828       ___xt_a                    00414828     LIBC:crt0init.obj\r
- 0003:0000092c       ___xt_z                    0041492c     LIBC:crt0init.obj\r
- 0003:00000b14       __abs_                     00414b14     lkdata.obj\r
- 0003:00000b18       _rtaflg                    00414b18     lkdata.obj\r
- 0003:00000b1c       _ctype                     00414b1c     lkdata.obj\r
- 0003:00000b9c       _ccase                     00414b9c     lkdata.obj\r
- 0003:00001370       _usetxt                    00415370     lkmain.obj\r
- 0003:00001d7c       _errmsg                    00415d7c     lkrloc.obj\r
- 0003:000022d0       __iob                      004162d0     LIBC:_file.obj\r
- 0003:00002550       __aexit_rtn                00416550     LIBC:crt0.obj\r
- 0003:00002554       ___app_type                00416554     LIBC:crt0.obj\r
- 0003:00002558       ___nullstring              00416558     LIBC:output.obj\r
- 0003:0000255c       ___wnullstring             0041655c     LIBC:output.obj\r
- 0003:00002560       ___badioinfo               00416560     LIBC:ioinit.obj\r
- 0003:00002568       __amblksiz                 00416568     LIBC:heapinit.obj\r
- 0003:0000256c       ___sbh_threshold           0041656c     LIBC:sbheap.obj\r
- 0003:00002580       __XcptActTab               00416580     LIBC:winxfltr.obj\r
- 0003:000025f8       __First_FPE_Indx           004165f8     LIBC:winxfltr.obj\r
- 0003:000025fc       __Num_FPE                  004165fc     LIBC:winxfltr.obj\r
- 0003:00002600       __XcptActTabCount          00416600     LIBC:winxfltr.obj\r
- 0003:00002604       __fpecode                  00416604     LIBC:winxfltr.obj\r
- 0003:00002608       __NLG_Destination          00416608     LIBC:exsup.obj\r
- 0003:000026a8       __cfltcvt_tab              004166a8     LIBC:cmiscdat.obj\r
- 0003:000026c0       __pctype                   004166c0     LIBC:ctype.obj\r
- 0003:000026c4       __pwctype                  004166c4     LIBC:ctype.obj\r
- 0003:000026c8       __ctype                    004166c8     LIBC:ctype.obj\r
- 0003:00002a40       ___mb_cur_max              00416a40     LIBC:nlsdata1.obj\r
- 0003:00002a44       ___decimal_point           00416a44     LIBC:nlsdata1.obj\r
- 0003:00002a48       ___decimal_point_length    00416a48     LIBC:nlsdata1.obj\r
- 0003:00002e10       _rtadr0                    00416e10     lkdata.obj\r
- 0003:00002e14       _rtadr1                    00416e14     lkdata.obj\r
- 0003:00002e18       _rtadr2                    00416e18     lkdata.obj\r
- 0003:00002e1c       _obj_flag                  00416e1c     lkdata.obj\r
- 0003:00002e20       _uflag                     00416e20     <common>\r
- 0003:00002e44       _hilo                      00416e44     <common>\r
- 0003:00002e48       __cflush                   00416e48     LIBC:_file.obj\r
- 0003:00002e4c       _errno                     00416e4c     LIBC:crt0dat.obj\r
- 0003:00002e50       __doserrno                 00416e50     LIBC:crt0dat.obj\r
- 0003:00002e54       __umaskval                 00416e54     LIBC:crt0dat.obj\r
- 0003:00002e58       __osver                    00416e58     LIBC:crt0dat.obj\r
- 0003:00002e5c       __winver                   00416e5c     LIBC:crt0dat.obj\r
- 0003:00002e60       __winmajor                 00416e60     LIBC:crt0dat.obj\r
- 0003:00002e64       __winminor                 00416e64     LIBC:crt0dat.obj\r
- 0003:00002e68       ___argc                    00416e68     LIBC:crt0dat.obj\r
- 0003:00002e6c       ___argv                    00416e6c     LIBC:crt0dat.obj\r
- 0003:00002e70       ___wargv                   00416e70     LIBC:crt0dat.obj\r
- 0003:00002e74       __environ                  00416e74     LIBC:crt0dat.obj\r
- 0003:00002e78       ___initenv                 00416e78     LIBC:crt0dat.obj\r
- 0003:00002e7c       __wenviron                 00416e7c     LIBC:crt0dat.obj\r
- 0003:00002e80       ___winitenv                00416e80     LIBC:crt0dat.obj\r
- 0003:00002e84       __pgmptr                   00416e84     LIBC:crt0dat.obj\r
- 0003:00002e88       __wpgmptr                  00416e88     LIBC:crt0dat.obj\r
- 0003:00002e8c       __exitflag                 00416e8c     LIBC:crt0dat.obj\r
- 0003:00002e90       __C_Termination_Done       00416e90     LIBC:crt0dat.obj\r
- 0003:00002e94       __C_Exit_Done              00416e94     LIBC:crt0dat.obj\r
- 0003:00002e98       __aenvptr                  00416e98     LIBC:crt0.obj\r
- 0003:00002e9c       __wenvptr                  00416e9c     LIBC:crt0.obj\r
- 0003:00002ea0       ___error_mode              00416ea0     LIBC:crt0.obj\r
- 0003:00002ea4       __stdbuf                   00416ea4     LIBC:_sftbuf.obj\r
- 0003:00002eac       __newmode                  00416eac     LIBC:_newmode.obj\r
- 0003:00002eb0       ?_pnhHeap@@3P6AHI@ZA       00416eb0     LIBC:handler.obj\r
- 0003:00002eb4       __pxcptinfoptrs            00416eb4     LIBC:winxfltr.obj\r
- 0003:00002fc0       __adbgmsg                  00416fc0     LIBC:crt0msg.obj\r
- 0003:00002fc4       __commode                  00416fc4     LIBC:ncommode.obj\r
- 0003:00002fd8       ___lc_handle               00416fd8     LIBC:nlsdata2.obj\r
- 0003:00002ff0       ___lc_codepage             00416ff0     LIBC:nlsdata2.obj\r
- 0003:00002ff4       ___lc_collate_cp           00416ff4     LIBC:nlsdata2.obj\r
- 0003:00002ff8       __fmode                    00416ff8     LIBC:txtmode.obj\r
- 0003:00003004       _rtcnt                     00417004     <common>\r
- 0003:00003008       _lbfhead                   00417008     <common>\r
- 0003:0000300c       _cfp                       0041700c     <common>\r
- 0003:00003010       _bsp                       00417010     <common>\r
- 0003:00003014       _axp                       00417014     <common>\r
- 0003:00003018       _lbnhead                   00417018     <common>\r
- 0003:0000301c       _gcntr                     0041701c     <common>\r
- 0003:00003020       _rtbuf                     00417020     <common>\r
- 0003:00003070       _filep                     00417070     <common>\r
- 0003:00003074       _gsp                       00417074     <common>\r
- 0003:00003078       _globlp                    00417078     <common>\r
- 0003:0000307c       _lfp                       0041707c     <common>\r
- 0003:00003080       _rtflg                     00417080     <common>\r
- 0003:000030c0       _symhash                   004170c0     <common>\r
- 0003:000031c0       _mfp                       004171c0     <common>\r
- 0003:000031c4       _a_mask                    004171c4     <common>\r
- 0003:000031c8       _line                      004171c8     <common>\r
- 0003:000031cc       _lop                       004171cc     <common>\r
- 0003:000031d0       _ofp                       004171d0     <common>\r
- 0003:000031d4       _headp                     004171d4     <common>\r
- 0003:000031d8       _zflag                     004171d8     <common>\r
- 0003:000031dc       _rfp                       004171dc     <common>\r
- 0003:000031e0       _rtval                     004171e0     <common>\r
- 0003:00003220       _oflag                     00417220     <common>\r
- 0003:00003224       _sfp                       00417224     <common>\r
- 0003:00003228       _areap                     00417228     <common>\r
- 0003:0000322c       _tfp                       0041722c     <common>\r
- 0003:00003230       _sdp                       00417230     <common>\r
- 0003:0000323c       _page                      0041723c     <common>\r
- 0003:00003240       _pass                      00417240     <common>\r
- 0003:00003244       _ap                        00417244     <common>\r
- 0003:00003248       _outfp                     00417248     <common>\r
- 0003:0000324c       _wflag                     0041724c     <common>\r
- 0003:00003250       _hp                        00417250     <common>\r
- 0003:00003254       _ip                        00417254     <common>\r
- 0003:00003258       _rp                        00417258     <common>\r
- 0003:0000325c       _a_bytes                   0041725c     <common>\r
- 0003:00003260       _ib                        00417260     <common>\r
- 0003:00003328       _gline                     00417328     <common>\r
- 0003:0000332c       _pflag                     0041732c     <common>\r
- 0003:00003330       _s_mask                    00417330     <common>\r
- 0003:00003334       _basep                     00417334     <common>\r
- 0003:00003338       _lbphead                   00417338     <common>\r
- 0003:0000333c       _xflag                     0041733c     <common>\r
- 0003:00003340       _rb                        00417340     <common>\r
- 0003:00003408       _startp                    00417408     <common>\r
- 0003:0000340c       _radix                     0041740c     <common>\r
- 0003:00003410       _mflag                     00417410     <common>\r
- 0003:00003414       _linkp                     00417414     <common>\r
- 0003:00003418       _objflg                    00417418     <common>\r
- 0003:0000341c       _lkerr                     0041741c     <common>\r
- 0003:00003420       _rerr                      00417420     <common>\r
- 0003:00003434       _v_mask                    00417434     <common>\r
- 0003:000035a4       ___mbcodepage              004175a4     <common>\r
- 0003:00003620       ___mbulinfo                00417620     <common>\r
- 0003:0000362c       ___ismbcodepage            0041762c     <common>\r
- 0003:00003640       __mbcasemap                00417640     <common>\r
- 0003:00003740       __mbctype                  00417740     <common>\r
- 0003:00003844       ___mblcid                  00417844     <common>\r
- 0003:00003848       ___sbh_sizeHeaderList      00417848     <common>\r
- 0003:00003858       ___sbh_indGroupDefer       00417858     <common>\r
- 0003:0000385c       ___sbh_pHeaderScan         0041785c     <common>\r
- 0003:00003860       ___sbh_pHeaderDefer        00417860     <common>\r
- 0003:00003864       ___sbh_cntHeaderList       00417864     <common>\r
- 0003:00003868       ___sbh_pHeaderList         00417868     <common>\r
- 0003:0000386c       __crtheap                  0041786c     <common>\r
- 0003:00003880       ___pioinfo                 00417880     <common>\r
- 0003:000039bc       __nhandle                  004179bc     <common>\r
- 0003:000039c0       __acmdln                   004179c0     <common>\r
- 0003:000039cc       ___env_initialized         004179cc     <common>\r
- 0003:000039dc       ___mbctype_initialized     004179dc     <common>\r
- 0003:000039e0       ___onexitend               004179e0     <common>\r
- 0003:000039e4       ___onexitbegin             004179e4     <common>\r
- 0003:000039e8       __FPinit                   004179e8     <common>\r
- 0003:000039ec       ___piob                    004179ec     <common>\r
- 0003:00003d40       __bufin                    00417d40     <common>\r
- 0003:00004d40       __nstream                  00418d40     <common>\r
- 0004:00000000       __IMPORT_DESCRIPTOR_KERNEL32 00419000     kernel32:KERNEL32.dll\r
- 0004:00000014       __NULL_IMPORT_DESCRIPTOR   00419014     kernel32:KERNEL32.dll\r
- 0004:00000124       __imp__GetModuleFileNameA@12 00419124     kernel32:KERNEL32.dll\r
- 0004:00000128       __imp__HeapAlloc@12        00419128     kernel32:KERNEL32.dll\r
- 0004:0000012c       __imp__ExitProcess@4       0041912c     kernel32:KERNEL32.dll\r
- 0004:00000130       __imp__TerminateProcess@8  00419130     kernel32:KERNEL32.dll\r
- 0004:00000134       __imp__GetCurrentProcess@0 00419134     kernel32:KERNEL32.dll\r
- 0004:00000138       __imp__GetCommandLineA@0   00419138     kernel32:KERNEL32.dll\r
- 0004:0000013c       __imp__GetVersion@0        0041913c     kernel32:KERNEL32.dll\r
- 0004:00000140       __imp__SetHandleCount@4    00419140     kernel32:KERNEL32.dll\r
- 0004:00000144       __imp__GetStdHandle@4      00419144     kernel32:KERNEL32.dll\r
- 0004:00000148       __imp__GetFileType@4       00419148     kernel32:KERNEL32.dll\r
- 0004:0000014c       __imp__GetStartupInfoA@4   0041914c     kernel32:KERNEL32.dll\r
- 0004:00000150       __imp__GetLastError@0      00419150     kernel32:KERNEL32.dll\r
- 0004:00000154       __imp__CloseHandle@4       00419154     kernel32:KERNEL32.dll\r
- 0004:00000158       __imp__HeapDestroy@4       00419158     kernel32:KERNEL32.dll\r
- 0004:0000015c       __imp__HeapCreate@12       0041915c     kernel32:KERNEL32.dll\r
- 0004:00000160       __imp__VirtualFree@12      00419160     kernel32:KERNEL32.dll\r
- 0004:00000164       __imp__VirtualAlloc@16     00419164     kernel32:KERNEL32.dll\r
- 0004:00000168       __imp__HeapReAlloc@16      00419168     kernel32:KERNEL32.dll\r
- 0004:0000016c       __imp__IsBadWritePtr@8     0041916c     kernel32:KERNEL32.dll\r
- 0004:00000170       __imp__SetFilePointer@16   00419170     kernel32:KERNEL32.dll\r
- 0004:00000174       __imp__WriteFile@20        00419174     kernel32:KERNEL32.dll\r
- 0004:00000178       __imp__UnhandledExceptionFilter@4 00419178     kernel32:KERNEL32.dll\r
- 0004:0000017c       __imp__HeapFree@12         0041917c     kernel32:KERNEL32.dll\r
- 0004:00000180       __imp__FreeEnvironmentStringsA@4 00419180     kernel32:KERNEL32.dll\r
- 0004:00000184       __imp__FreeEnvironmentStringsW@4 00419184     kernel32:KERNEL32.dll\r
- 0004:00000188       __imp__WideCharToMultiByte@32 00419188     kernel32:KERNEL32.dll\r
- 0004:0000018c       __imp__GetEnvironmentStrings@0 0041918c     kernel32:KERNEL32.dll\r
- 0004:00000190       __imp__GetEnvironmentStringsW@0 00419190     kernel32:KERNEL32.dll\r
- 0004:00000194       __imp__RtlUnwind@16        00419194     kernel32:KERNEL32.dll\r
- 0004:00000198       __imp__FlushFileBuffers@4  00419198     kernel32:KERNEL32.dll\r
- 0004:0000019c       __imp__SetStdHandle@8      0041919c     kernel32:KERNEL32.dll\r
- 0004:000001a0       __imp__ReadFile@20         004191a0     kernel32:KERNEL32.dll\r
- 0004:000001a4       __imp__CreateFileA@28      004191a4     kernel32:KERNEL32.dll\r
- 0004:000001a8       __imp__MultiByteToWideChar@24 004191a8     kernel32:KERNEL32.dll\r
- 0004:000001ac       __imp__GetCPInfo@8         004191ac     kernel32:KERNEL32.dll\r
- 0004:000001b0       __imp__GetACP@0            004191b0     kernel32:KERNEL32.dll\r
- 0004:000001b4       __imp__GetOEMCP@0          004191b4     kernel32:KERNEL32.dll\r
- 0004:000001b8       __imp__GetProcAddress@8    004191b8     kernel32:KERNEL32.dll\r
- 0004:000001bc       __imp__LoadLibraryA@4      004191bc     kernel32:KERNEL32.dll\r
- 0004:000001c0       __imp__SetEndOfFile@4      004191c0     kernel32:KERNEL32.dll\r
- 0004:000001c4       __imp__GetStringTypeA@20   004191c4     kernel32:KERNEL32.dll\r
- 0004:000001c8       __imp__GetStringTypeW@16   004191c8     kernel32:KERNEL32.dll\r
- 0004:000001cc       __imp__LCMapStringA@24     004191cc     kernel32:KERNEL32.dll\r
- 0004:000001d0       __imp__LCMapStringW@24     004191d0     kernel32:KERNEL32.dll\r
- 0004:000001d4       \177KERNEL32_NULL_THUNK_DATA 004191d4     kernel32:KERNEL32.dll\r
-\r
- entry point at        0001:000093f7\r
-\r
diff --git a/src/mkfont/bmp2txt.cpp b/src/mkfont/bmp2txt.cpp
new file mode 100644 (file)
index 0000000..2612200
--- /dev/null
@@ -0,0 +1,313 @@
+// bmp2txt.cpp\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#include <stdio.h>\r
+#include <math.h>\r
+#include <string.h>\r
+#include <windows.h>\r
+#pragma hdrstop\r
+#include "hymb.h"\r
+#include "hyfs.h"\r
+#include "hyfile.h"\r
+#include "hyimage.h"\r
+\r
+int main(int argc, char **argv);\r
+int fiProcess(FILETAG *pftOut, BMPTAG *pbtIn);\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+BMPTAG btIn;\r
+char *pszInFileName;\r
+\r
+FILETAG ftOut;\r
+char *pszOutFileName;\r
+char szOutFileName[512];\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int main(int argc, char **argv)\r
+       {\r
+       int i;\r
+\r
+       if (argc > 1)\r
+               {\r
+               pszInFileName = argv[1];\r
+               }\r
+\r
+       if (argc > 2)\r
+               {\r
+               pszOutFileName = argv[2];\r
+               }\r
+\r
+       if (pszInFileName == NULL)\r
+               {\r
+               printf("usage: bmp2txt infile.bmp [outfile.txt]\n");\r
+               exit(1);\r
+               }\r
+\r
+       if (pszOutFileName == NULL)\r
+               {\r
+               pszOutFileName = szOutFileName;\r
+               strcpy(pszOutFileName, pszInFileName);\r
+\r
+               i = strlen(pszOutFileName);\r
+               while (i--)\r
+                       {\r
+                       if (pszOutFileName[i] == '\\')\r
+                               {\r
+                               break; /* no extension, so don't strip it */\r
+                               }\r
+                       if (pszOutFileName[i] == '.')\r
+                               {\r
+                               pszOutFileName[i] = 0; /* strip dot and extension */\r
+                               break; /* ready to concatenate our extension */\r
+                               }\r
+                       }\r
+\r
+               strcat(pszOutFileName, ".txt");\r
+               }\r
+\r
+       if (!strcmp(pszInFileName, pszOutFileName))\r
+               {\r
+               printf("Input and output filenames identical\n");\r
+               exit(1);\r
+               }\r
+\r
+       // read the input bmp file entirely to a malloc'd block\r
+       if (fiBmpReadIn(&btIn, pszInFileName) == FALSE)\r
+               {\r
+               printf("Could not read %s\n", pszInFileName);\r
+               exit(1);\r
+               }\r
+\r
+       printf("Loaded %s, 0x%08x samples\n", pszInFileName,\r
+              btIn.iSampleAppend);\r
+\r
+       // prepare an output buffer for character set data\r
+       FileAllocate(&ftOut, 0x100000); // 64 kbytes\r
+\r
+       // search for characters and write character set files\r
+       if (fiProcess(&ftOut, &btIn) == FALSE)\r
+               {\r
+               exit(1);\r
+               }\r
+\r
+       // ready to write the output we found\r
+       FileWriteOut(&ftOut, pszOutFileName);\r
+\r
+       // all done my friend\r
+       BmpFree(&btIn);\r
+       FileFree(&ftOut);\r
+\r
+       return 0;\r
+       }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiProcess(FILETAG *pftOut, BMPTAG *pbtIn)\r
+       {\r
+       int m, x, y, t;\r
+       int i, j, k, l;\r
+       int n, o, p, q /*, u*/;\r
+       int r, s;\r
+       int cx, cy;\r
+       int iCurrent, iState, iSample, iOffset;\r
+       int *piTotal, *piRow, *piColumn;\r
+       MBHANDLE mbhTotal, mbhRow, mbhColumn;\r
+       char *pc;\r
+\r
+       cx = pbtIn->pbih->biWidth;\r
+       cy = pbtIn->pbih->biHeight;\r
+\r
+#if 0\r
+       if (pbtIn->iChannels != 1)\r
+               {\r
+               printf("fiProcess: Channels %d (must be 1)\n",\r
+                      pbtIn->iChannels);\r
+               return FALSE;\r
+               }\r
+#endif\r
+\r
+       // prepare to find total of black values per pixel row\r
+       MBAlloc(&mbhTotal, cy * sizeof(int));\r
+       piTotal = (int *)mbhTotal.pcBase;\r
+\r
+       // prepare to find row indices of the character lines\r
+       MBAlloc(&mbhRow, (cy + 1) * sizeof(int));\r
+       piRow = (int *)mbhRow.pcBase;\r
+\r
+       // find blackness of each row and divide into character lines\r
+       r = 0;\r
+       iState = 0;\r
+       iCurrent = cy * pbtIn->iSamplesLine;\r
+       for (y = cy - 1; y >= 0; y--)\r
+               {\r
+               iCurrent -= pbtIn->iSamplesLine;\r
+               iSample = iCurrent;\r
+\r
+               t = 0;\r
+               for (x = 0; x < cx; x++)\r
+                       {\r
+                       for (m = 0; m < pbtIn->iChannels; m++)\r
+                               {\r
+                               t += pbtIn->pucSample[iSample++] ^ 0xff;\r
+                               }\r
+                       }\r
+\r
+               piTotal[y] = t; // total of dark pixels for row\r
+\r
+               m = (t != 0); // 0 = all white, 1 = something found\r
+               if (iState != m)\r
+                       {\r
+                       iState = m;\r
+                       piRow[r++] = y + 1; // record change of state\r
+                       }\r
+               }\r
+\r
+       if (iState)\r
+               {\r
+               piRow[r++] = y + 1; // record change of state to white\r
+               }\r
+\r
+       // prepare to find column indices of individual characters\r
+       MBAlloc(&mbhColumn, (cx + 1) * sizeof(int));\r
+       piColumn = (int *)mbhColumn.pcBase;\r
+\r
+       // loop through the character lines found\r
+       pc = pftOut->pcBase;\r
+       for (i = 0; i < r; i += 2)\r
+               {\r
+               j = piRow[i + 1]; // start line of region\r
+               k = piRow[i]; // line after end of region\r
+\r
+               // optional feature to find baseline ignoring descenders\r
+               t = 0;\r
+               for (y = j; y < k; y++)\r
+                       {\r
+                       t += piTotal[y]; // total black counts for region\r
+                       }\r
+\r
+               l = j; // assume line after bottom is baseline\r
+               t = t * 2 / (3 * (k - j)); // 2/3 of the average black count\r
+               for (y = j; y < k; y++)\r
+                       {\r
+                       if (piTotal[y] >= t) // is line blacker than this?\r
+                               {\r
+                               l = y; // found the line after baseline\r
+                               break;\r
+                               }\r
+                       }\r
+\r
+               // find blackness of each column and divide into characters\r
+               s = 0;\r
+               iState = 0;\r
+               iCurrent = j * pbtIn->iSamplesLine;\r
+               iOffset = pbtIn->iSamplesLine - pbtIn->iChannels;\r
+               for (x = 0; x < cx; x++)\r
+                       {\r
+                       iSample = iCurrent;\r
+                       iCurrent += pbtIn->iChannels;\r
+\r
+                       t = 0;\r
+                       for (y = j; y < k; y++)\r
+                               {\r
+                               for (m = 0; m < pbtIn->iChannels; m++)\r
+                                       {\r
+                                       t += pbtIn->pucSample[iSample++] ^\r
+                                            0xff;\r
+                                       }\r
+                               iSample += iOffset;\r
+                               }\r
+\r
+                       m = (t != 0); // 0 = all white, 1 = something found\r
+                       if (iState != m)\r
+                               {\r
+                               iState = m;\r
+                               piColumn[s++] = x; // record change of state\r
+                               }\r
+                       }\r
+\r
+               if (iState)\r
+                       {\r
+                       piColumn[s++] = x; // record change of state to white\r
+                       }\r
+\r
+               // loop through the individual characters found\r
+               for (n = 0; n < s; n += 2)\r
+                       {\r
+                       o = piColumn[n]; // start column of character\r
+                       p = piColumn[n + 1]; // column after end of character\r
+\r
+                       pc += sprintf(pc, "at %d,%d size %d,%d\r\n",\r
+                                     o, cy - j, p + 1 - o, k - j);\r
+\r
+                       iCurrent = k * pbtIn->iSamplesLine;\r
+                       iOffset = o * pbtIn->iChannels;\r
+                       for (y = k - 1; y >= j; y--)\r
+                               {\r
+                               iCurrent -= pbtIn->iSamplesLine;\r
+                               iSample = iCurrent + iOffset;\r
+\r
+                               q = (y == l) ? '_' : ' ';\r
+                               /*u = '|';*/\r
+                               for (x = o; x < p; x++)\r
+                                       {\r
+                                       t = 0;\r
+                                       for (m = 0; m < pbtIn->iChannels; m++)\r
+                                               {\r
+                                               if\r
+                                                 ((pbtIn->pucSample[iSample++]\r
+                                                 ^ 0xff) >= 0x80)\r
+                                                       {\r
+                                                       t = 1;\r
+                                                       }\r
+                                               }\r
+                                       if (t)\r
+                                               {\r
+                                               *pc++ = '#';\r
+                                               *pc++ = '#';\r
+                                               }\r
+                                       else\r
+                                               {\r
+                                               *pc++ = q; /*u;*/\r
+                                               *pc++ = q;\r
+                                               }\r
+                                       /*u = q;*/\r
+                                       }\r
+\r
+                               *pc++ = q;\r
+                               *pc++ = q;\r
+                               *pc++ = '\r';\r
+                               *pc++ = '\n';\r
+                               }\r
+\r
+#if 0\r
+                       /*u = '|';*/\r
+                       for (x = o; x < p; x++)\r
+                               {\r
+                               *pc++ = ' '; /*u;*/\r
+                               *pc++ = ' ';\r
+                               /*u = ' ';*/\r
+                               }\r
+\r
+                       *pc++ = ' ';\r
+                       *pc++ = ' ';\r
+                       *pc++ = '\r';\r
+                       *pc++ = '\n';\r
+#endif\r
+                       }\r
+\r
+               }\r
+\r
+       MBFree(&mbhColumn);\r
+       MBFree(&mbhRow);\r
+       MBFree(&mbhTotal);\r
+\r
+       pftOut->pcAppend = pc;\r
+\r
+       return TRUE;\r
+       }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/bmp2txt.exe b/src/mkfont/bmp2txt.exe
new file mode 100644 (file)
index 0000000..fdf4e30
Binary files /dev/null and b/src/mkfont/bmp2txt.exe differ
diff --git a/src/mkfont/chs2cmd.cpp b/src/mkfont/chs2cmd.cpp
new file mode 100644 (file)
index 0000000..4a2af96
--- /dev/null
@@ -0,0 +1,109 @@
+// chs2cmd.cpp\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#include <stdio.h>\r
+#include <math.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include <windows.h>\r
+#pragma hdrstop\r
+#include "hymb.h"\r
+#include "hyfs.h"\r
+#include "hyfile.h"\r
+\r
+int main(int argc, char **argv);\r
+int fiProcess(FILETAG *ftOut, FILETAG *ftIn, int iICS, int iILS);\r
+int iCompare(const void *pvLeft, const void *pvRight);\r
+int iUpdateCRC(char *pcBase, int iCount, int iCRC);\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+FILETAG ftIn;\r
+char *pszInFileName;\r
+\r
+FILETAG ftOut;\r
+char *pszOutFileName;\r
+char szOutFileName[512];\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int main(int argc, char **argv)\r
+       {\r
+       int i, iSetNo;\r
+\r
+       if (argc > 1)\r
+               {\r
+               pszInFileName = argv[1];\r
+               }\r
+\r
+       iSetNo = 0;\r
+       if (argc > 2)\r
+               {\r
+               iSetNo = atoi(argv[2]);\r
+               if (iSetNo < 1 || iSetNo > 0xff)\r
+                       {\r
+                       pszOutFileName = argv[2];\r
+                       if (argc > 3)\r
+                               {\r
+                               iSetNo = atoi(argv[3]);\r
+                               }\r
+                       }\r
+               }\r
+\r
+       if (pszInFileName == NULL)\r
+               {\r
+               printf("usage: chs2cmd infile.txt [outfile.cmd] [setno]\n");\r
+               exit(1);\r
+               }\r
+\r
+       if (pszOutFileName == NULL)\r
+               {\r
+               pszOutFileName = szOutFileName;\r
+               strcpy(pszOutFileName, pszInFileName);\r
+\r
+               i = strlen(pszOutFileName);\r
+               while (i--)\r
+                       {\r
+                       if (pszOutFileName[i] == '\\')\r
+                               {\r
+                               break; /* no extension, so don't strip it */\r
+                               }\r
+                       if (pszOutFileName[i] == '.')\r
+                               {\r
+                               pszOutFileName[i] = 0; /* strip dot and extension */\r
+                               break; /* ready to concatenate our extension */\r
+                               }\r
+                       }\r
+\r
+               strcat(pszOutFileName, ".cmd");\r
+               }\r
+\r
+       if (!strcmp(pszInFileName, pszOutFileName))\r
+               {\r
+               printf("Input and output filenames identical\n");\r
+               exit(1);\r
+               }\r
+\r
+       // read the input bmp file entirely to a malloc'd block\r
+       FileReadIn(&ftIn, pszInFileName);\r
+\r
+       // create output buffer with esc plus character set data\r
+       FileCopyPadded(&ftOut, &ftIn, 5, 0);\r
+       ftOut.pcBase[0] = 0x1b;\r
+       ftOut.pcBase[1] = '.';\r
+       ftOut.pcBase[2] = iSetNo + '0';\r
+       *(short *)&ftOut.pcBase[3] = ftIn.pcAppend - ftIn.pcBase;\r
+\r
+       // ready to write the output we found\r
+       FileWriteOut(&ftOut, pszOutFileName);\r
+\r
+       // all done my friend\r
+       FileFree(&ftIn);\r
+       FileFree(&ftOut);\r
+\r
+       return 0;\r
+       }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/chs2cmd.exe b/src/mkfont/chs2cmd.exe
new file mode 100644 (file)
index 0000000..f355dbb
Binary files /dev/null and b/src/mkfont/chs2cmd.exe differ
diff --git a/src/mkfont/hyfile.cpp b/src/mkfont/hyfile.cpp
new file mode 100644 (file)
index 0000000..f39efc3
--- /dev/null
@@ -0,0 +1,307 @@
+// hyfile.cpp\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#include <io.h>\r
+#include <fcntl.h>\r
+#include <sys/stat.h>\r
+#include <stdio.h>\r
+#include <windows.h>\r
+#pragma hdrstop\r
+#include "hymb.h"\r
+#include "hyfs.h"\r
+#include "hyfile.h"\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiFileAllocate(FILETAG *pft, int iSize)\r
+     {\r
+     // zero the entire file tag item data area, avoiding leaks\r
+     memset(pft, 0, sizeof(FILETAG));\r
+\r
+     // allocate via the lower level wrapper, relying on the fact\r
+     // that the FILETAG structure is compatible with MBHANDLE !!\r
+     if (fiMBAlloc((MBHANDLE *) pft, iSize) == 0)\r
+          {\r
+          return FALSE; // indicates failure to allocate block\r
+          }\r
+\r
+     // set position to start and file to null\r
+     pft->pcPosition = pft->pcBase;\r
+     pft->pcAppend = pft->pcBase;\r
+\r
+     // say it is now allocated\r
+     return TRUE;\r
+     }\r
+\r
+int fiFileFree(FILETAG *pft)\r
+     {\r
+     // free via the lower level wrapper, relying on the fact\r
+     // that the FILETAG structure is compatible with MBHANDLE !!\r
+     if (fiMBFree((MBHANDLE *) pft) == 0)\r
+          {\r
+          return FALSE; // indicates failure to free block\r
+          }\r
+\r
+     // zero the entire file tag item data area, avoiding leaks\r
+     memset(pft, 0, sizeof(FILETAG));\r
+\r
+     return TRUE; // indicates block freed and tag item zeroed\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiFileWriteOut(FILETAG *pft, char *pszName)\r
+     {\r
+     int iSize;\r
+     FSHANDLE fsh;\r
+\r
+     // attempt to create or truncate file for writing\r
+     if (fiFSCreate(&fsh, pszName) == FALSE)\r
+          {\r
+          return FALSE; // probably directory not found\r
+          }\r
+\r
+     // attempt to write the exact amount of data\r
+     iSize = iFileSize(pft);\r
+     if (iFSWrite(&fsh, pft->pcBase, iSize) != iSize)\r
+          {\r
+          fiFSClose(&fsh);\r
+          return FALSE;\r
+          }\r
+\r
+     fiFSClose(&fsh);\r
+     return TRUE; // says we wrote the file\r
+     }\r
+\r
+int fiFileReadIn(FILETAG *pft, char *pszName)\r
+     {\r
+     int iSize;\r
+     FSHANDLE fsh;\r
+\r
+     // zero the entire file tag item data area, avoiding leaks\r
+     memset(pft, 0, sizeof(FILETAG));\r
+\r
+     // attempt to open file for reading, get size\r
+     if (fiFSOpen(&fsh, pszName) == FALSE)\r
+          {\r
+          return FALSE; // probably file not found\r
+          }\r
+     iSize = filelength(fsh.iHandle); // assume can get size\r
+\r
+#if 0\r
+     // sanity check for file much too large\r
+     if (iSize > 0x100000) // 1 megabyte\r
+          {\r
+          fiFSClose(&fsh);\r
+          return FALSE;\r
+          }\r
+#endif\r
+\r
+     // allocate heap to hold entire file\r
+     // note: simpler than the array or pool implementation,\r
+     // because the original limit, position, append info lost\r
+     if (fiFileAllocate(pft, iSize) == FALSE)\r
+          {\r
+          fiFSClose(&fsh);\r
+          return FALSE;\r
+          }\r
+\r
+     // attempt read the exact amount of data\r
+     if (iFSRead(&fsh, pft->pcBase, iSize) != iSize)\r
+          {\r
+          fiFileFree(pft);\r
+          fiFSClose(&fsh);\r
+          return FALSE;\r
+          }\r
+\r
+     fiFSClose(&fsh);\r
+\r
+     // set position to start and length to length read\r
+     pft->pcPosition = pft->pcBase;\r
+     pft->pcAppend = pft->pcBase + iSize;\r
+\r
+     return TRUE; // says we read the file\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiFileCopy(FILETAG *pft, FILETAG *pftIn)\r
+     {\r
+     int i, iSize;\r
+\r
+     // zero the entire file tag item data area, avoiding leaks\r
+     memset(pft, 0, sizeof(FILETAG));\r
+\r
+     // allocate via the lower level wrapper, relying on the fact\r
+     // that the FILETAG structure is compatible with MBHANDLE !!\r
+     iSize = iFileSize(pftIn);\r
+     if (fiMBAlloc((MBHANDLE *) pft, iSize) == FALSE)\r
+          {\r
+          return FALSE; // indicates failure to allocate block\r
+          }\r
+\r
+     // calculate the required adjustment, before clobbering pft!\r
+     i = pft->pcBase - pftIn->pcBase;\r
+\r
+     // copy the entire file tag item data area, avoiding leaks\r
+     memcpy(pft, pftIn, iSize);\r
+\r
+     // apply the required adjustment to all fields of filetag\r
+     pft->pcBase += i;\r
+     //pft->pcLimit += i;\r
+     pft->pcPosition += i;\r
+     pft->pcAppend += i;\r
+\r
+     // another slight adjustment because the copy trims to size\r
+     pft->pcLimit = pft->pcAppend;\r
+     return TRUE; // indicates copied and new tag item filled out\r
+     }\r
+\r
+int fiFileCopyPadded(FILETAG *pft, FILETAG *pftIn, int iLeft, int iRight)\r
+     {\r
+     int i, iSize;\r
+\r
+     // zero the entire file tag item data area, avoiding leaks\r
+     memset(pft, 0, sizeof(FILETAG));\r
+\r
+     // allocate via the lower level wrapper, relying on the fact\r
+     // that the FILETAG structure is compatible with MBHANDLE !!\r
+     iSize = iFileSize(pftIn);\r
+     if (fiMBAlloc((MBHANDLE *) pft, iLeft + iSize + iRight) == FALSE)\r
+          {\r
+          return FALSE; // indicates failure to allocate block\r
+          }\r
+\r
+     // calculate the required adjustment, before clobbering pft!\r
+     i = pft->pcBase - pftIn->pcBase;\r
+\r
+     // copy the entire file tag item data area, avoiding leaks\r
+     memcpy(pft, pftIn, sizeof(FILETAG));\r
+\r
+     // apply the required adjustment to all fields of filetag\r
+     pft->pcBase += i;\r
+     //pft->pcLimit += i;\r
+     pft->pcPosition += iLeft + i;\r
+     pft->pcAppend += iLeft + i + iRight;\r
+\r
+     // another slight adjustment because the copy trims to size\r
+     pft->pcLimit = pft->pcAppend;\r
+\r
+     // copy the actual data, with padding as specified by caller\r
+     memset(pft->pcBase, 0, iLeft);\r
+     memcpy(pft->pcBase + iLeft, pftIn->pcBase, iSize);\r
+     memset(pft->pcBase + iLeft + iSize, 0, iRight);\r
+\r
+     return TRUE; // indicates copied and new tag item filled out\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiFilePutLine(FILETAG *pft, char *pszLine)\r
+     {\r
+     int iTemp;\r
+\r
+     // calculate length once\r
+     iTemp = 0;\r
+     if (pszLine != NULL)\r
+          {\r
+          iTemp = strlen(pszLine);\r
+          }\r
+\r
+     // do not go past end of memory\r
+     if ((pft->pcPosition + iTemp + 2) > pft->pcLimit)\r
+          {\r
+          return FALSE;\r
+          }\r
+\r
+     // copy line and crlf terminator out to heap\r
+     if (pszLine != NULL)\r
+          {\r
+          memcpy(pft->pcPosition, pszLine, iTemp);\r
+          }\r
+     memcpy(pft->pcPosition + iTemp, "\r\n", 2);\r
+     pft->pcPosition += iTemp + 2;\r
+\r
+     // set file length possibly truncating\r
+     pft->pcAppend = pft->pcPosition;\r
+\r
+     // say we stored a line\r
+     return TRUE;\r
+     }\r
+\r
+int fiFileGetLine(FILETAG *pft, char *pszLine, int iLimit, int *piCount)\r
+     {\r
+     int i;\r
+\r
+     // indicate eof to caller\r
+     if (pft->pcPosition >= pft->pcAppend)\r
+          {\r
+          // if caller requested the length of the result, return null\r
+          if (piCount != NULL)\r
+               {\r
+               *piCount = 0;\r
+               }\r
+\r
+          // the return value from the function indicates eof or not\r
+          return FALSE;\r
+          }\r
+\r
+     for (i = 0; i < iLimit; i++)\r
+          {\r
+          // terminate the loop for eof\r
+          if (pft->pcPosition >= pft->pcAppend)\r
+               {\r
+               break;\r
+               }\r
+\r
+          // terminate the loop for lf by itself\r
+          if (*pft->pcPosition == 0x0a)\r
+               {\r
+               (pft->pcPosition)++;\r
+               break;\r
+               }\r
+\r
+          // terminate the loop for cr optionally skipping lf\r
+          if (*pft->pcPosition == 0x0d)\r
+               {\r
+               (pft->pcPosition)++;\r
+               if (*pft->pcPosition == 0x0a)\r
+                    {\r
+                    pft->pcPosition++;\r
+                    }\r
+               break;\r
+               }\r
+\r
+          // copy character to caller buffer\r
+          if (pszLine != NULL)\r
+               {\r
+               pszLine[i] = *pft->pcPosition; // formerly ++\r
+               }\r
+          pft->pcPosition++;\r
+          }\r
+\r
+     // null terminate string for caller\r
+     if (pszLine != NULL)\r
+          {\r
+          // see hyprintf.cpp, but i decided to do this differently here!!\r
+          //// sentinel is not always placed, so use the length instead !!\r
+          //// callers wishing to bodgy can use count-1 and poke their own 0\r
+          //if (i < iCount)\r
+          //     {\r
+               pszLine[i] = 0;\r
+          //     }\r
+          }\r
+\r
+     // if caller requested the length of the result, return it\r
+     if (piCount != NULL)\r
+          {\r
+          *piCount = i;\r
+          }\r
+\r
+     // the return value from the function indicates eof or not\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/hyfile.h b/src/mkfont/hyfile.h
new file mode 100644 (file)
index 0000000..0d8a1dd
--- /dev/null
@@ -0,0 +1,125 @@
+// hyfile.h\r
+\r
+#ifndef _INC_HYFILE\r
+#define _INC_HYFILE\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+typedef struct\r
+{\r
+     char *pcBase;                 // also the handle for the malloc'd buffer\r
+     char *pcLimit;                // offset just after end of malloc'd buffer\r
+     char *pcPosition;             // offset of the next char to be clobbered\r
+     char *pcAppend;               // offset just after end of valid char data\r
+} FILETAG;\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiFileAllocate(FILETAG *pft, int iSize);\r
+int fiFileFree(FILETAG *pft);\r
+\r
+int fiFileWriteOut(FILETAG *pft, char *pszName);\r
+int fiFileReadIn(FILETAG *pft, char *pszName);\r
+\r
+int fiFileCopy(FILETAG *pft, FILETAG *pftIn);\r
+int fiFileCopyPadded(FILETAG *pft, FILETAG *pftIn, int iLeft, int iRight);\r
+\r
+int fiFilePutLine(FILETAG *pft, char *pszLine);\r
+int fiFileGetLine(FILETAG *pft, char *pszLine, int iLimit, int *piCount);\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+inline int iFileSize(FILETAG *pft)\r
+     {\r
+     // return size in bytes, for use by FileReadIn etc family\r
+     return pft->pcAppend - pft->pcBase; // note: the trimmed size\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+// handy functions for the client, not important to the interface:\r
+\r
+#ifdef _INC_STDIO\r
+inline void FileAllocate(FILETAG *pft, int iSize)\r
+     {\r
+     if (fiFileAllocate(pft, iSize) == FALSE)\r
+          {\r
+          printf("FileAllocate: Could not allocate %08x bytes\n", iSize);\r
+          exit(1);\r
+          }\r
+\r
+#ifdef DEBUG\r
+     printf("FileAllocate: "\r
+            "Allocated file %08x, %08x bytes\n", pft, iSize);\r
+#endif\r
+     }\r
+\r
+inline void FileFree(FILETAG *pft)\r
+     {\r
+     if (fiFileFree(pft) == FALSE)\r
+          {\r
+          printf("FileFree: Could not free file %08x\n", pft);\r
+          exit(1);\r
+          }\r
+\r
+#ifdef DEBUG\r
+     printf("FileFree: Freed file %08x\n", pft);\r
+#endif\r
+     }\r
+\r
+inline void FileReadIn(FILETAG *pft, char *pszName)\r
+     {\r
+     if (fiFileReadIn(pft, pszName) == FALSE)\r
+          {\r
+          printf("FileReadIn: Could not read %s\n", pszName);\r
+          exit(1);\r
+          }\r
+\r
+     printf(\r
+#ifdef DEBUG\r
+            "FileReadIn: "\r
+#endif\r
+           "Loaded %s, 0x%08x bytes\n",\r
+            pszName, pft->pcAppend - pft->pcBase);\r
+     }\r
+\r
+inline void FileWriteOut(FILETAG *pft, char *pszName)\r
+     {\r
+     if (fiFileWriteOut(pft, pszName) == FALSE)\r
+          {\r
+          printf("FileWriteOut: Could not write %s\n", pszName);\r
+          exit(1);\r
+          }\r
+\r
+     printf(\r
+#ifdef DEBUG\r
+            "FileWriteOut: "\r
+#endif\r
+            "Created %s, 0x%08x bytes\n",\r
+            pszName, pft->pcAppend - pft->pcBase);\r
+     }\r
+\r
+inline void FileCopy(FILETAG *pft, FILETAG *pftIn)\r
+     {\r
+     if (fiFileCopy(pft, pftIn) == FALSE)\r
+          {\r
+          printf("FileCopy: Could not copy 0x%08x bytes\n",\r
+                 pftIn->pcAppend - pftIn->pcBase);\r
+          exit(1);\r
+          }\r
+     }\r
+\r
+inline void FileCopyPadded(FILETAG *pft, FILETAG *pftIn, int iLeft, int iRight)\r
+     {\r
+     if (fiFileCopyPadded(pft, pftIn, iLeft, iRight) == FALSE)\r
+          {\r
+          printf("FileCopyPadded: Could not copy 0x%08x bytes\n",\r
+                 (pftIn->pcAppend - pftIn->pcBase) + iLeft + iRight);\r
+          exit(1);\r
+          }\r
+     }\r
+#endif\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#endif\r
+\r
diff --git a/src/mkfont/hyfs.cpp b/src/mkfont/hyfs.cpp
new file mode 100644 (file)
index 0000000..ebdf991
--- /dev/null
@@ -0,0 +1,137 @@
+// hyfs.cpp\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#include <io.h>\r
+#include <fcntl.h>\r
+#include <sys/stat.h>\r
+#include <stdio.h>\r
+#include <windows.h>\r
+#pragma hdrstop\r
+#include "hyfs.h"\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+void FSEntrySetup(void)\r
+     {\r
+     // for future expansion, including GetModuleFileName\r
+     }\r
+\r
+void FSExitCleanup(void)\r
+     {\r
+     // for future expansion\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiFSOpen(FSHANDLE *pfsh, char *pszName)\r
+     {\r
+     // clear filestreamtag, although we should also free name and error if\r
+     // not null, so calling convention needs to be revised (zero it for now)\r
+     memset(pfsh, 0, sizeof(FSHANDLE));\r
+\r
+     // set up fields to print a report on closure\r
+     //pfsh->iMode = 0;\r
+     //pfsh->iCount = 0;\r
+\r
+     // attempt to open file or device for reading\r
+     pfsh->pszName = pszName;\r
+     pfsh->iHandle = open(pszName, O_RDONLY | O_BINARY);\r
+     if (pfsh->iHandle < 0)\r
+          {\r
+          pfsh->iError = IDS_ERROR_FS_OPEN;\r
+          return FALSE;\r
+          }\r
+\r
+     // indicate successful operation\r
+     //pfsh->iError = 0;\r
+     return TRUE;\r
+     }\r
+\r
+int fiFSCreate(FSHANDLE *pfsh, char *pszName)\r
+     {\r
+     // clear filestreamtag, although we should also free name and error if\r
+     // not null, so calling convention needs to be revised (zero it for now)\r
+     memset(pfsh, 0, sizeof(FSHANDLE));\r
+\r
+     // set up fields to print a report on closure\r
+     pfsh->iMode = 1;\r
+     //pfsh->iCount = 0;\r
+\r
+     // attempt to create file or open device for writing\r
+     pfsh->pszName = pszName;\r
+     pfsh->iHandle = open(pszName, O_RDWR | O_CREAT | O_TRUNC | O_BINARY,\r
+                                   S_IREAD | S_IWRITE);\r
+     if (pfsh->iHandle < 0)\r
+          {\r
+          pfsh->iError = IDS_ERROR_FS_CREATE;\r
+          return FALSE;\r
+          }\r
+\r
+     // indicate successful operation\r
+     //pfsh->iError = 0;\r
+     return TRUE;\r
+     }\r
+\r
+int fiFSClose(FSHANDLE *pfsh)\r
+     {\r
+     int i;\r
+\r
+     // attempt to close file, noting success\r
+     i = close(pfsh->iHandle);\r
+     if (i < 0) // check msdn\r
+          {\r
+          pfsh->iError = IDS_ERROR_FS_CLOSE;\r
+          return FALSE;\r
+          }\r
+     pfsh->iHandle = -1; // for no good reason\r
+\r
+     // indicate successful operation\r
+     pfsh->iError = 0;\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int iFSRead(FSHANDLE *pfsh, char *pcOut, int iLimit)\r
+     {\r
+     int i;\r
+\r
+     // attempt to open file or device for reading\r
+     i = read(pfsh->iHandle, pcOut, iLimit);\r
+     if (i < 0) // check msdn\r
+          {\r
+          pfsh->iError = IDS_ERROR_FS_READ;\r
+          return 0;\r
+          }\r
+\r
+     // maintain fields to print a report on closure\r
+     pfsh->iCount += i;\r
+\r
+     // indicate successful operation\r
+     pfsh->iError = 0;\r
+     return i;\r
+     }\r
+\r
+int iFSWrite(FSHANDLE *pfsh, char *pcIn, int iLimit)\r
+     {\r
+     int i;\r
+\r
+     // attempt to open file or device for reading\r
+     i = write(pfsh->iHandle, pcIn, iLimit);\r
+     if (i < 0) // check msdn\r
+          {\r
+          pfsh->iError = IDS_ERROR_FS_WRITE;\r
+          return 0;\r
+          }\r
+\r
+     // maintain fields to print a report on closure\r
+     pfsh->iCount += i;\r
+\r
+     // indicate successful operation\r
+     pfsh->iError = 0;\r
+     return i;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/hyfs.h b/src/mkfont/hyfs.h
new file mode 100644 (file)
index 0000000..cb85160
--- /dev/null
@@ -0,0 +1,121 @@
+// hyfs.h\r
+\r
+#define _INC_HYFS\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#define IDS_ERROR_FS_OPEN      12000\r
+#define IDS_ERROR_FS_CREATE    12001\r
+#define IDS_ERROR_FS_CLOSE     12002\r
+#define IDS_ERROR_FS_READ      12003\r
+#define IDS_ERROR_FS_WRITE     12004\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+typedef struct\r
+     {\r
+     int iHandle;\r
+     char *pszName;\r
+\r
+     int iMode;\r
+     int iCount;\r
+\r
+     int iError;\r
+     char *pszError;\r
+     } FSHANDLE;\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+void FSEntrySetup(void);\r
+void FSExitCleanup(void);\r
+\r
+int fiFSOpen(FSHANDLE *pfsh, char *pszName);\r
+int fiFSCreate(FSHANDLE *pfsh, char *pszName);\r
+int fiFSClose(FSHANDLE *pfsh);\r
+\r
+int iFSRead(FSHANDLE *pfsh, char *pcOut, int iLimit);\r
+int iFSWrite(FSHANDLE *pfsh, char *pcIn, int iLimit);\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+inline void FSOpen(FSHANDLE *pfsh, char *pszName)\r
+     {\r
+     if (fiFSOpen(pfsh, pszName) == 0)\r
+          {\r
+          printf("FSOpen: "\r
+                 "Could not open file %s for reading, exiting\n", pszName);\r
+          exit(1);\r
+          }\r
+\r
+     printf("FSOpen: "\r
+            "Handle %08x file %s opened, read mode\n", pfsh, pszName);\r
+     }\r
+\r
+inline void FSCreate(FSHANDLE *pfsh, char *pszName)\r
+     {\r
+     if (fiFSCreate(pfsh, pszName) == 0)\r
+          {\r
+          printf("FSCreate: "\r
+                 "Could not create or truncate file %s, exiting\n", pszName);\r
+          exit(1);\r
+          }\r
+\r
+     printf("FSCreate: "\r
+            "Handle %08x file %s opened, write mode\n", pfsh, pszName);\r
+     }\r
+\r
+inline void FSClose(FSHANDLE *pfsh)\r
+     {\r
+     if (fiFSClose(pfsh) == 0)\r
+          {\r
+          printf("FSClose: "\r
+                 "Could not close handle %08x, exiting\n", pfsh);\r
+          exit(1);\r
+          }\r
+\r
+     printf("FSClose: "\r
+            "Handle %08x file %s closed, %s mode\n",\r
+            pfsh, pfsh->pszName, pfsh->iMode ? "write" : "read");\r
+\r
+     printf("Loaded file %s, size %d bytes\n",\r
+            pfsh->pszName, pfsh->iCount);\r
+     }\r
+\r
+inline void FSRead(FSHANDLE *pfsh, char *pcOut, int iLimit)\r
+     {\r
+     int iCount;\r
+\r
+     iCount = iFSRead(pfsh, pcOut, iLimit);\r
+     if (iCount != iLimit)\r
+          {\r
+          printf("FSRead: "\r
+                 "End of file, handle %08x, request %d, return %d\n",\r
+                 pfsh, iLimit, iCount);\r
+          exit(1);\r
+          }\r
+\r
+     printf("FSRead: "\r
+            "Handle %08x file %s read, request %d, return %d\n",\r
+            pfsh, pfsh->pszName, iLimit, iCount);\r
+     }\r
+\r
+inline void FSWrite(FSHANDLE *pfsh, char *pcIn, int iLimit)\r
+     {\r
+     int iCount;\r
+\r
+     iCount = iFSWrite(pfsh, pcIn, iLimit);\r
+     if (iCount != iLimit)\r
+          {\r
+          printf("FSWrite: "\r
+                 "Disk full, handle %08x, request %d, return %d\n",\r
+                 pfsh, iLimit, iCount);\r
+          exit(1);\r
+          }\r
+\r
+     printf("FSWrite: "\r
+            "Handle %08x file %s written, request %d, return %d\n",\r
+            pfsh, pfsh->pszName, iLimit, iCount);\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/hyimage.cpp b/src/mkfont/hyimage.cpp
new file mode 100644 (file)
index 0000000..dfc111f
--- /dev/null
@@ -0,0 +1,1230 @@
+// hyimage.cpp\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#include <stdio.h>\r
+#include <math.h>\r
+#include <windows.h>\r
+#pragma hdrstop\r
+#include "hyfile.h"\r
+#include "hyimage.h"\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+BITMAPFILEHEADER bfhDefault =\r
+     {\r
+     0x4D42, // bfType = 'BM'\r
+     0,      // bfSize\r
+     0,      // bfReserved1\r
+     0,      // bfReserved2\r
+     0,      // bfOffBits\r
+     };\r
+\r
+/*\r
+BITMAPINFOHEADER bihDefault =\r
+     {\r
+     0x46465952, // iFileId = 'RIFF'\r
+     0,          // iFileSize\r
+     0x45564157, // iTypeId = 'BMPE'\r
+     0x20746d66, // iFormatId = 'fmt_'\r
+     0x10,       // iFormatSize\r
+     1,          // siFormatTag\r
+     2,          // siChannels\r
+     44100,      // iPixelRate\r
+     176400,     // iByteRate\r
+     4,          // siAlignment\r
+     16,         // siBitsPixel\r
+     0x61746164, // iDataId = 'data'\r
+     0           // iDataSize\r
+     };\r
+*/\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiBmpAllocate(BMPTAG *pbt, BITMAPINFOHEADER *pbihIn,\r
+                  int cxPixels, int cyPixels)\r
+     {\r
+     int iPalette;\r
+     int iBitsPixel, iBitsLine;\r
+     int iPixelsLine, iBytes;\r
+\r
+     // fill important bmptag fields from the user's bmp header\r
+     pbt->iChannels = max(1, pbihIn->biBitCount / 8);\r
+     pbt->iBitsChannel = pbihIn->biBitCount / pbt->iChannels;\r
+\r
+     // calculate overall image size and required storage\r
+     iBitsPixel = pbt->iChannels * pbt->iBitsChannel;\r
+     iBitsLine = (cxPixels * iBitsPixel + 0x1f) & 0xffffffe0;\r
+\r
+     pbt->iSamplesLine = iBitsLine / pbt->iBitsChannel;\r
+\r
+     iBytes = cyPixels * (iBitsLine / 8);\r
+\r
+     iPalette = 0;\r
+     if (pbt->iChannels == 1)\r
+          {\r
+          iPalette = sizeof(RGBQUAD) << pbt->iBitsChannel;\r
+          }\r
+\r
+     // allocate and initialise memory block for header + data\r
+     if (fiFileAllocate(&pbt->ft, sizeof(BITMAPFILEHEADER) +\r
+                                  sizeof(BITMAPINFOHEADER) +\r
+                                  iPalette + iBytes) == FALSE)\r
+          {\r
+          return FALSE;\r
+          }\r
+\r
+     memset(pbt->ft.pcBase, 0, pbt->ft.pcLimit - pbt->ft.pcBase);\r
+\r
+     // fill bmptag fields which refer to the allocated memory block\r
+     pbt->pbfh = (BITMAPFILEHEADER *) (pbt->ft.pcBase);\r
+     pbt->pbih = (BITMAPINFOHEADER *) (pbt->ft.pcBase +\r
+                                       sizeof(BITMAPFILEHEADER));\r
+     pbt->prgbq = (RGBQUAD *) (pbt->ft.pcBase +\r
+                               sizeof(BITMAPFILEHEADER) +\r
+                               sizeof(BITMAPINFOHEADER));\r
+     pbt->pucSample = (unsigned char *) (pbt->ft.pcBase +\r
+                                        sizeof(BITMAPFILEHEADER) +\r
+                                        sizeof(BITMAPINFOHEADER));\r
+     if (pbt->iChannels == 1)\r
+          {\r
+          pbt->pucSample += sizeof(RGBQUAD) << pbt->iBitsChannel;\r
+          }\r
+\r
+     // initialise bitmap header within the allocated block\r
+     memcpy(pbt->pbfh, &bfhDefault, sizeof(BITMAPFILEHEADER));\r
+     pbt->pbfh->bfOffBits = (char *) (pbt->pucSample) - pbt->ft.pcBase;\r
+     pbt->pbfh->bfSize = pbt->pbfh->bfOffBits + iBytes;\r
+\r
+     memcpy(pbt->pbih, pbihIn, sizeof(BITMAPINFOHEADER));\r
+     pbt->pbih->biWidth = cxPixels;\r
+     pbt->pbih->biHeight = cyPixels;\r
+\r
+     // initialise the remainder of the bmptag for client\r
+     pbt->iSampleBase = 0;\r
+     pbt->iSampleLimit = pbt->pbih->biHeight * pbt->iSamplesLine;\r
+     pbt->iSamplePosition = 0;\r
+     pbt->iSampleAppend = 0;\r
+\r
+     //pbt->rPixelWindow.left = 0;\r
+     //pbt->rPixelWindow.right = pbt->pbih->biWidth;\r
+     //pbt->rPixelWindow.bottom = 0;\r
+     //pbt->rPixelWindow.top = pbt->pbih->biHeight;\r
+\r
+     //pbt->rPixelSurface.left = 0;\r
+     //pbt->rPixelSurface.right = iBitsLine / iBitsPixel;\r
+     //pbt->rPixelSurface.bottom = 0;\r
+     //pbt->rPixelSurface.top = pbt->pbih->biHeight;\r
+\r
+     // say we met with success\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiBmpReadIn(BMPTAG *pbt, char *pszFileName)\r
+     {\r
+     int iBitsPixel, iBitsLine, iPixelsLine;\r
+\r
+     // attempt to read the client's requested file fully\r
+     if (fiFileReadIn(&pbt->ft, pszFileName) == FALSE)\r
+          {\r
+          return FALSE;\r
+          }\r
+\r
+     // fill bmptag fields which refer to the allocated memory block\r
+     pbt->pbfh = (BITMAPFILEHEADER *) (pbt->ft.pcBase);\r
+     pbt->pbih = (BITMAPINFOHEADER *) (pbt->ft.pcBase +\r
+                                       sizeof(BITMAPFILEHEADER));\r
+     pbt->prgbq = (RGBQUAD *) (pbt->ft.pcBase +\r
+                               sizeof(BITMAPFILEHEADER) +\r
+                               sizeof(BITMAPINFOHEADER));\r
+\r
+     // check the file format in place before using header fields\r
+     if ((pbt->pbih->biPlanes != 1) ||\r
+         ((pbt->pbih->biBitCount != 1) &&\r
+          (pbt->pbih->biBitCount != 8) &&\r
+          (pbt->pbih->biBitCount != 24) &&\r
+          (pbt->pbih->biBitCount != 32)))\r
+         {\r
+         printf("fiBmpReadIn: Invalid BMP file %s\n", pszFileName);\r
+         FileFree(&pbt->ft);\r
+         return FALSE;\r
+         }\r
+// printf("%d %d\n", pbt->pbih->biWidth, pbt->pbih->biHeight);\r
+\r
+     // fill important bmptag fields from the user's bmp header\r
+     pbt->iChannels = max(1, pbt->pbih->biBitCount / 8);\r
+     pbt->iBitsChannel = pbt->pbih->biBitCount / pbt->iChannels;\r
+// printf("%d %d\n", pbt->iChannels, pbt->iBitsChannel);\r
+\r
+     pbt->pucSample = (unsigned char *) (pbt->ft.pcBase +\r
+                                        sizeof(BITMAPFILEHEADER) +\r
+                                        sizeof(BITMAPINFOHEADER));\r
+     if (pbt->iChannels == 1)\r
+          {\r
+          pbt->pucSample += sizeof(RGBQUAD) << pbt->iBitsChannel;\r
+          }\r
+\r
+     iBitsPixel = pbt->iChannels * pbt->iBitsChannel;\r
+     iBitsLine = (pbt->pbih->biWidth * iBitsPixel + 0x1f) & 0xffffffe0;\r
+\r
+     pbt->iSamplesLine = iBitsLine / pbt->iBitsChannel;\r
+\r
+     // initialise the remainder of the bmptag for client\r
+     pbt->iSampleBase = 0;\r
+     pbt->iSamplePosition = 0;\r
+     pbt->iSampleAppend = pbt->pbih->biHeight * pbt->iSamplesLine;\r
+     pbt->iSampleLimit = pbt->iSampleAppend;\r
+\r
+     //pbt->rPixelWindow.left = 0;\r
+     //pbt->rPixelWindow.right = pbt->pbih->biWidth;\r
+     //pbt->rPixelWindow.bottom = 0;\r
+     //pbt->rPixelWindow.top = pbt->pbih->biHeight;\r
+\r
+     //pbt->rPixelSurface.left = 0;\r
+     //pbt->rPixelSurface.right = iBitsLine / iBitsPixel;\r
+     //pbt->rPixelSurface.bottom = 0;\r
+     //pbt->rPixelSurface.top = pbt->pbih->biHeight;\r
+\r
+     // say we met with success\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiBmpWriteOut(BMPTAG *pbt, char *pszFileName)\r
+     {\r
+     int i, j, k;\r
+     int iBitsPixel, iBitsLine;\r
+     int iBytesLine, iBytes;\r
+\r
+     // update bmp file and info header lengths from length generated\r
+     iBitsPixel = pbt->iChannels * pbt->iBitsChannel;\r
+     iBitsLine = (pbt->pbih->biWidth * iBitsPixel + 0x1f) & 0xffffffe0;\r
+\r
+     iBytesLine = iBitsLine / 8;\r
+     iBytes = pbt->pbih->biHeight * iBytesLine;\r
+\r
+     pbt->pbfh->bfOffBits = (char *) (pbt->pucSample) - pbt->ft.pcBase;\r
+     pbt->pbfh->bfSize = pbt->pbfh->bfOffBits + iBytes;\r
+\r
+     // refresh palette within file data if any palette is required\r
+     if (pbt->iChannels == 1)\r
+          {\r
+          j = 0;\r
+          k = 1 << pbt->iBitsChannel;\r
+          for (i = 0; i < k; i++)\r
+               {\r
+               ((int *) (pbt->prgbq))[i] = j;\r
+               j += 0x00010101;\r
+               }\r
+          }\r
+\r
+     // update bmp info header information for client selected format\r
+     pbt->pbih->biPlanes = 1; // the red baron\r
+     pbt->pbih->biBitCount = pbt->iChannels * pbt->iBitsChannel;\r
+\r
+     // update length in output filetag then write out\r
+     pbt->ft.pcAppend = (char *) (pbt->pucSample) + iBytes;\r
+     return fiFileWriteOut(&pbt->ft, pszFileName);\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+void BmpFree(BMPTAG *pbt)\r
+     {\r
+     FileFree(&pbt->ft);\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiBmpCopy(BMPTAG *pbt, BMPTAG *pbtIn)\r
+     {\r
+     // copy the tag item, which will then be modified\r
+     memcpy(pbt, pbtIn, sizeof(BMPTAG));\r
+\r
+     // redirect the new tag item to a new malloc'd buffer\r
+     pbt->ft.pcBase = (char *) malloc(pbt->ft.pcLimit - pbt->ft.pcBase);\r
+     if (pbt->ft.pcBase == NULL)\r
+          {\r
+          printf("fiBmpCopy: "\r
+                 "Could not allocate copy buffer of %08x bytes\n",\r
+                 pbt->ft.pcLimit - pbt->ft.pcBase);\r
+          return FALSE;\r
+          }\r
+\r
+     // copy the original sample data into the new malloc'd buffer\r
+     memcpy(pbt->ft.pcBase, pbtIn->ft.pcBase,\r
+                            pbtIn->ft.pcLimit - pbtIn->ft.pcBase);\r
+\r
+     // fill bmptag fields which refer to the allocated memory block\r
+     pbt->pbfh = (BITMAPFILEHEADER *) (pbt->ft.pcBase);\r
+     pbt->pbih = (BITMAPINFOHEADER *) (pbt->ft.pcBase +\r
+                                       sizeof(BITMAPFILEHEADER));\r
+     pbt->prgbq = (RGBQUAD *) (pbt->ft.pcBase +\r
+                               sizeof(BITMAPFILEHEADER) +\r
+                               sizeof(BITMAPINFOHEADER));\r
+     pbt->pucSample = (unsigned char *) (pbt->ft.pcBase +\r
+                                        sizeof(BITMAPFILEHEADER) +\r
+                                        sizeof(BITMAPINFOHEADER));\r
+     if (pbt->iChannels == 1)\r
+          {\r
+          pbt->pucSample += sizeof(RGBQUAD) << pbt->iBitsChannel;\r
+          }\r
+\r
+     // sneakily nudge the remaining fields of the new tag item\r
+     pbt->ft.pcLimit += pbt->ft.pcBase - pbtIn->ft.pcBase;\r
+     pbt->ft.pcPosition += pbt->ft.pcBase - pbtIn->ft.pcBase;\r
+     pbt->ft.pcAppend += pbt->ft.pcBase - pbtIn->ft.pcBase;\r
+\r
+     // say we met with success\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiLinearExpand2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxFactor, int cyFactor)\r
+     {\r
+     int i, j, k, l, m, x, y, t;\r
+     int cxIn, cyIn, cxOut, cyOut;\r
+     int cxCentre, cyCentre;\r
+     int cxLeftFraction, cxRightFraction;\r
+     int cyTopFraction, cyBottomFraction;\r
+     int iLine, iPixel, iSample;\r
+     int *pi, *piThis, *piPrev, *piTemp;\r
+     int iThis[4], iPrev[4], iNormal;\r
+\r
+     cxIn = pbtIn->pbih->biWidth;\r
+     cyIn = pbtIn->pbih->biHeight;\r
+\r
+     cxOut = cxIn * cxFactor;\r
+     cyOut = cyIn * cyFactor;\r
+\r
+     if (fiBmpAllocate(pbtOut, pbtIn->pbih, cxOut, cyOut) == FALSE)\r
+          {\r
+          printf("fiLinearExpand2D: "\r
+                 "Failed to allocate output buffer of %08x pixels\n",\r
+                 cxOut * cyOut);\r
+          return FALSE;\r
+          }\r
+\r
+     pi = (int *) malloc(cxOut * pbtIn->iChannels * 2 * sizeof(int));\r
+     if (pi == NULL)\r
+          {\r
+          printf("fiLinearExpand2D: "\r
+                 "Failed to allocate temporary buffer of %08x samples\n",\r
+                 cxOut * pbtIn->iChannels * 2);\r
+          BmpFree(pbtOut);\r
+          return FALSE;\r
+          }\r
+\r
+     piThis = pi;\r
+     piPrev = pi + cxOut * pbtIn->iChannels;\r
+\r
+     cxCentre = cxFactor / 2;\r
+     cyCentre = cyFactor / 2;\r
+\r
+     cyBottomFraction = cyCentre;\r
+     cyTopFraction = cyFactor;\r
+     memset(piThis, 0, cxOut * pbtIn->iChannels * sizeof(int));\r
+\r
+     iNormal = cxFactor * cyFactor;\r
+\r
+     i = 0;\r
+     iLine = 0;\r
+     for (y = 0; y <= cyIn; y++)\r
+          {\r
+          iPixel = iLine;\r
+          iLine += pbtIn->iSamplesLine;\r
+\r
+          piTemp = piPrev;\r
+          piPrev = piThis;\r
+          piThis = piTemp;\r
+\r
+          if (y < cyIn)\r
+               {\r
+               cxLeftFraction = cxCentre;\r
+               cxRightFraction = cxFactor;\r
+               memset(iThis, 0, pbtIn->iChannels * sizeof(int));\r
+\r
+               t = 0;\r
+               iSample = iPixel;\r
+               for (x = 0; x <= cxIn; x++)\r
+                    {\r
+                    memcpy(iPrev, iThis, pbtIn->iChannels * sizeof(int));\r
+\r
+                    if (x < cxIn)\r
+                         {\r
+                         for (m = 0; m < pbtIn->iChannels; m++)\r
+                              {\r
+                              iThis[m] = pbtIn->pucSample[iSample++];\r
+                              }\r
+                         }\r
+                    else\r
+                         {\r
+                         cxRightFraction = cxCentre;\r
+                         memset(iThis, 0, pbtIn->iChannels * sizeof(int));\r
+                         }\r
+\r
+                    for (k = cxLeftFraction; k < cxRightFraction; k++)\r
+                         {\r
+                         for (m = 0; m < pbtIn->iChannels; m++)\r
+                              {\r
+                              piThis[t++] =\r
+                              k * iThis[m] + (cxFactor - k) * iPrev[m];\r
+                              }\r
+                         }\r
+\r
+                    cxLeftFraction = 0;\r
+                    }\r
+               }\r
+          else\r
+               {\r
+               cyTopFraction = cyCentre;\r
+               memset(piThis, 0, cxOut * pbtIn->iChannels * sizeof(int));\r
+               }\r
+\r
+          for (l = cyBottomFraction; l < cyTopFraction; l++)\r
+               {\r
+               j = i;\r
+               i += pbtOut->iSamplesLine;\r
+\r
+               t = 0;\r
+               for (x = 0; x < cxOut; x++)\r
+                    {\r
+\r
+#if 1\r
+                    if (j >= pbtOut->iSampleLimit)\r
+                         {\r
+                         printf("fiLinearExpand2D: "\r
+                         "Overflowed output buffer at sample %08x\n", j);\r
+                         free(pi);\r
+                         BmpFree(pbtOut);\r
+                         return FALSE; // should never happen\r
+                         }\r
+#endif\r
+\r
+                    for (m = 0; m < pbtIn->iChannels; m++)\r
+                         {\r
+                         pbtOut->pucSample[j++] =\r
+                         (l * piThis[t] + (cyFactor - l) * piPrev[t]) /\r
+                         iNormal;\r
+\r
+                         t++;\r
+                         }\r
+\r
+                    }\r
+               }\r
+\r
+          cyBottomFraction = 0;\r
+          }\r
+\r
+     free(pi);\r
+\r
+#if 1\r
+     if (i < pbtOut->iSampleLimit)\r
+          {\r
+          printf("fiLinearExpand2D: "\r
+                 "Partially filled output buffer to sample %08x\n", i);\r
+          BmpFree(pbtOut);\r
+          return FALSE; // should never happen\r
+          }\r
+#endif\r
+\r
+     pbtOut->iSampleAppend = i;\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiLinearShrink2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxFactor, int cyFactor)\r
+     {\r
+     int i, j, k, l, m, x, y, t, u;\r
+     int cxIn, cyIn, cxOut, cyOut;\r
+     int iLine, iPixel, iSample;\r
+     int *pi, iNormal;\r
+\r
+     cxIn = pbtIn->pbih->biWidth;\r
+     cyIn = pbtIn->pbih->biHeight;\r
+\r
+     cxOut = cxIn / cxFactor;\r
+     cyOut = cyIn / cyFactor;\r
+\r
+     if (fiBmpAllocate(pbtOut, pbtIn->pbih, cxOut, cyOut) == FALSE)\r
+          {\r
+          printf("fiLinearShrink2D: "\r
+                 "Failed to allocate output buffer of %08x samples\n",\r
+                 cxOut * cyOut * pbtIn->iChannels);\r
+          return FALSE;\r
+          }\r
+\r
+     pi = (int *) malloc(cxOut * pbtIn->iChannels * sizeof(int));\r
+     if (pi == NULL)\r
+          {\r
+          printf("fiLinearShrink2D: "\r
+                 "Failed to allocate temporary buffer of %08x pixels\n",\r
+                 cxOut);\r
+          BmpFree(pbtOut);\r
+          return FALSE;\r
+          }\r
+\r
+     iNormal = cxFactor * cyFactor;\r
+\r
+     i = 0;\r
+     iLine = 0;\r
+     for (y = 0; y < cyOut; y++)\r
+          {\r
+          j = i;\r
+          i += pbtOut->iSamplesLine;\r
+\r
+          memset(pi, 0, cxOut * pbtIn->iChannels * sizeof(int));\r
+\r
+          for (l = 0; l < cyFactor; l++)\r
+               {\r
+               iPixel = iLine;\r
+               iLine += pbtIn->iSamplesLine;\r
+\r
+               t = 0;\r
+               iSample = iPixel;\r
+               for (x = 0; x < cxOut; x++)\r
+                    {\r
+                    for (k = 0; k < cxFactor; k++)\r
+                         {\r
+                         u = t;\r
+                         for (m = 0; m < pbtIn->iChannels; m++)\r
+                              {\r
+                              pi[u++] += pbtIn->pucSample[iSample++];\r
+                              }\r
+                         }\r
+\r
+                    t += pbtIn->iChannels;\r
+                    }\r
+               }\r
+\r
+          t = 0;\r
+          for (x = 0; x < cxOut; x++)\r
+               {\r
+#if 1\r
+               if (j >= pbtOut->iSampleLimit)\r
+                    {\r
+                    printf("fiLinearShrink2D: "\r
+                    "Overflowed output buffer at sample %08x\n", j);\r
+                    free(pi);\r
+                    BmpFree(pbtOut);\r
+                    return FALSE; // should never happen\r
+                    }\r
+#endif\r
+\r
+               for (m = 0; m < pbtIn->iChannels; m++)\r
+                    {\r
+                    pbtOut->pucSample[j++] = pi[t++] / iNormal;\r
+                    }\r
+               }\r
+          }\r
+\r
+     free(pi);\r
+\r
+#if 1\r
+     if (i < pbtOut->iSampleLimit)\r
+          {\r
+          printf("fiLinearShrink2D: "\r
+                 "Partially filled output buffer to sample %08x\n", i);\r
+          BmpFree(pbtOut);\r
+          return FALSE; // should never happen\r
+          }\r
+#endif\r
+\r
+     pbtOut->iSampleAppend = i;\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#if 1\r
+int fiSincInterpolate2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                        int cxInterpolate, int cyInterpolate)\r
+     {\r
+     BMPTAG btFilter;\r
+     int i, j, k, l, m, x, y, t, u;\r
+     int iThis, iShift, iNormal;\r
+     int cxSize, cySize;\r
+     int cxPixelsIn, cyPixelsIn;\r
+     int cxPixelsOut, cyPixelsOut;\r
+     int cxFraction, cyFraction;\r
+     int cxLeft, cyBottom;\r
+     int cxCentre, cyCentre;\r
+     int cxLeftClipped, cxRightClipped;\r
+     int cxLeftFraction, cxRightFraction;\r
+     int cyBottomClipped, cyTopClipped;\r
+     int cyBottomFraction, cyTopFraction;\r
+     int cxLeftSample, cxRightSample;\r
+     int cxCoefficient, cyCoefficient;\r
+     int cxCoefficientSave, cyCoefficientSave;\r
+     int cxCoefficientStep, cyCoefficientStep;\r
+     int fiCoefficientStep;\r
+\r
+     cxSize = cxInterpolate * FILTER_OVERLAP;\r
+     cySize = cyInterpolate * FILTER_OVERLAP;\r
+\r
+     cxPixelsIn = pbtIn->pbih->biWidth;\r
+     cyPixelsIn = pbtIn->pbih->biHeight;\r
+\r
+     cxPixelsOut = cxPixelsIn * cxInterpolate;\r
+     cyPixelsOut = cyPixelsIn * cyInterpolate;\r
+\r
+     if (fiBmpAllocate(pbtOut, pbtIn->pbih,\r
+                       cxPixelsOut, cyPixelsOut) == FALSE)\r
+          {\r
+          printf("fiSincInterpolate2D: "\r
+                 "Failed to allocate output buffer of %08x samples\n",\r
+                 cxPixelsOut * cyPixelsOut * pbtIn->iChannels);\r
+          return FALSE;\r
+          }\r
+\r
+     if (fiMakeSincFilter2D(&btFilter, pbtIn, cxSize, cySize,\r
+                          FILTER_CUTOFF, FILTER_CUTOFF) == FALSE)\r
+          {\r
+          BmpFree(pbtOut);\r
+          return FALSE;\r
+          }\r
+\r
+ fiBmpWriteOut(&btFilter, "filtint.bmp");\r
+ printf("Created filtint.bmp, 0x%08x samples\n", btFilter.iSampleAppend);\r
+\r
+#if 0\r
+     iShift = 0;\r
+     for (x = cxInterpolate; x < cxSize; x <<= 1)\r
+          {\r
+          iShift++;\r
+          }\r
+     for (y = cyInterpolate; y < cySize; y <<= 1)\r
+          {\r
+          iShift++;\r
+          }\r
+ printf("shift %d\n", iShift);\r
+#endif\r
+\r
+     i = 0;\r
+     iNormal = 0;\r
+     for (y = 0; y < cySize; y++)\r
+          {\r
+          j = i;\r
+          i += btFilter.iSamplesLine;\r
+\r
+          for (x = 0; x < cxSize; x++)\r
+               {\r
+               iNormal += (int) (btFilter.pucSample[j]) - 0x30;\r
+               j += btFilter.iChannels; // only 1st channel !\r
+               }\r
+          }\r
+#if 0\r
+ printf("normal %d\n", iNormal);\r
+     iNormal >>= iShift;\r
+#endif\r
+     iNormal = (iNormal << 8) / (cxInterpolate * cyInterpolate);\r
+\r
+     if (iNormal == 0)\r
+          {\r
+          printf("fiSincInterpolate2D: "\r
+                 "Inadequate precision to normalise filter response\n");\r
+          BmpFree(&btFilter);\r
+          BmpFree(pbtOut);\r
+          return FALSE;\r
+          }\r
+\r
+     cxCentre = FILTER_OVERLAP / 2;\r
+     cyCentre = FILTER_OVERLAP / 2;\r
+\r
+     cxCoefficientStep = cxInterpolate * btFilter.iChannels;\r
+     cyCoefficientStep = cyInterpolate * btFilter.iSamplesLine;\r
+\r
+     fiCoefficientStep = (btFilter.iChannels >= pbtIn->iChannels);\r
+\r
+     cyBottomFraction = cyInterpolate / 2;\r
+     cyTopFraction = cyInterpolate;\r
+\r
+     i = 0;\r
+     for (y = 0; y <= cyPixelsIn; y++)\r
+          {\r
+          if (y >= cyPixelsIn)\r
+               {\r
+               cyTopFraction = cyInterpolate / 2;\r
+               }\r
+\r
+          cyBottom = y - cyCentre;\r
+\r
+          cyBottomClipped = max(cyBottom, 0) * pbtIn->iSamplesLine;\r
+          cyTopClipped = min(cyBottom + FILTER_OVERLAP, cyPixelsIn) *\r
+                         pbtIn->iSamplesLine;\r
+\r
+          // the (cyInterpolate - 1) term below is completed when we also\r
+          // subtract iFraction, making (cyInterpolate - cyFraction - 1).\r
+          // same algorithm applies to cxCoefficientSave inside the loop.\r
+\r
+          // this reversal is necessary because the window moves in the\r
+          // opposite direction, from the viewpoint of the coefficients,\r
+          // than our normal viewpoint which is relative to input data.\r
+\r
+          cyCoefficientSave = (cyInterpolate - 1) +\r
+                              max(0, -cyBottom) * cyInterpolate;\r
+\r
+          for (cyFraction = cyBottomFraction; cyFraction < cyTopFraction;\r
+                                              cyFraction++)\r
+               {\r
+               j = i;\r
+               i += pbtOut->iSamplesLine;\r
+\r
+               // fraction here ensures that we move through the\r
+               // available coefficients for smooth interpolation,\r
+               // compensation for clipping is done using quantised\r
+               // values especially to avoid disturbing this effect\r
+               cyCoefficient = (cyCoefficientSave - cyFraction) *\r
+                               btFilter.iSamplesLine;\r
+\r
+               cxLeftFraction = cxInterpolate / 2;\r
+               cxRightFraction = cxInterpolate;\r
+\r
+               for (x = 0; x <= cxPixelsIn; x++)\r
+                    {\r
+                    if (x >= cxPixelsIn)\r
+                         {\r
+                         cxRightFraction = cxInterpolate / 2;\r
+                         }\r
+\r
+                    cxLeft = x - cxCentre;\r
+\r
+                    cxLeftClipped = max(cxLeft, 0) * pbtIn->iChannels;\r
+                    cxRightClipped = min(cxLeft + FILTER_OVERLAP, cxPixelsIn) *\r
+                                     pbtIn->iChannels;\r
+\r
+                    cxCoefficientSave = (cxInterpolate - 1) +\r
+                                        max(0, -cxLeft) * cxInterpolate;\r
+\r
+                    for (cxFraction = cxLeftFraction;\r
+                         cxFraction < cxRightFraction; cxFraction++)\r
+                         {\r
+#if 1\r
+                         if (j >= pbtOut->iSampleLimit)\r
+                              {\r
+                              printf("fiSincInterpolate2D: "\r
+                              "Overflowed output buffer at sample %08x\n", j);\r
+                              BmpFree(&btFilter);\r
+                              BmpFree(pbtOut);\r
+                              return FALSE; // should never happen\r
+                              }\r
+#endif\r
+\r
+                         cxLeftSample = cxLeftClipped;\r
+                         cxRightSample = cxRightClipped;\r
+\r
+                         // fraction here ensures that we move through the\r
+                         // available coefficients for smooth interpolation,\r
+                         // compensation for clipping is done using quantised\r
+                         // values especially to avoid disturbing this effect\r
+                         cxCoefficient = (cxCoefficientSave - cxFraction) *\r
+                                         btFilter.iChannels;\r
+\r
+                         for (m = 0; m < pbtIn->iChannels; m++)\r
+                              {\r
+                              iThis = 0;\r
+\r
+                              t = cyCoefficient + cxCoefficient;\r
+\r
+                              for (k = cyBottomClipped; k < cyTopClipped;\r
+                                                      k += pbtIn->iSamplesLine)\r
+                                   {\r
+                                   u = t;\r
+                                   t += cyCoefficientStep;\r
+\r
+                                   for (l = cxLeftSample; l < cxRightSample;\r
+                                                         l += pbtIn->iChannels)\r
+                                        {\r
+                                        iThis += (pbtIn->pucSample[k + l] *\r
+                                                  ((int)\r
+                                                   (btFilter.pucSample[u]) -\r
+                                                   0x30)); //>> iShift;\r
+                                        u += cxCoefficientStep;\r
+                                        }\r
+                                   }\r
+\r
+                              cxLeftSample++;\r
+                              cxRightSample++;\r
+                              cxCoefficient += fiCoefficientStep;\r
+\r
+                              iThis = (iThis << 8) / iNormal;\r
+                              if (iThis > 0xff)\r
+                                   {\r
+                                   iThis = 0xff;\r
+                                   }\r
+                              if (iThis < 0)\r
+                                   {\r
+                                   iThis = 0;\r
+                                   }\r
+                              pbtOut->pucSample[j++] = iThis;\r
+                              }\r
+                         }\r
+\r
+                    cxLeftFraction = 0;\r
+                    }\r
+               }\r
+\r
+          cyBottomFraction = 0;\r
+          }\r
+\r
+     BmpFree(&btFilter);\r
+\r
+#if 0 //1\r
+     if (j < pbtOut->iSampleLimit)\r
+          {\r
+          printf("fiSincInterpolate2D: "\r
+                 "Partially filled output buffer to sample %08x\n", j);\r
+          BmpFree(pbtOut);\r
+          return FALSE; // should never happen\r
+          }\r
+#endif\r
+\r
+     pbtOut->iSampleAppend = j;\r
+     return TRUE;\r
+     }\r
+#endif\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#if 0\r
+int fiSincDecimate2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxDecimate, int cyDecimate)\r
+     {\r
+     BMPTAG btFilter;\r
+     int i, j, k, l, m, x, y, t, u;\r
+     int cxSize, cySize, iThis;\r
+     int iShift, iNormal;\r
+     int fiCoefficientStep;\r
+     int cxPixelsIn, cyPixelsIn;\r
+     int cxPixelsOut, cyPixelsOut;\r
+     int iCoefficient, iCentre, iLeft;\r
+     int iLeftClipped, iRightClipped;\r
+\r
+     cxSize = cxDecimate * FILTER_OVERLAP;\r
+     cySize = cyDecimate * FILTER_OVERLAP;\r
+\r
+     cxPixelsIn = pbtIn->pbih->biWidth;\r
+     cyPixelsIn = pbtIn->pbih->biHeight;\r
+\r
+     cxPixelsOut = cxPixelsIn / cxDecimate;\r
+     cyPixelsOut = cyPixelsIn / cyDecimate;\r
+\r
+     if (fiBmpAllocate(pbtOut, pbtIn->pbih,\r
+                       cxPixelsOut, cyPixelsOut) == FALSE)\r
+          {\r
+          printf("fiSincDecimate2D: "\r
+                 "Failed to allocate output buffer of %08x samples\n",\r
+                 cxPixelsOut * cyPixelsOut * pbtIn->iChannels);\r
+          return FALSE;\r
+          }\r
+\r
+     if (fiMakeSincFilter2D(&btFilter, pbtIn, cxSize, cySize,\r
+                          FILTER_CUTOFF, FILTER_CUTOFF) == FALSE)\r
+          {\r
+          BmpFree(pbtOut);\r
+          return FALSE;\r
+          }\r
+\r
+ fiBmpWriteOut(&btFilter, "filtdec.bmp");\r
+ printf("Created filtdec.bmp, 0x%08x samples\n", btFilter.iSampleAppend);\r
+\r
+     iShift = 0;\r
+     for (i = 1; i < iSize; i <<= 1)\r
+          {\r
+          iShift++;\r
+          }\r
+\r
+     iNormal = 0;\r
+     for (i = 0; i < iSize; i++)\r
+          {\r
+          iNormal += btFilter.pucSample[i * btFilter.iChannels];\r
+          }\r
+     iNormal >>= iShift;\r
+\r
+     iCentre = iSize / 2;\r
+     fiCoefficientStep = (btFilter.iChannels >= pbtIn->iChannels);\r
+\r
+     j = 0;\r
+     for (i = 0; i < iPixelsIn; i += iDecimate)\r
+          {\r
+#if 1\r
+          if (j >= pbtOut->iSampleLimit)\r
+               {\r
+               printf("fiSincDecimate2D: "\r
+                      "Overflowed output buffer at sample %08x\n", j);\r
+               BmpFree(&btFilter);\r
+               BmpFree(pbtOut);\r
+               return FALSE; // should never happen\r
+               }\r
+#endif\r
+\r
+          iLeft = i - iCentre;\r
+\r
+          iLeftClipped = max(iLeft, 0) * pbtIn->iChannels;\r
+          iRightClipped = min(iLeft + iSize, pbtIn->iSampleAppend) *\r
+                          pbtIn->iChannels;\r
+\r
+          iCoefficient = max(0, -iLeft) * btFilter.iChannels;\r
+\r
+          for (m = 0; m < pbtIn->iChannels; m++)\r
+               {\r
+               iThis = 0;\r
+\r
+               l = iCoefficient;\r
+               iCoefficient += fiCoefficientStep;\r
+\r
+               for (k = iLeftClipped++; k < iRightClipped;\r
+                                        k += pbtIn->iChannels)\r
+                    {\r
+                    iThis += (pbtIn->pucSample[k] * btFilter.pucSample[l]) >>\r
+                             iShift;\r
+                    l += btFilter.iChannels;\r
+                    }\r
+\r
+               iRightClipped++;\r
+\r
+               iThis /= iNormal;\r
+               if (iThis > 0xff)\r
+                    {\r
+                    iThis = 0xff;\r
+                    }\r
+               if (iThis < 0)\r
+                    {\r
+                    iThis = 0;\r
+                    }\r
+\r
+               pbtOut->pucSample[j++] = iThis;\r
+               }\r
+          }\r
+\r
+     BmpFree(&btFilter);\r
+\r
+#if 1\r
+     if (j < pbtOut->iSampleLimit)\r
+          {\r
+          printf("fiSincDecimate2D: "\r
+                 "Partially filled output buffer to sample %08x\n", j);\r
+          BmpFree(pbtOut);\r
+          return FALSE; // should never happen\r
+          }\r
+#endif\r
+\r
+     pbtOut->iSampleAppend = j;\r
+     return TRUE;\r
+     }\r
+#endif\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#if 0\r
+int fiSincResample2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxInterpolate, int cyInterpolate,\r
+                     int cxDecimate, int cyDecimate)\r
+     {\r
+     BMPTAG btFilter;\r
+     int i, j, k, l, m, x, y, t, u;\r
+     int cxSize, cySize;\r
+     int cxSizeQuantised, cySizeQuantised;\r
+     int iShift, iNormal, iThis;\r
+     int iCoefficientStep, fiCoefficientStep;\r
+     int cxPixelsIn, cyPixelsIn;\r
+     int cxPixelsQuantised, cyPixelsQuantised;\r
+     int iCoefficient;\r
+     int iIntermediate, iInteger, iFraction;\r
+     int iLeftQuantised, iCentreQuantised;\r
+     int iLeftClipped, iRightClipped;\r
+\r
+     // I think it is best to quantise the input data window size once,\r
+     // at the beginning, so all convolutions are done with the same width,\r
+     // avoiding normalisation issues.  Therefore one coefficient will\r
+     // always skipped, on either side of the coefficient bank depending\r
+     // on the interpolation status, but it will be of low amplitude.\r
+     //\r
+     // window_size_quantised = window_size / output_rate\r
+     //                       = max(t, t * input_rate / output_rate)\r
+\r
+     cxSizeQuantised = max(FILTER_OVERLAP,\r
+                           (FILTER_OVERLAP * cxDecimate) / cxInterpolate);\r
+     cySizeQuantised = max(FILTER_OVERLAP,\r
+                           (FILTER_OVERLAP * cyDecimate) / cyInterpolate);\r
+\r
+     // So how many possible interpolation states are there?  The\r
+     // interpolation has to be reset each time the base coefficient\r
+     // pointer overflows to a value => the input data rate unit\r
+     // (output_rate intermediate units).  Thus, the base coefficient\r
+     // pointer is the state counter for the interpolation and it\r
+     // can have values 0 thru output_rate-1.\r
+     //\r
+     // Having calculated window_size_quantised we can then multiply\r
+     // by the number of possible interpolation states, thus:\r
+     //\r
+     // window_size_coefficient = window_size_quantised * output_rate\r
+     //                         = max(t * output_rate, t * input_rate)\r
+     //\r
+     // Note:  The second derivation undoes the beneficial effect of\r
+     // the quantisation, meaning the window is now slightly larger\r
+     // than necessary, but this is necessary, because otherwise our\r
+     // use of s * t to set the cutoff would introduce a freq. error.\r
+\r
+     cxSize = FILTER_OVERLAP * max(cxInterpolate, cxDecimate);\r
+     cySize = FILTER_OVERLAP * max(cyInterpolate, cyDecimate);\r
+\r
+     cxPixelsIn = pbtIn->pbih->biWidth;\r
+     cyPixelsIn = pbtIn->pbih->biHeight;\r
+\r
+     cxPixelsQuantised = (cxPixelsIn * cxInterpolate) / cxDecimate;\r
+     cyPixelsQuantised = (cyPixelsIn * cyInterpolate) / cyDecimate;\r
+\r
+     if (fiBmpAllocate(pbtOut, pbtIn->pbih,\r
+                       cxPixelsQuantised, cyPixelsQuantised) == FALSE)\r
+          {\r
+          printf("fiSincResample2D: "\r
+                 "Failed to allocate output buffer of %08x samples\n",\r
+                 cxPixelsQuantised * cyPixelsQuantised * pbtIn->iChannels);\r
+          return FALSE;\r
+          }\r
+\r
+     if (fiMakeSincFilter2D(&btFilter, pbtIn, cxSize, cySize,\r
+                          FILTER_CUTOFF, FILTER_CUTOFF) == FALSE)\r
+          {\r
+          BmpFree(pbtOut);\r
+          return FALSE;\r
+          }\r
+\r
+ if (iInterpolate > iDecimate)\r
+  {\r
+  fiBmpWriteOut(&btFilter, "filtint.bmp");\r
+  printf("Created filtint.bmp, 0x%08x samples\n", btFilter.iSampleAppend);\r
+  }\r
+ else\r
+\r
+  {\r
+  fiBmpWriteOut(&btFilter, "filtdec.bmp");\r
+  printf("Created filtdec.bmp, 0x%08x samples\n", btFilter.iSampleAppend);\r
+  }\r
+\r
+     iShift = 0;\r
+     for (i = 1; i < iSizeQuantised; i <<= 1)\r
+          {\r
+          iShift++;\r
+          }\r
+\r
+     iNormal = 0;\r
+     for (i = 0; i < iSizeQuantised; i++)\r
+          {\r
+          iNormal += btFilter.pucSample[i * iInterpolate * btFilter.iChannels];\r
+          }\r
+     iNormal >>= iShift;\r
+\r
+     // centre should also be compensated for the rounding down of\r
+     // (iPixelsIn * iInterpolate) / iDecimate, so must convert back\r
+     iCentreQuantised = iSizeQuantised / 2;\r
+\r
+     iCoefficientStep = iInterpolate * btFilter.iChannels;\r
+     fiCoefficientStep = (btFilter.iChannels >= pbtIn->iChannels);\r
+\r
+     j = 0;\r
+     iIntermediate = 0;\r
+     for (i = 0; i < iPixelsQuantised; i++)\r
+          {\r
+#if 1\r
+          if (j >= pbtOut->iSampleLimit)\r
+               {\r
+               printf("fiSincResample2D: "\r
+                      "Overflowed output buffer at sample %08x\n", j);\r
+               BmpFree(&btFilter);\r
+               BmpFree(pbtOut);\r
+               return FALSE; // should never happen\r
+               }\r
+#endif\r
+\r
+          // integer and fraction variables are used for clarity,\r
+          // and could be optimised with modulo arithmetic, but\r
+          // there is little point optimising this part of the\r
+          // loop since we are doing vector multiplication later\r
+          iInteger = iIntermediate / iInterpolate;\r
+          iFraction = iIntermediate % iInterpolate;\r
+          iIntermediate += iDecimate;\r
+\r
+          // left side of window is recalculated each time through,\r
+          // to avoid issues with the rounding of negative numbers\r
+          iLeftQuantised = iInteger - iCentreQuantised;\r
+\r
+          // input data window size is constant, so the quantised\r
+          // value calculated in the beginning is used for clipping\r
+          iLeftClipped = max(iLeftQuantised, 0) * pbtIn->iChannels;\r
+          iRightClipped = min(iLeftQuantised + iSizeQuantised, iPixelsIn) *\r
+                          pbtIn->iChannels;\r
+\r
+          // fraction here ensures that we move through the\r
+          // available coefficients for smooth interpolation, the\r
+          // compensation for clipping is done using quantised\r
+          // values especially to avoid disturbing this effect\r
+          iCoefficient = ((iInterpolate - iFraction - 1) +\r
+                         max(0, -iLeftQuantised) * iInterpolate) *\r
+                         btFilter.iChannels;\r
+\r
+          for (m = 0; m < pbtIn->iChannels; m++)\r
+               {\r
+               iThis = 0;\r
+\r
+               l = iCoefficient;\r
+               iCoefficient += fiCoefficientStep;\r
+\r
+               for (k = iLeftClipped++; k < iRightClipped;\r
+                                        k += pbtIn->iChannels)\r
+                    {\r
+                    iThis += (pbtIn->pucSample[k] * btFilter.pucSample[l]) >>\r
+                             iShift;\r
+                    l += iCoefficientStep;\r
+                    }\r
+\r
+               iRightClipped++;\r
+\r
+               iThis /= iNormal;\r
+               if (iThis > 0xff)\r
+                    {\r
+                    iThis = 0xff;\r
+                    }\r
+               if (iThis < 0)\r
+                    {\r
+                    iThis = 0;\r
+                    }\r
+\r
+               pbtOut->pucSample[j++] = iThis;\r
+               }\r
+          }\r
+\r
+     BmpFree(&btFilter);\r
+\r
+#if 1\r
+     if (j < pbtOut->iSampleLimit)\r
+          {\r
+          printf("fiSincResample2D: "\r
+                 "Partially filled output buffer to sample %08x\n", j);\r
+          BmpFree(pbtOut);\r
+          return FALSE; // should never happen\r
+          }\r
+#endif\r
+\r
+     pbtOut->iSampleAppend = j;\r
+     return TRUE;\r
+     }\r
+#endif\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiMakeSincFilter2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                       int cxSize, int cySize, int cxCutoff, int cyCutoff)\r
+     {\r
+     BITMAPINFOHEADER bih;\r
+     int i, j, m, x, y, iThis;\r
+     float fxScale, fyScale;\r
+     float fxCentre, fyCentre;\r
+     float fxWindow, fyWindow;\r
+     float fxThis, fyThis;\r
+\r
+     // the sinc filter will have the same file format as the input data,\r
+     // except that channels is set to 1 because the same filter will be\r
+     // used on all colour channels, and bits per sample is set to 8\r
+     // to reduce the number of combinations to be handled when filtering.\r
+     //\r
+     // note:  the sinc filter will adopt the same sample rate as the input,\r
+     // which is not exactly correct if overall interpolation will be used.\r
+\r
+     memcpy(&bih, pbtIn->pbih, sizeof(BITMAPINFOHEADER));\r
+\r
+     bih.biBitCount = 8;\r
+\r
+     if (fiBmpAllocate(pbtOut, &bih, cxSize, cySize) == FALSE)\r
+          {\r
+          printf("fiMakeSincFilter2D: "\r
+                 "Failed to allocate output buffer of %08x samples\n",\r
+                 cxSize, cySize);\r
+          return FALSE;\r
+          }\r
+\r
+     fxCentre = (cxSize - 1) / 2.0;\r
+     fyCentre = (cySize - 1) / 2.0;\r
+\r
+     fxScale = (6.283185307 * cxCutoff) / cxSize;\r
+     fyScale = (6.283185307 * cyCutoff) / cySize;\r
+\r
+     i = 0;\r
+     for (y = 0; y < cySize; y++)\r
+          {\r
+          j = i;\r
+          i += pbtOut->iSamplesLine;\r
+\r
+          fyWindow = 1 - min(y + 1, cySize - y) / fyCentre;\r
+          fyWindow = 1 - fyWindow * fyWindow;\r
+\r
+          fyThis = fyScale * (y - fyCentre);\r
+          if (fyThis)\r
+               {\r
+               fyThis = sin(fyThis) / fyThis;\r
+               }\r
+          else\r
+               {\r
+               fyThis = 1;\r
+               }\r
+\r
+          for (x = 0; x < cxSize; x++)\r
+               {\r
+               fxWindow = 1 - min(x + 1, cxSize - x) / fxCentre;\r
+               fxWindow = 1 - fxWindow * fxWindow;\r
+\r
+               fxThis = fxScale * (x - fxCentre);\r
+               if (fxThis)\r
+                    {\r
+                    fxThis = sin(fxThis) / fxThis;\r
+                    }\r
+               else\r
+                    {\r
+                    fxThis = 1;\r
+                    }\r
+\r
+               // the filter gain is fixed here, but will later be adjusted by\r
+               // normalisation (only the caller knows the interpolation in use)\r
+               iThis = fxThis * fyThis * fxWindow * fyWindow * 0xcf + 0x30;\r
+\r
+#if 1\r
+               if (j >= pbtOut->iSampleLimit)\r
+                    {\r
+                    printf("fiMakeSincFilter2D: "\r
+                           "Overflowed output buffer at sample %08x\n", j);\r
+                    BmpFree(pbtOut);\r
+                    return FALSE; // should never happen\r
+                    }\r
+#endif\r
+\r
+               //for (m = 0; m < pbtOut->iChannels; m++) // always 1 for now\r
+                    {\r
+                    pbtOut->pucSample[j++] = iThis;\r
+                    }\r
+               }\r
+          }\r
+\r
+#if 1\r
+     if (j < pbtOut->iSampleLimit)\r
+          {\r
+          printf("fiMakeSincFilter2D: "\r
+                 "Partially filled output buffer to sample %08x\n", j);\r
+          BmpFree(pbtOut);\r
+          return FALSE; // should never happen\r
+          }\r
+#endif\r
+\r
+     pbtOut->iSampleAppend = j;\r
+     return TRUE;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/hyimage.h b/src/mkfont/hyimage.h
new file mode 100644 (file)
index 0000000..645f57c
--- /dev/null
@@ -0,0 +1,104 @@
+// hyimage.h\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#define FILTER_CUTOFF 2 // cutoff/overlap should be 1/2 for nyquist frequency\r
+#define FILTER_OVERLAP 4 // history size, in slow-samples, for interp/decimate\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+/*\r
+typedef struct tagBITMAPFILEHEADER {\r
+        WORD    bfType;\r
+        DWORD   bfSize;\r
+        WORD    bfReserved1;\r
+        WORD    bfReserved2;\r
+        DWORD   bfOffBits;\r
+} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;\r
+\r
+typedef struct tagBITMAPINFOHEADER{\r
+        DWORD      biSize;\r
+        LONG       biWidth;\r
+        LONG       biHeight;\r
+        WORD       biPlanes;\r
+        WORD       biBitCount;\r
+        DWORD      biCompression;\r
+        DWORD      biSizeImage;\r
+        LONG       biXPelsPerMeter;\r
+        LONG       biYPelsPerMeter;\r
+        DWORD      biClrUsed;\r
+        DWORD      biClrImportant;\r
+} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;\r
+\r
+typedef struct tagRGBQUAD {\r
+        BYTE    rgbBlue;\r
+        BYTE    rgbGreen;\r
+        BYTE    rgbRed;\r
+        BYTE    rgbReserved;\r
+} RGBQUAD;\r
+typedef RGBQUAD FAR* LPRGBQUAD;\r
+\r
+typedef struct tagRECT\r
+{\r
+    LONG    left;\r
+    LONG    top;\r
+    LONG    right;\r
+    LONG    bottom;\r
+} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;\r
+*/\r
+\r
+typedef struct\r
+     {\r
+     FILETAG ft; // ft.pcBase points to WAV_FILE_HEADER followed by data\r
+\r
+     BITMAPFILEHEADER *pbfh; // easier than (BITMAPINFOHEADER *) ft.pcBase\r
+     BITMAPINFOHEADER *pbih; // easier than (BITMAPINFOHEADER *) (ft.pcBase+x)\r
+     RGBQUAD *prgbq; // easier than (RGBQUAD *) (ft.pcBase+y), base of palette\r
+     unsigned char *pucSample; // points after BITMAPINFOHEADER and palette\r
+\r
+     int iChannels; // max(biBitCount / 8, 1), because usoft is so very lame\r
+     int iBitsChannel; // always biBitcount / iChannels, because usoft is lame\r
+     int iSamplesLine; // generally in bytes, this offset includes wasted part\r
+\r
+     int iSampleBase; // usually 0 unless client wants to do advanced looping\r
+     int iSampleLimit; // iSampleAppend or larger if block is of arbitrary size\r
+     int iSamplePosition; // for general use, initialised to 0 for client\r
+     int iSampleAppend; // calculated for client, pbih->biHeight * iSamplesLine\r
+\r
+     int iBackground; // dc bias per channel, to be removed for calculations\r
+     int cxHot, cyHot; // reference point on image for client use, or centre\r
+\r
+     //RECT rPixelWindow; // set up from the exact pixel image size via pbih\r
+     //RECT rPixelSurface; // same as rPixelWindow, except rRight includes waste\r
+     } BMPTAG;\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiBmpAllocate(BMPTAG *pbt, BITMAPINFOHEADER *pbihIn,\r
+                  int cxPixels, int cyPixels);\r
+int fiBmpReadIn(BMPTAG *pbt, char *pszFileName);\r
+int fiBmpWriteOut(BMPTAG *pbt, char *pszFileName);\r
+void BmpFree(BMPTAG *pbt);\r
+int fiBmpCopy(BMPTAG *pbt, BMPTAG *pbtIn);\r
+\r
+int fiLinearExpand2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxFactor, int cyFactor);\r
+\r
+int fiLinearShrink2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxFactor, int cyFactor);\r
+\r
+int fiSincInterpolate2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                        int cxInterpolate, int cyInterpolate);\r
+\r
+int fiSincDecimate2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxDecimate, int cyDecimate);\r
+\r
+int fiSincResample2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                     int cxInterpolate, int cyInterpolate,\r
+                     int cxDecimate, int cyDecimate);\r
+\r
+int fiMakeSincFilter2D(BMPTAG *pbtOut, BMPTAG *pbtIn,\r
+                       int cxSize, int cySize, int cxCutoff, int cyCutoff);\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/hymb.cpp b/src/mkfont/hymb.cpp
new file mode 100644 (file)
index 0000000..bd46573
--- /dev/null
@@ -0,0 +1,117 @@
+// hymb.cpp\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#include <stdio.h>\r
+#include <windows.h>\r
+#pragma hdrstop\r
+#include "hymb.h"\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+void MBEntrySetup(void)\r
+     {\r
+     // for future expansion\r
+     }\r
+\r
+void MBExitCleanup(void)\r
+     {\r
+     // for future expansion\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiMBAlloc(MBHANDLE *pmbh, int iBytes)\r
+     {\r
+     // zero the entire memory block handle area, avoiding leaks\r
+     memset(pmbh, 0, sizeof(MBHANDLE));\r
+\r
+     pmbh->pcBase = (char *) malloc(iBytes);\r
+     if (pmbh->pcBase == NULL)\r
+          {\r
+          return FALSE; // indicates failure to allocate block\r
+          }\r
+\r
+     pmbh->pcLimit = pmbh->pcBase + iBytes;\r
+\r
+     return TRUE; // indicates success and handle set up\r
+     }\r
+\r
+int fiMBRealloc(MBHANDLE *pmbh, int iBytes)\r
+     {\r
+     char *pc;\r
+\r
+     pc = (char *) realloc(pmbh->pcBase, iBytes);\r
+     if (pc == NULL)\r
+          {\r
+          return FALSE; // indicates failure to reallocate block\r
+          }\r
+\r
+     pmbh->pcBase = pc;\r
+     pmbh->pcLimit = pmbh->pcBase + iBytes;\r
+\r
+     return TRUE; // indicates success and handle updated\r
+     }\r
+\r
+int fiMBFree(MBHANDLE *pmbh)\r
+     {\r
+     if (pmbh->pcBase == NULL)\r
+          {\r
+          return FALSE; // indicates no such block allocated\r
+          }\r
+\r
+     free(pmbh->pcBase); // this can't fail, apparently\r
+\r
+     // zero the entire memory block handle area, avoiding leaks\r
+     memset(pmbh, 0, sizeof(MBHANDLE));\r
+\r
+     return TRUE; // indicates success, and handle zeroed\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#ifdef _INC_JLHANDLE\r
+int hiMBNew(int iBytes)\r
+     {\r
+     int hi;\r
+     MBHANDLE *pmbh;\r
+\r
+     // take a new handle, before bothering with memory\r
+     hi = hiJLHandleNew(patMBH);\r
+     pmbh = (MBHANDLE *) pcArrayElement(patMBH, 1, hi);\r
+\r
+     // use inline wrapper to allocate the required bytes\r
+     MBAlloc(pmbh, iBytes); // this will bomb on failure\r
+\r
+     return hi; // caller's reference is the opaque handle\r
+     }\r
+\r
+void MBResize(int hi, int iBytes)\r
+     {\r
+     MBHANDLE *pmbh;\r
+\r
+     // find supplied handle, before bothering with memory\r
+     pmbh = (MBHANDLE *) pcArrayElement(patMBH, 1, hi);\r
+\r
+     // use inline wrapper to reallocate the required bytes\r
+     MBRealloc(pmbh, iBytes); // this will bomb on failure\r
+     }\r
+\r
+void MBDelete(int hi)\r
+     {\r
+     // find supplied handle, before bothering with memory\r
+     pmbh = (MBHANDLE *) pcArrayElement(patMBH, 1, hi);\r
+\r
+     // use inline wrapper to free up the allocated memory\r
+     MBFree(pmbh); // this will bomb on failure (null pcBase)\r
+     }\r
+\r
+int hiMBDelete(int hi)\r
+     {\r
+     MBDelete(hi);\r
+     return 0; // handy way for caller to zero out its copy of handle\r
+     }\r
+#endif\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/hymb.h b/src/mkfont/hymb.h
new file mode 100644 (file)
index 0000000..86e60e6
--- /dev/null
@@ -0,0 +1,95 @@
+// hymb.h\r
+\r
+#ifndef _INC_HYMB\r
+#define _INC_HYMB\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+typedef struct\r
+     {\r
+     char *pcBase;                      // also the 'handle' for malloc & free\r
+     char *pcLimit;                     // similar to Microsoft's _msize func.\r
+     } MBHANDLE;\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#ifdef _INC_JLHANDLE\r
+// the optional registration of allocated memory blocks is based on a handle\r
+// system identical to JLHANDLE.CPP, see comments for atJLHandle, patJLH etc\r
+\r
+extern ARRAYTAG atMBHandle;\r
+\r
+extern int hiMBHandleFree; // to head of most recently used free handles list\r
+extern ARRAYTAG *patMBH; // patMBH is slightly more readable than &atMBHandle\r
+#endif\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+void MBEntrySetup(void);\r
+void MBExitCleanup(void);\r
+\r
+int fiMBAlloc(MBHANDLE *pmbh, int iBytes);\r
+int fiMBRealloc(MBHANDLE *pmbh, int iBytes);\r
+int fiMBFree(MBHANDLE *pmbh);\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+inline int iMBSize(MBHANDLE *pmbh)\r
+     {\r
+     return pmbh->pcLimit - pmbh->pcBase;\r
+     }\r
+\r
+// ----------------------------------------------------------------------------\r
+// handy functions for the client, not important to the interface:\r
+\r
+#ifdef _INC_STDIO\r
+inline void MBAlloc(MBHANDLE *pmbh, int iBytes)\r
+     {\r
+     if (fiMBAlloc(pmbh, iBytes) == FALSE)\r
+          {\r
+          printf("MBAlloc: "\r
+                 "Could not allocate %08x bytes, exiting\n", iBytes);\r
+          exit(1);\r
+          }\r
+\r
+#ifdef DEBUG\r
+     printf("MBAlloc: "\r
+            "Allocated memory block %08x size %08x\n", pmbh, iBytes);\r
+#endif\r
+     }\r
+\r
+inline void MBRealloc(MBHANDLE *pmbh, int iBytes)\r
+     {\r
+     if (fiMBRealloc(pmbh, iBytes) == FALSE)\r
+          {\r
+          printf("MBRealloc: "\r
+                 "Could not reallocate %08x bytes, exiting\n", iBytes);\r
+          exit(1);\r
+          }\r
+\r
+#ifdef DEBUG\r
+     printf("MBRealloc: "\r
+            "Reallocated memory block %08x size %08x\n", pmbh, iBytes);\r
+#endif\r
+     }\r
+\r
+inline void MBFree(MBHANDLE *pmbh)\r
+     {\r
+     if (fiMBFree(pmbh) == FALSE)\r
+          {\r
+          printf("MBFree: "\r
+                 "Could not free memory block %08x, exiting\n", pmbh);\r
+          exit(1);\r
+          }\r
+\r
+#ifdef DEBUG\r
+     printf("MBFree: "\r
+            "Freed memory block %08x\n", pmbh);\r
+#endif\r
+     }\r
+#endif\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#endif\r
+\r
diff --git a/src/mkfont/n.bat b/src/mkfont/n.bat
new file mode 100644 (file)
index 0000000..c01cf7b
--- /dev/null
@@ -0,0 +1,18 @@
+cl -Zi -I. bmp2txt.cpp hyimage.cpp hyfile.cpp hyfs.cpp hymb.cpp\r
+@if errorlevel 1 goto failure\r
+copy bmp2txt.exe ..\bin\r
+\r
+cl -Zi -I. txt2chs.cpp hyfile.cpp hyfs.cpp hymb.cpp\r
+@if errorlevel 1 goto failure\r
+copy txt2chs.exe ..\bin\r
+\r
+cl -Zi -I. chs2cmd.cpp hyfile.cpp hyfs.cpp hymb.cpp\r
+@if errorlevel 1 goto failure\r
+copy chs2cmd.exe ..\bin\r
+\r
+@echo SUCCESS\r
+@goto done\r
+:failure\r
+@echo FAILURE\r
+:done\r
+\r
diff --git a/src/mkfont/txt2chs.cpp b/src/mkfont/txt2chs.cpp
new file mode 100644 (file)
index 0000000..46f6c4a
--- /dev/null
@@ -0,0 +1,431 @@
+// txt2chs.cpp\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+#include <stdio.h>\r
+#include <math.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include <windows.h>\r
+#pragma hdrstop\r
+#include "hymb.h"\r
+#include "hyfs.h"\r
+#include "hyfile.h"\r
+\r
+int main(int argc, char **argv);\r
+int fiProcess(FILETAG *ftOut, FILETAG *ftIn, int iICS, int iILS);\r
+int iCompare(const void *pvLeft, const void *pvRight);\r
+int iUpdateCRC(char *pcBase, int iCount, int iCRC);\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+FILETAG ftIn;\r
+char *pszInFileName;\r
+\r
+FILETAG ftOut;\r
+char *pszOutFileName;\r
+char szOutFileName[512];\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int main(int argc, char **argv)\r
+       {\r
+       int i, iICS, iILS;\r
+\r
+       if (argc > 1)\r
+               {\r
+               pszInFileName = argv[1];\r
+               }\r
+\r
+       iICS = 0;\r
+       iILS = 0;\r
+       if (argc > 2)\r
+               {\r
+               iICS = atoi(argv[2]);\r
+               if (iICS < 1 || iICS > 0xff)\r
+                       {\r
+                       pszOutFileName = argv[2];\r
+                       if (argc > 3)\r
+                               {\r
+                               iICS = atoi(argv[3]);\r
+                               if (argc > 4)\r
+                                       {\r
+                                       iILS = atoi(argv[4]);\r
+                                       }\r
+                               }\r
+                       }\r
+               else\r
+                       {\r
+                       if (argc > 3)\r
+                               {\r
+                               iILS = atoi(argv[3]);\r
+                               }\r
+                       }\r
+               }\r
+\r
+       if (pszInFileName == NULL)\r
+               {\r
+               printf("usage: txt2chs infile.txt [outfile.chs] [ICS] [ILS]\n");\r
+               exit(1);\r
+               }\r
+\r
+       if (pszOutFileName == NULL)\r
+               {\r
+               pszOutFileName = szOutFileName;\r
+               strcpy(pszOutFileName, pszInFileName);\r
+\r
+               i = strlen(pszOutFileName);\r
+               while (i--)\r
+                       {\r
+                       if (pszOutFileName[i] == '\\')\r
+                               {\r
+                               break; /* no extension, so don't strip it */\r
+                               }\r
+                       if (pszOutFileName[i] == '.')\r
+                               {\r
+                               pszOutFileName[i] = 0; /* strip dot and extension */\r
+                               break; /* ready to concatenate our extension */\r
+                               }\r
+                       }\r
+\r
+               strcat(pszOutFileName, ".chs");\r
+               }\r
+\r
+       if (!strcmp(pszInFileName, pszOutFileName))\r
+               {\r
+               printf("Input and output filenames identical\n");\r
+               exit(1);\r
+               }\r
+\r
+       // read the input bmp file entirely to a malloc'd block\r
+       FileReadIn(&ftIn, pszInFileName);\r
+\r
+       // prepare an output buffer for character set data\r
+       FileAllocate(&ftOut, 0x100000); // 64 kbytes\r
+\r
+       // search for characters and write character set files\r
+       if (fiProcess(&ftOut, &ftIn, iICS, iILS) == FALSE)\r
+               {\r
+               exit(1);\r
+               }\r
+\r
+       // ready to write the output we found\r
+       FileWriteOut(&ftOut, pszOutFileName);\r
+\r
+       // all done my friend\r
+       FileFree(&ftIn);\r
+       FileFree(&ftOut);\r
+\r
+       return 0;\r
+       }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
+int fiProcess(FILETAG *pftOut, FILETAG *pftIn, int iICS, int iILS)\r
+       {\r
+       char *pc;\r
+       char sz[0x203];\r
+       int i, j, c, d;\r
+       int x, y, cx, cy;\r
+       int tx, ty, bx, fx;\r
+       int x0, x1, x2, y0, y1, y2;\r
+       int mx, my;\r
+       MBHANDLE mbh;\r
+       unsigned short *pus;\r
+       int iValue, iMask;\r
+       int iWidth[0x100], iHeight[0x100];\r
+       int iCRC;\r
+\r
+       pc = pftOut->pcBase;\r
+\r
+       strcpy(pc, "XXXXYYMMDDHHMMSS");\r
+       pc += 0x10;\r
+       pus = (unsigned short *)pc;\r
+       memset(pc, 0, 0x208);\r
+       pc += 0x208;\r
+\r
+       // create the microspace characters\r
+       *pc++ = 1; // inter character space should be ignored here\r
+       pus[1] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = 2; // inter character space should be ignored here\r
+       pus[2] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = 3; // inter character space should be ignored here\r
+       pus[3] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = 4; // inter character space should be ignored here\r
+       pus[4] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = -4; // inter character space should be ignored here\r
+       pus[5] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = -3; // inter character space should be ignored here\r
+       pus[6] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = -2; // inter character space should be ignored here\r
+       pus[7] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = -1; // inter character space should be ignored here\r
+       pus[8] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = 12; // inter character space should be ignored here\r
+       pus[0x1c] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       *pc++ = -12; // inter character space should be ignored here\r
+       pus[0x1d] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       if (iICS < 1 || iICS > 0xff)\r
+               {\r
+               iICS = 1;\r
+               }\r
+\r
+       if (iILS < 1 || iILS > 0xff)\r
+               {\r
+               iILS = 1;\r
+               }\r
+\r
+       c = '!';\r
+       d = 0;\r
+       while (fiFileGetLine(pftIn, sz, sizeof(sz) - 1, NULL))\r
+               {\r
+               if (sscanf(sz, "at %d,%d size %d,%d", &x, &y, &cx, &cy) == 4)\r
+                       {\r
+                       /*printf("at %d,%d size %d,%d\n", x, y, cx, cy);*/\r
+\r
+                       if (c >= 0x100 || d >= 0x100)\r
+                               {\r
+                               printf("Too many characters\n");\r
+                               break; /* exit(1); */\r
+                               }\r
+\r
+                       MBAlloc(&mbh, cx * cy);\r
+                       i = 0;\r
+\r
+                       x0 = cx;\r
+                       x1 = 0;\r
+                       x2 = 0;\r
+                       y0 = cy;\r
+                       y1 = 0;\r
+                       y2 = cy;\r
+                       for (y = 0; y < cy; y++)\r
+                               {\r
+                               if (fiFileGetLine(pftIn, sz, sizeof(sz) - 1,\r
+                                                 &j) == FALSE)\r
+                                       {\r
+                                       printf("Unexpected end of file\n");\r
+                                       break; /* exit(1); */\r
+                                       }\r
+\r
+                               if (j < (cx * 2))\r
+                                       {\r
+                                       printf("Line too short in file\n");\r
+                                       break; /* exit(1); */\r
+                                       }\r
+\r
+                               for (x = 0; x < cx; x++)\r
+                                       {\r
+                                       if (sz[x * 2] == '#')\r
+                                               {\r
+                                               mbh.pcBase[i++] = 1;\r
+                                               x0 = min(x0, x);\r
+                                               x1 = max(x1, x + 1);\r
+                                               y0 = min(y0, y);\r
+                                               y1 = max(y1, y + 1);\r
+                                               }\r
+                                       else\r
+                                               {\r
+                                               mbh.pcBase[i++] = 0;\r
+                                               if (sz[x * 2] == '_')\r
+                                                       {\r
+                                                       y2 = y + 1;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                       tx = max(0, x1 - x0); // trimmed width in pixels\r
+                       ty = max(0, y1 - y0); // trimmed height in pixels\r
+                       printf("at %d,%d trim %d,%d origin %d,%d\n",\r
+                              x0, y0, tx, ty, x2, y2);\r
+\r
+                       iWidth[d] = tx; // save for median calculation\r
+                       iHeight[d] = ty; // save for median calculation\r
+\r
+                       bx = (tx + 7) >> 3; // width in bytes\r
+\r
+                       if (x2)\r
+                               {\r
+                               *pc++ = x0 - x2;\r
+                               *pc++ = y0 - y2;\r
+                               *pc++ = tx + iICS;\r
+                               pus[c] = pc - (char *)pus;\r
+                               *pc++ = bx | 0xe0;\r
+                               }\r
+                       else if (y2)\r
+                               {\r
+                               *pc++ = y0 - y2;\r
+                               *pc++ = tx + iICS;\r
+                               pus[c] = pc - (char *)pus;\r
+                               *pc++ = bx | 0x60;\r
+                               }\r
+                       else\r
+                               {\r
+                               *pc++ = tx + iICS;\r
+                               pus[c] = pc - (char *)pus;\r
+                               *pc++ = bx | 0x20;\r
+                               }\r
+\r
+                       if (bx)\r
+                               {\r
+                               *pc++ = ty;\r
+\r
+                               i = y0 * cx;\r
+                               for (y = y0; y < y1; y++)\r
+                                       {\r
+                                       j = i + x0;\r
+                                       i += cx;\r
+\r
+                                       iValue = 0;\r
+                                       iMask = 0x80;\r
+                                       for (x = x0; x < x1; x++)\r
+                                               {\r
+                                               if (iMask == 0)\r
+                                                       {\r
+                                                       *pc++ = iValue;\r
+\r
+                                                       iValue = 0;\r
+                                                       iMask = 0x80;\r
+                                                       }\r
+\r
+                                               if (mbh.pcBase[j++])\r
+                                                       {\r
+                                                       iValue |= iMask;\r
+                                                       }\r
+\r
+                                               iMask >>= 1;\r
+                                               }\r
+\r
+                                       *pc++ = iValue;\r
+                                       }\r
+                               }\r
+\r
+                       MBFree(&mbh);\r
+\r
+                       c++; // character code for index updating\r
+                       d++; // character code for median calculation\r
+                       }\r
+               }\r
+\r
+       printf("%d characters in range %d,%d inclusive\n", d, 0x21, c - 1);\r
+\r
+       // post process widths/heights now we've had all characters\r
+       mx = 0;\r
+       my = 0;\r
+       if (d)\r
+               {\r
+               qsort(iWidth, d, sizeof(int), iCompare);\r
+               mx = iWidth[d / 2]; // find median width\r
+\r
+               qsort(iHeight, d, sizeof(int), iCompare);\r
+               my = iHeight[d / 2]; // find median height\r
+               }\r
+\r
+       printf("median %d,%d cell %d,%d space %d,%d\n",\r
+              mx, my, mx + iICS, my + iILS, iICS, iILS);\r
+\r
+       // create the space character (now that we have width)\r
+       *pc++ = mx; // should be mx + iICS but we cheat a little\r
+       pus[' '] = pc - (char *)pus;\r
+       *pc++ = 0x60; // indicates we have width but nothing else\r
+\r
+       // set file length, as all data has now been appended\r
+       pftOut->pcAppend = pc;\r
+\r
+       // fill out the table with minus signs for undefined chars\r
+       for (c = 0; c < 0x100; c++)\r
+               {\r
+               if (pus[c] == 0)\r
+                       {\r
+                       pus[c] = pus['-'];\r
+                       if (pus[c] == 0)\r
+                               {\r
+                               pus[c] = pus[' ']; // or space if no minus\r
+                               }\r
+                       }\r
+               }\r
+\r
+       // fill in header fields that weren't known until now\r
+       pc = (char *)(pus + 0x100);\r
+       *pc++ = mx + iICS;\r
+       *pc++ = my + iILS;\r
+       *pc++ = iICS;\r
+       *pc++ = iILS;\r
+       *pc++ = 'O'; // character to use for uncrossed zero\r
+       *pc++ = 0; // spare\r
+       *(int *)pc = pftOut->pcAppend - pftOut->pcBase;\r
+\r
+       // calculate and insert CRC using character set algorithm\r
+       pc = pftOut->pcBase + 4;\r
+       iCRC = iUpdateCRC(pc, pftOut->pcAppend - pc, 0xffff);\r
+\r
+       pc = pftOut->pcBase;\r
+       for (i = 0; i < 4; i++)\r
+               {\r
+               *pc++ = "0123456789ABCDEF"[(iCRC >> 12) & 0xf];\r
+               iCRC <<= 4;\r
+               }\r
+\r
+       return TRUE;\r
+       }\r
+\r
+int iCompare(const void *pvLeft, const void *pvRight)\r
+       {\r
+       if (*(int *)pvLeft < *(int *)pvRight)\r
+               {\r
+               return -1;\r
+               }\r
+\r
+       if (*(int *)pvLeft > *(int *)pvRight)\r
+               {\r
+               return 1;\r
+               }\r
+\r
+       return 0;\r
+       }\r
+\r
+int iUpdateCRC(char *pcBase, int iCount, int iCRC)\r
+       {\r
+       int i, j;\r
+\r
+       for (i = 0; i < iCount; i++)\r
+               {\r
+               iCRC ^= (pcBase[i] << 8);\r
+               for (j = 0; j < 8; j++)\r
+                       {\r
+                       if (iCRC & 0x8000)\r
+                               {\r
+                               iCRC = (iCRC << 1) ^ 0x1021;\r
+                               }\r
+                       else\r
+                               {\r
+                               iCRC <<= 1;\r
+                               }\r
+                       }\r
+               }\r
+\r
+       return iCRC;\r
+       }\r
+\r
+// ----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkfont/txt2chs.exe b/src/mkfont/txt2chs.exe
new file mode 100644 (file)
index 0000000..e5eb754
Binary files /dev/null and b/src/mkfont/txt2chs.exe differ
similarity index 51%
rename from src/mkutil/cr.exe
rename to src/mkutil/CR.EXE
index 062bc40..dccde71 100644 (file)
Binary files a/src/mkutil/cr.exe and b/src/mkutil/CR.EXE differ
diff --git a/src/mkutil/as-z80/as-z80.exe b/src/mkutil/as-z80/as-z80.exe
new file mode 100644 (file)
index 0000000..912b5f7
Binary files /dev/null and b/src/mkutil/as-z80/as-z80.exe differ
diff --git a/src/mkutil/as-z80/as-z80.map b/src/mkutil/as-z80/as-z80.map
new file mode 100644 (file)
index 0000000..5691b88
--- /dev/null
@@ -0,0 +1,567 @@
+ as-z80\r
+\r
+ Timestamp is 3ebb8bd3 (Fri May 09 21:06:59 2003)\r
+\r
+ Preferred load address is 00400000\r
+\r
+ Start         Length     Name                   Class\r
+ 0001:00000000 00012e00H .text                   CODE\r
+ 0002:00000000 0000060bH .rdata                  DATA\r
+ 0002:0000060b 00000000H .edata                  DATA\r
+ 0003:00000000 00000104H .CRT$XCA                DATA\r
+ 0003:00000104 00000104H .CRT$XCZ                DATA\r
+ 0003:00000208 00000104H .CRT$XIA                DATA\r
+ 0003:0000030c 00000109H .CRT$XIC                DATA\r
+ 0003:00000418 00000104H .CRT$XIZ                DATA\r
+ 0003:0000051c 00000104H .CRT$XPA                DATA\r
+ 0003:00000620 00000104H .CRT$XPX                DATA\r
+ 0003:00000724 00000104H .CRT$XPZ                DATA\r
+ 0003:00000828 00000104H .CRT$XTA                DATA\r
+ 0003:0000092c 00000104H .CRT$XTZ                DATA\r
+ 0003:00000a30 000053d2H .data                   DATA\r
+ 0003:00005e04 000035a0H .bss                    DATA\r
+ 0004:00000000 00000014H .idata$2                DATA\r
+ 0004:00000014 00000014H .idata$3                DATA\r
+ 0004:00000028 0000010cH .idata$4                DATA\r
+ 0004:00000134 0000010cH .idata$5                DATA\r
+ 0004:00000240 00000488H .idata$6                DATA\r
+\r
+  Address         Publics by Value              Rva+Base     Lib:Object\r
+\r
+ 0001:000003d0       _expr                      004013d0 f   asexpr.obj\r
+ 0001:0000085b       _getop                     0040185b f   asexpr.obj\r
+ 0001:00000892       _getnop                    00401892 f   asexpr.obj\r
+ 0001:000008e6       _getop_binary              004018e6 f   asexpr.obj\r
+ 0001:00000965       _getop_unary               00401965 f   asexpr.obj\r
+ 0001:000009ff       _getop_srch                004019ff f   asexpr.obj\r
+ 0001:00000aa3       _absexpr                   00401aa3 f   asexpr.obj\r
+ 0001:00000ad6       _term                      00401ad6 f   asexpr.obj\r
+ 0001:000015cc       _digit                     004025cc f   asexpr.obj\r
+ 0001:00001681       _abscheck                  00402681 f   asexpr.obj\r
+ 0001:000016b0       _is_abs                    004026b0 f   asexpr.obj\r
+ 0001:000016d2       _oprio                     004026d2 f   asexpr.obj\r
+ 0001:0000173f       _clrexpr                   0040273f f   asexpr.obj\r
+ 0001:0000176c       _exprmasks                 0040276c f   asexpr.obj\r
+ 0001:00001d10       _getid                     00402d10 f   aslex.obj\r
+ 0001:00001dcd       _getst                     00402dcd f   aslex.obj\r
+ 0001:00001e55       _getnb                     00402e55 f   aslex.obj\r
+ 0001:00001e76       _get                       00402e76 f   aslex.obj\r
+ 0001:00001ea4       _unget                     00402ea4 f   aslex.obj\r
+ 0001:00001ec8       _getmap                    00402ec8 f   aslex.obj\r
+ 0001:00002015       _getline                   00403015 f   aslex.obj\r
+ 0001:000021f4       _more                      004031f4 f   aslex.obj\r
+ 0001:00002231       _endline                   00403231 f   aslex.obj\r
+ 0001:000023c0       _list                      004033c0 f   aslist.obj\r
+ 0001:00002cbf       _list1                     00403cbf f   aslist.obj\r
+ 0001:00002ee9       _list2                     00403ee9 f   aslist.obj\r
+ 0001:00003006       _slew                      00404006 f   aslist.obj\r
+ 0001:000030e6       _lstsym                    004040e6 f   aslist.obj\r
+ 0001:00003fc0       _main                      00404fc0 f   asmain.obj\r
+ 0001:00004598       _asexit                    00405598 f   asmain.obj\r
+ 0001:00004664       _asmbl                     00405664 f   asmain.obj\r
+ 0001:000058c4       _afile                     004068c4 f   asmain.obj\r
+ 0001:0000596a       _afilex                    0040696a f   asmain.obj\r
+ 0001:00005ad1       _fndidx                    00406ad1 f   asmain.obj\r
+ 0001:00005b47       _newdot                    00406b47 f   asmain.obj\r
+ 0001:00005b93       _phase                     00406b93 f   asmain.obj\r
+ 0001:00005bb8       _usage                     00406bb8 f   asmain.obj\r
+ 0001:00006340       _outab                     00407340 f   asout.obj\r
+ 0001:00006353       _outaw                     00407353 f   asout.obj\r
+ 0001:00006366       _outa3b                    00407366 f   asout.obj\r
+ 0001:00006379       _outa4b                    00407379 f   asout.obj\r
+ 0001:0000638c       _outaxb                    0040738c f   asout.obj\r
+ 0001:000063e2       _outatxb                   004073e2 f   asout.obj\r
+ 0001:00006541       _outrb                     00407541 f   asout.obj\r
+ 0001:00006558       _outrw                     00407558 f   asout.obj\r
+ 0001:0000656f       _outr3b                    0040756f f   asout.obj\r
+ 0001:00006586       _outr4b                    00407586 f   asout.obj\r
+ 0001:0000659d       _outrxb                    0040759d f   asout.obj\r
+ 0001:000067bb       _outdp                     004077bb f   asout.obj\r
+ 0001:000068c3       _outall                    004078c3 f   asout.obj\r
+ 0001:000068e7       _outdot                    004078e7 f   asout.obj\r
+ 0001:0000699c       _outchk                    0040799c f   asout.obj\r
+ 0001:00006a3e       _outbuf                    00407a3e f   asout.obj\r
+ 0001:00006aed       _outgsd                    00407aed f   asout.obj\r
+ 0001:00006dba       _outarea                   00407dba f   asout.obj\r
+ 0001:00006e7a       _outsym                    00407e7a f   asout.obj\r
+ 0001:00006fb3       _out                       00407fb3 f   asout.obj\r
+ 0001:00007083       _out_lb                    00408083 f   asout.obj\r
+ 0001:000070c6       _out_lw                    004080c6 f   asout.obj\r
+ 0001:000070dd       _out_l3b                   004080dd f   asout.obj\r
+ 0001:000070f4       _out_l4b                   004080f4 f   asout.obj\r
+ 0001:0000710b       _out_lxb                   0040810b f   asout.obj\r
+ 0001:000072d7       _out_rw                    004082d7 f   asout.obj\r
+ 0001:00007373       _out_txb                   00408373 f   asout.obj\r
+ 0001:000074d2       _lobyte                    004084d2 f   asout.obj\r
+ 0001:000074df       _hibyte                    004084df f   asout.obj\r
+ 0001:000074ef       _thrdbyte                  004084ef f   asout.obj\r
+ 0001:000074ff       _frthbyte                  004084ff f   asout.obj\r
+ 0001:0000750f       _outr11                    0040850f f   asout.obj\r
+ 0001:0000767f       _outr19                    0040867f f   asout.obj\r
+ 0001:00007d20       _err                       00408d20 f   assubr.obj\r
+ 0001:00007d95       _diag                      00408d95 f   assubr.obj\r
+ 0001:00007eef       _rerr                      00408eef f   assubr.obj\r
+ 0001:00007efe       _aerr                      00408efe f   assubr.obj\r
+ 0001:00007f0d       _qerr                      00408f0d f   assubr.obj\r
+ 0001:00007f1c       _geterr                    00408f1c f   assubr.obj\r
+ 0001:00008020       _syminit                   00409020 f   assym.obj\r
+ 0001:00008125       _alookup                   00409125 f   assym.obj\r
+ 0001:00008165       _mlookup                   00409165 f   assym.obj\r
+ 0001:000081bd       _slookup                   004091bd f   assym.obj\r
+ 0001:0000821e       _lookup                    0040921e f   assym.obj\r
+ 0001:00008311       _symglob                   00409311 f   assym.obj\r
+ 0001:0000836b       _allglob                   0040936b f   assym.obj\r
+ 0001:000083cf       _symeq                     004093cf f   assym.obj\r
+ 0001:00008474       _hash                      00409474 f   assym.obj\r
+ 0001:000084d5       _strsto                    004094d5 f   assym.obj\r
+ 0001:00008554       _new                       00409554 f   assym.obj\r
+ 0001:000086f0       _addr                      004096f0 f   z80adr.obj\r
+ 0001:000089b9       _admode                    004099b9 f   z80adr.obj\r
+ 0001:00008a28       _srch                      00409a28 f   z80adr.obj\r
+ 0001:00008aed       _any                       00409aed f   z80adr.obj\r
+ 0001:00008c30       _machine                   00409c30 f   z80mch.obj\r
+ 0001:00009cc9       _genop                     0040acc9 f   z80mch.obj\r
+ 0001:00009de3       _gixiy                     0040ade3 f   z80mch.obj\r
+ 0001:00009e59       _mchpcr                    0040ae59 f   z80mch.obj\r
+ 0001:00009e9b       _comma                     0040ae9b f   z80mch.obj\r
+ 0001:00009eb4       _minit                     0040aeb4 f   z80mch.obj\r
+ 0001:0000a370       _strlen                    0040b370 f   LIBC:strlen.obj\r
+ 0001:0000a3f0       _strcpy                    0040b3f0 f   LIBC:strcat.obj\r
+ 0001:0000a400       _strcat                    0040b400 f   LIBC:strcat.obj\r
+ 0001:0000a4e0       _fclose                    0040b4e0 f   LIBC:fclose.obj\r
+ 0001:0000a536       _fgets                     0040b536 f   LIBC:fgets.obj\r
+ 0001:0000a58d       __flsbuf                   0040b58d f   LIBC:_flsbuf.obj\r
+ 0001:0000a6a2       _fprintf                   0040b6a2 f   LIBC:fprintf.obj\r
+ 0001:0000a6e0       _strcmp                    0040b6e0 f   LIBC:strcmp.obj\r
+ 0001:0000a764       _malloc                    0040b764 f   LIBC:malloc.obj\r
+ 0001:0000a776       __nh_malloc                0040b776 f   LIBC:malloc.obj\r
+ 0001:0000a7a2       __heap_alloc               0040b7a2 f   LIBC:malloc.obj\r
+ 0001:0000a816       _rewind                    0040b816 f   LIBC:rewind.obj\r
+ 0001:0000a86a       ___initstdio               0040b86a f   LIBC:_file.obj\r
+ 0001:0000a90f       ___endstdio                0040b90f f   LIBC:_file.obj\r
+ 0001:0000a924       __setjmp3                  0040b924 f   LIBC:setjmp3.obj\r
+ 0001:0000a99f       __cinit                    0040b99f f   LIBC:crt0dat.obj\r
+ 0001:0000a9cc       _exit                      0040b9cc f   LIBC:crt0dat.obj\r
+ 0001:0000a9dd       __exit                     0040b9dd f   LIBC:crt0dat.obj\r
+ 0001:0000a9ee       __cexit                    0040b9ee f   LIBC:crt0dat.obj\r
+ 0001:0000a9fd       __c_exit                   0040b9fd f   LIBC:crt0dat.obj\r
+ 0001:0000aabf       __fsopen                   0040babf f   LIBC:fopen.obj\r
+ 0001:0000aadf       _fopen                     0040badf f   LIBC:fopen.obj\r
+ 0001:0000ab00       _strncpy                   0040bb00 f   LIBC:strncpy.obj\r
+ 0001:0000ac00       _strrchr                   0040bc00 f   LIBC:strrchr.obj\r
+ 0001:0000ac28       _longjmp                   0040bc28 f   LIBC:longjmp.obj\r
+ 0001:0000aca1       _sprintf                   0040bca1 f   LIBC:sprintf.obj\r
+ 0001:0000acf3       _mainCRTStartup            0040bcf3 f   LIBC:crt0.obj\r
+ 0001:0000add2       __amsg_exit                0040bdd2 f   LIBC:crt0.obj\r
+ 0001:0000ae1b       _free                      0040be1b f   LIBC:free.obj\r
+ 0001:0000ae84       __close                    0040be84 f   LIBC:close.obj\r
+ 0001:0000af37       __freebuf                  0040bf37 f   LIBC:_freebuf.obj\r
+ 0001:0000af62       _fflush                    0040bf62 f   LIBC:fflush.obj\r
+ 0001:0000af9d       __flush                    0040bf9d f   LIBC:fflush.obj\r
+ 0001:0000aff9       __flushall                 0040bff9 f   LIBC:fflush.obj\r
+ 0001:0000b06f       __filbuf                   0040c06f f   LIBC:_filbuf.obj\r
+ 0001:0000b148       __lseek                    0040c148 f   LIBC:lseek.obj\r
+ 0001:0000b1e2       __ioinit                   0040c1e2 f   LIBC:ioinit.obj\r
+ 0001:0000b38d       __ioterm                   0040c38d f   LIBC:ioinit.obj\r
+ 0001:0000b3b0       __write                    0040c3b0 f   LIBC:write.obj\r
+ 0001:0000b55d       __getbuf                   0040c55d f   LIBC:_getbuf.obj\r
+ 0001:0000b5a1       __isatty                   0040c5a1 f   LIBC:isatty.obj\r
+ 0001:0000b5c7       __stbuf                    0040c5c7 f   LIBC:_sftbuf.obj\r
+ 0001:0000b654       __ftbuf                    0040c654 f   LIBC:_sftbuf.obj\r
+ 0001:0000b691       __output                   0040c691 f   LIBC:output.obj\r
+ 0001:0000be9b       ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z 0040ce9b f   LIBC:handler.obj\r
+ 0001:0000beab       ?_query_new_handler@@YAP6AHI@ZXZ 0040ceab f   LIBC:handler.obj\r
+ 0001:0000beb1       __callnewh                 0040ceb1 f   LIBC:handler.obj\r
+ 0001:0000becc       __GetLinkerVersion         0040cecc f   LIBC:heapinit.obj\r
+ 0001:0000bef9       ___heap_select             0040cef9 f   LIBC:heapinit.obj\r
+ 0001:0000c041       __heap_init                0040d041 f   LIBC:heapinit.obj\r
+ 0001:0000c09e       __heap_term                0040d09e f   LIBC:heapinit.obj\r
+ 0001:0000c146       __get_sbh_threshold        0040d146 f   LIBC:sbheap.obj\r
+ 0001:0000c165       __set_sbh_threshold        0040d165 f   LIBC:sbheap.obj\r
+ 0001:0000c218       ___sbh_heap_init           0040d218 f   LIBC:sbheap.obj\r
+ 0001:0000c260       ___sbh_find_block          0040d260 f   LIBC:sbheap.obj\r
+ 0001:0000c28b       ___sbh_free_block          0040d28b f   LIBC:sbheap.obj\r
+ 0001:0000c5b4       ___sbh_alloc_block         0040d5b4 f   LIBC:sbheap.obj\r
+ 0001:0000c8bd       ___sbh_alloc_new_region    0040d8bd f   LIBC:sbheap.obj\r
+ 0001:0000c96e       ___sbh_alloc_new_group     0040d96e f   LIBC:sbheap.obj\r
+ 0001:0000ca69       ___sbh_resize_block        0040da69 f   LIBC:sbheap.obj\r
+ 0001:0000cd5f       ___sbh_heapmin             0040dd5f f   LIBC:sbheap.obj\r
+ 0001:0000ce30       ___sbh_heap_check          0040de30 f   LIBC:sbheap.obj\r
+ 0001:0000d15f       __get_old_sbh_threshold    0040e15f f   LIBC:sbheap.obj\r
+ 0001:0000d165       __set_old_sbh_threshold    0040e165 f   LIBC:sbheap.obj\r
+ 0001:0000d181       ___old_sbh_new_region      0040e181 f   LIBC:sbheap.obj\r
+ 0001:0000d2c5       ___old_sbh_release_region  0040e2c5 f   LIBC:sbheap.obj\r
+ 0001:0000d31b       ___old_sbh_decommit_pages  0040e31b f   LIBC:sbheap.obj\r
+ 0001:0000d3dd       ___old_sbh_find_block      0040e3dd f   LIBC:sbheap.obj\r
+ 0001:0000d434       ___old_sbh_free_block      0040e434 f   LIBC:sbheap.obj\r
+ 0001:0000d479       ___old_sbh_alloc_block     0040e479 f   LIBC:sbheap.obj\r
+ 0001:0000d681       ___old_sbh_alloc_block_from_page 0040e681 f   LIBC:sbheap.obj\r
+ 0001:0000d7a5       ___old_sbh_resize_block    0040e7a5 f   LIBC:sbheap.obj\r
+ 0001:0000d84e       ___old_sbh_heap_check      0040e84e f   LIBC:sbheap.obj\r
+ 0001:0000d9ac       _calloc                    0040e9ac f   LIBC:calloc.obj\r
+ 0001:0000da5d       __fcloseall                0040ea5d f   LIBC:closeall.obj\r
+ 0001:0000dab8       __global_unwind2           0040eab8 f   LIBC:exsup.obj\r
+ 0001:0000dafa       __local_unwind2            0040eafa f   LIBC:exsup.obj\r
+ 0001:0000db52       __NLG_Return2              0040eb52 f   LIBC:exsup.obj\r
+ 0001:0000db62       __abnormal_termination     0040eb62 f   LIBC:exsup.obj\r
+ 0001:0000db85       __NLG_Notify1              0040eb85 f   LIBC:exsup.obj\r
+ 0001:0000db8e       __NLG_Notify               0040eb8e f   LIBC:exsup.obj\r
+ 0001:0000dba1       __NLG_Dispatch             0040eba1 f   LIBC:exsup.obj\r
+ 0001:0000dba6       __openfile                 0040eba6 f   LIBC:_open.obj\r
+ 0001:0000dd16       __getstream                0040ed16 f   LIBC:stream.obj\r
+ 0001:0000dd8e       __rt_probe_read4@4         0040ed8e f   LIBC:sehsupp.obj\r
+ 0001:0000ddf3       __XcptFilter               0040edf3 f   LIBC:winxfltr.obj\r
+ 0001:0000df77       __setenvp                  0040ef77 f   LIBC:stdenvp.obj\r
+ 0001:0000e030       __setargv                  0040f030 f   LIBC:stdargv.obj\r
+ 0001:0000e27d       ___crtGetEnvironmentStringsA 0040f27d f   LIBC:a_env.obj\r
+ 0001:0000e3b8       __except_handler3          0040f3b8 f   LIBC:exsup3.obj\r
+ 0001:0000e475       __seh_longjmp_unwind@4     0040f475 f   LIBC:exsup3.obj\r
+ 0001:0000e490       __FF_MSGBANNER             0040f490 f   LIBC:crt0msg.obj\r
+ 0001:0000e4c9       __NMSG_WRITE               0040f4c9 f   LIBC:crt0msg.obj\r
+ 0001:0000e61c       __GET_RTERRMSG             0040f61c f   LIBC:crt0msg.obj\r
+ 0001:0000e64d       __dosmaperr                0040f64d f   LIBC:dosmap.obj\r
+ 0001:0000e6b4       __alloc_osfhnd             0040f6b4 f   LIBC:osfinfo.obj\r
+ 0001:0000e749       __set_osfhnd               0040f749 f   LIBC:osfinfo.obj\r
+ 0001:0000e7c0       __free_osfhnd              0040f7c0 f   LIBC:osfinfo.obj\r
+ 0001:0000e83a       __get_osfhandle            0040f83a f   LIBC:osfinfo.obj\r
+ 0001:0000e877       __open_osfhandle           0040f877 f   LIBC:osfinfo.obj\r
+ 0001:0000e914       __commit                   0040f914 f   LIBC:commit.obj\r
+ 0001:0000e96b       __read                     0040f96b f   LIBC:read.obj\r
+ 0001:0000eb61       _wctomb                    0040fb61 f   LIBC:wctomb.obj\r
+ 0001:0000ebd0       __aulldiv                  0040fbd0 f   LIBC:ulldiv.obj\r
+ 0001:0000ec40       __aullrem                  0040fc40 f   LIBC:ullrem.obj\r
+ 0001:0000ecb5       _strtol                    0040fcb5 f   LIBC:strtol.obj\r
+ 0001:0000eed4       _strtoul                   0040fed4 f   LIBC:strtol.obj\r
+ 0001:0000ef00       _strchr                    0040ff00 f   LIBC:strchr.obj\r
+ 0001:0000ef06       ___from_strstr_to_strchr   0040ff06 f   LIBC:strchr.obj\r
+ 0001:0000efc0       _strstr                    0040ffc0 f   LIBC:strstr.obj\r
+ 0001:0000f040       _strncmp                   00410040 f   LIBC:strncmp.obj\r
+ 0001:0000f080       __alloca_probe             00410080 f   LIBC:chkstk.obj\r
+ 0001:0000f080       __chkstk                   00410080 f   LIBC:chkstk.obj\r
+ 0001:0000f0b0       _memmove                   004100b0 f   LIBC:memmove.obj\r
+ 0001:0000f3f0       _memset                    004103f0 f   LIBC:memset.obj\r
+ 0001:0000f448       __open                     00410448 f   LIBC:open.obj\r
+ 0001:0000f45f       __sopen                    0041045f f   LIBC:open.obj\r
+ 0001:0000f718       __setmbcp                  00410718 f   LIBC:mbctype.obj\r
+ 0001:0000fadc       __getmbcp                  00410adc f   LIBC:mbctype.obj\r
+ 0001:0000faec       ___initmbctable            00410aec f   LIBC:mbctype.obj\r
+ 0001:0000fb10       _memcpy                    00410b10 f   LIBC:memcpy.obj\r
+ 0001:0000fe45       ___crtMessageBoxA          00410e45 f   LIBC:crtmbox.obj\r
+ 0001:0000fece       __fptrap                   00410ece f   LIBC:crt0fp.obj\r
+ 0001:0000fed7       __toupper                  00410ed7 f   LIBC:toupper.obj\r
+ 0001:0000fedf       _toupper                   00410edf f   LIBC:toupper.obj\r
+ 0001:0000ffab       __isctype                  00410fab f   LIBC:isctype.obj\r
+ 0001:00010020       __chsize                   00411020 f   LIBC:chsize.obj\r
+ 0001:00010166       ___crtLCMapStringA         00411166 f   LIBC:a_map.obj\r
+ 0001:000103b5       ___crtGetStringTypeA       004113b5 f   LIBC:a_str.obj\r
+ 0001:000104fe       __setmode                  004114fe f   LIBC:setmode.obj\r
+ 0001:00010574       _HeapAlloc@12              00411574 f   kernel32:KERNEL32.dll\r
+ 0001:0001057a       _ExitProcess@4             0041157a f   kernel32:KERNEL32.dll\r
+ 0001:00010580       _TerminateProcess@8        00411580 f   kernel32:KERNEL32.dll\r
+ 0001:00010586       _GetCurrentProcess@0       00411586 f   kernel32:KERNEL32.dll\r
+ 0001:0001058c       _GetCommandLineA@0         0041158c f   kernel32:KERNEL32.dll\r
+ 0001:00010592       _GetVersion@0              00411592 f   kernel32:KERNEL32.dll\r
+ 0001:00010598       _HeapFree@12               00411598 f   kernel32:KERNEL32.dll\r
+ 0001:0001059e       _GetLastError@0            0041159e f   kernel32:KERNEL32.dll\r
+ 0001:000105a4       _CloseHandle@4             004115a4 f   kernel32:KERNEL32.dll\r
+ 0001:000105aa       _SetFilePointer@16         004115aa f   kernel32:KERNEL32.dll\r
+ 0001:000105b0       _SetHandleCount@4          004115b0 f   kernel32:KERNEL32.dll\r
+ 0001:000105b6       _GetStdHandle@4            004115b6 f   kernel32:KERNEL32.dll\r
+ 0001:000105bc       _GetFileType@4             004115bc f   kernel32:KERNEL32.dll\r
+ 0001:000105c2       _GetStartupInfoA@4         004115c2 f   kernel32:KERNEL32.dll\r
+ 0001:000105c8       _WriteFile@20              004115c8 f   kernel32:KERNEL32.dll\r
+ 0001:000105ce       _GetModuleHandleA@4        004115ce f   kernel32:KERNEL32.dll\r
+ 0001:000105d4       _GetModuleFileNameA@12     004115d4 f   kernel32:KERNEL32.dll\r
+ 0001:000105da       _GetEnvironmentVariableA@12 004115da f   kernel32:KERNEL32.dll\r
+ 0001:000105e0       _GetVersionExA@4           004115e0 f   kernel32:KERNEL32.dll\r
+ 0001:000105e6       _HeapDestroy@4             004115e6 f   kernel32:KERNEL32.dll\r
+ 0001:000105ec       _HeapCreate@12             004115ec f   kernel32:KERNEL32.dll\r
+ 0001:000105f2       _VirtualFree@12            004115f2 f   kernel32:KERNEL32.dll\r
+ 0001:000105f8       _VirtualAlloc@16           004115f8 f   kernel32:KERNEL32.dll\r
+ 0001:000105fe       _HeapReAlloc@16            004115fe f   kernel32:KERNEL32.dll\r
+ 0001:00010604       _IsBadWritePtr@8           00411604 f   kernel32:KERNEL32.dll\r
+ 0001:0001060a       _RtlUnwind@16              0041160a f   kernel32:KERNEL32.dll\r
+ 0001:00010610       _UnhandledExceptionFilter@4 00411610 f   kernel32:KERNEL32.dll\r
+ 0001:00010616       _FreeEnvironmentStringsA@4 00411616 f   kernel32:KERNEL32.dll\r
+ 0001:0001061c       _FreeEnvironmentStringsW@4 0041161c f   kernel32:KERNEL32.dll\r
+ 0001:00010622       _WideCharToMultiByte@32    00411622 f   kernel32:KERNEL32.dll\r
+ 0001:00010628       _GetEnvironmentStrings@0   00411628 f   kernel32:KERNEL32.dll\r
+ 0001:0001062e       _GetEnvironmentStringsW@0  0041162e f   kernel32:KERNEL32.dll\r
+ 0001:00010634       _SetStdHandle@8            00411634 f   kernel32:KERNEL32.dll\r
+ 0001:0001063a       _FlushFileBuffers@4        0041163a f   kernel32:KERNEL32.dll\r
+ 0001:00010640       _ReadFile@20               00411640 f   kernel32:KERNEL32.dll\r
+ 0001:00010646       _CreateFileA@28            00411646 f   kernel32:KERNEL32.dll\r
+ 0001:0001064c       _GetCPInfo@8               0041164c f   kernel32:KERNEL32.dll\r
+ 0001:00010652       _GetACP@0                  00411652 f   kernel32:KERNEL32.dll\r
+ 0001:00010658       _GetOEMCP@0                00411658 f   kernel32:KERNEL32.dll\r
+ 0001:0001065e       _GetProcAddress@8          0041165e f   kernel32:KERNEL32.dll\r
+ 0001:00010664       _LoadLibraryA@4            00411664 f   kernel32:KERNEL32.dll\r
+ 0001:0001066a       _SetEndOfFile@4            0041166a f   kernel32:KERNEL32.dll\r
+ 0001:00010670       _MultiByteToWideChar@24    00411670 f   kernel32:KERNEL32.dll\r
+ 0001:00010676       _LCMapStringA@24           00411676 f   kernel32:KERNEL32.dll\r
+ 0001:0001067c       _LCMapStringW@24           0041167c f   kernel32:KERNEL32.dll\r
+ 0001:00010682       _GetStringTypeA@20         00411682 f   kernel32:KERNEL32.dll\r
+ 0001:00010688       _GetStringTypeW@16         00411688 f   kernel32:KERNEL32.dll\r
+ 0002:0000002c       ___lookuptable             0041402c     LIBC:output.obj\r
+ 0002:00000088       ??_C@_1O@POHA@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 00414088     LIBC:output.obj\r
+ 0002:00000098       ??_C@_06ONKE@?$CInull?$CJ?$AA@ 00414098     LIBC:output.obj\r
+ 0002:000000a0       ??_C@_0BH@PHHF@__GLOBAL_HEAP_SELECTED?$AA@ 004140a0     LIBC:heapinit.obj\r
+ 0002:000000b8       ??_C@_0BF@BBGL@__MSVCRT_HEAP_SELECT?$AA@ 004140b8     LIBC:heapinit.obj\r
+ 0002:000000dc       ??_C@_0P@GGKG@runtime?5error?5?$AA@ 004140dc     LIBC:crt0msg.obj\r
+ 0002:000000ec       ??_C@_02PIMC@?$AN?6?$AA@   004140ec     LIBC:crt0msg.obj\r
+ 0002:000000f0       ??_C@_0O@DELO@TLOSS?5error?$AN?6?$AA@ 004140f0     LIBC:crt0msg.obj\r
+ 0002:00000100       ??_C@_0N@OMLL@SING?5error?$AN?6?$AA@ 00414100     LIBC:crt0msg.obj\r
+ 0002:00000110       ??_C@_0P@OJAK@DOMAIN?5error?$AN?6?$AA@ 00414110     LIBC:crt0msg.obj\r
+ 0002:00000120       ??_C@_0CF@EANP@R6028?$AN?6?9?5unable?5to?5initialize?5he@ 00414120     LIBC:crt0msg.obj\r
+ 0002:00000148       ??_C@_0DF@ECGN@R6027?$AN?6?9?5not?5enough?5space?5for?5lo@ 00414148     LIBC:crt0msg.obj\r
+ 0002:00000180       ??_C@_0DF@FKAC@R6026?$AN?6?9?5not?5enough?5space?5for?5st@ 00414180     LIBC:crt0msg.obj\r
+ 0002:000001b8       ??_C@_0CG@DPMN@R6025?$AN?6?9?5pure?5virtual?5function?5c@ 004141b8     LIBC:crt0msg.obj\r
+ 0002:000001e0       ??_C@_0DF@CKIP@R6024?$AN?6?9?5not?5enough?5space?5for?5_o@ 004141e0     LIBC:crt0msg.obj\r
+ 0002:00000218       ??_C@_0CJ@GGOE@R6019?$AN?6?9?5unable?5to?5open?5console?5@ 00414218     LIBC:crt0msg.obj\r
+ 0002:00000244       ??_C@_0CB@LBOB@R6018?$AN?6?9?5unexpected?5heap?5error?$AN?6@ 00414244     LIBC:crt0msg.obj\r
+ 0002:00000268       ??_C@_0CN@FPEG@R6017?$AN?6?9?5unexpected?5multithread?5@ 00414268     LIBC:crt0msg.obj\r
+ 0002:00000298       ??_C@_0CM@OBIC@R6016?$AN?6?9?5not?5enough?5space?5for?5th@ 00414298     LIBC:crt0msg.obj\r
+ 0002:000002c4       ??_C@_0CB@HPAL@?$AN?6abnormal?5program?5termination?$AN?6@ 004142c4     LIBC:crt0msg.obj\r
+ 0002:000002e8       ??_C@_0CM@JOOB@R6009?$AN?6?9?5not?5enough?5space?5for?5en@ 004142e8     LIBC:crt0msg.obj\r
+ 0002:00000314       ??_C@_0CK@OIBL@R6008?$AN?6?9?5not?5enough?5space?5for?5ar@ 00414314     LIBC:crt0msg.obj\r
+ 0002:00000340       ??_C@_0CF@LKPB@R6002?$AN?6?9?5floating?5point?5not?5load@ 00414340     LIBC:crt0msg.obj\r
+ 0002:00000368       ??_C@_0CF@JPDF@Microsoft?5Visual?5C?$CL?$CL?5Runtime?5Lib@ 00414368     LIBC:crt0msg.obj\r
+ 0002:00000390       ??_C@_02JJJH@?6?6?$AA@     00414390     LIBC:crt0msg.obj\r
+ 0002:00000394       ??_C@_0BK@DEOK@Runtime?5Error?$CB?6?6Program?3?5?$AA@ 00414394     LIBC:crt0msg.obj\r
+ 0002:000003b0       ??_C@_03NAME@?4?4?4?$AA@   004143b0     LIBC:crt0msg.obj\r
+ 0002:000003b4       ??_C@_0BH@NNCD@?$DMprogram?5name?5unknown?$DO?$AA@ 004143b4     LIBC:crt0msg.obj\r
+ 0002:000003cc       ??_C@_0BD@NJFP@GetLastActivePopup?$AA@ 004143cc     LIBC:crtmbox.obj\r
+ 0002:000003e0       ??_C@_0BA@GILI@GetActiveWindow?$AA@ 004143e0     LIBC:crtmbox.obj\r
+ 0002:000003f0       ??_C@_0M@PKCK@MessageBoxA?$AA@ 004143f0     LIBC:crtmbox.obj\r
+ 0002:000003fc       ??_C@_0L@HKL@user32?4dll?$AA@ 004143fc     LIBC:crtmbox.obj\r
+ 0002:00000408       ??_C@_01A@?$AA?$AA@        00414408     LIBC:a_map.obj\r
+ 0002:0000040c       ??_C@_13A@?$AA?$AA?$AA?$AA@ 0041440c     LIBC:a_map.obj\r
+ 0003:00000000       ___xc_a                    00415000     LIBC:crt0init.obj\r
+ 0003:00000104       ___xc_z                    00415104     LIBC:crt0init.obj\r
+ 0003:00000208       ___xi_a                    00415208     LIBC:crt0init.obj\r
+ 0003:00000418       ___xi_z                    00415418     LIBC:crt0init.obj\r
+ 0003:0000051c       ___xp_a                    0041551c     LIBC:crt0init.obj\r
+ 0003:00000724       ___xp_z                    00415724     LIBC:crt0init.obj\r
+ 0003:00000828       ___xt_a                    00415828     LIBC:crt0init.obj\r
+ 0003:0000092c       ___xt_z                    0041592c     LIBC:crt0init.obj\r
+ 0003:00000a30       _symtbl                    00415a30     asdata.obj\r
+ 0003:00000a40       _aretbl                    00415a40     asdata.obj\r
+ 0003:00000a50       _sym                       00415a50     asdata.obj\r
+ 0003:00000a88       _area                      00415a88     asdata.obj\r
+ 0003:00000aa0       _ctype                     00415aa0     asdata.obj\r
+ 0003:00000b20       _ccase                     00415b20     asdata.obj\r
+ 0003:00001214       _usetxt                    00416214     asmain.obj\r
+ 0003:00001614       _txtp                      00416614     asout.obj\r
+ 0003:00001618       _relp                      00416618     asout.obj\r
+ 0003:000017c4       _errors                    004167c4     assubr.obj\r
+ 0003:00001b18       _R8                        00416b18     z80adr.obj\r
+ 0003:00001b58       _R8X                       00416b58     z80adr.obj\r
+ 0003:00001b70       _R16                       00416b70     z80adr.obj\r
+ 0003:00001ba8       _R16X                      00416ba8     z80adr.obj\r
+ 0003:00001bc0       _CND                       00416bc0     z80adr.obj\r
+ 0003:00001c44       _cpu                       00416c44     z80ext.obj\r
+ 0003:00001c48       _dsft                      00416c48     z80ext.obj\r
+ 0003:00001c74       _imtab                     00416c74     z80mch.obj\r
+ 0003:00001c78       _mne                       00416c78     z80pst.obj\r
+ 0003:00002c50       __iob                      00417c50     LIBC:_file.obj\r
+ 0003:00002ed0       __aexit_rtn                00417ed0     LIBC:crt0.obj\r
+ 0003:00002ed4       ___app_type                00417ed4     LIBC:crt0.obj\r
+ 0003:00002ed8       ___badioinfo               00417ed8     LIBC:ioinit.obj\r
+ 0003:00002ee0       ___nullstring              00417ee0     LIBC:output.obj\r
+ 0003:00002ee4       ___wnullstring             00417ee4     LIBC:output.obj\r
+ 0003:00002ee8       __amblksiz                 00417ee8     LIBC:heapinit.obj\r
+ 0003:00002ef0       ___old_small_block_heap    00417ef0     LIBC:sbheap.obj\r
+ 0003:00004f14       ___old_sbh_threshold       00419f14     LIBC:sbheap.obj\r
+ 0003:00004f18       __NLG_Destination          00419f18     LIBC:exsup.obj\r
+ 0003:00004f28       __XcptActTab               00419f28     LIBC:winxfltr.obj\r
+ 0003:00004fa0       __First_FPE_Indx           00419fa0     LIBC:winxfltr.obj\r
+ 0003:00004fa4       __Num_FPE                  00419fa4     LIBC:winxfltr.obj\r
+ 0003:00004fa8       __XcptActTabCount          00419fa8     LIBC:winxfltr.obj\r
+ 0003:00004fac       __fpecode                  00419fac     LIBC:winxfltr.obj\r
+ 0003:000051a8       __cfltcvt_tab              0041a1a8     LIBC:cmiscdat.obj\r
+ 0003:000051c0       __pctype                   0041a1c0     LIBC:ctype.obj\r
+ 0003:000051c4       __pwctype                  0041a1c4     LIBC:ctype.obj\r
+ 0003:000051c8       __ctype                    0041a1c8     LIBC:ctype.obj\r
+ 0003:000054d0       ___mb_cur_max              0041a4d0     LIBC:nlsdata1.obj\r
+ 0003:000054d4       ___decimal_point           0041a4d4     LIBC:nlsdata1.obj\r
+ 0003:000054d8       ___decimal_point_length    0041a4d8     LIBC:nlsdata1.obj\r
+ 0003:00005e4c       _hilo                      0041ae4c     z80ext.obj\r
+ 0003:00005e50       __cflush                   0041ae50     LIBC:_file.obj\r
+ 0003:00005e54       _errno                     0041ae54     LIBC:crt0dat.obj\r
+ 0003:00005e58       __doserrno                 0041ae58     LIBC:crt0dat.obj\r
+ 0003:00005e5c       __umaskval                 0041ae5c     LIBC:crt0dat.obj\r
+ 0003:00005e60       __osver                    0041ae60     LIBC:crt0dat.obj\r
+ 0003:00005e64       __winver                   0041ae64     LIBC:crt0dat.obj\r
+ 0003:00005e68       __winmajor                 0041ae68     LIBC:crt0dat.obj\r
+ 0003:00005e6c       __winminor                 0041ae6c     LIBC:crt0dat.obj\r
+ 0003:00005e70       ___argc                    0041ae70     LIBC:crt0dat.obj\r
+ 0003:00005e74       ___argv                    0041ae74     LIBC:crt0dat.obj\r
+ 0003:00005e78       ___wargv                   0041ae78     LIBC:crt0dat.obj\r
+ 0003:00005e7c       __environ                  0041ae7c     LIBC:crt0dat.obj\r
+ 0003:00005e80       ___initenv                 0041ae80     LIBC:crt0dat.obj\r
+ 0003:00005e84       __wenviron                 0041ae84     LIBC:crt0dat.obj\r
+ 0003:00005e88       ___winitenv                0041ae88     LIBC:crt0dat.obj\r
+ 0003:00005e8c       __pgmptr                   0041ae8c     LIBC:crt0dat.obj\r
+ 0003:00005e90       __wpgmptr                  0041ae90     LIBC:crt0dat.obj\r
+ 0003:00005e94       __exitflag                 0041ae94     LIBC:crt0dat.obj\r
+ 0003:00005e98       __C_Termination_Done       0041ae98     LIBC:crt0dat.obj\r
+ 0003:00005e9c       __C_Exit_Done              0041ae9c     LIBC:crt0dat.obj\r
+ 0003:00005ea0       __aenvptr                  0041aea0     LIBC:crt0.obj\r
+ 0003:00005ea4       __wenvptr                  0041aea4     LIBC:crt0.obj\r
+ 0003:00005ea8       ___error_mode              0041aea8     LIBC:crt0.obj\r
+ 0003:00005eac       __stdbuf                   0041aeac     LIBC:_sftbuf.obj\r
+ 0003:00005eb4       __newmode                  0041aeb4     LIBC:_newmode.obj\r
+ 0003:00005eb8       ?_pnhHeap@@3P6AHI@ZA       0041aeb8     LIBC:handler.obj\r
+ 0003:00005ec0       __pxcptinfoptrs            0041aec0     LIBC:winxfltr.obj\r
+ 0003:00005fcc       __adbgmsg                  0041afcc     LIBC:crt0msg.obj\r
+ 0003:00005fd0       __commode                  0041afd0     LIBC:ncommode.obj\r
+ 0003:00005fe4       ___lc_handle               0041afe4     LIBC:nlsdata2.obj\r
+ 0003:00005ffc       ___lc_codepage             0041affc     LIBC:nlsdata2.obj\r
+ 0003:00006000       ___lc_collate_cp           0041b000     LIBC:nlsdata2.obj\r
+ 0003:00006004       __fmode                    0041b004     LIBC:txtmode.obj\r
+ 0003:00006010       _hd64                      0041b010     <common>\r
+ 0003:00006020       _rel                       0041b020     <common>\r
+ 0003:00006040       _txt                       0041b040     <common>\r
+ 0003:00006050       _fflag                     0041b050     <common>\r
+ 0003:000064e0       _module                    0041b4e0     <common>\r
+ 0003:00006534       _tlevel                    0041b534     <common>\r
+ 0003:00006538       _symp                      0041b538     <common>\r
+ 0003:0000653c       _inpfil                    0041b53c     <common>\r
+ 0003:00006540       _afn                       0041b540     <common>\r
+ 0003:00006640       _afp                       0041b640     <common>\r
+ 0003:00006644       _lmode                     0041b644     <common>\r
+ 0003:00006660       _cbt                       0041b660     <common>\r
+ 0003:00006860       _symhash                   0041b860     <common>\r
+ 0003:00006960       _mnehash                   0041b960     <common>\r
+ 0003:00006a60       _srcfn                     0041ba60     <common>\r
+ 0003:00007060       _laddr                     0041c060     <common>\r
+ 0003:00007080       _srcfp                     0041c080     <common>\r
+ 0003:00007098       _cpt                       0041c098     <common>\r
+ 0003:0000709c       _fuzz                      0041c09c     <common>\r
+ 0003:000070a0       _erb                       0041c0a0     <common>\r
+ 0003:00007124       _incfil                    0041c124     <common>\r
+ 0003:00007140       _incfn                     0041c140     <common>\r
+ 0003:00007740       _incfp                     0041c740     <common>\r
+ 0003:00007760       _ifp                       0041c760     <common>\r
+ 0003:00007778       _cfile                     0041c778     <common>\r
+ 0003:0000777c       _lfp                       0041c77c     <common>\r
+ 0003:00007780       _gflag                     0041c780     <common>\r
+ 0003:00007784       _a_mask                    0041c784     <common>\r
+ 0003:00007788       _line                      0041c788     <common>\r
+ 0003:0000778c       _lop                       0041c78c     <common>\r
+ 0003:00007790       _ofp                       0041c790     <common>\r
+ 0003:00007794       _zflag                     0041c794     <common>\r
+ 0003:000077a0       _srcline                   0041c7a0     <common>\r
+ 0003:000077b8       _oflag                     0041c7b8     <common>\r
+ 0003:000077c0       _sfp                       0041c7c0     <common>\r
+ 0003:000077d8       _areap                     0041c7d8     <common>\r
+ 0003:000077dc       _tfp                       0041c7dc     <common>\r
+ 0003:000077e0       _page                      0041c7e0     <common>\r
+ 0003:00007800       _stb                       0041c800     <common>\r
+ 0003:00007850       _pass                      0041c850     <common>\r
+ 0003:00007854       _sflag                     0041c854     <common>\r
+ 0003:00007860       _cb                        0041c860     <common>\r
+ 0003:000078e0       _eb                        0041c8e0     <common>\r
+ 0003:000078e4       _cp                        0041c8e4     <common>\r
+ 0003:000078e8       _aserr                     0041c8e8     <common>\r
+ 0003:000078ec       _ep                        0041c8ec     <common>\r
+ 0003:00007900       _ib                        0041c900     <common>\r
+ 0003:00007980       _wflag                     0041c980     <common>\r
+ 0003:00007984       _ip                        0041c984     <common>\r
+ 0003:000079a0       _afntmp                    0041c9a0     <common>\r
+ 0003:00007aa0       _tb                        0041caa0     <common>\r
+ 0003:00007af0       _lflag                     0041caf0     <common>\r
+ 0003:00007af4       _a_bytes                   0041caf4     <common>\r
+ 0003:00007af8       _afptmp                    0041caf8     <common>\r
+ 0003:00007afc       _pflag                     0041cafc     <common>\r
+ 0003:00007b00       _incline                   0041cb00     <common>\r
+ 0003:00007b18       _aflag                     0041cb18     <common>\r
+ 0003:00007b20       _ifcnd                     0041cb20     <common>\r
+ 0003:00007b4c       _s_mask                    0041cb4c     <common>\r
+ 0003:00007b50       _xflag                     0041cb50     <common>\r
+ 0003:00007b54       _radix                     0041cb54     <common>\r
+ 0003:00007b58       _flevel                    0041cb58     <common>\r
+ 0003:00007b60       _jump_env                  0041cb60     <common>\r
+ 0003:00007ba0       _v_mask                    0041cba0     <common>\r
+ 0003:00007bc0       _iflvl                     0041cbc0     <common>\r
+ 0003:00007bec       ___mbcodepage              0041cbec     <common>\r
+ 0003:00007c70       ___mbulinfo                0041cc70     <common>\r
+ 0003:00007c7c       ___ismbcodepage            0041cc7c     <common>\r
+ 0003:00007c80       __mbcasemap                0041cc80     <common>\r
+ 0003:00007d80       __mbctype                  0041cd80     <common>\r
+ 0003:00007e84       ___mblcid                  0041ce84     <common>\r
+ 0003:00007e88       ___sbh_sizeHeaderList      0041ce88     <common>\r
+ 0003:00007e9c       ___sbh_indGroupDefer       0041ce9c     <common>\r
+ 0003:00007ea0       ___sbh_pHeaderScan         0041cea0     <common>\r
+ 0003:00007ea4       ___sbh_initialized         0041cea4     <common>\r
+ 0003:00007ea8       ___sbh_pHeaderDefer        0041cea8     <common>\r
+ 0003:00007eac       ___sbh_cntHeaderList       0041ceac     <common>\r
+ 0003:00007eb0       ___sbh_pHeaderList         0041ceb0     <common>\r
+ 0003:00007eb4       ___sbh_threshold           0041ceb4     <common>\r
+ 0003:00007eb8       __crtheap                  0041ceb8     <common>\r
+ 0003:00007ec8       ___active_heap             0041cec8     <common>\r
+ 0003:00007ee0       ___pioinfo                 0041cee0     <common>\r
+ 0003:0000801c       __nhandle                  0041d01c     <common>\r
+ 0003:00008020       __acmdln                   0041d020     <common>\r
+ 0003:0000802c       __setjmpexused             0041d02c     <common>\r
+ 0003:00008038       ___env_initialized         0041d038     <common>\r
+ 0003:00008048       ___mbctype_initialized     0041d048     <common>\r
+ 0003:0000804c       ___onexitend               0041d04c     <common>\r
+ 0003:00008050       ___onexitbegin             0041d050     <common>\r
+ 0003:00008054       __FPinit                   0041d054     <common>\r
+ 0003:00008058       ___piob                    0041d058     <common>\r
+ 0003:000083a0       __bufin                    0041d3a0     <common>\r
+ 0003:000093a0       __nstream                  0041e3a0     <common>\r
+ 0004:00000000       __IMPORT_DESCRIPTOR_KERNEL32 0041f000     kernel32:KERNEL32.dll\r
+ 0004:00000014       __NULL_IMPORT_DESCRIPTOR   0041f014     kernel32:KERNEL32.dll\r
+ 0004:00000134       __imp__IsBadWritePtr@8     0041f134     kernel32:KERNEL32.dll\r
+ 0004:00000138       __imp__ExitProcess@4       0041f138     kernel32:KERNEL32.dll\r
+ 0004:0000013c       __imp__TerminateProcess@8  0041f13c     kernel32:KERNEL32.dll\r
+ 0004:00000140       __imp__GetCurrentProcess@0 0041f140     kernel32:KERNEL32.dll\r
+ 0004:00000144       __imp__GetCommandLineA@0   0041f144     kernel32:KERNEL32.dll\r
+ 0004:00000148       __imp__GetVersion@0        0041f148     kernel32:KERNEL32.dll\r
+ 0004:0000014c       __imp__HeapFree@12         0041f14c     kernel32:KERNEL32.dll\r
+ 0004:00000150       __imp__GetLastError@0      0041f150     kernel32:KERNEL32.dll\r
+ 0004:00000154       __imp__CloseHandle@4       0041f154     kernel32:KERNEL32.dll\r
+ 0004:00000158       __imp__SetFilePointer@16   0041f158     kernel32:KERNEL32.dll\r
+ 0004:0000015c       __imp__SetHandleCount@4    0041f15c     kernel32:KERNEL32.dll\r
+ 0004:00000160       __imp__GetStdHandle@4      0041f160     kernel32:KERNEL32.dll\r
+ 0004:00000164       __imp__GetFileType@4       0041f164     kernel32:KERNEL32.dll\r
+ 0004:00000168       __imp__GetStartupInfoA@4   0041f168     kernel32:KERNEL32.dll\r
+ 0004:0000016c       __imp__WriteFile@20        0041f16c     kernel32:KERNEL32.dll\r
+ 0004:00000170       __imp__GetModuleHandleA@4  0041f170     kernel32:KERNEL32.dll\r
+ 0004:00000174       __imp__GetModuleFileNameA@12 0041f174     kernel32:KERNEL32.dll\r
+ 0004:00000178       __imp__GetEnvironmentVariableA@12 0041f178     kernel32:KERNEL32.dll\r
+ 0004:0000017c       __imp__GetVersionExA@4     0041f17c     kernel32:KERNEL32.dll\r
+ 0004:00000180       __imp__HeapDestroy@4       0041f180     kernel32:KERNEL32.dll\r
+ 0004:00000184       __imp__HeapCreate@12       0041f184     kernel32:KERNEL32.dll\r
+ 0004:00000188       __imp__VirtualFree@12      0041f188     kernel32:KERNEL32.dll\r
+ 0004:0000018c       __imp__VirtualAlloc@16     0041f18c     kernel32:KERNEL32.dll\r
+ 0004:00000190       __imp__HeapReAlloc@16      0041f190     kernel32:KERNEL32.dll\r
+ 0004:00000194       __imp__HeapAlloc@12        0041f194     kernel32:KERNEL32.dll\r
+ 0004:00000198       __imp__RtlUnwind@16        0041f198     kernel32:KERNEL32.dll\r
+ 0004:0000019c       __imp__UnhandledExceptionFilter@4 0041f19c     kernel32:KERNEL32.dll\r
+ 0004:000001a0       __imp__FreeEnvironmentStringsA@4 0041f1a0     kernel32:KERNEL32.dll\r
+ 0004:000001a4       __imp__FreeEnvironmentStringsW@4 0041f1a4     kernel32:KERNEL32.dll\r
+ 0004:000001a8       __imp__WideCharToMultiByte@32 0041f1a8     kernel32:KERNEL32.dll\r
+ 0004:000001ac       __imp__GetEnvironmentStrings@0 0041f1ac     kernel32:KERNEL32.dll\r
+ 0004:000001b0       __imp__GetEnvironmentStringsW@0 0041f1b0     kernel32:KERNEL32.dll\r
+ 0004:000001b4       __imp__SetStdHandle@8      0041f1b4     kernel32:KERNEL32.dll\r
+ 0004:000001b8       __imp__FlushFileBuffers@4  0041f1b8     kernel32:KERNEL32.dll\r
+ 0004:000001bc       __imp__ReadFile@20         0041f1bc     kernel32:KERNEL32.dll\r
+ 0004:000001c0       __imp__CreateFileA@28      0041f1c0     kernel32:KERNEL32.dll\r
+ 0004:000001c4       __imp__GetCPInfo@8         0041f1c4     kernel32:KERNEL32.dll\r
+ 0004:000001c8       __imp__GetACP@0            0041f1c8     kernel32:KERNEL32.dll\r
+ 0004:000001cc       __imp__GetOEMCP@0          0041f1cc     kernel32:KERNEL32.dll\r
+ 0004:000001d0       __imp__GetProcAddress@8    0041f1d0     kernel32:KERNEL32.dll\r
+ 0004:000001d4       __imp__LoadLibraryA@4      0041f1d4     kernel32:KERNEL32.dll\r
+ 0004:000001d8       __imp__SetEndOfFile@4      0041f1d8     kernel32:KERNEL32.dll\r
+ 0004:000001dc       __imp__MultiByteToWideChar@24 0041f1dc     kernel32:KERNEL32.dll\r
+ 0004:000001e0       __imp__LCMapStringA@24     0041f1e0     kernel32:KERNEL32.dll\r
+ 0004:000001e4       __imp__LCMapStringW@24     0041f1e4     kernel32:KERNEL32.dll\r
+ 0004:000001e8       __imp__GetStringTypeA@20   0041f1e8     kernel32:KERNEL32.dll\r
+ 0004:000001ec       __imp__GetStringTypeW@16   0041f1ec     kernel32:KERNEL32.dll\r
+ 0004:000001f0       \177KERNEL32_NULL_THUNK_DATA 0041f1f0     kernel32:KERNEL32.dll\r
+\r
+ entry point at        0001:0000acf3\r
+\r
similarity index 100%
rename from src/as-z80/aslex.c
rename to src/mkutil/as-z80/aslex.c
similarity index 100%
rename from src/as-z80/asout.c
rename to src/mkutil/as-z80/asout.c
similarity index 100%
rename from src/as-z80/assym.c
rename to src/mkutil/as-z80/assym.c
similarity index 93%
rename from src/as-z80/n.bat
rename to src/mkutil/as-z80/n.bat
index b8d45f5..95e3d73 100644 (file)
@@ -24,7 +24,7 @@ cl -Zi -I. -DWIN32 -c z80pst.c
 @if errorlevel 1 goto failure\r
 link @as-z80.lnk\r
 @if errorlevel 1 goto failure\r
-copy as-z80.exe ..\bin\r
+copy as-z80.exe ..\..\bin\r
 \r
 @echo SUCCESS\r
 @goto done\r
similarity index 100%
rename from src/as-z80/z80.h
rename to src/mkutil/as-z80/z80.h
diff --git a/src/mkutil/avra-0.8/COPYING b/src/mkutil/avra-0.8/COPYING
new file mode 100644 (file)
index 0000000..1942c43
--- /dev/null
@@ -0,0 +1,341 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          59 Temple Place - Suite 330
+                          Boston, MA 02111-1307, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; see the file COPYING.  If not, write to
+    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/src/mkutil/avra-0.8/ChangeLog b/src/mkutil/avra-0.8/ChangeLog
new file mode 100644 (file)
index 0000000..f974ea4
--- /dev/null
@@ -0,0 +1,47 @@
+Release 0.8   released by Tobias Weber\r
+ (20030307)\r
+               - Added new macro assembler coding facilities\r
+               - Added error description for .include directives\r
+Release 0.7
+ (20000217) - Added supported() function to check in a .if if a instruction is
+              supported (From Lesha Bogdanow <boga@inbox.ru>).
+            - Added checking of which mnemonic that work on the different AVRs
+              (From Lesha Bogdanow <boga@inbox.ru>).
+            - Added constants __DEVICE__, __FLASH_SIZE__, __RAM_SIZE__ and
+              __EEPROM_SIZE__ (From Lesha Bogdanow <boga@inbox.ru>).
+            - Added tiny devices (From Lesha Bogdanow <boga@inbox.ru>).
+ (20000403) - Changed error on constant out of range into a warning.
+ (20010918) - Added support for instructions: (E)LPM Rd,Z(+), SPM, ESPM, BREAK,
+              MOVW, MULS, MULSU, FMUL, FMULS, FMULSU
+            - Added support for new devices: ATmega8, ATmega16, ATmega32,
+              ATmega128, ATmega162, ATmega163, ATmega323, AT94K
+            - Added --devices switch to list all supported devices.
+ (20010919) - Fixed bug in map file name when the name had more than one . (dot)
+ (20010920) - Added option --includedirs to add additional include dirs in
+              search path.
+ (20010925) - Added support for creation of intel hex 32 files to be able to
+              address memory above 64KB. Uses 02 records for addresses up to 1MB
+              and 04 record for addresses above 1MB.
+
+Release 0.6
+ (20000124) - Added COFF support from Bob Harris <rth@McLean.Sparta.Com>
+
+Release 0.5
+ (19990331) - Bugfix: a inline string copy did not terminate string.
+ (19990409) - Fixed bug causing --define symbol=value not to work.
+ (19990418) - Added output of memory usage.
+ (19990518) - Fixed bug when there was a { in a comment.
+ (19990715) - Fixed count for data segment.
+ (19990720) - Fix to make a forward referenced label in .db/.dw work.
+ (19990922) - Added ATmega161 and ATtiny15 in list.
+            - rjmp and rcall now wraps around with 4k word devices.
+ (19991220) - Fixed bug when branching backwards with BRBS or BRBC
+Release 0.4
+ (19990202) - Added support for global keyword to use on labels in macros.
+            - Fixed get_next_token to handle commas inside ' '
+ (19990204) - Fixed bug when searching for correct macro_call, so recursive
+              and nested macros will work.
+            - Now handles commas in strings.
+            - Added fix to handle semi colon in a string.
+ (19990205) - Improved mnemonic parsing for ld and st
diff --git a/src/mkutil/avra-0.8/README b/src/mkutil/avra-0.8/README
new file mode 100644 (file)
index 0000000..f520f32
--- /dev/null
@@ -0,0 +1,274 @@
+\r
+    Avra - Assember for the Atmel AVR microcontroller series\r
+    Copyright (C) 1998-2003 Jon Anders Haugum, Tobias Weber\r
+\r
+    This program is free software; you can redistribute it and/or modify\r
+    it under the terms of the GNU General Public License as published by\r
+    the Free Software Foundation; either version 2 of the License, or\r
+    (at your option) any later version.\r
+\r
+    This program is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+    GNU General Public License for more details.\r
+\r
+    You should have received a copy of the GNU General Public License\r
+    along with this program; see the file COPYING.  If not, write to\r
+    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
+    Boston, MA 02111-1307, USA.\r
+\r
+\r
+    Authors of avra can be reached at:\r
+       email: jonah@omegav.ntnu.no, tobiw@suprafluid.com\r
+       www: http://www.omegav.ntnu.no/~jonah/el/avra.html\r
+\r
+\r
+----------------------------------------------------------------------\r
+\r
+1. Introduction\r
+\r
+avra is an assembler for the Atmel AVR microcontrollers, and it is\r
+almost compatible with Atmel's own assembler AVRASM32. The difference\r
+is that avra supports some extra preprocessor directives, and the macro-\r
+support is better.\r
+\r
+Since avra is written in ANSI C it should be possible to compile on\r
+most systems.\r
+\r
+I would also like to thank the following people for giving\r
+contributions and bug reports:\r
+\r
+   Bernt Hembre\r
+   Nils Strøm\r
+   Roberto Biancardi\r
+   Qwerty Jones\r
+   Ben Hitchcock (Maker of the mac port)\r
+   Daniel Drotos\r
+   Laurence Boyd II\r
+   Varuzhan Danielyan\r
+   Laurence Turner\r
+   Eugene R. O'Bryan\r
+   Dmitry Dicky\r
+   Bob Harris (Maker of coff support)\r
+   Tobias Weber (enhanced macro support)\r
+\r
+----------------------------------------------------------------------\r
+\r
+2. Installation\r
+\r
+To install avra you should copy the avra-executeable to a apropriate location.\r
+\r
+To compile you should rename the apropritate makefile, and do a make (use smake\r
+for Amiga SAS/C, and nmake for Mickeysoft visual c++).\r
+\r
+\r
+2.1 Linux\r
+\r
+First you should compile the source by typing make.\r
+\r
+avra should be copied to /usr/local/bin/ or other apropriate directory.\r
+\r
+Doing a 'make install' will do the same thing.\r
+\r
+\r
+2.2 AmigaOS\r
+\r
+avra should be copied to c: or other apropriate directory.\r
+\r
+If you are using the source-distribution a 'make install' will do the same.\r
+\r
+\r
+2.3 win32 (Windows 95 (++) and Windows NT)\r
+\r
+avra.exe should be copied to an apropriate location.  A 'nmake install' will\r
+copy it and avra.def to c:\bin\\r
+\r
+2.4 Dev-C++ enviroment\r
+\r
+Dev-C++ is a GNU development enviroment available for the most common platforms.\r
+A project file created with Dev-C++ 4.9.6.0 has added to the package.\r
+Just open the project file and 'compile' with Ctrl-F9. This nice software\r
+you can get at http://www.bloodshed.net/\r
+\r
+\r
+----------------------------------------------------------------------\r
+\r
+\r
+3. Compatibility\r
+\r
+This Version of AVRA should work as replacement of the build in assembler of\r
+Atmel AVR Studio(c). Just replace the AVRASM32.EXE in your AVRStudio\r
+directories. This Version has been tested with AVRStudio V4.06 and V3.55\r
+it worked 'almost' bugfree.\r
+\r
+\r
+----------------------------------------------------------------------\r
+\r
+4. Adding support for other systems\r
+\r
+avra is written mostly in ANSI-C, so it should be possible to port it\r
+to other 32-bit systems.\r
+\r
+\r
+----------------------------------------------------------------------\r
+\r
+5. New Macro possibilities\r
+\r
+As a person who never liked reading through lots of manual pages, I keep it\r
+short and start with some simple examples. Sometimes you work with 16 Bit\r
+or greater variables stored in registers. The new macro support allows you to\r
+write short and flexible macro code. The extended mode is active, as soon\r
+as you use brackets like this [ ] to wrap macro parameters.\r
+\r
+5.1 Examples\r
+\r
+To simplify the parameters in the demonstration below, we need to redefine\r
+some registers.\r
+\r
+.def   a = r16 ;general purpose registers\r
+.def   b = r17\r
+.def   c = r18\r
+.def   d = r19\r
+\r
+.def  w = r20 ;working register\r
+\r
+If we substract 16 Bit values stored in a, higher byte and b, lower byte with\r
+that in c:d, we usually have to use the following command sequence:\r
+\r
+       sub     b,d\r
+       sbc     a,c\r
+\r
+Now we can do the following steps to simplify 16 or more Bit manipulations\r
+\r
+.macro subs\r
+.message       "no parameters"\r
+.endm\r
+\r
+.macro subs_16_16\r
+       sub     @1,@3\r
+       sbc     @0,@2\r
+.endm\r
+\r
+.macro subs_16_8\r
+       sub     @1,@2\r
+       sbci    @0,0\r
+.endm\r
+\r
+       ;hence, we can write a 16 Bit subraction as:\r
+\r
+       subs    [a:b,c:d]\r
+\r
+       ;or for doing 16 minus 8 Bit\r
+\r
+       subs    [a:b,c]\r
+\r
+\r
+5.2 more examples:\r
+\r
+.macro load\r
+.message       "no parameters"\r
+.endm\r
+\r
+.macro load_16_i\r
+       ldi     @0,high(@2)\r
+       ldi     @1,low(@2)\r
+.endm\r
+\r
+.macro load_32_i\r
+       ldi     @0,BYTE4(@4)\r
+       ldi     @1,BYTE3(@4)\r
+       ldi     @2,high(@4)\r
+       ldi     @3,low(@4)\r
+.endm\r
+\r
+\r
+       load    [a:b,15] ;uses macro load_16_i to load immediate\r
+\r
+       load    [a:b:c:d,15] ;uses macro load_32_i to load immediate\r
+\r
+5.3 Datatypes\r
+\r
+There are 3 Datatypes which can be used. They will be added as character\r
+separated by one underline character.\r
+\r
+       immediate values  _i\r
+       registers         _8,_16,_24,_32,_40,_48,_56,_64\r
+       void parameter    _v\r
+\r
+\r
+5.4 even more expamples:\r
+\r
+.dseg\r
+counter                .byte 2\r
+.cseg\r
+\r
+.macro poke\r
+.message       "no parameters"\r
+.endm\r
+\r
+.macro poke_i_16_i\r
+       ldi     @1,high(@3)\r
+       sts     @0+0,@1\r
+       ldi     @2,low(@3)\r
+       sts     @0+1,@2\r
+.endm\r
+\r
+.macro poke_i_i\r
+       ldi     w,@1\r
+       sts     @0+0,w\r
+.endm\r
+\r
+.macro poke_i_v_i\r
+       ldi     w,high(@3)\r
+       sts     @0+0,w\r
+       ldi     w,low(@3)\r
+       sts     @0+1,w\r
+.endm\r
+\r
+.macro poke_i_v_v_v_i\r
+       ldi     w,high(@3)\r
+       sts     @0+0,w\r
+       ldi     w,low(@3)\r
+       sts     @0+1,w\r
+       ldi     w,BYTE3(@3)\r
+       sts     @0+2,w\r
+       ldi     w,BYTE4(@3)\r
+       sts     @0+3,w\r
+.endm\r
+\r
+\r
+       ;this writes '9999' into the memory at 'counter'\r
+       ;uses only the working register for transfering the values.\r
+\r
+       poke            [counter,w:w,9999]\r
+\r
+       ;works same as above, but the transferred value '9999' is also\r
+       ;kept in the pair of register a:b\r
+\r
+       poke            [counter,a:b,9999]\r
+\r
+       ;in my design 'w' is always working reg. which implies that\r
+       ;it cannot be used for normal variables. The following example uses poke_i_i\r
+       ;because the parameter contains two immediate values.\r
+\r
+       poke            [counter,9999] ;uses poke_i_i\r
+\r
+       ;to be able to choose between a 8,16 or 32 Bit operation, you just\r
+       ;add a void parameter.\r
+\r
+       poke            [counter,,9999] ;uses poke_i_v_i\r
+\r
+       ;and the same for 32 Bit pokes\r
+\r
+       poke            [counter,,,,9999] ;uses poke_i_v_v_v_i\r
+\r
+What I was trying to do with this new macro speech, was to create a platform\r
+indipendent assembling language. Sometimes, but only sometimes, it would\r
+be nice be able to port the code to Microchip PIC family more or less directly.\r
+\r
+----------------------------------------------------------------------\r
+6.0 Links\r
+\r
+http://www.avrfreaks.com/\r
+\r
+\r
diff --git a/src/mkutil/avra-0.8/SOURCE/Makefile.amiga.gcc b/src/mkutil/avra-0.8/SOURCE/Makefile.amiga.gcc
new file mode 100644 (file)
index 0000000..a8752cf
--- /dev/null
@@ -0,0 +1,80 @@
+#********************************************************************
+# Makefile for gcc (Geek Gadget) on Amiga
+#********************************************************************
+
+CC = gcc
+LD = gcc
+CFLAGS = -Wall -O3
+LDFLAGS = -s
+
+SOURCES = avra.c device.c parser.c expr.c mnemonic.c directiv.c macro.c file.c map.c coff.c
+
+OBJECTS = $(SOURCES:.c=.o)
+
+OBJ_ALL = $(OBJECTS) args.o stdextra.o
+
+DISTFILES = *.c *.h README ChangeLog Makefile.* COPYING avra.1 avra.txt strip-headers TODO
+
+ARCHFILES = $(DISTFILES)
+
+BINFILES = avra README ChangeLog COPYING avra.1 avra.txt
+
+VERSION = 0.7
+
+#********************************************************************
+
+all: avra
+
+install: avra
+       copy avra c:
+
+clean:
+       rm -f avra *.o *.p *~
+
+avra: $(OBJ_ALL)
+       $(LD) -o avra $(OBJ_ALL) $(LDFLAGS)
+
+args.o: args.c misc.h args.h
+avra.o: avra.c misc.h args.h avra.h device.h
+device.o: device.c misc.h avra.h device.h
+directiv.o: directiv.c misc.h args.h avra.h device.h
+expr.o: expr.c misc.h avra.h
+file.o: file.c misc.h avra.h
+macro.o: macro.c misc.h args.h avra.h
+mnemonic.o: mnemonic.c misc.h avra.h device.h
+parser.o: parser.c misc.h avra.h
+stdextra.o: stdextra.c misc.h
+coff.o: coff.c coff.h
+
+avra.txt: avra.1
+       groff -man -Tascii avra.1 | ./strip-headers | col -bx > avra.txt
+
+#********************************************************************
+
+disk: archive
+       copy avra.tar.gz pc0:avra.tgz
+
+archive: avra.tar.gz
+
+avra.tar.gz: $(ARCHFILES)
+       tar cvf avra.tar $(ARCHFILES)
+       gzip -9 -f avra.tar
+
+dist: avra-$(VERSION).tar.gz
+
+avra-$(VERSION).tar.gz: $(DISTFILES)
+       mkdir avra-$(VERSION)
+       cp $(DISTFILES) avra-$(VERSION)/
+       tar cvf avra-$(VERSION).tar avra-$(VERSION)/*
+       gzip -9 -f avra-$(VERSION).tar
+       rm -r avra-$(VERSION)
+
+bin: avra-$(VERSION)-Amiga-ixemul.lha
+
+avra-$(VERSION)-Amiga-ixemul.lha: $(BINFILES)
+       mkdir avra-$(VERSION)
+       cp $(BINFILES) avra-$(VERSION)/
+       lha -xr u avra-$(VERSION)-Amiga-ixemul.lha avra-$(VERSION)/*
+       rm -r avra-$(VERSION)
+
+#********************************************************************
diff --git a/src/mkutil/avra-0.8/SOURCE/Makefile.amiga.sas b/src/mkutil/avra-0.8/SOURCE/Makefile.amiga.sas
new file mode 100644 (file)
index 0000000..1242ad3
--- /dev/null
@@ -0,0 +1,75 @@
+#********************************************************************
+# Makefile for SAS/C on Amiga
+#********************************************************************
+
+CC = sc
+LD = sc
+CFLAGS = NOVERSION OPTIMIZE STRINGMERGE
+LDFLAGS = NOVERSION
+
+SOURCES = avra.c device.c parser.c expr.c mnemonic.c directiv.c macro.c file.c map.c coff.c
+
+OBJECTS = avra.o device.o parser.o expr.o mnemonic.o directiv.o macro.o file.o map.o coff.o
+
+OBJ_ALL = $(OBJECTS) args.o stdextra.o
+
+DISTFILES = *.c *.h README ChangeLog Makefile.* COPYING avra.1 avra.txt strip-headers TODO
+
+ARCHFILES = $(DISTFILES)
+
+BINFILES = avra README ChangeLog COPYING avra.1 avra.txt
+
+VERSION = 0.7
+
+#********************************************************************
+
+all: avra
+
+install: avra
+       copy avra c:
+
+clean:
+       delete avra avra.info \#?.o \#?.lnk
+
+avra: $(OBJ_ALL)
+       $(LD) link $(OBJ_ALL) $(LDFLAGS)
+
+args.o: args.c misc.h args.h
+avra.o: avra.c misc.h args.h avra.h device.h
+device.o: device.c misc.h avra.h device.h
+directiv.o: directiv.c misc.h args.h avra.h device.h
+expr.o: expr.c misc.h avra.h
+file.o: file.c misc.h avra.h
+macro.o: macro.c misc.h args.h avra.h
+mnemonic.o: mnemonic.c misc.h avra.h device.h
+parser.o: parser.c misc.h avra.h
+stdextra.o: stdextra.c misc.h
+coff.o: coff.c coff.h
+
+#********************************************************************
+
+disk: archive
+       copy avra.tar.gz pc0:avra.tgz
+
+archive: avra.lha
+
+avra.lha: $(ARCHFILES)
+       lha -xr u avra.lha $(ARCHFILES)
+
+dist: avra-$(VERSION).lha
+
+avra-$(VERSION).lha: $(DISTFILES)
+       makedir avra-$(VERSION)
+       copy $(DISTFILES) TO avra-$(VERSION)/
+       lha -xr u avra-$(VERSION).lha avra-$(VERSION)/*
+       delete ALL avra-$(VERSION)
+
+bin: avra-$(VERSION)-Amiga.lha
+
+avra-$(VERSION)-Amiga.lha: $(BINFILES)
+       makedir avra-$(VERSION)
+       copy $(BINFILES) avra-$(VERSION)/
+       lha -xr u avra-$(VERSION)-Amiga.lha avra-$(VERSION)/*
+       delete ALL avra-$(VERSION)
+
+#********************************************************************
diff --git a/src/mkutil/avra-0.8/SOURCE/Makefile.emx b/src/mkutil/avra-0.8/SOURCE/Makefile.emx
new file mode 100644 (file)
index 0000000..fac7433
--- /dev/null
@@ -0,0 +1,69 @@
+#********************************************************************
+# Makefile for gcc/emx
+#********************************************************************
+
+CC = gcc
+LD = gcc
+CFLAGS = -Wall -O3
+LDFLAGS = -s
+
+SOURCES = avra.c device.c parser.c expr.c mnemonic.c directiv.c macro.c file.c map.c coff.c
+
+OBJECTS = $(SOURCES:.c=.o)
+
+OBJ_ALL = $(OBJECTS) args.o stdextra.o
+
+DISTFILES = *.c *.h README ChangeLog Makefile.* COPYING avra.1 avra.txt strip-headers TODO
+
+ARCHFILES = $(DISTFILES)
+
+BINFILES = avra README ChangeLog COPYING avra.1 avra.txt
+
+VERSION = 0.7
+
+#********************************************************************
+
+all: avra.exe
+
+clean:
+       rm -f avra.exe *.o *.p *~
+
+avra.exe: $(OBJ_ALL)
+       $(LD) -o avra.exe $(OBJ_ALL) $(LDFLAGS)
+
+args.o: args.c misc.h args.h
+avra.o: avra.c misc.h args.h avra.h device.h
+device.o: device.c misc.h avra.h device.h
+directiv.o: directiv.c misc.h args.h avra.h device.h
+expr.o: expr.c misc.h avra.h
+file.o: file.c misc.h avra.h
+macro.o: macro.c misc.h args.h avra.h
+mnemonic.o: mnemonic.c misc.h avra.h device.h
+parser.o: parser.c misc.h avra.h
+stdextra.o: stdextra.c misc.h
+coff.o: coff.c coff.h
+
+avra.txt: avra.1
+       groff -man -Tascii avra.1 | ./strip-headers | col -bx > avra.txt
+
+#********************************************************************
+
+disk: archive
+       mcopy -ovm avra.tar.gz a:avra.tgz
+
+archive: avra.tar.gz
+
+avra.tar.gz: $(ARCHFILES)
+       tar cvf avra.tar $(ARCHFILES)
+       gzip -9 -f avra.tar
+
+dist: avra-$(VERSION).tar.gz
+
+avra-$(VERSION).tar.gz: $(DISTFILES)
+       mkdir avra-$(VERSION)
+       cp $(DISTFILES) avra-$(VERSION)/
+       tar cvf avra-$(VERSION).tar avra-$(VERSION)/*
+       gzip -9 -f avra-$(VERSION).tar
+       rm -r avra-$(VERSION)
+
+#********************************************************************
diff --git a/src/mkutil/avra-0.8/SOURCE/Makefile.linux b/src/mkutil/avra-0.8/SOURCE/Makefile.linux
new file mode 100644 (file)
index 0000000..5a3e617
--- /dev/null
@@ -0,0 +1,74 @@
+#********************************************************************
+# Makefile for gcc
+#********************************************************************
+
+CC = gcc
+LD = gcc
+CFLAGS = -Wall -O3
+LDFLAGS = -s
+
+SOURCES = avra.c device.c parser.c expr.c mnemonic.c directiv.c macro.c file.c map.c coff.c
+
+OBJECTS = $(SOURCES:.c=.o)
+
+OBJ_ALL = $(OBJECTS) args.o stdextra.o
+
+DISTFILES = *.c *.h README ChangeLog Makefile.* COPYING avra.1 avra.txt strip-headers TODO
+
+ARCHFILES = $(DISTFILES)
+
+BINFILES = avra README ChangeLog COPYING avra.1 avra.txt
+
+VERSION = 0.7
+
+#********************************************************************
+
+all: avra
+
+install: avra
+       cp avra /usr/local/bin
+       cp avra.1 /usr/local/man/man1
+       chmod +r /usr/local/man/man1/avra.1
+
+clean:
+       rm -f avra *.o *.p *~
+
+avra: $(OBJ_ALL)
+       $(LD) -o avra $(OBJ_ALL) $(LDFLAGS)
+
+args.o: args.c misc.h args.h
+avra.o: avra.c misc.h args.h avra.h device.h
+device.o: device.c misc.h avra.h device.h
+directiv.o: directiv.c misc.h args.h avra.h device.h
+expr.o: expr.c misc.h avra.h
+file.o: file.c misc.h avra.h
+macro.o: macro.c misc.h args.h avra.h
+mnemonic.o: mnemonic.c misc.h avra.h device.h
+parser.o: parser.c misc.h avra.h
+stdextra.o: stdextra.c misc.h
+coff.o: coff.c coff.h
+
+avra.txt: avra.1
+       groff -man -Tascii avra.1 | ./strip-headers | col -bx > avra.txt
+
+#********************************************************************
+
+disk: archive
+       mcopy -ovm avra.tar.gz a:avra.tgz
+
+archive: avra.tar.gz
+
+avra.tar.gz: $(ARCHFILES)
+       tar cvf avra.tar $(ARCHFILES)
+       gzip -9 -f avra.tar
+
+dist: avra-$(VERSION).tar.gz
+
+avra-$(VERSION).tar.gz: $(DISTFILES)
+       mkdir avra-$(VERSION)
+       cp $(DISTFILES) avra-$(VERSION)/
+       tar cvf avra-$(VERSION).tar avra-$(VERSION)/*
+       gzip -9 -f avra-$(VERSION).tar
+       rm -r avra-$(VERSION)
+
+#********************************************************************
diff --git a/src/mkutil/avra-0.8/SOURCE/Makefile.win b/src/mkutil/avra-0.8/SOURCE/Makefile.win
new file mode 100644 (file)
index 0000000..e801c03
--- /dev/null
@@ -0,0 +1,58 @@
+# Project: Console App\r
+# Makefile created by Dev-C++ 4.9.6.0\r
+\r
+CC   = gcc.exe\r
+WINDRES = windres.exe\r
+RES  = \r
+OBJ  = avra.o args.o stdextra.o device.o directiv.o expr.o file.o map.o mnemonic.o parser.o coff.o macro.o $(RES)\r
+LIBS =  -L"D:/system/Dev-Cpp/lib" \r
+INCS =  -I"D:/system/Dev-Cpp/include" \r
+BIN  = avra.exe\r
+CFLAGS = $(INCS)  -pg -g3\r
+\r
+.PHONY: all all-before all-after clean clean-custom\r
+\r
+all: all-before avra.exe all-after\r
+\r
+\r
+clean: clean-custom\r
+       rm -f $(OBJ) $(BIN)\r
+\r
+$(BIN): $(OBJ)\r
+       $(CC) $(OBJ) -o "avra.exe" $(LIBS) $(CFLAGS)\r
+\r
+avra.o: avra.c\r
+       $(CC) -c avra.c -o avra.o $(CFLAGS)\r
+\r
+args.o: args.c\r
+       $(CC) -c args.c -o args.o $(CFLAGS)\r
+\r
+stdextra.o: stdextra.c\r
+       $(CC) -c stdextra.c -o stdextra.o $(CFLAGS)\r
+\r
+device.o: device.c\r
+       $(CC) -c device.c -o device.o $(CFLAGS)\r
+\r
+directiv.o: directiv.c\r
+       $(CC) -c directiv.c -o directiv.o $(CFLAGS)\r
+\r
+expr.o: expr.c\r
+       $(CC) -c expr.c -o expr.o $(CFLAGS)\r
+\r
+file.o: file.c\r
+       $(CC) -c file.c -o file.o $(CFLAGS)\r
+\r
+map.o: map.c\r
+       $(CC) -c map.c -o map.o $(CFLAGS)\r
+\r
+mnemonic.o: mnemonic.c\r
+       $(CC) -c mnemonic.c -o mnemonic.o $(CFLAGS)\r
+\r
+parser.o: parser.c\r
+       $(CC) -c parser.c -o parser.o $(CFLAGS)\r
+\r
+coff.o: coff.c\r
+       $(CC) -c coff.c -o coff.o $(CFLAGS)\r
+\r
+macro.o: macro.c\r
+       $(CC) -c macro.c -o macro.o $(CFLAGS)\r
diff --git a/src/mkutil/avra-0.8/SOURCE/Makefile.win32.mvc b/src/mkutil/avra-0.8/SOURCE/Makefile.win32.mvc
new file mode 100644 (file)
index 0000000..1f1600f
--- /dev/null
@@ -0,0 +1,47 @@
+#********************************************************************\r
+# Makefile for Mickeysoft visual c++\r
+#********************************************************************\r
+\r
+CC = cl -Zi\r
+LD = link "/libpath:c:\Program Files\Microsoft Visual Studio\VC98\Lib"\r
+CFLAGS = -nologo -Ox\r
+LDFLAGS = -nologo\r
+\r
+SOURCES = avra.c device.c parser.c expr.c mnemonic.c directiv.c macro.c file.c map.c coff.c\r
+\r
+OBJECTS = $(SOURCES:.c=.obj)\r
+\r
+OBJ_ALL = $(OBJECTS) args.obj stdextra.obj\r
+\r
+#********************************************************************\r
+\r
+all: avra.exe\r
+\r
+install: avra.exe\r
+       copy avra.exe ..\..\..\bin\\r
+\r
+clean:\r
+       del *.obj\r
+       del avra.exe\r
+\r
+avra.exe: $(OBJ_ALL)\r
+       $(LD) $(OBJ_ALL) $(LDFLAGS)\r
+\r
+args.obj: args.c misc.h args.h\r
+avra.obj: avra.c misc.h args.h avra.h device.h\r
+device.obj: device.c misc.h avra.h device.h\r
+directiv.obj: directiv.c misc.h args.h avra.h device.h\r
+expr.obj: expr.c misc.h avra.h\r
+file.obj: file.c misc.h avra.h\r
+macro.obj: macro.c misc.h args.h avra.h\r
+mnemonic.obj: mnemonic.c misc.h avra.h device.h\r
+parser.obj: parser.c misc.h avra.h\r
+stdextra.obj: stdextra.c misc.h\r
+coff.obj: coff.c coff.h\r
+\r
+#********************************************************************\r
+\r
+\r
+#********************************************************************\r
+\r
+\r
diff --git a/src/mkutil/avra-0.8/SOURCE/args.c b/src/mkutil/avra-0.8/SOURCE/args.c
new file mode 100644 (file)
index 0000000..e8004d2
--- /dev/null
@@ -0,0 +1,240 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "misc.h"
+#include "args.h"
+
+
+struct args *alloc_args(int arg_count)
+       {
+       struct args *args;
+
+       args = malloc(sizeof(struct args));
+       if(args)
+               {
+               args->arg = malloc(sizeof(struct arg) * arg_count);
+               if(args->arg)
+                       {
+                       args->count = arg_count;
+                       args->first_data = NULL;
+                       return(args);
+                       }
+               free(args);
+               }
+       printf("Error: Unable to allocate memory\n");
+       return(NULL);
+       }
+
+
+
+int read_args(struct args *args, int argc, char *argv[])
+       {
+       int i, j, k, ok = True, i_old;
+       struct data_list **last_data;
+
+       args->first_data = NULL;
+       last_data = &args->first_data;
+       for(i = 1; (i < argc) && ok; i++)
+               {
+
+               
+        if(argv[i][0] == '-')
+                       {
+                       last_data = &args->first_data;
+                       if(argv[i][1] == '-')
+                               {
+                               j = 0;
+                               while((args->arg[j].longarg ? strcmp(&argv[i][2], args->arg[j].longarg) : True) && (j != args->count))
+                                       j++;
+                               if(j == args->count)
+                                       {
+                                       printf("Error: Unknown option: %s\n", argv[i] );
+                                       ok = False;
+                                       }
+                               else
+                                       {
+                                       switch(args->arg[j].type)
+                                               {
+                                               case ARGTYPE_STRING:
+                                               case ARGTYPE_STRING_MULTISINGLE:
+                                                       if((i + 1) == argc)
+                                                               {
+                                                               printf("Error: No argument supplied with option: %s\n", argv[i]);
+                                                               ok = False;
+                                                               }
+                                                       else if(args->arg[j].type != ARGTYPE_STRING_MULTISINGLE)
+                                                               args->arg[j].data = argv[++i];
+                                                       else
+                                                               ok = add_arg((struct data_list **)&args->arg[j].data, argv[++i]);
+                                                       break;
+                                               case ARGTYPE_BOOLEAN:
+                                                       args->arg[j].data = (char *)True;
+                                                       break;
+                                               case ARGTYPE_STRING_MULTI:
+                                                       last_data = (struct data_list **)&args->arg[j].data;
+                                                       break;
+                            //added by TW
+                                               //case ARGTYPE_CHAR_ATTACHED:
+                                               //      args->arg[j].data = argv[i];
+                                                       //break;
+                                               }
+                                       }
+                               }
+                       else
+                               {
+                               // ToDo: Sjekk for enkel -
+                               for(k = 1, i_old = i; (argv[i][k] != '\0') && ok && (i == i_old); k++)
+                               {
+                                       j = 0;
+                                       while((argv[i][k] != args->arg[j].letter) && (j != args->count))
+                                               j++;
+                                       if(j == args->count)
+                                               {
+                                               printf("Error: Unknown option: -%c\n", argv[i][k]);
+                                               ok = False;
+                                               }
+                                       else
+                                               {
+                                               switch(args->arg[j].type)
+                                                       {
+                                                       case ARGTYPE_STRING:
+                                                       case ARGTYPE_STRING_MULTISINGLE:
+                                                               if(argv[i][k + 1] != '\0')
+                                                                       {
+                                                                       printf("Error: Option -%c must be followed by it's argument\n", argv[i][k]);
+                                                                       ok = False;
+                                                                       }
+                                                               else
+                                                                       {
+                                                                       if((i + 1) == argc)
+                                                                               {
+                                                                               printf("Error: No argument supplied with option: -%c\n", argv[i][k]);
+                                                                               ok = False;
+                                                                               }
+                                                                       else if(args->arg[j].type != ARGTYPE_STRING_MULTISINGLE)
+                                                                               args->arg[j].data = argv[++i];
+                                                                       else
+                                                                               ok = add_arg((struct data_list **)&args->arg[j].data, argv[++i]);
+                                                                       }
+                                                               break;
+                                                       case ARGTYPE_BOOLEAN:
+                                                               args->arg[j].data = (char *)True;
+                                                               break;
+                                                       case ARGTYPE_STRING_MULTI:
+                                                               last_data = (struct data_list **)&args->arg[j].data;
+                                                               break;
+                            //added by TW
+                                       case ARGTYPE_CHAR_ATTACHED:
+                                      if((i + 1) == argc)
+                                      {
+                                        printf("Error: missing arguments: asm file");
+                                        ok = False;
+                                      }
+                                      else
+                                      {
+                                        switch(argv[i][++k])
+                                        {
+                                          case 'O': args->arg[j].data = (char *)AVRSTUDIO;
+                                          break;
+                                          case 'G': args->arg[j].data = (char *)GENERIC;
+                                          break;
+                                          case 'I': args->arg[j].data = (char *)INTEL;
+                                          break;
+                                          case 'M': args->arg[j].data = (char *)MOTOROLA;
+                                          break;
+                                          default: printf("Error: wrong file type '%c'",argv[i][2]);
+                                          ok = False;
+                                        }
+                                      }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               else
+                       ok = add_arg(last_data, argv[i]);
+               }
+       return(ok);
+       }
+
+
+int add_arg(struct data_list **last_data, char *argv)
+       {
+       struct data_list *data;
+
+       while(*last_data) last_data = &((*last_data)->next);
+       data = malloc(sizeof(struct data_list));
+       if(data)
+               {
+               data->next = NULL;
+               data->data = argv;
+               *last_data = data;
+               last_data = &data->next;
+               }
+       else
+               {
+               printf("Error: Unable to allocate memory\n");
+               return(False);
+               }
+       return(True);
+       }
+
+
+void free_args(struct args *args)
+       {
+       int i;
+       struct data_list *data, *temp;
+
+       for(data = args->first_data; data;)
+               {
+               temp = data;
+               data = data->next;
+               free(temp);
+               }
+       for(i = 0; i != args->count; i++)
+               if((args->arg[i].type == ARGTYPE_STRING_MULTI)
+                  || (args->arg[i].type == ARGTYPE_STRING_MULTISINGLE))
+                       for(data = args->arg[i].data; data;)
+                               {
+                               temp = data;
+                               data = data->next;
+                               free(temp);
+                               }
+       free(args);
+       }
+
+
+void define_arg(struct args *args, int index, int type, char letter, char *longarg, void *def_value)
+       {
+       args->arg[index].type = type;
+       args->arg[index].letter = letter;
+       args->arg[index].longarg = longarg;
+       args->arg[index].data = def_value;
+       }
diff --git a/src/mkutil/avra-0.8/SOURCE/args.h b/src/mkutil/avra-0.8/SOURCE/args.h
new file mode 100644 (file)
index 0000000..4bdc0c6
--- /dev/null
@@ -0,0 +1,65 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+enum
+       {
+       ARGTYPE_BOOLEAN = 0,       /* boolean Value (0 = False) */
+       ARGTYPE_STRING,            /* Stringpointer in Data     */
+       ARGTYPE_STRING_MULTI,      /* List of strings in Data   */
+       ARGTYPE_STRING_MULTISINGLE, /* List of strings in Data. requires an option for each elemtent */
+       //added by TW
+       ARGTYPE_CHAR_ATTACHED
+       };
+
+#define GET_ARG(args,argnum) (args->arg[argnum].data)
+#define SET_ARG(args,argnum,value) (args->arg[argnum].data = (void *)value)
+
+struct args
+       {
+       struct arg *arg;
+       int count;
+       struct data_list *first_data;
+       };
+
+struct arg
+       {
+       int type;
+       char letter;
+       char *longarg;
+       void *data;
+       };
+
+struct data_list
+       {
+       struct data_list *next;
+       void *data;
+       };
+
+struct args *alloc_args(int arg_count);
+int read_args(struct args *args, int argc, char *argv[]);
+int add_arg(struct data_list **last_data, char *argv);
+void free_args(struct args *args);
+void define_arg(struct args *args, int index, int type, char letter, char *longarg, void *def_value);
diff --git a/src/mkutil/avra-0.8/SOURCE/avra.c b/src/mkutil/avra-0.8/SOURCE/avra.c
new file mode 100644 (file)
index 0000000..408c436
--- /dev/null
@@ -0,0 +1,333 @@
+/***********************************************************************\r
+ *  avra - Assembler for the Atmel AVR microcontroller series\r
+ *  Copyright (C) 1998-2001 Jon Anders Haugum\r
+ *  Copyright (C) 2002-2003 Tobias Weber\r
+ *\r
+ *  This program is free software; you can redistribute it and/or modify\r
+ *  it under the terms of the GNU General Public License as published by\r
+ *  the Free Software Foundation; either version 2 of the License, or\r
+ *  (at your option) any later version.\r
+ *\r
+ *  This program is distributed in the hope that it will be useful,\r
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ *  GNU General Public License for more details.\r
+ *\r
+ *  You should have received a copy of the GNU General Public License\r
+ *  along with this program; see the file COPYING.  If not, write to\r
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
+ *  Boston, MA 02111-1307, USA.\r
+ *\r
+ *\r
+ *  Authors of avra can be reached at:\r
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com\r
+ *     www: http://sourceforge.net/projects/avra\r
+ */\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <stdarg.h>\r
+\r
+#include "misc.h"\r
+#include "args.h"\r
+#include "avra.h"\r
+#include "device.h"\r
+\r
+const char *title = "AVRA: advanced AVR macro assembler version %d.%d (%s)\n"\r
+                    "Copyright (C) 2002-2003 Tobias Weber\n"\r
+                    "Copyright (C) 1998-2001 Jon Anders Haugum\n"\r
+                    "\n"\r
+                    "   AVRA is a replacement for the ATMEL AVR-Assembler 'AVRASM32.EXE'\n"\r
+                    "\n"\r
+                                       "   The words ATMEL and AVR are registered to Atmel Corp.\n"\r
+                    "   AVRA comes with NO WARRANTY, to the extent permitted by law.\n"\r
+                    "   You may redistribute copies of avra under the terms\n"\r
+                    "   of the GNU General Public License.\n"\r
+                    "   For more information about these matters, see the files named COPYING.\n"\r
+                    "\n";\r
+\r
+const char *usage =\r
+       "usage: AVRA [--define <symbol>[=<value>]]  [--includedir <dir>] [--listmac]\n"\r
+       "            [--max_errors <number>] [--coff] [--devices] [--version]\n"\r
+       "            [-h] [--help] general help\n"\r
+       "            [-f][O|G|I|M] output file type\n"\r
+       "            <file to assemble>\n"\r
+       "\n"\r
+       "   --define, -D     : Define symbol.\n"\r
+       "   --includedir, -I : Additional include dirs.\n"\r
+       "   --listmac        : List macro expansion in listfile.\n"\r
+       "   --max_errors     : Maximum number of errors before exit (default: 10)\n"\r
+       "   --coff           : Produce COFF output file for debugging with Atmel AVR Studio.\n"\r
+       "   --devices        : List out supported devices.\n"\r
+       "   --version        : Version information.\n"\r
+       "   --help, -h       : This help text.\n"\r
+       "\n"\r
+       "Don't bother about the command line options. Some may not work properly in V0.8\n"\r
+       "Just replace the AVRASM32.EXE in your AVRStudio directories. This Version has "\r
+       "been tested with AVRStudio V4.06 and it was 'almost' bugfree ;-)\n"\r
+       "\n"\r
+       "Report bugs to tobiw@suprafluid.com\n"\r
+       "            or jonah@omegav.ntnu.no\n";\r
+\r
+\r
+int main(int argc, char *argv[])\r
+       {\r
+       int show_usage = False;\r
+       struct prog_info *pi;\r
+       struct args *args;\r
+\r
+       printf(title, VERSION, REVISION, DATESTRING);\r
+\r
+       args = alloc_args(ARG_COUNT);\r
+       if(args)\r
+               {\r
+               define_arg(args, ARG_DEFINE,     ARGTYPE_STRING_MULTISINGLE, 'D', "define",     NULL);\r
+               define_arg(args, ARG_INCLUDEDIR, ARGTYPE_STRING_MULTISINGLE, 'I', "includedir", NULL);\r
+               define_arg(args, ARG_LISTMAC,    ARGTYPE_BOOLEAN,              0, "listmac",    "1");\r
+               define_arg(args, ARG_MAX_ERRORS, ARGTYPE_STRING,               0, "max_errors", "10");\r
+               define_arg(args, ARG_COFF,       ARGTYPE_BOOLEAN,              0, "coff",       "1");\r
+               define_arg(args, ARG_DEVICES,    ARGTYPE_BOOLEAN,              0, "devices",    False);\r
+               define_arg(args, ARG_VER,        ARGTYPE_BOOLEAN,              0, "version",    False);\r
+               define_arg(args, ARG_HELP,       ARGTYPE_BOOLEAN,            'h', "help",       False);\r
+               //TW added\r
+               define_arg(args, ARG_WRAP,        ARGTYPE_BOOLEAN,            'w', "wrap",        False);\r
+               define_arg(args, ARG_FILEFORMAT,  ARGTYPE_CHAR_ATTACHED,      'f', "filetype",    "0");\r
+               define_arg(args, ARG_LISTFILE,    ARGTYPE_STRING,             'l', "listfile",    False);\r
+               define_arg(args, ARG_OUTFILE,     ARGTYPE_STRING,             'o', "outfile",     False);\r
+               define_arg(args, ARG_MAPFILE,     ARGTYPE_STRING,             'm', "mapfile",     False);\r
+               define_arg(args, ARG_DEBUGFILE,   ARGTYPE_STRING,             'd', "debugfile",   False);\r
+               define_arg(args, ARG_EEPFILE,     ARGTYPE_STRING,             'e', "eepfile",     False);\r
+\r
+               if(read_args(args, argc, argv))\r
+                       {\r
+                       if(!GET_ARG(args, ARG_HELP) && (argc != 1))\r
+                               {\r
+                               if(!GET_ARG(args, ARG_VER))\r
+                                       {\r
+                                       if(!GET_ARG(args, ARG_DEVICES))\r
+                                               {\r
+                                               pi = get_pi(args);\r
+                                               if(pi)\r
+                                                       {\r
+                                                       assemble(pi);\r
+                                                       free_pi(pi);\r
+                                                       }\r
+                                               }\r
+                                       else\r
+                                               list_devices();\r
+                                       }\r
+                               //else\r
+                               }\r
+                       else\r
+                               show_usage = True;\r
+                       }\r
+               free_args(args);\r
+               }\r
+       else\r
+               {\r
+               show_usage = True;\r
+               printf("\n");\r
+               }\r
+       if(show_usage)\r
+               {\r
+/*             if(argc == 1)\r
+                       {\r
+                       printf(title, VERSION, REVISION, DATESTRING);\r
+                       printf("\n");\r
+                       }*/\r
+               printf("%s", usage);\r
+               }\r
+       exit(EXIT_SUCCESS);\r
+       }\r
+\r
+\r
+void assemble(struct prog_info *pi)\r
+        {\r
+       if(pi->args->first_data)\r
+               {\r
+               printf("Pass 1... ");\r
+               if(!load_arg_defines(pi))\r
+                       return;\r
+               predef_dev(pi);\r
+               if(parse_file(pi, (char *)pi->args->first_data->data, PASS_1))\r
+                       {\r
+                       if(pi->error_count == 0)\r
+                               {\r
+                               prepare_second_pass(pi);\r
+                               if(!load_arg_defines(pi))\r
+                                       return;\r
+                               predef_dev(pi);\r
+                               if(open_out_files(pi, pi->args->first_data->data))\r
+                                       {\r
+                                       printf("done\nPass 2... ");\r
+                                       parse_file(pi, (char *)pi->args->first_data->data, PASS_2);\r
+                                       printf("done\n\n");\r
+\r
+                                       if(GET_ARG(pi->args, ARG_COFF) && (pi->error_count == 0))\r
+                                         write_coff_file(pi);\r
+                                       write_map_file(pi);\r
+                                       close_out_files(pi);\r
+                                       if(pi->error_count)\r
+                                               printf("\nAssembly aborted with %d errors and %d warnings.\n", pi->error_count, pi->warning_count);\r
+                                       else if(pi->warning_count)\r
+                                               printf("\nAssembly complete with no errors (%d warnings).\n", pi->warning_count);\r
+                                       else\r
+                                               printf("\nAssembly complete with no errors.\n");\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       else\r
+               printf("Error: You need to specify a file to assemble\n");\r
+       }\r
+\r
+\r
+int load_arg_defines(struct prog_info *pi)\r
+        {\r
+       int i;\r
+       char *expr, buff[256];\r
+       struct data_list *define;\r
+       struct label *label;\r
+\r
+       for(define = GET_ARG(pi->args, ARG_DEFINE); define; define = define->next)\r
+               {\r
+               strcpy(buff, define->data);\r
+               expr = get_next_token(buff, TERM_EQUAL);\r
+               if(expr)\r
+                       {\r
+                       if(!get_expr(pi, expr, &i))\r
+                               return(False);\r
+                       }\r
+               else\r
+                       i = 1;\r
+               for(label = pi->first_constant; label; label = label->next)\r
+                       if(!nocase_strcmp(label->name, buff))\r
+                               {\r
+                               printf("Error: Can't define symbol %s twice\n", buff);\r
+                               return(False);\r
+                               }\r
+               label = malloc(sizeof(struct label));\r
+               if(!label)\r
+                       {\r
+                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);\r
+                       return(False);\r
+                       }\r
+               label->next = NULL;\r
+               if(pi->last_constant)\r
+                       pi->last_constant->next = label;\r
+               else\r
+                       pi->first_constant = label;\r
+               pi->last_constant = label;\r
+               label->name = malloc(strlen(buff) + 1);\r
+               if(!label->name)\r
+                       {\r
+                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);\r
+                       return(False);\r
+                       }\r
+               strcpy(label->name, buff);\r
+               label->value = i;\r
+               }\r
+       return(True);\r
+       }\r
+\r
+\r
+struct prog_info *get_pi(struct args *args)\r
+       {\r
+       struct prog_info *pi;\r
+\r
+       pi = (struct prog_info *)calloc(1, sizeof(struct prog_info));\r
+       if(pi)\r
+               {\r
+               pi->args = args;\r
+               pi->device = get_device(pi,NULL);\r
+               pi->list_on = True;\r
+               pi->segment = SEGMENT_CODE;\r
+               pi->dseg_addr = DSEG_START;\r
+               pi->max_errors = atoi(GET_ARG(args, ARG_MAX_ERRORS));\r
+               return(pi);\r
+               }\r
+       return(NULL);\r
+       }\r
+\r
+\r
+void free_pi(struct prog_info *pi)\r
+       {\r
+       free(pi);\r
+       }\r
+\r
+\r
+void prepare_second_pass(struct prog_info *pi)\r
+       {\r
+       struct def *def, *temp_def;\r
+       struct label *label, *temp_label;\r
+\r
+       pi->segment = SEGMENT_CODE;\r
+       pi->cseg_addr = 0;\r
+       pi->dseg_addr = DSEG_START;\r
+       pi->eseg_addr = 0;\r
+\r
+       for(def = pi->first_def; def;)\r
+               {\r
+               temp_def = def;\r
+               def = def->next;\r
+               free(temp_def->name);\r
+               free(temp_def);\r
+               }\r
+       pi->first_def = NULL;   \r
+       pi->last_def = NULL;    \r
+\r
+       for(label = pi->first_constant; label;)\r
+               {\r
+               temp_label = label;\r
+               label = label->next;\r
+               free(temp_label->name);\r
+               free(temp_label);\r
+               }\r
+       pi->first_constant = NULL;\r
+       pi->last_constant = NULL;\r
+\r
+       for(label = pi->first_variable; label;)\r
+               {\r
+               temp_label = label;\r
+               label = label->next;\r
+               free(temp_label->name);\r
+               free(temp_label);\r
+               }\r
+       pi->first_variable = NULL;\r
+       pi->last_variable = NULL;\r
+       }\r
+\r
+\r
+void print_msg(struct prog_info *pi, int type, char *fmt, ... )\r
+       {\r
+       va_list args;\r
+\r
+       if(type == MSGTYPE_OUT_OF_MEM)\r
+               fprintf(stderr, "Error: Unable to allocate memory!\n");\r
+       else\r
+               {\r
+               va_start(args, fmt);\r
+               fprintf(stderr, "%s(%d) : ", pi->fi->include_file->name, pi->fi->line_number);\r
+\r
+               switch(type)\r
+                       {\r
+                       case MSGTYPE_ERROR:\r
+                               pi->error_count++;\r
+                               fprintf(stderr, "error : ");\r
+                               break;\r
+                       case MSGTYPE_WARNING:\r
+                               pi->warning_count++;\r
+                               fprintf(stderr, "warning : ");\r
+                               break;\r
+                       case MSGTYPE_MESSAGE:\r
+                               break;\r
+                       }\r
+\r
+               if(pi->macro_call)\r
+                       fprintf(stderr, "[Macro: %s: %d:] ", pi->macro_call->macro->include_file->name, pi->macro_call->line_index + pi->macro_call->macro->first_line_number);\r
+\r
+               vfprintf(stderr, fmt, args);\r
+               fprintf(stderr, "\n");\r
+               va_end(args);\r
+               }\r
+       }\r
diff --git a/src/mkutil/avra-0.8/SOURCE/avra.dev b/src/mkutil/avra-0.8/SOURCE/avra.dev
new file mode 100644 (file)
index 0000000..60911d1
--- /dev/null
@@ -0,0 +1,179 @@
+[Project]\r
+FileName=avra.dev\r
+Name=Console App\r
+UnitCount=15\r
+Type=1\r
+Ver=1\r
+ObjFiles=\r
+Includes=\r
+Libs=\r
+PrivateResource=\r
+ResourceIncludes=\r
+MakeIncludes=\r
+Resources=\r
+Compiler=\r
+Linker=\r
+IsCpp=0\r
+Icon=\r
+ExeOutput=\r
+ObjectOutput=\r
+OverrideOutput=0\r
+OverrideOutputName=AVRASM32.exe\r
+Folders=\r
+CommandLine=\r
+Focused=14\r
+Order=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\r
+\r
+[Unit1]\r
+FileName=avra.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Views]\r
+ProjectView=1\r
+\r
+[Unit2]\r
+FileName=args.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit3]\r
+FileName=stdextra.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit4]\r
+FileName=device.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit5]\r
+FileName=directiv.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit6]\r
+FileName=expr.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit7]\r
+FileName=file.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit9]\r
+FileName=mnemonic.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit10]\r
+FileName=parser.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit11]\r
+FileName=coff.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit12]\r
+FileName=macro.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit13]\r
+FileName=misc.h\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit8]\r
+FileName=map.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit14]\r
+FileName=args.h\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit15]\r
+FileName=avra.h\r
+Open=1\r
+Folder=\r
+Top=1\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
diff --git a/src/mkutil/avra-0.8/SOURCE/avra.exe b/src/mkutil/avra-0.8/SOURCE/avra.exe
new file mode 100644 (file)
index 0000000..5192df0
Binary files /dev/null and b/src/mkutil/avra-0.8/SOURCE/avra.exe differ
diff --git a/src/mkutil/avra-0.8/SOURCE/avra.h b/src/mkutil/avra-0.8/SOURCE/avra.h
new file mode 100644 (file)
index 0000000..464fc07
--- /dev/null
@@ -0,0 +1,295 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include <stdio.h>
+
+#define VERSION 0
+#define REVISION 8
+#define DATESTRING "31 January 2003"
+
+#define IS_HOR_SPACE(x) ((x == ' ') || (x == 9))
+#define IS_LABEL(x) (isalnum(x) || (x == '_'))
+#define IS_END(x) ((x == ';') || (x == 10) || (x == 13)|| (x == '\0'))
+#define IS_ENDLINE(x) ( (x == 10) || (x == 13)|| (x == '\0'))
+
+#define LINEBUFFER_LENGTH 256
+
+//added by TW
+#define MAX_MACRO_ARGS 10
+
+#define DSEG_START 0x60
+
+/* Option enumeration */
+enum
+       {
+       ARG_DEFINE = 0,       /* --define, -D            */
+       ARG_INCLUDEDIR,       /* --includedir, -I        */
+       ARG_LISTMAC,          /* --listmac               */
+       ARG_MAX_ERRORS,       /* --max_errors            */
+       ARG_COFF,             /* --coff                  */
+       ARG_DEVICES,          /* --devices               */
+       ARG_VER,              /* --version               */
+       ARG_HELP,             /* --help, -h              */
+       //added by TW
+       ARG_WRAP,             /* --wrap      */
+       ARG_FILEFORMAT,       /* --filetype              */
+       ARG_LISTFILE,         /* --listfile               */
+       ARG_OUTFILE,          /* --outfile   */
+       ARG_MAPFILE,          /* --mapfile   */
+       ARG_DEBUGFILE,        /* --debugfile */
+    ARG_EEPFILE,          /* --eepfile   */
+       ARG_COUNT
+       };
+
+enum
+       {
+       MSGTYPE_ERROR = 0,
+       MSGTYPE_WARNING,
+       MSGTYPE_MESSAGE,
+       MSGTYPE_OUT_OF_MEM
+       };
+
+enum
+       {
+       PASS_1 = 0,
+       PASS_2
+       };
+
+enum
+       {
+       SEGMENT_CODE = 0,
+       SEGMENT_DATA,
+       SEGMENT_EEPROM
+       };
+
+enum
+       {
+       TERM_END = 0,
+       TERM_SPACE,
+       TERM_COMMA,
+       TERM_EQUAL,
+       TERM_DASH,
+       TERM_DOUBLEQUOTE,
+       TERM_COLON
+       };
+
+/* Structures */
+
+struct prog_info
+       {
+       struct args *args;
+       struct device *device;
+       struct file_info *fi;
+       struct macro_call *macro_call;
+       struct macro_line *macro_line;
+       FILE *list_file;
+       int list_on;
+       char *list_line;
+       FILE *obj_file;
+       struct hex_file_info *hfi;
+       struct hex_file_info *eep_hfi;
+       int segment;
+       int cseg_addr;
+       int dseg_addr;
+       int eseg_addr;
+       int cseg_count;
+       int dseg_count;
+       int eseg_count;
+       int error_count;
+       int max_errors;
+       int warning_count;
+       struct include_file *last_include_file;
+       struct include_file *first_include_file;
+       struct def *first_def;
+       struct def *last_def;
+       struct label *first_label;
+       struct label *last_label;
+       struct label *first_constant;
+       struct label *last_constant;
+       struct label *first_variable;
+       struct label *last_variable;
+       struct macro *first_macro;
+       struct macro *last_macro;
+       struct macro_call *first_macro_call;
+       struct macro_call *last_macro_call;
+       int conditional_depth;
+       /* coff additions */
+       FILE *coff_file;
+       };
+
+struct file_info
+       {
+       FILE *fp;
+       struct include_file *include_file;
+       char buff[LINEBUFFER_LENGTH];
+       char scratch[LINEBUFFER_LENGTH];
+       int line_number;
+       int exit_file;
+       struct label *label;
+       };
+
+struct hex_file_info
+       {
+       FILE *fp;
+       int count;
+       int linestart_addr;
+       int segment;
+       unsigned char hex_line[16];
+       };
+
+struct include_file
+       {
+       struct include_file *next;
+       char *name;
+       int num;
+       };
+
+struct def
+       {
+       struct def *next;
+       char *name;
+       int reg;
+       };
+
+struct label
+       {
+       struct label *next;
+       char *name;
+       int value;
+       };
+
+struct macro
+       {
+       struct macro *next;
+       char *name;
+       struct include_file *include_file;
+       int first_line_number;
+       struct macro_line *first_macro_line;
+       };
+
+struct macro_line
+       {
+       struct macro_line *next;
+       char *line;
+       };
+
+struct macro_call
+       {
+       struct macro_call *next;
+       int line_number;
+       struct include_file *include_file;
+       struct macro_call *prev_on_stack;
+       struct macro *macro;
+       int line_index;
+       int prev_line_index;
+       int nest_level;
+       struct label *first_label;
+       struct label *last_label;
+       };
+
+/* Prototypes */
+/* avra.c */
+void assemble(struct prog_info *pi);
+int load_arg_defines(struct prog_info *pi);
+struct prog_info *get_pi(struct args *args);
+void free_pi(struct prog_info *pi);
+void prepare_second_pass(struct prog_info *pi);
+void print_msg(struct prog_info *pi, int type, char *fmt, ... );
+
+/* parser.c */
+int parse_file(struct prog_info *pi, char *filename, int pass);
+int parse_line(struct prog_info *pi, char *line, int pass);
+char *get_next_token(char *scratch, int term);
+
+/* expr.c */
+int get_expr(struct prog_info *pi, char *data, int *value);
+int get_operator(char *op);
+int test_operator_at_precedence(int operator, int precedence);
+int calc(struct prog_info *pi, int left, int operator, int right);
+int get_function(char *function);
+int do_function(int function, int value);
+int log2(int value);
+int get_symbol(struct prog_info *pi, char *label_name, int *data);
+int par_length(char *data);
+
+/* mnemonic.c */
+int parse_mnemonic(struct prog_info *pi, int pass);
+int get_mnemonic_type(char *mnemonic);
+int get_register(struct prog_info *pi, char *data);
+int get_bitnum(struct prog_info *pi, char *data, int *ret);
+int get_indirect(struct prog_info *pi, char *operand);
+int is_supported(struct prog_info *pi, char *name);
+int count_supported_instructions(int flags);
+
+/* directiv.c */
+int parse_directive(struct prog_info *pi, int pass);
+int get_directive_type(char *directive);
+char *term_string(struct prog_info *pi, char *string);
+int parse_db(struct prog_info *pi, char *next, int pass);
+void write_db(struct prog_info *pi, char byte, char *prev, int count, int pass);
+int spool_conditional(struct prog_info *pi, int only_endif);
+int check_conditional(struct prog_info *pi, char *buff, int *current_depth, int *do_next, int only_endif);
+int test_include(const char *filename);
+
+/* macro.c */
+int read_macro(struct prog_info *pi, char *name, int pass);
+struct macro *get_macro(struct prog_info *pi, char *name);
+int expand_macro(struct prog_info *pi, struct macro *macro, char *rest_line, int pass);
+
+/* file.c */
+int open_out_files(struct prog_info *pi, char *filename);
+void close_out_files(struct prog_info *pi);
+struct hex_file_info *open_hex_file(char *filename);
+void close_hex_file(struct hex_file_info *hfi);
+void write_ee_byte(struct prog_info *pi, int address, unsigned char data);
+void write_prog_word(struct prog_info *pi, int address, int data);
+void do_hex_line(struct hex_file_info *hfi);
+FILE *open_obj_file(struct prog_info *pi, char *filename);
+void close_obj_file(struct prog_info *pi, FILE *fp);
+void write_obj_record(struct prog_info *pi, int address, int data);
+
+/* map.c */
+void write_map_file(struct prog_info *pi);
+char *Space(char *n);
+
+/* stdextra.c */
+char *nocase_strcmp(char *s, char *t);
+char *nocase_strncmp(char *s, char *t, int n);
+char *nocase_strstr(char *s, char *t);
+int atox(char *s);
+int atoi_n(char *s, int n);
+int atox_n(char *s, int n);
+char *my_strlwr(char *in);
+char *my_strupr(char *in);
+
+/* coff.c */
+FILE *open_coff_file(struct prog_info *pi, char *filename);
+void write_coff_file(struct prog_info *pi);
+void write_coff_eeprom( struct prog_info *pi, int address, unsigned char data);
+void write_coff_program( struct prog_info *pi, int address, unsigned int data);
+void close_coff_file(struct prog_info *pi, FILE *fp);
+int parse_stabs( struct prog_info *pi, char *p, int pass );
+int parse_stabn( struct prog_info *pi, char *p, int pass );
diff --git a/src/mkutil/avra-0.8/SOURCE/coff.c b/src/mkutil/avra-0.8/SOURCE/coff.c
new file mode 100644 (file)
index 0000000..b9332b8
--- /dev/null
@@ -0,0 +1,2074 @@
+//\r
+// coff.c - Common Object File Format (COFF) support\r
+//\r
+//     This file was developed for the avra assembler in order to produce COFF output files \r
+//     for use with the Atmel AVR Studio.  The Lean C Compiler (LCC) debugging stabs \r
+//     output was used as input to the assembler.  The information used to develop this file\r
+//     was obtained from various sources on the Internet, most notably, the Free Software Foundation,\r
+//     The "stabs" debug format, ??? Chapter 7: Common Object File Format (COFF), \r
+//\r
+//     This software has absolutely no warrantee!  The money you paid for this will be \r
+//     promptly refunded if not fully satisfied.\r
+//\r
+//     Beta release 1/20/2000 by Bob Harris\r
+//\r
+//     This software has not been fully tested and probably has a few software deficiencies.\r
+//     Some software support may be possible by sending a problem description report to \r
+//     rth@mclean.sparta.com\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include <time.h>\r
+\r
+#include "misc.h"\r
+#include "avra.h"\r
+#include "args.h"\r
+\r
+#include "coff.h"\r
+#include "device.h"    /* device flash and eeprom size */\r
+\r
+\r
+struct FundamentalType {\r
+\r
+    char *pString;\r
+    int Type;\r
+    int Size;\r
+};\r
+\r
+struct FundamentalType FundamentalTypes[] = {\r
+    "null", T_NULL, 0,\r
+    "void", T_VOID, 0,\r
+    "char", T_CHAR, 1,\r
+    "short", T_SHORT, 1,\r
+    "int", T_INT, 1,\r
+    "long", T_LONG, 2, \r
+    "float", T_FLOAT, 4,\r
+    "double", T_DOUBLE, 4,\r
+    "struct", T_STRUCT, 0,\r
+    "union", T_UNION, 0,\r
+    "enum",  T_ENUM, 0,\r
+    "moe", T_MOE, 0,\r
+    "unsigned char", T_UCHAR, 1,\r
+    "unsigned short", T_USHORT, 1,\r
+    "unsigned int", T_UINT, 1,\r
+    "unsigned long", T_ULONG, 2,\r
+    "long double", T_LNGDBL, 2,\r
+    "long long int", T_LONG, 2,\r
+    "long int", T_LONG, 2,\r
+    "unsigned long long", T_ULONG, 2, \r
+    "signed char", T_CHAR, 1,\r
+    0, 0\r
+};\r
+\r
+struct coff_info *ci;\r
+\r
+/****************************************************************************************/\r
+\r
+FILE *open_coff_file(struct prog_info *pi, char *filename){\r
+\r
+    int ok /*, i*/;\r
+    FILE *fp;\r
+    //unsigned long *pu4;\r
+    char*p;\r
+\r
+\r
+    ci = calloc( 1, sizeof(struct coff_info) );\r
+    if ( !ci )\r
+        return( 0 );\r
+\r
+    ok = True;\r
+    /* default values */\r
+    ci->CurrentFileNumber = 0;\r
+    ci->pRomMemory = 0; \r
+    ci->pEEPRomMemory = 0;\r
+    ci->MaxRomAddress = 0;\r
+    ci->MaxEepromAddress = 0;\r
+    ci->NeedLineNumberFixup = 0;\r
+    ci->GlobalStartAddress = -1;\r
+    ci->GlobalEndAddress = 0;\r
+\r
+    /* Linked lists start out at zero */\r
+    InitializeList( &ci->ListOfSectionHeaders );\r
+    InitializeList( &ci->ListOfRawData );\r
+    InitializeList( &ci->ListOfRelocations );\r
+    InitializeList( &ci->ListOfLineNumbers );\r
+    InitializeList( &ci->ListOfSymbols );\r
+    InitializeList( &ci->ListOfGlobals );\r
+    InitializeList( &ci->ListOfSpecials );\r
+    InitializeList( &ci->ListOfUndefined );\r
+    InitializeList( &ci->ListOfStrings );\r
+    InitializeList( &ci->ListOfTypes );\r
+    InitializeList( &ci->ListOfSplitLines );\r
+\r
+    /* add two default sections to SectionHeaders */\r
+    if (  !AllocateListObject( &ci->ListOfSectionHeaders, sizeof(struct external_scnhdr) ) ||\r
+          !AllocateListObject( &ci->ListOfSectionHeaders, sizeof(struct external_scnhdr) ) ) {\r
+\r
+        fprintf(stderr, "\nOut of memory allocating section headers!");\r
+        return( 0 );\r
+    }\r
+\r
+    /* add to string table */\r
+    p = (char *)AllocateListObject( &ci->ListOfStrings,  4 );\r
+    if ( !p ) {\r
+        fprintf(stderr, "\nOut of memory allocating string table space!");\r
+        return( 0 );\r
+    }\r
+\r
+    /* Allocate space for binary output into ROM, and EEPROM memory buffers for COFF output */\r
+    /* ASSUMES ci->device is accurate */\r
+    if ( (ci->pRomMemory = AllocateListObject( &ci->ListOfRawData, pi->device->flash_size * 2 ) ) != 0) {\r
+        if ( (ci->pEEPRomMemory = AllocateListObject( &ci->ListOfRawData, pi->device->eeprom_size )) != 0) {\r
+            ok = True; /* only true if both buffers are properly allocated */\r
+            /* now fill them with 0xff's to simulate flash erasure */\r
+            memset( (void *)ci->pRomMemory, 0xff, pi->device->flash_size * 2 );\r
+            memset(    (   void    *)ci->pEEPRomMemory,    0xff,    pi->device->eeprom_size    );\r
+        }\r
+    }\r
+    if ( ok != True )\r
+        return( 0 );\r
+\r
+    fp = fopen(filename,"wb");\r
+    if ( fp == NULL ) {\r
+        fprintf(stderr,"Error: cannot write coff file\n");\r
+        return( fp );\r
+    }\r
+    /* simulate void type .stabs void:t15=r1;*/\r
+    stab_add_local_type( "void", "15=r1;0;0;" );\r
+\r
+    return( fp );   \r
+}\r
+\r
+/****************************************************************************************/\r
+void write_coff_file(struct prog_info *pi){\r
+\r
+    //FILE *fp;\r
+    //struct label *label;\r
+    char /* File[256],*/*p;\r
+    struct external_scnhdr *pSectionHdr;\r
+    struct syment *pEntry;\r
+    union auxent *pAux;\r
+    unsigned long *plong;\r
+    int NumberOfSymbols, SymbolIndex, LastFileIndex, LastFunctionIndex, LastFunctionAddress;\r
+    LISTNODE *pNode;\r
+    int LinesOffset, SymbolsOffset, StringsOffset, RawOffset;\r
+    struct lineno *pLine; \r
+\r
+    /* add two special sections */\r
+    /* one for .text */\r
+    if (  ( pEntry = (struct syment*)AllocateTwoListObjects( &ci->ListOfSpecials, sizeof(struct syment) * 2 ) ) == 0 ) {\r
+        fprintf(stderr, "\nOut of memory allocating special headers for .text!");\r
+        return;\r
+    }\r
+    memset( pEntry->n_name, 0, 8 );\r
+    strcpy( pEntry->n_name, ".text" );\r
+    pEntry->n_value = 0;\r
+    pEntry->n_scnum = 1;\r
+    pEntry->n_type = 0;\r
+    pEntry->n_sclass = C_STAT;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;\r
+    pAux = (union auxent *)pEntry;\r
+    pAux->x_scn.x_scnlen = ci->MaxRomAddress + 2;\r
+    pAux->x_scn.x_nreloc = 0;\r
+    pAux->x_scn.x_nlinno = ci->ListOfLineNumbers.TotalItems;\r
+    /* one for .bss */\r
+    if (  ( pEntry = (struct syment*)AllocateTwoListObjects( &ci->ListOfSpecials, sizeof(struct syment) * 2 ) ) == 0 ) {\r
+        fprintf(stderr, "\nOut of memory allocating special header for .bss!");\r
+        return;\r
+    }\r
+    memset( pEntry->n_name, 0, 8 );\r
+    strcpy( pEntry->n_name, ".bss" );\r
+    if ( ci->GlobalStartAddress == -1 ) {\r
+        ci->GlobalEndAddress = ci->GlobalStartAddress = 0x60;\r
+    }\r
+    pEntry->n_value = ci->GlobalStartAddress;\r
+    pEntry->n_scnum = 2;\r
+    pEntry->n_type = 0;\r
+    pEntry->n_sclass = C_STAT;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;\r
+    pAux = (union auxent *)pEntry;\r
+    pAux->x_scn.x_scnlen = 0; /* we don't store any data here */\r
+    pAux->x_scn.x_nreloc = 0;\r
+    pAux->x_scn.x_nlinno = 0;\r
+\r
+    /* one more for .data - eeprom ??? */\r
+\r
+    /* Calculate common offsets into the file */\r
+    RawOffset = sizeof(struct external_filehdr) + ci->ListOfSectionHeaders.TotalBytes;\r
+    LinesOffset = RawOffset + ci->MaxRomAddress + 2; /* ignore eeprom for now */\r
+    SymbolsOffset = LinesOffset + ci->ListOfLineNumbers.TotalBytes;\r
+    StringsOffset = SymbolsOffset + ci->ListOfSymbols.TotalBytes + ci->ListOfSpecials.TotalBytes + ci->ListOfGlobals.TotalBytes;\r
+\r
+    /* Clean up loose ends in string table */\r
+    if ( !(plong  = (unsigned long *)FindFirstListObject(&ci->ListOfStrings))  ) {\r
+        fprintf(stderr,"\nInternal error in string table!");\r
+        return;\r
+    }\r
+    *plong = ci->ListOfStrings.TotalBytes; /* Size of string table */\r
+\r
+    /* Clean up loose ends in symbol table */\r
+\r
+    /* symbol table - Filename value - index to next .file or global symbol */\r
+    /* The value of that symbol equals the symbol table entry index of the next .file symbol or .global */\r
+    LastFunctionAddress = ci->MaxRomAddress;\r
+    NumberOfSymbols = ci->ListOfSymbols.TotalItems + ci->ListOfSpecials.TotalItems + ci->ListOfGlobals.TotalItems;\r
+    SymbolIndex = LastFileIndex = NumberOfSymbols;\r
+    LastFunctionIndex = 0; /* set to zero on last function */\r
+    for ( pEntry = (struct syment *)FindLastListObject(&ci->ListOfSymbols);\r
+        pEntry != 0;\r
+        pEntry = (struct syment *)FindNextLastListObject(&ci->ListOfSymbols) ) {\r
+\r
+        /* Search for .file entries designated by C_FILE */\r
+        if ( pEntry->n_sclass == C_FILE ) {\r
+            pEntry->n_value = LastFileIndex;\r
+            LastFileIndex = SymbolIndex; /* save current index */\r
+        }\r
+        /* Search for Function entries C_EXT */\r
+        else if (  pEntry->n_sclass == C_EXT ) {\r
+            pEntry++;\r
+            pAux = (union auxent *)pEntry;\r
+            pAux->x_sym.x_misc.x_fsize = LastFunctionAddress - pEntry->n_value; /* function updated size */\r
+            pAux->x_sym.x_fcnary.x_fcn.x_lnnoptr += LinesOffset;\r
+            LastFunctionAddress = pEntry->n_value;\r
+            pAux->x_sym.x_fcnary.x_fcn.x_endndx = LastFunctionIndex; /* point to next function index */\r
+            pAux->x_sym.x_tvndx = 0; /* ??? */\r
+            LastFunctionIndex = SymbolIndex;\r
+        } else if (  (pEntry->n_sclass == C_FCN ) || ( pEntry->n_sclass == C_BLOCK) ) {\r
+            if ( pEntry->n_name[1] == 'b' ) {\r
+                /* .bf and .bb */\r
+                pEntry++;\r
+                pAux = (union auxent *)pEntry;\r
+                pAux->x_sym.x_fcnary.x_fcn.x_endndx = LastFunctionIndex;\r
+            }\r
+        }\r
+        /* else do nothing */\r
+\r
+        /* update current symbol index */\r
+        pNode = GetCurrentNode( &ci->ListOfSymbols );\r
+        SymbolIndex -= ( pNode->Size / sizeof(struct syment) );\r
+    }\r
+\r
+    // File Header\r
+    ci->FileHeader.f_magic = MAGIC_NUMBER_AVR;\r
+    ci->FileHeader.f_nscns = 2;\r
+    ci->FileHeader.f_timdat = time( (time_t *)&ci->FileHeader.f_timdat);\r
+    ci->FileHeader.f_symptr = SymbolsOffset;\r
+    ci->FileHeader.f_nsyms = NumberOfSymbols;\r
+    ci->FileHeader.f_opthdr = 0;\r
+    ci->FileHeader.f_flags = 0xff; /*F_RELFLG;*/ /* No relocation information available */\r
+\r
+    /* write it out */\r
+    if ( fwrite(&ci->FileHeader, 1, sizeof(struct external_filehdr), pi->coff_file ) !=  sizeof(struct external_filehdr) ) {\r
+        fprintf(stderr,"\nFile error writing header ...(disk full?)");\r
+        return;\r
+    }\r
+\r
+    // Optional Information\r
+\r
+    // Section 1 Header\r
+    pSectionHdr = (struct external_scnhdr *)FindFirstListObject(&ci->ListOfSectionHeaders);\r
+    if ( !pSectionHdr ) {\r
+        fprintf(stderr, "\nInternal Coff error - cannot find section header .text!");\r
+        return;\r
+    }\r
+    memset( &pSectionHdr->s_name[0], 0, sizeof(struct external_scnhdr) );\r
+    strcpy( &pSectionHdr->s_name[0], ".text");\r
+    pSectionHdr->s_paddr = 0;\r
+    pSectionHdr->s_vaddr = 0;\r
+    pSectionHdr->s_size = ci->MaxRomAddress + 2; /* remember the last instruction */\r
+    pSectionHdr->s_scnptr = RawOffset;\r
+    pSectionHdr->s_relptr = 0;\r
+    pSectionHdr->s_lnnoptr = LinesOffset;\r
+    pSectionHdr->s_nreloc = 0;\r
+    pSectionHdr->s_nlnno = ci->ListOfLineNumbers.TotalBytes/sizeof(struct lineno);\r
+    pSectionHdr->s_flags = STYP_TEXT;\r
+\r
+    /* write it out */\r
+    if ( fwrite(&pSectionHdr->s_name[0], 1, sizeof(struct external_scnhdr), pi->coff_file ) !=  sizeof(struct external_scnhdr) ) {\r
+        fprintf(stderr,"\nFile error writing section header ...(disk full?)");\r
+        return;\r
+    }\r
+\r
+    // Section 2 Header\r
+    pSectionHdr = (struct external_scnhdr *)FindNextListObject(&ci->ListOfSectionHeaders);\r
+    if ( !pSectionHdr ) {\r
+        fprintf(stderr, "\nInternal Coff error - cannot find section header .bss!");\r
+        return;\r
+    }\r
+    memset( &pSectionHdr->s_name[0], 0, sizeof(struct external_scnhdr) );\r
+    strcpy( &pSectionHdr->s_name[0], ".bss");\r
+    /* later expansion */\r
+    pSectionHdr->s_paddr = ci->GlobalStartAddress;\r
+    pSectionHdr->s_vaddr = ci->GlobalStartAddress;\r
+    pSectionHdr->s_flags = STYP_DATA; /* seems it should be STYP_BSS */\r
+\r
+    /* write it out */\r
+    if ( fwrite(&pSectionHdr->s_name[0], 1, sizeof(struct external_scnhdr), pi->coff_file ) !=  sizeof(struct external_scnhdr) ) {\r
+        fprintf(stderr,"\nFile error writing section header ...(disk full?)");\r
+        return;\r
+    }\r
+\r
+    /* Section N Header - .data or eeprom */\r
+\r
+    // Raw Data for Section 1\r
+    if ( (p = (unsigned char *)FindFirstListObject(&ci->ListOfRawData) ) == 0 ) {\r
+        fprintf(stderr,"\nInternal error - unable to find binary data!");\r
+        return;\r
+    }\r
+\r
+    /* write it out */\r
+    if ( fwrite( p, 1, ci->MaxRomAddress + 2, pi->coff_file ) != (size_t)(ci->MaxRomAddress + 2) ) {\r
+        fprintf(stderr,"\nFile error writing raw .text data ...(disk full?)");\r
+        return;\r
+    }\r
+    // Raw data for section n\r
+\r
+    // Relocation Info for section 1\r
+\r
+    // Relocation info for section n\r
+\r
+    // Line numbers for section 1\r
+    for ( pLine = (struct lineno *)FindFirstListObject( &ci->ListOfLineNumbers );\r
+        pLine != 0;\r
+        pLine = (struct lineno *)FindNextListObject( &ci->ListOfLineNumbers ) ) {\r
+\r
+        pNode = GetCurrentNode( &ci->ListOfLineNumbers );\r
+\r
+        /* write it out */\r
+        if ( fwrite( pLine, 1, pNode->Size, pi->coff_file ) != pNode->Size ) {\r
+            fprintf(stderr,"\nFile error writing line numbers ...(disk full?)");\r
+            return;\r
+        }\r
+    }\r
+\r
+\r
+    // Line numbers for section n\r
+\r
+    // Symbol table\r
+    for ( pEntry = (struct syment *)FindFirstListObject( &ci->ListOfSymbols );\r
+        pEntry != 0;\r
+        pEntry = (struct syment *)FindNextListObject( &ci->ListOfSymbols ) ) {\r
+\r
+        pNode = GetCurrentNode( &ci->ListOfSymbols );\r
+\r
+        /* write it out */\r
+        if ( fwrite( pEntry, 1, pNode->Size, pi->coff_file ) != pNode->Size ) {\r
+            fprintf(stderr,"\nFile error writing symbol table ...(disk full?)");\r
+            return;\r
+        }\r
+    }\r
+\r
+    // Symbol table of Globals\r
+    for ( pEntry = (struct syment *)FindFirstListObject( &ci->ListOfGlobals );\r
+        pEntry != 0;\r
+        pEntry = (struct syment *)FindNextListObject( &ci->ListOfGlobals ) ) {\r
+\r
+        pNode = GetCurrentNode( &ci->ListOfGlobals );\r
+\r
+        /* write it out */\r
+        if ( fwrite( pEntry, 1, pNode->Size, pi->coff_file ) != pNode->Size ) {\r
+            fprintf(stderr,"\nFile error writing global symbols ...(disk full?)");\r
+            return;\r
+        }\r
+    }\r
+\r
+    /* Specials .text, .bss, .data */\r
+\r
+    for ( pEntry = (struct syment *)FindFirstListObject( &ci->ListOfSpecials );\r
+        pEntry != 0;\r
+        pEntry = (struct syment *)FindNextListObject( &ci->ListOfSpecials ) ) {\r
+\r
+        pNode = GetCurrentNode( &ci->ListOfSpecials );\r
+\r
+        /* write it out */\r
+        if ( fwrite( pEntry, 1, pNode->Size, pi->coff_file ) != pNode->Size ) {\r
+            fprintf(stderr,"\nFile error writing special symbols ...(disk full?)");\r
+            return;\r
+        }\r
+    }\r
+\r
+    // String Table\r
+    for ( p = (char *)FindFirstListObject( &ci->ListOfStrings );\r
+        p != 0;\r
+        p = (char *)FindNextListObject( &ci->ListOfStrings ) ) {\r
+\r
+        pNode = GetCurrentNode( &ci->ListOfStrings );\r
+\r
+        /* write it out */\r
+        if ( fwrite( p, 1, pNode->Size, pi->coff_file ) != pNode->Size ) {\r
+            fprintf(stderr,"\nFile error writing strings data ...(disk full?)");\r
+            return;\r
+        }\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+void write_coff_eeprom( struct prog_info *pi, int address, unsigned char data){\r
+\r
+    if ( !GET_ARG(pi->args, ARG_COFF) )\r
+        return;\r
+\r
+    /* Coff output keeps track of binary data in memory buffers */\r
+    if ( ci->pEEPRomMemory ) {\r
+        if ( address <= pi->device->eeprom_size ) {\r
+            *(ci->pEEPRomMemory + address) = data;\r
+            if ( address >= ci->MaxEepromAddress )\r
+                ci->MaxEepromAddress = address;   /* keep high water mark */\r
+        } else {\r
+            pi->error_count++;\r
+            fprintf(stderr, "Error: EEPROM address %d exceeds max range %d", address, pi->device->eeprom_size );\r
+        }\r
+    }\r
+}\r
+/****************************************************************************************/\r
+\r
+void write_coff_program( struct prog_info *pi, int address, unsigned int data){\r
+\r
+    unsigned char *pByte;\r
+\r
+    if ( !GET_ARG(pi->args, ARG_COFF) )\r
+        return;\r
+\r
+    /* Coff output keeps track of binary data in memory buffers, address is in bytes not words */\r
+    if ( ci->pRomMemory ) {\r
+        if ( address <= pi->device->flash_size ) {\r
+            pByte = (unsigned char *)(ci->pRomMemory + address); /* point to low byte in memory */\r
+            *pByte++ = (data & 0xff);   /* low byte */\r
+            *pByte = ((data >> 8) & 0xff); /* high byte */\r
+\r
+            if ( address >= ci->MaxRomAddress )\r
+                ci->MaxRomAddress = address;   /* keep high water mark */\r
+        } else {\r
+            pi->error_count++;\r
+            fprintf(stderr, "Error: FLASH address %d exceeds max range %d\n", address, pi->device->flash_size );\r
+            /* Nick added \n above */\r
+        }\r
+    }\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+void close_coff_file(struct prog_info *pi, FILE *fp){\r
+\r
+    /* close the output file */\r
+    fclose( fp );\r
+    pi->coff_file = 0;\r
+\r
+    /* free all the internal memory buffers used by ci */\r
+\r
+    FreeList( &ci->ListOfSectionHeaders );\r
+    FreeList( &ci->ListOfRawData );\r
+    FreeList( &ci->ListOfRelocations );\r
+    FreeList( &ci->ListOfLineNumbers );\r
+    FreeList(    &ci->ListOfSymbols    );\r
+    FreeList( &ci->ListOfGlobals );\r
+    FreeList( &ci->ListOfUndefined );\r
+    FreeList( &ci->ListOfStrings );\r
+    FreeList( &ci->ListOfTypes );\r
+    FreeList( &ci->ListOfSplitLines );\r
+\r
+    /* now free ci */\r
+    free( ci );\r
+    ci = 0;\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+int parse_stabs( struct prog_info *pi, char *p, int pass ){\r
+\r
+    int ok = True;\r
+    int TypeCode, n;\r
+    char *pString, *p2, *p3, *p4, *p5, *pType, *pEnd, *pp, *pJoined;\r
+\r
+\r
+    if ( !GET_ARG(pi->args, ARG_COFF) || ( pass == PASS_1 ) )\r
+        return(True);\r
+\r
+    /* stabs debugging information is in the form:\r
+    .stabs "symbolic info string", HexorDecimalTypecode, parm3, parm4, parm5\r
+    parm1, parm2, parm3 depend on typecode\r
+\r
+    N_LSYM     0x80            local sym: name,,0,type,offset\r
+    N_OPT      0x3c            compiler options\r
+    N_SO       0x64            source file name: name,,0,0,address\r
+    N_SOL      0x84            #included file name: name,,0,0,address\r
+    N_FUN      0x24            procedure: name,,0,linenumber,address\r
+    N_GSYM     0x20            global symbol: name,,0,type,0\r
+    N_LCSYM    0x28            .lcomm symbol: name,,0,type,address\r
+    N_STSYM    0x26            static symbol: name,,0,type,address\r
+    N_RSYM     0x40            register sym: name,,0,type,register\r
+    N_PSYM     0xa0            parameter: name,,0,type,offset\r
+\r
+    */\r
+\r
+    /* Look for multiple commands per line */\r
+\r
+    /* .stabs "linktag:T19=s46next:20=*19,0,16;last:20,16,16;a:21=ar1;0;2;22=ar1;0;3;1,32,96;\\",128,0,0,0 */\r
+    /* .stabs "b:23=ar1;0;4;24=ar1;0;5;2,128,240;;",128,0,0,0 */\r
+\r
+\r
+    /* Look for continuation lines per line */\r
+\r
+    /* Get String information as a token */\r
+    /* Parse the tokens in the stabn line buffer */\r
+    pString = get_next_token(p, TERM_DOUBLEQUOTE );     /* zap first doublequote */\r
+    p2 = get_next_token(pString, TERM_DOUBLEQUOTE );    /* zap last doublequote */\r
+    p2 = get_next_token(p2, TERM_COMMA );               /* zap comma */\r
+    p3 = get_next_token(p2, TERM_COMMA );\r
+    p4 = get_next_token(p3, TERM_COMMA );\r
+    p5 = get_next_token(p4, TERM_COMMA );\r
+    pEnd = get_next_token(p5, TERM_END ); /* zap CR LF, make ASCIIZ */\r
+\r
+    if ( !pString || !p2 || !p3 || !p4 || !p5 )\r
+        return( False );\r
+\r
+    /* Check for split lines */\r
+    n = strlen( pString );\r
+    if ( ( pString[n - 1] == '\\' ) && (pString[n - 2] == '\\') ) {\r
+        /* We have a continuation string here */\r
+        pString[n - 2] = 0;\r
+        n -= 2;\r
+        if ( !(pp = (char *)AllocateListObject( &ci->ListOfSplitLines, n + 1 ))  ) {\r
+            fprintf(stderr, "\nOut of memory allocating continuation line!");\r
+            return( False );\r
+        }\r
+        strcpy( pp, pString ); /* loose the continuation characters */\r
+        return(True);\r
+    }\r
+    if ( ci->ListOfSplitLines.TotalItems > 0 ) {\r
+        /* Join lines together and process */\r
+        if ( !(pJoined = calloc( 1, n + ci->ListOfSplitLines.TotalBytes ) ) ) {\r
+            fprintf(stderr, "\nOut of memory joining continuation lines!");\r
+            return( False );\r
+        }\r
+        for ( pp = (char *)FindFirstListObject( &ci->ListOfSplitLines );\r
+            pp != 0;\r
+            pp = (char *)FindNextListObject( &ci->ListOfSplitLines ) ) {\r
+\r
+            strcat( pJoined, pp ); /* connect the lines */\r
+        }\r
+        strcat( pJoined, pString );\r
+        FreeList( &ci->ListOfSplitLines );\r
+        if ( !AddListObject( &ci->ListOfSplitLines, pJoined, n + ci->ListOfSplitLines.TotalBytes )  ) {\r
+            fprintf(stderr, "\nUnable to add joined continuation line");\r
+            return( False );\r
+        }\r
+        pString = pJoined;\r
+    }\r
+\r
+\r
+    if ( *p2 == '0' )\r
+        TypeCode = atox(p2);    /* presume to be hex 0x */\r
+    else\r
+        TypeCode = atoi(p2);\r
+\r
+    switch ( TypeCode ) {\r
+\r
+    case N_OPT:     /* compiler options */\r
+        break;      /* nothing used here */\r
+\r
+    case N_SO:      /* source file name: name,,0,0,address */\r
+        ok = stab_add_filename( pString, p5 );\r
+        break;\r
+\r
+    case N_GSYM:    /* global symbol: name,,0,type,0 */\r
+        pType = get_next_token(pString, TERM_COLON );   /* separate at colon */\r
+        ok = stab_add_global( pi, pString, pType );\r
+        break;\r
+\r
+    case N_FUN:     /* procedure: name,,0,linenumber,address */\r
+        ok = stab_add_function( pi, pString, p5 );\r
+        break;\r
+\r
+    case N_LSYM:    /* local sym: name,,0,type,offset */\r
+        /* pString, p2 = TypeCode, p3 = 0, p4 = 0, p5 = offset */\r
+        pType = get_next_token(pString, TERM_COLON );   /* pType = symbol descriptor (character after the colon) */\r
+        if ( *pType == 't')\r
+            ok = stab_add_local_type( pString, ++pType );\r
+        else if (*pType == 'T')\r
+            ok = stab_add_tag_type( pString, ++pType );\r
+        else\r
+            ok = stab_add_local( pi, pString, pType, p5 );\r
+        break;\r
+\r
+    case N_RSYM:    /* Symbol:[P|r]type,0,size,register */\r
+        pType = get_next_token(pString, TERM_COLON );   /* separate at colon */\r
+        ok = stab_add_local_register( pi, pString, pType, p5 );\r
+        break;\r
+\r
+    case N_LCSYM:   /* .lcomm symbol: name,,0,type,address */\r
+        ok = True;\r
+        break;  /* ignore constants */\r
+\r
+    case N_STSYM:   /* static symbol: name,,0,type,address */\r
+        pType = get_next_token(pString, TERM_COLON );   /* separate at colon */\r
+        ok = stab_add_static_symbol( pi, pString, pType, p5 );\r
+        break;\r
+\r
+    case N_PSYM:    /* parameter: name,,0,type,offset */\r
+        pType = get_next_token(pString, TERM_COLON );   /* separate at colon */\r
+        ok = stab_add_parameter_symbol( pi, pString, pType, p5 );\r
+        break;\r
+\r
+    case N_SOL:     /* #included file name: name,,0,0,address */\r
+        ok = True;\r
+        break;  /* ignore include files */\r
+\r
+    default:\r
+        ok = False;\r
+    }\r
+\r
+    if ( ci->ListOfSplitLines.TotalItems > 0 )\r
+        FreeList( &ci->ListOfSplitLines );\r
+\r
+    return( ok );\r
+}\r
+/****************************************************************************************/\r
+\r
+int parse_stabn( struct prog_info *pi, char *p, int pass ){\r
+\r
+    int ok = True;\r
+    int TypeCode /* , LineNumber */, Level;\r
+    char *p1, *p2, *p3, *p4, *pLabel, *pFunction, *pEnd;\r
+\r
+    /* stabn debugging information is in the form:\r
+    .stabn TypeCode, 0, parm1, parm2\r
+    parm1 is level\r
+    parm2 is Label-Function\r
+\r
+    compiler currently produces the following TypeCodes:\r
+    N_LBRAC    0xc0            left bracket: 0,,0,nesting level,address\r
+    N_RBRAC    0xe0            right bracket: 0,,0,nesting level,address\r
+    N_SLINE    0x44            src line: 0,,0,linenumber,address\r
+    */\r
+\r
+    if ( !GET_ARG(pi->args, ARG_COFF) || ( pass == PASS_1 ) )\r
+        return(True);\r
+\r
+    /* Parse the tokens in the stabn line buffer */\r
+    p1 = get_next_token(p, TERM_SPACE );\r
+    p2 = get_next_token(p1, TERM_COMMA );\r
+    p3 = get_next_token(p2, TERM_COMMA );\r
+    p4 = get_next_token(p3, TERM_COMMA );\r
+    pEnd = get_next_token(p4, TERM_END ); /* zap CR LF, make ASCIIZ */\r
+\r
+    if ( !p1 || !p2 || !p3 || !p4 )\r
+        return( False );\r
+\r
+    /* first convert TypeCode to binary */\r
+    if ( *p1 == '0' )\r
+        TypeCode = atox(p1);    /* presume to be hex 0x */\r
+    else\r
+        TypeCode = atoi(p1);\r
+\r
+    Level = atoi(p3);   /* line number or level */\r
+    pLabel = p4;                /* Assembly label */\r
+    pFunction = get_next_token( pLabel, TERM_DASH ); /* Function */\r
+\r
+    switch ( TypeCode ) {\r
+    case N_SLINE:           /* src line: 0,,0,linenumber,address */\r
+        ok = stab_add_lineno( pi, Level, pLabel, pFunction );\r
+        break;\r
+\r
+    case N_LBRAC:           /* left bracket: 0,,0,nesting level,address */\r
+        ok = stab_add_lbracket( pi, Level, pLabel, pFunction );\r
+        break;\r
+\r
+    case N_RBRAC:           /* right bracket: 0,,0,nesting level,address */\r
+        ok = stab_add_rbracket( pi, Level, pLabel, pFunction );\r
+        break;\r
+\r
+    default:\r
+        fprintf(stderr, "\nUnknown .stabn TypeCode = 0x%x", TypeCode );\r
+        ok = False;\r
+    }\r
+    return( ok );\r
+}\r
+\r
+/****************************************************************************************/\r
+int stab_add_lineno(  struct prog_info *pi, int LineNumber, char *pLabel, char *pFunction ){\r
+\r
+    int Address;\r
+    struct lineno *pln;\r
+    struct syment *pEntry;\r
+    union auxent *pAux;\r
+\r
+    /* Allocate LineNumber Table entry and fill it in */\r
+    pln = (struct lineno *)AllocateListObject(&ci->ListOfLineNumbers, sizeof(struct lineno)  );\r
+    if ( !pln ) {\r
+        fprintf(stderr, "\nOut of memory allocating lineno table for function %s", pFunction );\r
+        return( False );\r
+    }\r
+    /* set value field to be address of label in bytes */\r
+    if ( !get_symbol(pi, pLabel, &Address) ) {\r
+        fprintf(stderr, "\nUnable to locate label %s", pLabel );\r
+        return( False );\r
+    }\r
+    pln->l_addr.l_paddr = Address * 2; /* need byte quanities */\r
+\r
+    /* Line number is relative to beginning of function, starts at 1 */\r
+    if ( ci->FunctionStartLine == 0 ) {\r
+        /* This line number is that same as the function start */\r
+        ci->FunctionStartLine = LineNumber;\r
+    }\r
+    pln->l_lnno = LineNumber - ci->FunctionStartLine + 1;\r
+    ci->CurrentSourceLine = LineNumber; /* keep track of source line for .eb .ef arrays */\r
+    if ( ci->NeedLineNumberFixup ) {\r
+        /* need to go into symbol table and fix last NeedLineNumberFixup entries */\r
+        for ( pEntry = (struct syment *)FindLastListObject(&ci->ListOfSymbols);\r
+            (pEntry != 0) && ( ci->NeedLineNumberFixup != 0);\r
+            pEntry = (struct syment *)FindNextLastListObject(&ci->ListOfSymbols) ) {\r
+\r
+            /* Fix up line number entries */\r
+            if ( (pEntry->n_sclass == C_FCN ) || ( pEntry->n_sclass == C_BLOCK ) || ( pEntry->n_sclass == C_EXT) ) {\r
+                pEntry++;\r
+                pAux = (union auxent *)pEntry;\r
+                pAux->x_sym.x_misc.x_lnsz.x_lnno = LineNumber;\r
+                ci->NeedLineNumberFixup--; \r
+            }\r
+        }\r
+    }\r
+\r
+    return(True);\r
+}\r
+/****************************************************************************************/\r
+\r
+int stab_add_lbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction ){\r
+\r
+    int Address;\r
+    struct syment *pEntry;\r
+    union auxent *pAux;\r
+    //char *p;\r
+    //struct lineno *pln;\r
+\r
+    if ( !get_symbol(pi, pLabel, &Address) ) {\r
+        fprintf(stderr, "\nUnable to locate label %s", pLabel );\r
+        return( False );\r
+    }\r
+\r
+    /* Now create a .bb symbol table entry and aux entry too */\r
+    pEntry = (struct syment *)AllocateTwoListObjects( &ci->ListOfSymbols,  sizeof(struct syment) * 2 );\r
+    if ( !pEntry ) {\r
+        fprintf(stderr, "\nOut of memory allocating symbol table entry for .bb %s", pLabel );\r
+        return( False );\r
+    }\r
+    /* n_name */\r
+    memset( pEntry->n_name, 0, 8 );\r
+    strcpy( pEntry->n_name, ".bb" );\r
+\r
+    pEntry->n_value = Address * 2;  /* bytes not words */\r
+    pEntry->n_scnum = 1;    /* .text */\r
+    pEntry->n_type = 0;\r
+    pEntry->n_sclass = C_BLOCK;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;   /* point to aux entry */\r
+    pAux = (union auxent *)pEntry; \r
+    pAux->x_sym.x_misc.x_lnsz.x_lnno = 0;   /* UNKNOWN - post process */\r
+    pAux->x_sym.x_misc.x_lnsz.x_size = 0;   /* UNKNOWN - post process */\r
+    ci->NeedLineNumberFixup++; /* once for .bb block */\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+int stab_add_rbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction ){\r
+\r
+    int Address;\r
+    struct syment *pEntry;\r
+    union auxent *pAux;\r
+    //char *p;\r
+    //struct lineno *pln;\r
+\r
+    if ( !get_symbol(pi, pLabel, &Address) ) {\r
+        fprintf(stderr, "\nUnable to locate label %s", pLabel );\r
+        return( False );\r
+    }\r
+\r
+    /* Now create a .eb symbol table entry */\r
+    pEntry = (struct syment *)AllocateTwoListObjects( &ci->ListOfSymbols,  sizeof(struct syment) * 2 );\r
+    if ( !pEntry ) {\r
+        fprintf(stderr, "\nOut of memory allocating symbol table entry for .eb %s", pLabel );\r
+        return( False );\r
+    }\r
+    /* n_name */\r
+    memset( pEntry->n_name, 0, 8 );\r
+    strcpy( pEntry->n_name, ".eb" );\r
+    pEntry->n_sclass = C_BLOCK;\r
+    pEntry->n_value = Address * 2;  /* bytes not words */\r
+    pEntry->n_scnum = 1;    /* .text */\r
+    pEntry->n_type = 0;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;   /* point to aux entry */\r
+    pAux = (union auxent *)pEntry; \r
+    pAux->x_sym.x_misc.x_lnsz.x_lnno = ci->CurrentSourceLine;\r
+\r
+    /* create an .ef if at level 0 */\r
+    if ( Level == 0 ) {\r
+\r
+        /* Now create a .ef symbol table entry */\r
+        pEntry = (struct syment *)AllocateTwoListObjects( &ci->ListOfSymbols,  sizeof(struct syment) * 2 );\r
+        if ( !pEntry ) {\r
+            fprintf(stderr, "\nOut of memory allocating symbol table entry for .ef %s", pLabel );\r
+            return( False );\r
+        }\r
+        /* n_name */\r
+        memset( pEntry->n_name, 0, 8 );\r
+        strcpy( pEntry->n_name, ".ef" );\r
+        pEntry->n_sclass = C_FCN;\r
+        pEntry->n_value = Address * 2;  /* bytes not words */\r
+        pEntry->n_scnum = 1;    /* .text */\r
+        pEntry->n_type = 0;\r
+        pEntry->n_numaux = 1;\r
+        pEntry++;   /* point to aux entry */\r
+        pAux = (union auxent *)pEntry; \r
+        pAux->x_sym.x_misc.x_lnsz.x_lnno = ci->CurrentSourceLine;\r
+    }\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+int stab_add_filename( char *pName, char *pLabel ){\r
+\r
+    int ok, n;\r
+    struct syment *pEntry;\r
+    union auxent *pAux;\r
+    char *p;\r
+\r
+    /* if( pLabel == "Ltext0" ) then beginning of .text, pName = cwd, next pName = file */\r
+\r
+    /* if( pLabel == "Letext" ) then end of .text , pName == NULL */\r
+\r
+    /* we only need the one not ending in Slash */\r
+    ok = True;\r
+    n = strlen(pName);\r
+    if ( n > 0 ) {\r
+        if ( ( pName[ n - 1] == '\\') || (pName[ n - 1] == '/') )\r
+            return(True); /* ignore */\r
+    } else\r
+        return(True);\r
+\r
+\r
+    /* allocate entry in symbol table list */\r
+    pEntry = (struct syment *)AllocateTwoListObjects(\r
+                                                    &ci->ListOfSymbols,  sizeof(struct syment) * 2 ); /* aux entry too */\r
+    if ( !pEntry ) {\r
+        fprintf(stderr, "\nOut of memory allocating symbol table entry for global %s", pName );\r
+        return( False );\r
+    }\r
+    /* n_name */\r
+    memset( pEntry->n_name, 0, 8 );\r
+    strcpy( pEntry->n_name, ".file" );\r
+    /* n_value is determined after processing done UNKNOWN - post process */\r
+    /* The value of that symbol equals the symbol table entry index of the next .file symbol or .global */\r
+    /* post process */\r
+    pEntry->n_scnum = N_DEBUG;\r
+    pEntry->n_sclass = C_FILE;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;   /* point to aux entry */\r
+    pAux = (union auxent *)pEntry; \r
+\r
+    /* Add Label name to symbol table */\r
+    if ( n <= FILNMLEN ) {\r
+        /* inline filename */\r
+        memset( pAux->x_file.x_fname, 0, FILNMLEN );\r
+        strncpy( pAux->x_file.x_fname, pName, n ); /* might not be zero terminated */\r
+    } else {\r
+        pAux->x_file.x_n.x_zeroes = 0;  /* symbol name is in string table */\r
+        pAux->x_file.x_n.x_offset = ci->ListOfStrings.TotalBytes;\r
+\r
+        /* add to string table */\r
+        p = (char *)AllocateListObject( &ci->ListOfStrings,  n + 1 );\r
+        if ( !p ) {\r
+            fprintf(stderr, "\nOut of memory allocating string table space!");\r
+            return( False );\r
+        }\r
+        strcpy( p, pName );\r
+    }\r
+    return( ok );\r
+}\r
+\r
+/****************************************************************************************/\r
+int stab_add_function( struct prog_info *pi, char *pName, char *pLabel ){\r
+\r
+    int n, Address;\r
+    unsigned short CoffType, Type;\r
+    struct syment *pEntry;\r
+    char *pType;\r
+    struct lineno *pln;\r
+    union auxent *pAux;\r
+    int SymbolIndex;\r
+\r
+    pType = get_next_token(pName, TERM_COLON ); /* pType = symbol descriptor (character after the colon) */\r
+    Type = atoi(pType + 1);     /* skip past F, predefined variable type */\r
+    if ( (CoffType = GetCoffType( Type )) == 0 ) {\r
+        fprintf(stderr, "\nUnrecognized return type found for function %s = %d", pName, Type );\r
+        return(False);\r
+    }\r
+    /* Get Current Symbol Index, Allocate Symbol Table entry and fill it in */\r
+    SymbolIndex = ci->ListOfSymbols.TotalItems;\r
+    pEntry = (struct syment *)AllocateTwoListObjects( &ci->ListOfSymbols, sizeof(struct syment) * 2 );\r
+    if ( !pEntry ) {\r
+        fprintf(stderr, "\nOut of memory allocating symbol table entry for function %s", pName );\r
+        return( False );\r
+    }\r
+    if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding local %s to string table", pName );\r
+    }\r
+    if ( !get_symbol(pi, pLabel, &Address) ) {\r
+        fprintf(stderr, "\nUnable to locate function %s", pName );\r
+        return( False );\r
+    }\r
+    pEntry->n_value = Address * 2;  /* convert words to bytes */\r
+    pEntry->n_scnum = 2;    /* .bss */\r
+    if ( (CoffType = GetCoffType( Type )) == 0 ) {\r
+        fprintf(stderr, "\nUnrecognized type found for function %s = %d", pName, Type );\r
+        return(False);\r
+    }\r
+    pEntry->n_type = (unsigned short)(CoffType | (DT_FCN << 4));\r
+    pEntry->n_sclass = C_EXT;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;   /* point to aux entry */\r
+    pAux = (union auxent *)pEntry; \r
+    pAux->x_sym.x_tagndx = SymbolIndex + 1; /* point to the .bf entry index */\r
+    // wrong!\r
+    // pAux->x_sym.x_misc.x_lnsz.x_lnno = ci->ListOfLineNumbers.TotalBytes; /* Relative Fixup point to where line numbers start */\r
+    // pAux->x_sym.x_misc.x_lnsz.x_size = 0; /* UNKNOWN till next function called */\r
+    pAux->x_sym.x_misc.x_fsize = 0; /* unknown till end */\r
+    pAux->x_sym.x_fcnary.x_fcn.x_lnnoptr = ci->ListOfLineNumbers.TotalBytes; /* relative offset to line number entry */\r
+    pAux->x_sym.x_fcnary.x_fcn.x_endndx = 0; /* index to next entry */\r
+\r
+    /* Now add function entry into the line number table */\r
+    /* Allocate Symbol Table entry and fill it in */\r
+    pln = (struct lineno *)AllocateListObject(&ci->ListOfLineNumbers, sizeof(struct lineno)  );\r
+    if ( !pln ) {\r
+        fprintf(stderr, "\nOut of memory allocating lineno table for function %s", pName );\r
+        return( False );\r
+    }\r
+    pln->l_lnno = 0;\r
+    pln->l_addr.l_symndx = SymbolIndex;\r
+\r
+    /* Initialize the FunctionStartLine from the beginning of the function */\r
+    ci->FunctionStartLine = 0;\r
+\r
+    /* Allocate Symbol Table entry and fill it in */\r
+    pEntry = (struct syment *)AllocateTwoListObjects( &ci->ListOfSymbols, sizeof(struct syment) * 2 );\r
+    if ( !pEntry ) {\r
+        fprintf(stderr, "\nOut of memory allocating symbol table entry .bf for function %s", pName );\r
+        return( False );\r
+    }\r
+    memset( pEntry->n_name, 0, 8 );\r
+    strcpy( pEntry->n_name, ".bf" );\r
+    pEntry->n_value = Address * 2;  /* bytes not words */\r
+    pEntry->n_scnum = 1;    /* .text */\r
+    pEntry->n_type = 0;\r
+    pEntry->n_sclass = C_FCN;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;   /* point to aux entry */\r
+    pAux = (union auxent *)pEntry; \r
+    pAux->x_sym.x_misc.x_lnsz.x_lnno = 0;   /* UNKNOWN - post process */\r
+    pAux->x_sym.x_misc.x_lnsz.x_size = 0;   /* UNKNOWN - post process */\r
+\r
+    ci->NeedLineNumberFixup++; /* once for function C_EXT symbol */\r
+    ci->NeedLineNumberFixup++; /* once for .bf block */\r
+    return( True );\r
+}\r
+/****************************************************************************************/\r
+\r
+int stab_add_global( struct prog_info *pi, char *pName, char *pType ){\r
+\r
+    int n, Address, IsArray, SymbolIndex;\r
+    unsigned short CoffType, Type;\r
+    struct syment *pEntry;\r
+    char *p;\r
+    STABCOFFMAP *pMap;\r
+\r
+\r
+    n = strlen( pName );    /* see if it's 8 bytes or less */\r
+    Type = atoi(pType + 1);     /* skip past G, predefined variable type */\r
+    if ( (CoffType = GetCoffType( Type )) == 0 ) {\r
+        fprintf(stderr, "\nUnrecognized type found for global %s = %d", pName, Type );\r
+        return(False);\r
+    }\r
+    pMap = (STABCOFFMAP *)GetCurrentListObject( &ci->ListOfTypes );\r
+\r
+    SymbolIndex = ci->ListOfSymbols.TotalItems;\r
+    /* Allocate Symbol Table entry and fill it in, Auxiliary table if its an array */\r
+    if ( IsTypeArray( CoffType ) == True ) {\r
+        IsArray = True;\r
+        pEntry = (struct syment *)AllocateTwoListObjects( &ci->ListOfGlobals, sizeof(struct syment) * 2 );\r
+    } else {\r
+        IsArray = False;\r
+        pEntry = (struct syment *)AllocateListObject( &ci->ListOfGlobals, sizeof(struct syment) );\r
+    }\r
+    if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding local %s to string table", pName );\r
+    }\r
+    /* set value field to be address of label in bytes */\r
+    /* add underscore to lookup label */\r
+    if ( (p = calloc( 1, n + 2)) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding global %s", pName );\r
+        return(False);\r
+    }\r
+    *p = '_';\r
+    strcpy( p + 1, pName ); \r
+    if ( !get_symbol(pi, p, &Address) ) {\r
+        fprintf(stderr, "\nUnable to locate global %s", p );\r
+        free( p );\r
+        return( False );\r
+    }\r
+    free( p );\r
+    pEntry->n_value = Address;  /* already in bytes */\r
+    if ( ci->GlobalStartAddress == -1 ) {\r
+        ci->GlobalStartAddress = Address;\r
+    }\r
+    if ( Address < ci->GlobalStartAddress )\r
+        ci->GlobalStartAddress = Address;\r
+    if ( Address > ci->GlobalEndAddress )\r
+        ci->GlobalEndAddress = Address;\r
+\r
+    pEntry->n_scnum = 2;    /* .bss */\r
+    pEntry->n_type = CoffType;\r
+    pEntry->n_sclass = C_STAT;\r
+    if ( IsArray == False )\r
+        pEntry->n_numaux = 0;\r
+    else {\r
+        pEntry->n_numaux = 1;\r
+        pEntry++;\r
+        AddArrayAuxInfo( (union auxent *)pEntry, (unsigned short)SymbolIndex, pMap );\r
+    }\r
+    return( True );\r
+}\r
+\r
+/****************************************************************************************/\r
+int stab_add_local(  struct prog_info *pi, char *pName, char *pType, char *pOffset  ){\r
+\r
+    int n, Offset, IsArray;\r
+    unsigned short CoffType, Type, SymbolIndex;\r
+    struct syment *pEntry;\r
+    STABCOFFMAP *pMap;\r
+\r
+    n = strlen( pName );    /* see if it's 8 bytes or less */\r
+    Type = atoi(pType);     /* predefined variable type */\r
+    Offset = atoi(pOffset); /* offset in stack frame */\r
+    if ( (CoffType = GetCoffType( Type )) == 0 ) {\r
+        fprintf(stderr, "\nUnrecognized type found for local %s = %d", pName, Type );\r
+        return(False);\r
+    }\r
+    pMap = (STABCOFFMAP *)GetCurrentListObject( &ci->ListOfTypes );\r
+    SymbolIndex = ci->ListOfSymbols.TotalItems;\r
+    /* Allocate Symbol Table entry and fill it in, Auxiliary table if its an array */\r
+    if ( IsTypeArray( CoffType ) == True ) {\r
+        IsArray = True;\r
+        pEntry = (struct syment *)AllocateTwoListObjects( &ci->ListOfGlobals, sizeof(struct syment) * 2 );\r
+    } else {\r
+        IsArray = False;\r
+        pEntry = (struct syment *)AllocateListObject( &ci->ListOfSymbols, sizeof(struct syment) );\r
+    }\r
+    if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding local %s to string table", pName );\r
+    }\r
+    pEntry->n_type = CoffType;\r
+    pEntry->n_sclass = C_AUTO;\r
+    pEntry->n_scnum = N_ABS;\r
+    pEntry->n_value = Offset + 1; /* Silly avr studio is set in its ways */\r
+    if ( IsArray == False )\r
+        pEntry->n_numaux = 0;\r
+    else {\r
+        pEntry->n_numaux = 1;\r
+        pEntry++;\r
+        AddArrayAuxInfo( (union auxent *)pEntry, SymbolIndex, pMap );\r
+    }\r
+    return( True );\r
+}\r
+\r
+/****************************************************************************************/\r
+int stab_add_parameter_symbol( struct prog_info *pi, char *pName, char *pType, char *pOffset  ){\r
+\r
+    int n, Offset;\r
+    unsigned short CoffType, Type;\r
+    struct syment *pEntry;\r
+\r
+    n = strlen( pName );    /* see if it's 8 bytes or less */\r
+    Type = atoi(pType);     /* predefined variable type */\r
+    Offset = atoi(pOffset); /* offset in stack frame */\r
+    if ( (CoffType = GetCoffType( Type )) == 0 ) {\r
+        fprintf(stderr, "\nUnrecognized type found for %s = %d", pName, Type );\r
+        return(False);\r
+    }\r
+    /* Allocate Symbol Table entry and fill it in */\r
+    pEntry = (struct syment *)AllocateListObject( &ci->ListOfSymbols, sizeof(struct syment) );\r
+    if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding local %s to string table", pName );\r
+    }\r
+    pEntry->n_type = CoffType;\r
+    pEntry->n_sclass = C_ARG;\r
+    pEntry->n_scnum = N_ABS;\r
+    pEntry->n_value = Offset;\r
+    pEntry->n_numaux = 0;\r
+    return( True );\r
+}\r
+/****************************************************************************************/\r
+int stab_add_static_symbol(  struct prog_info *pi, char *pName, char *pType, char *pLabel  ){\r
+\r
+    int n, Address;\r
+    unsigned short CoffType, Type;\r
+    struct syment *pEntry;\r
+\r
+    n = strlen( pName );    /* see if it's 8 bytes or less */\r
+    Type = atoi(pType + 1);     /* skip past S, predefined variable type */\r
+    if ( (CoffType = GetCoffType( Type )) == 0 ) {\r
+        fprintf(stderr, "\nUnrecognized type found for %s = %d", pName, Type );\r
+        return(False);\r
+    }\r
+    /* Allocate Symbol Table entry and fill it in */\r
+    pEntry = (struct syment *)AllocateListObject( &ci->ListOfSymbols, sizeof(struct syment) );\r
+    if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding local %s to string table", pName );\r
+    }\r
+    pEntry->n_type = CoffType;\r
+    pEntry->n_sclass = C_STAT;\r
+    pEntry->n_scnum = N_ABS;\r
+    if ( !get_symbol(pi, pLabel, &Address) ) {\r
+        fprintf(stderr, "\nUnable to locate label %s", pLabel );\r
+        return( False );\r
+    }\r
+    pEntry->n_value = Address * 2;  /* find address of variable in bytes */\r
+    pEntry->n_numaux = 0;\r
+    return( True );\r
+}\r
+/****************************************************************************************/\r
+\r
+int stab_add_local_register(  struct prog_info *pi, char *pName, char *pType, char *pRegister  ){\r
+\r
+    int n, Register, Size;\r
+    unsigned short CoffType, Type;\r
+    struct syment *pEntry;\r
+\r
+    n = strlen( pName );    /* see if it's 8 bytes or less */\r
+    Type = (unsigned short)atoi(pType + 1);     /* skip past P, predefined variable type */\r
+    Register = atoi(pRegister); /* offset in stack frame */\r
+    if ( (CoffType = GetCoffType( Type )) == 0 ) {\r
+        fprintf(stderr, "\nUnrecognized type found for %s = %d", pName, Type );\r
+        return(False);\r
+    }\r
+    Size = GetCoffTypeSize( Type ); /* Silly requirement for avr studio */\r
+    /* Allocate Symbol Table entry and fill it in */\r
+    pEntry = (struct syment *)AllocateListObject( &ci->ListOfSymbols, sizeof(struct syment) );\r
+    if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding local %s to string table", pName );\r
+        return(False);\r
+    }\r
+    pEntry->n_type = CoffType;\r
+    // if( (*pType == 'r') || (*pType == 'R') )\r
+    //         pEntry->n_sclass = C_REG;\r
+    // else if( (*pType == 'p') || (*pType == 'P') )\r
+    pEntry->n_sclass = C_REGPARM;   /* Silly avr studio only accepts this for registers */\r
+    // else{\r
+    //     fprintf(stderr,"\nUnknown register type -> %s", pType );\r
+    //         return(False);\r
+    // }\r
+    pEntry->n_scnum = N_ABS;\r
+    pEntry->n_numaux = 0;\r
+    if ( Size == 1 )\r
+        pEntry->n_value = 0xffffff00 | Register; /* Silly requirement for avr studio */\r
+    else if ( Size == 2 )\r
+        pEntry->n_value = 0xffff0000 | ((Register + 1) << 8) | Register; /* Silly requirement for avr studio */\r
+    else if ( Size == 4 )\r
+        pEntry->n_value = ((Register + 3) << 24) | ((Register + 3) << 16) | ((Register + 1) << 8) | Register; /* Silly requirement for avr studio */\r
+    else {\r
+        fprintf(stderr,"\nUnknown register size (%d) and coff type (%d)", Size, CoffType );\r
+        return(False);\r
+    }\r
+    return( True );\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+int stab_add_local_type( char *pName, char *pType ){\r
+\r
+    char *p;\r
+    unsigned short StabType;\r
+\r
+    /* .stabs "int:t1=r1;-128;127;",128,0,0,0 */\r
+    /* .stabs ":t20=ar1;0;1;21=ar1;0;1;2",128,0,0,0 */\r
+    /* pType-----^                                   */\r
+    /* Stab Type - convert to Coff type at end (after inline assignments */\r
+    if ( GetStabType( pType, &StabType, &p ) != True ) {\r
+        fprintf(stderr,"\nInvalid tag type found in structure item -> %s", p);\r
+        return(False);      \r
+    }\r
+\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+int GetStructUnionTagItem( char *p, char **pEnd, char **pName, unsigned short *pType, unsigned short *pBitOffset, unsigned short *pBitSize) {\r
+\r
+    unsigned short StabType;\r
+    /* Structure or Union Tag Item consists of -> name:type,bitoffset,bitsize; */\r
+\r
+    /* name */\r
+    *pName = p;\r
+    while ( *p && (*p != ':') ) p++; // locate colon\r
+    if ( *p != ':' ) {\r
+        fprintf(stderr,"\nNo colon found in structure item ->", p);\r
+        return(False);      \r
+    }\r
+    *p++ = 0; // Asciiz\r
+    /* Stab Type - convert to Coff type at end (after inline assignments */\r
+    if ( GetStabType( p, &StabType, &p ) != True ) {\r
+        fprintf(stderr,"\nInvalid tag type found in structure item -> %s", p);\r
+        return(False);      \r
+    }\r
+\r
+    /* BitSize */\r
+    if ( *p != ',' ) {\r
+        fprintf(stderr,"\nNo Bit size found in structure item -> %s", p );\r
+        return(False);      \r
+    }\r
+    *pBitOffset = (unsigned short)atoi( ++p );\r
+    while ( *p && (*p >= '0') && (*p <= '9') ) p++; // locate end of digits\r
+\r
+    /* BitOffset */\r
+    if ( *p != ',' ) {\r
+        fprintf(stderr,"\nNo Bit offset found in structure item -> %s", p );\r
+        return(False);      \r
+    }\r
+    *pBitSize =  (unsigned short)atoi( ++p );\r
+    while ( *p && (*p >= '0') && (*p <= '9') ) p++; // locate end of digits\r
+\r
+    /* Now convert stab type to COFF */\r
+    if ( (*pType = GetCoffType( (unsigned short)StabType)) == 0 ) {\r
+        fprintf(stderr,"\nNo COFF type found for stab type %d", StabType );\r
+        return(   False);          \r
+    }\r
+    if ( *++p == ';' ) /* Now eat last semicolon(s) */\r
+        p++;\r
+    *pEnd = p;\r
+\r
+    return( True );\r
+}\r
+/****************************************************************************************/\r
+\r
+int GetEnumTagItem( char *p, char **pEnd, char **pEnumName, int *pEnumValue ) {\r
+\r
+    /* Enum Tag Item consists of -> member1:value,member2:value2,; */\r
+    *pEnumName = p;\r
+    while ( *p && (*p != ':') ) p++; // locate colon\r
+    if ( *p != ':' ) {\r
+        fprintf(stderr,"\nNo colon found in enum item ->", p);\r
+        return(False);      \r
+    }\r
+    *p++ = 0; // Asciiz\r
+    *pEnumValue = atoi(p);\r
+\r
+    while ( *p && (*p >= '0') && (*p <= '9') ) p++; // locate end of digits\r
+    if ( *p != ',' ) {\r
+        fprintf(stderr,"\nNo comma found after enum value -> %s", p );\r
+        return(False);      \r
+    }\r
+    if ( *++p ==';' )\r
+        p++; /* eat last semicolon */\r
+    *pEnd = p;\r
+    return( True );\r
+}\r
+\r
+/****************************************************************************************/\r
+int GetArrayType( char *p, char **pEnd, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels ){\r
+\r
+    int MinIndex, MaxIndex, Result, Size, i;\r
+    char *pMinIndex, *pMaxIndex, *pType;\r
+    unsigned short Type;\r
+\r
+    Result = True;\r
+\r
+    pMinIndex = pMaxIndex = pType = 0;    \r
+    while ( *p && (*p != ';') ) p++;   /* find min index */\r
+    pMinIndex = ++p;\r
+    while ( *p && (*p != ';') ) p++;   /* find max index */\r
+    pMaxIndex = ++p;\r
+    while ( *p && (*p != ';') ) p++;   /* find type index */\r
+    pType = ++p;\r
+\r
+    /* bump the pointers to the digits */\r
+    if ( !isdigit(*pMinIndex) )\r
+        Result = False;\r
+    if ( !isdigit(*pMaxIndex) )\r
+        Result = False;\r
+    if ( !isdigit(*pType) )\r
+        Result = False;\r
+    /* Is syntax ok ? */\r
+    if ( Result != True ) {\r
+        fprintf(stderr,"\nSyntax error on array parameters %s%s%s", pMinIndex, pMaxIndex, pType );\r
+        return(False);\r
+    }\r
+    MinIndex = atoi(pMinIndex);\r
+    MaxIndex = atoi(pMaxIndex);\r
+\r
+    if ( GetStabType( p, &Type, &p ) != True )\r
+        return(False);\r
+\r
+    if ( !SetupDefinedType( Type, pMap, DerivedBits, ExtraLevels ) )\r
+        return( False );\r
+\r
+    /* Now update the size based on the indicies */\r
+    Size = (MaxIndex - MinIndex) + 1;\r
+    pMap->ByteSize *= Size;\r
+    pMap->Line = ci->CurrentSourceLine;\r
+    /* add the dimension information */\r
+    for ( i = 5; i >= 0; i-- ) {\r
+        if ( pMap->Dimensions[i] != 0 ) {\r
+            i++;\r
+            pMap->Dimensions[i] = Size;\r
+            break;\r
+        }\r
+    }\r
+\r
+    *pEnd = p;\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+int GetStabType( char *p, unsigned short *pType, char **pEnd ) {\r
+\r
+    STABCOFFMAP *pMap;\r
+    int extra, ok;\r
+    unsigned short derivedbits[6];\r
+    unsigned short LStabType, RStabType;\r
+    char *pHigh, *pLow;\r
+\r
+\r
+    LStabType = atoi( p );\r
+    while ( *p && (*p >= '0') && (*p <= '9') ) p++; // locate end of digits\r
+\r
+    *pType = LStabType;\r
+\r
+    if ( GetCoffType( LStabType ) != 0 ) {\r
+        *pEnd = p;\r
+        return(True);\r
+    }\r
+    if ( *p != '=' ) {\r
+        fprintf(stderr, "\nSyntax error in type assignment -> %s", p );\r
+        return(False);\r
+    }\r
+    p++;\r
+\r
+    /* Allocate space for new internal type */\r
+    if ( !(pMap = (STABCOFFMAP *)AllocateListObject(&ci->ListOfTypes, sizeof(STABCOFFMAP)) ) ) {\r
+        fprintf(stderr, "\nOut of memory allocating type info!");\r
+        return(False);\r
+    }\r
+    pMap->StabType = LStabType;\r
+\r
+    /* process items to right of equals */\r
+    for ( extra = 0; extra < 6; extra++ ) {\r
+\r
+        if ( isdigit( *p ) ) {\r
+            /* Finally found base type, try to terminate loop */\r
+            GetStabType( p, &RStabType, &p );\r
+            //                 RStabType = atoi( p );\r
+            while ( *p && (*p >= '0') && (*p <= '9') ) p++; // locate end of digits\r
+            if ( SetupDefinedType( RStabType, pMap, &derivedbits[0], extra ) != True )\r
+                return( False );\r
+            break;\r
+        } else if ( *p == 'a' ) {\r
+            derivedbits[extra] = DT_ARY;\r
+            p++;\r
+            /* Calculate size */\r
+            /* Since type assignment will be made we need to set extra bits here */\r
+            extra++;\r
+            /* =ar1;MinIndex;MaxIndex;BaseType */\r
+            if ( GetArrayType( p, &p, pMap, &derivedbits[0], extra  ) != True )\r
+                return(False);\r
+            break;\r
+\r
+        } else if ( *p == 'f' ) {\r
+            derivedbits[extra] = DT_FCN;\r
+            p++;\r
+        } else if ( *p == '*' ) {\r
+            derivedbits[extra] = DT_PTR;\r
+            p++;\r
+        } else if ( *p == 'r' ) {\r
+            //                 if( LStabType < 15 )\r
+            //                         ok = GetInternalType( pString, pMap ); /* internal types not yet installed */\r
+            //                 else\r
+            while ( *p && (*p != ';' ) ) p++;\r
+            pLow = p++;\r
+            while ( *p && (*p != ';' ) ) p++;\r
+            pHigh = p++;\r
+            ok = GetSubRangeType( LStabType, pMap, pLow, pHigh );\r
+            if ( ok != True )\r
+                return(False);\r
+            while ( *p && (*p != ';' ) ) p++; /* find end of range */\r
+            p++;\r
+            break;\r
+        } else {\r
+            fprintf(stderr, "\nUnrecognized Type modifier %c!", *p );\r
+            return(False);\r
+        }\r
+    }\r
+    *pEnd = p; /* Update return pointer */\r
+\r
+    return(True);\r
+}\r
+\r
+\r
+/****************************************************************************************/\r
+int stab_add_tag_type( char *pName, char *pString ){\r
+\r
+    int SymbolIndex, StabType, TotalSize, n, EnumValue;\r
+    unsigned short TagType, ItemType, BitOffset, BitSize;\r
+    char *p;\r
+    struct syment* pEntry;\r
+    union auxent *pAux;\r
+    STABCOFFMAP *pMap;\r
+\r
+    /* We arrived here due to :T defining either a structure, union or enumeration */\r
+    /* store the basic type as for internals and emit coff structures for debugging */\r
+    /* .stabs "stag:T17=s2i:1,0,8;c:2,8,8;;",128,0,0,0 */\r
+    /* .stabs "2:T18=u2a:2,0,8;b:1,0,8;c:6,0,16;;",128,0,0,0 */\r
+    /* .stabs "1:T19=eenum1:1,enum2:2,enum3:3,;",128,0,0,0 */\r
+    /* we don't care about the name */\r
+\r
+\r
+    /* check for bogus errors */\r
+    if ( !pName || !pString ) {\r
+        fprintf(stderr,"\nInvalid .stabs type format - no information!");\r
+        return(False);\r
+    }\r
+\r
+    p = pString;\r
+    /* Stab Type - convert to Coff type at end (after inline assignments */\r
+    if ( (StabType = (unsigned short)atoi(p)) == 0 ) {\r
+        fprintf(stderr,"\nInvalid .stabs type format - no information! - > %s", p );\r
+        return(False);\r
+    }\r
+    while ( *p && (*p >= '0') && (*p <= '9') ) p++; // locate end of digits\r
+    if ( *p != '=' ) {\r
+        fprintf(stderr,"\nInvalid .stabs type format - no equals - > %s", p );\r
+        return(False);\r
+    }\r
+    SymbolIndex = ci->ListOfSymbols.TotalItems;\r
+    if (  ( pEntry = (struct syment*)AllocateTwoListObjects( &ci->ListOfGlobals, sizeof(struct syment) * 2 ) ) == 0 ) {\r
+        fprintf(stderr, "\nOut of memory allocating symbol tag entries");\r
+        return(False);\r
+    }\r
+    /* Prepare Tag Header */\r
+    if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+        fprintf(stderr,"\nOut of memory adding local %s to string table", pString );\r
+        return(False);\r
+    }\r
+    if ( !(pMap = (STABCOFFMAP *)AllocateListObject(&ci->ListOfTypes, sizeof(STABCOFFMAP)) ) ) {\r
+        fprintf(stderr, "\nOut of memory allocating type info!");\r
+        return(False);\r
+    }\r
+    pMap->StabType = StabType;\r
+    pEntry->n_value = 0;\r
+    pEntry->n_scnum = N_DEBUG;\r
+    pEntry->n_numaux = 1;\r
+    if ( *++p == 's' ) {\r
+        TagType = pEntry->n_type = pMap->CoffType = T_STRUCT;\r
+        pEntry->n_sclass = C_STRTAG;\r
+        TotalSize = (unsigned short)atoi(++p);\r
+    } else if ( *p == 'u' ) {\r
+        TagType = pEntry->n_type = pMap->CoffType = T_UNION;\r
+        pEntry->n_sclass = C_UNTAG;\r
+        TotalSize = (unsigned short)atoi(++p);\r
+    } else if ( *p == 'e' ) {\r
+        TagType = pEntry->n_type = pMap->CoffType = T_ENUM;\r
+        pEntry->n_sclass = C_ENTAG;\r
+        TotalSize = FundamentalTypes[T_INT].Size; /* use size of int for enums */\r
+    } else {\r
+        fprintf(stderr,"\nUnknown tag type -> %s", p );\r
+        return(False);\r
+    }\r
+    while ( *p && (*p >= '0') && (*p <= '9') ) p++; // locate end of digits\r
+    pEntry++;   /* point to aux entry */\r
+    pAux = (union auxent *)pEntry; \r
+    pAux->x_sym.x_tagndx = SymbolIndex; \r
+    pAux->x_sym.x_misc.x_lnsz.x_size = TotalSize;\r
+\r
+    /* update our local knowledge of tag type */\r
+    pMap->CoffType = TagType;\r
+    pMap->ByteSize = TotalSize;\r
+    pMap->Line = ci->CurrentSourceLine;\r
+\r
+    /* Process the items until the end of the line */\r
+    while ( *pName ) {\r
+\r
+        if (  ( pEntry = (struct syment*)AllocateTwoListObjects( &ci->ListOfGlobals, sizeof(struct syment) * 2 ) ) == 0 ) {\r
+            fprintf(stderr, "\nOut of memory allocating symbol tag member entries");\r
+            return(False);\r
+        }\r
+\r
+        if ( TagType == T_STRUCT ) {\r
+            if ( GetStructUnionTagItem( p, &p, &pName, &ItemType, &BitOffset, &BitSize) != True ) {\r
+                return(False);\r
+            }\r
+            pEntry->n_value = BitOffset/8;\r
+            pEntry->n_type = ItemType;\r
+            pEntry->n_sclass = C_MOS;\r
+        } else if ( TagType == T_UNION ) {\r
+            if ( GetStructUnionTagItem(  p, &p, &pName, &ItemType, &BitOffset, &BitSize) != True ) {\r
+                return(False);\r
+            }\r
+            pEntry->n_value = BitOffset/8;\r
+            pEntry->n_type = ItemType;\r
+            pEntry->n_sclass = C_MOU;\r
+        } else { /* T_ENUM */\r
+            if ( GetEnumTagItem( p, &p, &pName, &EnumValue ) != True ) {\r
+                return(False);\r
+            }\r
+            pEntry->n_value = EnumValue;\r
+            pEntry->n_type = TotalSize;\r
+            pEntry->n_sclass = C_MOE;\r
+        }\r
+\r
+        /* Prepare Common Tag Header items */\r
+        if ( (n = AddNameToEntry( pName, pEntry )) == 0 ) {\r
+            fprintf(stderr,"\nOut of memory adding local %s to string table", pString );\r
+            return(False);\r
+        }\r
+        pEntry->n_scnum = N_ABS;\r
+        pEntry->n_numaux = 1;\r
+        pEntry++;   /* point to aux entry */\r
+        pAux = (union auxent *)pEntry; \r
+        pAux->x_sym.x_tagndx = SymbolIndex; \r
+        pAux->x_sym.x_misc.x_lnsz.x_size = TotalSize;\r
+        pName = p;\r
+    }\r
+\r
+    /* End of Structures/Unions/Enumberations */\r
+    if (  ( pEntry = (struct syment*)AllocateTwoListObjects( &ci->ListOfGlobals, sizeof(struct syment) * 2 ) ) == 0 ) {\r
+        fprintf(stderr, "\nOut of memory allocating special headers for structure!");\r
+        return(False);\r
+    }\r
+    strcpy( pEntry->n_name, ".eos" );\r
+    pEntry->n_value = TotalSize;\r
+    pEntry->n_scnum = N_ABS;\r
+    pEntry->n_type = 0;\r
+    pEntry->n_sclass = C_EOS;\r
+    pEntry->n_numaux = 1;\r
+    pEntry++;   /* point to aux entry */\r
+    pAux = (union auxent *)pEntry; \r
+    pAux->x_sym.x_tagndx = SymbolIndex; /* point to the .bf entry index */\r
+    pAux->x_sym.x_misc.x_lnsz.x_size = TotalSize;\r
+\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+int SetupDefinedType( unsigned short Type, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels ){\r
+\r
+    int i, Dlimit, Dstart;\r
+    unsigned short StabType;\r
+\r
+    StabType = pMap->StabType; /* save the new type we found earlier */\r
+    if ( CopyStabCoffMap( Type, pMap ) != True ) {\r
+        fprintf(stderr, "\nCould not find defined type %d", Type );\r
+        return(False);\r
+    }\r
+    pMap->StabType = StabType; /* save the new type we found earlier */\r
+\r
+    /* Determine existing derived types for base class */\r
+    for ( i = 0; i < 6; i++ ) {\r
+        if ( (pMap->CoffType & ( 3 << (4 + i + i))) == 0 )\r
+            break;\r
+    }\r
+    Dstart = i;\r
+    Dlimit = i + ExtraLevels;\r
+    if ( (Dlimit) >= 6 ) {\r
+        fprintf(stderr, "\nStab Type %d has too many derived (%d) types!", pMap->StabType, Dlimit );\r
+        return(False);\r
+    }\r
+    /* Add the new derived levels */\r
+    for ( ; i < Dlimit; i++ ) {\r
+        pMap->CoffType |= ( ( DerivedBits[i - Dstart] & 3) << (4 + i + i) ); /* add in the derived bits */\r
+    }\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+int GetArrayDefinitions( STABCOFFMAP *pMap , char *pMinIndex, char *pMaxIndex, char *pType, unsigned short *DerivedBits, int ExtraLevels ){\r
+\r
+    int MinIndex, MaxIndex, Result, Size, i;\r
+    unsigned short Type;\r
+\r
+    Result = True;\r
+    if ( (*pMinIndex != ';') || (*pMaxIndex != ';') || (*pType != ';') )\r
+        Result = False;\r
+    /* bump the pointers to the digits */\r
+    pMinIndex++;\r
+    if ( !isdigit(*pMinIndex) )\r
+        Result = False;\r
+    pMaxIndex++;\r
+    if ( !isdigit(*pMaxIndex) )\r
+        Result = False;\r
+    pType++;\r
+    if ( !isdigit(*pType) )\r
+        Result = False;\r
+    /* Is syntax ok ? */\r
+    if ( Result != True ) {\r
+        fprintf(stderr,"\nSyntax error on array parameters %s%s%s", pMinIndex, pMaxIndex, pType );\r
+        return(False);\r
+    }\r
+    MinIndex = atoi(pMinIndex);\r
+    MaxIndex = atoi(pMaxIndex);\r
+    Type = (unsigned short)atoi(pType);\r
+    if (    SetupDefinedType(    Type,    pMap,    DerivedBits,    ExtraLevels    )    !=    True    )\r
+        return( False );\r
+    /* Now update the size based on the indicies */\r
+    Size = (MaxIndex - MinIndex) + 1;\r
+    pMap->ByteSize *= Size;\r
+    pMap->Line = ci->CurrentSourceLine;\r
+    /* add the dimension information */\r
+    for ( i = 5; i >= 0; i-- ) {\r
+        if ( pMap->Dimensions[i] != 0 ) {\r
+            i++;\r
+            pMap->Dimensions[i] = Size;\r
+            break;\r
+        }\r
+    }\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+int GetInternalType( char *pName, STABCOFFMAP *pMap ){\r
+\r
+    int n, found, i;\r
+\r
+    if ( !pName ) {\r
+        return(False);\r
+    }\r
+\r
+    found = False;\r
+    n = strlen(pName);\r
+    /* Find out if it is a local type */\r
+    for (i = 0; FundamentalTypes[i].pString != 0; i++) {\r
+        if ( !strncmp(pName, FundamentalTypes[i].pString, n) ) {\r
+            /* found an internal type */\r
+            pMap->CoffType = FundamentalTypes[i].Type;\r
+            pMap->ByteSize = FundamentalTypes[i].Size;\r
+            found = True;\r
+        }\r
+    }\r
+    return(found);\r
+}\r
+\r
+/****************************************************************************************/\r
+int GetSubRangeType( unsigned short Type, STABCOFFMAP *pMap , char *pLow, char *pHigh ){\r
+\r
+    int Result, i;\r
+    long High, Low;\r
+    unsigned long Test;\r
+\r
+    Result = True;\r
+    if ( (*pLow != ';') || (*pHigh != ';') || (Type <= 0) )\r
+        Result = False;\r
+\r
+    /* Is syntax ok ? */\r
+    if ( Result != True ) {\r
+        fprintf(stderr,"\nSyntax error on sub range parameters!" );\r
+        return(False);\r
+    }\r
+    Low = atol(++pLow);\r
+    High = atol(++pHigh);\r
+\r
+    /* Special handling of type void */\r
+    if ( (Low == 0) && (High == 0) ) {\r
+        /* Declare type void */\r
+        pMap->ByteSize =0;\r
+        pMap->CoffType = T_VOID;\r
+        pMap->Line = ci->CurrentSourceLine;\r
+        return(True);\r
+    }\r
+\r
+    if ( (pMap->CoffType = GetCoffType( Type )) != 0 ) {\r
+        pMap->ByteSize = GetCoffTypeSize( Type );\r
+    } else {\r
+        /* Try to base everything off integer */\r
+        pMap->ByteSize = FundamentalTypes[T_INT].Size;\r
+    }\r
+\r
+    /* Now calculate the byte size */\r
+    if ( High == 0 ) {\r
+        pMap->ByteSize = (unsigned short)Low; /* floating point */\r
+    } else {\r
+        if ( Low == 0 ) {\r
+            /* Unsigned */\r
+            Test = (unsigned long)High;\r
+        } else if ( Low < 0 ) {\r
+            /* signed */\r
+            Test = (unsigned long)High << 1;\r
+        } else {\r
+            if ( Low <= High )\r
+                Test = (unsigned long)High;\r
+            else\r
+                Test = (unsigned long)Low;\r
+        }\r
+        if ( pMap->ByteSize == 0 ) {\r
+            fprintf(stderr,"\nType Range Error 1, need previous type %d size!", pMap->CoffType );\r
+            return(False);\r
+        }\r
+        for ( i = 0; i < sizeof(unsigned long); i++ ) {\r
+            if ( !(Test & (0xff << (i * 8))) )\r
+                break;\r
+        }\r
+        pMap->ByteSize = i; \r
+    }\r
+    /* Now determine the best fit based on byte size, compare against IAR Compiler */\r
+    if ( pMap->ByteSize == 1 ) {\r
+        if ( Low < 0 )\r
+            pMap->CoffType = T_CHAR;\r
+        else\r
+            pMap->CoffType = T_UCHAR;\r
+    } else if ( pMap->ByteSize == 2 ) {\r
+        if ( Low < 0 )\r
+            pMap->CoffType = T_INT;\r
+        else\r
+            pMap->CoffType = T_UINT;\r
+    } else if ( pMap->ByteSize == 4 ) {\r
+        if ( Low == 0 )\r
+            pMap->CoffType = T_FLOAT;\r
+        if ( Low < 0 )\r
+            pMap->CoffType = T_LONG;\r
+        else\r
+            pMap->CoffType = T_ULONG;\r
+    } else {\r
+        fprintf(stderr,"\nGetSubRangeType failure - byte size %d", pMap->ByteSize );\r
+        return(False);\r
+    }\r
+    return(True);\r
+}\r
+\r
+/****************************************************************************************/\r
+int CopyStabCoffMap( unsigned short StabType, STABCOFFMAP *pMap ){\r
+\r
+    STABCOFFMAP *p;\r
+\r
+    for ( p = FindFirstListObject( &ci->ListOfTypes ); p != 0; p = FindNextListObject( &ci->ListOfTypes) ) {\r
+        if ( p->StabType == StabType ) {\r
+            memcpy( pMap, p, sizeof(STABCOFFMAP) );\r
+            return(True);\r
+        }\r
+    }\r
+    return( False ); /* Nothing found */\r
+}\r
+\r
+/****************************************************************************************/\r
+unsigned short GetCoffType( unsigned short StabType ){\r
+\r
+    STABCOFFMAP *p;\r
+\r
+    for ( p = FindFirstListObject( &ci->ListOfTypes ); p != 0; p = FindNextListObject( &ci->ListOfTypes) ) {\r
+        if ( p->StabType == StabType )\r
+            return( p->CoffType );\r
+    }\r
+    return( 0 ); /* Nothing found */\r
+}\r
+\r
+/****************************************************************************************/\r
+unsigned short GetCoffTypeSize( unsigned short StabType ){\r
+\r
+    STABCOFFMAP *p;\r
+\r
+    for ( p = FindFirstListObject( &ci->ListOfTypes ); p != 0; p = FindNextListObject( &ci->ListOfTypes) ) {\r
+        if ( p->StabType == StabType )\r
+            return( p->ByteSize );\r
+    }\r
+    return( 0 ); /* Nothing found */\r
+}\r
+\r
+\r
+/****************************************************************************************/\r
+int GetDigitLength( char *p ){\r
+\r
+    int i;\r
+\r
+    if ( p == 0 )\r
+        return(0);\r
+\r
+    for ( i = 0; (*p != 0) && ( *p >= '0' ) && ( *p <= '9' ); i++ );\r
+\r
+    return( i );\r
+\r
+}\r
+\r
+/****************************************************************************************/\r
+int GetStringDelimiters( char *pString, char **pTokens, int MaxTokens ){\r
+\r
+    int i;\r
+    char *p;\r
+\r
+    p = pString;\r
+\r
+    if ( !p )\r
+        return( 0 );\r
+\r
+    for ( i = 0; i < MaxTokens; i++ ) {\r
+        while ( True ) {\r
+            if ( (*p == ':') || (*p == ';') || (*p == '=') || (*p == ',') || (*p == '"') || (*p == 0 ) ) {\r
+                *(pTokens + i) = p; /* Remember this location */\r
+                p++;\r
+                if ( *p == 0 )\r
+                    return( i );\r
+                break;\r
+            }\r
+            p++;\r
+        }\r
+    }\r
+    return( i );\r
+}\r
+\r
+/****************************************************************************************/\r
+int IsTypeArray( unsigned short CoffType ){\r
+\r
+    int Result;\r
+\r
+    Result = False;\r
+\r
+    if ( (CoffType & (DT_ARY << 4 )) == (DT_ARY << 4 ) )\r
+        Result = True;\r
+    if ( (CoffType & (DT_ARY << 6 )) == (DT_ARY << 6 ) )\r
+        Result = True;\r
+    if ( (CoffType & (DT_ARY << 8 )) == (DT_ARY << 8 ) )\r
+        Result = True;\r
+    if ( (CoffType & (DT_ARY << 10 )) == (DT_ARY << 10 ) )\r
+        Result = True;\r
+    if ( (CoffType & (DT_ARY << 12 )) == (DT_ARY << 12 ) )\r
+        Result = True;\r
+    if ( (CoffType & (DT_ARY << 14 )) == (DT_ARY << 14 ) )\r
+        Result = True;\r
+\r
+    return(Result);\r
+}\r
+\r
+/****************************************************************************************/\r
+void AddArrayAuxInfo( union auxent *pAux, unsigned short SymbolIndex, STABCOFFMAP *pMap ){\r
+\r
+    int i;\r
+\r
+    pAux->x_sym.x_tagndx = SymbolIndex; /* point to the .bf entry index */\r
+    pAux->x_sym.x_misc.x_lnsz.x_lnno =  pMap->Line;\r
+    pAux->x_sym.x_misc.x_lnsz.x_size = pMap->ByteSize;\r
+    for ( i = 0; i < 4; i++ )\r
+        pAux->x_sym.x_fcnary.x_ary.x_dimen[i] = pMap->Dimensions[i];\r
+}\r
+\r
+/****************************************************************************************/\r
+int AddNameToEntry( char *pName, struct syment *pEntry ) {\r
+\r
+    int n;\r
+    char *p;\r
+\r
+    n = strlen( pName );    /* see if it's 8 bytes or less */\r
+    if ( n <= 8 ) {\r
+        strncpy( pEntry->n_name, pName, 8 );\r
+    } else {\r
+        /* point to current offset in string table */\r
+        pEntry->n_offset = ci->ListOfStrings.TotalBytes;        \r
+        /* Allocate string table entry */\r
+        if ( (p = (char *)AllocateListObject( &ci->ListOfStrings, n + 1 )) == 0 ) {\r
+            return(0);\r
+        }\r
+        strcpy( p, pName );\r
+    }\r
+    return(n); /* return size of string */\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+char *SkipPastDigits( char *p ){\r
+\r
+    if ( !p )\r
+        return(p);\r
+    if ( *p == 0 );\r
+    return(p);\r
+    for ( p--; (*p >= '0') && (*p <= '9') && (*p != 0); p-- );\r
+    return(p);\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+/****************************************************************************************/\r
+/****************************************************************************************/\r
+/* List management routines */\r
+/****************************************************************************************/\r
+/****************************************************************************************/\r
+\r
+/****************************************************************************************/\r
+\r
+/****************************************************************************************/\r
+void InitializeList( LISTNODEHEAD *pHead ){\r
+\r
+    pHead->Node.Next = &pHead->Node;\r
+    pHead->Node.Last = &pHead->Node;\r
+    pHead->TotalBytes = 0;\r
+    pHead->TotalItems = 0;\r
+    pHead->current = &pHead->Node;\r
+    return;\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+void *AllocateTwoListObjects( LISTNODEHEAD *pHead, int size ){\r
+\r
+    void *p;\r
+\r
+    if ( (p = AllocateListObject( pHead, size ) ) )\r
+        pHead->TotalItems++;   /* already incremented once in addtolist */\r
+    return( p );\r
+}\r
+\r
+/****************************************************************************************/\r
+void *AllocateListObject( LISTNODEHEAD *pHead, int size ){\r
+\r
+    void *pObject;\r
+\r
+    LISTNODE *pNode;\r
+\r
+    if ( (pObject = calloc( 1, size )) != 0 ) {\r
+        if ( !(pNode = AddListObject( pHead, pObject, size )) ) {\r
+            free( pObject );\r
+            pObject = 0;\r
+        }\r
+    }\r
+    return( pObject );\r
+}\r
+\r
+/****************************************************************************************/\r
+LISTNODE  *AddListObject(LISTNODEHEAD *pHead, void *pObject, int size ){\r
+\r
+    LISTNODE *pNode;\r
+\r
+    if ( (pNode = calloc( 1, sizeof(LISTNODE) )) != 0 ) {\r
+        pNode->pObject = pObject;\r
+        pNode->Size = size;\r
+        pNode->FileNumber = ci->CurrentFileNumber;\r
+        AddNodeToList( pHead, pNode );\r
+    }\r
+    return( pNode );\r
+}\r
+\r
+/****************************************************************************************/\r
+LISTNODE *AllocateListNode( void *pObject, int size ){\r
+\r
+    LISTNODE *pNew;\r
+\r
+    if ( (pNew = calloc( 1, sizeof( LISTNODE ) ) ) != 0 ) {\r
+        /* Then we initialize the node */\r
+        pNew->pObject = pObject;\r
+        pNew->Size = size;\r
+        pNew->FileNumber = ci->CurrentFileNumber;\r
+    }\r
+    return(pNew);\r
+}\r
+\r
+/****************************************************************************************/\r
+void AddNodeToList( LISTNODEHEAD *pHead, LISTNODE *pNode ){\r
+\r
+    LISTNODE *p;\r
+\r
+    p = &pHead->Node;\r
+\r
+    pNode->Next = p->Last->Next;\r
+    p->Last->Next = pNode;\r
+    pNode->Last = p->Last;\r
+    p->Last = pNode;\r
+\r
+    /* and update current size of data contained in the list */\r
+    pHead->TotalBytes += pNode->Size;\r
+    pHead->TotalItems++;\r
+}\r
+\r
+/****************************************************************************************/\r
+void RemoveNodeFromList( LISTNODEHEAD *pHead, LISTNODE *pNode ){\r
+\r
+    pNode->Last->Next = pNode->Next;\r
+    pNode->Next->Last = pNode->Last;\r
+\r
+    pHead->TotalBytes -= pNode->Size;\r
+    pHead->TotalItems--;\r
+}\r
+\r
+\r
+/****************************************************************************************/\r
+void *FindFirstListObject( LISTNODEHEAD *pHead ){\r
+\r
+    if ( pHead->Node.Next == &pHead->Node )\r
+        return(0);  /* Nothing in list */\r
+\r
+    pHead->current = pHead->Node.Next;\r
+    return( pHead->current->pObject );\r
+}\r
+/****************************************************************************************/\r
+void *FindNextListObject( LISTNODEHEAD *pHead ){\r
+\r
+    if ( pHead->current->Next == &pHead->Node )\r
+        return( 0 );\r
+\r
+    pHead->current = pHead->current->Next;\r
+\r
+    return( pHead->current->pObject );\r
+}\r
+/****************************************************************************************/\r
+\r
+LISTNODE *GetCurrentNode( LISTNODEHEAD *pHead ){\r
+\r
+    return( pHead->current );\r
+}\r
+\r
+/****************************************************************************************/\r
+void *GetCurrentListObject( LISTNODEHEAD *pHead ){\r
+\r
+    return( pHead->current->pObject );\r
+}\r
+\r
+\r
+/****************************************************************************************/\r
+void *FindLastListObject( LISTNODEHEAD *pHead ){\r
+\r
+    if ( pHead->Node.Last == &pHead->Node )\r
+        return(0);  /* Nothing in list */\r
+\r
+    pHead->current = pHead->Node.Last;\r
+    return( pHead->current->pObject );\r
+}\r
+/****************************************************************************************/\r
+void *FindNextLastListObject( LISTNODEHEAD *pHead ){\r
+\r
+    if ( pHead->current->Last == &pHead->Node )\r
+        return( 0 );\r
+\r
+    pHead->current = pHead->current->Last;\r
+\r
+    return( pHead->current->pObject );\r
+}\r
+\r
+/****************************************************************************************/\r
+\r
+void FreeList( LISTNODEHEAD *pHead ){\r
+\r
+    LISTNODE *pNode;\r
+\r
+    for ( pNode = pHead->Node.Last; pNode->Next != &pHead->Node; pNode = pHead->Node.Last ) {\r
+\r
+        RemoveNodeFromList( pHead, pNode );\r
+        free( pNode->pObject );\r
+        free( pNode );\r
+    } \r
+    pHead->TotalBytes = 0;\r
+    pHead->TotalItems = 0;\r
+    pHead->current = &pHead->Node;\r
+}\r
+/****************************************************************************************/\r
+\r
+\r
diff --git a/src/mkutil/avra-0.8/SOURCE/coff.h b/src/mkutil/avra-0.8/SOURCE/coff.h
new file mode 100644 (file)
index 0000000..a397be8
--- /dev/null
@@ -0,0 +1,403 @@
+//\r
+// coff.h - Common Object File Format (COFF) support\r
+//\r
+//     This file was developed for the avra assembler in order to produce COFF output files \r
+//     for use with the Atmel AVR Studio.  The Lean C Compiler (LCC) debugging stabs \r
+//     output was used as input to the assembler.\r
+//\r
+//     This software has absolutely no warrantee!  The money you paid for this will be \r
+//     promptly refunded if not fully satisfied.\r
+//\r
+//     Beta release 1/20/2000 by Bob Harris\r
+//\r
+//     This software has not been fully tested and probably has a few software deficiencies.\r
+//     Some software support may be possible by sending a problem description report to \r
+//     rth@mclean.sparta.com\r
+\r
+#define MAGIC_NUMBER_AVR   0xa12\r
+\r
+#define        N_GSYM  0x20            /* global symbol: name,,0,type,0 */\r
+#define        N_FNAME 0x22            /* procedure name (f77 kludge): name,,0 */\r
+#define        N_FUN   0x24            /* procedure: name,,0,linenumber,address */\r
+#define        N_STSYM 0x26            /* static symbol: name,,0,type,address */\r
+#define        N_LCSYM 0x28            /* .lcomm symbol: name,,0,type,address */\r
+#define N_MAIN  0x2a            /* name of main routine : name,,0,0,0 */\r
+#define N_ROSYM 0x2c           /* ro_data objects */\r
+#define N_OBJ  0x38            /* object file path or name */\r
+#define N_OPT  0x3c            /* compiler options */\r
+#define        N_RSYM  0x40            /* register sym: name,,0,type,register */\r
+#define        N_SLINE 0x44            /* src line: 0,,0,linenumber,address */\r
+#define        N_FLINE 0x4c            /* function start.end */\r
+#define        N_SSYM  0x60            /* structure elt: name,,0,type,struct_offset */\r
+#define N_ENDM 0x62            /* last stab emitted for module */\r
+#define        N_SO    0x64            /* source file name: name,,0,0,address */\r
+#define        N_LSYM  0x80            /* local sym: name,,0,type,offset */\r
+#define        N_BINCL 0x82            /* header file: name,,0,0,0 */\r
+#define        N_SOL   0x84            /* #included file name: name,,0,0,address */\r
+#define        N_PSYM  0xa0            /* parameter: name,,0,type,offset */\r
+#define N_EINCL 0xa2           /* end of include file */\r
+#define        N_ENTRY 0xa4            /* alternate entry: name,linenumber,address */\r
+#define        N_LBRAC 0xc0            /* left bracket: 0,,0,nesting level,address */\r
+#define        N_EXCL  0xc2            /* excluded include file */\r
+#define        N_RBRAC 0xe0            /* right bracket: 0,,0,nesting level,address */\r
+#define        N_BCOMM 0xe2            /* begin common: name,, */\r
+#define        N_ECOMM 0xe4            /* end common: name,, */\r
+#define        N_ECOML 0xe8            /* end common (local name): ,,address */\r
+#define        N_LENG  0xfe            /* second stab entry with length information */\r
+\r
+\r
+/*\r
+ * Type of a symbol, in low N bits of the word\r
+ */\r
+#define T_NULL         0\r
+#define T_VOID         1       /* function argument (only used by compiler) */\r
+#define T_CHAR         2       /* character            */\r
+#define T_SHORT                3       /* short integer        */\r
+#define T_INT          4       /* integer              */\r
+#define T_LONG         5       /* long integer         */\r
+#define T_FLOAT                6       /* floating point       */\r
+#define T_DOUBLE       7       /* double word          */\r
+#define T_STRUCT       8       /* structure            */\r
+#define T_UNION                9       /* union                */\r
+#define T_ENUM         10      /* enumeration          */\r
+#define T_MOE          11      /* member of enumeration*/\r
+#define T_UCHAR                12      /* unsigned character   */\r
+#define T_USHORT       13      /* unsigned short       */\r
+#define T_UINT         14      /* unsigned integer     */\r
+#define T_ULONG                15      /* unsigned long        */\r
+#define T_LNGDBL       16      /* long double          */\r
+\r
+/*\r
+ * derived types, in n_type\r
+*/\r
+#define DT_NON         (0)     /* no derived type */\r
+#define DT_PTR         (1)     /* pointer */\r
+#define DT_FCN         (2)     /* function */\r
+#define DT_ARY         (3)     /* array */\r
+\r
+struct external_filehdr {\r
+       unsigned short f_magic;         /* magic number                 */\r
+       unsigned short f_nscns;         /* number of sections           */\r
+       unsigned long f_timdat; /* time & date stamp            */\r
+       unsigned long f_symptr; /* file pointer to symtab       */\r
+       unsigned long f_nsyms;          /* number of symtab entries     */\r
+       unsigned short f_opthdr;        /* sizeof(optional hdr)         */\r
+       unsigned short f_flags;         /* flags                        */\r
+};\r
+\r
+/* Bits for f_flags:\r
+ *     F_RELFLG        relocation info stripped from file\r
+ *     F_EXEC          file is executable (no unresolved external references)\r
+ *     F_LNNO          line numbers stripped from file\r
+ *     F_LSYMS         local symbols stripped from file\r
+ *     F_AR32WR        file has byte ordering of an AR32WR machine (e.g. vax)\r
+ */\r
+\r
+#define F_RELFLG       (0x0001)\r
+#define F_EXEC         (0x0002)\r
+#define F_LNNO         (0x0004)\r
+#define F_LSYMS                (0x0008)\r
+\r
+/*********************************************************************/\r
+struct external_scnhdr {\r
+       char            s_name[8];      /* section name                 */\r
+       unsigned long           s_paddr;        /* physical address, aliased s_nlib */\r
+       unsigned long           s_vaddr;        /* virtual address              */\r
+       unsigned long           s_size;         /* section size                 */\r
+       unsigned long           s_scnptr;       /* file ptr to raw data for section */\r
+       unsigned long           s_relptr;       /* file ptr to relocation       */\r
+       unsigned long           s_lnnoptr;      /* file ptr to line numbers     */\r
+       unsigned short          s_nreloc;       /* number of relocation entries */\r
+       unsigned short          s_nlnno;        /* number of line number entries*/\r
+       unsigned long           s_flags;        /* flags                        */\r
+};\r
+\r
+#define        SCNHDR  struct external_scnhdr\r
+#define        SCNHSZ  sizeof(SCNHDR)\r
+\r
+/*\r
+ * names of "special" sections\r
+ */\r
+#define _TEXT  ".text"\r
+#define _DATA  ".data"\r
+#define _BSS   ".bss"\r
+#define _COMMENT ".comment"\r
+#define _LIB ".lib"\r
+\r
+/*\r
+ * s_flags "type"\r
+ */\r
+#define STYP_TEXT       (0x0020)       /* section contains text only */\r
+#define STYP_DATA       (0x0040)       /* section contains data only */\r
+#define STYP_BSS        (0x0080)       /* section contains bss only */\r
+\r
+\r
+/*********************************************************************/\r
+\r
+struct lineno\r
+{\r
+   union\r
+   {\r
+             long  l_symndx;  /* symtbl index of func name */\r
+             long  l_paddr;   /* paddr of line number */\r
+   } l_addr;\r
+   unsigned short  l_lnno;    /* line number */\r
+};\r
+\r
+#define LINENO      struct lineno\r
+#define LINESZ      6\r
+\r
+\r
+\r
+#define N_UNDEF        ((short)0)      /* undefined symbol */\r
+#define N_ABS  ((short)-1)     /* value of symbol is absolute */\r
+#define N_DEBUG        ((short)-2)     /* debugging symbol -- value is meaningless */\r
+\r
+/********************** STORAGE CLASSES **********************/\r
+\r
+/* This used to be defined as -1, but now n_sclass is unsigned.  */\r
+#define C_EFCN         0xff    /* physical end of function     */\r
+#define C_NULL         0\r
+#define C_AUTO         1       /* automatic variable           */\r
+#define C_EXT          2       /* external symbol              */\r
+#define C_STAT         3       /* static                       */\r
+#define C_REG          4       /* register variable            */\r
+#define C_EXTDEF       5       /* external definition          */\r
+#define C_LABEL                6       /* label                        */\r
+#define C_ULABEL       7       /* undefined label              */\r
+#define C_MOS          8       /* member of structure          */\r
+#define C_ARG          9       /* function argument            */\r
+#define C_STRTAG       10      /* structure tag                */\r
+#define C_MOU          11      /* member of union              */\r
+#define C_UNTAG                12      /* union tag                    */\r
+#define C_TPDEF                13      /* type definition              */\r
+#define C_USTATIC      14      /* undefined static             */\r
+#define C_ENTAG                15      /* enumeration tag              */\r
+#define C_MOE          16      /* member of enumeration        */\r
+#define C_REGPARM      17      /* register parameter           */\r
+#define C_FIELD                18      /* bit field                    */\r
+#define C_AUTOARG      19      /* auto argument                */\r
+#define C_LASTENT      20      /* dummy entry (end of block)   */\r
+#define C_BLOCK                100     /* ".bb" or ".eb"               */\r
+#define C_FCN          101     /* ".bf" or ".ef"               */\r
+#define C_EOS          102     /* end of structure             */\r
+#define C_FILE         103     /* file name                    */\r
+#define C_LINE         104     /* line # reformatted as symbol table entry */\r
+#define C_ALIAS                105     /* duplicate tag                */\r
+#define C_HIDDEN       106     /* ext symbol in dmert public lib */\r
+\r
+#define E_SYMNMLEN     8       /* # characters in a symbol name        */\r
+#define E_FILNMLEN     14      /* # characters in a file name          */\r
+#define E_DIMNUM       4       /* # array dimensions in auxiliary entry */\r
+\r
+struct syment\r
+{\r
+  union\r
+  {\r
+      char          _n_name[E_SYMNMLEN];  /* symbol name*/\r
+      struct\r
+      {\r
+            long    _n_zeroes;          /* symbol name */\r
+\r
+            long    _n_offset;          /* location in string table */\r
+      } _n_n;\r
+      char          *_n_nptr[2];        /* allows overlaying */\r
+  } _n;\r
+  unsigned long     n_value;            /* value of symbol */\r
+\r
+  short             n_scnum;            /* section number */\r
+\r
+  unsigned short    n_type;             /* type and derived */\r
+\r
+  char              n_sclass;           /* storage class */\r
+\r
+  char              n_numaux;           /* number of aux entries */\r
+};\r
+\r
+#define  n_name          _n._n_name\r
+#define  n_zeroes        _n._n_n._n_zeroes\r
+#define  n_offset        _n._n_n._n_offset\r
+#define  n_nptr          _n._n_nptr[1]\r
+\r
+#define  SYMNMLEN  8\r
+#define  SYMESZ    18                    /* size of a symbol table entry */\r
+\r
+union auxent\r
+{\r
+     struct\r
+     {\r
+           long   x_tagndx;\r
+           union\r
+           {\r
+               struct\r
+               {\r
+                     unsigned short   x_lnno;\r
+                     unsigned short   x_size;\r
+               } x_lnsz;\r
+               long    x_fsize;\r
+           } x_misc;\r
+           union\r
+           {\r
+               struct\r
+               {\r
+                     long    x_lnnoptr;\r
+                     long    x_endndx;\r
+               } x_fcn;\r
+               struct\r
+               {\r
+                     unsigned short   x_dimen[E_DIMNUM];\r
+               } x_ary;\r
+           } x_fcnary;\r
+           unsigned short   x_tvndx;\r
+       } x_sym;\r
+       union\r
+       {\r
+           char   x_fname[E_FILNMLEN];\r
+                       struct {\r
+                               unsigned long x_zeroes;\r
+                               unsigned long x_offset;\r
+                       } x_n;\r
+       } x_file;\r
+       struct\r
+       {\r
+           long   x_scnlen;\r
+           unsigned short   x_nreloc;\r
+           unsigned short   x_nlinno;\r
+       } x_scn;\r
+       struct\r
+       {\r
+           long   x_tvfill;\r
+           unsigned short   x_tvlen;\r
+           unsigned short   x_tvran[2];\r
+       } x_tv;\r
+};\r
+\r
+#define FILNMLEN  14\r
+#define DIMNUM    4\r
+#define AUXENT    union auxent\r
+#define AUXESZ    18\r
+\r
+\r
+/* Coff additions */\r
+typedef struct ListNodeTag{\r
+       struct ListNodeTag *Next;       /* Double Linked List */\r
+       struct ListNodeTag *Last;       /* Double Linked List */\r
+       void *pObject;  /* points to list object */     \r
+       unsigned long Size;\r
+       int FileNumber;         /* corresponds to individual file(s) */\r
+} LISTNODE;\r
+\r
+//#define LISTNODE struct ListNodeTag;\r
+\r
+typedef struct ListNodeHeadTag {\r
+       LISTNODE Node;\r
+//     struct ListNodeTag *Next;       /* Double Linked List */\r
+//     struct ListNodeTag *Last;       /* Double Linked List */\r
+       int TotalBytes; /* size of allocated object(s) */\r
+       int TotalItems; /* number of allocated objects */\r
+       LISTNODE *current;      /* pointer for FindFirst/FindNext */\r
+} LISTNODEHEAD ;\r
+\r
+\r
+typedef struct  {\r
+       unsigned short StabType;\r
+       unsigned short CoffType;\r
+       unsigned short ByteSize;\r
+       unsigned short Line;    /* used by arrays */\r
+       unsigned short Dimensions[6]; /* used by arrays */\r
+} STABCOFFMAP;\r
+\r
+struct coff_info {\r
+\r
+       int CurrentFileNumber;\r
+       int FunctionStartLine;  /* used in Line number table */\r
+       int CurrentSourceLine;\r
+\r
+       /* Internal */\r
+       unsigned char *pRomMemory;      /* 16 bit wide words/addresses */\r
+       unsigned char *pEEPRomMemory;   /* 8 bit wide words/addresses */\r
+   int MaxRomAddress;\r
+   int MaxEepromAddress;\r
+   int NeedLineNumberFixup;\r
+   int GlobalStartAddress;\r
+   int GlobalEndAddress;\r
+   LISTNODEHEAD ListOfSplitLines;\r
+\r
+       /* External */\r
+       struct external_filehdr FileHeader;             /* Only one of these per output file */\r
+       LISTNODEHEAD ListOfSectionHeaders;      /* .text, .bss */\r
+       LISTNODEHEAD ListOfRawData;                     /* Program, EEPROM */\r
+       LISTNODEHEAD ListOfRelocations;         /* Not used now */\r
+       LISTNODEHEAD ListOfLineNumbers;\r
+       LISTNODEHEAD ListOfSymbols;\r
+       LISTNODEHEAD ListOfGlobals;\r
+       LISTNODEHEAD ListOfSpecials;\r
+       LISTNODEHEAD ListOfUndefined;\r
+       LISTNODEHEAD ListOfStrings;\r
+       LISTNODEHEAD ListOfTypes;\r
+};\r
+\r
+#if 0 /* defined in avra.h */\r
+\r
+FILE *open_coff_file(struct prog_info *pi, char *filename);\r
+void write_coff_file(struct prog_info *pi);\r
+void write_coff_eeprom( struct prog_info *pi, int address, unsigned char data);\r
+void write_coff_program( struct prog_info *pi, int address, unsigned char data);\r
+void close_coff_file(struct prog_info *pi, FILE *fp);\r
+int parse_stabs( struct prog_info *pi, char *p, int pass );\r
+int parse_stabn( struct prog_info *pi, char *p, int pass );\r
+\r
+#endif\r
+\r
+/**************************************************************/\r
+/*********** Internal Routines ********************************/\r
+/**************************************************************/\r
+int stab_add_lineno(  struct prog_info *pi, int LineNumber, char *pLabel, char *pFunction );\r
+int stab_add_lbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction );\r
+int stab_add_rbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction );\r
+int stab_add_filename( char *pName, char *pLabel );\r
+int stab_add_function( struct prog_info *pi, char *pName, char *pLabel );\r
+int stab_add_global( struct prog_info *pi, char *pName, char *pType );\r
+int stab_add_local(  struct prog_info *pi, char *pName, char *pType, char *pOffset  );\r
+int stab_add_parameter_symbol( struct prog_info *pi, char *pName, char *pType, char *pOffset  );\r
+int stab_add_static_symbol(  struct prog_info *pi, char *pName, char *pType, char *pLabel  );\r
+int stab_add_local_register(  struct prog_info *pi, char *pName, char *pType, char *pRegister  );\r
+int stab_add_local_type( char *pString, char *pType );\r
+int stab_add_tag_type( char *pName, char *pDesciptor );\r
+\r
+int GetStabType( char *p, unsigned short *pType, char **pEnd );\r
+int AddNameToEntry( char *pName, struct syment *pEntry );\r
+int GetArrayType( char *p, char **pEnd, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels );\r
+int GetEnumTagItem( char *p, char **pEnd, char **pEnumName, int *pEnumValue );\r
+int GetStructUnionTagItem( char *p, char **pEnd, char **pName, unsigned short *pType, unsigned short *pBitOffset, unsigned short *pBitSize);\r
+int GetStringDelimiters( char *pString, char **pTokens, int MaxTokens );\r
+int SetupDefinedType( unsigned short Type, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels );\r
+int GetArrayDefinitions( STABCOFFMAP *pMap , char *pMinIndex, char *pMaxIndex, char *pType, unsigned short *DerivedBits, int ExtraLevels );\r
+int GetInternalType( char *pName, STABCOFFMAP *pMap );\r
+unsigned short GetCoffType( unsigned short StabType );\r
+unsigned short GetCoffTypeSize( unsigned short StabType );\r
+int CopyStabCoffMap( unsigned short StabType, STABCOFFMAP *pMap );\r
+int IsTypeArray( unsigned short CoffType );\r
+void AddArrayAuxInfo( union auxent *pAux, unsigned short SymbolIndex, STABCOFFMAP *pMap );\r
+int GetSubRangeType( unsigned short Type, STABCOFFMAP *pMap , char *pLow, char *pHigh );\r
+char *SkipPastDigits( char *p );\r
+int GetDigitLength( char *p );\r
+\r
+/****************************************************************************************/\r
+/* List management routines */\r
+/****************************************************************************************/\r
+\r
+void InitializeList( LISTNODEHEAD *pNode );\r
+void *AllocateTwoListObjects( LISTNODEHEAD *pHead, int size );\r
+void *AllocateListObject( LISTNODEHEAD *pHead, int size );\r
+LISTNODE *AllocateListNode( void *pObject, int size );\r
+void AddNodeToList( LISTNODEHEAD *pHead, LISTNODE *pNode );\r
+void *FindFirstListObject( LISTNODEHEAD *pHead );\r
+void *FindNextListObject( LISTNODEHEAD *pHead );\r
+LISTNODE *GetCurrentNode( LISTNODEHEAD *pHead );\r
+void *GetCurrentListObject( LISTNODEHEAD *pHead );\r
+void *FindLastListObject( LISTNODEHEAD *pHead );\r
+void *FindNextLastListObject( LISTNODEHEAD *pHead );\r
+void FreeList( LISTNODEHEAD *pHead );\r
+LISTNODE  *AddListObject(LISTNODEHEAD *pHead, void *pObject, int size );\r
+\r
diff --git a/src/mkutil/avra-0.8/SOURCE/device.c b/src/mkutil/avra-0.8/SOURCE/device.c
new file mode 100644 (file)
index 0000000..206e6b9
--- /dev/null
@@ -0,0 +1,206 @@
+/***********************************************************************\r
+ *  avra - Assembler for the Atmel AVR microcontroller series\r
+ *  Copyright (C) 1998-2001 Jon Anders Haugum\r
+ *  Copyright (C) 2002-2003 Tobias Weber\r
+ *\r
+ *  This program is free software; you can redistribute it and/or modify\r
+ *  it under the terms of the GNU General Public License as published by\r
+ *  the Free Software Foundation; either version 2 of the License, or\r
+ *  (at your option) any later version.\r
+ *\r
+ *  This program is distributed in the hope that it will be useful,\r
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ *  GNU General Public License for more details.\r
+ *\r
+ *  You should have received a copy of the GNU General Public License\r
+ *  along with this program; see the file COPYING.  If not, write to\r
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
+ *  Boston, MA 02111-1307, USA.\r
+ *\r
+ *\r
+ *  Authors of avra can be reached at:\r
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com\r
+ *     www: http://sourceforge.net/projects/avra\r
+ */\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#include "misc.h"\r
+#include "avra.h"\r
+#include "device.h"\r
+\r
+#define DEV_VAR "__DEVICE__"   // Device var name\r
+#define FLASH_VAR "__FLASH_SIZE__"     // Flash size var name\r
+#define EEPROM_VAR "__EEPROM_SIZE__"   // EEPROM size var name\r
+#define RAM_VAR "__RAM_SIZE__" // RAM size var name\r
+#define DEV_PREFIX "__"                // Device name prefix\r
+#define DEV_SUFFIX "__"                // Device name suffix\r
+#define DEF_DEV_NAME "DEFAULT" // Default device name (without prefix/suffix)\r
+#define MAX_DEV_NAME 32                // Max device name length\r
+\r
+// Name, Flash, RAM, EEPROM, flags\r
+struct device device_list[] =\r
+{\r
+  {       NULL, 4194304, 8388608, 65536, 0}, // Total instructions: 137\r
+  {"AT90S1200",     512+32,       0,    64, DF_NO_MUL|DF_NO_JMP|DF_TINY1X|DF_NO_XREG|DF_NO_YREG|DF_NO_LPM|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP}, // 137 - MUL(6) - JMP(2) - TINY(10)\r
+  {"ATtiny10",     1024+32,       0,     0, DF_NO_MUL|DF_NO_JMP|DF_TINY1X|DF_NO_XREG|DF_NO_YREG|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"ATtiny11",     1024+32,       0,     0, DF_NO_MUL|DF_NO_JMP|DF_TINY1X|DF_NO_XREG|DF_NO_YREG|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"ATtiny12",     1024+32,       0,    64, DF_NO_MUL|DF_NO_JMP|DF_TINY1X|DF_NO_XREG|DF_NO_YREG|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"ATtiny15",     1024+32,       0,    64, DF_NO_MUL|DF_NO_JMP|DF_TINY1X|DF_NO_XREG|DF_NO_YREG|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"ATtiny28",     2048+32,       0,     0, DF_NO_MUL|DF_NO_JMP|DF_TINY1X|DF_NO_XREG|DF_NO_YREG|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"ATtiny22",     2048+32,     128,   128, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S2313",    1024+32,     128,   128, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S2323",    1024+32,     128,   128, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S2333",    1024+32,     128,   128, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S2343",    1024+32,     128,   128, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S4414",    2048+32,     256,   256, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S4433",    2048+32,     128,   256, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S4434",    2048+32,     256,   256, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S8515",    4096+32,     512,   512, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90C8534",    4096+32,     256,   512, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"AT90S8535",    4096+4096+32,     512,   512, DF_NO_MUL|DF_NO_JMP|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_MOVW|DF_NO_BREAK|DF_NO_EICALL|DF_NO_EIJMP},\r
+  {"ATmega8",      4096+32,    1024,   512, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_ESPM},\r
+  {"ATmega161",    8192+32,    1024,   512, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_ESPM},\r
+  {"ATmega162",    8192+32,    1024,   512, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_ESPM},\r
+  {"ATmega163",    8192+32,    1024,   512, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_ESPM},\r
+  {"ATmega16",     8192+32,    1024,   512, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_ESPM},\r
+  {"ATmega323",   16384+32,    2048,  1024, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_ESPM}, // 137 - EICALL - EIJMP - ELPM(3) - ESPM = 131 (Data sheet says 130 but it's wrong)\r
+  {"ATmega32",    16384+32,    2048,  1024, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_ESPM},\r
+  {"ATmega603",   32768+32,    4096,  2048, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_MUL|DF_NO_MOVW|DF_NO_LPM_X|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_BREAK},\r
+  {"ATmega103",   65536+32,    4096,  4096, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_MUL|DF_NO_MOVW|DF_NO_LPM_X|DF_NO_ELPM_X|DF_NO_SPM|DF_NO_ESPM|DF_NO_BREAK}, // 137 - EICALL - EIJMP - MUL(6) - MOVW - LPM_X(2) - ELPM_X(2) - SPM - ESPM - BREAK = 121\r
+  {"ATmega104",   65536+32,    4096,  4096, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ESPM}, // Old name for mega128\r
+  {"ATmega128",   65536+32,    4096,  4096, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ESPM}, // 137 - EICALL - EIJMP - ESPM = 134 (Data sheet says 133 but it's wrong)\r
+  {"AT94K",        8192+32,   16384,     0, DF_NO_EICALL|DF_NO_EIJMP|DF_NO_ELPM|DF_NO_SPM|DF_NO_ESPM|DF_NO_BREAK}, // 137 - EICALL - EIJMP - ELPM(3) - SPM - ESPM - BREAK = 129\r
+  {NULL, 0, 0, 0, 0}\r
+};\r
+\r
+static int LastDevice=0;\r
+\r
+static int def_var(struct prog_info *pi, char *name, int value) \r
+       {\r
+       struct label *label;\r
+\r
+       for(label = pi->first_variable; label; label = label->next)\r
+               if(!nocase_strcmp(label->name, name))\r
+                       {\r
+                       label->value = value;\r
+                       return(True);\r
+                       }\r
+       label = malloc(sizeof(struct label));\r
+       if(!label)\r
+               {\r
+               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);\r
+               return(False);\r
+               }\r
+       label->next = NULL;\r
+       if(pi->last_variable)\r
+               pi->last_variable->next = label;\r
+       else\r
+               pi->first_variable = label;\r
+       pi->last_variable = label;\r
+       label->name = malloc(strlen(name) + 1);\r
+       if(!label->name)\r
+               {\r
+               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);\r
+               return(False);\r
+               }\r
+       strcpy(label->name, name);\r
+       label->value = value;\r
+       return(True);\r
+       }\r
+\r
+// Define vars for device in LastDevice\r
+static void def_dev(struct prog_info *pi) {\r
+   def_var(pi,DEV_VAR,LastDevice);\r
+   def_var(pi,FLASH_VAR,device_list[LastDevice].flash_size);\r
+   def_var(pi,EEPROM_VAR,device_list[LastDevice].eeprom_size);\r
+   def_var(pi,RAM_VAR,device_list[LastDevice].ram_size);\r
+   }\r
+struct device *get_device(struct prog_info *pi, char *name)\r
+       {\r
+       int i = 1;\r
+\r
+        LastDevice=0;\r
+       if(name == NULL)\r
+               {\r
+                def_dev(pi);\r
+               return(&device_list[0]);\r
+               }\r
+       while(device_list[i].name)\r
+               {\r
+               if(!nocase_strcmp(name, device_list[i].name))\r
+                       {\r
+                       LastDevice=i;\r
+                       def_dev(pi);\r
+                       return(&device_list[i]);\r
+                       }\r
+               i++;\r
+               }\r
+       def_dev(pi);\r
+       return(NULL);\r
+       }\r
+\r
+static int def_const(struct prog_info *pi, const char *name, int value) \r
+       {\r
+       struct label *label;\r
+\r
+       label = malloc(sizeof(struct label));\r
+       if(!label)\r
+               {\r
+               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);\r
+               return(False);\r
+               }\r
+       label->next = NULL;\r
+       if(pi->last_constant)\r
+               pi->last_constant->next = label;\r
+       else\r
+               pi->first_constant = label;\r
+       pi->last_constant = label;\r
+       label->name = malloc(strlen(name) + 1);\r
+       if(!label->name)\r
+               {\r
+               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);\r
+               return(False);\r
+               }\r
+       strcpy(label->name, name);\r
+       label->value = value;\r
+       return(True);\r
+       }\r
+\r
+// Pre-define devices\r
+void predef_dev(struct prog_info *pi)\r
+       {\r
+       int i;\r
+       char temp[MAX_DEV_NAME+1];\r
+\r
+\r
+       def_dev(pi);\r
+       for (i=0;(!i)||(device_list[i].name);i++)\r
+               {\r
+               strncpy(temp,DEV_PREFIX,MAX_DEV_NAME);\r
+               if (!i) strncat(temp,DEF_DEV_NAME,MAX_DEV_NAME);\r
+               else strncat(temp,device_list[i].name,MAX_DEV_NAME);\r
+               strncat(temp,DEV_SUFFIX,MAX_DEV_NAME);\r
+               def_const(pi,temp,i);\r
+               }\r
+       }\r
+\r
+void list_devices()\r
+{\r
+  int i = 1;\r
+  printf("Device name | Flash size | RAM size | EEPROM size |  Supported\n"\r
+         "            |  (words)   | (bytes)  |   (bytes)   | instructions\n"\r
+         "------------+------------+----------+-------------+--------------\n"\r
+         " (default)  |   %7d  |  %7d |    %5d    |     %3d\n",\r
+         device_list[0].flash_size, device_list[0].ram_size, device_list[0].eeprom_size,\r
+         count_supported_instructions(device_list[0].flag));\r
+  while(device_list[i].name)\r
+  {\r
+    printf(" %-10s |   %7d  |  %7d |    %5d    |     %3d\n", device_list[i].name,\r
+           device_list[i].flash_size, device_list[i].ram_size,\r
+           device_list[i].eeprom_size, count_supported_instructions(device_list[i].flag));\r
+    i++;\r
+  }\r
+}\r
diff --git a/src/mkutil/avra-0.8/SOURCE/device.h b/src/mkutil/avra-0.8/SOURCE/device.h
new file mode 100644 (file)
index 0000000..1d627bf
--- /dev/null
@@ -0,0 +1,32 @@
+
+/* Device flags */
+#define DF_NO_MUL    0x00000001
+#define DF_NO_JMP    0x00000002        // No JMP, CALL
+#define DF_NO_XREG   0x00000004        // No X register
+#define DF_NO_YREG   0x00000008        // No Y register
+#define DF_TINY1X    0x00000010        /* AT90S1200, ATtiny10-12  set: No ADIW, SBIW,
+                                  IJMP, ICALL, LDD, STD, LDS, STS, PUSH, POP */
+#define DF_NO_LPM    0x00000020        // No LPM instruction
+#define DF_NO_LPM_X  0x00000040 // No LPM Rd,Z or LPM Rd,Z+ instruction
+#define DF_NO_ELPM   0x00000080        // No ELPM instruction
+#define DF_NO_ELPM_X 0x00000100 // No ELPM Rd,Z or LPM Rd,Z+ instruction
+#define DF_NO_SPM    0x00000200 // No SPM instruction
+#define DF_NO_ESPM   0x00000400 // No ESPM instruction
+#define DF_NO_MOVW   0x00000800 // No MOVW instruction
+#define DF_NO_BREAK  0x00001000 // No BREAK instruction
+#define DF_NO_EICALL 0x00002000 // No EICALL instruction
+#define DF_NO_EIJMP  0x00004000 // No EIJMP instruction
+
+struct device
+       {
+       char *name;
+       int flash_size;
+       int ram_size;
+       int eeprom_size;
+       int flag;
+       };
+
+/* device.c */
+struct device *get_device(struct prog_info *pi,char *name);
+void predef_dev(struct prog_info *pi);
+void list_devices();
diff --git a/src/mkutil/avra-0.8/SOURCE/directiv.c b/src/mkutil/avra-0.8/SOURCE/directiv.c
new file mode 100644 (file)
index 0000000..5f27dd4
--- /dev/null
@@ -0,0 +1,824 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "args.h"
+#include "avra.h"
+#include "device.h"
+
+enum
+       {
+       DIRECTIVE_BYTE = 0,
+       DIRECTIVE_CSEG,
+       DIRECTIVE_CSEGSIZE,
+       DIRECTIVE_DB,
+       DIRECTIVE_DEF,
+       DIRECTIVE_DEVICE,
+       DIRECTIVE_DSEG,
+       DIRECTIVE_DW,
+       DIRECTIVE_ENDM,
+       DIRECTIVE_ENDMACRO,
+       DIRECTIVE_EQU,
+       DIRECTIVE_ESEG,
+       DIRECTIVE_EXIT,
+       DIRECTIVE_INCLUDE,
+       DIRECTIVE_LIST,
+       DIRECTIVE_LISTMAC,
+       DIRECTIVE_MACRO,
+       DIRECTIVE_NOLIST,
+       DIRECTIVE_ORG,
+       DIRECTIVE_SET,
+       DIRECTIVE_DEFINE,
+       DIRECTIVE_UNDEF,
+       DIRECTIVE_IFDEF,
+       DIRECTIVE_IFNDEF,
+       DIRECTIVE_IF,
+       DIRECTIVE_ELSE,
+       DIRECTIVE_ELIF,
+       DIRECTIVE_ENDIF,
+       DIRECTIVE_MESSAGE,
+       DIRECTIVE_WARNING,
+       DIRECTIVE_ERROR,
+       DIRECTIVE_COUNT
+       };
+
+char *directive_list[] =
+       {
+       "BYTE",
+       "CSEG",
+       "CSEGSIZE",
+       "DB",
+       "DEF",
+       "DEVICE",
+       "DSEG",
+       "DW",
+       "ENDM",
+       "ENDMACRO",
+       "EQU",
+       "ESEG",
+       "EXIT",
+       "INCLUDE",
+       "LIST",
+       "LISTMAC",
+       "MACRO",
+       "NOLIST",
+       "ORG",
+       "SET",
+       "DEFINE",
+       "UNDEF",
+       "IFDEF",
+       "IFNDEF",
+       "IF",
+       "ELSE",
+       "ELIF",
+       "ENDIF",
+       "MESSAGE",
+       "WARNING",
+       "ERROR"
+       };
+
+
+int parse_directive(struct prog_info *pi, int pass)
+       {
+       int directive, ok = True, i;
+       char *next, *data;
+       struct file_info *fi_bak;
+       struct label *label;
+       struct def *def;
+       struct data_list *includedir;
+
+       next = get_next_token(pi->fi->scratch, TERM_SPACE);
+       for(i = 0; pi->fi->scratch[i] != '\0'; i++)
+               pi->fi->scratch[i] = toupper(pi->fi->scratch[i]);
+       directive = get_directive_type(pi->fi->scratch + 1);
+       if(directive == -1)
+               {
+               print_msg(pi, MSGTYPE_ERROR, "Unknown directive: %s", pi->fi->scratch);
+               return(True);
+               }
+       switch(directive)
+               {
+               case DIRECTIVE_BYTE:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".BYTE needs an operand");
+                               return(True);
+                               }
+                       if(pi->segment != SEGMENT_DATA)
+                               print_msg(pi, MSGTYPE_ERROR, ".BYTE directive can only be used in data segment (.DSEG)");
+                       get_next_token(next, TERM_END);
+                       if(!get_expr(pi, next, &i))
+                               return(False);
+                       if((pass == PASS_2) && pi->list_line && pi->list_on)
+                               {
+                               fprintf(pi->list_file, "%06x      %s", pi->dseg_addr, pi->list_line);
+                               pi->list_line = NULL;
+                               }
+                       pi->dseg_addr += i;
+                       if(pass == PASS_1)
+                               pi->dseg_count += i;
+                       break;
+               case DIRECTIVE_CSEG:
+                       pi->segment = SEGMENT_CODE;
+                       break;
+               case DIRECTIVE_CSEGSIZE:
+                       break;
+               case DIRECTIVE_DB:
+                       return(parse_db(pi, next, pass));
+                       break;
+               case DIRECTIVE_DEF:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".DEF needs an operand");
+                               return(True);
+                               }
+                       data = get_next_token(next, TERM_EQUAL);
+                       if(!(data && (tolower(data[0]) == 'r') && isdigit(data[1])))
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "%s needs a register (e.g. .def BZZZT = r16)", next);
+                               return(True);
+                               }
+                       i = atoi(&data[1]);
+                       if(i > 31)
+                               print_msg(pi, MSGTYPE_ERROR, "R%d is not a valid register", i);
+                       for(def = pi->first_def; def; def = def->next)
+                               if(!nocase_strcmp(def->name, next))
+                                       {
+                                       def->reg = i;
+                                       return(True);
+                                       }
+                       def = malloc(sizeof(struct def));
+                       if(!def)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       def->next = NULL;
+                       if(pi->last_def)
+                               pi->last_def->next = def;
+                       else
+                               pi->first_def = def;
+                       pi->last_def = def;
+                       def->name = malloc(strlen(next) + 1);
+                       if(!def->name)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       strcpy(def->name, next);
+                       def->reg = i;
+                       break;
+               case DIRECTIVE_DEVICE:
+                       if(pass == PASS_2)
+                               return(True);
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".DEVICE needs an operand");
+                               return(True);
+                               }
+                       get_next_token(next, TERM_END);
+                       pi->device = get_device(pi,next);
+                       if(!pi->device)
+                               print_msg(pi, MSGTYPE_ERROR, "Unknown device: %s", next);
+                       break;
+               case DIRECTIVE_DSEG:
+                       pi->segment = SEGMENT_DATA;
+                       break;
+               case DIRECTIVE_DW:
+                       if(pi->segment == SEGMENT_DATA)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "Can't use .DW directive in data segment (.DSEG)");
+                               return(True);
+                               }
+                       while(next)
+                               {
+                               data = get_next_token(next, TERM_COMMA);
+                               if(pass == PASS_2)
+                                 {
+                                 if(!get_expr(pi, next, &i))
+                                   return(False);
+                                 if((i < -32768) || (i > 65535))
+                                   print_msg(pi, MSGTYPE_WARNING, "Value %d is out of range (-32768 <= k <= 65535). Will be masked", i);
+                                 }
+                               if(pi->segment == SEGMENT_EEPROM)
+                                       {
+                                       if(pass == PASS_2)
+                                               {
+                                               write_ee_byte(pi, pi->eseg_addr, (unsigned char)i);
+                                               write_ee_byte(pi, pi->eseg_addr + 1, (unsigned char)(i >> 8));
+                                               }
+                                       pi->eseg_addr += 2;
+                                       if(pass == PASS_1)
+                                               pi->eseg_count += 2;
+                                       }
+                               else
+                                       {
+                                       if((pass == PASS_2) && pi->hfi)
+                                               write_prog_word(pi, pi->cseg_addr, i);
+                                       pi->cseg_addr++;
+                                       if(pass == PASS_1)
+                                               pi->cseg_count++;
+                                       }
+                               next = data;
+                               }
+                       break;
+               case DIRECTIVE_ENDM:
+               case DIRECTIVE_ENDMACRO:
+                       print_msg(pi, MSGTYPE_ERROR, "No .MACRO found before .ENDMACRO");
+                       break;
+               case DIRECTIVE_EQU:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".EQU needs an operand");
+                               return(True);
+                               }
+                       data = get_next_token(next, TERM_EQUAL);
+                       if(!data)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "%s needs an expression (e.g. .EQU BZZZT = 0x2a)", next);
+                               return(True);
+                               }
+                       get_next_token(data, TERM_END);
+                       if(!get_expr(pi, data, &i))
+                               return(False);
+                       for(label = pi->first_label; label; label = label->next)
+                               {
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s have already been defined as a label", next);
+                                       return(True);
+                                       }
+                               }
+                       for(label = pi->first_variable; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s have already been defined as a .SET variable", next);
+                                       return(True);
+                                       }
+                       for(label = pi->first_constant; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Can't redefine constant %s, use .SET instead", next);
+                                       return(True);
+                                       }
+                       label = malloc(sizeof(struct label));
+                       if(!label)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       label->next = NULL;
+                       if(pi->last_constant)
+                               pi->last_constant->next = label;
+                       else
+                               pi->first_constant = label;
+                       pi->last_constant = label;
+                       label->name = malloc(strlen(next) + 1);
+                       if(!label->name)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       strcpy(label->name, next);
+                       label->value = i;
+                       break;
+               case DIRECTIVE_ESEG:
+                       pi->segment = SEGMENT_EEPROM;
+                       break;
+               case DIRECTIVE_EXIT:
+                       pi->fi->exit_file = True;
+                       break;
+               case DIRECTIVE_INCLUDE:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "Nothing to include");
+                               return(True);
+                               }
+                       next = term_string(pi, next);
+                       if((pass == PASS_2) && pi->list_line && pi->list_on)
+                               {
+                               fprintf(pi->list_file, "          %s", pi->list_line);
+                               pi->list_line = NULL;
+                               }
+                       // Test if include is in local directory
+                       ok = test_include(next);
+                       data = NULL;
+                       if(!ok)
+                               for(includedir = GET_ARG(pi->args, ARG_INCLUDEDIR); includedir && !ok; includedir = includedir->next)
+                               {
+                                       i = strlen(includedir->data);
+                                       if(data)
+                                               free(data);
+                                       data = malloc(i + strlen(next) + 2);
+                                       if(!data)
+                                       {
+                                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                                               return(False);
+                                       }
+                                       strcpy(data, includedir->data);
+                                       if((data[i - 1] != '\\') && (data[i - 1] != '/'))
+                                               data[i++] = '/';
+                                       strcpy(&data[i], next);
+                                       ok = test_include(data);
+                               }
+                       if(ok)
+                       {
+                               fi_bak = pi->fi;
+                               ok = parse_file(pi, data ? data : next, pass);
+                               pi->fi = fi_bak;
+                       }
+                       else
+                               print_msg(pi, MSGTYPE_ERROR, "cannot find include file");
+                       if(data)
+                               free(data);
+                       break;
+               case DIRECTIVE_LIST:
+                       if(pass == PASS_2)
+                               pi->list_on = True;
+                       break;
+               case DIRECTIVE_LISTMAC:
+                       if(pass == PASS_2)
+                               SET_ARG(pi->args, ARG_LISTMAC, True);
+                       break;
+               case DIRECTIVE_MACRO:
+                       return(read_macro(pi, next, pass));
+                       break;
+               case DIRECTIVE_NOLIST:
+                       if(pass == PASS_2)
+                               pi->list_on = False;
+                       break;
+               case DIRECTIVE_ORG:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".ORG needs an operand");
+                               return(True);
+                               }
+                       get_next_token(next, TERM_END);
+                       if(!get_expr(pi, next, &i))
+                               return(False);
+                       switch(pi->segment)
+                               {
+                               case SEGMENT_CODE:
+                                       pi->cseg_addr = i;
+                                       break;
+                               case SEGMENT_DATA:
+                                       pi->dseg_addr = i;
+                                       break;
+                               case SEGMENT_EEPROM:
+                                       pi->eseg_addr = i;
+                               }
+                       if(pi->fi->label)
+                               pi->fi->label->value = i;
+                       break;
+               case DIRECTIVE_SET:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".SET needs an operand");
+                               return(True);
+                               }
+                       data = get_next_token(next, TERM_EQUAL);
+                       if(!data)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "%s needs an expression (e.g. .SET BZZZT = 0x2a)", next);
+                               return(True);
+                               }
+                       get_next_token(data, TERM_END);
+                       if(!get_expr(pi, data, &i))
+                               return(False);
+                       for(label = pi->first_label; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s have already been defined as a label", next);
+                                       return(True);
+                                       }
+                       for(label = pi->first_constant; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s have already been defined as a .EQU constant", next);
+                                       return(True);
+                                       }
+                       for(label = pi->first_variable; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       label->value = i;
+                                       return(True);
+                                       }
+                       label = malloc(sizeof(struct label));
+                       if(!label)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       label->next = NULL;
+                       if(pi->last_variable)
+                               pi->last_variable->next = label;
+                       else
+                               pi->first_variable = label;
+                       pi->last_variable = label;
+                       label->name = malloc(strlen(next) + 1);
+                       if(!label->name)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       strcpy(label->name, next);
+                       label->value = i;
+                       break;
+               case DIRECTIVE_DEFINE:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".DEFINE needs an operand");
+                               return(True);
+                               }
+                       data = get_next_token(next, TERM_SPACE);
+                       if(data)
+                               {
+                               get_next_token(data, TERM_END);
+                               if(!get_expr(pi, data, &i))
+                                       return(False);
+                               }
+                       else
+                               i = 1;
+                       for(label = pi->first_label; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s have already been defined as a label", next);
+                                       return(True);
+                                       }
+                       for(label = pi->first_variable; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s have already been defined as a .SET variable", next);
+                                       return(True);
+                                       }
+                       for(label = pi->first_constant; label; label = label->next)
+                               if(!nocase_strcmp(label->name, next))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Can't redefine constant %s, use .SET instead", next);
+                                       return(True);
+                                       }
+                       label = malloc(sizeof(struct label));
+                       if(!label)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       label->next = NULL;
+                       if(pi->last_constant)
+                               pi->last_constant->next = label;
+                       else
+                               pi->first_constant = label;
+                       pi->last_constant = label;
+                       label->name = malloc(strlen(next) + 1);
+                       if(!label->name)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                               }
+                       strcpy(label->name, next);
+                       label->value = i;
+                       break;
+               case DIRECTIVE_UNDEF: // TODO
+                       break;
+               case DIRECTIVE_IFDEF:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".IFDEF needs an operand");
+                               return(True);
+                               }
+                       get_next_token(next, TERM_END);
+                       if(get_symbol(pi, next, NULL))
+                               pi->conditional_depth++;
+                       else
+                               {
+                               if(!spool_conditional(pi, False))
+                                       return(False);
+                               }
+                       break;
+               case DIRECTIVE_IFNDEF:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".IFNDEF needs an operand");
+                               return(True);
+                               }
+                       get_next_token(next, TERM_END);
+                       if(get_symbol(pi, next, NULL))
+                               {
+                               if(!spool_conditional(pi, False))
+                                       return(False);
+                               }
+                       else
+                               pi->conditional_depth++;
+                       break;
+               case DIRECTIVE_IF:
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, ".IF needs an expression");
+                               return(True);
+                               }
+                       get_next_token(next, TERM_END);
+                       if(!get_expr(pi, next, &i))
+                               return(False);
+                       if(i)
+                               pi->conditional_depth++;
+                       else
+                               {
+                               if(!spool_conditional(pi, False))
+                                       return(False);
+                               }
+                       break;
+               case DIRECTIVE_ELSE:
+               case DIRECTIVE_ELIF:
+                       if(!spool_conditional(pi, True))
+                               return(False);
+                       break;
+               case DIRECTIVE_ENDIF:
+                       if(pi->conditional_depth == 0)
+                               print_msg(pi, MSGTYPE_ERROR, "Too many .ENDIF");
+                       else
+                               pi->conditional_depth--;
+                       break;
+               case DIRECTIVE_MESSAGE:
+                       if(pass == PASS_1)
+                               return(True);
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "No message string supplied");
+                               return(True);
+                               }
+                       next = term_string(pi, next);
+                       print_msg(pi, MSGTYPE_MESSAGE, next);
+                       break;
+               case DIRECTIVE_WARNING:
+                       if(pass == PASS_1)
+                               return(True);
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "No warning string supplied");
+                               return(True);
+                               }
+                       next = term_string(pi, next);
+                       print_msg(pi, MSGTYPE_WARNING, next);
+                       break;
+               case DIRECTIVE_ERROR:
+                       if(pass == PASS_1)
+                               return(True);
+                       if(!next)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "No error string supplied");
+                               return(True);
+                               }
+                       next = term_string(pi, next);
+                       print_msg(pi, MSGTYPE_ERROR, next);
+                       break;
+               }
+       return(ok);
+       }
+
+
+int get_directive_type(char *directive)
+       {
+       int i;
+
+       for(i = 0; i < DIRECTIVE_COUNT; i++)
+               if(!strcmp(directive, directive_list[i])) return(i);
+       return(-1);
+       }
+
+
+char *term_string(struct prog_info *pi, char *string)
+       {
+       int i;
+
+       if(string[0] != '\"') 
+               print_msg(pi, MSGTYPE_ERROR, "String must be enclosed in \"-signs");
+       else
+               string++;
+       for(i = 0; (string[i] != '\"') && !((string[i] == 10) || (string[i] == 13) || (string[i] == '\0')); i++);
+       if((string[i] == 10) || (string[i] == 13) || (string[i] == '\0'))
+               print_msg(pi, MSGTYPE_ERROR, "String is missing a closing \"-sign");
+       string[i] = '\0';
+       return(string);
+       }
+
+
+int parse_db(struct prog_info *pi, char *next, int pass)
+       {
+       int i, count;
+       char *data, prev;
+
+       if(pi->segment == SEGMENT_DATA)
+               {
+               print_msg(pi, MSGTYPE_ERROR, "Can't use .DB directive in data segment (.DSEG)");
+               return(True);
+               }
+       count = 0;
+       while(next)
+               {
+               data = get_next_token(next, TERM_COMMA);
+               if(next[0] == '\"')
+                       {
+                       next = term_string(pi, next);
+                       while(*next != '\0')
+                               {
+                               count++;
+                               write_db(pi, *next, &prev, count, pass);
+                               next++;
+                               }
+                       }
+               else
+                       {
+                       if(pass == PASS_2)
+                         {
+                         if(!get_expr(pi, next, &i))
+                           return(False);
+                         if((i < -128) || (i > 255))
+                           print_msg(pi, MSGTYPE_WARNING, "Value %d is out of range (-128 <= k <= 255). Will be masked", i);
+                         }
+                       count++;
+                       write_db(pi, (char)i, &prev, count, pass);
+                       }
+               next = data;
+               }
+       if(pi->segment == SEGMENT_CODE)
+               {
+               if((count % 2) == 1)
+                       {
+                       if(pass == PASS_2)
+                       {
+                               write_prog_word(pi, pi->cseg_addr, prev & 0xff);
+                               print_msg(pi, MSGTYPE_WARNING, "A .DB segment with an odd number of bytes is detected. A zero byte is added.");
+                       }
+                       pi->cseg_addr++;
+                       if(pass == PASS_1)
+                               pi->cseg_count++;
+                       }
+               }
+       return(True);
+       }
+
+
+void write_db(struct prog_info *pi, char byte, char *prev, int count, int pass)
+       {
+       if(pi->segment == SEGMENT_EEPROM)
+               {
+               if(pass == PASS_2)
+                       write_ee_byte(pi, pi->eseg_addr, byte);
+               pi->eseg_addr++;
+               if(pass == PASS_1)
+                       pi->eseg_count++;
+               }
+       else /* pi->segment == SEGMENT_CODE */
+               {
+               if((count % 2) == 0)
+                       {
+                       if(pass == PASS_2)
+                               write_prog_word(pi, pi->cseg_addr, (byte << 8) | (*prev & 0xff));
+                       pi->cseg_addr++;
+                       if(pass == PASS_1)
+                               pi->cseg_count++;
+                       }
+               else
+                       *prev = byte;
+               }
+       }
+
+
+int spool_conditional(struct prog_info *pi, int only_endif)
+       {
+       int current_depth = 0, do_next;
+
+       if(pi->macro_line)
+               {
+               while((pi->macro_line = pi->macro_line->next))
+                       {
+                       pi->macro_call->line_index++;
+                       if(check_conditional(pi, pi->macro_line->line, &current_depth,  &do_next, only_endif))
+                               {
+                               if(!do_next)
+                                       return(True);
+                               }
+                       else
+                               return(False);
+                       }
+               print_msg(pi, MSGTYPE_ERROR, "Found no closing .ENDIF in macro");
+               }
+       else
+               {
+               while(fgets(pi->fi->buff, LINEBUFFER_LENGTH, pi->fi->fp))
+                       {
+                       pi->fi->line_number++;
+                       if(check_conditional(pi, pi->fi->buff, &current_depth,  &do_next, only_endif))
+                               {
+                               if(!do_next)
+                                       return(True);
+                               }
+                       else
+                               return(False);
+                       }
+               if(feof(pi->fi->fp))
+                       {
+                       print_msg(pi, MSGTYPE_ERROR, "Found no closing .ENDIF");
+                       return(True);
+                       }
+               else
+                       {
+                       perror(pi->fi->include_file->name);
+                       return(False);
+                       }
+               }
+       return(True);
+       }
+
+
+int check_conditional(struct prog_info *pi, char *buff, int *current_depth, int *do_next, int only_endif)
+       {
+       int i = 0;
+       char *next;
+
+       *do_next = False;
+       while(IS_HOR_SPACE(buff[i]) && !IS_END(buff[i])) i++;
+       if(buff[i] == '.')
+               {
+               i++;
+               if(!nocase_strncmp(&buff[i], "if", 2))
+                       (*current_depth)++;
+               else if(!nocase_strncmp(&buff[i], "endif", 5))
+                       {
+                       if(*current_depth == 0)
+                               return(True);
+                       (*current_depth)--;
+                       }
+               else if(!only_endif && (*current_depth == 0))
+                       {
+                       if(!nocase_strncmp(&buff[i], "else", 4))
+                               {
+                               pi->conditional_depth++;
+                               return(True);
+                               }
+                       else if(!nocase_strncmp(&buff[i], "elif", 4))
+                               {
+                               next = get_next_token(&buff[i], TERM_SPACE);
+                               if(!next)
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, ".ELIF needs an operand");
+                                       return(True);
+                                       }
+                               get_next_token(next, TERM_END);
+                               if(!get_expr(pi, next, &i))
+                                       return(False);
+                               if(i)
+                                       pi->conditional_depth++;
+                               else
+                                       {
+                                       if(!spool_conditional(pi, False))
+                                               return(False);
+                                       }
+                               return(True);
+                               }
+                       }
+               }
+       *do_next = True;
+       return(True);
+       }
+
+int test_include(const char *filename)
+{
+  FILE *fp;
+  fp = fopen(filename, "r");
+  if(fp)
+  {
+    fclose(fp);
+    return(True);
+  }
+  else
+    return(False);
+}
diff --git a/src/mkutil/avra-0.8/SOURCE/expr.c b/src/mkutil/avra-0.8/SOURCE/expr.c
new file mode 100644 (file)
index 0000000..67a75a3
--- /dev/null
@@ -0,0 +1,608 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "avra.h"
+#include "device.h"
+
+#define IS_UNARY(x) ((x == '!') || (x == '-') || (x == '~'))
+#define IS_OPERATOR(x) ((x == '+') || (x == '-') || (x == '*') || (x == '/') || (x == '%') || (x == '<') || (x == '>') || (x == '=') || (x == '!') || (x == '&') || (x == '^') || (x == '|'))
+#define IS_2ND_OPERATOR(x) ((x == '<') || (x == '>') || (x == '=') || (x == '&') || (x == '|'))
+
+enum
+       {
+       OPERATOR_ERROR = 0,
+       OPERATOR_MUL,
+       OPERATOR_DIV,
+       OPERATOR_MOD,
+       OPERATOR_ADD,
+       OPERATOR_SUB,
+       OPERATOR_SHIFT_LEFT,
+       OPERATOR_SHIFT_RIGHT,
+       OPERATOR_LESS_THAN,
+       OPERATOR_LESS_OR_EQUAL,
+       OPERATOR_GREATER_THAN,
+       OPERATOR_GREATER_OR_EQUAL,
+       OPERATOR_EQUAL,
+       OPERATOR_NOT_EQUAL,
+       OPERATOR_BITWISE_AND,
+       OPERATOR_BITWISE_XOR,
+       OPERATOR_BITWISE_OR,
+       OPERATOR_LOGICAL_AND,
+       OPERATOR_LOGICAL_OR
+       };
+
+enum
+       {
+       FUNCTION_LOW = 0,
+       FUNCTION_HIGH,
+       FUNCTION_BYTE2,
+       FUNCTION_BYTE3,
+       FUNCTION_BYTE4,
+       FUNCTION_LWRD,
+       FUNCTION_HWRD,
+       FUNCTION_PAGE,
+       FUNCTION_EXP2,
+       FUNCTION_LOG2,
+       FUNCTION_COUNT
+       };
+
+struct element
+       {
+       struct element *next;
+       int data;
+       };
+
+char *function_list[] =
+       {
+       "low(",
+       "high(",
+       "byte2(",
+       "byte3(",
+       "byte4(",
+       "lwrd(",
+       "hwrd(",
+       "page(",
+       "exp2(",
+       "log2("
+       };
+
+int get_expr(struct prog_info *pi, char *data, int *value)
+       {
+       int ok = True, end = False, i, count, first_flag, length, function;
+       char unary, *label;
+       struct element *element, *first_element = NULL, *temp_element;
+       struct element **last_element = &first_element;
+
+       for(i = 0, count = 0, first_flag = True, unary = 0; ; i++)
+               {
+               if(IS_HOR_SPACE(data[i]));
+               else if(IS_END(data[i]))
+                       {
+                       if((count % 2) != 1)
+                               print_msg(pi, MSGTYPE_ERROR, "Missing value in expression");
+                       else
+                               end = True;
+                       break;
+                       }
+               else if(first_flag && IS_UNARY(data[i]))
+                       {
+                       unary = data[i];
+                       first_flag = False;
+                       }
+               else if((count % 2) == 1)
+                       {
+                       if(!IS_OPERATOR(data[i]))
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "Illegal operator '%c'", data[i]);
+                               break;
+                               }
+                       element = malloc(sizeof(struct element));
+                       if(!element)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               ok = False;
+                               break;
+                               }
+                       element->next = NULL;
+                       element->data = get_operator(&data[i]);
+                       if(element->data == OPERATOR_ERROR)
+                               {
+                               if(IS_2ND_OPERATOR(data[i + 1]))
+                                       print_msg(pi, MSGTYPE_ERROR, "Unknown operator %c%c", data[i], data[i + 1]);
+                               else
+                                       print_msg(pi, MSGTYPE_ERROR, "Unknown operator %c", data[i]);
+                               break;
+                               }
+                       *last_element = element;
+                       last_element = &element->next;
+                       if(IS_2ND_OPERATOR(data[i + 1]))
+                               i++;
+                       count++;
+                       first_flag = True;
+                       unary = 0;
+                       }
+               else
+                       {
+                       element = malloc(sizeof(struct element));
+                       if(!element)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               ok = False;
+                               break;
+                               }
+                       element->next = NULL;
+                       length = 0;
+                       if(isdigit(data[i]))
+                               {
+                               if(tolower(data[i + 1]) == 'x')
+                                       {
+                                       i += 2;
+                                       while(isxdigit(data[i + length])) length++; // TODO: Sjekk overflow
+                                       element->data = atox_n(&data[i], length);
+                                       }
+                               else if(tolower(data[i + 1]) == 'b')
+                                       {
+                                       i += 2;
+                                       element->data = 0;
+                                       while((data[i + length] == '1') || (data[i + length] == '0'))
+                                               {
+                                               element->data <<= 1;
+                                               element->data |= data[i + length++] - '0'; // TODO: Sjekk overflow
+                                               }
+                                       }
+                               else
+                                       {
+                                       while(isdigit(data[i + length])) length++;
+                                       element->data = atoi_n(&data[i], length); // TODO: Sjekk overflow
+                                       }
+                               }
+                       else if(data[i] == '$')
+                               {
+                               i++;
+                               while(isxdigit(data[i + length])) length++;
+                               element->data = atox_n(&data[i], length); // TODO: Sjekk overflow
+                               }
+                       else if(data[i] == '\'')
+                               {
+                               i++;
+                               element->data = data[i]; // TODO: Sjekk for siste '
+                               length = 2;
+                               }
+                       else if(data[i] == '(')
+                               {
+                               i++;
+                               length = par_length(&data[i]);
+                               if(length == -1)
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Missing ')'");
+                                       break;
+                                       }
+                               data[i + length++] = '\0';
+                               ok = get_expr(pi, &data[i], &element->data);
+                               if(!ok)
+                                       break;
+                               }
+                       else if(-1 != (function = get_function(&data[i])))
+                               {
+                               while(data[i] != '(') i++;
+                               i++;
+                               length = par_length(&data[i]);
+                               if(length == -1)
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Missing ')'");
+                                       break;
+                                       }
+                               data[i + length++] = '\0';
+                               ok = get_expr(pi, &data[i], &element->data);
+                               if(!ok)
+                                       break;
+                               element->data = do_function(function, element->data);
+                               }
+                       else if(!nocase_strncmp(&data[i], "defined(", 8))
+                               {
+                               i += 8;
+                               length = par_length(&data[i]);
+                               if(length == -1)
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Missing ')'");
+                                       break;
+                                       }
+                               data[i + length++] = '\0';
+                               if(get_symbol(pi, &data[i], NULL))
+                                       element->data = 1;
+                               else
+                                       element->data = 0;
+                               }
+                       else if(!nocase_strncmp(&data[i], "supported(", 10))
+                               {
+                               i += 10;
+                               length = par_length(&data[i]);
+                               if(length == -1)
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Missing ')'");
+                                       break;
+                                       }
+                               data[i + length++] = '\0';
+                               element->data=is_supported(pi, &data[i]);
+                               if (element->data<0)
+                                       {
+                                       if (toupper(data[i])=='X')
+                                               {
+                                               if (pi->device->flag&DF_NO_XREG) element->data = 0;
+                                               else element->data = 1;
+                                               }
+                                       else if (toupper(data[i])=='Y')
+                                               {
+                                               if (pi->device->flag&DF_NO_YREG) element->data = 0;
+                                               else element->data = 1;
+                                               }
+                                       else if (toupper(data[i])=='Z')
+                                               element->data = 1;
+                                       else
+                                               {
+                                               print_msg(pi, MSGTYPE_ERROR, "Unknown mnemonic: %s",&data[i]);
+                                               element->data = 0;
+                                               }
+                                       }
+                               }
+                       else
+                               {
+                               while(IS_LABEL(data[i + length])) length++;
+                               if((length == 2) && !nocase_strncmp(&data[i], "PC", 2))
+                                       element->data = pi->cseg_addr;
+                               else
+                                       {
+                                       label = malloc(length + 1);
+                                       if(!label)
+                                               {
+                                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                                               ok = False;
+                                               break;
+                                               }
+                                       strncpy(label, &data[i], length);
+                                       label[length] = '\0';
+                                       if(get_symbol(pi, label, &element->data))
+                                               free(label);
+                                       else
+                                               {
+                                               print_msg(pi, MSGTYPE_ERROR, "Found no label/variable/constant named %s", label);
+                                               free(label);
+                                               break;
+                                               }
+                                       }
+                               }
+                       i += length - 1;
+                       switch(unary) // TODO: Få den til å takle flere unary på rad.
+                               {
+                               case '-':
+                                       element->data = -element->data;
+                                       break;
+                               case '!':
+                                       element->data = !element->data;
+                                       break;
+                               case '~':
+                                       element->data = ~element->data;
+                               }
+                       *last_element = element;
+                       last_element = &element->next;
+                       count++;
+                       first_flag = False;
+                       }
+               }
+       if(end)
+               {
+               for(i = 13; (i >= 4) && (count != 1); i--)
+                       {
+                       for(element = first_element; element->next;)
+                               {
+                               if(test_operator_at_precedence(element->next->data, i)) // TODO: Vurder en hi_i for kjapphet
+                                       {
+                                       element->data = calc(pi, element->data, element->next->data, element->next->next->data);
+                                       temp_element = element->next->next->next;
+                                       free(element->next->next);
+                                       free(element->next);
+                                       count -= 2;
+                                       element->next = temp_element;
+                                       }
+                               else
+                                       element = element->next->next;
+                               }
+                       }
+               *value = first_element->data;
+               }
+       for(element = first_element; element;)
+               {
+               temp_element = element;
+               element = element->next;
+               free(temp_element);
+               }
+       return(ok);
+       }
+
+
+int get_operator(char *op)
+       {
+       switch(op[0])
+               {
+               case '*':
+                       return(OPERATOR_MUL);
+               case '/':
+                       return(OPERATOR_DIV);
+               case '%':
+                       return(OPERATOR_MOD);
+               case '+':
+                       return(OPERATOR_ADD);
+               case '-':
+                       return(OPERATOR_SUB);
+               case '<':
+                       switch(op[1])
+                               {
+                               case '<':
+                                       return(OPERATOR_SHIFT_LEFT);
+                               case '=':
+                                       return(OPERATOR_LESS_OR_EQUAL);
+                               default:
+                                       return(OPERATOR_LESS_THAN);
+                               }
+               case '>':
+                       switch(op[1])
+                               {
+                               case '>':
+                                       return(OPERATOR_SHIFT_RIGHT);
+                               case '=':
+                                       return(OPERATOR_GREATER_OR_EQUAL);
+                               default:
+                                       return(OPERATOR_GREATER_THAN);
+                               }
+               case '=':
+                       if(op[1] == '=')
+                               return(OPERATOR_EQUAL);
+               case '!':
+                       if(op[1] == '=')
+                               return(OPERATOR_NOT_EQUAL);
+               case '&':
+                       if(op[1] == '&')
+                               return(OPERATOR_LOGICAL_AND);
+                       else
+                               return(OPERATOR_BITWISE_AND);
+               case '^':
+                       return(OPERATOR_BITWISE_XOR);
+               case '|':
+                       if(op[1] == '|')
+                               return(OPERATOR_LOGICAL_OR);
+                       else
+                               return(OPERATOR_BITWISE_OR);
+               }
+       return(OPERATOR_ERROR);
+       }
+
+
+int test_operator_at_precedence(int operator, int precedence)
+       {
+       switch(precedence)
+               {
+               case 13:
+                       return((operator == OPERATOR_MUL) || (operator == OPERATOR_DIV)
+                              || (operator == OPERATOR_MOD));
+               case 12:
+                       return((operator == OPERATOR_ADD) || (operator == OPERATOR_SUB));
+               case 11:
+                       return((operator == OPERATOR_SHIFT_LEFT) || (operator == OPERATOR_SHIFT_RIGHT));
+               case 10:
+                       return((operator == OPERATOR_LESS_THAN) || (operator == OPERATOR_LESS_OR_EQUAL)
+                              || (operator == OPERATOR_GREATER_THAN) || (operator == OPERATOR_GREATER_OR_EQUAL));
+               case 9:
+                       return((operator == OPERATOR_EQUAL) || (operator == OPERATOR_NOT_EQUAL));
+               case 8:
+                       return(operator == OPERATOR_BITWISE_AND);
+               case 7:
+                       return(operator == OPERATOR_BITWISE_XOR);
+               case 6:
+                       return(operator == OPERATOR_BITWISE_OR);
+               case 5:
+                       return(operator == OPERATOR_LOGICAL_AND);
+               default: /* Makes the compiler shut up */
+               case 4:
+                       return(operator == OPERATOR_LOGICAL_OR);
+               }
+       }
+
+
+int calc(struct prog_info *pi, int left, int operator, int right) // TODO: Sjekk litt resultater
+       {
+       switch(operator)
+               {
+               case OPERATOR_MUL:
+                       return(left * right);
+               case OPERATOR_DIV:
+                       if(right == 0)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "Division by zero");
+                               return(0);
+                               }
+                       return(left / right);
+               case OPERATOR_MOD:
+                       if(right == 0)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "Division by zero (modulus operator)");
+                               return(0);
+                               }
+                       return(left % right);
+               case OPERATOR_ADD:
+                       return(left + right);
+               case OPERATOR_SUB:
+                       return(left - right);
+               case OPERATOR_SHIFT_LEFT:
+                       return(left << right);
+               case OPERATOR_SHIFT_RIGHT:
+                       return(left >> right);
+               case OPERATOR_LESS_THAN:
+                       return(left < right);
+               case OPERATOR_LESS_OR_EQUAL:
+                       return(left <= right);
+               case OPERATOR_GREATER_THAN:
+                       return(left > right);
+               case OPERATOR_GREATER_OR_EQUAL:
+                       return(left >= right);
+               case OPERATOR_EQUAL:
+                       return(left == right);
+               case OPERATOR_NOT_EQUAL:
+                       return(left != right);
+               case OPERATOR_BITWISE_AND:
+                       return(left & right);
+               case OPERATOR_BITWISE_XOR:
+                       return(left ^ right);
+               case OPERATOR_BITWISE_OR:
+                       return(left | right);
+               case OPERATOR_LOGICAL_AND:
+                       return(left && right);
+               default: /* Make the compiler shut up */
+               case OPERATOR_LOGICAL_OR:
+                       return(left || right);
+               }
+       }
+
+
+int get_function(char *function)
+       {
+       int i;
+
+       for(i = 0; i < FUNCTION_COUNT; i++)
+               if(!nocase_strncmp(function, function_list[i], strlen(function_list[i]))) return(i);
+       return(-1);
+       }
+
+
+int do_function(int function, int value)
+       {
+       switch(function)
+               {
+               case FUNCTION_LOW:
+                       return(value & 0xff);
+               case FUNCTION_HIGH:
+               case FUNCTION_BYTE2:
+                       return((value >> 8) & 0xff);
+               case FUNCTION_BYTE3:
+                       return((value >> 16) & 0xff);
+               case FUNCTION_BYTE4:
+                       return((value >> 24) & 0xff);
+               case FUNCTION_LWRD:
+                       return(value & 0xffff);
+               case FUNCTION_HWRD:
+                       return((value >> 16) & 0xffff);
+               case FUNCTION_PAGE:
+                       return((value >> 16) & 0xff);
+               case FUNCTION_EXP2:
+                       return(1 << value);
+               case FUNCTION_LOG2:
+                       return(log2(value));
+               default:
+                       return(0);
+               }
+       }
+
+
+int log2(int value)
+       {
+       int i = 0;
+
+       while(value >>= 1) i++;
+       return(i);
+       }
+
+
+int get_symbol(struct prog_info *pi, char *label_name, int *data)
+       {
+       struct label *label;
+       struct macro_call *macro_call;
+
+       for(label = pi->first_constant; label; label = label->next)
+               if(!nocase_strcmp(label->name, label_name))
+                       {
+                       if(data)
+                               *data = label->value;
+                       return(True);
+                       }
+
+       for(label = pi->first_variable; label; label = label->next)
+               if(!nocase_strcmp(label->name, label_name))
+                       {
+                       if(data)
+                               *data = label->value;
+                       return(True);
+                       }
+
+       for(macro_call = pi->macro_call; macro_call; macro_call = macro_call->prev_on_stack)
+               {
+               for(label = pi->macro_call->first_label; label; label = label->next)
+                       if(!nocase_strcmp(label->name, label_name))
+                               {
+                               if(data)
+                                       *data = label->value;
+                               return(True);
+                               }
+               }
+
+       for(label = pi->first_label; label; label = label->next)
+               if(!nocase_strcmp(label->name, label_name))
+                       {
+                       if(data)
+                               *data = label->value;
+                       return(True);
+                       }
+
+       return(False);
+       }
+
+
+int par_length(char *data)
+       {
+       int i = 0, b_count = 1;
+
+       for(;;)
+               {
+               if(data[i] == ')')
+                       {
+                       b_count--;
+                       if(!b_count)
+                               return(i);
+                       }
+               else if(data[i] == '(')
+                       b_count++;
+               else if(data[i] == '\0')
+                       return(-1);
+               i++;
+               }
+       }
+
+
+
diff --git a/src/mkutil/avra-0.8/SOURCE/file.c b/src/mkutil/avra-0.8/SOURCE/file.c
new file mode 100644 (file)
index 0000000..a14654d
--- /dev/null
@@ -0,0 +1,272 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "misc.h"
+#include "avra.h"
+#include "args.h"
+
+
+int open_out_files(struct prog_info *pi, char *filename)
+       {
+       int length;
+       char *buff;
+       time_t tp;
+       int ok; /* flag for coff results */
+
+       length = strlen(filename);
+       buff = malloc(length + 9);
+       if(buff)
+               {
+               strcpy(buff, filename);
+               if(length >= 4)
+                       if(!nocase_strcmp(&buff[length - 4], ".asm"))
+                               {
+                               length -= 4;
+                               buff[length] = '\0';
+                               }
+               strcpy(&buff[length], ".list");
+               pi->list_file = fopen(buff, "w");
+               if(pi->cseg_count)
+                       {
+                       strcpy(&buff[length], ".hex");
+                       pi->hfi = open_hex_file(buff);
+                       strcpy(&buff[length], ".obj");
+                       pi->obj_file = open_obj_file(pi, buff);
+                       }
+               if(pi->eseg_count)
+                       {
+                       strcpy(&buff[length], ".eep.hex");
+                       pi->eep_hfi = open_hex_file(buff);
+                       }
+
+               if(GET_ARG(pi->args, ARG_COFF)){
+                       strcpy(&buff[length], ".cof");
+                       pi->coff_file = open_coff_file(pi, buff);
+                       if( pi->coff_file )
+                               ok = True;
+                       else
+                               ok = False;
+               }
+               else{
+                       pi->coff_file = 0;
+                       ok = True;
+               }
+
+               free(buff);
+
+               if(pi->list_file && pi->obj_file && (!pi->cseg_count || pi->hfi) && (!pi->eseg_count || pi->eep_hfi) && ok)
+                       {
+                       if(time(&tp) != -1)
+                               fprintf(pi->list_file, "\navra   ver. %d.%d  %s %s\n\n", VERSION, REVISION, filename, ctime(&tp));
+                       return(True);
+                       }
+               else
+                       close_out_files(pi);
+               }
+       else
+               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+       return(False);
+       }
+
+
+void close_out_files(struct prog_info *pi)
+       {
+       if(pi->error_count == 0)
+               {
+               printf("Segment usage:\n"
+                      "   Code      :   %7d words (%d bytes)\n"
+                      "   Data      :   %7d bytes\n"
+                      "   EEPROM    :   %7d bytes\n",
+                      pi->cseg_count, pi->cseg_count * 2, pi->dseg_count, pi->eseg_count);
+               }
+       if(pi->hfi) close_hex_file(pi->hfi);
+       if(pi->eep_hfi) close_hex_file(pi->eep_hfi);
+       if(pi->list_file)
+               {
+               if(pi->error_count == 0)
+                       fprintf(pi->list_file, "\nAssembly completed with no errors.\n");
+               fclose(pi->list_file);
+               }
+       if(pi->obj_file) close_obj_file(pi, pi->obj_file);
+       if(pi->coff_file) close_coff_file(pi, pi->coff_file);
+       }
+
+
+struct hex_file_info *open_hex_file(char *filename)
+       {
+       struct hex_file_info *hfi;
+
+       hfi = calloc(1, sizeof(struct hex_file_info));
+       if(hfi)
+               {
+               hfi->segment = -1;
+               hfi->fp = fopen(filename, "wb");
+               if(!hfi->fp)
+                       {
+                       close_hex_file(hfi);
+                       hfi = NULL;
+                       }
+               }
+       return(hfi);
+       }
+
+
+void close_hex_file(struct hex_file_info *hfi)
+       {
+       if(hfi->fp)
+               {
+               if(hfi->count != 0)
+                 do_hex_line(hfi);
+               fprintf(hfi->fp, ":00000001FF\x0d\x0a");
+               fclose(hfi->fp);
+               }
+       free(hfi);
+       }
+
+
+void write_ee_byte(struct prog_info *pi, int address, unsigned char data)
+       {
+       if((pi->eep_hfi->count == 16) || ((address != (pi->eep_hfi->linestart_addr + pi->eep_hfi->count)) && (pi->eep_hfi->count != 0)))
+               do_hex_line(pi->eep_hfi);
+       if(pi->eep_hfi->count == 0)
+               pi->eep_hfi->linestart_addr = address;
+       pi->eep_hfi->hex_line[pi->eep_hfi->count++] = data;
+
+       if(pi->coff_file)
+               write_coff_eeprom(pi, address, data);
+       }
+
+
+void write_prog_word(struct prog_info *pi, int address, int data)
+       {
+       write_obj_record(pi, address, data);
+       address *= 2;
+       if(pi->hfi->segment != (address >> 16))
+       {
+         if(pi->hfi->count != 0)
+           do_hex_line(pi->hfi);
+         pi->hfi->segment = address >> 16;
+         if(pi->hfi->segment >= 16) // Use 04 record for addresses above 1 meg since 02 can support max 1 meg
+           fprintf(pi->hfi->fp, ":02000004%04X%02X\x0d\x0a", pi->hfi->segment & 0xffff,
+                   (0 - 2 - 4 - ((pi->hfi->segment >> 8) & 0xff) - (pi->hfi->segment & 0xff)) & 0xff);
+         else // Use 02 record for addresses below 1 meg since more programmers know about the 02 instead of the 04
+           fprintf(pi->hfi->fp, ":02000002%04X%02X\x0d\x0a", (pi->hfi->segment << 12) & 0xffff,
+                   (0 - 2 - 2 - ((pi->hfi->segment << 4) & 0xf0)) & 0xff);
+       }
+       if((pi->hfi->count == 16) || ((address != (pi->hfi->linestart_addr + pi->hfi->count)) && (pi->hfi->count != 0)))
+               do_hex_line(pi->hfi);
+       if(pi->hfi->count == 0)
+               pi->hfi->linestart_addr = address;
+       pi->hfi->hex_line[pi->hfi->count++] = data & 0xff;
+       pi->hfi->hex_line[pi->hfi->count++] = (data >> 8) & 0xff;
+
+       if(pi->coff_file != 0)
+               write_coff_program(pi, address, data);
+       }
+
+
+void do_hex_line(struct hex_file_info *hfi)
+       {
+       int i;
+       unsigned char checksum = 0;
+
+       fprintf(hfi->fp, ":%02X%04X00", hfi->count, hfi->linestart_addr & 0xffff);
+       checksum -= hfi->count + ((hfi->linestart_addr >> 8) & 0xff) + (hfi->linestart_addr & 0xff);
+       for(i = 0; i < hfi->count; i++)
+               {
+               fprintf(hfi->fp, "%02X", hfi->hex_line[i]);
+               checksum -= hfi->hex_line[i];
+               }
+       fprintf(hfi->fp, "%02X\x0d\x0a", checksum);
+       hfi->count = 0;
+       }
+
+
+FILE *open_obj_file(struct prog_info *pi, char *filename)
+       {
+       int i;
+       FILE *fp;
+       struct include_file *include_file;
+
+       fp = fopen(filename, "wb");
+       if(fp)
+               {
+               i = pi->cseg_count * 9 + 26;
+               fputc((i >> 24) & 0xff, fp);
+               fputc((i >> 16) & 0xff, fp);
+               fputc((i >> 8) & 0xff, fp);
+               fputc(i & 0xff, fp);
+               i = 26;
+               fputc((i >> 24) & 0xff, fp);
+               fputc((i >> 16) & 0xff, fp);
+               fputc((i >> 8) & 0xff, fp);
+               fputc(i & 0xff, fp);
+               fputc(9, fp);
+               i = 0;
+               for(include_file = pi->first_include_file; include_file; include_file = include_file->next)
+                       i++;
+               fputc(i, fp);
+               fprintf(fp, "AVR Object File");
+               fputc('\0', fp);
+               }
+       return(fp);
+       }
+
+
+void close_obj_file(struct prog_info *pi, FILE *fp)
+       {
+       struct include_file *include_file;
+
+       for(include_file = pi->first_include_file; include_file; include_file = include_file->next)
+               {
+               fprintf(fp, "%s", include_file->name);
+               fputc('\0', fp);
+               }
+       fputc('\0', fp);
+       fclose(fp);
+       }
+
+
+void write_obj_record(struct prog_info *pi, int address, int data)
+       {
+       fputc((address >> 16) & 0xff, pi->obj_file);
+       fputc((address >> 8) & 0xff, pi->obj_file);
+       fputc(address & 0xff, pi->obj_file);
+       fputc((data >> 8) & 0xff, pi->obj_file);
+       fputc(data & 0xff, pi->obj_file);
+       fputc(pi->fi->include_file->num & 0xff, pi->obj_file);
+       fputc((pi->fi->line_number >> 8) & 0xff, pi->obj_file);
+       fputc(pi->fi->line_number & 0xff, pi->obj_file);
+       if(pi->macro_call)
+               fputc(1, pi->obj_file);
+       else
+               fputc(0, pi->obj_file);
+       }
diff --git a/src/mkutil/avra-0.8/SOURCE/macro.c b/src/mkutil/avra-0.8/SOURCE/macro.c
new file mode 100644 (file)
index 0000000..14b38af
--- /dev/null
@@ -0,0 +1,427 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "args.h"
+#include "avra.h"
+#include "device.h"
+
+int read_macro(struct prog_info *pi, char *name, int pass)
+       {
+       int loopok, i;
+       struct macro *macro;
+       struct macro_line *macro_line, **last_macro_line;
+
+       if(pass == PASS_1)
+               {
+               if(!name)
+                       {
+                       print_msg(pi, MSGTYPE_ERROR, "Missing macro name");
+                       return(True);
+                       }
+               get_next_token(name, TERM_END);
+               // TODO: Sjekk om navnet er gyldig. Bare isalnum() og '_'
+               macro = calloc(1, sizeof(struct macro));
+               if(!macro)
+                       {
+                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                       return(False);
+                       }
+               if(pi->last_macro)
+                       pi->last_macro->next = macro;
+               else
+                       pi->first_macro = macro;
+               pi->last_macro = macro;
+               macro->name = malloc(strlen(name) + 1);
+               if(!macro->name)
+                       {
+                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                       return(False);
+                       }
+               strcpy(macro->name, name);
+               macro->include_file = pi->fi->include_file;
+               macro->first_line_number = pi->fi->line_number;
+               last_macro_line = &macro->first_macro_line;
+               }
+       else if(pi->list_line && pi->list_on) /* pass == PASS_2 */
+               {
+               fprintf(pi->list_file, "          %s", pi->list_line);
+               pi->list_line = NULL;
+               }
+       loopok = True;
+       while(loopok)
+               {
+               if(fgets(pi->fi->buff, LINEBUFFER_LENGTH, pi->fi->fp))
+                       {
+                       pi->fi->line_number++;
+                       i = 0;
+                       while(IS_HOR_SPACE(pi->fi->buff[i]) && !IS_END(pi->fi->buff[i])) i++;
+                       if(pi->fi->buff[i] == '.')
+                               {
+                               i++;
+                               if(!nocase_strncmp(&pi->fi->buff[i], "endm", 4)) // TODO: Vurder å sjekke navnet bedre
+                                       loopok = False;
+                               }
+                       if(pass == PASS_1)
+                               {
+                               if(loopok)
+                                       {
+                                       macro_line = calloc(1, sizeof(struct macro_line));
+                                       if(!macro_line)
+                                               {
+                                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                                               return(False);
+                                               }
+                                       *last_macro_line = macro_line;
+                                       last_macro_line = &macro_line->next;
+                                       macro_line->line = malloc(strlen(pi->fi->buff) + 1);
+                                       if(!macro_line->line)
+                                               {
+                                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                                               return(False);
+                                               }
+                                       strcpy(macro_line->line, pi->fi->buff);
+                                       }
+                               }
+                       else if(pi->fi->buff && pi->list_file)
+                               {
+                               if(pi->fi->buff[i] == ';')
+                                       fprintf(pi->list_file, "         %s", pi->fi->buff);
+                               else
+                                       fprintf(pi->list_file, "          %s", pi->fi->buff);
+                               }
+                       }
+               else
+                       {
+                       if(feof(pi->fi->fp))
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "Found no closing .ENDMACRO");
+                               return(True);
+                               }
+                       else
+                               {
+                               perror(pi->fi->include_file->name);
+                               return(False);
+                               }
+                       }
+               }
+       return(True);
+       }
+
+
+struct macro *get_macro(struct prog_info *pi, char *name)
+       {
+       struct macro *macro;
+
+       for(macro = pi->first_macro; macro; macro = macro->next)        
+               if(!nocase_strcmp(macro->name, name))
+                       return(macro);
+       return(NULL);
+       }
+/*
+append_arg(char * argfield, char * arg)
+{
+       argfield = arg;
+}
+*/
+
+void append_type(struct prog_info *pi, char *name, int c, char *value)
+{
+       int p;
+       struct def *def;
+
+       p = strlen(name);
+       name[p++] = '_';
+
+       if(c == 0)
+       {
+               name[p++] = 'v';
+               name[p] = '\0';
+               return;
+       }
+
+       for(def = pi->first_def; def; def = def->next)
+               if(!nocase_strcmp(def->name, value))
+               {
+                       itoa((c*8),&name[p],10);
+                       return;
+               }
+
+       name[p++] = 'i';
+       name[p] = '\0';
+}
+       
+/*
+ * This routine replaces the macro call with mnemonics
+ */
+
+int expand_macro(struct prog_info *pi, struct macro *macro, char *rest_line, int pass)
+{
+       int ok = True, macro_arg_count = 0, i, j;
+       char *line, *temp, *macro_args[MAX_MACRO_ARGS];
+       char buff[LINEBUFFER_LENGTH];
+       struct macro_line *old_macro_line;
+       struct macro_call *macro_call;
+
+       // added by TW
+       int             off,a,c ;
+       char    arg,ec = False; // extended code switch
+       char    macro_argtype[MAX_MACRO_ARGS][4]; // 3D array for argument types and name translation
+       char    *nmn; //string buffer for new macro name
+       char    buffer[LINEBUFFER_LENGTH];
+       int             p;
+
+       if(rest_line)
+       {
+               line = malloc(strlen(rest_line) + 1);
+               if(!line)
+               {
+                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                       return(False);
+               }
+               strcpy(line, rest_line);
+               temp = line;
+               
+               /*  here we split up the macro arguments into "macro_args"
+                *  Extended macro code interpreter added by TW 2002
+                */
+               
+               if( temp[0] == '[' ) // there must be "[" "," "]", else it is garbage
+               {
+                       if(!strchr(temp, ']'))
+                       {
+                               print_msg(pi, MSGTYPE_ERROR, "found no ']'");
+                               return(False);
+                       }
+                       temp = &temp[1]; // skip the first bracket
+                       nmn = malloc(LINEBUFFER_LENGTH);
+                       if(!nmn)
+                       {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                       }
+                       strcpy(nmn,macro->name); // create a new macro name buffer
+                       c = 1; // byte counter
+                       //ec = True; // switch to ext. code
+                       arg = True; // loop flag
+
+                       while(arg)
+                       {
+                               while(IS_HOR_SPACE(temp[0])) //skip leading spaces
+                       {       temp = &temp[1];        }
+
+                               off = 0; // pointer offset
+
+                               do
+                               {
+                                       switch(temp[off]) //test current character code
+                                       {
+                                               case ':':
+                                                       temp[off] = '\0';
+                                                       if(off > 0)
+                                                       {
+                                                               c++;
+                                                               macro_args[macro_arg_count++] = temp;
+                                                       }
+                                                       else
+                                                       {
+                                                               print_msg(pi, MSGTYPE_ERROR, "missig register before ':'",nmn);
+                                                               return(False);
+                                                       }
+                                                       break;
+
+                                               case ']':
+                                                       arg = False;
+                                       case ',':
+                                                       a = off;
+                                                       do temp[a--] = '\0'; while( IS_HOR_SPACE(temp[a]) );
+                                               if(off > 0)
+                                                       {
+                                                               macro_args[macro_arg_count++] = temp;
+                                                               append_type(pi, nmn, c, temp);
+                                                               c = 1;
+                                                       }
+                                                       else
+                                                       {
+                                                               append_type(pi, nmn, 0, temp);
+                                                               c = 1;
+                                                       }
+                                                       break;
+
+                                               default:
+                                                       off++;
+                                    }
+                                }
+                                while(temp[off] != '\0');
+
+                                if(arg) temp = &temp[off+1];
+                                else break;
+                       }
+
+                       macro = get_macro(pi,nmn);
+               if(macro == NULL)
+               {
+                               print_msg(pi, MSGTYPE_ERROR, "Macro %s not defined !",nmn);
+                               return(False);
+                       }
+               }
+               else
+               {
+               line = malloc(strlen(rest_line) + 1);
+               if(!line)
+                       {
+                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                       return(False);
+                       }
+               strcpy(line, rest_line);
+               temp = line;
+               while(temp)
+                       {
+                       macro_args[macro_arg_count++] = temp;
+                       temp = get_next_token(temp, TERM_COMMA);
+                       }
+               }
+
+
+
+/*
+       if(IS_END(temp[i]))
+               {
+               temp[i--] = '\0';
+               while(IS_HOR_SPACE(temp[i])) temp[i--] = '\0';
+               return(0);
+               }
+
+                *   former code from orginial
+        while(temp) // as long as there valid data in "temp"
+                       {
+                        macro_args[macro_arg_count++] = temp; 
+                        temp = get_next_token(temp, TERM_COMMA);
+                       }
+                       */
+               }
+
+       if(pass == PASS_1)
+               {
+               macro_call = calloc(1, sizeof(struct macro_call));
+               if(!macro_call)
+                       {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               return(False);
+                       }
+               if(pi->last_macro_call)
+                       pi->last_macro_call->next = macro_call;
+               else
+                       pi->first_macro_call = macro_call;
+               pi->last_macro_call = macro_call;
+               macro_call->line_number = pi->fi->line_number;
+               macro_call->include_file = pi->fi->include_file;
+               macro_call->macro = macro;
+               macro_call->prev_on_stack = pi->macro_call;
+               if(macro_call->prev_on_stack)
+                       {
+                       macro_call->nest_level = macro_call->prev_on_stack->nest_level + 1;
+                       macro_call->prev_line_index = macro_call->prev_on_stack->line_index;
+                       }
+               }
+       else
+               {
+               for(macro_call = pi->first_macro_call; macro_call; macro_call = macro_call->next)
+                       {
+                       if((macro_call->include_file->num == pi->fi->include_file->num)
+                          && (macro_call->line_number == pi->fi->line_number))
+                               {
+                               if(pi->macro_call)
+                                       {
+                                       /* Find correct macro_call when using recursion and nesting */
+                                       if(macro_call->prev_on_stack == pi->macro_call)
+                                               if((macro_call->nest_level == (pi->macro_call->nest_level + 1))
+                                                  && (macro_call->prev_line_index == pi->macro_call->line_index))
+                                                       break;
+                                       }
+                               else
+                                       break;
+                               }
+                       }
+               if(pi->list_line && pi->list_on)
+                       {
+                       fprintf(pi->list_file, "%06x   +  %s", pi->cseg_addr, pi->list_line);
+                       pi->list_line = NULL;
+                       }
+               }
+       macro_call->line_index = 0;
+       pi->macro_call = macro_call;
+       old_macro_line = pi->macro_line;
+       for(pi->macro_line = macro->first_macro_line; pi->macro_line && ok; pi->macro_line = pi->macro_line->next)
+               {
+               macro_call->line_index++;
+               if(GET_ARG(pi->args, ARG_LISTMAC))
+                       pi->list_line = buff;
+               else
+                       pi->list_line = NULL;
+               for(i = 0, j = 0; pi->macro_line->line[i] != '\0'; i++)
+                       {
+                       if(pi->macro_line->line[i] == '@')
+                               {
+                               i++;
+                               if(!isdigit(pi->macro_line->line[i]))
+                                       print_msg(pi, MSGTYPE_ERROR, "@ must be followed by a number");
+                               else if((pi->macro_line->line[i] - '0') >= macro_arg_count)
+                                       print_msg(pi, MSGTYPE_ERROR, "Missing macro argument (for @%c)", pi->macro_line->line[i]);
+                               else
+                                       {
+                                       strcpy(&buff[j], macro_args[pi->macro_line->line[i] - '0']);
+                                       j += strlen(macro_args[pi->macro_line->line[i] - '0']);
+                                       }
+                               }
+                       else
+                               buff[j++] = pi->macro_line->line[i];
+                       }
+               buff[j] = '\0';
+               ok = parse_line(pi, buff, pass);
+               if(ok)
+                       {
+                       if((pass == PASS_2) && pi->list_line && pi->list_on)
+                               fprintf(pi->list_file, "         %s", pi->list_line);
+                       if(pi->error_count >= pi->max_errors)
+                               {
+                               print_msg(pi, MSGTYPE_MESSAGE, "Maximum error count reached. Exiting...");
+                               break;
+                               }
+                       }
+               }
+       pi->macro_line = old_macro_line;
+       pi->macro_call = macro_call->prev_on_stack;
+       if(rest_line)
+               free(line);
+       return(ok);
+       }
+       
diff --git a/src/mkutil/avra-0.8/SOURCE/map.c b/src/mkutil/avra-0.8/SOURCE/map.c
new file mode 100644 (file)
index 0000000..04ce83c
--- /dev/null
@@ -0,0 +1,70 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include "avra.h"
+#include <stdio.h>
+#include <string.h>
+#include "args.h"
+
+char *Space(char *n);
+
+void write_map_file(struct prog_info *pi)
+       {
+       FILE *fp;
+       struct label *label;
+       char File[200],*P;
+
+       strcpy(File,(char *)pi->args->first_data->data);
+       P = strrchr(File,'.');
+       if( P ) *P = 0;
+       strcat(File,".map");
+       fp = fopen(File,"w");
+       if( fp == NULL ) {
+               fprintf(stderr,"Error: cannot write map file\n");
+               return;
+       }
+       for(label = pi->first_constant; label; label = label->next)
+               fprintf(fp,"%s%sC\t%04x\t%d\n",label->name,Space(label->name),label->value,label->value);
+
+       for(label = pi->first_variable; label; label = label->next)
+               fprintf(fp,"%s%sV\t%04x\t%d\n",label->name,Space(label->name),label->value,label->value);
+
+       for(label = pi->first_label; label; label = label->next)
+               fprintf(fp,"%s%sL\t%04x\t%d\n",label->name,Space(label->name),label->value,label->value);
+
+       fprintf(fp,"\n");
+       fclose(fp);
+       return;
+       }
+
+char *Space(char *n) {
+       int i;
+
+       i = strlen(n);
+       if( i < 1) return "\t\t\t";
+       if( i < 8 ) return "\t\t";
+       return "\t";
+}
diff --git a/src/mkutil/avra-0.8/SOURCE/misc.h b/src/mkutil/avra-0.8/SOURCE/misc.h
new file mode 100644 (file)
index 0000000..b0a68be
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Misc stuff
+ */
+
+enum boolean {False = 0, True};
+
+enum filetype
+    {
+    AVRSTUDIO = 0,
+    GENERIC,
+    INTEL,
+    MOTOROLA
+    };
+
diff --git a/src/mkutil/avra-0.8/SOURCE/mnemonic.c b/src/mkutil/avra-0.8/SOURCE/mnemonic.c
new file mode 100644 (file)
index 0000000..3b0f1f5
--- /dev/null
@@ -0,0 +1,871 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "avra.h"
+#include "device.h"
+
+#define MAX_MNEMONIC_LEN       8       // Maximum mnemonic length
+
+enum
+       {
+       MNEMONIC_NOP = 0,  //          0000 0000 0000 0000
+       MNEMONIC_SEC,      //          1001 0100 0000 1000
+       MNEMONIC_CLC,      //          1001 0100 1000 1000
+       MNEMONIC_SEN,      //          1001 0100 0010 1000
+       MNEMONIC_CLN,      //          1001 0100 1010 1000
+       MNEMONIC_SEZ,      //          1001 0100 0001 1000
+       MNEMONIC_CLZ,      //          1001 0100 1001 1000
+       MNEMONIC_SEI,      //          1001 0100 0111 1000
+       MNEMONIC_CLI,      //          1001 0100 1111 1000
+       MNEMONIC_SES,      //          1001 0100 0100 1000
+       MNEMONIC_CLS,      //          1001 0100 1100 1000
+       MNEMONIC_SEV,      //          1001 0100 0011 1000
+       MNEMONIC_CLV,      //          1001 0100 1011 1000
+       MNEMONIC_SET,      //          1001 0100 0110 1000
+       MNEMONIC_CLT,      //          1001 0100 1110 1000
+       MNEMONIC_SEH,      //          1001 0100 0101 1000
+       MNEMONIC_CLH,      //          1001 0100 1101 1000
+       MNEMONIC_SLEEP,    //          1001 0101 1000 1000
+       MNEMONIC_WDR,      //          1001 0101 1010 1000
+       MNEMONIC_IJMP,     //          1001 0100 0000 1001
+       MNEMONIC_EIJMP,    //          1001 0100 0001 1001
+       MNEMONIC_ICALL,    //          1001 0101 0000 1001
+       MNEMONIC_EICALL,   //          1001 0101 0001 1001
+       MNEMONIC_RET,      //          1001 0101 0000 1000
+       MNEMONIC_RETI,     //          1001 0101 0001 1000
+       MNEMONIC_SPM,      //          1001 0101 1110 1000
+       MNEMONIC_ESPM,     //          1001 0101 1111 1000
+       MNEMONIC_BREAK,    //          1001 0101 1001 1000
+       MNEMONIC_LPM,      //          1001 0101 1100 1000
+       MNEMONIC_ELPM,     //          1001 0101 1101 1000
+       MNEMONIC_BSET,     // s        1001 0100 0sss 1000
+       MNEMONIC_BCLR,     // s        1001 0100 1sss 1000
+       MNEMONIC_SER,      // Rd       1110 1111 dddd 1111
+       MNEMONIC_COM,      // Rd       1001 010d dddd 0000
+       MNEMONIC_NEG,      // Rd       1001 010d dddd 0001
+       MNEMONIC_INC,      // Rd       1001 010d dddd 0011
+       MNEMONIC_DEC,      // Rd       1001 010d dddd 1010
+       MNEMONIC_LSR,      // Rd       1001 010d dddd 0110
+       MNEMONIC_ROR,      // Rd       1001 010d dddd 0111
+       MNEMONIC_ASR,      // Rd       1001 010d dddd 0101
+       MNEMONIC_SWAP,     // Rd       1001 010d dddd 0010
+       MNEMONIC_PUSH,     // Rr       1001 001r rrrr 1111
+       MNEMONIC_POP,      // Rd       1001 000d dddd 1111
+       MNEMONIC_TST,      // Rd       0010 00dd dddd dddd
+       MNEMONIC_CLR,      // Rd       0010 01dd dddd dddd
+       MNEMONIC_LSL,      // Rd       0000 11dd dddd dddd
+       MNEMONIC_ROL,      // Rd       0001 11dd dddd dddd
+       MNEMONIC_BREQ,     // k        1111 00kk kkkk k001
+       MNEMONIC_BRNE,     // k        1111 01kk kkkk k001
+       MNEMONIC_BRCS,     // k        1111 00kk kkkk k000
+       MNEMONIC_BRCC,     // k        1111 01kk kkkk k000
+       MNEMONIC_BRSH,     // k        1111 01kk kkkk k000
+       MNEMONIC_BRLO,     // k        1111 00kk kkkk k000
+       MNEMONIC_BRMI,     // k        1111 00kk kkkk k010
+       MNEMONIC_BRPL,     // k        1111 01kk kkkk k010
+       MNEMONIC_BRGE,     // k        1111 01kk kkkk k100
+       MNEMONIC_BRLT,     // k        1111 00kk kkkk k100
+       MNEMONIC_BRHS,     // k        1111 00kk kkkk k101
+       MNEMONIC_BRHC,     // k        1111 01kk kkkk k101
+       MNEMONIC_BRTS,     // k        1111 00kk kkkk k110
+       MNEMONIC_BRTC,     // k        1111 01kk kkkk k110
+       MNEMONIC_BRVS,     // k        1111 00kk kkkk k011
+       MNEMONIC_BRVC,     // k        1111 01kk kkkk k011
+       MNEMONIC_BRIE,     // k        1111 00kk kkkk k111
+       MNEMONIC_BRID,     // k        1111 01kk kkkk k111
+       MNEMONIC_RJMP,     // k        1100 kkkk kkkk kkkk
+       MNEMONIC_RCALL,    // k        1101 kkkk kkkk kkkk
+       MNEMONIC_JMP,      // k        1001 010k kkkk 110k + 16k
+       MNEMONIC_CALL,     // k        1001 010k kkkk 111k + 16k
+       MNEMONIC_BRBS,     // s, k     1111 00kk kkkk ksss
+       MNEMONIC_BRBC,     // s, k     1111 01kk kkkk ksss
+       MNEMONIC_ADD,      // Rd, Rr   0000 11rd dddd rrrr
+       MNEMONIC_ADC,      // Rd, Rr   0001 11rd dddd rrrr
+       MNEMONIC_SUB,      // Rd, Rr   0001 10rd dddd rrrr
+       MNEMONIC_SBC,      // Rd, Rr   0000 10rd dddd rrrr
+       MNEMONIC_AND,      // Rd, Rr   0010 00rd dddd rrrr
+       MNEMONIC_OR,       // Rd, Rr   0010 10rd dddd rrrr
+       MNEMONIC_EOR,      // Rd, Rr   0010 01rd dddd rrrr
+       MNEMONIC_CP,       // Rd, Rr   0001 01rd dddd rrrr
+       MNEMONIC_CPC,      // Rd, Rr   0000 01rd dddd rrrr
+       MNEMONIC_CPSE,     // Rd, Rr   0001 00rd dddd rrrr
+       MNEMONIC_MOV,      // Rd, Rr   0010 11rd dddd rrrr
+       MNEMONIC_MUL,      // Rd, Rr   1001 11rd dddd rrrr
+       MNEMONIC_MOVW,     // Rd, Rr   0000 0001 dddd rrrr
+       MNEMONIC_MULS,     // Rd, Rr   0000 0010 dddd rrrr
+       MNEMONIC_MULSU,    // Rd, Rr   0000 0011 0ddd 0rrr
+       MNEMONIC_FMUL,     // Rd, Rr   0000 0011 0ddd 1rrr
+       MNEMONIC_FMULS,    // Rd, Rr   0000 0011 1ddd 0rrr
+       MNEMONIC_FMULSU,   // Rd, Rr   0000 0011 1ddd 1rrr
+       MNEMONIC_ADIW,     // Rd, K    1001 0110 KKdd KKKK
+       MNEMONIC_SBIW,     // Rd, K    1001 0111 KKdd KKKK
+       MNEMONIC_SUBI,     // Rd, K    0101 KKKK dddd KKKK
+       MNEMONIC_SBCI,     // Rd, K    0100 KKKK dddd KKKK
+       MNEMONIC_ANDI,     // Rd, K    0111 KKKK dddd KKKK
+       MNEMONIC_ORI,      // Rd, K    0110 KKKK dddd KKKK
+       MNEMONIC_SBR,      // Rd, K    0110 KKKK dddd KKKK
+       MNEMONIC_CPI,      // Rd, K    0011 KKKK dddd KKKK
+       MNEMONIC_LDI,      // Rd, K    1110 KKKK dddd KKKK
+       MNEMONIC_CBR,      // Rd, K    0111 KKKK dddd KKKK ~K
+       MNEMONIC_SBRC,     // Rr, b    1111 110r rrrr 0bbb
+       MNEMONIC_SBRS,     // Rr, b    1111 111r rrrr 0bbb
+       MNEMONIC_BST,      // Rr, b    1111 101d dddd 0bbb
+       MNEMONIC_BLD,      // Rd, b    1111 100d dddd 0bbb
+       MNEMONIC_IN,       // Rd, P    1011 0PPd dddd PPPP
+       MNEMONIC_OUT,      // P, Rr    1011 1PPr rrrr PPPP
+       MNEMONIC_SBIC,     // P, b     1001 1001 PPPP Pbbb
+       MNEMONIC_SBIS,     // P, b     1001 1011 PPPP Pbbb
+       MNEMONIC_SBI,      // P, b     1001 1010 PPPP Pbbb
+       MNEMONIC_CBI,      // P, b     1001 1000 PPPP Pbbb
+       MNEMONIC_LDS,      // Rd, k    1001 000d dddd 0000 + 16k
+       MNEMONIC_STS,      // k, Rr    1001 001d dddd 0000 + 16k
+       MNEMONIC_LD,       // Rd, __   dummy
+       MNEMONIC_ST,       // __, Rr   dummy
+       MNEMONIC_LDD,      // Rd, _+q  dummy
+       MNEMONIC_STD,      // _+q, Rr  dummy
+       MNEMONIC_COUNT,
+       MNEMONIC_LPM_Z,    // Rd, Z    1001 000d dddd 0100
+       MNEMONIC_LPM_ZP,   // Rd, Z+   1001 000d dddd 0101
+       MNEMONIC_ELPM_Z,   // Rd, Z    1001 000d dddd 0110
+       MNEMONIC_ELPM_ZP,  // Rd, Z+   1001 000d dddd 0111
+       MNEMONIC_LD_X,     // Rd, X    1001 000d dddd 1100
+       MNEMONIC_LD_XP,    // Rd, X+   1001 000d dddd 1101
+       MNEMONIC_LD_MX,    // Rd, -X   1001 000d dddd 1110
+       MNEMONIC_LD_Y,     // Rd, Y    1000 000d dddd 1000
+       MNEMONIC_LD_YP,    // Rd, Y+   1001 000d dddd 1001
+       MNEMONIC_LD_MY,    // Rd, -Y   1001 000d dddd 1010
+       MNEMONIC_LD_Z,     // Rd, Z    1000 000d dddd 0000
+       MNEMONIC_LD_ZP,    // Rd, Z+   1001 000d dddd 0001
+       MNEMONIC_LD_MZ,    // Rd, -Z   1001 000d dddd 0010
+       MNEMONIC_ST_X,     // X, Rr    1001 001d dddd 1100
+       MNEMONIC_ST_XP,    // X+, Rr   1001 001d dddd 1101
+       MNEMONIC_ST_MX,    // -X, Rr   1001 001d dddd 1110
+       MNEMONIC_ST_Y,     // Y, Rr    1000 001d dddd 1000
+       MNEMONIC_ST_YP,    // Y+, Rr   1001 001d dddd 1001
+       MNEMONIC_ST_MY,    // -Y, Rr   1001 001d dddd 1010
+       MNEMONIC_ST_Z,     // Z, Rr    1000 001d dddd 0000
+       MNEMONIC_ST_ZP,    // Z+, Rr   1001 001d dddd 0001
+       MNEMONIC_ST_MZ,    // -Z, Rr   1001 001d dddd 0010
+       MNEMONIC_LDD_Y,    // Rd, Y+q  10q0 qq0d dddd 1qqq
+       MNEMONIC_LDD_Z,    // Rd, Z+q  10q0 qq0d dddd 0qqq
+       MNEMONIC_STD_Y,    // Y+q, Rr  10q0 qq1r rrrr 1qqq
+       MNEMONIC_STD_Z,    // Z+q, Rr  10q0 qq1r rrrr 0qqq
+       MNEMONIC_END
+       };
+
+struct instruction
+       {
+       char *mnemonic;
+       int opcode;
+        int flag;      /* Device flags meaning the instruction is not
+                           supported */
+       };
+
+struct instruction instruction_list[] =
+       {
+       {"nop",   0x0000,          0},
+       {"sec",   0x9408,          0},
+       {"clc",   0x9488,          0},
+       {"sen",   0x9428,          0},
+       {"cln",   0x94a8,          0},
+       {"sez",   0x9418,          0},
+       {"clz",   0x9498,          0},
+       {"sei",   0x9478,          0},
+       {"cli",   0x94f8,          0},
+       {"ses",   0x9448,          0},
+       {"cls",   0x94c8,          0},
+       {"sev",   0x9438,          0},
+       {"clv",   0x94b8,          0},
+       {"set",   0x9468,          0},
+       {"clt",   0x94e8,          0},
+       {"seh",   0x9458,          0},
+       {"clh",   0x94d8,          0},
+       {"sleep", 0x9588,          0},
+       {"wdr",   0x95a8,          0},
+       {"ijmp",  0x9409,  DF_TINY1X},
+       {"eijmp", 0x9419, DF_NO_EIJMP},
+       {"icall", 0x9509,  DF_TINY1X},
+       {"eicall",0x9519, DF_NO_EICALL},
+       {"ret",   0x9508,          0},
+       {"reti",  0x9518,          0},
+       {"spm",   0x95e8, DF_NO_SPM},
+       {"espm",  0x95f8, DF_NO_ESPM},
+       {"break", 0x9598, DF_NO_BREAK},
+       {"lpm",   0x95c8, DF_NO_LPM},
+       {"elpm",  0x95d8, DF_NO_ELPM},
+       {"bset",  0x9408,          0},
+       {"bclr",  0x9488,          0},
+       {"ser",   0xef0f,          0},
+       {"com",   0x9400,          0},
+       {"neg",   0x9401,          0},
+       {"inc",   0x9403,          0},
+       {"dec",   0x940a,          0},
+       {"lsr",   0x9406,          0},
+       {"ror",   0x9407,          0},
+       {"asr",   0x9405,          0},
+       {"swap",  0x9402,          0},
+       {"push",  0x920f,  DF_TINY1X},
+       {"pop",   0x900f,  DF_TINY1X},
+       {"tst",   0x2000,          0},
+       {"clr",   0x2400,          0},
+       {"lsl",   0x0c00,          0},
+       {"rol",   0x1c00,          0},
+       {"breq",  0xf001,          0},
+       {"brne",  0xf401,          0},
+       {"brcs",  0xf000,          0},
+       {"brcc",  0xf400,          0},
+       {"brsh",  0xf400,          0},
+       {"brlo",  0xf000,          0},
+       {"brmi",  0xf002,          0},
+       {"brpl",  0xf402,          0},
+       {"brge",  0xf404,          0},
+       {"brlt",  0xf004,          0},
+       {"brhs",  0xf005,          0},
+       {"brhc",  0xf405,          0},
+       {"brts",  0xf006,          0},
+       {"brtc",  0xf406,          0},
+       {"brvs",  0xf003,          0},
+       {"brvc",  0xf403,          0},
+       {"brie",  0xf007,          0},
+       {"brid",  0xf407,          0},
+       {"rjmp",  0xc000,          0},
+       {"rcall", 0xd000,          0},
+       {"jmp",   0x940c,  DF_NO_JMP},
+       {"call",  0x940e,  DF_NO_JMP},
+       {"brbs",  0xf000,          0},
+       {"brbc",  0xf400,          0},
+       {"add",   0x0c00,          0},
+       {"adc",   0x1c00,          0},
+       {"sub",   0x1800,          0},
+       {"sbc",   0x0800,          0},
+       {"and",   0x2000,          0},
+       {"or",    0x2800,          0},
+       {"eor",   0x2400,          0},
+       {"cp",    0x1400,          0},
+       {"cpc",   0x0400,          0},
+       {"cpse",  0x1000,          0},
+       {"mov",   0x2c00,          0},
+       {"mul",   0x9c00, DF_NO_MUL},
+       {"movw",  0x0100, DF_NO_MOVW},
+       {"muls",  0x0200, DF_NO_MUL},
+       {"mulsu", 0x0300, DF_NO_MUL},
+       {"fmul",  0x0308, DF_NO_MUL},
+       {"fmuls", 0x0380, DF_NO_MUL},
+       {"fmulsu",0x0388, DF_NO_MUL},
+       {"adiw",  0x9600,  DF_TINY1X},
+       {"sbiw",  0x9700,  DF_TINY1X},
+       {"subi",  0x5000,          0},
+       {"sbci",  0x4000,          0},
+       {"andi",  0x7000,          0},
+       {"ori",   0x6000,          0},
+       {"sbr",   0x6000,          0},
+       {"cpi",   0x3000,          0},
+       {"ldi",   0xe000,          0},
+       {"cbr",   0x7000,          0},
+       {"sbrc",  0xfc00,          0},
+       {"sbrs",  0xfe00,          0},
+       {"bst",   0xfa00,          0},
+       {"bld",   0xf800,          0},
+       {"in",    0xb000,          0},
+       {"out",   0xb800,          0},
+       {"sbic",  0x9900,          0},
+       {"sbis",  0x9b00,          0},
+       {"sbi",   0x9a00,          0},
+       {"cbi",   0x9800,          0},
+       {"lds",   0x9000,  DF_TINY1X},
+       {"sts",   0x9200,  DF_TINY1X},
+       {"ld",    0,          0},
+       {"st",    0,          0},
+       {"ldd",   0,  DF_TINY1X},
+       {"std",   0,  DF_TINY1X},
+       {"count", 0,          0},
+       {"lpm",   0x9004, DF_NO_LPM|DF_NO_LPM_X},
+       {"lpm",   0x9005, DF_NO_LPM|DF_NO_LPM_X},
+       {"elpm",  0x9006, DF_NO_ELPM|DF_NO_ELPM_X},
+       {"elpm",  0x9007, DF_NO_ELPM|DF_NO_ELPM_X},
+       {"ld",    0x900c, DF_NO_XREG},
+       {"ld",    0x900d, DF_NO_XREG},
+       {"ld",    0x900e, DF_NO_XREG},
+       {"ld",    0x8008, DF_NO_YREG},
+       {"ld",    0x9009, DF_NO_YREG},
+       {"ld",    0x900a, DF_NO_YREG},
+       {"ld",    0x8000,          0},
+       {"ld",    0x9001, DF_TINY1X},
+       {"ld",    0x9002, DF_TINY1X},
+       {"st",    0x920c, DF_NO_XREG},
+       {"st",    0x920d, DF_NO_XREG},
+       {"st",    0x920e, DF_NO_XREG},
+       {"st",    0x8208, DF_NO_YREG},
+       {"st",    0x9209, DF_NO_YREG},
+       {"st",    0x920a, DF_NO_YREG},
+       {"st",    0x8200,          0},
+       {"st",    0x9201, DF_TINY1X},
+       {"st",    0x9202, DF_TINY1X},
+       {"ldd",   0x8008, DF_TINY1X},
+       {"ldd",   0x8000, DF_TINY1X},
+       {"std",   0x8208, DF_TINY1X},
+       {"std",   0x8200, DF_TINY1X},
+       {"end", 0, 0}
+       };
+
+
+/* We try to parse the command name. Is it a assembler mnemonic or anything else ?
+ * If so, it may be a macro.
+ */
+
+int parse_mnemonic(struct prog_info *pi, int pass)
+       {
+       int mnemonic, i, opcode, opcode2, instruction_long = False;
+       char *operand1, *operand2;
+       struct macro *macro;
+       char temp[MAX_MNEMONIC_LEN+1];
+
+       operand1 = get_next_token(pi->fi->scratch, TERM_SPACE);  // we get the first word on line
+       mnemonic = get_mnemonic_type(my_strlwr(pi->fi->scratch));
+       if(mnemonic == -1) // if -1 this must be a macro name
+               {
+               macro = get_macro(pi, pi->fi->scratch); // and so, we try to get the corresponding macro struct.
+               if(macro)
+                       {
+                       return(expand_macro(pi, macro, operand1, pass)); //we expand the macro
+                       }
+               else // if we cant find a name, this is a unknown word.
+                       {
+                       print_msg(pi, MSGTYPE_ERROR, "Unknown mnemonic/macro: %s", pi->fi->scratch);
+                       return(True);
+                       }
+               }
+       if(pass == PASS_2)
+               {
+               if(mnemonic <= MNEMONIC_BREAK)
+                       {
+                       if(operand1)
+                               print_msg(pi, MSGTYPE_WARNING, "Garbage after instruction %s: %s", instruction_list[mnemonic].mnemonic, operand1);
+                       // No operand
+                       opcode = 0;
+                       }
+               else if(mnemonic <= MNEMONIC_ELPM)
+               {
+                       if(operand1)
+                       {
+                               operand2 = get_next_token(operand1, TERM_COMMA);
+                               if(!operand2)
+                               {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s needs a second operand", instruction_list[mnemonic].mnemonic);
+                                       return(True);
+                               }
+                               get_next_token(operand2, TERM_END);
+                               i = get_register(pi, operand1);
+                               opcode = i << 4;
+                               i = get_indirect(pi, operand2);
+                               if(i == 6) // Means Z
+                               {
+                                       if(mnemonic == MNEMONIC_LPM)
+                                               mnemonic = MNEMONIC_LPM_Z;
+                                       else if(mnemonic == MNEMONIC_ELPM)
+                                               mnemonic = MNEMONIC_ELPM_Z;
+                               }
+                               else if(i == 7) // Means Z+
+                               {
+                                       if(mnemonic == MNEMONIC_LPM)
+                                               mnemonic = MNEMONIC_LPM_ZP;
+                                       else if(mnemonic == MNEMONIC_ELPM)
+                                               mnemonic = MNEMONIC_ELPM_ZP;
+                               }
+                               else
+                               {
+                                       print_msg(pi, MSGTYPE_ERROR, "Unsupported operand: %s", operand2);
+                                       return(True);
+                               }
+                       }
+                       else
+                               opcode = 0;
+               }
+               else
+                       {
+                       if(!operand1)
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "%s needs an operand", instruction_list[mnemonic].mnemonic);
+                               return(True);
+                               }
+                       operand2 = get_next_token(operand1, TERM_COMMA);
+                       if(mnemonic >= MNEMONIC_BRBS)
+                               {
+                               if(!operand2)
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s needs a second operand", instruction_list[mnemonic].mnemonic);
+                                       return(True);
+                                       }
+                               get_next_token(operand2, TERM_END);
+                               }
+                       if(mnemonic <= MNEMONIC_BCLR)
+                               {
+                               if(!get_bitnum(pi, operand1, &i))
+                                       return(False);
+                               opcode = i << 4;
+                               }
+                       else if(mnemonic <= MNEMONIC_ROL)
+                               {
+                               i = get_register(pi, operand1);
+                               if((mnemonic == MNEMONIC_SER) && (i < 16))
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "%s can only use a high register (r16 - r31)", instruction_list[mnemonic].mnemonic);
+                                       i &= 0x0f;
+                                       }
+                               opcode = i << 4;
+                               if(mnemonic >= MNEMONIC_TST)
+                                       opcode |= ((i & 0x10) << 5) | (i & 0x0f);
+                               }
+                       else if(mnemonic <= MNEMONIC_RCALL)
+                               {
+                               if(!get_expr(pi, operand1, &i))
+                                       return(False);
+                               i -= pi->cseg_addr + 1;
+                               if(mnemonic <= MNEMONIC_BRID)
+                                       {
+                                       if((i < -64) || (i > 63))
+                                               print_msg(pi, MSGTYPE_ERROR, "Branch out of range (-64 <= k <= 63)");
+                                       opcode = (i & 0x7f) << 3;
+                                       }
+                               else
+                                       {
+                                       if(((i < -2048) || (i > 2047)) && (pi->device->flash_size != 4096))
+                                               print_msg(pi, MSGTYPE_ERROR, "Relative address out of range (-2048 <= k <= 2047)");
+                                       opcode = i & 0x0fff;
+                                       }
+                               }
+                       else if(mnemonic <= MNEMONIC_CALL)
+                               {
+                               if(!get_expr(pi, operand1, &i))
+                                       return(False);
+                               if((i < 0) || (i > 4194303))
+                                       print_msg(pi, MSGTYPE_ERROR, "Address out of range (0 <= k <= 4194303)");
+                               opcode = ((i & 0x3e0000) >> 13) | ((i & 0x01000) >> 16);
+                               opcode2 = i & 0xffff;
+                               instruction_long = True;
+                               }
+                       else if(mnemonic <= MNEMONIC_BRBC)
+                               {
+                               if(!get_bitnum(pi, operand1, &i))
+                                       return(False);
+                               opcode = i;
+                               if(!get_expr(pi, operand2, &i))
+                                       return(False);
+                               i -= pi->cseg_addr + 1;
+                               if((i < -64) || (i > 63))
+                                       print_msg(pi, MSGTYPE_ERROR, "Branch out of range (-64 <= k <= 63)");
+                               opcode |= (i & 0x7f) << 3;
+                               }
+                       else if(mnemonic <= MNEMONIC_MUL)
+                               {
+                               i = get_register(pi, operand1);
+                               opcode = i << 4;
+                               i = get_register(pi, operand2);
+                               opcode |= ((i & 0x10) << 5) | (i & 0x0f);
+                               }
+                       else if(mnemonic <= MNEMONIC_MOVW)
+                       {
+                               i = get_register(pi, operand1);
+                               if((i % 2) == 1)
+                                       print_msg(pi, MSGTYPE_ERROR, "%s must use a even numbered register for Rd", instruction_list[mnemonic].mnemonic);
+                               opcode = (i / 2) << 4;
+                               i = get_register(pi, operand2);
+                               if((i % 2) == 1)
+                                       print_msg(pi, MSGTYPE_ERROR, "%s must use a even numbered register for Rr", instruction_list[mnemonic].mnemonic);
+                               opcode |= i / 2;
+                       }
+                       else if(mnemonic <= MNEMONIC_MULS)
+                       {
+                               i = get_register(pi, operand1);
+                               if(i < 16)
+                                       print_msg(pi, MSGTYPE_ERROR, "%s can only use a high register (r16 - r31)", instruction_list[mnemonic].mnemonic);
+                               opcode = (i & 0x0f) << 4;
+                               i = get_register(pi, operand2);
+                               if(i < 16)
+                                       print_msg(pi, MSGTYPE_ERROR, "%s can only use a high register (r16 - r31)", instruction_list[mnemonic].mnemonic);
+                               opcode |= (i & 0x0f);
+                       }
+                       else if(mnemonic <= MNEMONIC_FMULSU)
+                       {
+                               i = get_register(pi, operand1);
+                               if((i < 16) || (i >= 24))
+                                       print_msg(pi, MSGTYPE_ERROR, "%s can only use registers (r16 - r23)", instruction_list[mnemonic].mnemonic);
+                               opcode = (i & 0x07) << 4;
+                               i = get_register(pi, operand2);
+                               if((i < 16) || (i >= 24))
+                                       print_msg(pi, MSGTYPE_ERROR, "%s can only use registers (r16 - r23)", instruction_list[mnemonic].mnemonic);
+                               opcode |= (i & 0x07);
+                       }
+                       else if(mnemonic <= MNEMONIC_SBIW)
+                               {
+                               i = get_register(pi, operand1);
+                               if(!((i == 24) || (i == 26) || (i == 28) || (i == 30)))
+                                       print_msg(pi, MSGTYPE_ERROR, "%s can only use registers R24, R26, R28 or R30", instruction_list[mnemonic].mnemonic);
+                               opcode = ((i - 24) / 2) << 4;
+                               if(!get_expr(pi, operand2, &i))
+                                       return(False);
+                               if((i < 0) || (i > 63))
+                                       print_msg(pi, MSGTYPE_ERROR, "Constant out of range (0 <= k <= 63)");
+                               opcode |= ((i & 0x30) << 2) | (i & 0x0f);
+                               }
+                       else if(mnemonic <= MNEMONIC_CBR)
+                               {
+                               i = get_register(pi, operand1);
+                               if(i < 16)
+                                       print_msg(pi, MSGTYPE_ERROR, "%s can only use a high register (r16 - r31)", instruction_list[mnemonic].mnemonic);
+                               opcode = (i & 0x0f) << 4;
+                               if(!get_expr(pi, operand2, &i))
+                                       return(False);
+                               if((i < -128) || (i > 255))
+                                       print_msg(pi, MSGTYPE_WARNING, "Constant out of range (-128 <= k <= 255). Will be masked");
+                               if(mnemonic == MNEMONIC_CBR)
+                                       i = ~i;
+                               opcode |= ((i & 0xf0) << 4) | (i & 0x0f);
+                               }
+                       else if(mnemonic <= MNEMONIC_BLD)
+                               {
+                               i = get_register(pi, operand1);
+                               opcode = i << 4;
+                               if(!get_bitnum(pi, operand2, &i))
+                                       return(False);
+                               opcode |= i;
+                               }
+                       else if(mnemonic == MNEMONIC_IN)
+                               {
+                               i = get_register(pi, operand1);
+                               opcode = i << 4;
+                               if(!get_expr(pi, operand2, &i))
+                                       return(False);
+                               if((i < 0) || (i > 63))
+                                       print_msg(pi, MSGTYPE_ERROR, "I/O out of range (0 <= P <= 63)");
+                               opcode |= ((i & 0x30) << 5) | (i & 0x0f);
+                               }
+                       else if(mnemonic == MNEMONIC_OUT)
+                               {
+                               if(!get_expr(pi, operand1, &i))
+                                       return(False);
+                               if((i < 0) || (i > 63))
+                                       print_msg(pi, MSGTYPE_ERROR, "I/O out of range (0 <= P <= 63)");
+                               opcode = ((i & 0x30) << 5) | (i & 0x0f);
+                               i = get_register(pi, operand2);
+                               opcode |= i << 4;
+                               }
+                       else if(mnemonic <= MNEMONIC_CBI)
+                               {
+                               if(!get_expr(pi, operand1, &i))
+                                       return(False);
+                               if((i < 0) || (i > 31))
+                                       print_msg(pi, MSGTYPE_ERROR, "I/O out of range (0 <= P <= 31)");
+                               opcode = i << 3;
+                               if(!get_bitnum(pi, operand2, &i))
+                                       return(False);
+                               opcode |= i;
+                               }
+                       else if(mnemonic == MNEMONIC_LDS)
+                               {
+                               i = get_register(pi, operand1);
+                               opcode = i << 4;
+                               if(!get_expr(pi, operand2, &i))
+                                       return(False);
+                               if((i < 0) || (i > 65535))
+                                       print_msg(pi, MSGTYPE_ERROR, "SRAM out of range (0 <= k <= 65535)");
+                               opcode2 = i;
+                               instruction_long = True;
+                               }
+                       else if(mnemonic == MNEMONIC_STS)
+                               {
+                               if(!get_expr(pi, operand1, &i))
+                                       return(False);
+                               if((i < 0) || (i > 65535))
+                                       print_msg(pi, MSGTYPE_ERROR, "SRAM out of range (0 <= k <= 65535)");
+                               opcode2 = i;
+                               i = get_register(pi, operand2);
+                               opcode = i << 4;
+                               instruction_long = True;
+                               }
+                       else if(mnemonic == MNEMONIC_LD)
+                               {
+                               i = get_register(pi, operand1);
+                               opcode = i << 4;
+                               mnemonic = MNEMONIC_LD_X + get_indirect(pi, operand2);
+                               }
+                       else if(mnemonic == MNEMONIC_ST)
+                               {
+                               mnemonic = MNEMONIC_ST_X + get_indirect(pi, operand1);
+                               i = get_register(pi, operand2);
+                               opcode = i << 4;
+                               }
+                       else if(mnemonic == MNEMONIC_LDD)
+                               {
+                               i = get_register(pi, operand1);
+                               opcode = i << 4;
+                               if(tolower(operand2[0]) == 'z')
+                                       mnemonic = MNEMONIC_LDD_Z;
+                               else if(tolower(operand2[0]) == 'y')
+                                       mnemonic = MNEMONIC_LDD_Y;
+                               else
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in second operand (%s)", operand2);
+                               i = 1;
+                               while((operand2[i] != '\0') && (operand2[i] != '+')) i++;
+                               if(operand2[i] == '\0')
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in second operand (%s)", operand2);
+                                       return(False);
+                                       }
+                               if(!get_expr(pi, &operand2[i + 1], &i))
+                                       return(False);
+                               if((i < 0) || (i > 63))
+                                       print_msg(pi, MSGTYPE_ERROR, "Displacement out of range (0 <= q <= 63)");
+                               opcode |= ((i & 0x20) << 8) | ((i & 0x18) << 7) | (i & 0x07);
+                               }
+                       else if(mnemonic == MNEMONIC_STD)
+                               {
+                               if(tolower(operand1[0]) == 'z')
+                                       mnemonic = MNEMONIC_STD_Z;
+                               else if(tolower(operand1[0]) == 'y')
+                                       mnemonic = MNEMONIC_STD_Y;
+                               else
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in first operand (%s)", operand1);
+                               i = 1;
+                               while((operand1[i] != '\0') && (operand1[i] != '+')) i++;
+                               if(operand1[i] == '\0')
+                                       {
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in first operand (%s)", operand1);
+                                       return(False);
+                                       }
+                               if(!get_expr(pi, &operand1[i + 1], &i))
+                                       return(False);
+                               if((i < 0) || (i > 63))
+                                       print_msg(pi, MSGTYPE_ERROR, "Displacement out of range (0 <= q <= 63)");
+                               opcode = ((i & 0x20) << 8) | ((i & 0x18) << 7) | (i & 0x07);
+                               i = get_register(pi, operand2);
+                               opcode |= i << 4;
+                               }
+                       else
+                               print_msg(pi, MSGTYPE_ERROR, "Shit! Missing opcode check [%d]...", mnemonic);
+                       }
+               if (pi->device->flag & instruction_list[mnemonic].flag)
+               {
+                       strncpy(temp, instruction_list[mnemonic].mnemonic, MAX_MNEMONIC_LEN);
+                       print_msg(pi, MSGTYPE_ERROR, "%s instruction is not supported on %s",
+                                 my_strupr(temp), pi->device->name);
+               }
+               opcode |= instruction_list[mnemonic].opcode;
+               if(pi->list_on && pi->list_line)
+                       {
+                       if(instruction_long)
+                               fprintf(pi->list_file, "%06x %04x %04x %s", pi->cseg_addr, opcode, opcode2, pi->list_line);
+                       else
+                               fprintf(pi->list_file, "%06x %04x      %s", pi->cseg_addr, opcode, pi->list_line);
+                       pi->list_line = NULL;
+                       }
+               if(pi->hfi)
+                       {
+                       write_prog_word(pi, pi->cseg_addr, opcode);
+                       if(instruction_long)
+                               write_prog_word(pi, pi->cseg_addr + 1, opcode2);
+                       }
+               if(instruction_long)
+                       pi->cseg_addr += 2;
+               else
+                       pi->cseg_addr++;
+               }
+       else
+               {
+               if((mnemonic == MNEMONIC_JMP) || (mnemonic == MNEMONIC_CALL) || (mnemonic == MNEMONIC_LDS) || (mnemonic == MNEMONIC_STS))
+                       {
+                       pi->cseg_addr += 2;
+                       pi->cseg_count += 2;
+                       }
+               else
+                       {
+                       pi->cseg_addr++;
+                       pi->cseg_count++;
+                       }
+               }
+       return(True);
+       }
+
+
+int get_mnemonic_type(char *mnemonic)
+       {
+       int i;
+
+       for(i = 0; i < MNEMONIC_COUNT; i++)
+               if(!strcmp(mnemonic, instruction_list[i].mnemonic))
+                       return(i);
+       return(-1);
+       }
+
+
+int get_register(struct prog_info *pi, char *data)
+       {
+       char *second_reg;
+       int reg = 0;
+       struct def *def;
+
+       // Check for any occurence of r1:r0 pairs, and if so skip to second register
+       second_reg = strchr(data, ':');
+       if(second_reg != NULL)
+               data = second_reg + 1;
+
+       for(def = pi->first_def; def; def = def->next)
+               if(!nocase_strcmp(def->name, data))
+                       {
+                       reg = def->reg;
+                       return(reg);
+                       }
+       if((tolower(data[0]) == 'r') && isdigit(data[1]))
+               {
+               reg = atoi(&data[1]);
+               if(reg > 31)
+                       print_msg(pi, MSGTYPE_ERROR, "R%d is not a valid register", reg);
+               }
+       else
+               print_msg(pi, MSGTYPE_ERROR, "No register associated with %s", data);
+       return(reg);
+       }
+
+
+int get_bitnum(struct prog_info *pi, char *data, int *ret)
+{
+       if(!get_expr(pi, data, ret))
+               return(False);
+       if((*ret < 0) || (*ret > 7))
+               {
+               print_msg(pi, MSGTYPE_ERROR, "Operand out of range (0 <= s <= 7)");
+               return(False);
+               }
+       return(True);
+       }
+
+
+int get_indirect(struct prog_info *pi, char *operand)
+       {
+       int i = 1;
+
+       switch(tolower(operand[0]))
+               {
+               case '-':
+                       while(IS_HOR_SPACE(operand[i])) i++;
+                       if(operand[i + 1] != '\0')
+                               print_msg(pi, MSGTYPE_ERROR, "Garbage in operand (%s)", operand);
+                       switch(tolower(operand[i]))
+                               {
+                               case 'x':
+                                       if (pi->device->flag & DF_NO_XREG)
+                                           print_msg(pi, MSGTYPE_ERROR, "X register is not supported on %s", pi->device->name);
+                                       return(2);
+                               case 'y':
+                                       if (pi->device->flag & DF_NO_YREG)
+                                           print_msg(pi, MSGTYPE_ERROR, "Y register is not supported on %s", pi->device->name);
+                                       return(5);
+                               case 'z':
+                                       return(8);
+                               default:
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in operand (%s)", operand);
+                                       return(0);
+                               }
+               case 'x':
+                        if (pi->device->flag & DF_NO_XREG)
+                           print_msg(pi, MSGTYPE_ERROR, "X register is not supported on %s", pi->device->name);
+                       while(IS_HOR_SPACE(operand[i])) i++;
+                       if(operand[i] == '+')
+                               {
+                               if(operand[i + 1] != '\0')
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in operand (%s)", operand);
+                               return(1);
+                               }
+                       else if(operand[i] == '\0')
+                               return(0);
+                       else
+                               print_msg(pi, MSGTYPE_ERROR, "Garbage after operand (%s)", operand);
+                       return(0);
+               case 'y':
+                        if (pi->device->flag & DF_NO_YREG)
+                           print_msg(pi, MSGTYPE_ERROR, "Y register is not supported on %s", pi->device->name);
+                       while(IS_HOR_SPACE(operand[i])) i++;
+                       if(operand[i] == '+')
+                               {
+                               if(operand[i + 1] != '\0')
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in operand (%s)", operand);
+                               return(4);
+                               }
+                       else if(operand[i] == '\0')
+                               return(3);
+                       else
+                               print_msg(pi, MSGTYPE_ERROR, "Garbage after operand (%s)", operand);
+                       return(0);
+               case 'z':
+                       while(IS_HOR_SPACE(operand[i])) i++;
+                       if(operand[i] == '+')
+                               {
+                               if(operand[i + 1] != '\0')
+                                       print_msg(pi, MSGTYPE_ERROR, "Garbage in operand (%s)", operand);
+                               return(7);
+                               }
+                       else if(operand[i] == '\0')
+                               return(6);
+                       else
+                               print_msg(pi, MSGTYPE_ERROR, "Garbage after operand (%s)", operand);
+                       return(0);
+               default:
+                       print_msg(pi, MSGTYPE_ERROR, "Garbage in operand (%s)", operand);
+               }
+       return(0);
+       }
+
+/* Return 1 if instruction name is supported by the current device,
+   0 if unsupported, -1 if it is invalid */
+int is_supported(struct prog_info *pi, char *name) {
+   char temp[MAX_MNEMONIC_LEN+1];
+   int mnemonic;
+
+   strncpy(temp,name,MAX_MNEMONIC_LEN);
+   mnemonic = get_mnemonic_type(my_strlwr(temp));
+   if (mnemonic == -1) return -1;
+   if (pi->device->flag & instruction_list[mnemonic].flag) return 0;
+   return 1;
+   }
+
+int count_supported_instructions(int flags)
+{
+  int i = 0, count = 0;
+  while(i < MNEMONIC_END)
+  {
+    if((i < MNEMONIC_LD) || (i > MNEMONIC_COUNT))
+      if(!(flags & instruction_list[i].flag))
+        count++;
+    i++;
+  }
+  return(count);
+}
diff --git a/src/mkutil/avra-0.8/SOURCE/n.bat b/src/mkutil/avra-0.8/SOURCE/n.bat
new file mode 100644 (file)
index 0000000..38f21fe
--- /dev/null
@@ -0,0 +1,2 @@
+NMake /f Makefile.win32.mvc install\r
+del *.obj\r
diff --git a/src/mkutil/avra-0.8/SOURCE/parser.c b/src/mkutil/avra-0.8/SOURCE/parser.c
new file mode 100644 (file)
index 0000000..fe1604d
--- /dev/null
@@ -0,0 +1,397 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "avra.h"
+#include "args.h"
+
+/*
+ * Parses given assembler file
+ */
+
+int parse_file(struct prog_info *pi, char *filename, int pass)
+       {
+       int ok = True, loopok;
+       struct file_info *fi;
+       struct include_file *include_file;
+
+       fi = malloc(sizeof(struct file_info));
+       if(fi)
+               {
+               pi->fi = fi;
+               if(pass == PASS_1)
+                       {
+                       include_file = malloc(sizeof(struct include_file));
+                       if(!include_file)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               free(fi);
+                               return(False);
+                               }
+                       include_file->next = NULL;
+                       if(pi->last_include_file)
+                               {
+                               pi->last_include_file->next = include_file;
+                               include_file->num = pi->last_include_file->num + 1;
+                               }
+                       else
+                               {
+                               pi->first_include_file = include_file;
+                               include_file->num = 0;
+                               }
+                       pi->last_include_file = include_file;
+                       include_file->name = malloc(strlen(filename) + 1);
+                       if(!include_file->name)
+                               {
+                               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                               free(fi);
+                               return(False);
+                               }
+                       strcpy(include_file->name, filename);
+                       }
+               else
+                       {
+                       for(include_file = pi->first_include_file; include_file; include_file = include_file->next)
+                               if(!strcmp(include_file->name, filename))
+                                       break;
+                       }
+               if(!include_file)
+                       {
+                       print_msg(pi, MSGTYPE_ERROR, "Internal assembler error");
+                       free(fi);
+                       return(False);
+                       }
+               fi->include_file = include_file;
+               fi->line_number = 0;
+               fi->exit_file = False;
+               //printf("Opening %s\n",filename);
+               fi->fp = fopen(filename, "r");
+               if(fi->fp != NULL)
+                       {
+                       
+                       loopok = True;
+                       while(loopok && !fi->exit_file)
+                               {
+                               if(fgets(fi->buff, LINEBUFFER_LENGTH, fi->fp))
+                                       {
+                                       fi->line_number++;
+                                       pi->list_line = fi->buff;
+                                       ok = parse_line(pi, fi->buff, pass);
+                                       
+                                       if(ok)
+                                               {
+                                               if((pass == PASS_2) && pi->list_line && pi->list_on)
+                                                       fprintf(pi->list_file, "         %s", pi->list_line);
+                                               if(pi->error_count >= pi->max_errors)
+                                                       {
+                                                       print_msg(pi, MSGTYPE_MESSAGE, "Maximum error count reached. Exiting...");
+                                                       loopok = False;
+                                                       }
+                                               }
+                                       else
+                                               {
+                                                       loopok = False;
+                                               }
+                                       }
+                               else
+                                       {
+                                       loopok = False;
+                                       if(!feof(fi->fp))
+                                               {
+                                               ok = False;
+                                               perror(filename);
+                                               }
+                                       }
+                               }
+                       fclose(fi->fp);
+                       }
+               else
+                       {
+                       ok = False;
+                       perror(filename);
+                       }
+               free(fi);
+               }
+       else
+               {
+               ok = False;
+               print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+               }
+       return(ok);
+       }
+
+
+/*
+ * Parses one line
+ */
+
+int parse_line(struct prog_info *pi, char *line, int pass)
+       {
+       int ok, i, j, k, global_label = False, textarea;
+       char temp[LINEBUFFER_LENGTH];
+       struct label *label = NULL;
+       struct macro_call *macro_call;
+
+       /* Find out if there is any relevant code on the line. If not? return */
+       i = 0;
+       while(IS_HOR_SPACE(line[i]) && !IS_END(line[i])) i++;
+       if(IS_END(line[i]))
+               return(True);
+
+       strcpy(temp, &line[i]);
+
+       /* filter out .stab debugging information before it screws up the previous processing */
+       /* .stabs sometimes contains colon : symbol - might be interpreted as label */
+       if( *temp == '.' ){     /* minimal slowdown of existing code */
+               /* compiler output is always lower case */
+               if( strncmp( temp, ".stabs ", 7) == 0 ){
+                       ok = parse_stabs( pi, temp, pass );
+                       return( ok );
+               }
+
+               if( strncmp( temp, ".stabn ", 7) == 0 ){
+                       ok = parse_stabn( pi, temp, pass );
+                       return( ok );
+               }
+       }
+
+       /* Calculate any expression inside a pair of {} */
+       for(i = 0, j = 0, textarea = False; temp[j] != '\0'; i++, j++)
+               {
+               if((temp[j] == '\'') || (temp[j] == '"'))
+                       textarea = textarea ? False : True;
+               else if(!textarea && (temp[j] == ';'))
+                       break;
+               if(temp[j] == '{')
+                       {
+                       k = ++j;
+                       while((temp[j] != '\0') && (temp[j] != '}')) j++;
+                       if(IS_END(temp[j]))
+                               {
+                               print_msg(pi, MSGTYPE_ERROR, "Found no matching }");
+                               break;
+                               }
+                       else
+                               {
+                               temp[j] = '\0';
+                               if(!get_expr(pi, &temp[k], &k))
+                                       return(False);
+                               sprintf(&pi->fi->scratch[i], "%d", k);
+                               i = strlen(pi->fi->scratch) - 1;
+                               }
+                       }
+               else
+                       pi->fi->scratch[i] = temp[j];
+               }
+       pi->fi->scratch[i] = '\0';
+
+       /* Detect the global keyword for global labels */
+       if(!nocase_strncmp(pi->fi->scratch, "global", 6) && IS_HOR_SPACE(pi->fi->scratch[6]))
+               {
+               global_label = True;
+               i = 7;
+               while(IS_HOR_SPACE(pi->fi->scratch[i]) && !IS_END(pi->fi->scratch[i])) i++;
+               if(IS_END(pi->fi->scratch[i]))
+                       {
+                       print_msg(pi, MSGTYPE_ERROR, "Found no label after global keyword");
+                       return(True);
+                       }
+               strcpy(pi->fi->scratch, &pi->fi->scratch[i]);
+               }
+
+       for(i = 0; IS_LABEL(pi->fi->scratch[i]) || (pi->fi->scratch[i] == ':'); i++)
+               if(pi->fi->scratch[i] == ':')
+                       {
+                       pi->fi->scratch[i] = '\0';
+                       if(pass == PASS_1)
+                               {
+                               for(macro_call = pi->macro_call; macro_call; macro_call = macro_call->prev_on_stack)
+                                       {
+                                       for(label = pi->macro_call->first_label; label; label = label->next)
+                                               {
+                                               if(!nocase_strcmp(label->name, &pi->fi->scratch[0]))
+                                                       {
+                                                       print_msg(pi, MSGTYPE_ERROR, "Can't redefine local label %s", &pi->fi->scratch[0]);
+                                                       break;
+                                                       }
+                                               }
+                                       }
+                               for(label = pi->first_label; label; label = label->next)
+                                       {
+                                       if(!nocase_strcmp(label->name, &pi->fi->scratch[0]))
+                                               {
+                                               print_msg(pi, MSGTYPE_ERROR, "Can't redefine label %s", &pi->fi->scratch[0]);
+                                               break;
+                                               }
+                                       }
+                               for(label = pi->first_variable; label; label = label->next)
+                                       if(!nocase_strcmp(label->name, &pi->fi->scratch[0]))
+                                               {
+                                               print_msg(pi, MSGTYPE_ERROR, "%s has already been defined as a .SET variable", &pi->fi->scratch[0]);
+                                               break;
+                                               }
+                               for(label = pi->first_constant; label; label = label->next)
+                                       if(!nocase_strcmp(label->name, &pi->fi->scratch[0]))
+                                               {
+                                               print_msg(pi, MSGTYPE_ERROR, "%s has already been defined as a .EQU constant", &pi->fi->scratch[0]);
+                                               break;
+                                               }
+                               label = malloc(sizeof(struct label));
+                               if(!label)
+                                       {
+                                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                                       return(False);
+                                       }
+                               label->next = NULL;
+                               label->name = malloc(strlen(&pi->fi->scratch[0]) + 1);
+                               if(!label->name)
+                                       {
+                                       print_msg(pi, MSGTYPE_OUT_OF_MEM, NULL);
+                                       return(False);
+                                       }
+                               strcpy(label->name, &pi->fi->scratch[0]);
+                               switch(pi->segment)
+                                       {
+                                       case SEGMENT_CODE:
+                                               label->value = pi->cseg_addr;
+                                               break;
+                                       case SEGMENT_DATA:
+                                               label->value = pi->dseg_addr;
+                                               break;
+                                       case SEGMENT_EEPROM:
+                                               label->value = pi->eseg_addr;
+                                               break;
+                                       }
+                               if(pi->macro_call && !global_label)
+                                       {
+                                       if(pi->macro_call->last_label)
+                                               pi->macro_call->last_label->next = label;
+                                       else
+                                               pi->macro_call->first_label = label;
+                                       pi->macro_call->last_label = label;
+                                       }
+                               else
+                                       {
+                                       if(pi->last_label)
+                                               pi->last_label->next = label;
+                                       else
+                                               pi->first_label = label;
+                                       pi->last_label = label;
+                                       }
+                               }
+                       i++;
+                       while(IS_HOR_SPACE(pi->fi->scratch[i]) && !IS_END(pi->fi->scratch[i])) i++;
+                       if(IS_END(pi->fi->scratch[i]))
+                               {
+                               if((pass == PASS_2) && pi->list_on) // Diff tilpassing
+                                       {
+                                       fprintf(pi->list_file, "          %s", pi->list_line);
+                                       pi->list_line = NULL;
+                                       }
+                               return(True);
+                               }
+                       strcpy(pi->fi->scratch, &pi->fi->scratch[i]);
+                       break;
+                       }
+
+       if(pi->fi->scratch[0] == '.')
+               {
+               pi->fi->label = label;
+               ok = parse_directive(pi, pass);
+               if((pass == PASS_2) && pi->list_on && pi->list_line) // Diff tilpassing
+                       {
+                       fprintf(pi->list_file, "          %s", pi->list_line);
+                       pi->list_line = NULL;
+                       }
+               return(ok);
+               }
+       else
+               {
+               ok = parse_mnemonic(pi, pass);
+               return(ok);
+               }
+       }
+
+
+/*
+ * Get the next token, and terminate the last one.
+ * Termination identifier is specified.
+ */
+
+char *get_next_token(char *data, int term)
+       {
+       int i = 0, j, anti_comma = False;
+
+       switch(term)
+               {
+               case TERM_END:
+                       while(!IS_END(data[i])) i++;
+                       break;
+               case TERM_SPACE:
+                       while(!IS_HOR_SPACE(data[i]) && !IS_END(data[i])) i++;
+                       break;
+               case TERM_DASH:
+                       while((data[i] != '-') && !IS_END(data[i])) i++;
+                       break;
+               case TERM_COLON:
+                       while((data[i] != ':') && !IS_ENDLINE(data[i])) i++;
+                       break;
+               case TERM_DOUBLEQUOTE:
+                       while((data[i] != '"') && !IS_ENDLINE(data[i])) i++;
+                       break;
+               case TERM_COMMA:
+                       while(((data[i] != ',') || anti_comma)
+                             && !(((data[i] == ';') && !anti_comma) || (data[i] == 10) || (data[i] == 13)|| (data[i] == '\0')))
+                               {
+                               if((data[i] == '\'') || (data[i] == '"'))
+                                       anti_comma = anti_comma ? False : True;
+                               i++;
+                               }
+                       break;
+               case TERM_EQUAL:
+                       while((data[i] != '=') && !IS_END(data[i])) i++;
+                       break;
+               }
+       if(IS_END(data[i]))
+               {
+               data[i--] = '\0';
+               while(IS_HOR_SPACE(data[i])) data[i--] = '\0';
+               return(0);
+               }
+       j = i - 1;
+       while(IS_HOR_SPACE(data[j])) data[j--] = '\0';
+       data[i++] = '\0';
+       while(IS_HOR_SPACE(data[i]) && !IS_END(data[i])) i++;
+       if(IS_END(data[i]))
+               return(0);
+       return(&data[i]);
+       }
+
diff --git a/src/mkutil/avra-0.8/SOURCE/stdextra.c b/src/mkutil/avra-0.8/SOURCE/stdextra.c
new file mode 100644 (file)
index 0000000..4570495
--- /dev/null
@@ -0,0 +1,197 @@
+/***********************************************************************
+ *  avra - Assembler for the Atmel AVR microcontroller series
+ *  Copyright (C) 1998-2001 Jon Anders Haugum
+ *  Copyright (C) 2002-2003 Tobias Weber
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Authors of avra can be reached at:
+ *     email: jonah@omegav.ntnu.no, tobiw@suprafluid.com
+ *     www: http://sourceforge.net/projects/avra
+ */
+
+/********************************************************************
+ * Extra standard functions
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+
+#include "misc.h"
+
+
+/********************************************************************
+ * Case insensetive strcmp()
+ */
+
+int nocase_strcmp(char *s, char *t)
+       {
+       int i;
+
+       for(i = 0; tolower(s[i]) == tolower(t[i]); i++)
+               if(s[i] == '\0')
+                       return(0);
+       return(tolower(s[i]) - tolower(t[i]));
+       }
+
+
+/********************************************************************
+ * Case insensetive strncmp()
+ */
+
+int nocase_strncmp(char *s, char *t, int n)
+       {
+       int i;
+
+       for(i = 0; (tolower(s[i]) == tolower(t[i])); i++, n--)
+               if((s[i] == '\0') || (n == 1))
+                       return(0);
+       return(tolower(s[i]) - tolower(t[i]));
+       }
+
+
+/********************************************************************
+ * Case insensetive strstr()
+ */
+
+char *nocase_strstr(char *s, char *t)
+       {
+       int i = 0, j, found = False;
+
+       while((s[i] != '\0') && !found)
+               {
+               j = 0;
+               while(tolower(t[j]) == tolower(s[i + j]))
+                       {
+                       j++;
+                       if(t[j] == '\0')
+                               {
+                               found = True;
+                               break;
+                               }
+                       else if(s[i + j] == '\0')
+                               break;
+                       }
+               i++;
+               }
+       i--;
+       if(found)
+               return(&s[i]);
+       return(NULL);
+       }
+
+
+/********************************************************************
+ * ascii to hex
+ * ignores "0x"
+ */
+
+int atox(char *s)
+       {
+       int i = 0, ret = 0;
+
+       while(s[i] != '\0')
+               {
+               ret <<= 4;
+               if((s[i] <= 'F') && (s[i] >= 'A'))
+                       ret |= s[i] - 'A' + 10;
+               else if((s[i] <= 'f') && (s[i] >= 'a'))
+                       ret |= s[i] - 'a' + 10;
+               else if((s[i] <= '9') && (s[i] >= '0'))
+                       ret |= s[i] - '0';
+               i++;
+               }
+       return(ret);
+       }
+
+
+/********************************************************************
+ * n ascii chars to int
+ */
+
+int atoi_n(char *s, int n)
+       {
+       int i = 0, ret = 0;
+
+       while((s[i] != '\0') && n)
+               {
+               ret = 10 * ret + (s[i] - '0');
+               i++;
+               n--;
+               }
+       return(ret);
+       }
+
+
+/********************************************************************
+ * n ascii chars to hex
+ * 0 < n <= 8
+ * ignores "0x"
+ */
+
+int atox_n(char *s, int n)
+       {
+       int i = 0, ret = 0;
+
+       while((s[i] != '\0') && n)
+               {
+               ret <<= 4;
+               if((s[i] <= 'F') && (s[i] >= 'A'))
+                       ret |= s[i] - 'A' + 10;
+               else if((s[i] <= 'f') && (s[i] >= 'a'))
+                       ret |= s[i] - 'a' + 10;
+               else if((s[i] <= '9') && (s[i] >= '0'))
+                       ret |= s[i] - '0';
+               i++;
+               n--;
+               }
+       return(ret);
+       }
+
+
+/*
+ * My own strlwr function since this one only exists in win
+ */
+
+char *my_strlwr(char *in)
+{
+  int i;
+
+  for(i = 0; in[i] != '\0'; i++)
+    in[i] = tolower(in[i]);
+
+  return(in);
+}
+
+
+/*
+ * My own strupr function since this one only exists in win
+ */
+
+char *my_strupr(char *in)
+{
+  int i;
+
+  for(i = 0; in[i] != '\0'; i++)
+    in[i] = toupper(in[i]);
+
+  return(in);
+}
+
+
+
+
diff --git a/src/mkutil/avra-0.8/TODO b/src/mkutil/avra-0.8/TODO
new file mode 100644 (file)
index 0000000..6be6fe1
--- /dev/null
@@ -0,0 +1,10 @@
+- Hindre bruk av instrusjoner etter .dseg
+- Støtt intel hex 32 istedet, da hex8m bare går opp til 64KB
+- listfil generering
+- Test instruksjoner i henhold til hvilken prosessor som er valgt.
+- Støtt atmel generic
+- Sjekk ut det med tom fil.
+- Legg inn støtte for .def og macroer i get_symbol
+- while
+- AVRASM32 compatible parameter interpretation\r
+- general bug fixing\r
diff --git a/src/mkutil/avra-0.8/avra.dev b/src/mkutil/avra-0.8/avra.dev
new file mode 100644 (file)
index 0000000..2643b7b
--- /dev/null
@@ -0,0 +1,179 @@
+[Project]\r
+FileName=avra.dev\r
+Name=Console App\r
+UnitCount=15\r
+Type=1\r
+Ver=1\r
+ObjFiles=\r
+Includes=\r
+Libs=\r
+PrivateResource=\r
+ResourceIncludes=\r
+MakeIncludes=\r
+Resources=\r
+Compiler=\r
+Linker=\r
+IsCpp=0\r
+Icon=\r
+ExeOutput=\r
+ObjectOutput=\r
+OverrideOutput=0\r
+OverrideOutputName=AVRASM32.exe\r
+Folders=\r
+CommandLine=\r
+Focused=0\r
+Order=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\r
+\r
+[Unit1]\r
+FileName=avra.c\r
+Open=1\r
+Folder=\r
+Top=1\r
+CursorCol=10\r
+CursorRow=82\r
+TopLine=43\r
+LeftChar=1\r
+\r
+[Views]\r
+ProjectView=1\r
+\r
+[Unit2]\r
+FileName=args.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit3]\r
+FileName=stdextra.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit4]\r
+FileName=device.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit5]\r
+FileName=directiv.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit6]\r
+FileName=expr.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit7]\r
+FileName=file.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit9]\r
+FileName=mnemonic.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit10]\r
+FileName=parser.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit11]\r
+FileName=coff.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit12]\r
+FileName=macro.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit13]\r
+FileName=misc.h\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit8]\r
+FileName=map.c\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit14]\r
+FileName=args.h\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
+[Unit15]\r
+FileName=avra.h\r
+Open=1\r
+Folder=\r
+Top=0\r
+CursorCol=1\r
+CursorRow=1\r
+TopLine=1\r
+LeftChar=1\r
+\r
diff --git a/src/mkutil/bin2avr.c b/src/mkutil/bin2avr.c
new file mode 100644 (file)
index 0000000..ec64630
--- /dev/null
@@ -0,0 +1,162 @@
+/* bin2avr.c by Nick for UZI180 */\r
+\r
+#include <stdio.h>\r
+#include <fcntl.h>\r
+#include <string.h>\r
+\r
+#define PATHLEN 512\r
+\r
+void main(int argc, char **argv)\r
+       {\r
+       int i, count, fdin;\r
+       FILE *fileout;\r
+       char *infile = NULL;\r
+       char *outfile = NULL;\r
+       char line[PATHLEN];\r
+       char name[PATHLEN];\r
+       char buffer[16];\r
+\r
+       if (argc > 1)\r
+               {\r
+               infile = argv[1];\r
+               }\r
+\r
+       if (argc > 2)\r
+               {\r
+               outfile = argv[2];\r
+               }\r
+\r
+       if (infile == NULL)\r
+               {\r
+               printf("usage: bin2avr infile.bin [outfile.inc]\n");\r
+\r
+               fflush(stdout);\r
+               exit(1);\r
+               }\r
+\r
+       if (outfile == NULL)\r
+               {\r
+               outfile = name;\r
+               strcpy(outfile, infile);\r
+\r
+               i = strlen(outfile);\r
+               while (i--)\r
+                       {\r
+                       if (outfile[i] == '\\')\r
+                               {\r
+                               break; /* no extension, so don't strip it */\r
+                               }\r
+                       if (outfile[i] == '.')\r
+                               {\r
+                               outfile[i] = 0; /* strip dot and extension */\r
+                               break; /* ready to concatenate our extension */\r
+                               }\r
+                       }\r
+\r
+               strcat(outfile, ".inc");\r
+               }\r
+\r
+       if (!strcmp(infile, outfile))\r
+               {\r
+               fprintf(stderr, "input and output filenames identical\n");\r
+\r
+               fflush(stderr);\r
+               exit(1);\r
+               }\r
+\r
+       fdin = open(infile, O_RDONLY | O_BINARY);\r
+       if (fdin < 0)\r
+               {\r
+               fprintf(stderr, "can't open: ");\r
+               perror(infile);\r
+\r
+               fflush(stderr);\r
+               exit(1);\r
+               }\r
+\r
+       fileout = fopen(outfile, "w");\r
+       if (fileout == NULL)\r
+               {\r
+               fprintf(stderr, "can't create: ");\r
+               perror(outfile);\r
+\r
+               fflush(stderr);\r
+               exit(1);\r
+               }\r
+\r
+       strcpy(line, "; ");\r
+       strcat(line, outfile);\r
+       strcat(line, " generated from ");\r
+       strcat(line, infile);\r
+       strcat(line, ", do not edit!\n");\r
+#ifdef DEBUG\r
+ printf("%s", line);\r
+ fflush(stdout);\r
+#endif\r
+       fputs(line, fileout);\r
+\r
+       *line = 0; /* causes a blank line to be written after title */\r
+\r
+       count = read(fdin, buffer, 16);\r
+       while (count > 0)\r
+               {\r
+               if (*line)\r
+                       {\r
+                       line[strlen(line)-1] = 0; /* kill trailing comma */\r
+                       }\r
+               strcat(line, "\n");\r
+#ifdef DEBUG\r
+ printf("%s", line);\r
+ fflush(stdout);\r
+#endif\r
+               fputs(line, fileout);\r
+\r
+               strcpy(line, "\t.db\t");\r
+               for (i = 0; i < count; i++)\r
+                       {\r
+                       sprintf(&line[5 + i*4], "$%02x,", buffer[i] & 0xff);\r
+                       }\r
+\r
+#if 1 /* hack for AVR assembler bug */\r
+               if (count < 16)\r
+                       {\r
+                       if (count & 1)\r
+                               {\r
+                               strcpy(&line[5 + i*4], "$00,");\r
+                               }\r
+                       break;\r
+                       }\r
+#endif\r
+\r
+               count = read(fdin, buffer, 16);\r
+               }\r
+\r
+       if (*line)\r
+               {\r
+               line[strlen(line)-1] = 0; /* kill trailing comma */\r
+               strcat(line, "\n");\r
+#ifdef DEBUG\r
+ printf("%s", line);\r
+ fflush(stdout);\r
+#endif\r
+               fputs(line, fileout);\r
+\r
+               *line = 0; /* causes a blank line to be written at end */\r
+               }\r
+\r
+       strcat(line, "\n");\r
+#ifdef DEBUG\r
+ printf("%s", line);\r
+ fflush(stdout);\r
+#endif\r
+       fputs(line, fileout);\r
+\r
+       fclose(fileout);\r
+       close(fdin);\r
+\r
+       printf("converted %s to %s\n", infile, outfile);\r
+\r
+       fflush(stdout);\r
+       exit(0);\r
+       }\r
+\r
diff --git a/src/mkutil/bin2avr.exe b/src/mkutil/bin2avr.exe
new file mode 100644 (file)
index 0000000..3ea5d51
Binary files /dev/null and b/src/mkutil/bin2avr.exe differ
index e9139f4..ec59276 100644 (file)
Binary files a/src/mkutil/bin2c.exe and b/src/mkutil/bin2c.exe differ
index ecd79d0..e257bdf 100644 (file)
Binary files a/src/mkutil/crc.exe and b/src/mkutil/crc.exe differ
index 0f3885e..c29e1e5 100644 (file)
Binary files a/src/mkutil/ihex2bin.exe and b/src/mkutil/ihex2bin.exe differ
diff --git a/src/mkutil/link-z80/link-z80.exe b/src/mkutil/link-z80/link-z80.exe
new file mode 100644 (file)
index 0000000..1462ae1
Binary files /dev/null and b/src/mkutil/link-z80/link-z80.exe differ
diff --git a/src/mkutil/link-z80/link-z80.map b/src/mkutil/link-z80/link-z80.map
new file mode 100644 (file)
index 0000000..5d35267
--- /dev/null
@@ -0,0 +1,550 @@
+ link-z80\r
+\r
+ Timestamp is 3ebb8be9 (Fri May 09 21:07:21 2003)\r
+\r
+ Preferred load address is 00400000\r
+\r
+ Start         Length     Name                   Class\r
+ 0001:00000000 0001260dH .text                   CODE\r
+ 0002:00000000 00000606H .rdata                  DATA\r
+ 0002:00000606 00000000H .edata                  DATA\r
+ 0003:00000000 00000104H .CRT$XCA                DATA\r
+ 0003:00000104 00000104H .CRT$XCZ                DATA\r
+ 0003:00000208 00000104H .CRT$XIA                DATA\r
+ 0003:0000030c 00000109H .CRT$XIC                DATA\r
+ 0003:00000418 00000104H .CRT$XIZ                DATA\r
+ 0003:0000051c 00000104H .CRT$XPA                DATA\r
+ 0003:00000620 00000104H .CRT$XPX                DATA\r
+ 0003:00000724 00000104H .CRT$XPZ                DATA\r
+ 0003:00000828 00000104H .CRT$XTA                DATA\r
+ 0003:0000092c 00000104H .CRT$XTZ                DATA\r
+ 0003:00000a30 00004a7dH .data                   DATA\r
+ 0003:000054b0 00001f54H .bss                    DATA\r
+ 0004:00000000 00000014H .idata$2                DATA\r
+ 0004:00000014 00000014H .idata$3                DATA\r
+ 0004:00000028 0000010cH .idata$4                DATA\r
+ 0004:00000134 0000010cH .idata$5                DATA\r
+ 0004:00000240 00000488H .idata$6                DATA\r
+\r
+  Address         Publics by Value              Rva+Base     Lib:Object\r
+\r
+ 0001:00000350       _newarea                   00401350 f   lkarea.obj\r
+ 0001:00000466       _lkparea                   00401466 f   lkarea.obj\r
+ 0001:00000593       _lnkarea                   00401593 f   lkarea.obj\r
+ 0001:000007b5       _lnksect                   004017b5 f   lkarea.obj\r
+ 0001:00000ce0       _eval                      00401ce0 f   lkeval.obj\r
+ 0001:00000d68       _expr                      00401d68 f   lkeval.obj\r
+ 0001:00000faa       _term                      00401faa f   lkeval.obj\r
+ 0001:0000131a       _digit                     0040231a f   lkeval.obj\r
+ 0001:000013cf       _oprio                     004023cf f   lkeval.obj\r
+ 0001:00001620       _newhead                   00402620 f   lkhead.obj\r
+ 0001:00001720       _module                    00402720 f   lkhead.obj\r
+ 0001:000017d0       _getid                     004027d0 f   lklex.obj\r
+ 0001:0000183c       _getfid                    0040283c f   lklex.obj\r
+ 0001:0000188f       _getnb                     0040288f f   lklex.obj\r
+ 0001:000018b0       _skip                      004028b0 f   lklex.obj\r
+ 0001:000018ea       _get                       004028ea f   lklex.obj\r
+ 0001:00001918       _unget                     00402918 f   lklex.obj\r
+ 0001:00001930       _getmap                    00402930 f   lklex.obj\r
+ 0001:00001a80       _getline                   00402a80 f   lklex.obj\r
+ 0001:00001cc0       _more                      00402cc0 f   lklex.obj\r
+ 0001:00001cfd       _endline                   00402cfd f   lklex.obj\r
+ 0001:00001e90       _addpath                   00402e90 f   lklibr.obj\r
+ 0001:00001f21       _addlib                    00402f21 f   lklibr.obj\r
+ 0001:00001f83       _addfile                   00402f83 f   lklibr.obj\r
+ 0001:000021a7       _search                    004031a7 f   lklibr.obj\r
+ 0001:00002228       _fndsym                    00403228 f   lklibr.obj\r
+ 0001:000026df       _library                   004036df f   lklibr.obj\r
+ 0001:0000271c       _loadfile                  0040371c f   lklibr.obj\r
+ 0001:00002a20       _newpag                    00403a20 f   lklist.obj\r
+ 0001:00002a62       _dgt                       00403a62 f   lklist.obj\r
+ 0001:00002aaf       _slew                      00403aaf f   lklist.obj\r
+ 0001:000030cb       _lstarea                   004040cb f   lklist.obj\r
+ 0001:0000361a       _lkulist                   0040461a f   lklist.obj\r
+ 0001:0000374f       _lkalist                   0040474f f   lklist.obj\r
+ 0001:00003a53       _lkglist                   00404a53 f   lklist.obj\r
+ 0001:00004430       _main                      00405430 f   lkmain.obj\r
+ 0001:000047a1       _lkexit                    004057a1 f   lkmain.obj\r
+ 0001:00004831       _link                      00405831 f   lkmain.obj\r
+ 0001:00004aea       _map                       00405aea f   lkmain.obj\r
+ 0001:00004df3       _parse                     00405df3 f   lkmain.obj\r
+ 0001:000053bc       _doparse                   004063bc f   lkmain.obj\r
+ 0001:0000546b       _bassav                    0040646b f   lkmain.obj\r
+ 0001:000054fd       _setbas                    004064fd f   lkmain.obj\r
+ 0001:00005828       _gblsav                    00406828 f   lkmain.obj\r
+ 0001:000058ba       _setgbl                    004068ba f   lkmain.obj\r
+ 0001:000059d8       _afile                     004069d8 f   lkmain.obj\r
+ 0001:00005bbc       _fndidx                    00406bbc f   lkmain.obj\r
+ 0001:00005c32       _usage                     00406c32 f   lkmain.obj\r
+ 0001:000062b0       _lkout                     004072b0 f   lkout.obj\r
+ 0001:000062f2       _ixx                       004072f2 f   lkout.obj\r
+ 0001:000064a2       _iflush                    004074a2 f   lkout.obj\r
+ 0001:00006617       _sxx                       00407617 f   lkout.obj\r
+ 0001:000067e1       _sflush                    004077e1 f   lkout.obj\r
+ 0001:00006ac0       _reloc                     00407ac0 f   lkrloc.obj\r
+ 0001:00006b50       _relt                      00407b50 f   lkrloc.obj\r
+ 0001:00006ba3       _relr                      00407ba3 f   lkrloc.obj\r
+ 0001:000071d1       _relp                      004081d1 f   lkrloc.obj\r
+ 0001:000073d5       _rele                      004083d5 f   lkrloc.obj\r
+ 0001:00007400       _evword                    00408400 f   lkrloc.obj\r
+ 0001:00007446       _adb_1b                    00408446 f   lkrloc.obj\r
+ 0001:0000746c       _adb_2b                    0040846c f   lkrloc.obj\r
+ 0001:00007522       _adb_3b                    00408522 f   lkrloc.obj\r
+ 0001:00007632       _adb_4b                    00408632 f   lkrloc.obj\r
+ 0001:0000779b       _adb_xb                    0040879b f   lkrloc.obj\r
+ 0001:000078d2       _adb_lo                    004088d2 f   lkrloc.obj\r
+ 0001:0000794e       _adb_hi                    0040894e f   lkrloc.obj\r
+ 0001:000079ca       _adb_byte3                 004089ca f   lkrloc.obj\r
+ 0001:00007a46       _adb_byte4                 00408a46 f   lkrloc.obj\r
+ 0001:00007ac2       _adw_xb                    00408ac2 f   lkrloc.obj\r
+ 0001:00007b31       _relerr                    00408b31 f   lkrloc.obj\r
+ 0001:00007b63       _errdmp                    00408b63 f   lkrloc.obj\r
+ 0001:00007ce8       _prntval                   00408ce8 f   lkrloc.obj\r
+ 0001:00007da7       _relerp                    00408da7 f   lkrloc.obj\r
+ 0001:00007dd9       _erpdmp                    00408dd9 f   lkrloc.obj\r
+ 0001:00008360       _syminit                   00409360 f   lksym.obj\r
+ 0001:0000838c       _newsym                    0040938c f   lksym.obj\r
+ 0001:0000855a       _lkpsym                    0040955a f   lksym.obj\r
+ 0001:00008601       _symval                    00409601 f   lksym.obj\r
+ 0001:0000862d       _symdef                    0040962d f   lksym.obj\r
+ 0001:000086a4       _symmod                    004096a4 f   lksym.obj\r
+ 0001:00008760       _symeq                     00409760 f   lksym.obj\r
+ 0001:00008805       _hash                      00409805 f   lksym.obj\r
+ 0001:00008866       _strsto                    00409866 f   lksym.obj\r
+ 0001:000088e5       _new                       004098e5 f   lksym.obj\r
+ 0001:00008ad1       _fprintf                   00409ad1 f   LIBC:fprintf.obj\r
+ 0001:00008b03       ___initstdio               00409b03 f   LIBC:_file.obj\r
+ 0001:00008ba8       ___endstdio                00409ba8 f   LIBC:_file.obj\r
+ 0001:00008bc0       _strcpy                    00409bc0 f   LIBC:strcat.obj\r
+ 0001:00008bd0       _strcat                    00409bd0 f   LIBC:strcat.obj\r
+ 0001:00008cb0       _strlen                    00409cb0 f   LIBC:strlen.obj\r
+ 0001:00008d2b       _fclose                    00409d2b f   LIBC:fclose.obj\r
+ 0001:00008d81       _fgets                     00409d81 f   LIBC:fgets.obj\r
+ 0001:00008dd8       _free                      00409dd8 f   LIBC:free.obj\r
+ 0001:00008e41       __fsopen                   00409e41 f   LIBC:fopen.obj\r
+ 0001:00008e61       _fopen                     00409e61 f   LIBC:fopen.obj\r
+ 0001:00008e74       _sprintf                   00409e74 f   LIBC:sprintf.obj\r
+ 0001:00008ec6       _malloc                    00409ec6 f   LIBC:malloc.obj\r
+ 0001:00008ed8       __nh_malloc                00409ed8 f   LIBC:malloc.obj\r
+ 0001:00008f04       __heap_alloc               00409f04 f   LIBC:malloc.obj\r
+ 0001:00008f90       _strchr                    00409f90 f   LIBC:strchr.obj\r
+ 0001:00008f96       ___from_strstr_to_strchr   00409f96 f   LIBC:strchr.obj\r
+ 0001:00009050       _strncmp                   0040a050 f   LIBC:strncmp.obj\r
+ 0001:00009088       _sscanf                    0040a088 f   LIBC:sscanf.obj\r
+ 0001:000090c0       _strcmp                    0040a0c0 f   LIBC:strcmp.obj\r
+ 0001:00009144       __flsbuf                   0040a144 f   LIBC:_flsbuf.obj\r
+ 0001:00009260       _strncpy                   0040a260 f   LIBC:strncpy.obj\r
+ 0001:0000935e       __cinit                    0040a35e f   LIBC:crt0dat.obj\r
+ 0001:0000938b       _exit                      0040a38b f   LIBC:crt0dat.obj\r
+ 0001:0000939c       __exit                     0040a39c f   LIBC:crt0dat.obj\r
+ 0001:000093ad       __cexit                    0040a3ad f   LIBC:crt0dat.obj\r
+ 0001:000093bc       __c_exit                   0040a3bc f   LIBC:crt0dat.obj\r
+ 0001:00009480       _strrchr                   0040a480 f   LIBC:strrchr.obj\r
+ 0001:000094a7       _mainCRTStartup            0040a4a7 f   LIBC:crt0.obj\r
+ 0001:00009586       __amsg_exit                0040a586 f   LIBC:crt0.obj\r
+ 0001:000095cf       __stbuf                    0040a5cf f   LIBC:_sftbuf.obj\r
+ 0001:0000965c       __ftbuf                    0040a65c f   LIBC:_sftbuf.obj\r
+ 0001:00009699       __output                   0040a699 f   LIBC:output.obj\r
+ 0001:00009ea3       __ioinit                   0040aea3 f   LIBC:ioinit.obj\r
+ 0001:0000a04e       __ioterm                   0040b04e f   LIBC:ioinit.obj\r
+ 0001:0000a071       _calloc                    0040b071 f   LIBC:calloc.obj\r
+ 0001:0000a122       __fcloseall                0040b122 f   LIBC:closeall.obj\r
+ 0001:0000a17a       _fflush                    0040b17a f   LIBC:fflush.obj\r
+ 0001:0000a1b5       __flush                    0040b1b5 f   LIBC:fflush.obj\r
+ 0001:0000a211       __flushall                 0040b211 f   LIBC:fflush.obj\r
+ 0001:0000a287       __close                    0040b287 f   LIBC:close.obj\r
+ 0001:0000a33a       __freebuf                  0040b33a f   LIBC:_freebuf.obj\r
+ 0001:0000a365       __filbuf                   0040b365 f   LIBC:_filbuf.obj\r
+ 0001:0000a43e       __GetLinkerVersion         0040b43e f   LIBC:heapinit.obj\r
+ 0001:0000a46b       ___heap_select             0040b46b f   LIBC:heapinit.obj\r
+ 0001:0000a5b3       __heap_init                0040b5b3 f   LIBC:heapinit.obj\r
+ 0001:0000a610       __heap_term                0040b610 f   LIBC:heapinit.obj\r
+ 0001:0000a6b8       __get_sbh_threshold        0040b6b8 f   LIBC:sbheap.obj\r
+ 0001:0000a6d7       __set_sbh_threshold        0040b6d7 f   LIBC:sbheap.obj\r
+ 0001:0000a78a       ___sbh_heap_init           0040b78a f   LIBC:sbheap.obj\r
+ 0001:0000a7d2       ___sbh_find_block          0040b7d2 f   LIBC:sbheap.obj\r
+ 0001:0000a7fd       ___sbh_free_block          0040b7fd f   LIBC:sbheap.obj\r
+ 0001:0000ab26       ___sbh_alloc_block         0040bb26 f   LIBC:sbheap.obj\r
+ 0001:0000ae2f       ___sbh_alloc_new_region    0040be2f f   LIBC:sbheap.obj\r
+ 0001:0000aee0       ___sbh_alloc_new_group     0040bee0 f   LIBC:sbheap.obj\r
+ 0001:0000afdb       ___sbh_resize_block        0040bfdb f   LIBC:sbheap.obj\r
+ 0001:0000b2d1       ___sbh_heapmin             0040c2d1 f   LIBC:sbheap.obj\r
+ 0001:0000b3a2       ___sbh_heap_check          0040c3a2 f   LIBC:sbheap.obj\r
+ 0001:0000b6d1       __get_old_sbh_threshold    0040c6d1 f   LIBC:sbheap.obj\r
+ 0001:0000b6d7       __set_old_sbh_threshold    0040c6d7 f   LIBC:sbheap.obj\r
+ 0001:0000b6f3       ___old_sbh_new_region      0040c6f3 f   LIBC:sbheap.obj\r
+ 0001:0000b837       ___old_sbh_release_region  0040c837 f   LIBC:sbheap.obj\r
+ 0001:0000b88d       ___old_sbh_decommit_pages  0040c88d f   LIBC:sbheap.obj\r
+ 0001:0000b94f       ___old_sbh_find_block      0040c94f f   LIBC:sbheap.obj\r
+ 0001:0000b9a6       ___old_sbh_free_block      0040c9a6 f   LIBC:sbheap.obj\r
+ 0001:0000b9eb       ___old_sbh_alloc_block     0040c9eb f   LIBC:sbheap.obj\r
+ 0001:0000bbf3       ___old_sbh_alloc_block_from_page 0040cbf3 f   LIBC:sbheap.obj\r
+ 0001:0000bd17       ___old_sbh_resize_block    0040cd17 f   LIBC:sbheap.obj\r
+ 0001:0000bdc0       ___old_sbh_heap_check      0040cdc0 f   LIBC:sbheap.obj\r
+ 0001:0000bf1e       __openfile                 0040cf1e f   LIBC:_open.obj\r
+ 0001:0000c08e       __getstream                0040d08e f   LIBC:stream.obj\r
+ 0001:0000c106       ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z 0040d106 f   LIBC:handler.obj\r
+ 0001:0000c116       ?_query_new_handler@@YAP6AHI@ZXZ 0040d116 f   LIBC:handler.obj\r
+ 0001:0000c11c       __callnewh                 0040d11c f   LIBC:handler.obj\r
+ 0001:0000c137       __input                    0040d137 f   LIBC:input.obj\r
+ 0001:0000cbe8       __lseek                    0040dbe8 f   LIBC:lseek.obj\r
+ 0001:0000cc82       __write                    0040dc82 f   LIBC:write.obj\r
+ 0001:0000ce2f       __getbuf                   0040de2f f   LIBC:_getbuf.obj\r
+ 0001:0000ce73       __isatty                   0040de73 f   LIBC:isatty.obj\r
+ 0001:0000ce99       __XcptFilter               0040de99 f   LIBC:winxfltr.obj\r
+ 0001:0000d01d       __setenvp                  0040e01d f   LIBC:stdenvp.obj\r
+ 0001:0000d0d6       __setargv                  0040e0d6 f   LIBC:stdargv.obj\r
+ 0001:0000d323       ___crtGetEnvironmentStringsA 0040e323 f   LIBC:a_env.obj\r
+ 0001:0000d458       __global_unwind2           0040e458 f   LIBC:exsup.obj\r
+ 0001:0000d49a       __local_unwind2            0040e49a f   LIBC:exsup.obj\r
+ 0001:0000d4f2       __NLG_Return2              0040e4f2 f   LIBC:exsup.obj\r
+ 0001:0000d502       __abnormal_termination     0040e502 f   LIBC:exsup.obj\r
+ 0001:0000d525       __NLG_Notify1              0040e525 f   LIBC:exsup.obj\r
+ 0001:0000d52e       __NLG_Notify               0040e52e f   LIBC:exsup.obj\r
+ 0001:0000d541       __NLG_Dispatch             0040e541 f   LIBC:exsup.obj\r
+ 0001:0000d550       __except_handler3          0040e550 f   LIBC:exsup3.obj\r
+ 0001:0000d60d       __seh_longjmp_unwind@4     0040e60d f   LIBC:exsup3.obj\r
+ 0001:0000d628       __FF_MSGBANNER             0040e628 f   LIBC:crt0msg.obj\r
+ 0001:0000d661       __NMSG_WRITE               0040e661 f   LIBC:crt0msg.obj\r
+ 0001:0000d7b4       __GET_RTERRMSG             0040e7b4 f   LIBC:crt0msg.obj\r
+ 0001:0000d7e5       _wctomb                    0040e7e5 f   LIBC:wctomb.obj\r
+ 0001:0000d850       __aulldiv                  0040e850 f   LIBC:ulldiv.obj\r
+ 0001:0000d8c0       __aullrem                  0040e8c0 f   LIBC:ullrem.obj\r
+ 0001:0000d940       _memset                    0040e940 f   LIBC:memset.obj\r
+ 0001:0000d998       __commit                   0040e998 f   LIBC:commit.obj\r
+ 0001:0000d9ef       __dosmaperr                0040e9ef f   LIBC:dosmap.obj\r
+ 0001:0000da56       __alloc_osfhnd             0040ea56 f   LIBC:osfinfo.obj\r
+ 0001:0000daeb       __set_osfhnd               0040eaeb f   LIBC:osfinfo.obj\r
+ 0001:0000db62       __free_osfhnd              0040eb62 f   LIBC:osfinfo.obj\r
+ 0001:0000dbdc       __get_osfhandle            0040ebdc f   LIBC:osfinfo.obj\r
+ 0001:0000dc19       __open_osfhandle           0040ec19 f   LIBC:osfinfo.obj\r
+ 0001:0000dcb6       __read                     0040ecb6 f   LIBC:read.obj\r
+ 0001:0000deac       _strtol                    0040eeac f   LIBC:strtol.obj\r
+ 0001:0000e0cb       _strtoul                   0040f0cb f   LIBC:strtol.obj\r
+ 0001:0000e0f0       _strstr                    0040f0f0 f   LIBC:strstr.obj\r
+ 0001:0000e170       __chkstk                   0040f170 f   LIBC:chkstk.obj\r
+ 0001:0000e170       __alloca_probe             0040f170 f   LIBC:chkstk.obj\r
+ 0001:0000e1a0       _memmove                   0040f1a0 f   LIBC:memmove.obj\r
+ 0001:0000e4d5       __open                     0040f4d5 f   LIBC:open.obj\r
+ 0001:0000e4ec       __sopen                    0040f4ec f   LIBC:open.obj\r
+ 0001:0000e7a5       _mbtowc                    0040f7a5 f   LIBC:mbtowc.obj\r
+ 0001:0000e86d       _isalpha                   0040f86d f   LIBC:_ctype.obj\r
+ 0001:0000e89b       _isupper                   0040f89b f   LIBC:_ctype.obj\r
+ 0001:0000e8c3       _islower                   0040f8c3 f   LIBC:_ctype.obj\r
+ 0001:0000e8eb       _isdigit                   0040f8eb f   LIBC:_ctype.obj\r
+ 0001:0000e913       _isxdigit                  0040f913 f   LIBC:_ctype.obj\r
+ 0001:0000e940       _isspace                   0040f940 f   LIBC:_ctype.obj\r
+ 0001:0000e968       _ispunct                   0040f968 f   LIBC:_ctype.obj\r
+ 0001:0000e990       _isalnum                   0040f990 f   LIBC:_ctype.obj\r
+ 0001:0000e9be       _isprint                   0040f9be f   LIBC:_ctype.obj\r
+ 0001:0000e9ec       _isgraph                   0040f9ec f   LIBC:_ctype.obj\r
+ 0001:0000ea1a       _iscntrl                   0040fa1a f   LIBC:_ctype.obj\r
+ 0001:0000ea42       ___isascii                 0040fa42 f   LIBC:_ctype.obj\r
+ 0001:0000ea4f       ___toascii                 0040fa4f f   LIBC:_ctype.obj\r
+ 0001:0000ea57       ___iscsymf                 0040fa57 f   LIBC:_ctype.obj\r
+ 0001:0000ea94       ___iscsym                  0040fa94 f   LIBC:_ctype.obj\r
+ 0001:0000ead1       __isctype                  0040fad1 f   LIBC:isctype.obj\r
+ 0001:0000eb50       __allmul                   0040fb50 f   LIBC:llmul.obj\r
+ 0001:0000eb90       __allshl                   0040fb90 f   LIBC:llshl.obj\r
+ 0001:0000ebaf       _ungetc                    0040fbaf f   LIBC:ungetc.obj\r
+ 0001:0000ec1d       __setmbcp                  0040fc1d f   LIBC:mbctype.obj\r
+ 0001:0000efe1       __getmbcp                  0040ffe1 f   LIBC:mbctype.obj\r
+ 0001:0000eff1       ___initmbctable            0040fff1 f   LIBC:mbctype.obj\r
+ 0001:0000f010       _memcpy                    00410010 f   LIBC:memcpy.obj\r
+ 0001:0000f345       ___crtMessageBoxA          00410345 f   LIBC:crtmbox.obj\r
+ 0001:0000f3ce       __fptrap                   004103ce f   LIBC:crt0fp.obj\r
+ 0001:0000f3d7       __toupper                  004103d7 f   LIBC:toupper.obj\r
+ 0001:0000f3df       _toupper                   004103df f   LIBC:toupper.obj\r
+ 0001:0000f4ab       __chsize                   004104ab f   LIBC:chsize.obj\r
+ 0001:0000f5f1       ___crtGetStringTypeA       004105f1 f   LIBC:a_str.obj\r
+ 0001:0000f73a       ___crtLCMapStringA         0041073a f   LIBC:a_map.obj\r
+ 0001:0000f989       __setmode                  00410989 f   LIBC:setmode.obj\r
+ 0001:0000fa00       _HeapFree@12               00410a00 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa06       _HeapAlloc@12              00410a06 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa0c       _ExitProcess@4             00410a0c f   kernel32:KERNEL32.dll\r
+ 0001:0000fa12       _TerminateProcess@8        00410a12 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa18       _GetCurrentProcess@0       00410a18 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa1e       _GetCommandLineA@0         00410a1e f   kernel32:KERNEL32.dll\r
+ 0001:0000fa24       _GetVersion@0              00410a24 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa2a       _SetHandleCount@4          00410a2a f   kernel32:KERNEL32.dll\r
+ 0001:0000fa30       _GetStdHandle@4            00410a30 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa36       _GetFileType@4             00410a36 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa3c       _GetStartupInfoA@4         00410a3c f   kernel32:KERNEL32.dll\r
+ 0001:0000fa42       _GetLastError@0            00410a42 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa48       _CloseHandle@4             00410a48 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa4e       _GetModuleHandleA@4        00410a4e f   kernel32:KERNEL32.dll\r
+ 0001:0000fa54       _GetModuleFileNameA@12     00410a54 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa5a       _GetEnvironmentVariableA@12 00410a5a f   kernel32:KERNEL32.dll\r
+ 0001:0000fa60       _GetVersionExA@4           00410a60 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa66       _HeapDestroy@4             00410a66 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa6c       _HeapCreate@12             00410a6c f   kernel32:KERNEL32.dll\r
+ 0001:0000fa72       _VirtualFree@12            00410a72 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa78       _VirtualAlloc@16           00410a78 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa7e       _HeapReAlloc@16            00410a7e f   kernel32:KERNEL32.dll\r
+ 0001:0000fa84       _IsBadWritePtr@8           00410a84 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa8a       _SetFilePointer@16         00410a8a f   kernel32:KERNEL32.dll\r
+ 0001:0000fa90       _WriteFile@20              00410a90 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa96       _UnhandledExceptionFilter@4 00410a96 f   kernel32:KERNEL32.dll\r
+ 0001:0000fa9c       _FreeEnvironmentStringsA@4 00410a9c f   kernel32:KERNEL32.dll\r
+ 0001:0000faa2       _FreeEnvironmentStringsW@4 00410aa2 f   kernel32:KERNEL32.dll\r
+ 0001:0000faa8       _WideCharToMultiByte@32    00410aa8 f   kernel32:KERNEL32.dll\r
+ 0001:0000faae       _GetEnvironmentStrings@0   00410aae f   kernel32:KERNEL32.dll\r
+ 0001:0000fab4       _GetEnvironmentStringsW@0  00410ab4 f   kernel32:KERNEL32.dll\r
+ 0001:0000faba       _RtlUnwind@16              00410aba f   kernel32:KERNEL32.dll\r
+ 0001:0000fac0       _FlushFileBuffers@4        00410ac0 f   kernel32:KERNEL32.dll\r
+ 0001:0000fac6       _SetStdHandle@8            00410ac6 f   kernel32:KERNEL32.dll\r
+ 0001:0000facc       _ReadFile@20               00410acc f   kernel32:KERNEL32.dll\r
+ 0001:0000fad2       _CreateFileA@28            00410ad2 f   kernel32:KERNEL32.dll\r
+ 0001:0000fad8       _MultiByteToWideChar@24    00410ad8 f   kernel32:KERNEL32.dll\r
+ 0001:0000fade       _GetCPInfo@8               00410ade f   kernel32:KERNEL32.dll\r
+ 0001:0000fae4       _GetACP@0                  00410ae4 f   kernel32:KERNEL32.dll\r
+ 0001:0000faea       _GetOEMCP@0                00410aea f   kernel32:KERNEL32.dll\r
+ 0001:0000faf0       _GetProcAddress@8          00410af0 f   kernel32:KERNEL32.dll\r
+ 0001:0000faf6       _LoadLibraryA@4            00410af6 f   kernel32:KERNEL32.dll\r
+ 0001:0000fafc       _SetEndOfFile@4            00410afc f   kernel32:KERNEL32.dll\r
+ 0001:0000fb02       _GetStringTypeA@20         00410b02 f   kernel32:KERNEL32.dll\r
+ 0001:0000fb08       _GetStringTypeW@16         00410b08 f   kernel32:KERNEL32.dll\r
+ 0001:0000fb0e       _LCMapStringA@24           00410b0e f   kernel32:KERNEL32.dll\r
+ 0001:0000fb14       _LCMapStringW@24           00410b14 f   kernel32:KERNEL32.dll\r
+ 0002:0000002c       ___lookuptable             0041402c     LIBC:output.obj\r
+ 0002:00000088       ??_C@_1O@POHA@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 00414088     LIBC:output.obj\r
+ 0002:00000098       ??_C@_06ONKE@?$CInull?$CJ?$AA@ 00414098     LIBC:output.obj\r
+ 0002:000000a0       ??_C@_0BH@PHHF@__GLOBAL_HEAP_SELECTED?$AA@ 004140a0     LIBC:heapinit.obj\r
+ 0002:000000b8       ??_C@_0BF@BBGL@__MSVCRT_HEAP_SELECT?$AA@ 004140b8     LIBC:heapinit.obj\r
+ 0002:000000d0       ??_C@_0P@GGKG@runtime?5error?5?$AA@ 004140d0     LIBC:crt0msg.obj\r
+ 0002:000000e0       ??_C@_02PIMC@?$AN?6?$AA@   004140e0     LIBC:crt0msg.obj\r
+ 0002:000000e4       ??_C@_0O@DELO@TLOSS?5error?$AN?6?$AA@ 004140e4     LIBC:crt0msg.obj\r
+ 0002:000000f4       ??_C@_0N@OMLL@SING?5error?$AN?6?$AA@ 004140f4     LIBC:crt0msg.obj\r
+ 0002:00000104       ??_C@_0P@OJAK@DOMAIN?5error?$AN?6?$AA@ 00414104     LIBC:crt0msg.obj\r
+ 0002:00000114       ??_C@_0CF@EANP@R6028?$AN?6?9?5unable?5to?5initialize?5he@ 00414114     LIBC:crt0msg.obj\r
+ 0002:0000013c       ??_C@_0DF@ECGN@R6027?$AN?6?9?5not?5enough?5space?5for?5lo@ 0041413c     LIBC:crt0msg.obj\r
+ 0002:00000174       ??_C@_0DF@FKAC@R6026?$AN?6?9?5not?5enough?5space?5for?5st@ 00414174     LIBC:crt0msg.obj\r
+ 0002:000001ac       ??_C@_0CG@DPMN@R6025?$AN?6?9?5pure?5virtual?5function?5c@ 004141ac     LIBC:crt0msg.obj\r
+ 0002:000001d4       ??_C@_0DF@CKIP@R6024?$AN?6?9?5not?5enough?5space?5for?5_o@ 004141d4     LIBC:crt0msg.obj\r
+ 0002:0000020c       ??_C@_0CJ@GGOE@R6019?$AN?6?9?5unable?5to?5open?5console?5@ 0041420c     LIBC:crt0msg.obj\r
+ 0002:00000238       ??_C@_0CB@LBOB@R6018?$AN?6?9?5unexpected?5heap?5error?$AN?6@ 00414238     LIBC:crt0msg.obj\r
+ 0002:0000025c       ??_C@_0CN@FPEG@R6017?$AN?6?9?5unexpected?5multithread?5@ 0041425c     LIBC:crt0msg.obj\r
+ 0002:0000028c       ??_C@_0CM@OBIC@R6016?$AN?6?9?5not?5enough?5space?5for?5th@ 0041428c     LIBC:crt0msg.obj\r
+ 0002:000002b8       ??_C@_0CB@HPAL@?$AN?6abnormal?5program?5termination?$AN?6@ 004142b8     LIBC:crt0msg.obj\r
+ 0002:000002dc       ??_C@_0CM@JOOB@R6009?$AN?6?9?5not?5enough?5space?5for?5en@ 004142dc     LIBC:crt0msg.obj\r
+ 0002:00000308       ??_C@_0CK@OIBL@R6008?$AN?6?9?5not?5enough?5space?5for?5ar@ 00414308     LIBC:crt0msg.obj\r
+ 0002:00000334       ??_C@_0CF@LKPB@R6002?$AN?6?9?5floating?5point?5not?5load@ 00414334     LIBC:crt0msg.obj\r
+ 0002:0000035c       ??_C@_0CF@JPDF@Microsoft?5Visual?5C?$CL?$CL?5Runtime?5Lib@ 0041435c     LIBC:crt0msg.obj\r
+ 0002:00000384       ??_C@_02JJJH@?6?6?$AA@     00414384     LIBC:crt0msg.obj\r
+ 0002:00000388       ??_C@_0BK@DEOK@Runtime?5Error?$CB?6?6Program?3?5?$AA@ 00414388     LIBC:crt0msg.obj\r
+ 0002:000003a4       ??_C@_03NAME@?4?4?4?$AA@   004143a4     LIBC:crt0msg.obj\r
+ 0002:000003a8       ??_C@_0BH@NNCD@?$DMprogram?5name?5unknown?$DO?$AA@ 004143a8     LIBC:crt0msg.obj\r
+ 0002:000003c0       ??_C@_0BD@NJFP@GetLastActivePopup?$AA@ 004143c0     LIBC:crtmbox.obj\r
+ 0002:000003d4       ??_C@_0BA@GILI@GetActiveWindow?$AA@ 004143d4     LIBC:crtmbox.obj\r
+ 0002:000003e4       ??_C@_0M@PKCK@MessageBoxA?$AA@ 004143e4     LIBC:crtmbox.obj\r
+ 0002:000003f0       ??_C@_0L@HKL@user32?4dll?$AA@ 004143f0     LIBC:crtmbox.obj\r
+ 0002:000003fc       ??_C@_01A@?$AA?$AA@        004143fc     LIBC:a_str.obj\r
+ 0002:00000400       ??_C@_13A@?$AA?$AA?$AA?$AA@ 00414400     LIBC:a_str.obj\r
+ 0003:00000000       ___xc_a                    00415000     LIBC:crt0init.obj\r
+ 0003:00000104       ___xc_z                    00415104     LIBC:crt0init.obj\r
+ 0003:00000208       ___xi_a                    00415208     LIBC:crt0init.obj\r
+ 0003:00000418       ___xi_z                    00415418     LIBC:crt0init.obj\r
+ 0003:0000051c       ___xp_a                    0041551c     LIBC:crt0init.obj\r
+ 0003:00000724       ___xp_z                    00415724     LIBC:crt0init.obj\r
+ 0003:00000828       ___xt_a                    00415828     LIBC:crt0init.obj\r
+ 0003:0000092c       ___xt_z                    0041592c     LIBC:crt0init.obj\r
+ 0003:00000b14       __abs_                     00415b14     lkdata.obj\r
+ 0003:00000b18       _rtaflg                    00415b18     lkdata.obj\r
+ 0003:00000b1c       _ctype                     00415b1c     lkdata.obj\r
+ 0003:00000b9c       _ccase                     00415b9c     lkdata.obj\r
+ 0003:00001370       _usetxt                    00416370     lkmain.obj\r
+ 0003:00001d7c       _errmsg                    00416d7c     lkrloc.obj\r
+ 0003:000022d0       __iob                      004172d0     LIBC:_file.obj\r
+ 0003:00002550       __aexit_rtn                00417550     LIBC:crt0.obj\r
+ 0003:00002554       ___app_type                00417554     LIBC:crt0.obj\r
+ 0003:00002558       ___nullstring              00417558     LIBC:output.obj\r
+ 0003:0000255c       ___wnullstring             0041755c     LIBC:output.obj\r
+ 0003:00002560       ___badioinfo               00417560     LIBC:ioinit.obj\r
+ 0003:00002568       __amblksiz                 00417568     LIBC:heapinit.obj\r
+ 0003:00002570       ___old_small_block_heap    00417570     LIBC:sbheap.obj\r
+ 0003:00004594       ___old_sbh_threshold       00419594     LIBC:sbheap.obj\r
+ 0003:000045a8       __XcptActTab               004195a8     LIBC:winxfltr.obj\r
+ 0003:00004620       __First_FPE_Indx           00419620     LIBC:winxfltr.obj\r
+ 0003:00004624       __Num_FPE                  00419624     LIBC:winxfltr.obj\r
+ 0003:00004628       __XcptActTabCount          00419628     LIBC:winxfltr.obj\r
+ 0003:0000462c       __fpecode                  0041962c     LIBC:winxfltr.obj\r
+ 0003:00004630       __NLG_Destination          00419630     LIBC:exsup.obj\r
+ 0003:000046d0       __cfltcvt_tab              004196d0     LIBC:cmiscdat.obj\r
+ 0003:000046e8       __pctype                   004196e8     LIBC:ctype.obj\r
+ 0003:000046ec       __pwctype                  004196ec     LIBC:ctype.obj\r
+ 0003:000046f0       __ctype                    004196f0     LIBC:ctype.obj\r
+ 0003:00004a70       ___mb_cur_max              00419a70     LIBC:nlsdata1.obj\r
+ 0003:00004a74       ___decimal_point           00419a74     LIBC:nlsdata1.obj\r
+ 0003:00004a78       ___decimal_point_length    00419a78     LIBC:nlsdata1.obj\r
+ 0003:000054b0       _rtadr0                    0041a4b0     lkdata.obj\r
+ 0003:000054b4       _rtadr1                    0041a4b4     lkdata.obj\r
+ 0003:000054b8       _rtadr2                    0041a4b8     lkdata.obj\r
+ 0003:000054bc       _obj_flag                  0041a4bc     lkdata.obj\r
+ 0003:000054e8       __cflush                   0041a4e8     LIBC:_file.obj\r
+ 0003:000054ec       _errno                     0041a4ec     LIBC:crt0dat.obj\r
+ 0003:000054f0       __doserrno                 0041a4f0     LIBC:crt0dat.obj\r
+ 0003:000054f4       __umaskval                 0041a4f4     LIBC:crt0dat.obj\r
+ 0003:000054f8       __osver                    0041a4f8     LIBC:crt0dat.obj\r
+ 0003:000054fc       __winver                   0041a4fc     LIBC:crt0dat.obj\r
+ 0003:00005500       __winmajor                 0041a500     LIBC:crt0dat.obj\r
+ 0003:00005504       __winminor                 0041a504     LIBC:crt0dat.obj\r
+ 0003:00005508       ___argc                    0041a508     LIBC:crt0dat.obj\r
+ 0003:0000550c       ___argv                    0041a50c     LIBC:crt0dat.obj\r
+ 0003:00005510       ___wargv                   0041a510     LIBC:crt0dat.obj\r
+ 0003:00005514       __environ                  0041a514     LIBC:crt0dat.obj\r
+ 0003:00005518       ___initenv                 0041a518     LIBC:crt0dat.obj\r
+ 0003:0000551c       __wenviron                 0041a51c     LIBC:crt0dat.obj\r
+ 0003:00005520       ___winitenv                0041a520     LIBC:crt0dat.obj\r
+ 0003:00005524       __pgmptr                   0041a524     LIBC:crt0dat.obj\r
+ 0003:00005528       __wpgmptr                  0041a528     LIBC:crt0dat.obj\r
+ 0003:0000552c       __exitflag                 0041a52c     LIBC:crt0dat.obj\r
+ 0003:00005530       __C_Termination_Done       0041a530     LIBC:crt0dat.obj\r
+ 0003:00005534       __C_Exit_Done              0041a534     LIBC:crt0dat.obj\r
+ 0003:00005538       __aenvptr                  0041a538     LIBC:crt0.obj\r
+ 0003:0000553c       __wenvptr                  0041a53c     LIBC:crt0.obj\r
+ 0003:00005540       ___error_mode              0041a540     LIBC:crt0.obj\r
+ 0003:00005544       __stdbuf                   0041a544     LIBC:_sftbuf.obj\r
+ 0003:00005550       __newmode                  0041a550     LIBC:_newmode.obj\r
+ 0003:00005554       ?_pnhHeap@@3P6AHI@ZA       0041a554     LIBC:handler.obj\r
+ 0003:00005558       __pxcptinfoptrs            0041a558     LIBC:winxfltr.obj\r
+ 0003:00005664       __adbgmsg                  0041a664     LIBC:crt0msg.obj\r
+ 0003:00005668       __commode                  0041a668     LIBC:ncommode.obj\r
+ 0003:0000567c       ___lc_handle               0041a67c     LIBC:nlsdata2.obj\r
+ 0003:00005694       ___lc_codepage             0041a694     LIBC:nlsdata2.obj\r
+ 0003:00005698       ___lc_collate_cp           0041a698     LIBC:nlsdata2.obj\r
+ 0003:0000569c       __fmode                    0041a69c     LIBC:txtmode.obj\r
+ 0003:000056a8       _uflag                     0041a6a8     <common>\r
+ 0003:0000578c       _hilo                      0041a78c     <common>\r
+ 0003:000057a0       _rtbuf                     0041a7a0     <common>\r
+ 0003:000057f0       _rtcnt                     0041a7f0     <common>\r
+ 0003:00005800       _rtflg                     0041a800     <common>\r
+ 0003:00005840       _lbfhead                   0041a840     <common>\r
+ 0003:00005860       _symhash                   0041a860     <common>\r
+ 0003:00005960       _cfp                       0041a960     <common>\r
+ 0003:00005964       _bsp                       0041a964     <common>\r
+ 0003:00005968       _axp                       0041a968     <common>\r
+ 0003:0000596c       _lbnhead                   0041a96c     <common>\r
+ 0003:00005970       _gcntr                     0041a970     <common>\r
+ 0003:00005974       _filep                     0041a974     <common>\r
+ 0003:00005978       _gsp                       0041a978     <common>\r
+ 0003:0000597c       _globlp                    0041a97c     <common>\r
+ 0003:00005980       _lfp                       0041a980     <common>\r
+ 0003:00005984       _mfp                       0041a984     <common>\r
+ 0003:00005988       _a_mask                    0041a988     <common>\r
+ 0003:0000598c       _line                      0041a98c     <common>\r
+ 0003:00005990       _lop                       0041a990     <common>\r
+ 0003:000059a0       _rtval                     0041a9a0     <common>\r
+ 0003:000059e0       _ofp                       0041a9e0     <common>\r
+ 0003:000059e4       _headp                     0041a9e4     <common>\r
+ 0003:000059e8       _zflag                     0041a9e8     <common>\r
+ 0003:000059ec       _rfp                       0041a9ec     <common>\r
+ 0003:000059f0       _oflag                     0041a9f0     <common>\r
+ 0003:00005a00       _sdp                       0041aa00     <common>\r
+ 0003:00005a0c       _sfp                       0041aa0c     <common>\r
+ 0003:00005a10       _areap                     0041aa10     <common>\r
+ 0003:00005a14       _tfp                       0041aa14     <common>\r
+ 0003:00005a18       _page                      0041aa18     <common>\r
+ 0003:00005a1c       _pass                      0041aa1c     <common>\r
+ 0003:00005a20       _ap                        0041aa20     <common>\r
+ 0003:00005a24       _outfp                     0041aa24     <common>\r
+ 0003:00005a40       _ib                        0041aa40     <common>\r
+ 0003:00005b08       _wflag                     0041ab08     <common>\r
+ 0003:00005b0c       _hp                        0041ab0c     <common>\r
+ 0003:00005b10       _ip                        0041ab10     <common>\r
+ 0003:00005b20       _rb                        0041ab20     <common>\r
+ 0003:00005be8       _rp                        0041abe8     <common>\r
+ 0003:00005bec       _a_bytes                   0041abec     <common>\r
+ 0003:00005bf0       _gline                     0041abf0     <common>\r
+ 0003:00005c00       _rerr                      0041ac00     <common>\r
+ 0003:00005c14       _pflag                     0041ac14     <common>\r
+ 0003:00005c18       _s_mask                    0041ac18     <common>\r
+ 0003:00005c1c       _basep                     0041ac1c     <common>\r
+ 0003:00005c20       _lbphead                   0041ac20     <common>\r
+ 0003:00005c24       _xflag                     0041ac24     <common>\r
+ 0003:00005c28       _startp                    0041ac28     <common>\r
+ 0003:00005c2c       _radix                     0041ac2c     <common>\r
+ 0003:00005c30       _mflag                     0041ac30     <common>\r
+ 0003:00005c34       _linkp                     0041ac34     <common>\r
+ 0003:00005c38       _objflg                    0041ac38     <common>\r
+ 0003:00005c3c       _lkerr                     0041ac3c     <common>\r
+ 0003:00005c40       _v_mask                    0041ac40     <common>\r
+ 0003:00005c44       ___mbcodepage              0041ac44     <common>\r
+ 0003:00005cc0       ___mbulinfo                0041acc0     <common>\r
+ 0003:00005ccc       ___ismbcodepage            0041accc     <common>\r
+ 0003:00005ce0       __mbcasemap                0041ace0     <common>\r
+ 0003:00005de0       __mbctype                  0041ade0     <common>\r
+ 0003:00005ee4       ___mblcid                  0041aee4     <common>\r
+ 0003:00005ee8       ___sbh_sizeHeaderList      0041aee8     <common>\r
+ 0003:00005efc       ___sbh_indGroupDefer       0041aefc     <common>\r
+ 0003:00005f00       ___sbh_pHeaderScan         0041af00     <common>\r
+ 0003:00005f04       ___sbh_initialized         0041af04     <common>\r
+ 0003:00005f08       ___sbh_pHeaderDefer        0041af08     <common>\r
+ 0003:00005f0c       ___sbh_cntHeaderList       0041af0c     <common>\r
+ 0003:00005f10       ___sbh_pHeaderList         0041af10     <common>\r
+ 0003:00005f14       ___sbh_threshold           0041af14     <common>\r
+ 0003:00005f18       __crtheap                  0041af18     <common>\r
+ 0003:00005f28       ___active_heap             0041af28     <common>\r
+ 0003:00005f40       ___pioinfo                 0041af40     <common>\r
+ 0003:0000607c       __nhandle                  0041b07c     <common>\r
+ 0003:00006080       __acmdln                   0041b080     <common>\r
+ 0003:0000608c       ___env_initialized         0041b08c     <common>\r
+ 0003:0000609c       ___mbctype_initialized     0041b09c     <common>\r
+ 0003:000060a0       ___onexitend               0041b0a0     <common>\r
+ 0003:000060a4       ___onexitbegin             0041b0a4     <common>\r
+ 0003:000060a8       __FPinit                   0041b0a8     <common>\r
+ 0003:000060ac       ___piob                    0041b0ac     <common>\r
+ 0003:00006400       __bufin                    0041b400     <common>\r
+ 0003:00007400       __nstream                  0041c400     <common>\r
+ 0004:00000000       __IMPORT_DESCRIPTOR_KERNEL32 0041d000     kernel32:KERNEL32.dll\r
+ 0004:00000014       __NULL_IMPORT_DESCRIPTOR   0041d014     kernel32:KERNEL32.dll\r
+ 0004:00000134       __imp__WriteFile@20        0041d134     kernel32:KERNEL32.dll\r
+ 0004:00000138       __imp__HeapAlloc@12        0041d138     kernel32:KERNEL32.dll\r
+ 0004:0000013c       __imp__ExitProcess@4       0041d13c     kernel32:KERNEL32.dll\r
+ 0004:00000140       __imp__TerminateProcess@8  0041d140     kernel32:KERNEL32.dll\r
+ 0004:00000144       __imp__GetCurrentProcess@0 0041d144     kernel32:KERNEL32.dll\r
+ 0004:00000148       __imp__GetCommandLineA@0   0041d148     kernel32:KERNEL32.dll\r
+ 0004:0000014c       __imp__GetVersion@0        0041d14c     kernel32:KERNEL32.dll\r
+ 0004:00000150       __imp__SetHandleCount@4    0041d150     kernel32:KERNEL32.dll\r
+ 0004:00000154       __imp__GetStdHandle@4      0041d154     kernel32:KERNEL32.dll\r
+ 0004:00000158       __imp__GetFileType@4       0041d158     kernel32:KERNEL32.dll\r
+ 0004:0000015c       __imp__GetStartupInfoA@4   0041d15c     kernel32:KERNEL32.dll\r
+ 0004:00000160       __imp__GetLastError@0      0041d160     kernel32:KERNEL32.dll\r
+ 0004:00000164       __imp__CloseHandle@4       0041d164     kernel32:KERNEL32.dll\r
+ 0004:00000168       __imp__GetModuleHandleA@4  0041d168     kernel32:KERNEL32.dll\r
+ 0004:0000016c       __imp__GetModuleFileNameA@12 0041d16c     kernel32:KERNEL32.dll\r
+ 0004:00000170       __imp__GetEnvironmentVariableA@12 0041d170     kernel32:KERNEL32.dll\r
+ 0004:00000174       __imp__GetVersionExA@4     0041d174     kernel32:KERNEL32.dll\r
+ 0004:00000178       __imp__HeapDestroy@4       0041d178     kernel32:KERNEL32.dll\r
+ 0004:0000017c       __imp__HeapCreate@12       0041d17c     kernel32:KERNEL32.dll\r
+ 0004:00000180       __imp__VirtualFree@12      0041d180     kernel32:KERNEL32.dll\r
+ 0004:00000184       __imp__VirtualAlloc@16     0041d184     kernel32:KERNEL32.dll\r
+ 0004:00000188       __imp__HeapReAlloc@16      0041d188     kernel32:KERNEL32.dll\r
+ 0004:0000018c       __imp__IsBadWritePtr@8     0041d18c     kernel32:KERNEL32.dll\r
+ 0004:00000190       __imp__SetFilePointer@16   0041d190     kernel32:KERNEL32.dll\r
+ 0004:00000194       __imp__HeapFree@12         0041d194     kernel32:KERNEL32.dll\r
+ 0004:00000198       __imp__UnhandledExceptionFilter@4 0041d198     kernel32:KERNEL32.dll\r
+ 0004:0000019c       __imp__FreeEnvironmentStringsA@4 0041d19c     kernel32:KERNEL32.dll\r
+ 0004:000001a0       __imp__FreeEnvironmentStringsW@4 0041d1a0     kernel32:KERNEL32.dll\r
+ 0004:000001a4       __imp__WideCharToMultiByte@32 0041d1a4     kernel32:KERNEL32.dll\r
+ 0004:000001a8       __imp__GetEnvironmentStrings@0 0041d1a8     kernel32:KERNEL32.dll\r
+ 0004:000001ac       __imp__GetEnvironmentStringsW@0 0041d1ac     kernel32:KERNEL32.dll\r
+ 0004:000001b0       __imp__RtlUnwind@16        0041d1b0     kernel32:KERNEL32.dll\r
+ 0004:000001b4       __imp__FlushFileBuffers@4  0041d1b4     kernel32:KERNEL32.dll\r
+ 0004:000001b8       __imp__SetStdHandle@8      0041d1b8     kernel32:KERNEL32.dll\r
+ 0004:000001bc       __imp__ReadFile@20         0041d1bc     kernel32:KERNEL32.dll\r
+ 0004:000001c0       __imp__CreateFileA@28      0041d1c0     kernel32:KERNEL32.dll\r
+ 0004:000001c4       __imp__MultiByteToWideChar@24 0041d1c4     kernel32:KERNEL32.dll\r
+ 0004:000001c8       __imp__GetCPInfo@8         0041d1c8     kernel32:KERNEL32.dll\r
+ 0004:000001cc       __imp__GetACP@0            0041d1cc     kernel32:KERNEL32.dll\r
+ 0004:000001d0       __imp__GetOEMCP@0          0041d1d0     kernel32:KERNEL32.dll\r
+ 0004:000001d4       __imp__GetProcAddress@8    0041d1d4     kernel32:KERNEL32.dll\r
+ 0004:000001d8       __imp__LoadLibraryA@4      0041d1d8     kernel32:KERNEL32.dll\r
+ 0004:000001dc       __imp__SetEndOfFile@4      0041d1dc     kernel32:KERNEL32.dll\r
+ 0004:000001e0       __imp__GetStringTypeA@20   0041d1e0     kernel32:KERNEL32.dll\r
+ 0004:000001e4       __imp__GetStringTypeW@16   0041d1e4     kernel32:KERNEL32.dll\r
+ 0004:000001e8       __imp__LCMapStringA@24     0041d1e8     kernel32:KERNEL32.dll\r
+ 0004:000001ec       __imp__LCMapStringW@24     0041d1ec     kernel32:KERNEL32.dll\r
+ 0004:000001f0       \177KERNEL32_NULL_THUNK_DATA 0041d1f0     kernel32:KERNEL32.dll\r
+\r
+ entry point at        0001:000094a7\r
+\r
similarity index 93%
rename from src/link-z80/n.bat
rename to src/mkutil/link-z80/n.bat
index 527a821..58d1058 100644 (file)
@@ -22,7 +22,7 @@ cl -Zi -I. -DWIN32 -DINDEXLIB -c lksym.c
 @if errorlevel 1 goto failure\r
 link @link-z80.lnk\r
 @if errorlevel 1 goto failure\r
-copy link-z80.exe ..\bin\r
+copy link-z80.exe ..\..\bin\r
 \r
 @echo SUCCESS\r
 @goto done\r
similarity index 100%
rename from src/link-z80/x.bat
rename to src/mkutil/link-z80/x.bat
index 53a42a2..a3013c9 100644 (file)
@@ -10,6 +10,10 @@ cl -Zi -I. bin2c.c
 @if errorlevel 1 goto failure\r
 copy bin2c.exe ..\bin\r
 \r
+cl -Zi -I. bin2avr.c\r
+@if errorlevel 1 goto failure\r
+copy bin2avr.exe ..\bin\r
+\r
 cl -Zi -I. -DVAX cr.c\r
 @if errorlevel 1 goto failure\r
 copy cr.exe ..\bin\r
diff --git a/src/mkutil/tavrasm.118/README b/src/mkutil/tavrasm.118/README
new file mode 100644 (file)
index 0000000..22b0b46
--- /dev/null
@@ -0,0 +1,320 @@
+
+  Toms AVR macro assembler - tavrasm 1.18
+ =============================================================================
+
+  tavrasm - A GNU/Linux assembler for the Atmel AVR series of
+  micro-controllers. Copyright (C) 1999-2003 Tom Mortensen
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or (at
+  your option) any later version.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+  USA.
+
+  Introduction
+ =============================================================================
+
+  tavrasm is an assembler for the Atmel AVR family of micro-controllers. 
+  It uses a syntax similar to the one found in the Atmel AVR DOS assembler.
+  Some of the features includes:
+
+   - Super-set of Atmel AVR assembler. 
+   - Macros in macros. 
+   - Save Intel HEX, Motorola S-record, Generic and binary output. 
+   - More than 100 warning/error messages. 
+   - Atmel object files compatible with Atmel's AVR Studio. 
+   - C escape characters in char/string literals. 
+   - Runs on (win)DOS, Linux, OS/2, Solaris, ...
+   - Free software released under GPL.
+
+  Installation
+ =============================================================================
+
+  Copy the tavrasm executable (tavrasm.exe for OS/2 and DOS) to a
+  directory in your path.
+
+  Running
+ =============================================================================
+
+  Just type 'tavrasm file.asm'. This will generate an Intel HEX output file
+  ('file.hex'). To get help, type 'tavrasm' with no arguments.
+
+  Compiling
+ =============================================================================
+
+  tavrasm should compile on most systems that are supported by gcc.
+  I haven't check for endianes, so this might be a problem if
+  anybody wants to compile it on non-i386 systems (mail me, and I will 
+  fix this). 
+
+  Check the makefile for additional information.
+
+  Systems supported
+ =============================================================================
+
+  Linux/x86:   I wrote parts of tavrasm on a Linux/x86.
+
+  Linux/PPC:           Andreas Bogk reports that he has successfully compiled
+                       tavrasm on a LinuxPPC machine. 
+
+  Linux/Alpha:         Now works (after a little bug fix).
+
+  FreeBSD:     Lots of people runs tavrasm on FreeBSD.
+
+  Sparc:       I have received reports from serveral people running
+                tavrasm on a Sparc station.
+
+  OS/2:                I wrote the initial version of tavrasm on OS/2 (using emx)
+
+  Note: On non-x86 machines remove -m486 from the makefile :)
+
+  Bugs/Suggestions/Patches
+ =============================================================================
+
+  Please send any bug-reports/suggestions/patches to me (tom@tavrasm.org).
+
+  History
+ =============================================================================
+
+  1.18 - Added support for specifying unsigned integer values [0; 2^32-1]
+
+         Thanks to Richard Gerrits for pointing out the problem.
+
+         Added support for specifying Z/Y/Z for adiw, sbiw and movw.
+         
+         Thanks to Richard Barrington for suggesting this.
+
+         Added support for a bunch of Mega devices.
+
+         Thanks to Andreas Schwarz for supplying a patch with these.
+
+         Fixed problems compiling with GCC 3.2
+
+         Several people supplied patches, but I was just too busy
+         integrating them.
+
+         Thanks to Patrick Dreker for supplying the final patch.
+
+  1.17 - Added support for the BYTE1 (same as LOW) function.
+
+         Thanks to Timothy Lee for supplying this patch.
+
+         Fixed path delimiter problem in include path. I used 
+         DOS style '\' causing problems on *NIX.
+
+         Thanks to Timothy Lee for reporting this.
+
+  1.16 - Fixed problem with long macro names.
+
+         Thanks to Richard Gerrits for reporting this.
+
+         Increased maximum identifier length to 64 (and no, this was
+         not the fix to the problem above :).
+
+         Added support for using DOS (\13\10) files on *NIX systems.
+
+         Change URL to www.tavrasm.org in help/README/...
+
+  1.15 - Added support for multiple include path. Use '-I' to specify
+         additional include paths.
+
+         Thanks to Brian Rhodefer for adding this.
+
+         Added option to omit address extension record in Intel HEX files.
+         Use '-h' to omit address extension record.
+
+        Released November 2000
+
+  1.14 - Added support for forward .org statements. Use '-f' to supress
+         warnings.
+
+         Thanks to Brian Rhodefer for suggesting this.
+
+        Not released
+
+  1.13 - Some overall clean up and german translations.
+
+         Added support for local labels. Use _ as the first charcter of a
+         label to give it local scope between two non-local labels.
+
+         Specify -x to enable local labels.
+
+         Changed range checking code to allow negative numbers in some cases.
+
+         Thanks to Kurt Stege for implementing local labels and cleaning up
+         the code.
+
+        Not released
+
+  1.12 - Added the 'spm' instruction (forgot the first time around)
+
+        Thanks to Jochen Pernsteiner for pointing this out.
+
+        Released December 1999
+
+  1.11 - Now the Alpha problem is fixed (I forgot to move  fix from test to
+         release source).
+
+        Fixed promlem with detecting supported instructions (Introduced in 
+         1.10) - Thanks to Mark V. Vaysman for reporting this.      
+
+        Removed carriage returns from source, so it will compile under
+         *NIX without problems. Thanks to Todd M. Squires for reporting this.
+
+        Released December 1999
+
+  1.10 - Added the new instructions: 'eijmp', 'eicall', 'espm', 'mulsu', 
+         'fmul', 'fmuls', 'fmulsu', 'muls', 'movw', 'elpm'. 
+
+         Changed behaviour of 'lpm' according to Atmel specs.
+
+        Added spanish translation - Thanks to Lluis Ballester for supplying
+        the Spanish translation.
+
+        Fixed .endm problem (it had to be lower case) - It was reported
+         on comp.arch.embedded by Ben Cantrick.
+
+        Released December 1999
+
+  1.09 - Fixed problem with BRBC/BRBS (they did not work). I used the status 
+        bit number for both source and destination operand (word of advise -
+        don't use variable names like 'values' and 'valued' in the same 
+        context :)
+
+        Fixed problem when compiling on Alpha's
+
+        Thanks to Todd M. Squires for reporting these (and supplying a patch
+        for the Alpha problem).
+
+        Released December 1999
+
+
+  1.08 - Fixed problem with SBR (Set Bits in Register). This is the same
+        as ORI, but the SBR version had a bug (one of those that generates
+         faulty code), bit 0 was always set. 
+
+        Thanks to Dean Huxley for reporting this (and supplying a patch).
+
+         Added support for AT90S4433 (similar to 4414/4434).</li>
+
+        Released July 1999
+
+
+  1.07 - Added support for using PC as program counter (i.e. rjmp PC+4),
+        EC as eeprom counter and DC as data counter.
+
+        Thanks to Adam Dybkowski for suggesting this.
+
+        Released May 1999
+
+
+  1.06 - Added support for wrapping branches and relative call/jumps
+        Use the '-a' switch to enable this feature.
+
+        Thanks to Jochen Pernsteiner for suggesting this.
+
+        Restored the generic hex format. The generic hex format
+        disappeared in version 1.03 (when the default file format was
+        changed to Intel Hex). Use the '-g' switch to generate
+        generic hex (files that looks like this: "000021:f7f0").
+
+        Released May 1999
+
+
+  1.05 - Fixed problem with detection of binary numbers like '0b010101'.
+         This was bug was introduced by the new hex detection feature in
+         V. 1.04 :( 
+
+        Thanks to Randy Ott for reporting this.
+
+         Fixed problem with memset of context stack that caused the winDOS
+         version to crash on some systems (strange that Linux/NT did not
+        detect this obvious memory violation).
+
+         Thanks to Steve Maddigan for reporting this, and to my friend
+        Henning for finding the bug.
+
+        Released May 1999
+
+
+  1.04 - Fixed problem with tabs after include filename, thanks to
+         Andreas Bogk for reporting this. 
+
+        Added support for specifying hex values like 1AB without '$' or '0x'
+        thanks to Andreas Bogk for suggesting this.
+
+         Changed distribution format, so source i now located in a
+        sub-directory.
+
+        Released April 1999
+
+
+  1.03 - Modified to support Intel hex as the default.
+
+        Now automatically determines the output file name.
+
+         Exits with a count of the number of errors (for make).
+
+         Thanks to Jim Dowling for supplying these patches.
+
+        Released March 1999
+
+
+  1.02 - Added support for German - Thanks to Uwe Bonnes for supplying
+        the German translation.
+
+        Released February 1999
+
+
+  1.01 - Fixed alignment problem with forward references to .db in CSEG
+         ,thanks to Rob Penny for reporting this. 
+
+        Added a -d option to list supported devices.
+
+        Updated the device information.
+
+        Released January 1999
+
+
+  1.00 - Initial release September 1998 
+
+
+  TODO - None of these are critical, but would be nice :-)
+ =============================================================================
+
+  - Write some documentation !!!
+
+  - Change source to new {} style (they finally convinced me :-)
+
+  - Change handling of code/ROM buffers.
+
+  - Make more language versions (French/Italian) (find someone to help me)
+
+  - 0m01010101  Set mask
+
+  - .def PowerStatus = Autoreg high = reset, monitor
+
+  - opcode aliases med SBCI / SUBI =  255-ADCI/ADBI
+
+  - Sinw / Cosw / Sinb / Cosb
+
+  - define macros
+
+ =============================================================================
+
+  Copenhagen, March 2003
+  Tom Mortensen
+
+  E-mail : tom@tavrasm.org
+  WWW    : http://www.tavrasm.org
+
+ =============================================================================
diff --git a/src/mkutil/tavrasm.118/gpl.txt b/src/mkutil/tavrasm.118/gpl.txt
new file mode 100644 (file)
index 0000000..3cd9561
--- /dev/null
@@ -0,0 +1,285 @@
+GNU GENERAL PUBLIC LICENSE
+
+Version 2, June 1991 
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.  59 Temple
+Place - Suite 330, Boston, MA 02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom
+to share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on,
+we want its recipients to know that what they have is not the
+original, so that any problems introduced by others will not reflect
+on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at
+all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a
+notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the Program
+(independent of having been made by running the Program).  Whether
+that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source
+code as you receive it, in any medium, provided that you conspicuously
+and appropriately publish on each copy an appropriate copyright notice
+and disclaimer of warranty; keep intact all the notices that refer to
+this License and to the absence of any warranty; and give any other
+recipients of the Program a copy of this License along with the
+Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a
+fee.
+
+2. You may modify your copy or copies of the Program or any portion of
+it, thus forming a work based on the Program, and copy and distribute
+such modifications or work under the terms of Section 1 above,
+provided that you also meet all of these conditions:
+
+       a) You must cause the modified files to carry prominent notices
+       stating that you changed the files and the date of any change.
+
+       b) You must cause any work that you distribute or publish, that
+       in whole or in part contains or is derived from the Program or
+       any part thereof, to be licensed as a whole at no charge to all
+       third parties under the terms of this License.
+
+       c) If the modified program normally reads commands
+       interactively when run, you must cause it, when started running
+       for such interactive use in the most ordinary way, to print or
+       display an announcement including an appropriate copyright
+       notice and a notice that there is no warranty (or else, saying
+       that you provide a warranty) and that users may redistribute
+       the program under these conditions, and telling the user how to
+       view a copy of this License. (Exception: if the Program itself
+       is interactive but does not normally print such an
+       announcement, your work based on the Program is not required to
+       print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+       a) Accompany it with the complete corresponding
+       machine-readable source code, which must be distributed under
+       the terms of Sections 1 and 2 above on a medium customarily
+       used for software interchange; or,
+
+       b) Accompany it with a written offer, valid for at least three
+       years, to give any third party, for a charge no more than your
+       cost of physically performing source distribution, a complete
+       machine-readable copy of the corresponding source code, to be
+       distributed under the terms of Sections 1 and 2 above on a
+       medium customarily used for software interchange; or,
+
+       c) Accompany it with the information you received as to the
+       offer to distribute corresponding source code. (This
+       alternative is allowed only for noncommercial distribution and
+       only if you received the program in object code or executable
+       form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt otherwise
+to copy, modify, sublicense or distribute the Program is void, and
+will automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted
+herein. You are not responsible for enforcing compliance by third
+parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new
+versions of the General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Program does not specify a
+version number of this License, you may choose any version ever
+published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the
+author to ask for permission. For software which is copyrighted by the
+Free Software Foundation, write to the Free Software Foundation; we
+sometimes make exceptions for this. Our decision will be guided by the
+two goals of preserving the free status of all derivatives of our free
+software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
+AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
diff --git a/src/mkutil/tavrasm.118/src/8535def.inc b/src/mkutil/tavrasm.118/src/8535def.inc
new file mode 100644 (file)
index 0000000..56dbae5
--- /dev/null
@@ -0,0 +1,366 @@
+;***************************************************************************\r
+;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y\r
+;* \r
+;* Number              :AVR000\r
+;* File Name           :"8535def.inc"\r
+;* Title               :Register/Bit Definitions for the AT90S8535\r
+;* Date                 :98.05.22\r
+;* Version              :1.22\r
+;* Support telephone   :+47 72 88 43 88 (ATMEL Norway)\r
+;* Support fax         :+47 72 88 43 99 (ATMEL Norway)\r
+;* Support E-mail      :avr@atmel.com\r
+;* Target MCU          :AT90S8535\r
+;*\r
+;* DESCRIPTION\r
+;* When including this file in the assembly program file, all I/O register     \r
+;* names and I/O register bit names appearing in the data book can be used.\r
+;* In addition, the six registers forming the three data pointers X, Y and\r
+;* Z have been assigned names XL - ZH. Highest RAM address for Internal \r
+;* SRAM is also defined \r
+;*\r
+;* The Register names are represented by their hexadecimal address.\r
+;* \r
+;* The Register Bit names are represented by their bit number (0-7).\r
+;* \r
+;* Please observe the difference in using the bit names with instructions\r
+;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" \r
+;* (skip if bit in register set/cleared). The following example illustrates\r
+;* this:\r
+;* \r
+;* in  r16,PORTB               ;read PORTB latch\r
+;* sbr r16,(1<<PB6)+(1<<PB5)   ;set PB6 and PB5 (use masks, not bit#)\r
+;* out  PORTB,r16              ;output to PORTB\r
+;*\r
+;* in  r16,TIFR                ;read the Timer Interrupt Flag Register\r
+;* sbrc        r16,TOV0                ;test the overflow flag (use bit#)\r
+;* rjmp        TOV0_is_set             ;jump if set\r
+;* ...                         ;otherwise do something else\r
+;***************************************************************************\r
+\r
+;***** Specify Device\r
+.device AT90S8535\r
+\r
+;***** I/O Register Definitions\r
+.equ   SREG    =$3f\r
+.equ   SPH     =$3e\r
+.equ   SPL     =$3d\r
+.equ   GIMSK   =$3b\r
+.equ   GIFR    =$3a\r
+.equ   TIMSK   =$39\r
+.equ   TIFR    =$38\r
+\r
+.equ   MCUCR   =$35\r
+.equ   MCUSR   =$34\r
+\r
+.equ   TCCR0   =$33\r
+.equ   TCNT0   =$32\r
+\r
+.equ   TCCR1A  =$2f\r
+.equ   TCCR1B  =$2e\r
+.equ   TCNT1H  =$2d\r
+.equ   TCNT1L  =$2c\r
+.equ   OCR1AH  =$2b\r
+.equ   OCR1AL  =$2a\r
+.equ   OCR1BH  =$29\r
+.equ   OCR1BL  =$28\r
+.equ   ICR1H   =$27\r
+.equ   ICR1L   =$26\r
+\r
+.equ   TCCR2   =$25\r
+.equ   TCNT2   =$24\r
+.equ   OCR2    =$23\r
+.equ   ASSR    =$22\r
+\r
+.equ   WDTCR   =$21\r
+.equ   EEARH   =$1f\r
+.equ   EEARL   =$1e\r
+.equ   EEDR    =$1d\r
+.equ   EECR    =$1c\r
+.equ   PORTA   =$1b\r
+.equ   DDRA    =$1a\r
+.equ   PINA    =$19\r
+.equ   PORTB   =$18\r
+.equ   DDRB    =$17\r
+.equ   PINB    =$16\r
+.equ   PORTC   =$15\r
+.equ   DDRC    =$14\r
+.equ   PINC    =$13\r
+.equ   PORTD   =$12\r
+.equ   DDRD    =$11\r
+.equ   PIND    =$10\r
+.equ   SPDR    =$0f\r
+.equ   SPSR    =$0e\r
+.equ   SPCR    =$0d\r
+.equ   UDR     =$0c\r
+.equ   USR     =$0b\r
+.equ   UCR     =$0a\r
+.equ   UBRR    =$09\r
+.equ   ACSR    =$08\r
+.equ    ADMUX   =$07\r
+.equ    ADCSR   =$06\r
+.equ    ADCH    =$05\r
+.equ    ADCL    =$04\r
+\r
+\r
+;***** Bit Definitions\r
+\r
+.equ   EXTRF   =1\r
+.equ   PORF    =0\r
+\r
+.equ   INT1    =7\r
+.equ   INT0    =6\r
+\r
+.equ   INTF1   =7\r
+.equ   INTF0   =6\r
+\r
+.equ   OCIE2   =7\r
+.equ   TOIE2   =6\r
+.equ   TICIE1  =5\r
+.equ   OCIE1A  =4\r
+.equ   OCIE1B  =3\r
+.equ   TOIE1   =2\r
+.equ   TOIE0   =0\r
+\r
+.equ   OCF2    =7\r
+.equ   TOV2    =6\r
+.equ   ICF1    =5\r
+.equ   OCF1A   =4\r
+.equ   OCF1B   =3\r
+.equ   TOV1    =2\r
+.equ   TOV0    =0\r
+\r
+.equ   SE      =6\r
+.equ   SM1     =5\r
+.equ   SM0     =4\r
+.equ   ISC11   =3\r
+.equ   ISC10   =2\r
+.equ   ISC01   =1\r
+.equ   ISC00   =0\r
+\r
+.equ   CS02    =2\r
+.equ   CS01    =1\r
+.equ   CS00    =0\r
+\r
+.equ   COM1A1  =7\r
+.equ   COM1A0  =6\r
+.equ   COM1B1  =5\r
+.equ   COM1B0  =4\r
+.equ   PWM11   =1\r
+.equ   PWM10   =0\r
+\r
+.equ   ICNC1   =7\r
+.equ   ICES1   =6\r
+.equ   CTC1    =3\r
+.equ   CS12    =2\r
+.equ   CS11    =1\r
+.equ   CS10    =0\r
+\r
+.equ   PWM2    =6\r
+.equ   COM21   =5\r
+.equ   COM20   =4\r
+.equ   CTC2    =3\r
+.equ   CS22    =2\r
+.equ   CS21    =1\r
+.equ   CS20    =0\r
+\r
+.equ   AS2     =3\r
+.equ   TCN2UB  =2\r
+.equ   OCR2UB  =1\r
+.equ   TCR2UB  =0\r
+\r
+.equ   WDDE    =4\r
+.equ   WDE     =3\r
+.equ   WDP2    =2\r
+.equ   WDP1    =1\r
+.equ   WDP0    =0\r
+\r
+.equ   EERIE   =3\r
+.equ   EEMWE   =2\r
+.equ   EEWE    =1\r
+.equ   EERE    =0\r
+\r
+.equ   PA7     =7\r
+.equ   PA6     =6\r
+.equ   PA5     =5\r
+.equ   PA4     =4\r
+.equ   PA3     =3\r
+.equ   PA2     =2\r
+.equ   PA1     =1\r
+.equ   PA0     =0\r
+\r
+.equ   DDA7    =7\r
+.equ   DDA6    =6\r
+.equ   DDA5    =5\r
+.equ   DDA4    =4\r
+.equ   DDA3    =3\r
+.equ   DDA2    =2\r
+.equ   DDA1    =1\r
+.equ   DDA0    =0\r
+\r
+.equ   PINA7   =7\r
+.equ   PINA6   =6\r
+.equ   PINA5   =5\r
+.equ   PINA4   =4\r
+.equ   PINA3   =3\r
+.equ   PINA2   =2\r
+.equ   PINA1   =1\r
+.equ   PINA0   =0\r
+\r
+.equ   PB7     =7\r
+.equ   PB6     =6\r
+.equ   PB5     =5\r
+.equ   PB4     =4\r
+.equ   PB3     =3\r
+.equ   PB2     =2\r
+.equ   PB1     =1\r
+.equ   PB0     =0\r
+\r
+.equ   DDB7    =7\r
+.equ   DDB6    =6\r
+.equ   DDB5    =5\r
+.equ   DDB4    =4\r
+.equ   DDB3    =3\r
+.equ   DDB2    =2\r
+.equ   DDB1    =1\r
+.equ   DDB0    =0\r
+\r
+.equ   PINB7   =7\r
+.equ   PINB6   =6\r
+.equ   PINB5   =5\r
+.equ   PINB4   =4\r
+.equ   PINB3   =3\r
+.equ   PINB2   =2\r
+.equ   PINB1   =1\r
+.equ   PINB0   =0\r
+\r
+.equ   PC7     =7\r
+.equ   PC6     =6\r
+.equ   PC5     =5\r
+.equ   PC4     =4\r
+.equ   PC3     =3\r
+.equ   PC2     =2\r
+.equ   PC1     =1\r
+.equ   PC0     =0\r
+\r
+.equ   DDC7    =7\r
+.equ   DDC6    =6\r
+.equ   DDC5    =5\r
+.equ   DDC4    =4\r
+.equ   DDC3    =3\r
+.equ   DDC2    =2\r
+.equ   DDC1    =1\r
+.equ   DDC0    =0\r
+\r
+.equ   PINC7   =7\r
+.equ   PINC6   =6\r
+.equ   PINC5   =5\r
+.equ   PINC4   =4\r
+.equ   PINC3   =3\r
+.equ   PINC2   =2\r
+.equ   PINC1   =1\r
+.equ   PINC0   =0\r
+\r
+.equ   PD7     =7\r
+.equ   PD6     =6\r
+.equ   PD5     =5\r
+.equ   PD4     =4\r
+.equ   PD3     =3\r
+.equ   PD2     =2\r
+.equ   PD1     =1\r
+.equ   PD0     =0\r
+\r
+.equ   DDD7    =7\r
+.equ   DDD6    =6\r
+.equ   DDD5    =5\r
+.equ   DDD4    =4\r
+.equ   DDD3    =3\r
+.equ   DDD2    =2\r
+.equ   DDD1    =1\r
+.equ   DDD0    =0\r
+\r
+.equ   PIND7   =7\r
+.equ   PIND6   =6\r
+.equ   PIND5   =5\r
+.equ   PIND4   =4\r
+.equ   PIND3   =3\r
+.equ   PIND2   =2\r
+.equ   PIND1   =1\r
+.equ   PIND0   =0\r
+\r
+.equ   SPIE    =7\r
+.equ   SPE     =6\r
+.equ   DORD    =5\r
+.equ   MSTR    =4\r
+.equ   CPOL    =3\r
+.equ   CPHA    =2\r
+.equ   SPR1    =1\r
+.equ   SPR0    =0\r
+\r
+.equ   SPIF    =7\r
+.equ   WCOL    =6\r
+\r
+.equ   RXC     =7\r
+.equ   TXC     =6\r
+.equ   UDRE    =5\r
+.equ   FE      =4\r
+; removed for AVRA / TAVRASM:\r
+;.equ  OR      =3\r
+\r
+.equ   RXCIE   =7\r
+.equ   TXCIE   =6\r
+.equ   UDRIE   =5\r
+.equ   RXEN    =4\r
+.equ   TXEN    =3\r
+.equ   CHR9    =2\r
+.equ   RXB8    =1\r
+.equ   TXB8    =0\r
+\r
+.equ   ACD     =7\r
+.equ   ACO     =5\r
+.equ   ACI     =4\r
+.equ   ACIE    =3\r
+.equ   ACIC    =2\r
+.equ   ACIS1   =1\r
+.equ   ACIS0   =0\r
+\r
+.equ   MUX2    =2\r
+.equ   MUX1    =1\r
+.equ   MUX0    =0\r
+\r
+.equ   ADEN    =7\r
+.equ   ADSC    =6\r
+.equ   ADFR    =5\r
+.equ   ADIF    =4\r
+.equ   ADIE    =3\r
+.equ   ADPS2   =2\r
+.equ   ADPS1   =1\r
+.equ   ADPS0   =0\r
+\r
+.def   XL      =r26\r
+.def   XH      =r27\r
+.def   YL      =r28\r
+.def   YH      =r29\r
+.def   ZL      =r30\r
+.def   ZH      =r31\r
+\r
+.equ   RAMEND  =$25F   ;Last On-Chip SRAM location\r
+.equ   XRAMEND =$25F\r
+.equ   E2END   =$1FF\r
+.equ   FLASHEND=$FFF\r
+\r
+.equ   INT0addr=$001   ;External Interrupt0 Vector Address\r
+.equ   INT1addr=$002   ;External Interrupt1 Vector Address\r
+.equ   OC2addr =$003   ;Timer2 compare match Vector Address\r
+.equ   OVF2addr=$004   ;Timer2 overflow Vector Address\r
+.equ   ICP1addr=$005   ;Timer1 Input Capture Vector Address\r
+.equ   OC1Aaddr=$006   ;Timer1 Output Compare A Interrupt Vector Address\r
+.equ   OC1Baddr=$007   ;Timer1 Output Compare B Interrupt Vector Address\r
+.equ   OVF1addr=$008   ;Overflow1 Interrupt Vector Address\r
+.equ   OVF0addr=$009   ;Overflow0 Interrupt Vector Address\r
+.equ   SPIaddr =$00A   ;SPI Interrupt Vector Address\r
+.equ   URXCaddr=$00B   ;UART Receive Complete Interrupt Vector Address\r
+.equ   UDREaddr=$00C   ;UART Data Register Empty Interrupt Vector Address\r
+.equ   UTXCaddr=$00D   ;UART Transmit Complete Interrupt Vector Address\r
+.equ   ADCCaddr=$00E   ;ADC Conversion Complete Interrupt Vector Address\r
+.equ   ERDYaddr=$00F   ;EEPROM Write Complete Interrupt Vector Address\r
+.equ   ACIaddr =$010   ;Analog Comparator Interrupt Vector Address
\ No newline at end of file
diff --git a/src/mkutil/tavrasm.118/src/TSV4.HEX b/src/mkutil/tavrasm.118/src/TSV4.HEX
new file mode 100644 (file)
index 0000000..3037f00
--- /dev/null
@@ -0,0 +1,464 @@
+:020000020000FC\r
+:100000000DC0FCC5FCC51895FBC51895189518952D\r
+:10001000F8C5F8C51895E3C6CDC624C702E00EBFE3\r
+:100020000FE50DBF10E818B9A8951FE011BD00E05D\r
+:1000300000935F01009360010093610100936201EE\r
+:10004000009363010093640101E000936501009354\r
+:10005000660104E10093670108E002BD03E005BD0D\r
+:1000600000E409BF00E00BBF08EB01BB02BB0FE1DE\r
+:1000700007BB0FEF0ABB04BB00270BBB03E008BBA9\r
+:1000800000E105BBC29AC2980093190100E2B02EAC\r
+:1000900017E119B910E91AB944245524222433244C\r
+:1000A000EE246624CC2458E15BBBC49AC4985093D8\r
+:1000B000170155275093180150933B0150936A0143\r
+:1000C00050936B0150931001DD24D0921401D09213\r
+:1000D0001501D092160154EF509369015BBB50910A\r
+:1000E000190155BBA89AC29AC298A898C29AC298F8\r
+:1000F0007894E0EFF8E1A2EEB0E0DBE1D0931A01F2\r
+:1001000008D1D0E8C0ECDBBBC39AC398D0931801E8\r
+:10011000C5BBC89500240BBAC198C0980000C09A0E\r
+:10012000C19AAA9541F03196C3951C2F1F7381F790\r
+:10013000C054D395E8CF10E3D0D2CF93DF93DBD276\r
+:10014000BF91AF9156D5212F1D2F12952AD312178B\r
+:10015000B1F411964ED5212F1D2F23D3121779F408\r
+:10016000119647D5212F1C2F12951BD3121739F446\r
+:1001700011963FD5212F1C2F14D3121709F1E2ED50\r
+:10018000F9E1AAE2B2E0D9E1D0931A01C2D0D0E0FD\r
+:10019000C0E4DBBBC39AC398D0931801C5BBC89514\r
+:1001A0000BBAC198C0980000C09AC19A119741F04B\r
+:1001B0003196C3951C2F1F7389F7C054D395E9CF8F\r
+:1001C00020E12093030120E42093040129E12093FE\r
+:1001D0000501C0E0D0E218E10FD520E82F93CF93BE\r
+:1001E000DF9320E208D5269622E005D5DF91CF9156\r
+:1001F0002F91C05CDF4F2A9589F7AAD610E01093A3\r
+:10020000110116E31093100110E01093680110E043\r
+:1002100010934C0110934D011EEF10930D011CEA39\r
+:1002200010930C0124E017D21C7F10930E0125E0DF\r
+:1002300012D210930F0110910E0120910F011A3369\r
+:100240000DEF200720F01C3B0DEF200730F01DEFD5\r
+:1002500010930F0110E810930E011FEF19BD18E362\r
+:1002600018BD1CEF1DBD1EEC1CBD10E51FBD11E02F\r
+:100270001EBD00E003BF05E008BF05E409BF0AE0BA\r
+:1002800005BF00EC0ABF0BBF95C202E00EBF0FE531\r
+:100290000DBF50E05FBD5EBD949A959850911701D7\r
+:1002A0005F7B5BBBC49AC4985093170154E7B6FEBA\r
+:1002B00054E3509369015BBB5091190155BBA89A57\r
+:1002C000C29AC298A898C29AC29851E459BF50E005\r
+:1002D00053BF5BBF04E000936A0117E119B910E94D\r
+:1002E0001AB94424552422243324EE246624CC2431\r
+:1002F000F89403B700230AE411F4809B0AE705BFD2\r
+:1003000078948895A89500916A01002389F7F8945C\r
+:10031000A3CED0911A01C0911701C07EDC2BDBBBAC\r
+:10032000C49AC498D0931701089578941FEDE122E0\r
+:1003300010E01EBB1FBBD9D21B3159F1B3FC0DC05D\r
+:10034000103258F4183009F4FEC01D3009F413C1FE\r
+:100350001A3009F4B7C0173041F7B2FC18C0103397\r
+:10036000B1F4C0910301D091040120910501CC5F4B\r
+:10037000DD4FF894309117013227307E32273BBB96\r
+:10038000C49AC49878943093170189D5102DE3D27C\r
+:10039000CCCFABD21B3109F31E3209F473C11F322B\r
+:1003A00009F449C01F3309F488C1123409F455C057\r
+:1003B000123609F456C0133409F402C1143409F496\r
+:1003C000ECC0153409F4D9C0163409F409C1173446\r
+:1003D00009F49EC0183609F440C61B3409F496C0CF\r
+:1003E0001C3409F40AC41D3409F42EC01E3409F467\r
+:1003F00003C1103509F49AC0123509F4E3C013356E\r
+:1004000009F4D9C0143509F440C0153509F46BC29C\r
+:10041000163519F410E2E12AFBC0173509F463C25E\r
+:10042000183509F4C4C11A3509F4EEC1103310F0BF\r
+:100430001A3310F17ACF59D210FF03C014E0B12A59\r
+:1004400074CF1BEFB12271CF50D2103329F4F8943E\r
+:1004500000E4B02A8A9A19CF68CF47D21F9310E0E0\r
+:1004600004C043D21F9341D21F70109311011F91FA\r
+:10047000109310015ACF39D230D1C0E1C09303019B\r
+:10048000D09304012093050150CF10E015BD1093C7\r
+:100490005F01109360011093610127D210936401F2\r
+:1004A00024D21093630121D2109362011ED21093C3\r
+:1004B00066011BD21093650118D21093670113E0F7\r
+:1004C00015BD33CF01D031CF0F92C0910301D09130\r
+:1004D000040120910501DE5FC395F8943091170166\r
+:1004E0003227307E32273BBBC49AC498789430932D\r
+:1004F0001701D5D4182F100D100D1A95103818F0BB\r
+:10050000C0D00F900895800D0F90089521D50DCF84\r
+:10051000ECD1103309F404C0113309F404C005CF41\r
+:1005200007EFB02202CF08E0B02AFFCEDED11033B1\r
+:1005300009F403C0113309F403C00FEEB022F5CE65\r
+:1005400000E1B02AF2CEC0910301D09104012091C4\r
+:100550000501DE5FF894309117013227307E322793\r
+:100560003BBBC49AC49878943093170198D47019FF\r
+:100570001FB712FFDACE7727D8CEB7D111FD07C04B\r
+:1005800010FD03C00FEDB022D0CE00E2B02A00274C\r
+:1005900000933B01EAD2F1F7C8CEA7D1103309F49A\r
+:1005A00004C0113309F404C0C0CE0EEFB022BDCE9A\r
+:1005B00001E0B02ABACE99D1712F97D1812FB5CE53\r
+:1005C00002E0B02A70935201809353018ED11093B0\r
+:1005D00054018BD11093550116D30DEFB022A5CE47\r
+:1005E000709356018093570180D1109358017DD1AB\r
+:1005F000109359015DD399CE7093560180935701A2\r
+:1006000074D11093580171D11093590176D38DCEC6\r
+:100610006CD110FF0BC010910E0120910F011C5FD7\r
+:100620002F4F1C3B0DEF2007A8F40AC010910E01BC\r
+:1006300020910F01145020401A330DEF200750F085\r
+:1006400010930E0120930F0124E00DD010910F01A3\r
+:1006500025E009D06ACEE199FECF2EBB22272FBB21\r
+:10066000E09A1DB30895E199FECFE5FEFFCF2EBBC2\r
+:1006700022272FBB1DBBF894E5FEFFCFE29AE19A3B\r
+:10068000189536C732D129D030D1A12F2ED1B12F14\r
+:100690002CD1F894309117013227307E32273BBBA2\r
+:1006A000C49AC498789430931701A4D221961197D4\r
+:1006B0001A2F1B2B09F0ECCF38CE17D10ED01F9379\r
+:1006C0001AD01BE133D11FE331D11F91105D2ED120\r
+:1006D0001D2F60D01C2F5ED028CEC0E0D0E024E6D5\r
+:1006E0001F701A3008F4210F2695D7952695D795B7\r
+:1006F000D695D6950895A6E1B2E0AC0FBD1FF8944B\r
+:10070000309117013227307E32273BBBC49AC49800\r
+:100710007894309317016DD2E12F11966AD2F12FA0\r
+:10072000AC2FBD2F1496CFEFDFEF3197FF703497CA\r
+:1007300080F131965ED2119601E220E1D127CC0FF3\r
+:10074000DD1F10F4C027D227CC0FDD1F10F4C02707\r
+:10075000D227CC0FDD1F10F4C027D227CC0FDD1F0E\r
+:1007600010F4C027D227CC0FDD1F10F4C027D227EA\r
+:10077000CC0FDD1F10F4C027D227CC0FDD1F10F4E3\r
+:10078000C027D227CC0FDD1F10F4C027D227319706\r
+:1007900089F608951F93129504D0C8D01F9101D0F7\r
+:1007A000C5C01F7010631A3308F0195F08959DD0FB\r
+:1007B00010FD13C070936C0180936D01B0926E01B7\r
+:1007C0001091030110936F011091040110937001B7\r
+:1007D0001091050110937101A8CD70916C01809169\r
+:1007E0006D0110ECB12210916E011F73B12A1091AE\r
+:1007F0006F01109303011091700110930401109187\r
+:1008000071011093050191CD70D010935A016DD0F4\r
+:10081000C12F175F5DD020935B0167D0D12F1C5F84\r
+:100820005CD020935C0161D01C0F1F5051D02093ED\r
+:100830005D015BD01D0F115150D020935E01D0910E\r
+:100840005C0110915E011D1B08F441C0C0915B0169\r
+:100850001C2F1D0F2D2F220F220F220F120F220FE0\r
+:10086000120FA0E0B0EE20E0A10FB21F2BE1F89430\r
+:10087000309117013227307E32273BBBC49AC4988F\r
+:1008800078943093170110915D011C1BF0F03A2F02\r
+:100890003F7335BB3B2F330F330FA7FB31F9A6FB5B\r
+:1008A00030F93BBBF894C39AC398789430931801FD\r
+:1008B00010915A011BBBF894C198C0980000C09ACF\r
+:1008C0007894C19A1196C395DECFD395BACF2DCD2A\r
+:1008D0002FEF23951A50E8F708952FEF23951D5019\r
+:1008E000E8F7089502D001D020CD10EC10936B01F1\r
+:1008F000A89510E01EBB1FBB10EC809910936B01F4\r
+:10090000B5FC33D13320A1F310E010936B01CF93EA\r
+:10091000DF93C22DC058DD271881F8943A942394B0\r
+:10092000CFE72C227894DF91CF9108951F93A8955B\r
+:10093000152D1032E0F71F91CF93DF93DFB7F894B6\r
+:10094000C52DC40DDFBFCF71C05ADD271883539466\r
+:10095000DF91CF910895D2D0EFD0002700931201FC\r
+:10096000B4FC0FC0C0910301D0910401DE5FF02CF4\r
+:1009700096D20F920F1808F40024069400921201E8\r
+:100980000F90B3FC08C0072F000D28F477279CDDDB\r
+:1009900010910501B9D600911201070F00934E0185\r
+:1009A00080934F01700D60914E0190904F0186FE33\r
+:1009B00007C0C0915001D0915101229770D2900C84\r
+:1009C00087FE07C0C0915001D0915101239767D293\r
+:1009D000600D59D260930201A0920001C0915001B4\r
+:1009E000D091510121965BD2702C0FEF0ABBC09AB7\r
+:1009F0000FE18022809201010027801201C07DC09A\r
+:100A0000AA27B92DB695A795B695A795B05E07C04C\r
+:100A10009394A05CBF4F80900101A0900001AA2A8E\r
+:100A200022272196109105016FD639D211276091A6\r
+:100A30000201662339F08894079417956A95E1F7C7\r
+:100A4000022A212F08E1F894309117013027307ED7\r
+:100A500030273BBBC49AC4987894309317013A2D41\r
+:100A60003F7335BB3B2F330F330FA7FA31F9A6FA8B\r
+:100A700030F93BBBF894C39AC3987894309318012B\r
+:100A800000270ABBF894C0980000C19809B300265B\r
+:100A9000B0FC002A0FEF0ABB0BBA0000C09A789492\r
+:100AA000C19AA3948A9409F0BCCF222311F13A2D64\r
+:100AB0003F7335BB3B2F330F330FA7FA31F9A6FA3B\r
+:100AC00030F93BBBF894C39AC398789430931801DB\r
+:100AD00000270ABBF894C0980000C19809B32027EA\r
+:100AE000B0FC202B0FEF0ABB2BBB0000C09A789400\r
+:100AF000C19A31D07A9409F08BCF0895C12FDD27A8\r
+:100B0000CC0FDD1F10910301C10F10910401D11F03\r
+:100B100010910501F9D5C3D12196F02CC0D1CF2D6C\r
+:100B2000D02D10910301C10F10910401D11FC0936A\r
+:100B30005001D09351010895C0915001D0915101BD\r
+:100B4000AED1802C219785FCAAC1C0910301D09120\r
+:100B50000401DE5FA4C1CF93DF93192D39D0188132\r
+:100B6000122B1883DF91CF9108952F93CF93DF93AA\r
+:100B700010913B012DD01881122309F41FC0288148\r
+:100B80002127288310E010936B01AF93BF93CC27EC\r
+:100B9000D0913B01D695C795D695C795AC2FBD2F63\r
+:100BA000B05E18E1B1D520E26CD51297269622E00E\r
+:100BB00068D5BF91AF9110EC10936B0110913B0180\r
+:100BC00013951F7710933B01DF91CF912F910895DB\r
+:100BD000CCE3D1E01F77212F269526952695C20FCD\r
+:100BE00020E0D21F21E0177019F0220F1A95E9F7C3\r
+:100BF000089554C56FC54CC587C597C4DFC1DFC113\r
+:100C000090C5E6C1C7C2789490905301609152019B\r
+:100C10003AD160930201A092000170905501CC2757\r
+:100C2000D92DD695C795D695C795D05E18E16CD5C8\r
+:100C300007C0C05CDF4F939460910201A090000157\r
+:100C4000AC2A1FEF8090540100E0801641F008E0CC\r
+:100C50008016B8F0662319F016956A95E9F73BD12E\r
+:100C600008E010910201011B801AA3941FEF08E015\r
+:100C7000801638F0B1F02FD11FEF08E0801AA3944E\r
+:100C8000F6CF882079F016958A94E9F710956623B7\r
+:100C900041F02227169527956A95E1F71CD1A39478\r
+:100CA000122F19D158DF7A9400277012C2CF0895FD\r
+:100CB000009158010A950230D0F300915901033098\r
+:100CC000B0F3009156010395009352010091570132\r
+:100CD00000935301809058018A948A948092540121\r
+:100CE00001E0009355018FDF0091560100935201FE\r
+:100CF00080905801809254013AC0009158010A95A1\r
+:100D00000230A8F200915901033088F20091560197\r
+:100D10000395009352010091570100935301809075\r
+:100D200058018A948A948092540101E000935501FD\r
+:100D30006ADF00915601009352010091570103951B\r
+:100D400000935301709059017A947A9470925501EE\r
+:100D500001E00093540157DF809058010091560143\r
+:100D6000080D0A950093520101E00093540100918F\r
+:100D70005701039500935301709059017A947A9426\r
+:100D80007092550140DF0091560103950093520186\r
+:100D9000809058018A948A948092540170905901ED\r
+:100DA00000915701070D0A950093530101E000934C\r
+:100DB000550129CF1FB60F930FEDC02EEF93FF9370\r
+:100DC000E42DE05AFF270081FF91EF910CB95A946E\r
+:100DD00043940FE140226A940AF04CC051C01FB600\r
+:100DE0000F930FEDC02E0CB15C993EC0E7FC2CC0F8\r
+:100DF000E6FC0EC0023031F400E009B9539A00E479\r
+:100E0000E02A3EC00A3A19F400E000936A0138C0B3\r
+:100E1000602E00E803190AF40FE7662012F4052D8E\r
+:100E200000680CB9061508F4602E062D0F7739F00E\r
+:100E300000ECE02A6A9422F55798559A21C00FEBEE\r
+:100E4000E022569A5E9A1CC0EF93FF93E32DE20DC9\r
+:100E5000EF77E058FF270083FF91EF9133946A9476\r
+:100E60007AF40CC01FB60F93539807E109B90FEB42\r
+:100E7000E022CC2455985698579A0CB10FE7E022FF\r
+:100E80000F911FBE1895AA2400EFA01A67FFAA248D\r
+:100E90006F77685014F0A394FCCF685F08953C2FDF\r
+:100EA0003F7335BB3D2F330F330FC7FB31F9C6FB03\r
+:100EB00030F93BBBF894C39AC398789430931801E7\r
+:100EC00000270ABBF894C0980000C09A09B2789431\r
+:100ED0000FEF0ABB08953A2D3F7335BB3D2F330FFB\r
+:100EE000330FA7FA31F9A6FA30F93BBBF894C39A4D\r
+:100EF000C39878943093180100270ABBF894C098DF\r
+:100F00000000C09AF9B278940FEF0ABBB1FE03C09B\r
+:100F10001095F12203C0F126B0FCF12A3A2D3F735F\r
+:100F200035BB3D2F330F330FA7FA31F9A6FA30F94D\r
+:100F30003BBBF894C39AC398789430931801FBBADA\r
+:100F4000F894C198C0980000C09A7894C19A089506\r
+:100F5000772788279924C0E0D0E218E1D5D3AA24C6\r
+:100F6000A0920001109100011C2B312F3F7335BB63\r
+:100F70003D2F330F330F17FB31F916FB30F93BBB15\r
+:100F8000F894C39AC39878943093180100E00BBB8F\r
+:100F9000F894C198C0980000C09A7894C19AA3941C\r
+:100FA00000E2A01619F0A0920001DCCFD4DD9394EA\r
+:100FB000C05CDF4FD03409F0D2CF089518951FB62A\r
+:100FC0008B9A4CB55DB5509309014093080115C14A\r
+:100FD0001FB65AB35F935BB35F9355B35F93509162\r
+:100FE00018015F935FEF5ABB50E75FBD4CB55DB52D\r
+:100FF000485F5F4F5BBD4ABD59BD48BD40914C0144\r
+:10100000442349F450916B01539550936B0151F473\r
+:101010005FEBB5223AC900000000000000000000AC\r
+:10102000000000008B9A939A55275EBD5DBD5CBDA4\r
+:1010300050914D01542B91F0509117015BBBC49A14\r
+:10104000DD9ADD98C4980000000000000000000058\r
+:10105000000012C080CD49CC68C9D0C5509117019D\r
+:10106000506850625BBBC49A40E654275BBB5F7715\r
+:101070005BBBC49850931701509117015F93EF9396\r
+:10108000FF93E0914C01F0914D01E05CFF4FFF7147\r
+:101090003F933E2F3F7335BB3F2F330F330FE7FB9B\r
+:1010A00031F9E6FB30F93BBBC39AC398F0931801C2\r
+:1010B00030911701F7FB31F9F6FB30F93BBBC49ACD\r
+:1010C000C498309317013F91C198C19A97984427CB\r
+:1010D0004ABB40EC44BBC09855275BBD5ABD59E0A4\r
+:1010E0005EBDE0934C01F0934D01FF91EF915CE305\r
+:1010F0005A95F1F7C09A5FEF5ABB979A54BB8D98F7\r
+:10110000959851E000005EBD5BE05A95F1F7509173\r
+:101110000D0140910C018D9A859907C04A339DEFCE\r
+:10112000590752F0415050400BC0453D9FEF5907C1\r
+:101130001AF44F5F5F4F04C0000000000000000081\r
+:1011400050930D0140930C015BBD4ABD40910C01D1\r
+:1011500050910D0190910E01491B90910F01590B77\r
+:101160001AF445ED5FEF04C04CEA5EEF00000000AA\r
+:1011700059BD48BD52E053BF5DEE52BF51E05093A0\r
+:1011800068015DEF5DBD54E35CBD8B98939850EEB4\r
+:101190005FBD21C01FB65AB35F935BB35F9355B376\r
+:1011A0005F93509118015F93509117015F93FF93E4\r
+:1011B000EF930F925FEF5ABB509168015395509394\r
+:1011C00068015A95E1F05A9511F15A9509F489C0D0\r
+:1011D0000F90EF91FF915F915BBBC49AC4985093BD\r
+:1011E00017015F915BBBC39AC398509318015F913D\r
+:1011F00055BB5F915BBB5F915ABB1FBE189553E017\r
+:1012000053BF50EF52BF51E05093680153C150910A\r
+:101210001001552399F150911101505118F050933C\r
+:1012200011012CC0452F4295542350931101409138\r
+:10123000190143FF10C0509110015A9550931001AD\r
+:10124000A1F050911901577F546055BBC29AC298C2\r
+:101250005093190113C05091190158605B7F55BB21\r
+:10126000C29AC2985093190109C050911901577F31\r
+:101270005B7F55BBC29AC298509319015091690186\r
+:1012800057FF06C050E8B5261AF4552753BFA0CF24\r
+:1012900052E053BF52EF52BFE8E2F8E15527ED0D9F\r
+:1012A000F51FC89554E3D51648F4509119015F7E97\r
+:1012B00055BBC29AC2985093190108C050911901A8\r
+:1012C000506155BBC29AC298509319010BBA009055\r
+:1012D000190105BAA99AC29AC298A998C29AC29845\r
+:1012E00077CF50B340EE4BBB4091190145BBA99A53\r
+:1012F000C29AC298A998C29AC298889456FD08C00A\r
+:1013000050911301552319F054E0509313010894A0\r
+:101310004FB754E3D51660F44FBFE0911501F0913B\r
+:101320001601EE1FFF1FE0931501F09316017BC01D\r
+:101330004FBF08F078C050911301552321F054E0BD\r
+:101340005093130170C0F0911601E0911501509176\r
+:101350001401552329F0452FF795E7954450E1F7FF\r
+:101360005C5FF795E79518F05433D0F35CC0509369\r
+:10137000140144E3451BEAE2F8E15527E40FF51FA9\r
+:10138000C895402D000C000C000C400D000C400DC9\r
+:10139000EAE2F8E15527ED0DF51FC895400DE0E0B4\r
+:1013A000F0EE5527E40FF51F3F933E2F3F7335BBFB\r
+:1013B0003F2F330F330FE7FB31F9E6FB30F93BBB2F\r
+:1013C000C39AC398F093180130911701F7FB31F9D4\r
+:1013D000F6FB30F93BBBC49AC498309317013F9198\r
+:1013E0000F9300270ABBC0980000C09A09B20FEF04\r
+:1013F0000ABB0F91002029F450911401543398F442\r
+:101400005EC054E0509313010092070156E35093DD\r
+:101410001001552D5F3138F41F93102D8DDA1B31DB\r
+:1014200009F48ADA1F9154E0D50E5091690157FDF5\r
+:1014300027C053E053BF50EF52BF51E050936801B3\r
+:1014400044E3D416E8F250E053BF509116014091A6\r
+:101450001501452B50916A01543018F4513028F48D\r
+:10146000B7CE442329F055E003C0442309F454E0E7\r
+:101470005A9550936A01A1F75FEBB5228A98CACDBD\r
+:1014800050E053BF5093140148ECD416C0F0509173\r
+:101490001301552379F05A955093130159F4509143\r
+:1014A0000701552339F0552D503220F41F9310E0D9\r
+:1014B00043DA1F91DD24D0921501D0921601E8E2A3\r
+:1014C000F8E131965527ED0DF51FC895509169014A\r
+:1014D000507850645029509369015BBB50911901B9\r
+:1014E00055BBA89AC29AC298A898C29AC29870CEC0\r
+:1014F0009924C0E0D0E2A0E0B0E218E105D1A05C00\r
+:10150000BF4F0A94E1F720E22F93C8D0E3D0A39510\r
+:10151000C3952F912A9509F0F7CF1DDB9394A096E0\r
+:101520009096B03409F0EFCF1ACDDFD91F93DDD9F3\r
+:1015300010937201DAD916951695169509F410E2F2\r
+:1015400010937501D2D910937601172F1695169521\r
+:101550001695109373018093740118E1D5D01F91F3\r
+:1015600010FD46C0CC27D09174019D2ED695C7950D\r
+:10157000D695C79510917301C10FD05E2091760169\r
+:1015800010917201121720F5211BAA27B091740146\r
+:10159000B10FB695A795B695A79510917301A10FB8\r
+:1015A000B05E2F93AF93BF93CF93DF9320917501DC\r
+:1015B00068D0D1DADF91CF91BF91AF912F91939401\r
+:1015C000A05CBF4FC05CDF4F2A9559F72091720194\r
+:1015D0002F93CF93DF93209175015AD0BCDADF911E\r
+:1015E000CF912F919394C05CDF4F2A9589F734CD2A\r
+:1015F000CC27D091740100917601D00F9D2ED69505\r
+:10160000C795D695C79510917301C10FD05E202F55\r
+:1016100010917201121728F5211BAA27B0917401AD\r
+:10162000B00FB11BB695A795B695A795109173010C\r
+:10163000A10FB05E9A94A054B040C054D0402F93F4\r
+:10164000AF93BF93CF93DF93209175011AD083DAC4\r
+:10165000DF91CF91BF91AF912F912A9559F72091AA\r
+:1016600072019A94C054D0402F93CF93DF9320916E\r
+:1016700075010ED070DADF91CF912F912A9589F7FD\r
+:10168000EBCC0CD0119626D021962A95D1F708954F\r
+:1016900010E020D021962A95E1F708953A2F3F7364\r
+:1016A00035BB3B2F330F330FA7FB31F9A6FB30F9C6\r
+:1016B0003BBBF894C39AC3987894309318010027E1\r
+:1016C0000ABBF894C0980000C09A19B378940FEF41\r
+:1016D0000ABB08953C2F3F7335BB3D2F330F330FAB\r
+:1016E000C7FB31F9C6FB30F93BBBF894C39AC398EA\r
+:1016F0007894309318011BBBF894C198C0980000EF\r
+:10170000C09A7894C19A0895F894309117013127BE\r
+:10171000307E31273BBBC49AC4987894309317012C\r
+:1017200008951FB650915F015C5550935F01509131\r
+:1017300060015F4F5093600150916101564E5436E5\r
+:1017400050F4509361011FBEB6FE189550E05093BF\r
+:10175000680120CDF1C850E05093610150916201C1\r
+:1017600053955C33E8F15091630153955C33A8F1D4\r
+:10177000509164015395583168F1EF93FF930F92A4\r
+:10178000EBE1F8E190916601E90F90E0F91FC8954F\r
+:10179000902D9C3131F49091670193709CE109F494\r
+:1017A0009DE10F90FF91EF9150916501591770F0F5\r
+:1017B000509166015C3030F0509167015395509321\r
+:1017C00067015527539550936601552753955093BC\r
+:1017D00065015527509364015527509363015527A0\r
+:1017E00050936201552D5931C0F41F931BE1A4D8C9\r
+:1017F00014E5A2D810916401ADDF10916301AADF56\r
+:1018000010916201A7DF10916601A4DF10916501BC\r
+:10181000A1DF109167019EDF1F9195CF1F1C1F1E36\r
+:101820001F1E1F1F1E1F1E1FF0340000E834010082\r
+:10183000F0330100E8330200E4330300E832030030\r
+:10184000E4320400E2320500E4310500E231060032\r
+:10185000E1310700E2300700E1300800C12A000052\r
+:10186000C22A0100C12B0100C22B0200C42B0300BD\r
+:10187000C22C0300C42C0400C82C0500C4180500A9\r
+:10188000C8180600D0180700C8190700D0190800AA\r
+:10189000A1190900D01A0900A11A0A00A21A0B0006\r
+:1018A000A11B0B00A21B0C00A41B0D00A21C0D0011\r
+:1018B000A41C0E00A81C0F00A41D0F00A81D1000E2\r
+:1018C000B01D1100A81E1100B01E1200611E1300F1\r
+:1018D000B01F1300611F1400621F1500612815005E\r
+:1018E000622816006428170062291700642918006E\r
+:1018F00000000000000000000000000000000000E8\r
+:1019000000000000000008080800000000000000BF\r
+:1019100000000000000000000000000000000000C7\r
+:1019200000007E0031003200330034003500360004\r
+:1019300037003800390030002D003D000000000065\r
+:101940000000000000000000000000000000000097\r
+:10195000000000005100570045005200540059009B\r
+:10196000550049004F0050005B005D005C00000026\r
+:101970000000000000000000000000000000000067\r
+:1019800000000000000041005300440046004700F2\r
+:1019900048004A004B004C003B0027000D0D0D0095\r
+:1019A0000000000000000000000000000000000037\r
+:1019B000000000000000000000005A005800430032\r
+:1019C000560042004E004D002C002E002F0000005B\r
+:1019D000000032383234303331373033313632363A\r
+:1019E000313511021102110211021102110211020C\r
+:1019F000110211021102110211021102110211024F\r
+:101A0000110211021102110211021102110211023E\r
+:101A1000110211021102110211021102110211022E\r
+:101A20001102C00011021102110211021102110271\r
+:101A3000110211021102110211021102110211020E\r
+:101A40001102C100CA00D300DC00E500EE00F7007F\r
+:101A50000001090112011102110211021102110209\r
+:101A6000110211021B0124012D0136013F01480121\r
+:101A700051015A0164016D0176017F0188019101D4\r
+:101A80009A01A301AC01B501BE01C701D001D90182\r
+:101A9000E201EB01F401080211021102110211022C\r
+:101AA0001102000107708898A8C88870010720609B\r
+:101AB00020202020700107708808102040F80107BE\r
+:101AC000F8102010088870010710305090F810109E\r
+:101AD0000107F880F0080888700107304080F0881E\r
+:101AE00088700107F808102040404001077088887E\r
+:101AF0007088887001077088887808106001077006\r
+:101B0000888888F888880107F08888F08888F0013C\r
+:101B100007708880808088700107E09088888890AE\r
+:101B2000E00107F88080F08080F80107F88080F0FD\r
+:101B30008080800107708880B8888878010788884D\r
+:101B400088F88888880221078080808080808001D2\r
+:101B5000070808080808887001078890A0C0A090AE\r
+:101B6000880107808080808080F8010788D8A8A835\r
+:101B700088888801078888C8A8988888010770889D\r
+:101B800088888888700107F08888F0808080010745\r
+:101B900070888888A890680107F08888F0A09088ED\r
+:101BA0000107708880700888700107F820202020C5\r
+:101BB000202001078888888888887001078888889D\r
+:101BC000888850200107888888A8A8A8500107881D\r
+:101BD000885020508888010788888850202020025B\r
+:101BE0001102060801014F002A020107F80810201F\r
+:101BF0004080F80107F8F8F8F8F8F8F87093560103\r
+:101C00008093570128DA1093580125DA109359016F\r
+:101C100001D022CA7894909053016091520133D937\r
+:101C200060930201A092000170905501CC27D92D3C\r
+:101C300015E5D0FF1AEA012ED695C795D695C7951A\r
+:101C4000D05E18E161DD07C0C05CDF4F9394609106\r
+:101C50000201A0900001AC2A1FEF8090540100E027\r
+:101C6000801641F008E08016C8F0662319F016953A\r
+:101C70006A95E9F710212FD908E010910201011BA4\r
+:101C8000801AA3941FEF08E0801640F0C1F01021E5\r
+:101C900022D91FEF08E0801AA394F5CF882089F09D\r
+:101CA00016958A94E9F71095662349F02227169530\r
+:101CB00027956A95E1F710210ED9A394122F1021D0\r
+:0E1CC0000AD90094C7D97A9400277012BDCFBC\r
+:0220000002419B\r
+:00000001FF\r
diff --git a/src/mkutil/tavrasm.118/src/a_tavr.bat b/src/mkutil/tavrasm.118/src/a_tavr.bat
new file mode 100644 (file)
index 0000000..487564f
--- /dev/null
@@ -0,0 +1 @@
+tavrasm %1.asm -e %1.lst\r
diff --git a/src/mkutil/tavrasm.118/src/apits.inc b/src/mkutil/tavrasm.118/src/apits.inc
new file mode 100644 (file)
index 0000000..f2b7a4b
--- /dev/null
@@ -0,0 +1,296 @@
+; APITS.INC\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS FOREGROUND TASK\r
+\r
+.MACRO INT_HANDLERS\r
+       RJMP    RX_COMPLETE             ; UART RX COMPLETE HANDLER\r
+       RJMP    TX_EMPTY                ; UART DATA REGISTER EMPTY HANDLER\r
+       RJMP    TX_COMPLETE             ; UART TX COMPLETE HANDLER\r
+.ENDMACRO\r
+\r
+.MACRO INIT_API_BUS\r
+       LDI     A,API_RATE_SLOW         ; 4800 BPS\r
+       OUT     UBRR,A                  ; SET UART RATE\r
+\r
+       LDI     A,$90                   ; ENABLE RX WITH INTERRUPTS\r
+       OUT     UCR,A\r
+       ;SBI    UCR,TXEN                ; TX ENABLE\r
+\r
+       CLR     TX_PTR\r
+       CLR     TX_COUNT\r
+\r
+       CLR     RX_PTR\r
+       CLR     RX_COUNT\r
+\r
+       CLR     API_STATE\r
+       CLR     API_REMAIN\r
+       CLR     API_WATCHDOG\r
+.ENDMACRO\r
+\r
+.MACRO MRX_WAIT\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT\r
+.ENDMACRO\r
+\r
+.MACRO MRX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     YL,RX_PTR\r
+       SUBI    YL,-RX_BUF\r
+       CLR     YH\r
+       LD      A,Y\r
+\r
+       CLI\r
+       DEC     RX_COUNT\r
+       INC     RX_PTR\r
+       LDI     YL,RX_SIZE-1\r
+       AND     RX_PTR,YL\r
+       SEI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+; FALL INTO MTX_WAIT FOR LOOPBACK TEST\r
+.ENDMACRO\r
+\r
+.MACRO MTX_WAIT\r
+       PUSH    A\r
+TX_WAIT_LOOP:\r
+       WDR ; 10OCT02 ALTHOUGH IT USUALLY DOESN'T MATTER (HANDY FOR LOOPBACK)\r
+       MOV     A,TX_COUNT\r
+       CPI     A,TX_SIZE\r
+       BRSH    TX_WAIT_LOOP\r
+       POP     A\r
+.ENDMACRO\r
+\r
+.MACRO MTX_CHAR\r
+       PUSH    YL\r
+       PUSH    YH\r
+ IN YH,SREG\r
+       CLI\r
+       MOV     YL,TX_COUNT\r
+       ADD     YL,TX_PTR\r
+ OUT SREG,YH   ;SEI\r
+       ANDI    YL,TX_SIZE-1\r
+       SUBI    YL,-TX_BUF\r
+       CLR     YH\r
+       ST      Y,A\r
+\r
+       INC     TX_COUNT\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS BACKGROUND TASK\r
+\r
+.MACRO MTX_EMPTY\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,TX_PTR\r
+       SUBI    ZL,-TX_BUF\r
+       CLR     ZH\r
+       LD      F,Z                     ; GET CHARACTER FROM TX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       OUT     UDR,F\r
+\r
+       DEC     TX_COUNT\r
+       INC     TX_PTR\r
+       LDI     F,TX_SIZE-1\r
+       AND     TX_PTR,F\r
+\r
+       DEC     API_REMAIN              ; MORE TO SEND?\r
+       BRMI    GO_API_DONE1            ; YES, AWAIT NEXT TX EMPTY INTERRUPT\r
+       RJMP    API_REINIT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+GO_API_DONE1:\r
+       RJMP    API_DONE\r
+.ENDMACRO\r
+\r
+.MACRO MRX_COMPLETE\r
+       IN      SR,SREG\r
+       PUSH    F\r
+\r
+       LDI     F,-API_TIMEOUT          ; FEED TX/RX WATCHDOG\r
+       MOV     API_WATCHDOG,F\r
+\r
+       IN      F,UDR\r
+       SBIC    USR,FE                  ; BREAK DETECTED?\r
+       RJMP    API_FRAMING_ERROR\r
+\r
+       SBRC    API_STATE,APIDATA\r
+       RJMP    API_RX_DATA             ; WITH F = CHARACTER\r
+       SBRC    API_STATE,APISIZE\r
+       RJMP    API_DATA_SIZE           ; WITH F = CHARACTER\r
+\r
+       ; RECEIVED 4800 BPS ADDRESS COMMAND\r
+       CPI     F,API_ADDRESS           ; CHARACTER = MY ADDRESS?\r
+       BRNE    API_ADDRESS_DONE\r
+\r
+       LDI     F,API_RATE_FAST         ; 115200 BPS\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       SBI     UCR,TXEN                ; ENABLE UART TX AND TXD PIN\r
+\r
+       LDI     F,1<<APISIZE\r
+       OR      API_STATE,F             ; SAY WE ARE EXPECTING DATA SIZE CMD\r
+       RJMP    API_DONE\r
+\r
+API_ADDRESS_DONE:\r
+       CPI     F,$AA                   ; CHARACTER = TURNON COMMAND?\r
+       BRNE    API_TURNON_DONE\r
+       LDI     F,0\r
+       STS     TURNON_COUNT,F          ; REQUEST IMMEDIATE TURNON\r
+API_TURNON_DONE:\r
+; 18DEC01 RESTORED IT TO NORMAL FOR HYT1500 RELEASE\r
+;      CPI     F,9                     ; REALLY A VALID ADDRESS COMMAND?\r
+;      BRLO    API_BAD_DONE            ; YES, ALL IS OK (IT WAS SOMEONE ELSE)\r
+;      PUSH    ZL                      ; NO, WARN THAT THE BUS HAS ERRORS\r
+;      PUSH    ZH\r
+;      MOV     ZL,RX_COUNT\r
+;      CPI     ZL,RX_SIZE\r
+;      BRSH    API_BAD_SKIP\r
+;      ADD     ZL,RX_PTR\r
+;      ANDI    ZL,RX_SIZE-1\r
+;      SUBI    ZL,-RX_BUF\r
+;      CLR     ZH\r
+;      LDI     F,'*'                   ; DIAGNOSTIC INDICATOR FOR BAD COMMAND\r
+;      ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+;      INC     RX_COUNT\r
+;API_BAD_SKIP:\r
+;      POP     ZH\r
+;      POP     ZL\r
+;API_BAD_DONE:\r
+       RJMP    API_DONE\r
+\r
+API_DATA_SIZE:\r
+       ; RECEIVED DATA SIZE COMMAND\r
+       MOV     API_REMAIN,F\r
+\r
+       LDI     F,RX_SIZE\r
+       SUB     F,RX_COUNT              ; F = AVAILABLE RX BUFFER\r
+       BRPL    RX_RESPOND_F\r
+       LDI     F,$7F                   ; F = MAXIMUM POSSIBLE TRANSFER COUNT\r
+\r
+RX_RESPOND_F:\r
+       TST     API_REMAIN              ; TEST TRANSFER DIRECTION\r
+       BRPL    RX_RESPOND              ; USE F IF WE NEED TO RECEIVE\r
+\r
+       MOV     F,TX_COUNT\r
+       ORI     F,$80                   ; F = QUEUED TX CHARACTERS\r
+\r
+RX_RESPOND:\r
+       ; SEND DATA SIZE RESPONSE\r
+       ; API_REMAIN = HOST MAX, F = OUR MAX\r
+       OUT     UDR,F                   ; SEND DATA SIZE RESPONSE\r
+\r
+       CP      F,API_REMAIN\r
+       BRSH    RX_RESPOND_OK\r
+       MOV     API_REMAIN,F            ; API_REMAIN = LESSER OUR / HOST MAX\r
+\r
+RX_RESPOND_OK:\r
+       MOV     F,API_REMAIN\r
+       ANDI    F,$7F                   ; NULL REQUEST?\r
+       BREQ    API_NULL                ; YES, REVERT TO 4800 WHEN TX COMPLETE\r
+                                       ; NO, AWAIT RX COMPLETE / TX EMPTY INT\r
+       LDI     F,1<<APIDATA | 1<<APISIZE\r
+       OR      API_STATE,F             ; WE ARE EXPECTING TO TRANSFER DATA\r
+\r
+       DEC     API_REMAIN              ; NUDGE FOR BRPL / BRMI ALGORITHM\r
+       BRPL    API_DONE                ; WE WILL RECEIVE, NO FURTHER ACTION\r
+\r
+       CBI     UCR,RXCIE               ; DISABLE UART RX COMPLETE INTERRUPT\r
+       SBI     UCR,UDRIE               ; ENABLE UART DATA REGISTER EMPTY INT\r
+       RJMP    API_DONE\r
+\r
+API_NULL:\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; IN CASE NO DATA TRANSFERRED\r
+\r
+       SBI     UCR,TXCIE               ; ENABLE UART TX COMPLETE INTERRUPT\r
+       SBI     USR,TXC                 ; CLEAR UART TX COMPLETE PENDING BIT\r
+       RJMP    API_DONE\r
+\r
+API_RX_DATA:\r
+       ; RECEIVED DATA BYTE, SAVE IT\r
+; OUT UDR,API_REMAIN\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       MOV     ZL,RX_COUNT\r
+       ADD     ZL,RX_PTR\r
+       ANDI    ZL,RX_SIZE-1\r
+       SUBI    ZL,-RX_BUF\r
+       CLR     ZH\r
+       ST      Z,F                     ; SAVE CHARACTER IN RX BUFFER\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       INC     RX_COUNT\r
+\r
+       DEC     API_REMAIN              ; MORE TO RECEIVE?\r
+       BRPL    API_DONE                ; YES, AWAIT NEXT RX COMPLETE INTERRUPT\r
+       RJMP    API_REVERT              ; NO, AWAIT NEXT DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MTX_COMPLETE\r
+       IN      SR,SREG\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_TIMEOUT_ERROR\r
+       PUSH    F\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_FRAMING_ERROR\r
+       CBI     UCR,TXEN                ; DISABLE UART TX AND TXD PIN\r
+       LDI     F,API_RATE_SLOW         ; 4800 BPS IF EXPECTING ADDRESS COMMAND\r
+       OUT     UBRR,F                  ; SET UART RATE\r
+\r
+       LDI     F,~(1<<APISIZE)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS COMMAND\r
+       CLR     API_WATCHDOG            ; NO ACTION, JUST WAIT TO RECEIVE ADDR\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REINIT\r
+       CBI     UCR,UDRIE               ; DISABLE UART TX EMPTY INTERRUPT\r
+       CBI     UCR,TXCIE               ; DISABLE UART TX COMPLETE INTERRRUPT\r
+       SBI     UCR,RXCIE               ; ENABLE UART RX COMPLETE INTERRUPT\r
+       IN      F,UDR                   ; CLEAR UART RX COMPLETE PENDING BIT\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_REVERT\r
+       LDI     F,~(1<<APIDATA)\r
+       AND     API_STATE,F             ; EXPECTING ADDRESS / DATA SIZE COMMAND\r
+.ENDMACRO\r
+\r
+.MACRO MAPI_DONE\r
+       POP     F\r
+       OUT     SREG,SR\r
+       RETI\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+; API BUS TIMER INTERRUPT\r
+\r
+.MACRO MAPI_TIMER\r
+       TST     API_WATCHDOG\r
+       BREQ    API_OKAY\r
+       INC     API_WATCHDOG            ; SEE IF API BUS WAS LEFT HANGING\r
+       BRNE    API_OKAY\r
+       RJMP    API_TIMEOUT_ERROR       ; IF SO THEN RESET TO GET NEXT COMMAND\r
+API_OKAY:                              ; OTHERWISE RETURN FROM INTERRUPT\r
+.ENDMACRO\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/avrasm.cc b/src/mkutil/tavrasm.118/src/avrasm.cc
new file mode 100644 (file)
index 0000000..a396368
--- /dev/null
@@ -0,0 +1,1501 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : avrasm.cc\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : AVR assembler entry point (See additional info below).\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990117      : Tom - Fixed alignment of .db in CSEG with forward refs.\r
+//  990124      : Tom - Added GPL notice.\r
+//  990127      : Tom - Added support for German.\r
+//  990303      : JED - Modified to support intel hex as the default. Now\r
+//                      automatically determines the output file name.\r
+//                      Exits with a count of the number of errors (for make).\r
+//  990329      : Tom - Fixed problem with tabs after include filename\r
+//  990329      : Tom - Added support for hex values like 1AB without $ or 0x\r
+//  990512      : Tom - Fixed detection on binary numbers.\r
+//                Tom - Fixed problem with memset of context stack\r
+//  990516      : Tom - Added support for wrapping in branch/rcall/rjmp\r
+//  990519      : Tom - Added '-g' switch to generate generic hex.\r
+//  990522      : Tom - Added support for PC/DC/EC.   \r
+//  991209     : Tom - Fixed problem with BRBC/BRBS (they did not work :(\r
+//  991211      : Tom - Added the new instructions: 'eijmp', 'eicall', 'espm',\r
+//                      'mulsu', 'fmul', 'fmuls', 'fmulsu', 'muls', 'movw', \r
+//                      'elpm'. And changed behaviour of 'lpm' according to\r
+//                      Atmel specs.\r
+//  991211      : Tom - Added support for Spanish\r
+//  991211      : Tom - Fixed .endm problem (it had to be lower case)\r
+//  991212     : Tom - Now the Alpha problem is fixed (I forgot to move\r
+//                      fix from test to release source).\r
+//  991212      : Tom - Fixed promlem with detecting supported instructions\r
+//                      (Introduced in 1.10)\r
+//  991213     : Tom - Added 'spm' instruction\r
+//  991222      : Kurt- Added command line option -x for local labels\r
+//  001031      : Tom - Added command line option -f to allow forward .orgs\r
+//  001031      : Tom - Fixed problem with saving rom/erom files when forward\r
+//                      orgs were used.\r
+//  001101     : Brian - Add support for multiple include search paths\r
+//  010112     : Tom - Increased max id length to 64\r
+//  010319      : Timothy Lee - Added byte1 function (sames as low())\r
+//  010403      : Tom - Fixed path delimiter problem in include path\r
+//  030217     : Patrick - Changes to allow compilation with gcc 3.2\r
+//  \r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Kurt = Kurt Stege\r
+// E-Mail : kurt-stege@gmx.de\r
+//\r
+// Patrick = Patrick Dreker\r
+// E-Mail : patrick@dreker.de\r
+// \r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  BUGS - What did I do wrong (Always learn from your mistakes)\r
+// =========================================================================\r
+//\r
+// - Alginemnt of .db in CSEG with forward references (fixed in 1.01)\r
+//\r
+//   I had a function that was called after evry line that checked the\r
+//   alignment of the 'program counter' and another function that\r
+//   updated the logfile, I had merged the two functions (at a late\r
+//   night code clean-up). Problem : The logfile function returns\r
+//   immediately during the first pass (the logfile is not created\r
+//   until the second pass), so the code segment alignment check\r
+//   wasn't performed until the second pass, so if you had a forward\r
+//   reference to a un-aligned code segment address, this was not\r
+//   aligned :-(\r
+//\r
+//   Thanks to Rob Penny for reporting this bug.\r
+// \r
+// - Problem with tabs after include filename (fixed in 1.04)\r
+//\r
+//   I only stripped trailing spaces, not tabs. This was fixed in\r
+//   striprem.\r
+//\r
+//   Thanks to Andreas Bogk for reporting this bug.\r
+//\r
+// - Fixed problem with detection of binary numbers like '0b010101'.\r
+//   This was bug was introduced by the new hex detection feature in\r
+//   V. 1.04 :( \r
+//            \r
+//   Thanks to Randy Ott for reporting this bug.\r
+//\r
+// - Fixed problem with memset of context statck that caused the winDOS\r
+//   version to crash on some systems (strange that Linux/NT did not detect\r
+//   this obvious memory violation).\r
+//\r
+//   Thanks to my friend Henning for finding this.\r
+//\r
+// - Fixed problem with SBR\r
+//\r
+//   This is the same as ORI reg, 2^bitno, but the SBR version had a bug\r
+//   (one of those that generates faulty code), bit 0 was always set. \r
+//   This is the second "wrong code generated" bug, I guess no software is\r
+//   perfect! \r
+//\r
+//   Thanks to Dean Huxley for reporting this (and supplying a patch).\r
+//\r
+// - BRBC/BRBS generated incorrect (invalid) opcodes.\r
+//\r
+//   Ooops the third bug that generated incorrect opcodes.\r
+//   \r
+//   The problem was that I used the destination operand (the status register\r
+//   bit number) as boths source and destination (they are named 'values' and\r
+//   'valued' :)\r
+//\r
+//   I guess nobody has found this until now, because we normally prefer\r
+//   to specify 'BRCC xxx' (BRanc If Carry Cleared) instead of 'BRBC 0, xxx'.\r
+//\r
+//   Hmmm, poor excuse!\r
+//\r
+//   Thanks to Todd M. Squires for reporting this.\r
+//\r
+// - Fixed problem when generating HEX output on Alpha's. Actually this was\r
+//   not an Alpha problem. It happend because I made a incorrect asumption\r
+//   on how compilers generate code, that just happend to be correct for gcc.\r
+//\r
+//   Thanks to Todd M. Squires for reporting this (and supplying a patch).\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  The following functions are defined (move to documentation):\r
+//\r
+//  - LOW(expr)   returns the low byte of an expression\r
+//  - HIGH(expr)  returns the second byte of an expression\r
+//  - BYTE1(expr) returns the low byte of an expression (same as LOW)\r
+//  - BYTE2(expr) returns the second byte of an expression (same as HIGH)\r
+//  - BYTE3(expr) returns the third byte of an expression\r
+//  - BYTE4(expr) returns the fourth byte of an expression\r
+//  - LWRD(expr)  returns bits 0-15 of an expression\r
+//  - HWRD(expr)  returns bits 16-31 of an expression\r
+//  - PAGE(expr)  returns bits 16-21 of an expression\r
+//  - EXP2(expr)  returns 2^expression\r
+//  - LOG2(expr)  returns the integer part of log2(expression)\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Source code notice:\r
+//\r
+// - Global varaibles\r
+//\r
+//   This program uses a lot of program wide global variables. They are\r
+//   all defined in 'avrasm.hh'. Names of system wide globals start\r
+//   with 'yy' (stupid, has to be changed - Tom). When writing event\r
+//   driven software like a compiler, there is no point in trying to\r
+//   avoid them, but the implementation could be more elegant than the\r
+//   one I have chosen. Maybe I will get around to fixing this in the\r
+//   future (the names will be changed).\r
+//\r
+// - Use of {}\r
+//\r
+//   When writing this program i used the GNU preferred style for {} i.e.\r
+//\r
+//   void foo(void)\r
+//   {\r
+//\r
+//   }\r
+//\r
+//   But I have since been persuaded to change to the style preferred\r
+//   by many programmers:\r
+//\r
+//   void food(void) {\r
+//\r
+//   }\r
+//\r
+//   It is not a high priority to change this, but if anyone would like\r
+//   to add/fix something, they should use the later style.\r
+//\r
+// - History\r
+//\r
+//   Any changes after version 1.00 should be noted in the header of the\r
+//   modified file, as well as in the header of 'avrasm.cc' (this file).\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Odd things found in the ATMEL DOS assembler V. 1.21 (items 1-21 send to\r
+// ATMEL October 1998), if you find any other, please report to them.\r
+// I don't know if they fix the bugs reported to them, but they did send\r
+// me a nice e-mail back when i reported the list of bugs below, and\r
+// in addition to this they added a reference to tavrasm on their web site :-)\r
+//\r
+//  1: This generates code that is illegal (0xFFFF is generated) :\r
+//\r
+//     bld     r16,   -1       ; Bit Load from T to Register bit\r
+//\r
+//     Other instructions have similar problems\r
+//\r
+//  2: If backwards rjump/rcall is 2049 it will generate a jump forward 2047\r
+//\r
+//  3: For relative jmp/call the 2k boundary is incorrect, it will only\r
+//     allow 0x7FE in relative distance forward\r
+//\r
+//  4: For all branch instructions the -64/+63 offset is incorrect, it\r
+//     will only allow +62 in relative distance forward\r
+//\r
+//  5: Illegal opcodes in macro is not detected, and and 2 words of\r
+//     code is generated, but is reported unused.\r
+//\r
+//  6: If file is included in macro, remaining part of macro is not\r
+//     assembled\r
+//\r
+//  7: If a label is defined in an include file and the file is\r
+//     included both within a macro and in the outer scope, any reference\r
+//     to that label is not calculated correctly. If file is included\r
+//     before macro is used, label within macro refers to label defined in\r
+//     first include.  If Include in outer scope is done after macro, the\r
+//     reference is "random".\r
+//\r
+//  8: If a label is specified in DSEG/ESEG in a macro, references to that\r
+//     label are incorrect.\r
+//\r
+//  9: If last line of input file is not empty, that line is logged\r
+//     incorrectly\r
+//\r
+// 10: If .device is specified the "Address extension record" in Intel hex\r
+//     format is omitted.\r
+//\r
+// 11: If macro error (like no name specified), or if .include file can\r
+//     not be found, error in the remaining of the file is not reported.\r
+//\r
+// 12: No error is reported for lines like ,foo or ,include "file.inc"\r
+//\r
+// 13: If empty file is assembled the "Address extension record" in Intel\r
+//     hex format is omitted.\r
+//\r
+// 14: Multiple .device can be specified, but only last occurrence has\r
+//     any effect, and it also effects previous instructions.\r
+//\r
+// 15: Constants are 'wrapped' (might be ok, but should generate a warning).\r
+//\r
+// 16: If only .byte is specified in .eseg no eeprom file is generated\r
+//     (might be ok).\r
+//\r
+// 17: .dw and .db in CSEG is logged with high and low byte swapped\r
+//\r
+// 18: If a file is included twice that contains a macro with a label, a\r
+//     duplicate label is reported.\r
+//\r
+// 19: If a macro is defined twice, no duplicate name error is generated,\r
+//     and last definition is used with no warning.\r
+//\r
+// 20: Escape sequences are not supported in strings and characters (why\r
+//     not ?)\r
+//\r
+// 21: If file is include in macro, line number is 0 for that file in .obj,\r
+//     but "in macro" indicator is not set.\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include "avrasm.hh"\r
+#include "symbol.hh"\r
+#include "semantic.hh"\r
+#include "utils.hh"\r
+#include "devices.hh"\r
+\r
+/// Globals //////////////////////////////////////////////////////////////////\r
+\r
+GLOBALS(;);\r
+\r
+/// Externals ////////////////////////////////////////////////////////////////\r
+\r
+extern int      yyparse(void);\r
+extern FILE     *yyin;\r
+extern char     messages[MESSAGE_COUNT][MESSAGES_LEN];\r
+\r
+/// Functions ////////////////////////////////////////////////////////////////\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Main\r
+  //\r
+\r
+int main(int argc, char **args)\r
+{\r
+  int   parseresult;\r
+  int   c;\r
+  int   unusedcode = 0;\r
+  int   unusederom = 0;\r
+\r
+  /// Process arguments //////////////////////////////////////////////////////\r
+\r
+  yyIncPathCount = 0;\r
+\r
+  if(!getargs(argc, args))\r
+    return 0;\r
+\r
+  /// Print header ///////////////////////////////////////////////////////////\r
+\r
+  if(yycfg -> info)\r
+    printf(INFOSTR);\r
+\r
+  /// Open input file ////////////////////////////////////////////////////////\r
+\r
+  if(! (yyin= fopen(yyfilename,"r")) )\r
+    errorexit(X_UNABLE_TO_OPEN_FILE, yyfilename);\r
+  if(! (yyin2= fopen(yyfilename,"r")) )\r
+    errorexit(X_UNABLE_TO_OPEN_FILE, yyfilename);\r
+\r
+  if(yylogfilename[0])\r
+  {\r
+    if(! (yylogfile = fopen(yylogfilename,"w")) )\r
+      errorexit(X_UNABLE_TO_OPEN_LOGFILE, yylogfilename);\r
+  }\r
+  else\r
+    yylogfile = NULL;\r
+\r
+  /// Setup global symbols ///////////////////////////////////////////////////\r
+\r
+  INITEXTERN;\r
+  yyparseno      = 0;\r
+  yyfilecount    = 1;\r
+\r
+  if( !(yyfilelist[0] = new char[MAX_FILENAME_LENGTH]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  strcpy(yyfilelist[0], yyfilename);\r
+\r
+  /// Allocate buffers ///////////////////////////////////////////////////////\r
+\r
+  if( !(symtab = new symbolTable) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yycodebuf     = new unsigned char[MAX_CODE_SIZE]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yyerombuf     = new unsigned char[MAX_EROM_SIZE]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yycodeusage   = new unsigned char[MAX_CODE_SIZE]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yyeromusage   = new unsigned char[MAX_EROM_SIZE]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yycodeline    = new unsigned short[MAX_CODE_SIZE]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yylinetxt     = new char[MAX_LINE_LENGTH+1]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yyinline      = new char[MAX_LINE_LENGTH+1]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yyinlinenew   = new char[MAX_LINE_LENGTH+1]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if( !(yyinlineold   = new char[MAX_LINE_LENGTH+1]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  for(c=0; c<MAX_CONTEXT_DEPTH; c++)\r
+  {\r
+    if( !(yycontextstack[c]= new context) )\r
+      errorexit(X_OUT_OF_MEMORY);\r
+    else\r
+      memset(yycontextstack[c],0,sizeof(context));\r
+  }\r
+\r
+  memset(yycodebuf,     0, sizeof(unsigned char)*MAX_CODE_SIZE);\r
+  memset(yyerombuf,     0, sizeof(unsigned char)*MAX_EROM_SIZE);\r
+  memset(yycodeusage,   0, sizeof(unsigned char)*MAX_CODE_SIZE);\r
+  memset(yyeromusage,   0, sizeof(unsigned char)*MAX_EROM_SIZE);\r
+  memset(yysymbolstack, 0, sizeof(symbolTable*)*MAX_CONTEXT_DEPTH);\r
+  memset(yycodeline,    0, sizeof(unsigned short)*MAX_CODE_SIZE);\r
+\r
+  /// Setup context stack ////////////////////////////////////////////////////\r
+\r
+  strcpy(yycontextstack[0]->filename, yyfilename);\r
+\r
+  /// Setup device info //////////////////////////////////////////////////////\r
+\r
+  for(c=0; c<MAX_DEVICES; c++) {\r
+         yydevices[c] = devices[c];\r
+  }\r
+\r
+  /// Fill line read-ahead buffer ////////////////////////////////////////////\r
+\r
+  if(!fgets(yyinline, MAX_LINE_LENGTH, yyin2))\r
+    strcpy(yyinline,"\n");\r
+  if(!fgets(yyinlinenew, MAX_LINE_LENGTH, yyin2))\r
+    strcpy(yyinlinenew,"\n");\r
+\r
+  STRIPNR(yyinlinenew);\r
+  STRIPNR(yyinline);\r
+\r
+  /// Setup symbol table /////////////////////////////////////////////////////\r
+\r
+  symtab -> init(yycfg->casesensitive);\r
+  yysymbolstack[0] = symtab;\r
+\r
+  /// Start assembler ////////////////////////////////////////////////////////\r
+\r
+  if(yylogfile)\r
+  {\r
+    fputs(INFOSTR, yylogfile);\r
+    fputs("\n+------------------+--------------------", yylogfile);\r
+    fputs("---------------------------------------+\n", yylogfile);\r
+    fputs("| Value            | Text               ",   yylogfile);\r
+    fputs("                                       |\n", yylogfile);\r
+    fputs("|------------------|--------------------",   yylogfile);\r
+    fputs("---------------------------------------|\n", yylogfile);\r
+  }\r
+\r
+  parseresult = yyparse();\r
+\r
+  yycodepos = (yycodepos>yycodeposhigh) ? yycodepos : yycodeposhigh;\r
+  yydatapos = (yydatapos>yydataposhigh) ? yydatapos : yydataposhigh;\r
+  yyerompos = (yyerompos>yyeromposhigh) ? yyerompos : yyeromposhigh;\r
+\r
+  for(c=0;c<yycodepos;c+=2)\r
+    if(!yycodeusage[c])\r
+      unusedcode++;\r
+  for(c=0;c<yyerompos;c++)\r
+    if(!yyeromusage[c])\r
+      unusederom++;\r
+\r
+  if(yylogfile)\r
+  {\r
+    fputs("+------------------+--------------------",  yylogfile);\r
+    fputs("---------------------------------------+\n", yylogfile);\r
+    fprintf(yylogfile, "\n");\r
+    fprintf(yylogfile, MSG(M_ERRORS     ), yyerrorcount);\r
+    fprintf(yylogfile, "\n");\r
+    fprintf(yylogfile, MSG(M_WARNINGS   ), yywarningcount);\r
+    fprintf(yylogfile, "\n");\r
+    fprintf(yylogfile, MSG(M_CODE       ), yycodepos/2);\r
+    fprintf(yylogfile, "\n");\r
+    fprintf(yylogfile, MSG(M_ROM        ), yyerompos);\r
+    fprintf(yylogfile, "\n");\r
+    fprintf(yylogfile, MSG(M_DATA       ), yydatapos-DEVINF.datastart);\r
+    fprintf(yylogfile, "\n");\r
+    fprintf(yylogfile, MSG(M_UNUSED_CODE), unusedcode);\r
+    fprintf(yylogfile, "\n");\r
+    fprintf(yylogfile, MSG(M_UNUSED_ROM ), unusederom);\r
+    fprintf(yylogfile, "\n");\r
+    fclose(yylogfile);\r
+  }\r
+\r
+  if(yycfg->info)\r
+  {\r
+    printf("\n");\r
+    message(M_ERRORS      , yyerrorcount);\r
+    message(M_WARNINGS    , yywarningcount);\r
+    message(M_CODE        , yycodepos/2);\r
+    message(M_ROM         , yyerompos);\r
+    message(M_DATA        , yydatapos-DEVINF.datastart);\r
+    message(M_UNUSED_CODE , unusedcode);\r
+    message(M_UNUSED_ROM  , unusederom);\r
+  }\r
+\r
+  /// Save results ///////////////////////////////////////////////////////////\r
+\r
+  if(!yyerrorcount)\r
+  {\r
+    if(yycfg -> intel)\r
+      saveIHF();\r
+    else if(yycfg -> motorola)\r
+      saveMotorola();\r
+    else if(yycfg -> obj)\r
+      saveObj();\r
+    else if(yycfg -> bin)\r
+      saveBin();\r
+    else\r
+      saveGeneric();\r
+  }\r
+\r
+  exit(yyerrorcount);\r
+\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Get commandline arguments.\r
+  //\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  //  -o = output file\r
+  //  -r = rom file\r
+  //  -e = list file\r
+  //  -v = verbose\r
+  //  -w = no warnings\r
+  //  -c = case sensitive labels/defines\r
+  //  -l = limit log width to 80 characters\r
+  //  -x = allow local labels\r
+  //  -a = do not align .db in CSEG\r
+  //  -m = output Motorola S-record format\r
+  //  -i = output Intel HEX format\r
+  //  -j = output ATMEL .obj format\r
+  //  -g = output ATMEL generic format\r
+  //\r
+\r
+int getargs(int argc, char **args)\r
+{\r
+  int c;\r
+  int ok = TRUE;\r
+\r
+  if(argc==1)\r
+  {\r
+    printf(INFOSTR);\r
+    printf("\n");\r
+    printf(HELPSTR);\r
+    return FALSE;\r
+  }\r
+\r
+  // List devices ////////////////////////////////////////////////////////////\r
+\r
+  else if( (argc==2) && !strcmp(args[1],"-d")) {\r
+\r
+    int devno = 0;\r
+    printf("+---------------------------------------------------"\r
+          "-----------------+\n");\r
+    message(M_DEVICE_HEADER);\r
+    printf("|------------------+-----------+------------+-------"\r
+          "---+-------------|\n");\r
+    while(devices[devno].name[0]) {\r
+      printf("| %-16s |  %8d | %10d | %8d | %11d |\n", devices[devno].name,\r
+            devices[devno].datastart,\r
+            devices[devno].flashsize,\r
+            devices[devno].ramsize,\r
+            devices[devno].eepromsize);\r
+      devno++;\r
+    }\r
+    printf("+---------------------------------------------------"\r
+          "-----------------+\n");\r
+    return FALSE; /* Nick false; */\r
+  }\r
+\r
+  /// Allocate filename strings //////////////////////////////////////////////\r
+\r
+  if(!(yyfilename     = new char[MAX_FILENAME_LENGTH+1]))\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if(!(yyromfilename  = new char[MAX_FILENAME_LENGTH+1]))\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if(!(yylogfilename  = new char[MAX_FILENAME_LENGTH+1]))\r
+    errorexit(X_OUT_OF_MEMORY);\r
+  if(!(yyoutfilename  = new char[MAX_FILENAME_LENGTH+1]))\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  yyfilename[0]=yyromfilename[0]=yylogfilename[0]=yyoutfilename[0] = '\0';\r
+\r
+  /// Setup default configuration ////////////////////////////////////////////\r
+\r
+  if( !(yycfg = new configuration) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  memset(yycfg, 0, sizeof(configuration));\r
+\r
+  yycfg -> info           = FALSE;  // -v\r
+  yycfg -> warnings       = TRUE;   // -w\r
+  yycfg -> casesensitive  = FALSE;  // -c\r
+  yycfg -> cutlog         = FALSE;  // -l\r
+  yycfg -> aligndb        = TRUE;   // no command line option anymore\r
+  yycfg -> motorola       = FALSE;  // -m\r
+  yycfg -> intel          = FALSE;  // -i\r
+  yycfg -> hex           = FALSE;  // -g\r
+  yycfg -> obj            = FALSE;  // -j\r
+  yycfg -> bin            = FALSE;  // -b\r
+  yycfg -> wrap                  = FALSE;  // -a\r
+  yycfg -> local_labels   = FALSE;  // -x\r
+  yycfg -> forwardorg     = FALSE;  // -f\r
+  yycfg -> addressext    = TRUE;   // -h\r
+\r
+  /// Get command line options ///////////////////////////////////////////////\r
+\r
+  for(c=1;c<argc;c++)\r
+  {\r
+    if(!ok)\r
+      return FALSE;\r
+\r
+    if(args[c][0]!='-')\r
+    {\r
+      ok = FALSE;\r
+\r
+      if(strlen(args[c])>MAX_FILENAME_LENGTH)\r
+        message(M_INPUT_FILENAME_TOO_LONG);\r
+      else if(!checkfilename(args[c]))\r
+        message(M_ILLEGAL_INPUT_FILENAME);\r
+      else if(yyfilename[0])\r
+        message(M_MULTIPLE_INPUT);\r
+      else\r
+      {\r
+        ok = TRUE;\r
+        strcpy(yyfilename, args[c]);\r
+      }\r
+    }\r
+    else\r
+    {\r
+      if(strlen(args[c])>2)\r
+      {\r
+        message(M_UNKNOWN_OPTION ,args[c]);\r
+        ok = FALSE;\r
+      }\r
+      else\r
+      {\r
+        switch(args[c][1])\r
+        {\r
+\r
+          /// Include path ////////////////////////////////////////////////////\r
+         //\r
+         case 'I' :\r
+         {\r
+             ok = FALSE;\r
+             if (c == argc-1)\r
+                     message (M_NO_INCLUDEPATH);\r
+\r
+              else if(strlen(args[c+1]) > MAX_INCPATH_LENGTH)\r
+                     message(M_INCPATH_TOO_LONG);\r
+\r
+             else if (MAX_INCPATH_QTY == yyIncPathCount)\r
+                     message(M_TOO_MANY_INCPATHS);\r
+\r
+             else\r
+             {\r
+                 yyIncludePaths[yyIncPathCount++] = args[++c];\r
+                 ok = TRUE;\r
+             }\r
+         } break;\r
+\r
+\r
+          /// output file ////////////////////////////////////////////////////\r
+\r
+          case 'o' :\r
+          {\r
+            ok = FALSE;\r
+\r
+            if(c==argc-1)\r
+              message(M_NO_OUTPUT_FILENAME);\r
+            else if(strlen(args[c+1])>MAX_FILENAME_LENGTH)\r
+              message(M_OUTPUT_FILENAME_TOO_LONG);\r
+            else if(!checkfilename(args[c+1]))\r
+              message(M_ILLEGAL_OUTPUT_FILENAME);\r
+            else if(yyoutfilename[0])\r
+              message(M_MULTIPLE_OUTPUT);\r
+            else\r
+            {\r
+              strcpy(yyoutfilename, args[c+1]);\r
+              c++;\r
+              ok = TRUE;\r
+            }\r
+          } break;\r
+\r
+          /// rom file ///////////////////////////////////////////////////////\r
+\r
+          case 'e' :\r
+          {\r
+            ok = FALSE;\r
+\r
+            if(c==argc-1)\r
+              message(M_NO_LIST_FILENAME);\r
+            else if(strlen(args[c+1])>MAX_FILENAME_LENGTH)\r
+              message(M_LIST_FILENAME_TOO_LONG);\r
+            else if(!checkfilename(args[c+1]))\r
+              message(M_ILLEGAL_LIST_FILENAME);\r
+            else\r
+            {\r
+              strcpy(yylogfilename, args[c+1]);\r
+              c++;\r
+              ok = TRUE;\r
+            }\r
+          } break;\r
+\r
+          /// list file //////////////////////////////////////////////////////\r
+\r
+          case 'r' :\r
+          {\r
+            ok = FALSE;\r
+\r
+            if(c==argc-1)\r
+              message(M_NO_ROM_FILENAME);\r
+            else if(strlen(args[c+1])>MAX_FILENAME_LENGTH)\r
+              message(M_ROM_FILENAME_TOO_LONG);\r
+            else if(!checkfilename(args[c+1]))\r
+              message(M_ILLEGAL_ROM_FILENAME);\r
+            else\r
+            {\r
+              strcpy(yyromfilename, args[c+1]);\r
+              c++;\r
+              ok = TRUE;\r
+            }\r
+          } break;\r
+\r
+          /// verbose ////////////////////////////////////////////////////////\r
+\r
+          case 'v' : yycfg -> info              = TRUE;  break;\r
+\r
+          /// no warnings ////////////////////////////////////////////////////\r
+\r
+          case 'w' : yycfg -> warnings          = FALSE; break;\r
+\r
+          /// case sensitive labels/defines //////////////////////////////////\r
+\r
+          case 'c' : yycfg -> casesensitive     = TRUE;  break;\r
+\r
+          /// limit log width to 80 characters ///////////////////////////////\r
+\r
+          case 'l' : yycfg -> cutlog            = TRUE;  break;\r
+\r
+          /// Wrap relative jumps/branches ///////////////////////////////////\r
+\r
+          case 'a' : yycfg -> wrap              = TRUE;  break;\r
+\r
+          /// allow local labels /////////////////////////////////////////////\r
+          \r
+          case 'x' : yycfg -> local_labels      = TRUE;  break;\r
+\r
+          /// do not align .db in CSEG ///////////////////////////////////////\r
+\r
+          //  case 'a' : yycfg -> aligndb           = FALSE; break;\r
+\r
+          /// output Motorola S-record format ////////////////////////////////\r
+\r
+          case 'm' :\r
+          {\r
+            if(yycfg->intel || yycfg->obj || yycfg->bin || yycfg->hex )\r
+            {\r
+              message(M_MORE_MIJBH);\r
+              ok = FALSE;\r
+            }\r
+            else\r
+              yycfg -> motorola = TRUE;\r
+          }\r
+          break;\r
+\r
+          /// output Intel HEX format ////////////////////////////////////////\r
+\r
+          case 'i' :\r
+          {\r
+            if(yycfg->motorola || yycfg->obj || yycfg->bin || yycfg->hex)\r
+            {\r
+              message(M_MORE_MIJBH);\r
+              ok = FALSE;\r
+            }\r
+            else\r
+              yycfg -> intel = TRUE;\r
+\r
+            \r
+          }\r
+          break;\r
+\r
+          /// output .obj format /////////////////////////////////////////////\r
+\r
+          case 'j' :\r
+          {\r
+            if(yycfg->motorola || yycfg->intel || yycfg->bin || yycfg->hex)\r
+            {\r
+              message(M_MORE_MIJBH);\r
+              ok = FALSE;\r
+            }\r
+            else\r
+              yycfg -> obj   = TRUE;\r
+          }\r
+          break;\r
+\r
+          /// output .bin format /////////////////////////////////////////////\r
+\r
+          case 'b' :\r
+          {\r
+            if(yycfg->motorola || yycfg->intel || yycfg->obj || yycfg->hex)\r
+            {\r
+              message(M_MORE_MIJBH);\r
+              ok = FALSE;\r
+            }\r
+            else\r
+              yycfg -> bin   = TRUE;\r
+          }\r
+          break;\r
+\r
+          /// Supress .org warnings //////////////////////////////////////////\r
+\r
+          case 'f' :\r
+          {\r
+            yycfg -> forwardorg = TRUE;\r
+          }\r
+          break;\r
+\r
+          /// output .obj format /////////////////////////////////////////////\r
+\r
+          case 'g' :\r
+          {\r
+            if(yycfg->motorola || yycfg->intel || yycfg->obj || yycfg->bin)\r
+            {\r
+              message(M_MORE_MIJBH);\r
+              ok = FALSE;\r
+            }\r
+            else\r
+              yycfg -> hex   = TRUE;\r
+          }\r
+          break;\r
+\r
+          /// No address entension record in Intel HEX output ////////////////\r
+\r
+          case 'h' : yycfg -> addressext = FALSE; break;\r
+\r
+          /// ignore -d flag /////////////////////////////////////////////////\r
+\r
+          case 'd' : break;\r
+\r
+          /// Unknown option /////////////////////////////////////////////////\r
+\r
+          default  : message(M_UNKNOWN_OPTION , args[c]); ok=FALSE;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  if(!yyfilename[0])\r
+  {\r
+    ok = FALSE; /* Nick false; */\r
+    message(M_NO_INPUT_FILENAME);\r
+  }\r
+\r
+  if(!yycfg->motorola&&!yycfg->hex&&!yycfg->intel&&!yycfg->bin&&!yycfg->obj)\r
+    yycfg->intel = TRUE;\r
+\r
+  if(!yyoutfilename[0])\r
+  { \r
+    char *type_start;\r
+\r
+    strcpy(yyoutfilename, yyfilename);\r
+    type_start = strrchr(yyoutfilename, '.');\r
+    if (type_start == NULL)\r
+      type_start = yyoutfilename + strlen(yyoutfilename);\r
+\r
+    if (yycfg->intel)\r
+      strcpy(type_start, ".hex");\r
+    else if (yycfg->motorola)\r
+      strcpy(type_start, ".s");\r
+    else if (yycfg->bin)\r
+      strcpy(type_start, ".bin");\r
+    else if (yycfg->obj)\r
+      strcpy(type_start, ".obj");\r
+    else if (yycfg->hex)\r
+      strcpy(type_start, ".gen");\r
+    else\r
+      strcpy(type_start,".");\r
+  }\r
+\r
+  return ok;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  //  Save Intel Hex Format (IHF)\r
+  //\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  //  :LLAAAATTDD.......DDSS\r
+  //  ^^ ^   ^ ^          ^\r
+  //  12 4   8 10         end-2  (field positions)\r
+  //\r
+  //  FIELD 1 (COLUMN 1)\r
+  //\r
+  //      a : symbol, each record uses a colon as a start delimiter.\r
+  //\r
+  //  FIELD 2 (COLUMN 2)\r
+  //\r
+  //      length byte, a two digit ASCII hex representation of the number\r
+  //      of data bytes to be transmitted in this record.\r
+  //\r
+  //  FIELD 3 (COLUMN 4)\r
+  //\r
+  //      address word, a four digit ASCII hex representation of the target\r
+  //      load address of the first byte of the following packet. This field\r
+  //      is always 4 digits long, hence addresses are limited to 16 bits. See\r
+  //      note later for more information.\r
+  //\r
+  //  FIELD 4 (COLUMN 8)\r
+  //\r
+  //      record type, a two digit ASCII hex representation of an integer which\r
+  //      in turn denotes the record type.\r
+  //      There are three record types 0,1 and 2\r
+  //\r
+  //      Record Type 0 - Normal Data packet\r
+  //      Record Type 1 - End of file record. The last record in the file has\r
+  //                      a type of 1.\r
+  //      Record Type 2 - Address Extension Record. A special record type used\r
+  //                      to extend addresses beyond 16 bits.\r
+  //\r
+  //  FIELD 5 (COLUMN 10)\r
+  //\r
+  //      start of data bytes. Data bytes in two digit ASCII form. Variable\r
+  //      length field, usually a small power of 2 e.g. 16.\r
+  //\r
+  //\r
+  //  FIELD 6 (LAST 2 COLUMNS)\r
+  //\r
+  //      checksum. A two digit ascii representation of a special checksum for\r
+  //      the record. The checksum is the 2's complement of the true sum of all\r
+  //      the bytes in the record, starting with the record length and ending\r
+  //      with the last data byte. This allows limited error detection facilites\r
+  //      for the data packet.\r
+  //\r
+  //  Sample file :\r
+  //\r
+  //  :020000020000FC\r
+  //  :0600220018950895F89402\r
+  //  :1000440000000000000000000000000000000000AC\r
+  //  :0E00540000000000000000000000000000F7A7\r
+  //  :00000001FF\r
+  //\r
+\r
+int saveIHF(void)\r
+{\r
+  int  c, i;\r
+  FILE *out;\r
+  int  count;\r
+  int  line[16];\r
+  int  sum;\r
+  int  last;\r
+\r
+  /// Save code output file //////////////////////////////////////////////////\r
+\r
+  if(!yyoutfilename[0])\r
+    return TRUE;\r
+\r
+  if(! (out= fopen(yyoutfilename,"w")) )\r
+    errorexit(X_UNABLE_TO_OPEN_OUTFILE, yyoutfilename);\r
+\r
+  /// Address extension record, offset 0x0000 ////////////////////////////////\r
+\r
+  if(yycfg -> addressext)\r
+    fprintf(out, ":020000020000FC\n");\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  if(!yycodepos)\r
+    message(M_EMPTY_CODE);\r
+\r
+  c = 0;\r
+\r
+  while(c<yycodepos)\r
+  {\r
+    count = 0;\r
+    last  = 0;\r
+\r
+    while(!yycodeusage[c])\r
+      c++;\r
+\r
+    while( (count<16) && !last )\r
+    {\r
+      if(yycodeusage[c+count]) {\r
+        line[count] = yycodebuf[c+count];\r
+        count++;\r
+      }\r
+      else\r
+        last++;\r
+    }\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+    sum = count + (c&0x00FF) + ((c&0xFF00)>>8);\r
+#else\r
+    sum = count + (c&0x00FFL) + ((c&0xFF00L)>>8);\r
+#endif\r
+\r
+    fprintf(out, ":%02X%04X00",count,c);\r
+\r
+    for(i=0;i<count;i++)\r
+    {\r
+      fprintf(out, "%02X",line[i]);\r
+      sum+=line[i];\r
+    }\r
+    fprintf(out, "%02X\n",0x100-sum&0xFF);\r
+\r
+    c+=count;\r
+  }\r
+\r
+  /// End of file record /////////////////////////////////////////////////////\r
+\r
+  fprintf(out, ":00000001FF\n");\r
+  fclose(out);\r
+\r
+  /// Save rom output file ///////////////////////////////////////////////////\r
+\r
+  if(!yyromfilename[0])\r
+    return TRUE;\r
+\r
+  if(!yyerompos && !yyeromposhigh)\r
+  {\r
+    message(M_EMPTY_ROM_FILE);\r
+    return TRUE;\r
+  }\r
+\r
+  if(! (out= fopen(yyromfilename,"w")) )\r
+    errorexit(X_UNABLE_TO_OPEN_ROMFILE, yyromfilename);\r
+\r
+  /// Address extension record, offset 0x0000 ////////////////////////////////\r
+\r
+  if(yycfg -> addressext)\r
+    fprintf(out, ":020000020000FC\n");\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  c = 0;\r
+\r
+  while(c<yyerompos)\r
+  {\r
+    count = 0;\r
+    last  = 0;\r
+\r
+    while(!yyeromusage[c])\r
+      c++;\r
+\r
+    while( (count<16) && !last )\r
+    {\r
+      if(yyeromusage[c+count])\r
+        line[count++] = yyerombuf[c+count];\r
+      else\r
+        last++;\r
+    }\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+    sum = count + (c&0x00FF) + ((c&0xFF00)>>8);\r
+#else\r
+    sum = count + (c&0x00FFL) + ((c&0xFF00L)>>8);\r
+#endif\r
+\r
+    fprintf(out, ":%02X%04X00",count,c);\r
+\r
+    for(i=0;i<count;i++)\r
+    {\r
+      fprintf(out, "%02X",line[i]);\r
+      sum+=line[i];\r
+    }\r
+    fprintf(out, "%02X\n",0x100-sum&0xFF);\r
+\r
+    c+=count;\r
+  }\r
+\r
+  /// End of file record /////////////////////////////////////////////////////\r
+\r
+  fprintf(out, ":00000001FF\n");\r
+  fclose(out);\r
+\r
+  return TRUE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  //  Save generic format\r
+  //\r
+\r
+int saveGeneric(void)\r
+{\r
+  int  c;\r
+  FILE *out;\r
+\r
+  /// Save code output file //////////////////////////////////////////////////\r
+\r
+  if(!yyoutfilename[0])\r
+    return TRUE;\r
+\r
+  if(! (out= fopen(yyoutfilename,"w")) )\r
+    errorexit(X_UNABLE_TO_OPEN_OUTFILE, yyoutfilename);\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  if(!yycodepos)\r
+    message(M_EMPTY_CODE);\r
+\r
+  c = 0;\r
+\r
+  for(c=0;c<yycodepos;c+=2)\r
+    if(yycodeusage[c])\r
+      fprintf(out, "%06x:%04x\n",c/2,yycodebuf[c]+yycodebuf[c+1]*0x100);\r
+\r
+  fclose(out);\r
+\r
+  /// Save rom output file ///////////////////////////////////////////////////\r
+\r
+  if(!yyromfilename[0])\r
+    return TRUE;\r
+\r
+  if(!yyerompos && !yyeromposhigh)\r
+  {\r
+    message(M_EMPTY_ROM_FILE);\r
+    return TRUE;\r
+  }\r
+\r
+  if(! (out= fopen(yyromfilename,"w")) )\r
+    errorexit(X_UNABLE_TO_OPEN_ROMFILE, yyromfilename);\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  c = 0;\r
+\r
+  for(c=0;c<yyerompos;c++)\r
+    if(yyeromusage[c])\r
+      fprintf(out, "%04x:%02x\n",c,yyerombuf[c]);\r
+\r
+  fclose(out);\r
+\r
+  return TRUE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  //  Save ATMEL .obj format\r
+  //\r
+\r
+int saveObj(void)\r
+{\r
+  int  c;\r
+  FILE *out;\r
+  int offset=0;\r
+\r
+  /// Save code output file //////////////////////////////////////////////////\r
+\r
+  if(!yyoutfilename[0])\r
+    return TRUE;\r
+\r
+  if(! (out= fopen(yyoutfilename,"wb")) )\r
+    errorexit(X_UNABLE_TO_OPEN_OUTFILE, yyoutfilename);\r
+\r
+  if(yyromfilename[0])\r
+    message(M_NOT_SAVE_EROM_OBJ);\r
+\r
+  /// Get size of obj code (offset to filenames) /////////////////////////////\r
+\r
+  if(!yycodepos)\r
+    message(M_EMPTY_CODE);\r
+\r
+  for(c=0;c<yycodepos;c+=2)\r
+    if(yycodeusage[c]&&yycodeline[c])\r
+      offset++;\r
+\r
+  offset *= 9;\r
+  offset += 0x1A;\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+  fputc( (offset & 0xFF000000)>>24, out);\r
+  fputc( (offset & 0x00FF0000)>>16, out);\r
+  fputc( (offset & 0x0000FF00)>> 8, out);\r
+  fputc( (offset & 0x000000FF)>> 0, out);\r
+\r
+  fputc( ( 0x1A  & 0xFF000000)>>24, out);\r
+  fputc( ( 0x1A  & 0x00FF0000)>>16, out);\r
+  fputc( ( 0x1A  & 0x0000FF00)>> 8, out);\r
+  fputc( ( 0x1A  & 0x000000FF)>> 0, out);\r
+#else\r
+  fputc( (offset & 0xFF000000L)>>24, out);\r
+  fputc( (offset & 0x00FF0000L)>>16, out);\r
+  fputc( (offset & 0x0000FF00L)>> 8, out);\r
+  fputc( (offset & 0x000000FFL)>> 0, out);\r
+\r
+  fputc( ( 0x1A  & 0xFF000000L)>>24, out);\r
+  fputc( ( 0x1A  & 0x00FF0000L)>>16, out);\r
+  fputc( ( 0x1A  & 0x0000FF00L)>> 8, out);\r
+  fputc( ( 0x1A  & 0x000000FFL)>> 0, out);\r
+#endif\r
+\r
+  fputc( 0x09, out);\r
+  fputc( yyfilecount, out);\r
+  fputs( "AVR Object File", out);\r
+  fputc(0, out);\r
+\r
+  for(c=0;c<yycodepos;c+=2)\r
+  {\r
+    if(yycodeusage[c]&&yycodeline[c])\r
+    {\r
+#ifdef _MSC_VER /* Nick */\r
+      fputc( (c/2    & 0x00FF0000)>>16, out);\r
+      fputc( (c/2    & 0x0000FF00)>> 8, out);\r
+      fputc( (c/2    & 0x000000FF)>> 0, out);\r
+      fputc( (yycodebuf[c+1]   & 0x00FF) >> 0, out);\r
+      fputc( (yycodebuf[c]     & 0x00FF) >> 0, out);\r
+      fputc( (yycodeusage[c]-1 & 0x007F) >> 0, out);\r
+      fputc( (yycodeline[c]    & 0xFF00) >> 8, out);\r
+      fputc( (yycodeline[c]    & 0x00FF) >> 0, out);\r
+      fputc( (yycodeusage[c]   & 0x0080) != 0, out);\r
+#else\r
+      fputc( (c/2    & 0x00FF0000L)>>16, out);\r
+      fputc( (c/2    & 0x0000FF00L)>> 8, out);\r
+      fputc( (c/2    & 0x000000FFL)>> 0, out);\r
+      fputc( (yycodebuf[c+1]   & 0x00FFL) >> 0, out);\r
+      fputc( (yycodebuf[c]     & 0x00FFL) >> 0, out);\r
+      fputc( (yycodeusage[c]-1 & 0x007FL) >> 0, out);\r
+      fputc( (yycodeline[c]    & 0xFF00L) >> 8, out);\r
+      fputc( (yycodeline[c]    & 0x00FFL) >> 0, out);\r
+      fputc( (yycodeusage[c]   & 0x0080L) != 0, out);\r
+#endif\r
+    }\r
+  }\r
+\r
+  for(c=0;c<yyfilecount;c++)\r
+  {\r
+    fputs(yyfilelist[c], out);\r
+    fputc(0, out);\r
+  }\r
+\r
+  fputc(0, out);\r
+\r
+  fclose(out);\r
+\r
+  return TRUE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Save Motorola S-record\r
+  //\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  //  Motorola S-Record File Format (8-bit Systems Only)\r
+  //\r
+  //  The Motorola S-Record File Format is a printable ASCII format consisting\r
+  //  of an optional header record, and one or more data records followed by\r
+  //  an end of file record. Data records may appear in any order. Values are\r
+  //  represented as 2 or 4 hexadecimal digit values.\r
+  //\r
+  //  Record Format\r
+  //  SNLLAAAADDDD......DDDDCC\r
+  //\r
+  //   S    Start of record mark (letter S).\r
+  //\r
+  //   N    Record type field. 0 for header, 1 for data, 9 for end of record.\r
+  //        All other record types are ignored in 8-bit systems.\r
+  //\r
+  //   LL   Length field. Number of bytes to follow.\r
+  //\r
+  //   AAAA Address field. Address of first byte.\r
+  //\r
+  //   DD   Data field.\r
+  //\r
+  //   CC   Checksum field. One's complement of the length, address\r
+  //        and data fields modulo 256 minus 1.\r
+  //\r
+  //  Motorola S records\r
+  //\r
+  //  The record length, address, code/data, and checksum fields are\r
+  //  hexadecimal bytes coded in ASCII: 00 is the value 0, 01 the\r
+  //  value 1, etc. The record length is the number of data bytes\r
+  //  (two hex digits) including the address, code/data,\r
+  //  and checksum fields. The checksum field contains the one's\r
+  //  complement of the sum of all the bytes from the record\r
+  //  length field through the end of the code/data field.\r
+  //\r
+  //  Each record can be terminated with either a carriage return, line feed,\r
+  //  or a nul (zero) character.\r
+  //\r
+  //  The record types are as follows:\r
+  //\r
+  //  S0  Header record for each block of S records which may contain\r
+  //      descriptive information identifying the following\r
+  //      block of S records. The address field is typically zeros.\r
+  //      The code/data field of an S0 record typically contains a\r
+  //      "hexified" ASCII string.\r
+  //\r
+  //  S1  Code or data record containing a 2-byte address (4 hex digit addr.).\r
+  //\r
+  //  S2  Code or data record containing a 3-byte address (6 hex digit addr.).\r
+  //\r
+  //  S3  Code or data record containing a 4-byte address (8 hex digit addr.).\r
+  //\r
+  //  S5  Count record containing the number of S1, S2, and S3 records\r
+  //      transmitted in a block. The count appears in the\r
+  //      address field, and there is no code/data field.\r
+  //\r
+  //  S7  Termination record for a block of S records. A 4-byte address\r
+  //      contains the address where execution starts.\r
+  //      There is no code/data field.\r
+  //\r
+  //  S8  Termination record for a block of S records. A 3-byte address\r
+  //      contains the address where execution starts.\r
+  //      There is no code/data field.\r
+  //\r
+  //  S9  Termination record for a block of S records. A 2-byte address\r
+  //      contains the address where execution starts.\r
+  //      There is no code or data field.\r
+  //\r
+\r
+int saveMotorola(void)\r
+{\r
+  int  c, i;\r
+  FILE *out;\r
+  int  count;\r
+  int  sum;\r
+  int  last;\r
+  int  line[20];\r
+\r
+  /// Save code output file //////////////////////////////////////////////////\r
+\r
+  if(!yyoutfilename[0])\r
+    return TRUE;\r
+\r
+  if(! (out= fopen(yyoutfilename,"w")) )\r
+    errorexit(X_UNABLE_TO_OPEN_OUTFILE, yyoutfilename);\r
+\r
+  /// Insert filename in header //////////////////////////////////////////////\r
+\r
+  fprintf(out, "S0%02X0000",(int)strlen(yyoutfilename)+3);\r
+  sum=strlen(yyoutfilename)+3;\r
+  for(c=0;c<(int)strlen(yyoutfilename);c++)\r
+  {\r
+    fprintf(out, "%02X",yyoutfilename[c]);\r
+    sum+=yyoutfilename[c];\r
+  }\r
+  fprintf(out, "%02X\n",0x100 - (sum&0xFF) - 1);\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  if(!yycodepos)\r
+    message(M_EMPTY_CODE);\r
+\r
+  c = 0;\r
+\r
+  while(c<yycodepos)\r
+  {\r
+    count = 0;\r
+    last  = 0;\r
+\r
+    while(!yycodeusage[c])\r
+      c++;\r
+\r
+    while( (count<16) && !last )\r
+    {\r
+      if(yycodeusage[c+count])\r
+        line[count++] = yycodebuf[c+count];\r
+      else\r
+        last++;\r
+    }\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+    sum = count + (c&0x00FF) + ((c&0xFF00)>>8) + 3;\r
+#else\r
+    sum = count + (c&0x00FFL) + ((c&0xFF00L)>>8) + 3;\r
+#endif\r
+\r
+    fprintf(out, "S1%02X%04X",count+3,c);\r
+\r
+    for(i=0;i<count;i++)\r
+    {\r
+      fprintf(out, "%02X",line[i]);\r
+      sum+=line[i];\r
+    }\r
+    fprintf(out, "%02X\n",0x100-(sum&0xFF)-1 );\r
+\r
+    c+=count;\r
+  }\r
+\r
+  /// End of file record /////////////////////////////////////////////////////\r
+\r
+  fprintf(out, "S9030000FC\n");\r
+  fclose(out);\r
+\r
+  /// Save rom output file ///////////////////////////////////////////////////\r
+\r
+  if(!yyromfilename[0])\r
+    return TRUE;\r
+\r
+  if(!yyerompos && !yyeromposhigh)\r
+  {\r
+    message(M_EMPTY_ROM_FILE);\r
+    return TRUE;\r
+  }\r
+\r
+  if(! (out= fopen(yyromfilename,"w")) )\r
+    errorexit(X_UNABLE_TO_OPEN_ROMFILE, yyromfilename);\r
+\r
+  /// Insert filename in header //////////////////////////////////////////////\r
+\r
+  fprintf(out, "S0%02X0000",(int)strlen(yyromfilename)+3);\r
+  sum=strlen(yyromfilename)+3;\r
+  for(c=0;c<(int)strlen(yyromfilename);c++)\r
+  {\r
+    fprintf(out, "%02X",yyromfilename[c]);\r
+    sum+=yyromfilename[c];\r
+  }\r
+\r
+  fprintf(out, "%02X\n",0x100 - (sum&0xFF) - 1);\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  c = 0;\r
+\r
+  while(c<yyerompos)\r
+  {\r
+    count = 0;\r
+    last  = 0;\r
+\r
+    while(!yyeromusage[c])\r
+      c++;\r
+\r
+    while( (count<16) && !last )\r
+    {\r
+      if(yyeromusage[c+count])\r
+        line[count++] = yyerombuf[c+count];\r
+      else\r
+        last++;\r
+    }\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+    sum = count + (c&0x00FF) + ((c&0xFF00)>>8) + 3;\r
+#else\r
+    sum = count + (c&0x00FFL) + ((c&0xFF00L)>>8) + 3;\r
+#endif\r
+\r
+    fprintf(out, "S1%02X%04X",count+3,c);\r
+\r
+    for(i=0;i<count;i++)\r
+    {\r
+      fprintf(out, "%02X",line[i]);\r
+      sum+=line[i];\r
+    }\r
+    fprintf(out, "%02X\n",0x100-(sum&0xFF)-1 );\r
+\r
+    c+=count;\r
+  }\r
+\r
+  /// End of file record /////////////////////////////////////////////////////\r
+\r
+  fprintf(out, "S9030000FC\n");\r
+  fclose(out);\r
+\r
+  return TRUE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  //  Save binary format\r
+  //\r
+\r
+int saveBin(void)\r
+{\r
+  int  c;\r
+  FILE *out;\r
+\r
+  /// Save code output file //////////////////////////////////////////////////\r
+\r
+  if(!yyoutfilename[0])\r
+    return TRUE;\r
+\r
+  if(! (out= fopen(yyoutfilename,"wb")) )\r
+    errorexit(X_UNABLE_TO_OPEN_OUTFILE, yyoutfilename);\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  if(!yycodepos)\r
+    message(M_EMPTY_CODE);\r
+\r
+  c = 0;\r
+\r
+  for(c=0;c<yycodepos;c++)\r
+    fputc(yycodebuf[c], out);\r
+\r
+  fclose(out);\r
+\r
+  /// Save rom output file ///////////////////////////////////////////////////\r
+\r
+  if(!yyromfilename[0])\r
+    return TRUE;\r
+\r
+  if(!yyerompos && !yyeromposhigh)\r
+  {\r
+    message(M_EMPTY_ROM_FILE);\r
+    return TRUE;\r
+  }\r
+\r
+  if(! (out= fopen(yyromfilename,"wb")) )\r
+    errorexit(X_UNABLE_TO_OPEN_ROMFILE, yyromfilename);\r
+\r
+  /// Save data //////////////////////////////////////////////////////////////\r
+\r
+  c = 0;\r
+\r
+  for(c=0;c<yyerompos;c++)\r
+    fputc(yyerombuf[c], out);\r
+\r
+  fclose(out);\r
+\r
+  return TRUE;\r
+}\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/avrasm.hh b/src/mkutil/tavrasm.118/src/avrasm.hh
new file mode 100644 (file)
index 0000000..98dcc8d
--- /dev/null
@@ -0,0 +1,300 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : avrasm.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : AVR assembler header file\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//  001101     : Brian Rhodefer - Added globals for command-line include search paths\r
+//  010112     : Tom - Increased max id length to 64\r
+//  021218     : Andreas Schwarz <andreas-s@web.de> increased MAX_DEVICES from 13 to 23\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _AVRASM_HH_\r
+#define _AVRASM_HH_\r
+\r
+#ifndef _MSC_VER /* Nick */\r
+typedef int bool;\r
+#endif\r
+\r
+/// Defines //////////////////////////////////////////////////////////////////\r
+\r
+#define FALSE                             0  // No\r
+#define TRUE                           (!0)  // Yes\r
+\r
+#ifdef _MSC_VER /* Nick original definition: */\r
+#define MAX_CODE_SIZE              0x100000  // Code size in bytes\r
+#define MAX_EROM_SIZE               0x10000  // Erom size in bytes\r
+#define MAX_LINE_LENGTH             (255+3)  // Maximum length of input lines\r
+#define MAX_ID_LENGTH                    64  // name defined as MAX_ID_LEN+1\r
+#define MAX_DEVICE_NAME_LENGTH           16  // Like "90S1200"\r
+#define MAX_DEVICES                      23  // Update with "devices.hh"\r
+#define MAX_FILENAME_LENGTH             512  // Should be changed to platform\r
+#else /* Nick reduced for 16-bit version: */\r
+#define MAX_CODE_SIZE                0x4000  // Code size in bytes\r
+#define MAX_EROM_SIZE                 0x400  // Erom size in bytes\r
+#define MAX_LINE_LENGTH             (255+3)  // Maximum length of input lines\r
+#define MAX_ID_LENGTH                    32  // name defined as MAX_ID_LEN+1\r
+#define MAX_DEVICE_NAME_LENGTH           16  // Like "90S1200"\r
+#define MAX_DEVICES                      23  // Update with "devices.hh"\r
+#define MAX_FILENAME_LENGTH              16  // Should be changed to platform\r
+#endif\r
+#define MAX_INCPATH_LENGTH              512  // Should be changed to platform\r
+#define MAX_CONTEXT_DEPTH                32  // Depth of macros/include files\r
+#define MAX_FILES                       127  // Files/includes (don't change)\r
+#define MAX_INCPATH_QTY                          8  // Max number of include search dirs\r
+\r
+#define VERSIONSTR                   "1.18"  // Version\r
+\r
+#define SEGMENT_CODE                      1  // CSEG\r
+#define SEGMENT_DATA                      2  // DSEG\r
+#define SEGMENT_EEPROM                    3  // ESEG\r
+#define SEGMENT_DEFINE_BYTE               1  // '.byte' in ESEG\r
+\r
+#define LIST_NO                           1  // .nolist\r
+#define LIST_NO_MACRO                     2  // .nolistmac\r
+#define LIST_YES_MACRO                    3  // .listmac\r
+#define LIST_YES                          4  // .list\r
+\r
+  /// Command line info //////////////////////////////////////////////////////\r
+\r
+#define INFOSTR   "Toms AVR macro assembler version "VERSIONSTR" ("__DATE__ \\r
+                  ")\nCopyright (C) 2000 - Tom Mortensen\n"                 \\r
+                 "E-mail: tom@tavrasm.org  WWW: http://www.tavrasm.org\n"\r
+\r
+/// Supported instructions ///////////////////////////////////////////////////\r
+\r
+#define S_ADIW      (1<< 0)\r
+#define S_ICALL     (1<< 1)\r
+#define S_CALL      (1<< 2)\r
+#define S_IJMP      (1<< 3)\r
+#define S_JMP       (1<< 4)\r
+#define S_LD        (1<< 5)\r
+#define S_LDD       (1<< 6)\r
+#define S_LDS       (1<< 7)\r
+#define S_LPM       (1<< 8)\r
+#define S_MUL       (1<< 9)\r
+#define S_PUSH      (1<<10)\r
+#define S_POP       (1<<11)\r
+#define S_SBIW      (1<<12)\r
+#define S_ST        (1<<13)\r
+#define S_STD       (1<<14)\r
+#define S_STS       (1<<15)\r
+#define S_EIJMP     (1<<16)\r
+#define S_EICALL    (1<<17)\r
+#define S_ESPM      (1<<18)\r
+#define S_MULSU     (1<<19)\r
+#define S_FMUL      (1<<20)\r
+#define S_FMULS     (1<<21)\r
+#define S_FMULSU    (1<<22)\r
+#define S_MULS      (1<<23)\r
+#define S_MOVW      (1<<24)\r
+#define S_ELPM      (1<<25)\r
+#define S_SPM       (1<<26)\r
+\r
+#define S_EXTENDED  (0xFFFF0000)\r
+\r
+/// Macros ///////////////////////////////////////////////////////////////////\r
+\r
+#define STRIPNR(s)    {char* pos;if((pos=strpbrk(s,"\r\n"))&&(*pos='\0'));}\r
+#define STRIPWS(s)    {char* pos;if((pos=strpbrk(s,"\v\t \r\n")))*pos='\0';}\r
+#define DEVINF        yydevices[yydeviceno]\r
+#define ISUSED(s)     (s->macro||s->isvar||s->valid||s->isdefine)\r
+#define MSG(m)        messages[MESSAGE_OFFSET_MESSAGES+m]\r
+#define CONTEXT       yycontextstack[yycontext]\r
+#define ISMACRO       (yycontextstack[yycontext]->ismacro)\r
+#define CHECKREG(r,d) { if(r<0) r = d; else if(r>31) internalerror("REG"); } \r
+\r
+/// Globals //////////////////////////////////////////////////////////////////\r
+\r
+#define GLOBALS(asextern)                                               \\r
+asextern        int             yyline;                                 \\r
+asextern        int             yyoffset;                               \\r
+asextern        int             yyeromoffset;                           \\r
+asextern        int             yydataoffset;                           \\r
+asextern        int             yycodepos;                              \\r
+asextern        int             yyerompos;                              \\r
+asextern        int             yydatapos;                              \\r
+asextern        int             yycodeposhigh;                          \\r
+asextern        int             yyeromposhigh;                          \\r
+asextern        int             yydataposhigh;                          \\r
+asextern        int             yyparseno;                              \\r
+asextern        int             yyerrorcount;                           \\r
+asextern        int             yyerrorline;                            \\r
+asextern        int             yywarningline;                          \\r
+asextern        int             yywarningcount;                         \\r
+asextern        int             yysegment;                              \\r
+asextern        int             yydefinestart;                          \\r
+asextern        int             yyinmacro;                              \\r
+asextern        int             yycontext;                              \\r
+asextern        int             yydeviceno;                             \\r
+asextern        int             yydefinetype;                           \\r
+asextern        int             yylist;                                 \\r
+asextern        int             yylistmacro;                            \\r
+asextern        int             yyfirstmacroline;                       \\r
+asextern        int             yyinmacrodef;                           \\r
+asextern        int             yyfileno;                               \\r
+asextern        int             yyfilecount;                            \\r
+asextern        int             yyeol;                                  \\r
+asextern        int            yyIncPathCount;                         \\r
+asextern        char            *yylinetxt;                             \\r
+asextern        char            *yyinline;                              \\r
+asextern        char            *yyinlinenew;                           \\r
+asextern        char            *yyinlineold;                           \\r
+asextern        char            *yyfilename;                            \\r
+asextern        char            *yyromfilename;                         \\r
+asextern        char            *yylogfilename;                         \\r
+asextern        char            *yyoutfilename;                         \\r
+asextern        char            *yyfilelist[MAX_FILES];                 \\r
+asextern        char            *yyIncludePaths[MAX_INCPATH_QTY];       \\r
+asextern        unsigned char   *yycodebuf;                             \\r
+asextern        unsigned char   *yyerombuf;                             \\r
+asextern        unsigned char   *yycodeusage;                           \\r
+asextern        unsigned char   *yyeromusage;                           \\r
+asextern        unsigned short  *yycodeline;                            \\r
+asextern        configuration   *yycfg;                                 \\r
+asextern        symbolTable*    symtab;                                 \\r
+asextern        context         *yycontextstack[MAX_CONTEXT_DEPTH];     \\r
+asextern        symbolTable     *yysymbolstack[MAX_CONTEXT_DEPTH];      \\r
+asextern        deviceinfo      yydevices[MAX_DEVICES];                 \\r
+asextern        FILE*           yyin2;                                  \\r
+asextern        FILE*           yylogfile;                              \\r
+asextern        char            yylast_used_label[MAX_ID_LENGTH+1];\r
+\r
+/// Init Globals /////////////////////////////////////////////////////////////\r
+\r
+#define INITEXTERN                                                      \\r
+{                                                                       \\r
+  yyline                = 1;                                            \\r
+  yyoffset              = 0;                                            \\r
+  yyeromoffset          = 0;                                            \\r
+  yydataoffset          = 0;                                            \\r
+  yycodepos             = 0;                                            \\r
+  yyerompos             = 0;                                            \\r
+  yydatapos             = 96;                                           \\r
+  yycodeposhigh         = 0;                                            \\r
+  yyeromposhigh         = 0;                                            \\r
+  yydataposhigh         = 0;                                            \\r
+  yyerrorcount          = 0;                                            \\r
+  yywarningcount        = 0;                                            \\r
+  yydefinestart         = -1;                                           \\r
+  yysegment             = SEGMENT_CODE;                                 \\r
+  yyinmacro             = FALSE;                                        \\r
+  yycontext             = 0;                                            \\r
+  yyerrorline           =-1;                                            \\r
+  yywarningline         = -1;                                           \\r
+  yydeviceno            = 0;                                            \\r
+  yydefinetype          = 0;                                            \\r
+  yylist                = TRUE;                                         \\r
+  yylistmacro           = FALSE;                                        \\r
+  yyfirstmacroline      = FALSE;                                        \\r
+  yyinmacrodef          = FALSE;                                        \\r
+  yyfileno              = 1;                                            \\r
+  yyeol                 = FALSE;                                        \\r
+  yylast_used_label[0]  = '\0';                                         \\r
+}\r
+\r
+/// Configuration ////////////////////////////////////////////////////////////\r
+\r
+struct configuration\r
+{\r
+        char            aligndb;        // Allow byte alignment\r
+        char            casesensitive;  // Case sensitive labels/vars\r
+        char            cutlog;         // Limit logfile width to 80 chars\r
+        char            info;           // Show info after compilation\r
+        char            warnings;       // Print warnings\r
+        char            local_labels;   // Allow local loabels\r
+        char            motorola;       // Output Motorola S-record format\r
+        char            intel;          // Output Intel HEX format\r
+        char            obj;            // Output ATMEL .obj format\r
+        bool           hex;            // Output generic hex\r
+        char            bin;            // Output binary format\r
+        bool           wrap;           // Wrap in relative jumps/branches\r
+        bool            forwardorg;     // Allow .org to jump around\r
+        bool           addressext;     // Include address extension record\r
+};\r
+\r
+/// Device info //////////////////////////////////////////////////////////////\r
+\r
+struct deviceinfo {\r
+        char    name[MAX_DEVICE_NAME_LENGTH+1]; // Device name\r
+        int     datastart;                      // Registers + I/O ports\r
+        int     ramsize;                        // Size of ram\r
+        int     eepromsize;                     // Size of EEPROM\r
+        int     flashsize;                      // Size of flash (in words)\r
+        int     supported;                      // Unsupported instructions\r
+};\r
+\r
+/// Types ////////////////////////////////////////////////////////////////////\r
+\r
+struct context\r
+{\r
+        // Regular file\r
+\r
+        char            filename[MAX_FILENAME_LENGTH];\r
+        int             line;\r
+        FILE            *file;\r
+        FILE            *file2;\r
+\r
+        // Macro\r
+\r
+        int             ismacro;\r
+        char            *macstr;\r
+        int             offset;\r
+        int             eromoffset;\r
+        int             dataoffset;\r
+        int             stringpos;\r
+\r
+        // Line buffers\r
+\r
+        char            yyinline[MAX_LINE_LENGTH+1];\r
+        char            yyinlinenew[MAX_LINE_LENGTH+1];\r
+        char            yyinlineold[MAX_LINE_LENGTH+1];\r
+};\r
+\r
+/// Prototypes ///////////////////////////////////////////////////////////////\r
+\r
+void yyerror(char *s);\r
+int  getargs(int argc, char **args);\r
+int  saveIHF(void);\r
+int  saveGeneric(void);\r
+int  saveObj(void);\r
+int  saveMotorola(void);\r
+int  saveBin(void);\r
+\r
+#endif /* _AVRASM_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/avrlex.cc b/src/mkutil/tavrasm.118/src/avrlex.cc
new file mode 100644 (file)
index 0000000..b4f3abc
--- /dev/null
@@ -0,0 +1,3202 @@
+/* #line 2 "avrlex.cc" */\r
+/* A lexical scanner generated by flex */\r
+\r
+/* Scanner skeleton version:\r
+ * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $\r
+ */\r
+\r
+#define FLEX_SCANNER\r
+#define YY_FLEX_MAJOR_VERSION 2\r
+#define YY_FLEX_MINOR_VERSION 5\r
+\r
+#include <stdio.h>\r
+#ifdef _MSC_VER /* Nick */\r
+#include <windows.h>\r
+/* #else */\r
+/* #include <unistd.h> */\r
+#endif\r
+\r
+\r
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */\r
+#ifdef c_plusplus\r
+#ifndef __cplusplus\r
+#define __cplusplus\r
+#endif\r
+#endif\r
+\r
+\r
+#ifdef __cplusplus\r
+\r
+#include <stdlib.h>\r
+\r
+/* Use prototypes in function declarations. */\r
+#define YY_USE_PROTOS\r
+\r
+/* The "const" storage-class-modifier is valid. */\r
+#define YY_USE_CONST\r
+\r
+#else  /* ! __cplusplus */\r
+\r
+#if __STDC__\r
+\r
+#define YY_USE_PROTOS\r
+#define YY_USE_CONST\r
+\r
+#endif /* __STDC__ */\r
+#endif /* ! __cplusplus */\r
+\r
+#ifdef __TURBOC__\r
+ #pragma warn -rch\r
+ #pragma warn -use\r
+#include <io.h>\r
+#include <stdlib.h>\r
+#define YY_USE_CONST\r
+#define YY_USE_PROTOS\r
+#endif\r
+\r
+#ifdef YY_USE_CONST\r
+#define yyconst const\r
+#else\r
+#define yyconst\r
+#endif\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+#define YY_PROTO(proto) proto\r
+#else\r
+#define YY_PROTO(proto) ()\r
+#endif\r
+\r
+/* Returned upon end-of-file. */\r
+#define YY_NULL 0\r
+\r
+/* Promotes a possibly negative, possibly signed char to an unsigned\r
+ * integer for use as an array index.  If the signed char is negative,\r
+ * we want to instead treat it as an 8-bit unsigned char, hence the\r
+ * double cast.\r
+ */\r
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)\r
+\r
+/* Enter a start condition.  This macro really ought to take a parameter,\r
+ * but we do it the disgusting crufty way forced on us by the ()-less\r
+ * definition of BEGIN.\r
+ */\r
+#define BEGIN yy_start = 1 + 2 *\r
+\r
+/* Translate the current start state into a value that can be later handed\r
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex\r
+ * compatibility.\r
+ */\r
+#define YY_START ((yy_start - 1) / 2)\r
+#define YYSTATE YY_START\r
+\r
+/* Action number for EOF rule of a given start state. */\r
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)\r
+\r
+/* Special action meaning "start processing a new file". */\r
+#define YY_NEW_FILE yyrestart( yyin )\r
+\r
+#define YY_END_OF_BUFFER_CHAR 0\r
+\r
+/* Size of default input buffer. */\r
+#define YY_BUF_SIZE 16384\r
+\r
+typedef struct yy_buffer_state *YY_BUFFER_STATE;\r
+\r
+extern int yyleng;\r
+extern FILE *yyin, *yyout;\r
+\r
+#define EOB_ACT_CONTINUE_SCAN 0\r
+#define EOB_ACT_END_OF_FILE 1\r
+#define EOB_ACT_LAST_MATCH 2\r
+\r
+/* The funky do-while in the following #define is used to turn the definition\r
+ * int a single C statement (which needs a semi-colon terminator).  This\r
+ * avoids problems with code like:\r
+ *\r
+ *     if ( condition_holds )\r
+ *             yyless( 5 );\r
+ *     else\r
+ *             do_something_else();\r
+ *\r
+ * Prior to using the do-while the compiler would get upset at the\r
+ * "else" because it interpreted the "if" statement as being all\r
+ * done when it reached the ';' after the yyless() call.\r
+ */\r
+\r
+/* Return all but the first 'n' matched characters back to the input stream. */\r
+\r
+#define yyless(n) \\r
+       do \\r
+               { \\r
+               /* Undo effects of setting up yytext. */ \\r
+               *yy_cp = yy_hold_char; \\r
+               YY_RESTORE_YY_MORE_OFFSET \\r
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \\r
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \\r
+               } \\r
+       while ( 0 )\r
+\r
+#define unput(c) yyunput( c, yytext_ptr )\r
+\r
+/* The following is because we cannot portably get our hands on size_t\r
+ * (without autoconf's help, which isn't available because we want\r
+ * flex-generated scanners to compile on their own).\r
+ */\r
+typedef unsigned int yy_size_t;\r
+\r
+\r
+struct yy_buffer_state\r
+       {\r
+       FILE *yy_input_file;\r
+\r
+       char *yy_ch_buf;                /* input buffer */\r
+       char *yy_buf_pos;               /* current position in input buffer */\r
+\r
+       /* Size of input buffer in bytes, not including room for EOB\r
+        * characters.\r
+        */\r
+       yy_size_t yy_buf_size;\r
+\r
+       /* Number of characters read into yy_ch_buf, not including EOB\r
+        * characters.\r
+        */\r
+       int yy_n_chars;\r
+\r
+       /* Whether we "own" the buffer - i.e., we know we created it,\r
+        * and can realloc() it to grow it, and should free() it to\r
+        * delete it.\r
+        */\r
+       int yy_is_our_buffer;\r
+\r
+       /* Whether this is an "interactive" input source; if so, and\r
+        * if we're using stdio for input, then we want to use getc()\r
+        * instead of fread(), to make sure we stop fetching input after\r
+        * each newline.\r
+        */\r
+       int yy_is_interactive;\r
+\r
+       /* Whether we're considered to be at the beginning of a line.\r
+        * If so, '^' rules will be active on the next match, otherwise\r
+        * not.\r
+        */\r
+       int yy_at_bol;\r
+\r
+       /* Whether to try to fill the input buffer when we reach the\r
+        * end of it.\r
+        */\r
+       int yy_fill_buffer;\r
+\r
+       int yy_buffer_status;\r
+#define YY_BUFFER_NEW 0\r
+#define YY_BUFFER_NORMAL 1\r
+       /* When an EOF's been seen but there's still some text to process\r
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we\r
+        * shouldn't try reading from the input source any more.  We might\r
+        * still have a bunch of tokens to match, though, because of\r
+        * possible backing-up.\r
+        *\r
+        * When we actually see the EOF, we change the status to "new"\r
+        * (via yyrestart()), so that the user can continue scanning by\r
+        * just pointing yyin at a new input file.\r
+        */\r
+#define YY_BUFFER_EOF_PENDING 2\r
+       };\r
+\r
+static YY_BUFFER_STATE yy_current_buffer = 0;\r
+\r
+/* We provide macros for accessing buffer states in case in the\r
+ * future we want to put the buffer states in a more general\r
+ * "scanner state".\r
+ */\r
+#define YY_CURRENT_BUFFER yy_current_buffer\r
+\r
+\r
+/* yy_hold_char holds the character lost when yytext is formed. */\r
+static char yy_hold_char;\r
+\r
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */\r
+\r
+\r
+int yyleng;\r
+\r
+/* Points to current character in buffer. */\r
+static char *yy_c_buf_p = (char *) 0;\r
+static int yy_init = 1;                /* whether we need to initialize */\r
+static int yy_start = 0;       /* start state number */\r
+\r
+/* Flag which is used to allow yywrap()'s to do buffer switches\r
+ * instead of setting up a fresh yyin.  A bit of a hack ...\r
+ */\r
+static int yy_did_buffer_switch_on_eof;\r
+\r
+void yyrestart YY_PROTO(( FILE *input_file ));\r
+\r
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));\r
+void yy_load_buffer_state YY_PROTO(( void ));\r
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));\r
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));\r
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));\r
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));\r
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )\r
+\r
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));\r
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));\r
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));\r
+\r
+/* Nick static */ void *yy_flex_alloc YY_PROTO(( yy_size_t ));\r
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));\r
+/* Nick static */ void yy_flex_free YY_PROTO(( void * ));\r
+\r
+#define yy_new_buffer yy_create_buffer\r
+\r
+#define yy_set_interactive(is_interactive) \\r
+       { \\r
+       if ( ! yy_current_buffer ) \\r
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \\r
+       yy_current_buffer->yy_is_interactive = is_interactive; \\r
+       }\r
+\r
+#define yy_set_bol(at_bol) \\r
+       { \\r
+       if ( ! yy_current_buffer ) \\r
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \\r
+       yy_current_buffer->yy_at_bol = at_bol; \\r
+       }\r
+\r
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)\r
+\r
+\r
+#define yywrap() 1\r
+#define YY_SKIP_YYWRAP\r
+typedef unsigned char YY_CHAR;\r
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;\r
+typedef int yy_state_type;\r
+extern char *yytext;\r
+#define yytext_ptr yytext\r
+\r
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));\r
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));\r
+static int yy_get_next_buffer YY_PROTO(( void ));\r
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));\r
+\r
+/* Done after the current pattern has been matched and before the\r
+ * corresponding action - sets up yytext.\r
+ */\r
+#define YY_DO_BEFORE_ACTION \\r
+       yytext_ptr = yy_bp; \\r
+       yyleng = (int) (yy_cp - yy_bp); \\r
+       yy_hold_char = *yy_cp; \\r
+       *yy_cp = '\0'; \\r
+       yy_c_buf_p = yy_cp;\r
+\r
+#define YY_NUM_RULES 198\r
+#define YY_END_OF_BUFFER 199\r
+static yyconst short /* Nick short int */ yy_accept[397] =\r
+    {   0,\r
+        0,    0,  199,  197,  193,  192,   26,  197,  196,  197,\r
+        3,   15,  197,   17,   18,    1,   22,   20,   23,   21,\r
+        2,  180,  180,   19,  194,    8,   24,    9,   16,  191,\r
+      191,  191,  191,  191,  191,  191,  191,  191,  191,  191,\r
+      191,  191,  191,  191,  191,  191,  191,  191,  162,  163,\r
+      164,   14,   25,  193,  197,   21,  193,   11,    0,  178,\r
+        0,  196,  183,   13,    0,    0,    0,    0,    0,    0,\r
+        0,    0,  195,  180,  184,  184,    0,  194,    4,    6,\r
+       10,    7,    5,  191,  191,  191,  191,  191,  191,  191,\r
+      191,  191,  191,  191,  191,  191,   51,  168,  191,  169,\r
+\r
+      191,  191,  191,  191,  191,  191,  191,  191,  191,  191,\r
+      155,  191,  158,  191,  191,  191,  191,  191,  191,  191,\r
+      191,   59,  191,  191,  167,  191,  191,  179,  191,  191,\r
+      191,  191,  191,  191,  191,  191,  159,  191,  191,  191,\r
+      191,   12,  193,    0,    0,    0,    0,    0,    0,    0,\r
+      178,  190,    0,  190,    0,    0,    0,    0,   30,    0,\r
+        0,   31,    0,   29,    0,    0,    0,  195,  182,  181,\r
+       55,   54,  191,   57,   99,  191,  152,  191,  191,  191,\r
+      191,  191,  191,  191,  191,  191,  191,  191,  191,  191,\r
+      191,  153,  191,  191,  143,  154,  116,  121,  123,  118,\r
+\r
+      104,  120,  122,  119,  117,  106,   50,   70,  191,  101,\r
+      191,  191,  191,   58,  191,  191,  191,  191,  191,  191,\r
+      191,   98,  139,  160,   75,   76,  191,   39,  165,  151,\r
+      100,  191,   60,   62,   96,  124,   73,  147,  191,  102,\r
+      191,  191,  128,  191,  149,  107,   52,  144,   77,  108,\r
+      113,  115,  110,  150,  112,  114,  111,  109,  191,  133,\r
+      161,  148,   53,  191,  105,  130,    0,    0,    0,    0,\r
+        0,    0,  189,  187,    0,    0,    0,    0,   27,    0,\r
+        0,    0,   28,    0,   32,   34,   68,   74,  135,  141,\r
+      142,   78,   79,   81,   86,   88,   89,   92,   93,   95,\r
+\r
+       87,   83,   80,   82,   94,   90,   91,   84,   85,  136,\r
+      191,  140,   56,  191,  191,  166,  134,   48,   65,   40,\r
+       46,  191,  126,   49,   45,   61,   63,   47,  103,  191,\r
+      127,  138,   71,  145,  146,   69,  156,  157,  191,   72,\r
+       97,    0,    0,    0,    0,    0,  187,    0,  185,    0,\r
+       33,   36,    0,   37,  177,   38,   41,   42,   43,   44,\r
+      191,  131,   66,  125,   64,  137,  129,  174,    0,  173,\r
+        0,    0,    0,    0,    0,  132,   67,    0,    0,  176,\r
+        0,  188,    0,  186,    0,   35,    0,    0,  171,  175,\r
+      172,    0,  175,    0,  170,    0\r
+\r
+    } ;\r
+\r
+static yyconst int yy_ec[256] =\r
+    {   0,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,\r
+        4,    1,    5,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    6,    7,    8,    9,   10,   11,   12,   13,   14,\r
+       15,   16,   17,   18,   19,   20,   21,   22,   23,   24,\r
+       25,   26,   27,   27,   27,   28,   28,   29,   30,   31,\r
+       32,   33,    1,    1,   37,   38,   39,   40,   41,   42,\r
+       43,   44,   45,   46,   36,   47,   48,   49,   50,   51,\r
+       52,   53,   54,   55,   56,   57,   58,   59,   60,   61,\r
+        1,   34,    1,   35,   36,    1,   37,   38,   39,   40,\r
+\r
+       41,   42,   43,   44,   45,   46,   36,   47,   48,   49,\r
+       50,   51,   52,   53,   54,   55,   56,   57,   58,   59,\r
+       60,   61,    1,   62,    1,   63,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1\r
+    } ;\r
+\r
+static yyconst int yy_meta[64] =\r
+    {   0,\r
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    3,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    4,    4,    4,    4,    4,    4,    4,    1,    1,\r
+        1,    1,    1,    1,    1,    5,    4,    4,    4,    4,\r
+        4,    4,    5,    5,    5,    5,    5,    5,    5,    5,\r
+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,\r
+        5,    1,    1\r
+    } ;\r
+\r
+static yyconst short /* Nick short int */ yy_base[412] =\r
+    {   0,\r
+        0,   62,  536,  537,   65,  537,  503,   57,    0,    0,\r
+      537,  522,  499,  537,  537,  537,  537,  537,  537,   34,\r
+      511,   70,   31,  537,    0,   45,  499,   46,  537,    0,\r
+       64,   67,   85,   42,   92,  482,   41,   94,  481,   94,\r
+       69,   39,   47,   91,  131,  124,  474,  487,    0,    0,\r
+        0,  464,  537,  181,  172,  164,  158,  537,  116,  537,\r
+      159,    0,    0,  537,  512,  197,  464,  469,  187,  142,\r
+      469,  480,    0,   67,    0,   79,    0,    0,  537,  537,\r
+      537,  537,  537,    0,  150,  480,  466,  471,  477,  219,\r
+      143,  461,  468,  116,  193,  466,  161,    0,  474,    0,\r
+\r
+      127,  461,  458,  459,  458,  452,  464,  453,  468,  456,\r
+      464,  451,  186,  186,  453,  180,  447,  442,  451,  454,\r
+      445,  450,  439,  450,    0,  441,  437,  236,  453,  434,\r
+      440,  183,  216,  239,  446,  438,  195,  447,  447,  428,\r
+      429,  537,  285,  293,  261,  262,  432,  435,  442,  428,\r
+      200,  537,  464,  463,  302,  462,  419,  432,  537,  223,\r
+      431,  537,  431,  414,  428,  425,  412,    0,   93,    0,\r
+        0,    0,  408,  420,    0,  411,    0,  264,  265,  411,\r
+      421,  268,  176,  262,  416,  419,  412,  414,  281,  284,\r
+      402,    0,  415,  408,    0,    0,    0,    0,    0,    0,\r
+\r
+        0,    0,    0,    0,    0,    0,    0,    0,  413,    0,\r
+      416,  404,  403,    0,  402,  425,  401,  403,  406,  398,\r
+      393,    0,    0,    0,    0,    0,  419,    0,    0,    0,\r
+        0,  402,  383,  383,    0,    0,    0,    0,  383,    0,\r
+      375,  365,  362,  351,    0,    0,  352,  291,  292,    0,\r
+        0,    0,    0,    0,    0,    0,    0,    0,  348,    0,\r
+        0,    0,  343,  336,    0,    0,  327,  340,  345,  329,\r
+      343,  321,  537,  537,  328,  354,  324,  321,  537,  318,\r
+      319,  313,  537,  305,  537,  537,    0,    0,    0,    0,\r
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\r
+\r
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\r
+      333,    0,    0,  300,  293,    0,    0,    0,  289,    0,\r
+        0,  295,    0,    0,    0,    0,  284,    0,    0,  292,\r
+        0,    0,    0,    0,    0,    0,    0,    0,  286,    0,\r
+        0,  281,  287,  278,  279,  256,  537,  347,  537,  285,\r
+      537,  537,  246,  537,  537,  537,    0,    0,    0,    0,\r
+      234,    0,  223,    0,    0,    0,    0,  537,  216,  223,\r
+      209,  199,  353,  239,  210,    0,    0,  203,  202,  537,\r
+      152,  537,  368,  537,  186,  537,  156,  149,  120,    0,\r
+      537,  112,    0,   99,  537,  537,  395,  400,  113,  405,\r
+\r
+      410,  412,  417,  422,   83,   81,  425,  427,  429,  431,\r
+      435\r
+    } ;\r
+\r
+static yyconst short /* Nick short int */ yy_def[412] =\r
+    {   0,\r
+      396,    1,  396,  396,  396,  396,  396,  397,  398,  399,\r
+      396,  396,  400,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,   22,  396,  401,  396,  396,  396,  396,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  396,  396,  396,  396,  396,  396,  396,  397,  396,\r
+      397,  398,  399,  396,  396,  403,  396,  396,  396,  396,\r
+      396,  396,  404,   22,  405,  405,  406,  401,  396,  396,\r
+      396,  396,  396,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,   45,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      397,  396,  396,  396,  396,  407,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  404,  405,  406,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  408,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  402,  402,  402,\r
+      402,  396,  396,  396,  396,  396,  396,  396,  396,  409,\r
+      396,  396,  396,  396,  396,  396,  402,  402,  402,  402,\r
+      402,  402,  402,  402,  402,  402,  402,  396,  396,  396,\r
+      396,  396,  396,  410,  396,  402,  402,  396,  396,  396,\r
+      396,  396,  396,  396,  410,  396,  396,  396,  396,  411,\r
+      396,  396,  411,  396,  396,    0,  396,  396,  396,  396,\r
+\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396\r
+    } ;\r
+\r
+static yyconst short /* Nick short int */ yy_nxt[601] =\r
+    {   0,\r
+        4,    5,    6,    4,    5,    5,    7,    8,    9,   10,\r
+       11,   12,   13,   14,   15,   16,   17,   18,   19,   20,\r
+       21,   22,   23,   23,   23,   23,   23,   23,   24,   25,\r
+       26,   27,   28,    4,   29,   30,   31,   32,   33,   34,\r
+       35,   36,   30,   37,   38,   39,   40,   41,   42,   43,\r
+       44,   30,   45,   46,   47,   30,   30,   48,   49,   50,\r
+       51,   52,   53,   54,   60,   55,   57,   54,   75,   57,\r
+       57,   67,   68,   69,   70,   79,   80,   82,   83,  120,\r
+       98,   56,   99,   71,  170,  107,   75,   72,  121,  396,\r
+       61,   74,   74,   74,   74,   74,   74,   74,  108,  122,\r
+\r
+      169,  169,  123,   85,   75,   88,   75,   76,   75,   75,\r
+       75,   75,   86,   89,  169,  169,   63,   87,  118,   90,\r
+       91,   93,   94,   60,  119,  396,   92,  124,   77,  125,\r
+      100,   95,  109,  113,   96,   97,  101,  395,  102,  110,\r
+      126,  103,  111,  114,  115,  104,  127,  116,  394,   61,\r
+      105,  117,  128,  128,  128,  128,  128,  128,  128,   57,\r
+      195,  133,   57,   57,  134,  211,  151,  392,  196,  129,\r
+      135,  130,  212,  144,  136,  144,  131,  144,  137,  138,\r
+      132,  139,  143,  191,  144,   57,  143,  391,  171,  172,\r
+      163,  145,   61,  164,  173,  165,  390,  192,  384,  207,\r
+\r
+      145,   67,   68,   69,  146,  208,  389,   60,  147,  154,\r
+      148,  149,  150,   71,  209,  298,  299,   72,  155,  155,\r
+      155,  155,  155,  155,  159,  224,  230,  160,  227,  245,\r
+      225,  197,  231,   61,  261,  246,  198,  199,  388,  226,\r
+      161,  200,  387,  228,  162,  201,  202,  203,  262,  204,\r
+      386,  384,  381,  205,  247,  156,  178,  179,  380,  180,\r
+      248,  181,  182,  183,  279,  184,  185,  186,  249,  187,\r
+      379,  378,  188,  189,   84,  190,   84,  250,  377,  280,\r
+      376,   84,  251,  252,  375,   84,  143,  253,  144,   57,\r
+      143,  254,  255,  256,  144,  257,  144,  349,  144,  258,\r
+\r
+      372,  267,  290,  292,  145,  147,  296,  148,  149,  150,\r
+      163,  300,  145,  164,  274,  165,  301,  291,  293,  306,\r
+      268,  297,  308,  275,  275,  275,  275,  275,  275,  334,\r
+      337,  371,  370,  369,  307,  368,  367,  309,  366,  365,\r
+      347,  364,  363,  362,  335,  338,  361,  356,  336,  348,\r
+      348,  348,  348,  348,  348,  357,  358,  359,  360,  347,\r
+      355,  354,  353,  352,  351,  382,  349,  346,  373,  373,\r
+      373,  373,  373,  373,  383,  383,  383,  383,  383,  383,\r
+      382,  345,  344,  343,  342,  268,  341,  340,  339,  383,\r
+      383,  383,  383,  383,  383,   59,  333,   59,   59,   59,\r
+\r
+       62,  332,   62,   62,   62,   65,  331,   65,   65,   65,\r
+       78,  330,   78,   78,   78,   84,   84,  153,  329,  153,\r
+      153,  153,  168,  328,  168,  168,  168,  276,  276,  350,\r
+      350,  374,  374,  385,  385,  393,  327,  393,  393,  393,\r
+      326,  325,  324,  323,  322,  321,  320,  319,  318,  317,\r
+      316,  315,  314,  313,  312,  311,  310,  305,  304,  303,\r
+      302,  295,  294,  289,  288,  287,  286,  285,  284,  283,\r
+      282,  281,  278,  277,  273,  273,  273,  272,  271,  270,\r
+      269,  266,  265,  264,  263,  260,  259,  244,  243,  242,\r
+      241,  240,  239,  238,  237,  236,  235,  234,  233,  232,\r
+\r
+      229,  223,  222,  221,  220,  219,  218,  217,  216,  215,\r
+      214,  213,  210,  206,  194,  193,  177,  176,  175,  174,\r
+      167,  166,  158,  157,  152,  142,  141,  140,  112,  106,\r
+       81,   73,   66,   64,   58,  396,    3,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396\r
+\r
+    } ;\r
+\r
+static yyconst short /* Nick short int */ yy_chk[601] =\r
+    {   0,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\r
+        1,    1,    1,    2,    8,    2,    5,    2,   23,    5,\r
+        5,   20,   20,   20,   20,   26,   26,   28,   28,   42,\r
+       34,    2,   34,   20,  406,   37,  405,   20,   42,   23,\r
+        8,   22,   22,   22,   22,   22,   22,   22,   37,   43,\r
+\r
+       76,   76,   43,   31,   74,   32,   22,   22,   22,   22,\r
+       22,   22,   31,   32,  169,  169,  399,   31,   41,   32,\r
+       32,   33,   33,   59,   41,   74,   32,   44,   22,   44,\r
+       35,   33,   38,   40,   33,   33,   35,  394,   35,   38,\r
+       44,   35,   38,   40,   40,   35,   44,   40,  392,   59,\r
+       35,   40,   45,   45,   45,   45,   45,   45,   45,   57,\r
+       94,   46,   57,   57,   46,  101,   61,  389,   94,   45,\r
+       46,   45,  101,   55,   46,   55,   45,   55,   46,   46,\r
+       45,   46,   54,   91,   54,   54,   54,  388,   85,   85,\r
+       70,   55,   61,   70,   85,   70,  387,   91,  385,   97,\r
+\r
+       54,   56,   56,   56,   56,   97,  381,  151,   56,   66,\r
+       56,   56,   56,   56,   97,  183,  183,   56,   66,   66,\r
+       66,   66,   66,   66,   69,  113,  116,   69,  114,  132,\r
+      113,   95,  116,  151,  137,  132,   95,   95,  379,  113,\r
+       69,   95,  378,  114,   69,   95,   95,   95,  137,   95,\r
+      375,  374,  372,   95,  133,   66,   90,   90,  371,   90,\r
+      133,   90,   90,   90,  160,   90,   90,   90,  133,   90,\r
+      370,  369,   90,   90,  128,   90,  128,  134,  363,  160,\r
+      361,  128,  134,  134,  353,  128,  143,  134,  143,  143,\r
+      143,  134,  134,  134,  144,  134,  144,  350,  144,  134,\r
+\r
+      346,  145,  178,  179,  143,  145,  182,  145,  145,  145,\r
+      146,  184,  144,  146,  155,  146,  184,  178,  179,  189,\r
+      146,  182,  190,  155,  155,  155,  155,  155,  155,  248,\r
+      249,  345,  344,  343,  189,  342,  339,  190,  330,  327,\r
+      275,  322,  319,  315,  248,  249,  314,  284,  248,  275,\r
+      275,  275,  275,  275,  275,  311,  311,  311,  311,  348,\r
+      282,  281,  280,  278,  277,  373,  276,  272,  348,  348,\r
+      348,  348,  348,  348,  373,  373,  373,  373,  373,  373,\r
+      383,  271,  270,  269,  268,  267,  264,  263,  259,  383,\r
+      383,  383,  383,  383,  383,  397,  247,  397,  397,  397,\r
+\r
+      398,  244,  398,  398,  398,  400,  243,  400,  400,  400,\r
+      401,  242,  401,  401,  401,  402,  402,  403,  241,  403,\r
+      403,  403,  404,  239,  404,  404,  404,  407,  407,  408,\r
+      408,  409,  409,  410,  410,  411,  234,  411,  411,  411,\r
+      233,  232,  227,  221,  220,  219,  218,  217,  216,  215,\r
+      213,  212,  211,  209,  194,  193,  191,  188,  187,  186,\r
+      185,  181,  180,  176,  174,  173,  167,  166,  165,  164,\r
+      163,  161,  158,  157,  156,  154,  153,  150,  149,  148,\r
+      147,  141,  140,  139,  138,  136,  135,  131,  130,  129,\r
+      127,  126,  124,  123,  122,  121,  120,  119,  118,  117,\r
+\r
+      115,  112,  111,  110,  109,  108,  107,  106,  105,  104,\r
+      103,  102,   99,   96,   93,   92,   89,   88,   87,   86,\r
+       72,   71,   68,   67,   65,   52,   48,   47,   39,   36,\r
+       27,   21,   13,   12,    7,    3,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,\r
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396\r
+\r
+    } ;\r
+\r
+static yy_state_type yy_last_accepting_state;\r
+static char *yy_last_accepting_cpos;\r
+\r
+/* The intent behind this definition is that it'll catch\r
+ * any uses of REJECT which flex missed.\r
+ */\r
+#define REJECT reject_used_but_not_detected\r
+#define yymore() yymore_used_but_not_detected\r
+#define YY_MORE_ADJ 0\r
+#define YY_RESTORE_YY_MORE_OFFSET\r
+char *yytext;\r
+/* #line 1 "avrlex.l" */\r
+#define INITIAL 0\r
+/* #line 2 "avrlex.l" */\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : avrlex.l\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Scanner file for AVR assembler\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//  990329      : Tom - Added support for hex values like 1AB without $ or 0x\r
+//  990512      : Tom - Fixed detection on binary numbers.\r
+//  990522      : Tom - Added support for PC/DC/EC.   \r
+//  991211      : Tom - Fixed .endm problem (it had to be lower case)\r
+//  991217      : Kurt- Added # and support for local labels\r
+//  001101     : Brian - Added support for multiple include search paths\r
+//  010319      : Timothy Lee - Added byte1 function (sames as low())\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include "symbol.hh"\r
+#include "semantic.hh"\r
+#include "avrparse.hh"\r
+#include "avrasm.hh"\r
+#include "utils.hh"\r
+\r
+/// Extern ///////////////////////////////////////////////////////////////////\r
+\r
+GLOBALS(extern);\r
+\r
+/// Global ///////////////////////////////////////////////////////////////////\r
+\r
+symbolTableEntry       *sym;\r
+YY_BUFFER_STATE        statestack[MAX_CONTEXT_DEPTH];\r
+int                    restartcount = 0;\r
+int                    ret;\r
+\r
+/// Defines //////////////////////////////////////////////////////////////////\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+#define SKIPRESTART 0x02BABE  // Any value that is not a token\r
+#else\r
+#define SKIPRESTART -2 // Any value that is not a token\r
+#endif\r
+\r
+/// Prototypes for support function //////////////////////////////////////////\r
+\r
+int     restart(void);\r
+int     endofline(void);\r
+int     identifier(void);\r
+int     registers(void);\r
+int     integers(void);\r
+int     macrodef(void);\r
+int     includefile(void);\r
+int     string(void);\r
+int     character(void);\r
+int     doexit(void);\r
+int     macro(symbolSA symb);\r
+void    list(int listtype);\r
+void    illegal(void);\r
+\r
+/// Scanner definition ///////////////////////////////////////////////////////\r
+\r
+#define YY_NEVER_INTERACTIVE 1\r
+/* #line 730 "avrlex.cc" */\r
+\r
+/* Macros after this point can all be overridden by user definitions in\r
+ * section 1.\r
+ */\r
+\r
+#ifndef YY_SKIP_YYWRAP\r
+#ifdef __cplusplus\r
+extern "C" int yywrap YY_PROTO(( void ));\r
+#else\r
+extern int yywrap YY_PROTO(( void ));\r
+#endif\r
+#endif\r
+\r
+#ifndef YY_NO_UNPUT\r
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));\r
+#endif\r
+\r
+#ifndef yytext_ptr\r
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));\r
+#endif\r
+\r
+#ifdef YY_NEED_STRLEN\r
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));\r
+#endif\r
+\r
+#ifndef YY_NO_INPUT\r
+#ifdef __cplusplus\r
+static int yyinput YY_PROTO(( void ));\r
+#else\r
+static int input YY_PROTO(( void ));\r
+#endif\r
+#endif\r
+\r
+#if YY_STACK_USED\r
+static int yy_start_stack_ptr = 0;\r
+static int yy_start_stack_depth = 0;\r
+static int *yy_start_stack = 0;\r
+#ifndef YY_NO_PUSH_STATE\r
+static void yy_push_state YY_PROTO(( int new_state ));\r
+#endif\r
+#ifndef YY_NO_POP_STATE\r
+static void yy_pop_state YY_PROTO(( void ));\r
+#endif\r
+#ifndef YY_NO_TOP_STATE\r
+static int yy_top_state YY_PROTO(( void ));\r
+#endif\r
+\r
+#else\r
+#define YY_NO_PUSH_STATE 1\r
+#define YY_NO_POP_STATE 1\r
+#define YY_NO_TOP_STATE 1\r
+#endif\r
+\r
+#ifdef YY_MALLOC_DECL\r
+YY_MALLOC_DECL\r
+#else\r
+#if __STDC__\r
+#ifndef __cplusplus\r
+#include <stdlib.h>\r
+#endif\r
+#else\r
+/* Just try to get by without declaring the routines.  This will fail\r
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)\r
+ * or sizeof(void*) != sizeof(int).\r
+ */\r
+#endif\r
+#endif\r
+\r
+/* Amount of stuff to slurp up with each read. */\r
+#ifndef YY_READ_BUF_SIZE\r
+#define YY_READ_BUF_SIZE 8192\r
+#endif\r
+\r
+/* Copy whatever the last rule matched to the standard output. */\r
+\r
+#ifndef ECHO\r
+/* This used to be an fputs(), but since the string might contain NUL's,\r
+ * we now use fwrite().\r
+ */\r
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )\r
+#endif\r
+\r
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,\r
+ * is returned in "result".\r
+ */\r
+#ifndef YY_INPUT\r
+#define YY_INPUT(buf,result,max_size) \\r
+       if ( /* 1 || */ yy_current_buffer->yy_is_interactive ) \\r
+               { \\r
+               int c = '*', n; \\r
+               for ( n = 0; n < max_size && \\r
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \\r
+                       buf[n] = (char) c; \\r
+               if ( c == '\n' ) \\r
+                       buf[n++] = (char) c; \\r
+               if ( c == EOF && ferror( yyin ) ) \\r
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \\r
+/* buf[n] = 0; */ \\r
+/* printf("%s", buf); */ \\r
+/* fflush(stdout); */ \\r
+               result = n; \\r
+               } \\r
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \\r
+                 && ferror( yyin ) ) \\r
+               YY_FATAL_ERROR( "input in flex scanner failed" );\r
+#endif\r
+\r
+/* No semi-colon after return; correct usage is to write "yyterminate();" -\r
+ * we don't want an extra ';' after the "return" because that will cause\r
+ * some compilers to complain about unreachable statements.\r
+ */\r
+#ifndef yyterminate\r
+#define yyterminate() return YY_NULL\r
+#endif\r
+\r
+/* Number of entries by which start-condition stack grows. */\r
+#ifndef YY_START_STACK_INCR\r
+#define YY_START_STACK_INCR 25\r
+#endif\r
+\r
+/* Report a fatal error. */\r
+#ifndef YY_FATAL_ERROR\r
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )\r
+#endif\r
+\r
+/* Default declaration of generated scanner - a define so the user can\r
+ * easily add parameters.\r
+ */\r
+#ifndef YY_DECL\r
+#define YY_DECL int yylex YY_PROTO(( void ))\r
+#endif\r
+\r
+/* Code executed at the beginning of each rule, after yytext and yyleng\r
+ * have been set up.\r
+ */\r
+#ifndef YY_USER_ACTION\r
+#define YY_USER_ACTION\r
+#endif\r
+\r
+/* Code executed at the end of each rule. */\r
+#ifndef YY_BREAK\r
+#define YY_BREAK break;\r
+#endif\r
+\r
+#define YY_RULE_SETUP \\r
+       if ( yyleng > 0 ) \\r
+               yy_current_buffer->yy_at_bol = \\r
+                               (yytext[yyleng - 1] == '\n'); \\r
+       YY_USER_ACTION\r
+\r
+#ifndef _MSC_VER /* Nick */\r
+#undef YY_BREAK\r
+#define YY_BREAK return -1;\r
+\r
+int yy_function_nick_0(/*yy_state_type yy_current_state,\r
+                      char *yy_cp, char *yy_bp,*/ int yy_act)\r
+       {\r
+       switch (yy_act)\r
+               {\r
+#include "avrlex0.inc"\r
+               }\r
+       return -1; /* should never happen but keeps the compiler happy */\r
+       }\r
+\r
+int yy_function_nick_1(/*yy_state_type yy_current_state,\r
+                      char *yy_cp, char *yy_bp,*/ int yy_act)\r
+       {\r
+       switch (yy_act)\r
+               {\r
+#include "avrlex1.inc"\r
+               }\r
+       return -1; /* should never happen but keeps the compiler happy */\r
+       }\r
+\r
+#undef YY_BREAK\r
+#define YY_BREAK break;\r
+#endif\r
+\r
+YY_DECL\r
+       {\r
+       register yy_state_type yy_current_state;\r
+       register char *yy_cp = NULL, *yy_bp = NULL;\r
+       register int yy_act;\r
+#if 1 /* Nick */\r
+       register int yy_return_code;\r
+ void *silly;\r
+#endif\r
+\r
+ silly = malloc(0x1000);\r
+ if (silly)\r
+  {\r
+  free(silly);\r
+  }\r
+\r
+#ifdef DEBUG /* Nick */\r
+ printf("yylex() @ %08lx\n", silly);\r
+ fflush(stdout);\r
+#endif\r
+\r
+/* #line 114 "avrlex.l" */\r
+\r
+\r
+/* #line 887 "avrlex.cc" */\r
+\r
+       if ( yy_init )\r
+               {\r
+#ifdef DEBUG /* Nick */\r
+ printf("init\n");\r
+ fflush(stdout);\r
+#endif\r
+               yy_init = 0;\r
+\r
+#ifdef YY_USER_INIT\r
+               YY_USER_INIT;\r
+#endif\r
+\r
+               if ( ! yy_start )\r
+                       yy_start = 1;   /* first start state */\r
+\r
+               if ( ! yyin )\r
+                       yyin = stdin;\r
+\r
+               if ( ! yyout )\r
+                       yyout = stdout;\r
+\r
+               if ( ! yy_current_buffer )\r
+                       yy_current_buffer =\r
+                               yy_create_buffer( yyin, YY_BUF_SIZE );\r
+\r
+               yy_load_buffer_state();\r
+               }\r
+\r
+       while ( 1 )             /* loops until end-of-file is reached */\r
+               {\r
+#ifdef DEBUG /* Nick */\r
+ printf("loop\n");\r
+ fflush(stdout);\r
+#endif\r
+               yy_cp = yy_c_buf_p;\r
+\r
+               /* Support of yytext. */\r
+               *yy_cp = yy_hold_char;\r
+\r
+               /* yy_bp points to the position in yy_ch_buf of the start of\r
+                * the current run.\r
+                */\r
+               yy_bp = yy_cp;\r
+\r
+               yy_current_state = yy_start;\r
+               yy_current_state += YY_AT_BOL();\r
+yy_match:\r
+               do\r
+                       {\r
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];\r
+                       if ( yy_accept[yy_current_state] )\r
+                               {\r
+                               yy_last_accepting_state = yy_current_state;\r
+                               yy_last_accepting_cpos = yy_cp;\r
+                               }\r
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )\r
+                               {\r
+                               yy_current_state = (int) yy_def[yy_current_state];\r
+                               if ( yy_current_state >= 397 )\r
+                                       yy_c = yy_meta[(unsigned int) yy_c];\r
+                               }\r
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];\r
+                       ++yy_cp;\r
+                       }\r
+               while ( yy_base[yy_current_state] != 537 );\r
+\r
+yy_find_action:\r
+               yy_act = yy_accept[yy_current_state];\r
+               if ( yy_act == 0 )\r
+                       { /* have to back up */\r
+                       yy_cp = yy_last_accepting_cpos;\r
+                       yy_current_state = yy_last_accepting_state;\r
+                       yy_act = yy_accept[yy_current_state];\r
+                       }\r
+\r
+               YY_DO_BEFORE_ACTION;\r
+\r
+\r
+do_action:     /* This label is used only to access EOF actions. */\r
+\r
+#ifndef _MSC_VER /* Nick */\r
+               if (yy_act >= 1 && yy_act <= 99)\r
+                       {\r
+                       yy_return_code = yy_function_nick_0(/*yy_current_state,\r
+                                                           yy_cp, yy_bp,*/\r
+                                                           yy_act);\r
+\r
+                       if (yy_return_code == -1)\r
+                               {\r
+#ifdef DEBUG /* Nick */\r
+ printf("break\n");\r
+ fflush(stdout);\r
+#endif\r
+                               goto yy_return_break;\r
+                               }\r
+\r
+#ifdef DEBUG /* Nick */\r
+ printf("token %d\n", yy_return_code);\r
+ fflush(stdout);\r
+#endif\r
+                       return yy_return_code;\r
+                       }\r
+\r
+               if (yy_act >= 100 && yy_act <= 198)\r
+                       {\r
+                       yy_return_code = yy_function_nick_1(/*yy_current_state,\r
+                                                           yy_cp, yy_bp,*/\r
+                                                           yy_act);\r
+\r
+                       if (yy_return_code == -1)\r
+                               {\r
+#ifdef DEBUG /* Nick */\r
+ printf("break\n");\r
+ fflush(stdout);\r
+#endif\r
+                               goto yy_return_break;\r
+                               }\r
+\r
+#ifdef DEBUG /* Nick */\r
+ printf("token %d\n", yy_return_code);\r
+ fflush(stdout);\r
+#endif\r
+                       return yy_return_code;\r
+                       }\r
+\r
+/* #ifdef DEBUG */ /* Nick */\r
+/* printf("action %d\n", yy_act); */\r
+/* fflush(stdout); */\r
+/* #endif */\r
+#endif\r
+\r
+               switch ( yy_act )\r
+       { /* beginning of action switch */\r
+                       case 0: /* must back up */\r
+                       /* undo the effects of YY_DO_BEFORE_ACTION */\r
+                       *yy_cp = yy_hold_char;\r
+                       yy_cp = yy_last_accepting_cpos;\r
+                       yy_current_state = yy_last_accepting_state;\r
+                       goto yy_find_action;\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+#include "avrlex0.inc"\r
+#include "avrlex1.inc"\r
+#endif\r
+\r
+case YY_STATE_EOF(INITIAL):\r
+/* #line 312 "avrlex.l" */\r
+       yyeol=TRUE;\r
+       if ((ret=restart()) != SKIPRESTART)\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("eof %d\n", ret);\r
+ fflush(stdout);\r
+#endif\r
+               return ret;\r
+ }\r
+       YY_BREAK\r
+\r
+/* #line 1965 "avrlex.cc" */\r
+\r
+       case YY_END_OF_BUFFER:\r
+               {\r
+#ifdef DEBUG /* Nick */\r
+ printf("YY_END_OF_BUFFER\n");\r
+ fflush(stdout);\r
+#endif\r
+               /* Amount of text matched not including the EOB char. */\r
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;\r
+\r
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */\r
+               *yy_cp = yy_hold_char;\r
+               YY_RESTORE_YY_MORE_OFFSET\r
+\r
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )\r
+                       {\r
+                       /* We're scanning a new file or input source.  It's\r
+                        * possible that this happened because the user\r
+                        * just pointed yyin at a new source and called\r
+                        * yylex().  If so, then we have to assure\r
+                        * consistency between yy_current_buffer and our\r
+                        * globals.  Here is the right place to do so, because\r
+                        * this is the first action (other than possibly a\r
+                        * back-up) that will match for the new input source.\r
+                        */\r
+                       yy_n_chars = yy_current_buffer->yy_n_chars;\r
+                       yy_current_buffer->yy_input_file = yyin;\r
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;\r
+                       }\r
+\r
+               /* Note that here we test for yy_c_buf_p "<=" to the position\r
+                * of the first EOB in the buffer, since yy_c_buf_p will\r
+                * already have been incremented past the NUL character\r
+                * (since all states make transitions on EOB to the\r
+                * end-of-buffer state).  Contrast this with the test\r
+                * in input().\r
+                */\r
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )\r
+                       { /* This was really a NUL. */\r
+                       yy_state_type yy_next_state;\r
+\r
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;\r
+\r
+                       yy_current_state = yy_get_previous_state();\r
+\r
+                       /* Okay, we're now positioned to make the NUL\r
+                        * transition.  We couldn't have\r
+                        * yy_get_previous_state() go ahead and do it\r
+                        * for us because it doesn't know how to deal\r
+                        * with the possibility of jamming (and we don't\r
+                        * want to build jamming into it because then it\r
+                        * will run more slowly).\r
+                        */\r
+\r
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );\r
+\r
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;\r
+\r
+                       if ( yy_next_state )\r
+                               {\r
+                               /* Consume the NUL. */\r
+                               yy_cp = ++yy_c_buf_p;\r
+                               yy_current_state = yy_next_state;\r
+                               goto yy_match;\r
+                               }\r
+\r
+                       else\r
+                               {\r
+                               yy_cp = yy_c_buf_p;\r
+                               goto yy_find_action;\r
+                               }\r
+                       }\r
+\r
+               else switch ( yy_get_next_buffer() )\r
+                       {\r
+                       case EOB_ACT_END_OF_FILE:\r
+                               {\r
+                               yy_did_buffer_switch_on_eof = 0;\r
+\r
+                               if ( yywrap() )\r
+                                       {\r
+                                       /* Note: because we've taken care in\r
+                                        * yy_get_next_buffer() to have set up\r
+                                        * yytext, we can now set up\r
+                                        * yy_c_buf_p so that if some total\r
+                                        * hoser (like flex itself) wants to\r
+                                        * call the scanner after we return the\r
+                                        * YY_NULL, it'll still work - another\r
+                                        * YY_NULL will get returned.\r
+                                        */\r
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;\r
+\r
+                                       yy_act = YY_STATE_EOF(YY_START);\r
+                                       goto do_action;\r
+                                       }\r
+\r
+                               else\r
+                                       {\r
+                                       if ( ! yy_did_buffer_switch_on_eof )\r
+                                               YY_NEW_FILE;\r
+                                       }\r
+                               break;\r
+                               }\r
+\r
+                       case EOB_ACT_CONTINUE_SCAN:\r
+                               yy_c_buf_p =\r
+                                       yytext_ptr + yy_amount_of_matched_text;\r
+\r
+                               yy_current_state = yy_get_previous_state();\r
+\r
+                               yy_cp = yy_c_buf_p;\r
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;\r
+                               goto yy_match;\r
+\r
+                       case EOB_ACT_LAST_MATCH:\r
+                               yy_c_buf_p =\r
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];\r
+\r
+                               yy_current_state = yy_get_previous_state();\r
+\r
+                               yy_cp = yy_c_buf_p;\r
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;\r
+                               goto yy_find_action;\r
+                       }\r
+               break;\r
+               }\r
+\r
+       default:\r
+#ifdef DEBUG /* Nick */\r
+ printf("yy_act = %d\n", yy_act);\r
+ fflush(stdout);\r
+#endif\r
+               YY_FATAL_ERROR(\r
+                       "fatal flex scanner internal error--no action found" );\r
+       } /* end of action switch */\r
+#ifndef _MSC_VER /* Nick */\r
+yy_return_break:\r
+       ;\r
+#endif\r
+               } /* end of scanning one token */\r
+       } /* end of yylex */\r
+\r
+\r
+/* yy_get_next_buffer - try to read in a new buffer\r
+ *\r
+ * Returns a code representing an action:\r
+ *     EOB_ACT_LAST_MATCH -\r
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position\r
+ *     EOB_ACT_END_OF_FILE - end of file\r
+ */\r
+\r
+static int yy_get_next_buffer(void) /* Nick void */\r
+       {\r
+       register char *dest = yy_current_buffer->yy_ch_buf;\r
+       register char *source = yytext_ptr;\r
+       register int number_to_move, i;\r
+       int ret_val;\r
+\r
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )\r
+               YY_FATAL_ERROR(\r
+               "fatal flex scanner internal error--end of buffer missed" );\r
+\r
+       if ( yy_current_buffer->yy_fill_buffer == 0 )\r
+               { /* Don't try to fill the buffer, so this is an EOF. */\r
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )\r
+                       {\r
+                       /* We matched a single character, the EOB, so\r
+                        * treat this as a final EOF.\r
+                        */\r
+                       return EOB_ACT_END_OF_FILE;\r
+                       }\r
+\r
+               else\r
+                       {\r
+                       /* We matched some text prior to the EOB, first\r
+                        * process it.\r
+                        */\r
+                       return EOB_ACT_LAST_MATCH;\r
+                       }\r
+               }\r
+\r
+       /* Try to read more data. */\r
+\r
+       /* First move last chars to start of buffer. */\r
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;\r
+\r
+       for ( i = 0; i < number_to_move; ++i )\r
+               *(dest++) = *(source++);\r
+\r
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )\r
+               /* don't do the read, it's not guaranteed to return an EOF,\r
+                * just force an EOF\r
+                */\r
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;\r
+\r
+       else\r
+               {\r
+               int num_to_read =\r
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;\r
+\r
+               while ( num_to_read <= 0 )\r
+                       { /* Not enough room in the buffer - grow it. */\r
+#ifdef YY_USES_REJECT\r
+                       YY_FATAL_ERROR(\r
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );\r
+#else\r
+\r
+                       /* just a shorter name for the current buffer */\r
+                       YY_BUFFER_STATE b = yy_current_buffer;\r
+\r
+                       int yy_c_buf_p_offset =\r
+                               (int) (yy_c_buf_p - b->yy_ch_buf);\r
+\r
+                       if ( b->yy_is_our_buffer )\r
+                               {\r
+                               int new_size = b->yy_buf_size * 2;\r
+\r
+                               if ( new_size <= 0 )\r
+                                       b->yy_buf_size += b->yy_buf_size / 8;\r
+                               else\r
+                                       b->yy_buf_size *= 2;\r
+\r
+                               b->yy_ch_buf = (char *)\r
+                                       /* Include room in for 2 EOB chars. */\r
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,\r
+                                                        b->yy_buf_size + 2 );\r
+                               }\r
+                       else\r
+                               /* Can't grow it, we don't own it. */\r
+                               b->yy_ch_buf = 0;\r
+\r
+                       if ( ! b->yy_ch_buf )\r
+                               YY_FATAL_ERROR(\r
+                               "fatal error - scanner input buffer overflow" );\r
+\r
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];\r
+\r
+                       num_to_read = yy_current_buffer->yy_buf_size -\r
+                                               number_to_move - 1;\r
+#endif\r
+                       }\r
+\r
+               if ( num_to_read > YY_READ_BUF_SIZE )\r
+                       num_to_read = YY_READ_BUF_SIZE;\r
+\r
+               /* Read in more data. */\r
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),\r
+                       yy_n_chars, num_to_read );\r
+\r
+               yy_current_buffer->yy_n_chars = yy_n_chars;\r
+               }\r
+\r
+       if ( yy_n_chars == 0 )\r
+               {\r
+               if ( number_to_move == YY_MORE_ADJ )\r
+                       {\r
+                       ret_val = EOB_ACT_END_OF_FILE;\r
+                       yyrestart( yyin );\r
+                       }\r
+\r
+               else\r
+                       {\r
+                       ret_val = EOB_ACT_LAST_MATCH;\r
+                       yy_current_buffer->yy_buffer_status =\r
+                               YY_BUFFER_EOF_PENDING;\r
+                       }\r
+               }\r
+\r
+       else\r
+               ret_val = EOB_ACT_CONTINUE_SCAN;\r
+\r
+       yy_n_chars += number_to_move;\r
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;\r
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;\r
+\r
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];\r
+\r
+       return ret_val;\r
+       }\r
+\r
+\r
+/* yy_get_previous_state - get the state just before the EOB char was reached */\r
+\r
+static yy_state_type yy_get_previous_state()\r
+       {\r
+       register yy_state_type yy_current_state;\r
+       register char *yy_cp;\r
+\r
+       yy_current_state = yy_start;\r
+       yy_current_state += YY_AT_BOL();\r
+\r
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )\r
+               {\r
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);\r
+               if ( yy_accept[yy_current_state] )\r
+                       {\r
+                       yy_last_accepting_state = yy_current_state;\r
+                       yy_last_accepting_cpos = yy_cp;\r
+                       }\r
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )\r
+                       {\r
+                       yy_current_state = (int) yy_def[yy_current_state];\r
+                       if ( yy_current_state >= 397 )\r
+                               yy_c = yy_meta[(unsigned int) yy_c];\r
+                       }\r
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];\r
+               }\r
+\r
+       return yy_current_state;\r
+       }\r
+\r
+\r
+/* yy_try_NUL_trans - try to make a transition on the NUL character\r
+ *\r
+ * synopsis\r
+ *     next_state = yy_try_NUL_trans( current_state );\r
+ */\r
+\r
+#ifdef YY_USE_PROTOS\r
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )\r
+#else\r
+static yy_state_type yy_try_NUL_trans( yy_current_state )\r
+yy_state_type yy_current_state;\r
+#endif\r
+       {\r
+       register int yy_is_jam;\r
+       register char *yy_cp = yy_c_buf_p;\r
+\r
+       register YY_CHAR yy_c = 1;\r
+       if ( yy_accept[yy_current_state] )\r
+               {\r
+               yy_last_accepting_state = yy_current_state;\r
+               yy_last_accepting_cpos = yy_cp;\r
+               }\r
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )\r
+               {\r
+               yy_current_state = (int) yy_def[yy_current_state];\r
+               if ( yy_current_state >= 397 )\r
+                       yy_c = yy_meta[(unsigned int) yy_c];\r
+               }\r
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];\r
+       yy_is_jam = (yy_current_state == 396);\r
+\r
+       return yy_is_jam ? 0 : yy_current_state;\r
+       }\r
+\r
+\r
+#ifndef YY_NO_UNPUT\r
+#ifdef YY_USE_PROTOS\r
+static void yyunput( int c, register char *yy_bp )\r
+#else\r
+static void yyunput( c, yy_bp )\r
+int c;\r
+register char *yy_bp;\r
+#endif\r
+       {\r
+       register char *yy_cp = yy_c_buf_p;\r
+\r
+       /* undo effects of setting up yytext */\r
+       *yy_cp = yy_hold_char;\r
+\r
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )\r
+               { /* need to shift things up to make room */\r
+               /* +2 for EOB chars. */\r
+               register int number_to_move = yy_n_chars + 2;\r
+               register char *dest = &yy_current_buffer->yy_ch_buf[\r
+                                       yy_current_buffer->yy_buf_size + 2];\r
+               register char *source =\r
+                               &yy_current_buffer->yy_ch_buf[number_to_move];\r
+\r
+               while ( source > yy_current_buffer->yy_ch_buf )\r
+                       *--dest = *--source;\r
+\r
+               yy_cp += (int) (dest - source);\r
+               yy_bp += (int) (dest - source);\r
+               yy_current_buffer->yy_n_chars =\r
+                       yy_n_chars = yy_current_buffer->yy_buf_size;\r
+\r
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )\r
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );\r
+               }\r
+\r
+       *--yy_cp = (char) c;\r
+\r
+\r
+       yytext_ptr = yy_bp;\r
+       yy_hold_char = *yy_cp;\r
+       yy_c_buf_p = yy_cp;\r
+       }\r
+#endif /* ifndef YY_NO_UNPUT */\r
+\r
+\r
+#ifdef __cplusplus\r
+static int yyinput()\r
+#else\r
+static int input()\r
+#endif\r
+       {\r
+       int c;\r
+\r
+       *yy_c_buf_p = yy_hold_char;\r
+\r
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )\r
+               {\r
+               /* yy_c_buf_p now points to the character we want to return.\r
+                * If this occurs *before* the EOB characters, then it's a\r
+                * valid NUL; if not, then we've hit the end of the buffer.\r
+                */\r
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )\r
+                       /* This was really a NUL. */\r
+                       *yy_c_buf_p = '\0';\r
+\r
+               else\r
+                       { /* need more input */\r
+                       int offset = yy_c_buf_p - yytext_ptr;\r
+                       ++yy_c_buf_p;\r
+\r
+                       switch ( yy_get_next_buffer() )\r
+                               {\r
+                               case EOB_ACT_LAST_MATCH:\r
+                                       /* This happens because yy_g_n_b()\r
+                                        * sees that we've accumulated a\r
+                                        * token and flags that we need to\r
+                                        * try matching the token before\r
+                                        * proceeding.  But for input(),\r
+                                        * there's no matching to consider.\r
+                                        * So convert the EOB_ACT_LAST_MATCH\r
+                                        * to EOB_ACT_END_OF_FILE.\r
+                                        */\r
+\r
+                                       /* Reset buffer status. */\r
+                                       yyrestart( yyin );\r
+\r
+                                       /* fall through */\r
+\r
+                               case EOB_ACT_END_OF_FILE:\r
+                                       {\r
+                                       if ( yywrap() )\r
+                                               return EOF;\r
+\r
+                                       if ( ! yy_did_buffer_switch_on_eof )\r
+                                               YY_NEW_FILE;\r
+#ifdef __cplusplus\r
+                                       return yyinput();\r
+#else\r
+                                       return input();\r
+#endif\r
+                                       }\r
+\r
+                               case EOB_ACT_CONTINUE_SCAN:\r
+                                       yy_c_buf_p = yytext_ptr + offset;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */\r
+       *yy_c_buf_p = '\0';     /* preserve yytext */\r
+       yy_hold_char = *++yy_c_buf_p;\r
+\r
+       yy_current_buffer->yy_at_bol = (c == '\n');\r
+\r
+       return c;\r
+       }\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+void yyrestart( FILE *input_file )\r
+#else\r
+void yyrestart( input_file )\r
+FILE *input_file;\r
+#endif\r
+       {\r
+       if ( ! yy_current_buffer )\r
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );\r
+\r
+       yy_init_buffer( yy_current_buffer, input_file );\r
+       yy_load_buffer_state();\r
+       }\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )\r
+#else\r
+void yy_switch_to_buffer( new_buffer )\r
+YY_BUFFER_STATE new_buffer;\r
+#endif\r
+       {\r
+       if ( yy_current_buffer == new_buffer )\r
+               return;\r
+\r
+       if ( yy_current_buffer )\r
+               {\r
+               /* Flush out information for old buffer. */\r
+               *yy_c_buf_p = yy_hold_char;\r
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;\r
+               yy_current_buffer->yy_n_chars = yy_n_chars;\r
+               }\r
+\r
+       yy_current_buffer = new_buffer;\r
+       yy_load_buffer_state();\r
+\r
+       /* We don't actually know whether we did this switch during\r
+        * EOF (yywrap()) processing, but the only time this flag\r
+        * is looked at is after yywrap() is called, so it's safe\r
+        * to go ahead and always set it.\r
+        */\r
+       yy_did_buffer_switch_on_eof = 1;\r
+       }\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+void yy_load_buffer_state( void )\r
+#else\r
+void yy_load_buffer_state()\r
+#endif\r
+       {\r
+       yy_n_chars = yy_current_buffer->yy_n_chars;\r
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;\r
+       yyin = yy_current_buffer->yy_input_file;\r
+       yy_hold_char = *yy_c_buf_p;\r
+       }\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )\r
+#else\r
+YY_BUFFER_STATE yy_create_buffer( file, size )\r
+FILE *file;\r
+int size;\r
+#endif\r
+       {\r
+       YY_BUFFER_STATE b;\r
+\r
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );\r
+       if ( ! b )\r
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );\r
+\r
+       b->yy_buf_size = size;\r
+\r
+       /* yy_ch_buf has to be 2 characters longer than the size given because\r
+        * we need to put in 2 end-of-buffer characters.\r
+        */\r
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );\r
+       if ( ! b->yy_ch_buf )\r
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );\r
+\r
+       b->yy_is_our_buffer = 1;\r
+\r
+       yy_init_buffer( b, file );\r
+\r
+       return b;\r
+       }\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+void yy_delete_buffer( YY_BUFFER_STATE b )\r
+#else\r
+void yy_delete_buffer( b )\r
+YY_BUFFER_STATE b;\r
+#endif\r
+       {\r
+       if ( ! b )\r
+               return;\r
+\r
+       if ( b == yy_current_buffer )\r
+               yy_current_buffer = (YY_BUFFER_STATE) 0;\r
+\r
+       if ( b->yy_is_our_buffer )\r
+               yy_flex_free( (void *) b->yy_ch_buf );\r
+\r
+       yy_flex_free( (void *) b );\r
+       }\r
+\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )\r
+#else\r
+void yy_init_buffer( b, file )\r
+YY_BUFFER_STATE b;\r
+FILE *file;\r
+#endif\r
+\r
+\r
+       {\r
+       yy_flush_buffer( b );\r
+\r
+       b->yy_input_file = file;\r
+       b->yy_fill_buffer = 1;\r
+\r
+#if YY_ALWAYS_INTERACTIVE\r
+       b->yy_is_interactive = 1;\r
+#else\r
+#if YY_NEVER_INTERACTIVE\r
+       b->yy_is_interactive = 0;\r
+#else\r
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;\r
+#endif\r
+#endif\r
+       }\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+void yy_flush_buffer( YY_BUFFER_STATE b )\r
+#else\r
+void yy_flush_buffer( b )\r
+YY_BUFFER_STATE b;\r
+#endif\r
+\r
+       {\r
+       if ( ! b )\r
+               return;\r
+\r
+       b->yy_n_chars = 0;\r
+\r
+       /* We always need two end-of-buffer characters.  The first causes\r
+        * a transition to the end-of-buffer state.  The second causes\r
+        * a jam in that state.\r
+        */\r
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;\r
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;\r
+\r
+       b->yy_buf_pos = &b->yy_ch_buf[0];\r
+\r
+       b->yy_at_bol = 1;\r
+       b->yy_buffer_status = YY_BUFFER_NEW;\r
+\r
+       if ( b == yy_current_buffer )\r
+               yy_load_buffer_state();\r
+       }\r
+\r
+\r
+#ifndef YY_NO_SCAN_BUFFER\r
+#ifdef YY_USE_PROTOS\r
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )\r
+#else\r
+YY_BUFFER_STATE yy_scan_buffer( base, size )\r
+char *base;\r
+yy_size_t size;\r
+#endif\r
+       {\r
+       YY_BUFFER_STATE b;\r
+\r
+       if ( size < 2 ||\r
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||\r
+            base[size-1] != YY_END_OF_BUFFER_CHAR )\r
+               /* They forgot to leave room for the EOB's. */\r
+               return 0;\r
+\r
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );\r
+       if ( ! b )\r
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );\r
+\r
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */\r
+       b->yy_buf_pos = b->yy_ch_buf = base;\r
+       b->yy_is_our_buffer = 0;\r
+       b->yy_input_file = 0;\r
+       b->yy_n_chars = b->yy_buf_size;\r
+       b->yy_is_interactive = 0;\r
+       b->yy_at_bol = 1;\r
+       b->yy_fill_buffer = 0;\r
+       b->yy_buffer_status = YY_BUFFER_NEW;\r
+\r
+       yy_switch_to_buffer( b );\r
+\r
+       return b;\r
+       }\r
+#endif\r
+\r
+\r
+#ifndef YY_NO_SCAN_STRING\r
+#ifdef YY_USE_PROTOS\r
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )\r
+#else\r
+YY_BUFFER_STATE yy_scan_string( yy_str )\r
+yyconst char *yy_str;\r
+#endif\r
+       {\r
+       int len;\r
+       for ( len = 0; yy_str[len]; ++len )\r
+               ;\r
+\r
+       return yy_scan_bytes( yy_str, len );\r
+       }\r
+#endif\r
+\r
+\r
+#ifndef YY_NO_SCAN_BYTES\r
+#ifdef YY_USE_PROTOS\r
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )\r
+#else\r
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )\r
+yyconst char *bytes;\r
+int len;\r
+#endif\r
+       {\r
+       YY_BUFFER_STATE b;\r
+       char *buf;\r
+       yy_size_t n;\r
+       int i;\r
+\r
+       /* Get memory for full buffer, including space for trailing EOB's. */\r
+       n = len + 2;\r
+       buf = (char *) yy_flex_alloc( n );\r
+       if ( ! buf )\r
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );\r
+\r
+       for ( i = 0; i < len; ++i )\r
+               buf[i] = bytes[i];\r
+\r
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;\r
+\r
+       b = yy_scan_buffer( buf, n );\r
+       if ( ! b )\r
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );\r
+\r
+       /* It's okay to grow etc. this buffer, and we should throw it\r
+        * away when we're done.\r
+        */\r
+       b->yy_is_our_buffer = 1;\r
+\r
+       return b;\r
+       }\r
+#endif\r
+\r
+\r
+#ifndef YY_NO_PUSH_STATE\r
+#ifdef YY_USE_PROTOS\r
+static void yy_push_state( int new_state )\r
+#else\r
+static void yy_push_state( new_state )\r
+int new_state;\r
+#endif\r
+       {\r
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )\r
+               {\r
+               yy_size_t new_size;\r
+\r
+               yy_start_stack_depth += YY_START_STACK_INCR;\r
+               new_size = yy_start_stack_depth * sizeof( int );\r
+\r
+               if ( ! yy_start_stack )\r
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );\r
+\r
+               else\r
+                       yy_start_stack = (int *) yy_flex_realloc(\r
+                                       (void *) yy_start_stack, new_size );\r
+\r
+               if ( ! yy_start_stack )\r
+                       YY_FATAL_ERROR(\r
+                       "out of memory expanding start-condition stack" );\r
+               }\r
+\r
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;\r
+\r
+       BEGIN(new_state);\r
+       }\r
+#endif\r
+\r
+\r
+#ifndef YY_NO_POP_STATE\r
+static void yy_pop_state()\r
+       {\r
+       if ( --yy_start_stack_ptr < 0 )\r
+               YY_FATAL_ERROR( "start-condition stack underflow" );\r
+\r
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);\r
+       }\r
+#endif\r
+\r
+\r
+#ifndef YY_NO_TOP_STATE\r
+static int yy_top_state()\r
+       {\r
+       return yy_start_stack[yy_start_stack_ptr - 1];\r
+       }\r
+#endif\r
+\r
+#ifndef YY_EXIT_FAILURE\r
+#define YY_EXIT_FAILURE 2\r
+#endif\r
+\r
+#ifdef YY_USE_PROTOS\r
+static void yy_fatal_error( yyconst char msg[] )\r
+#else\r
+static void yy_fatal_error( msg )\r
+char msg[];\r
+#endif\r
+       {\r
+       (void) fprintf( stderr, "%s\n", msg );\r
+       exit( YY_EXIT_FAILURE );\r
+       }\r
+\r
+\r
+\r
+/* Redefine yyless() so it works in section 3 code. */\r
+\r
+#undef yyless\r
+#define yyless(n) \\r
+       do \\r
+               { \\r
+               /* Undo effects of setting up yytext. */ \\r
+               yytext[yyleng] = yy_hold_char; \\r
+               yy_c_buf_p = yytext + n; \\r
+               yy_hold_char = *yy_c_buf_p; \\r
+               *yy_c_buf_p = '\0'; \\r
+               yyleng = n; \\r
+               } \\r
+       while ( 0 )\r
+\r
+\r
+/* Internal utility routines. */\r
+\r
+#ifndef yytext_ptr\r
+#ifdef YY_USE_PROTOS\r
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )\r
+#else\r
+static void yy_flex_strncpy( s1, s2, n )\r
+char *s1;\r
+yyconst char *s2;\r
+int n;\r
+#endif\r
+       {\r
+       register int i;\r
+       for ( i = 0; i < n; ++i )\r
+               s1[i] = s2[i];\r
+       }\r
+#endif\r
+\r
+#ifdef YY_NEED_STRLEN\r
+#ifdef YY_USE_PROTOS\r
+static int yy_flex_strlen( yyconst char *s )\r
+#else\r
+static int yy_flex_strlen( s )\r
+yyconst char *s;\r
+#endif\r
+       {\r
+       register int n;\r
+       for ( n = 0; s[n]; ++n )\r
+               ;\r
+\r
+       return n;\r
+       }\r
+#endif\r
+\r
+\r
+#ifdef YY_USE_PROTOS\r
+/* Nick static */ void *yy_flex_alloc( yy_size_t size )\r
+#else\r
+/* Nick static */ void *yy_flex_alloc( size )\r
+yy_size_t size;\r
+#endif\r
+       {\r
+#ifdef DEBUG /* Nick */\r
+ printf("yy_flex_alloc(%d) starting\n", size);\r
+ fflush(stdout);\r
+#endif\r
+       return (void *) malloc( size );\r
+       }\r
+\r
+#ifdef YY_USE_PROTOS\r
+/* Nick static */ void *yy_flex_realloc( void *ptr, yy_size_t size )\r
+#else\r
+/* Nick static */ void *yy_flex_realloc( ptr, size )\r
+void *ptr;\r
+yy_size_t size;\r
+#endif\r
+       {\r
+       /* The cast to (char *) in the following accommodates both\r
+        * implementations that use char* generic pointers, and those\r
+        * that use void* generic pointers.  It works with the latter\r
+        * because both ANSI C and C++ allow castless assignment from\r
+        * any pointer type to void*, and deal with argument conversions\r
+        * as though doing an assignment.\r
+        */\r
+#ifdef DEBUG /* Nick */\r
+ printf("yy_flex_realloc(%08lx, %d) starting\n", ptr, size);\r
+ fflush(stdout);\r
+#endif\r
+       return (void *) realloc( (char *) ptr, size );\r
+       }\r
+\r
+#ifdef YY_USE_PROTOS\r
+static void yy_flex_free( void *ptr )\r
+#else\r
+static void yy_flex_free( ptr )\r
+void *ptr;\r
+#endif\r
+       {\r
+#ifdef DEBUG /* Nick */\r
+ printf("yy_flex_free(%08lx) starting\n", ptr);\r
+ fflush(stdout);\r
+#endif\r
+       free( ptr );\r
+       }\r
+\r
+#if YY_MAIN\r
+int main()\r
+       {\r
+       yylex();\r
+       return 0;\r
+       }\r
+#endif\r
+/* #line 320 "avrlex.l" */\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//////////////////////////////////////////////////////////////////////////////\r
+///                                                                        ///\r
+///   Scanner support functions                                            ///\r
+///                                                                        ///\r
+//////////////////////////////////////////////////////////////////////////////\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Identifiers\r
+  //\r
+\r
+int character(void)\r
+{\r
+  yylval.val.value = 0;\r
+  yylval.val.valid = FALSE;\r
+\r
+  if(yytext[1]=='\\')\r
+  {\r
+    switch (yytext[2])\r
+    {\r
+      case 'n'  : yylval.val.value = '\n' ; yylval.val.valid = TRUE; break;\r
+      case 't'  : yylval.val.value = '\t' ; yylval.val.valid = TRUE; break;\r
+      case 'v'  : yylval.val.value = '\v' ; yylval.val.valid = TRUE; break;\r
+      case 'b'  : yylval.val.value = '\b' ; yylval.val.valid = TRUE; break;\r
+      case 'r'  : yylval.val.value = '\r' ; yylval.val.valid = TRUE; break;\r
+      case 'f'  : yylval.val.value = '\f' ; yylval.val.valid = TRUE; break;\r
+      case 'a'  : yylval.val.value = '\a' ; yylval.val.valid = TRUE; break;\r
+      case '\\' : yylval.val.value = '\\' ; yylval.val.valid = TRUE; break;\r
+      case '\'' : yylval.val.value = '\'' ; yylval.val.valid = TRUE; break;\r
+      case '\"' : yylval.val.value = '\"' ; yylval.val.valid = TRUE; break;\r
+      case '\?' : yylval.val.value = '\?' ; yylval.val.valid = TRUE; break;\r
+      case 'x'  :\r
+      case 'X'  :\r
+      {\r
+        if(isdigit(yytext[3]))\r
+          yylval.val.value = yytext[3] - '0';\r
+        else if(isxdigit(yytext[3]))\r
+          yylval.val.value = tolower(yytext[3]) - 'a' + 10;\r
+\r
+        if(isxdigit(yytext[3]) && isxdigit(yytext[4]))\r
+        {\r
+          if(isdigit(yytext[4]))\r
+            yylval.val.value = 16*yylval.val.value + yytext[4] - '0';\r
+          else\r
+            yylval.val.value = 16*yylval.val.value+tolower(yytext[4])-'a'+10;\r
+        }\r
+        yylval.val.valid = TRUE;\r
+\r
+      } break;\r
+\r
+      case '0'  :\r
+      case '1'  :\r
+      case '2'  :\r
+      case '3'  :\r
+      case '4'  :\r
+      case '5'  :\r
+      case '6'  :\r
+      case '7'  :\r
+      {\r
+        yylval.val.value = yytext[2] - '0';\r
+        if(isdigit(yytext[3]))\r
+        {\r
+          yylval.val.value = 8*yylval.val.value + yytext[3] - '0';\r
+          if(isdigit(yytext[4]))\r
+            yylval.val.value = 8*yylval.val.value + yytext[4] - '0';\r
+        }\r
+        if(yylval.val.value > 0xFF)\r
+        {\r
+          yylval.val.value = 0;\r
+          warningin(W_OCT_OUT_OF_RANGE);\r
+        }\r
+        yylval.val.valid = TRUE;\r
+\r
+      } break;\r
+\r
+      default   : errorin(E_UNDEF_ESCAPE,yytext);\r
+    }\r
+  }\r
+  else\r
+  {\r
+    yylval.val.value = yytext[1];\r
+    yylval.val.valid = TRUE;\r
+  }\r
+  return INTEGER;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Identifiers\r
+  //\r
+\r
+int identifier(void)\r
+{\r
+  char name[MAX_ID_LENGTH+1];\r
+\r
+  if(yytext[0] == '_' && yycfg->local_labels)\r
+  {\r
+    if(strlen(yytext)+strlen(yylast_used_label)+2>MAX_ID_LENGTH)\r
+    {\r
+      size_t len;\r
+      \r
+      warningin(W_IDENTIFIER_TOO_LONG);\r
+      name[0]='@';\r
+      memcpy(name+1, yylast_used_label, MAX_ID_LENGTH-1);\r
+      name[MAX_ID_LENGTH] = '\0';\r
+      len = strlen(name);\r
+      if(len>MAX_ID_LENGTH-9)\r
+        len = MAX_ID_LENGTH-9;      // truncate the last_used_label to leave at least 8 characters for the local label\r
+      name[len++] = '@';\r
+      memcpy(name+len, yytext, MAX_ID_LENGTH-len);\r
+      name[MAX_ID_LENGTH] = '\0';\r
+    }\r
+    else\r
+    {\r
+      sprintf(name, "@%s@%s", yylast_used_label, yytext);\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if(strlen(yytext)>MAX_ID_LENGTH)\r
+    {\r
+      warningin(W_IDENTIFIER_TOO_LONG);\r
+      memcpy(name, yytext, MAX_ID_LENGTH);\r
+      name[MAX_ID_LENGTH] = '\0';\r
+    }\r
+    else\r
+      strcpy(name, yytext);\r
+  }\r
+\r
+  yylval.symb = getsym(name);\r
+\r
+  if(yylval.symb -> macro)\r
+    return macro(yylval.symb);\r
+\r
+  return SYMBOL;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Registers : r0 - r31\r
+  //\r
+\r
+int registers(void)\r
+{\r
+  int registerno;\r
+\r
+  if(strlen(yytext)==2)\r
+  {\r
+    if(isdigit(yytext[1]))\r
+      registerno= yytext[1] - '0';\r
+    else\r
+      return identifier();\r
+  }\r
+  else if(strlen(yytext)==3)\r
+  {\r
+    if(isdigit(yytext[1]) && isdigit(yytext[2]) )\r
+      registerno= 10 * (yytext[1] - '0') + yytext[2] - '0';\r
+    else\r
+      return identifier();\r
+  }\r
+  else\r
+    return identifier();\r
+\r
+  if(registerno <= 31)\r
+  {\r
+    yylval.regid = registerno;\r
+    return REGISTER;\r
+  }\r
+  return identifier();\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Strings\r
+  //\r
+\r
+int string(void)\r
+{\r
+  if( !(yylval.string = new char[strlen(yytext)+1]) )\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 2\n");\r
+ fflush(stdout);\r
+#endif\r
+    errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+  strcpy(yylval.string, yytext);\r
+\r
+  return STRING;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Integer constants : Decimal=10 Hex=0xA Hex=$A Octal=012 Binaray=0b1010\r
+  //\r
+\r
+int integers(void)\r
+{\r
+#ifdef _MSC_VER /* Nick */\r
+  int  val;\r
+#else\r
+  long val;\r
+#endif\r
+  int  pos;\r
+  char temp[12];\r
+\r
+  bool foundhex = (strpbrk(yytext,"ABCDEFabcdef")!=NULL);\r
+  bool foundbin = !(strpbrk(yytext,"ACDEFacdef23456789")!=NULL);\r
+\r
+  // Hex : $BABE\r
+\r
+  if(yytext[0] == '$' )\r
+  {\r
+    val = 0;\r
+    pos = 1;\r
+    while( yytext[pos] )\r
+    {\r
+      if(isdigit(yytext[pos]))\r
+        val = 16*val + yytext[pos] - '0';\r
+      else\r
+        val = 16*val + tolower(yytext[pos]) - 'a' + 10;\r
+      pos++;\r
+    }\r
+    if(pos>9)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  // Hex : 0xBABE or 0XBABE\r
+\r
+  else if( (yytext[0] == '0' ) && (tolower(yytext[1]) == 'x' ))\r
+  {\r
+    val = 0;\r
+    pos = 2;\r
+    while( yytext[pos] )\r
+    {\r
+      if(isdigit(yytext[pos]))\r
+        val = 16*val + yytext[pos] - '0';\r
+      else\r
+        val = 16*val + tolower(yytext[pos]) - 'a' + 10;\r
+      pos++;\r
+\r
+    }\r
+    if(pos>10)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  // Bin : 0b01010 or 0B01010\r
+\r
+  else if( (yytext[0] == '0' ) && (tolower(yytext[1]) == 'b' ) && foundbin)\r
+  {\r
+    val = 0;\r
+    pos = 2;\r
+    while( yytext[pos] )\r
+      val = 2*val + yytext[pos++] - '0';\r
+    if(pos>34)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  // Hex : 1BABE (Hex that starts with a decimal)\r
+\r
+  else if(isdigit(yytext[0]) && foundhex )\r
+  {\r
+    val = 0;\r
+    pos = 0;\r
+    while( yytext[pos] )\r
+    {\r
+      if(isdigit(yytext[pos]))\r
+        val = 16*val + yytext[pos] - '0';\r
+      else\r
+        val = 16*val + tolower(yytext[pos]) - 'a' + 10;\r
+      pos++;\r
+    }\r
+    if(pos>8)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+\r
+  // Integer 47806\r
+\r
+  else\r
+  {\r
+#ifdef _MSC_VER /* Nick */\r
+    val = atoi(yytext);\r
+    sprintf(temp, "%i", val);\r
+#else\r
+    val = atol(yytext);\r
+    sprintf(temp, "%ld", val);\r
+#endif\r
+    if(strcmp(temp,yytext))\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  yylval.val.value = val;\r
+  yylval.val.valid = TRUE;\r
+  return INTEGER;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Illegal character\r
+  //\r
+\r
+void illegal(void)\r
+{\r
+  if(isprint(yytext[0]))\r
+    warningin(W_INVALID_CHAR,yytext[0]);\r
+  else\r
+    warningin(W_INVALID_ASCII,(unsigned char)yytext[0]);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Include file\r
+  //\r
+\r
+int includefile(void)\r
+{\r
+  char name[MAX_LINE_LENGTH+2];\r
+  char filename[MAX_FILENAME_LENGTH+1];\r
+  int  c;\r
+  FILE *f1,*f2;\r
+\r
+  if(strlen(yytext)==strlen(".include"))\r
+  {\r
+    yyinput();\r
+    endofline();\r
+    error(E_NO_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  /// Check filename ////////////////////////////////////////////////////////\r
+\r
+  if(strlen(yytext) >= MAX_LINE_LENGTH)\r
+    errorexit(X_LINE_TOO_LONG, yyfilename);\r
+\r
+  strcpy(name,yytext+8+strspn(yytext,"\t\v ")\r
+              +strspn(yytext+8+strspn(yytext,"\t\v "),"\t\v "));\r
+\r
+  if(!strlen(name))\r
+  {\r
+    yyinput();\r
+    endofline();\r
+    error(E_NO_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  striprem(name);\r
+\r
+  if(!strlen(name))\r
+  {\r
+    yyinput();\r
+    endofline();\r
+    error(E_NO_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  /// Read NL (or EOF) //////////////////////////////////////////////////////\r
+\r
+  yyinput();\r
+  endofline();\r
+\r
+  if( !getfilename(name, filename) )\r
+  {\r
+    error(E_INVALID_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  /// Check context depth ///////////////////////////////////////////////////\r
+\r
+  if( yycontext == (MAX_CONTEXT_DEPTH-1) )\r
+  {\r
+    errorin(E_INCLUDE_DEPTH, name);\r
+    return EOL;\r
+  }\r
+\r
+  if( !(f1 = fopenInIncpath(filename,"r")) )\r
+  {\r
+    error(E_OPEN_FILE, filename);\r
+    return EOL;\r
+  }\r
+  else if( !(f2 = fopenInIncpath(filename,"r")) )\r
+  {\r
+    fclose(f1);\r
+    error(E_OPEN_FILE, filename);\r
+    return EOL;\r
+  }\r
+\r
+  /// Setup context stack ///////////////////////////////////////////////////\r
+\r
+  CONTEXT->file       = yyin;\r
+  CONTEXT->file2      = yyin2;\r
+  CONTEXT->line       = yyline;\r
+  CONTEXT->offset     = yyoffset;\r
+  CONTEXT->dataoffset = yydataoffset;\r
+  CONTEXT->eromoffset = yyeromoffset;\r
+\r
+  strcpy(CONTEXT->yyinlineold, yyinlineold);\r
+  strcpy(CONTEXT->yyinline,    yyinline);\r
+  strcpy(CONTEXT->yyinlinenew, yyinlinenew);\r
+\r
+  statestack[yycontext++] = YY_CURRENT_BUFFER;\r
+\r
+  /// Open input file ///////////////////////////////////////////////////////\r
+\r
+  if(yyfilecount==MAX_FILES)\r
+    errorexit(X_TOO_MANY_FILES);\r
+\r
+  yyfileno = -1;\r
+\r
+  for(c=0;c<yyfilecount;c++)\r
+    if(!strcmp(filename, yyfilelist[c]))\r
+      yyfileno = c+1;\r
+\r
+  if(yyfileno==-1)\r
+  {\r
+    if( !(yyfilelist[yyfilecount] = new char[MAX_FILENAME_LENGTH]) )\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 3\n");\r
+ fflush(stdout);\r
+#endif\r
+      errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+    strcpy(yyfilelist[yyfilecount], filename);\r
+    yyfileno = ++yyfilecount;\r
+  }\r
+\r
+  yyin   = CONTEXT->file  = f1;\r
+  yyin2  = CONTEXT->file2 = f2;\r
+\r
+  strcpy(CONTEXT->filename, filename);\r
+  strcpy(yyfilename, filename);\r
+\r
+  /// Add .include line to log //////////////////////////////////////////////\r
+\r
+  tolog();\r
+\r
+  if(!yyinmacro)\r
+    yyline = 1;\r
+  else\r
+    yyline =0;\r
+\r
+  yyline = 1; // XXX\r
+\r
+  /// Read new lines into log buffers ///////////////////////////////////////\r
+\r
+  if(!fgets(yyinline, MAX_LINE_LENGTH, yyin2))\r
+    yyinline[0] = 0;\r
+  if(!fgets(yyinlinenew, MAX_LINE_LENGTH, yyin2))\r
+    yyinlinenew[0] = 0;\r
+\r
+  if(strlen(yyinline) == MAX_LINE_LENGTH-1)\r
+    errorexit(X_LINE_TOO_LONG, yyfilename);\r
+  if(strlen(yyinlinenew) == MAX_LINE_LENGTH-1)\r
+    errorexit(X_LINE_TOO_LONG, yyfilename);\r
+\r
+  STRIPNR(yyinlinenew);\r
+  STRIPNR(yyinline);\r
+\r
+  /// Setup scanner to read from new file ///////////////////////////////////\r
+\r
+  yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));\r
+\r
+  return TRUE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // End of line\r
+  //\r
+\r
+int endofline(void)\r
+{\r
+  int pos;\r
+\r
+  strcpy(yyinlineold, yyinline);\r
+  strcpy(yyinline, yyinlinenew);\r
+\r
+  if(!ISMACRO)\r
+  {\r
+    if(!fgets(yyinlinenew,MAX_LINE_LENGTH,yyin2))\r
+      yyinlinenew[0] = '\0';\r
+    if(strlen(yyinlinenew)==MAX_LINE_LENGTH-1)\r
+      errorexit(X_LINE_TOO_LONG, yyfilename);\r
+    //if(yyinmacro)\r
+      yyline++;\r
+  }\r
+  else\r
+  {\r
+    if( (int)strlen(CONTEXT->macstr) > CONTEXT->stringpos)\r
+    {\r
+      pos = strcspn(CONTEXT->macstr+CONTEXT->stringpos,"\n");\r
+      if(pos<MAX_LINE_LENGTH)\r
+        memcpy(yyinlinenew,CONTEXT->macstr+CONTEXT->stringpos, pos);\r
+      else\r
+        errorexit(X_MACRO_LINE_TOO_LONG, yyline, yyfilename);\r
+\r
+      yyinlinenew[pos] = 0;\r
+      CONTEXT->stringpos += pos+1;\r
+    }\r
+    else\r
+      yyinlinenew[0] = 0;\r
+  }\r
+\r
+  STRIPNR(yyinlinenew);\r
+  return EOL;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Restart scanner after first parse, and handle macro/include context\r
+  //\r
+\r
+int restart(void)\r
+{\r
+  int c;\r
+\r
+#ifdef DEBUG /* Nick */\r
+ printf("restart() starting\n");\r
+ fflush(stdout);\r
+#endif\r
+\r
+  if(!restartcount++ && !ISMACRO)\r
+  {\r
+    strcpy(yyinlineold, yyinline);\r
+    strcpy(yyinline, yyinlinenew);\r
+    strcpy(yyinlinenew, "This should never show up");\r
+    yyline++;\r
+#ifdef DEBUG /* Nick */\r
+ printf("restart() returning EOL 0\n");\r
+ fflush(stdout);\r
+#endif\r
+    return EOL;\r
+  }\r
+\r
+  restartcount = 0;\r
+\r
+  if(yycontext)\r
+  {\r
+    yy_delete_buffer(YY_CURRENT_BUFFER);\r
+    yy_switch_to_buffer(statestack[--yycontext]);\r
+\r
+    if( yycontextstack[yycontext+1]->ismacro )\r
+    {\r
+      yyinmacro--;\r
+      strcpy(yyinlineold, CONTEXT->yyinlineold);\r
+      strcpy(yyinline,    CONTEXT->yyinline);\r
+      strcpy(yyinlinenew, CONTEXT->yyinlinenew);\r
+      delete yycontextstack[yycontext+1]->macstr;\r
+\r
+      yysymbolstack[yycontext+1] = NULL;\r
+      yyoffset     = CONTEXT->offset;\r
+      yydataoffset = CONTEXT->dataoffset;\r
+      yyeromoffset = CONTEXT->eromoffset;\r
+      yyline = CONTEXT->line + 1;\r
+      if(ISMACRO)\r
+        endofline();\r
+      else\r
+      {\r
+        if(!fgets(yyinlinenew, MAX_LINE_LENGTH, yyin2))\r
+          yyinlinenew[0] = 0;\r
+      }\r
+\r
+      if(strlen(yyinlinenew) == MAX_LINE_LENGTH-1)\r
+        errorexit(X_LINE_TOO_LONG, yyfilename);\r
+      memset(yycontextstack[yycontext+1],0,sizeof(context));\r
+#ifdef DEBUG /* Nick */\r
+ printf("restart() returning SKIPRESTART 0\n");\r
+ fflush(stdout);\r
+#endif\r
+      return SKIPRESTART;\r
+    }\r
+    else\r
+    {\r
+      if(ISMACRO)\r
+      {\r
+        for(c=yycontext;c>=0;c--)\r
+        {\r
+          if(!yycontextstack[c]->ismacro)\r
+          {\r
+            strcpy(yyfilename, yycontextstack[c]->filename);\r
+            c = -1;\r
+          }\r
+        }\r
+      }\r
+      else\r
+        strcpy(yyfilename, CONTEXT->filename);\r
+\r
+      yyline = CONTEXT->line;\r
+\r
+      fclose(yycontextstack[yycontext+1]->file);\r
+      fclose(yycontextstack[yycontext+1]->file2);\r
+\r
+      yyin         = CONTEXT->file;\r
+      yyin2        = CONTEXT->file2;\r
+      yyoffset     = CONTEXT->offset;\r
+      yydataoffset = CONTEXT->dataoffset;\r
+      yyeromoffset = CONTEXT->eromoffset;\r
+\r
+      strcpy(yyinline,    CONTEXT->yyinline);\r
+      strcpy(yyinlinenew, CONTEXT->yyinlinenew);\r
+      memset(yycontextstack[yycontext+1],0,sizeof(context));\r
+\r
+      yyfileno = -1;\r
+      for(c=0;c<yyfilecount;c++)\r
+        if(!strcmp(yyfilename, yyfilelist[c]))\r
+          yyfileno = c+1;\r
+\r
+      if(yyfileno==-1)\r
+        internalerror("FF");\r
+      yylval.val.value = 0x1234;\r
+#ifdef DEBUG /* Nick */\r
+ printf("restart() returning SKIPRESTART 1\n");\r
+ fflush(stdout);\r
+#endif\r
+      return SKIPRESTART;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if(!yyparseno)\r
+    {\r
+      yyparseno++;\r
+      INITEXTERN;\r
+      yylinetxt[0]   = '\0';\r
+      fseek(yyin, 0, SEEK_SET);\r
+      fseek(yyin2, 0, SEEK_SET);\r
+      if(!fgets(yyinline, MAX_LINE_LENGTH, yyin2))\r
+        strcpy(yyinline,"\n");\r
+      if(!fgets(yyinlinenew, MAX_LINE_LENGTH, yyin2))\r
+        strcpy(yyinlinenew,"\n");\r
+      STRIPNR(yyinline);\r
+      STRIPNR(yyinlinenew);\r
+#ifdef DEBUG /* Nick */\r
+ printf("restart() returning RESTART\n");\r
+ fflush(stdout);\r
+#endif\r
+      return RESTART;\r
+    }\r
+    else\r
+      yyterminate();\r
+  }\r
+#ifdef DEBUG /* Nick */\r
+ printf("restart() returning EOL 1\n");\r
+ fflush(stdout);\r
+#endif\r
+  return EOL;\r
+  yyunput(0, NULL); // One yyunput() a day, keeps warning away :-)\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle macro definition\r
+  //\r
+\r
+int macrodef(void)\r
+{\r
+  int                   ch;\r
+  int                   found      = FALSE;\r
+  int                   bufsize    = 32;\r
+  int                   pos        = 0;\r
+  int                   founddot   = 0;\r
+  int                   comment    = FALSE;\r
+  char                  *buf1      = NULL;\r
+  char                  *buf2      = NULL;\r
+  char                  endmacro[] = ".endm";\r
+  int                   temppos    = 0;\r
+  int                   temptime   = 0;\r
+  char                  temp[MAX_LINE_LENGTH+2];\r
+  symbolTableEntry      *symb;\r
+  int                   namestart;\r
+  int                   nameend;\r
+  char                  name[MAX_LINE_LENGTH+1];\r
+  int                   l;\r
+  int                   lastparm;\r
+  int                   inmacro;\r
+  int                   i;\r
+\r
+  /// Check that this is not in a macro context /////////////////////////////\r
+\r
+  if(CONTEXT->ismacro)\r
+  {\r
+    while( ((ch=yyinput())!='\r') && (ch!='\n') && (ch!=EOF) );\r
+    errorin(E_MACRO_IN_MACRO);\r
+    endofline();\r
+    return EOL;\r
+  }\r
+\r
+  /// Allocate buffer ///////////////////////////////////////////////////////\r
+\r
+  if( !(buf1 = new char[bufsize]) )\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 4\n");\r
+ fflush(stdout);\r
+#endif\r
+    errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+  /// Get macro string from input ///////////////////////////////////////////\r
+\r
+  while(!found)\r
+  {\r
+    ch = yyinput();\r
+\r
+    if(tolower(ch)==endmacro[founddot])\r
+      founddot++;\r
+    else\r
+      founddot=0;\r
+\r
+    if(founddot==4)\r
+    {\r
+      found = TRUE;\r
+      buf1[pos-3] = '\0';\r
+      sprintf(yyinlinenew,".endm");\r
+    }\r
+    else if(ch=='\n')\r
+    {\r
+      comment           = FALSE;\r
+      temp[temppos]     = 0;\r
+      temppos           = 0;\r
+      if(temptime++)\r
+      {\r
+        STRIPNR(temp);\r
+        strcpy(yyinlinenew, temp);\r
+        endofline();\r
+        tolog();\r
+      }\r
+    }\r
+    else if(ch==EOF)\r
+      found = TRUE;\r
+    else if(ch==';')\r
+      comment = TRUE;\r
+\r
+    buf1[pos++] = ch;\r
+\r
+    if(ch!='\n')\r
+      temp[temppos++] = ch;\r
+\r
+    if(pos==bufsize)\r
+    {\r
+      buf2 = new char[2*bufsize];\r
+      memcpy(buf2, buf1, bufsize);\r
+      delete buf1;\r
+      buf1 = buf2;\r
+      bufsize *=2;\r
+    }\r
+  }\r
+\r
+  /// Read until end of .endmacro line //////////////////////////////////////\r
+\r
+  while( ((ch=yyinput()) != EOF) && (ch!='\n') && (ch!='\r'))\r
+    yyinlinenew[temppos++] = ch;\r
+\r
+  yyinlinenew[temppos] = 0;\r
+\r
+  strcpy(temp, yyinlinenew);\r
+\r
+  endofline();\r
+  tolog();\r
+\r
+  if((ch==EOF)&&(founddot<4))\r
+  {\r
+    delete buf1;\r
+    if(strlen(yyinlineold))\r
+      yyinlineold[strlen(yyinlineold)-1] = '\0';\r
+    STRIPWS(yyinlineold);\r
+    error(E_EOF_IN_MACRO);\r
+    return restart();\r
+  }\r
+\r
+  /// Process string ////////////////////////////////////////////////////////\r
+\r
+  pos = strlen(buf1);\r
+\r
+  if( pos  && !(buf1[pos-1]=='\n') )\r
+    strcat(buf1, "\n");\r
+\r
+  /// Get macro name ////////////////////////////////////////////////////////\r
+\r
+  namestart = strspn(buf1,"\t\v ");\r
+  nameend   = strcspn(buf1+namestart,"\t\v \r\n;")+namestart;\r
+  memcpy(name, buf1+namestart, nameend-namestart);\r
+  name[nameend-namestart] = '\0';\r
+\r
+  /// Setup macro ///////////////////////////////////////////////////////////\r
+\r
+  for(i=yycontext; !yysymbolstack[i]; i--);\r
\r
+  if(!yyparseno)\r
+  {\r
+    if(strlen(name)>MAX_ID_LENGTH) {\r
+      warningin(W_MAC_IDENTIFIER_TOO_LONG);\r
+      name[MAX_ID_LENGTH] = '\0';      \r
+    }\r
+\r
+    if( (symb=yysymbolstack[i]->get(name)) )\r
+    {\r
+      error(E_MACRO_REDEF,name);\r
+      return EOL;\r
+    }\r
+    symb = yysymbolstack[i]->add(name);\r
+  }\r
+  else {\r
+    if(strlen(name)>MAX_ID_LENGTH) {\r
+      warningin(W_MAC_IDENTIFIER_TOO_LONG);\r
+      name[MAX_ID_LENGTH] = '\0';      \r
+    }\r
+    symb=yysymbolstack[i]->get(name);\r
+  }\r
+\r
+  if(!symb)\r
+    internalerror("DM");\r
+\r
+  if( ISUSED(symb) && ((symb->macdefline != yyline)\r
+      ||(strcmp(symb->macfilename, yyfilename)) ))\r
+  {\r
+    strcpy(yyinlineold,".endmacro");\r
+    error(E_MACRO_REDEF,name);\r
+  }\r
+  else\r
+  {\r
+    // If first parse - allocate space in symbol table for macro\r
+\r
+    if(!yyparseno)\r
+    {\r
+      symb -> macro      = TRUE;\r
+      symb -> macsize    = strlen(buf1)-nameend;\r
+      symb -> macdefline = yyline;\r
+\r
+      if( !(symb -> macstr = new char[symb->macsize+2]))\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 5\n");\r
+ fflush(stdout);\r
+#endif\r
+        errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+      strcpy(symb->macstr, buf1+nameend);\r
+      strcpy(symb->macfilename,yyfilename);\r
+    }\r
+\r
+    // In second parse - check argument usage\r
+\r
+    else if( yyline == symb->macdefline )\r
+    {\r
+      l = symb->macsize;\r
+      symb -> macrodone = TRUE;\r
+\r
+      while(l)\r
+      {\r
+        if( isdigit(symb->macstr[l]) && (symb->macstr[l-1] == '@' ) )\r
+          symb->macparmlist[(symb->macstr[l]) -'0'] = 1;\r
+        l--;\r
+      }\r
+      lastparm = -1;\r
+      for(l=0;l<10;l++)\r
+        if(symb->macparmlist[l])\r
+          lastparm = l;\r
+\r
+      inmacro=yyinmacro;\r
+      yyinmacro=1;\r
+\r
+      for(l=0;l<=lastparm;l++)\r
+        if(!symb->macparmlist[l])\r
+          warningin(W_MACRO_UNUSES_PARM, l, name);\r
+\r
+      yyinmacro=inmacro;\r
+\r
+      strcpy(yyinlineold, yyinline);\r
+      strcpy(yyinline, yyinlinenew);\r
+    }\r
+  }\r
+\r
+  strcpy(yyinline, temp);\r
+  endofline();\r
+  delete buf1;\r
+\r
+  if(!strlen(name))\r
+    error(E_NO_MACRO_NAME);\r
+\r
+  return MACRODEF;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Insert macro in input stream\r
+  //\r
+\r
+int macro(symbolSA symb)\r
+{\r
+  char  **parmlist;\r
+  int   c;\r
+  char  line[MAX_LINE_LENGTH+2];\r
+  int   pos = 0;\r
+  int   parm;\r
+  int   inputparms = 0;\r
+  int   parmpos;\r
+  int   rem;\r
+  int   next;\r
+  int   l;\r
+  int   len;\r
+  char  *str;\r
+  int   res;\r
+  int   ch;\r
+  char  orginline[MAX_LINE_LENGTH+2];\r
+\r
+  if( (!symb -> macrodone) && (yyparseno) )\r
+  {\r
+    errorin(E_DEF_USE);\r
+    while(((ch=yyinput())!='\n') && (ch!=EOF) );\r
+    endofline();\r
+\r
+    return EOL;\r
+  }\r
+\r
+  strcpy(orginline, yyinline);\r
+\r
+  /// Allocate space for parameters /////////////////////////////////////////\r
+\r
+  if( !(parmlist = new char*[10]) )\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 6\n");\r
+ fflush(stdout);\r
+#endif\r
+    errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+  for(c=0;c<10;c++)\r
+  {\r
+    if(!(parmlist[c]= new char [MAX_LINE_LENGTH+1]))\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 7\n");\r
+ fflush(stdout);\r
+#endif\r
+      errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+    else\r
+      memset(parmlist[c], 0, MAX_LINE_LENGTH+1);\r
+  }\r
+\r
+  /// Get parameters from input /////////////////////////////////////////////\r
+\r
+  while( ((line[pos]=yyinput())!='\n') && (line[pos++]!=EOF) );\r
+\r
+  if(pos && (line[pos-1]==EOF) )\r
+    line[--pos] = 0;\r
+\r
+  line[pos]=0;\r
+  line[pos+1]=0;\r
+\r
+  /// Local strtok() that inserts parameters into parameter list ////////////\r
+\r
+  if(pos)\r
+  {\r
+    pos         = 0;\r
+    parm        = 0;\r
+    rem         = FALSE;\r
+\r
+    striprem(line);\r
+\r
+    while(line[pos] && (parm<10))\r
+    {\r
+      next        = FALSE;\r
+      parmpos     = 0;\r
+\r
+      while( (!next) && (line[pos]) )\r
+      {\r
+        if( (line[pos]=='"') || (line[pos]=='\'') )\r
+          rem ? rem = FALSE : rem = TRUE;\r
+        else if( line[pos]=='\\' )\r
+          parmlist[parm][parmpos++] = line[pos++];\r
+        else if ( (line[pos]==',') && !rem)\r
+        {\r
+          parmlist[parm][parmpos] = '\0';\r
+          next = TRUE;\r
+        }\r
+        parmlist[parm][parmpos++] = line[pos++];\r
+      }\r
+      parm++;\r
+    }\r
+\r
+    inputparms = parm;\r
+\r
+  /// Clean up parametes (remove leading/trailing whitespaces and ',' ////////\r
+\r
+    for(c=0;c<10;c++)\r
+    {\r
+      pos = strlen(parmlist[c]);\r
+      if(pos)\r
+        pos--;\r
+      while( ((parmlist[c][pos]==',')||(isspace(parmlist[c][pos])))&&(pos>=0))\r
+        parmlist[c][pos--] = '\0';\r
+\r
+      if(pos)\r
+      {\r
+        l = strspn(parmlist[c], "\t\v ");\r
+        len = strlen(parmlist[c])-l;\r
+        if(l)\r
+          memmove(parmlist[c], parmlist[c]+l,len);\r
+        parmlist[c][len] = '\0';\r
+      }\r
+    }\r
+  }\r
+\r
+  /// Check that number of parameters specified, equals the ones used ////////\r
+\r
+  for(c=0;c<10;c++)\r
+  {\r
+    if( parmlist[c][0] && !symb->macparmlist[c])\r
+      warningin(W_ARG_SPEC, c);\r
+    else if( !parmlist[c][0] && symb->macparmlist[c])\r
+      warningin(W_ARG_USED, c);\r
+  }\r
+\r
+  /// Insert parameters in macro string //////////////////////////////////////\r
+\r
+  if(! (str = new char[symb-> macsize + MAX_LINE_LENGTH +5] ) )\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 8\n");\r
+ fflush(stdout);\r
+#endif\r
+    errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+  memset(str,0, symb-> macsize + MAX_LINE_LENGTH +5);\r
+\r
+  pos     = 0;\r
+  parm    = 0;\r
+  res     = 0;\r
+\r
+  while( symb->macstr[pos] )\r
+  {\r
+    if( (symb->macstr[pos]=='@') && (isdigit(symb->macstr[pos+1])) )\r
+    {\r
+      parm     = symb->macstr[pos+1] - '0';\r
+      pos     += 2;\r
+      parmpos  = 0;\r
+\r
+      while(parmlist[parm][parmpos])\r
+        str[res++] = parmlist[parm][parmpos++];\r
+    }\r
+    else\r
+      str[res++] = symb->macstr[pos++];\r
+  }\r
+\r
+  /// Setup new scanner context //////////////////////////////////////////////\r
+\r
+  if( yycontext == (MAX_CONTEXT_DEPTH-1) )\r
+  {\r
+    errorexit(X_MACRO_DEPTH);\r
+\r
+    for(c=0;c<10;c++)\r
+      delete parmlist[c];\r
+    delete parmlist;\r
+\r
+    return EOL;\r
+  }\r
+\r
+  strcpy(yyinlineold, yyinline);\r
+  strcpy(yyinline, yyinlinenew);\r
+\r
+  strcpy(CONTEXT->yyinlineold, yyinlineold);\r
+  strcpy(CONTEXT->yyinline,    yyinline);\r
+  strcpy(CONTEXT->yyinlinenew, yyinlinenew);\r
+\r
+  CONTEXT->line        = yyline;\r
+  CONTEXT->offset      = yyoffset;\r
+  CONTEXT->dataoffset  = yydataoffset;\r
+  CONTEXT->eromoffset  = yyeromoffset;\r
+\r
+  statestack[yycontext++]                = YY_CURRENT_BUFFER;\r
+  CONTEXT->ismacro     = TRUE;\r
+  CONTEXT->macstr      = str;\r
+  yyoffset     = yycodepos/2;\r
+  yyeromoffset = yyerompos;\r
+  yydataoffset = yydatapos;\r
+\r
+  memset(yyinlinenew, 0, MAX_LINE_LENGTH);\r
+  memset(yyinline,  0, MAX_LINE_LENGTH);\r
+\r
+  pos = strcspn(str,"\n") + 1;\r
+\r
+  strcpy(yyinline, symb->name);\r
+\r
+  for(l=0;l<inputparms;l++)\r
+  {\r
+    if(l)\r
+      strcat(yyinline, ", ");\r
+    else\r
+      strcat(yyinline, " ");\r
+    strcpy(yyinline+strlen(yyinline),parmlist[l]);\r
+  }\r
+\r
+  if(pos+strlen(yyinline) >= MAX_LINE_LENGTH-1 )\r
+    errorexit(X_MACRO_LINE_TOO_LONG, yyline, yyfilename);\r
+\r
+  memcpy(yyinline+strlen(yyinline), str ,pos);\r
+\r
+  CONTEXT->stringpos = strcspn(str+pos,"\n") + 1;\r
+\r
+  memcpy(yyinlinenew, str + pos, CONTEXT->stringpos);\r
+\r
+  CONTEXT->stringpos += pos;\r
+\r
+  strcpy(yyinline, orginline);\r
+\r
+  yyinmacro++;\r
+  yyfirstmacroline = TRUE;\r
+\r
+  yy_scan_string(str);\r
+\r
+  /// Delete parameter list //////////////////////////////////////////////////\r
+\r
+  for(c=0;c<10;c++)\r
+    delete parmlist[c];\r
+  delete parmlist;\r
+\r
+  /// Allocate new symbol table //////////////////////////////////////////////\r
+\r
+  if(!yyparseno)\r
+  {\r
+    if(symb -> macsym)\r
+      yysymbolstack[yycontext] = symb -> macsym;\r
+    else\r
+    {\r
+      if( !(yysymbolstack[yycontext] = symb -> macsym = new symbolTable()) )\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 9\n");\r
+ fflush(stdout);\r
+#endif\r
+        errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+      if( !symb -> macsym->init(yycfg->casesensitive, 16) )\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 10\n");\r
+ fflush(stdout);\r
+#endif\r
+        errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+    }\r
+  }\r
+  else\r
+    yysymbolstack[yycontext] = symb -> macsym;\r
+\r
+  if(!yysymbolstack[yycontext])\r
+    internalerror("MA %i", yycontext);\r
+\r
+//  yyline++;\r
+\r
+  return SKIPRESTART;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Turn listing on/off\r
+  //\r
+\r
+void list(int listtype)\r
+{\r
+  switch(listtype)\r
+  {\r
+    case LIST_NO        : yylist      = FALSE; break;\r
+    case LIST_YES       : yylist      = TRUE ; break;\r
+    case LIST_NO_MACRO  : yylistmacro = FALSE; break;\r
+    case LIST_YES_MACRO : yylistmacro = TRUE ; break;\r
+    default             : internalerror("LU %04X",listtype);\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Read to end of current context\r
+  //\r
+\r
+int doexit(void)\r
+{\r
+  while(yyinput()!=EOF);\r
+  yyeol=TRUE; \r
+  return restart();\r
+}\r
+\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/avrlex.l b/src/mkutil/tavrasm.118/src/avrlex.l
new file mode 100644 (file)
index 0000000..5750de2
--- /dev/null
@@ -0,0 +1,1428 @@
+%{ // -*- C -*-\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : avrlex.l\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Scanner file for AVR assembler\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//  990329      : Tom - Added support for hex values like 1AB without $ or 0x\r
+//  990512      : Tom - Fixed detection on binary numbers.\r
+//  990522      : Tom - Added support for PC/DC/EC.   \r
+//  991211      : Tom - Fixed .endm problem (it had to be lower case)\r
+//  991217      : Kurt- Added # and support for local labels\r
+//  001101     : Brian - Added support for multiple include search paths\r
+//  010319      : Timothy Lee - Added byte1 function (sames as low())\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include "symbol.hh"\r
+#include "semantic.hh"\r
+#include "avrparse.hh"\r
+#include "avrasm.hh"\r
+#include "utils.hh"\r
+\r
+/// Extern ///////////////////////////////////////////////////////////////////\r
+\r
+GLOBALS(extern);\r
+\r
+/// Global ///////////////////////////////////////////////////////////////////\r
+\r
+symbolTableEntry       *sym;\r
+YY_BUFFER_STATE        statestack[MAX_CONTEXT_DEPTH];\r
+int                    restartcount = 0;\r
+int                    ret;\r
+\r
+/// Defines //////////////////////////////////////////////////////////////////\r
+\r
+#define SKIPRESTART 0x02BABE  // Any value that is not a token\r
+\r
+/// Prototypes for support function //////////////////////////////////////////\r
+\r
+int     restart(void);\r
+int     endofline(void);\r
+int     identifier(void);\r
+int     registers(void);\r
+int     integers(void);\r
+int     macrodef(void);\r
+int     includefile(void);\r
+int     string(void);\r
+int     character(void);\r
+int     doexit(void);\r
+int     macro(symbolSA symb);\r
+void    list(int listtype);\r
+void    illegal(void);\r
+\r
+/// Scanner definition ///////////////////////////////////////////////////////\r
+\r
+%}\r
+\r
+%option noyywrap\r
+%option never-interactive\r
+%option caseless\r
+\r
+DECDIGIT          [0-9]\r
+HEXDIGIT          [0-9a-fA-F]\r
+OCTDIGIT          [0-7]\r
+BINDIGIT          [01]\r
+LETTER            [a-zA-Z_]\r
+CHAR              [a-zA-Z0-9_]\r
+HTAB              [\011]\r
+NL                [\012]\r
+VTAB              [\013]\r
+FORMFEED          [\014]\r
+CR                [\015]\r
+SPACE             [\040]\r
+WHITE             {HTAB}|{VTAB}|{SPACE}\r
+\r
+%%\r
+\r
+"*"       return STAR;\r
+"/"       return DIV;\r
+"%"       return MOD;\r
+"<<"      return LS;\r
+">>"      return RS;\r
+"<="      return LE;\r
+">="      return GE;\r
+"<"       return LESS;\r
+">"       return GREAT;\r
+"=="      return EQ;\r
+"!="      return NE;\r
+"||"      return OROR;\r
+"&&"      return ANDAND;\r
+"|"       return OR;\r
+"&"       return AND;\r
+"^"       return XOR;\r
+"("       return LPAR;\r
+")"       return RPAR;\r
+":"       return COLON;\r
+","       return COMMA;\r
+"."       return DOT;\r
+"+"       return PLUS;\r
+"-"       return MINUS;\r
+"="       return EQUAL;\r
+"~"       return WAVE;\r
+"!"       return NOT;\r
+\r
+".def"    return DEF;\r
+".equ"    return EQU;\r
+".eq"     return EQU;\r
+".db"     return DB;\r
+".dw"     return DW;\r
+".org"    return ORG;\r
+".byte"   return BYTE;\r
+".set"    return SET;\r
+".device" return DEVICE;\r
+\r
+".cseg"  { yysegment = SEGMENT_CODE;   return CSEG;  }\r
+".dseg"  { yysegment = SEGMENT_DATA;   return ESEG;  }\r
+".eseg"  { yysegment = SEGMENT_EEPROM; return DSEG;  }\r
+\r
+"low"    { yylval.func   = OP_LOW;   return FUNCTION;}\r
+"high"   { yylval.func   = OP_HIGH;  return FUNCTION;}\r
+"byte1"  { yylval.func   = OP_LOW;   return FUNCTION;}\r
+"byte2"  { yylval.func   = OP_BYTE2; return FUNCTION;}\r
+"byte3"  { yylval.func   = OP_BYTE3; return FUNCTION;}\r
+"byte4"  { yylval.func   = OP_BYTE4; return FUNCTION;}\r
+"lwrd"   { yylval.func   = OP_LWRD;  return FUNCTION;}\r
+"hwrd"   { yylval.func   = OP_HWRD;  return FUNCTION;}\r
+"page"   { yylval.func   = OP_PAGE;  return FUNCTION;}\r
+"exp2"   { yylval.func   = OP_EXP2;  return FUNCTION;}\r
+"log2"   { yylval.func   = OP_LOG2;  return FUNCTION;}\r
+"cpc"    { yylval.opcode = O_CPC;    return IREGREG; } /* Register */\r
+"cp"     { yylval.opcode = O_CP;     return IREGREG; }\r
+"sbc"    { yylval.opcode = O_SBC;    return IREGREG; }\r
+"sub"    { yylval.opcode = O_SUB;    return IREGREG; }\r
+"add"    { yylval.opcode = O_ADD;    return IREGREG; }\r
+"adc"    { yylval.opcode = O_ADC;    return IREGREG; }\r
+"cpse"   { yylval.opcode = O_CPSE;   return IREGREG; }\r
+"and"    { yylval.opcode = O_AND;    return IREGREG; }\r
+"eor"    { yylval.opcode = O_EOR;    return IREGREG; }\r
+"or"     { yylval.opcode = O_OR;     return IREGREG; }\r
+"mov"    { yylval.opcode = O_MOV;    return IREGREG; }\r
+"movw"   { yylval.opcode = O_MOVW;   return IREGREG; }\r
+"mul"    { yylval.opcode = O_MUL;    return IREGREG; }\r
+"muls"   { yylval.opcode = O_MULS;   return IREGREG; }\r
+"mulsu"  { yylval.opcode = O_MULSU;  return IREGREG; }\r
+"fmul"   { yylval.opcode = O_FMUL;   return IREGREG; }\r
+"fmuls"  { yylval.opcode = O_FMULS;  return IREGREG; }\r
+"fmulsu" { yylval.opcode = O_FMULSU; return IREGREG; }\r
+"adiw"   { yylval.opcode = O_ADIW;   return IREGIMM; } /* Reg/Imm */\r
+"sbiw"   { yylval.opcode = O_SBIW;   return IREGIMM; }\r
+"cpi"    { yylval.opcode = O_CPI;    return IREGIMM; }\r
+"sbci"   { yylval.opcode = O_SBCI;   return IREGIMM; }\r
+"subi"   { yylval.opcode = O_SUBI;   return IREGIMM; }\r
+"ori"    { yylval.opcode = O_ORI;    return IREGIMM; }\r
+"andi"   { yylval.opcode = O_ANDI;   return IREGIMM; }\r
+"ldi"    { yylval.opcode = O_LDI;    return IREGIMM; }\r
+"lds"    { yylval.opcode = O_LDS;    return IREGIMM; }\r
+"sbr"    { yylval.opcode = O_SBR;    return IREGIMM; }\r
+"brcc"   { yylval.opcode = O_BRCC;   return IIMM;    } /* Immediate */\r
+"brcs"   { yylval.opcode = O_BRCS;   return IIMM;    }\r
+"brne"   { yylval.opcode = O_BRNE;   return IIMM;    }\r
+"breq"   { yylval.opcode = O_BREQ;   return IIMM;    }\r
+"brpl"   { yylval.opcode = O_BRPL;   return IIMM;    }\r
+"brmi"   { yylval.opcode = O_BRMI;   return IIMM;    }\r
+"brvc"   { yylval.opcode = O_BRVC;   return IIMM;    }\r
+"brvs"   { yylval.opcode = O_BRVS;   return IIMM;    }\r
+"brge"   { yylval.opcode = O_BRGE;   return IIMM;    }\r
+"brlt"   { yylval.opcode = O_BRLT;   return IIMM;    }\r
+"brhc"   { yylval.opcode = O_BRHC;   return IIMM;    }\r
+"brhs"   { yylval.opcode = O_BRHS;   return IIMM;    }\r
+"brtc"   { yylval.opcode = O_BRTC;   return IIMM;    }\r
+"brts"   { yylval.opcode = O_BRTS;   return IIMM;    }\r
+"brid"   { yylval.opcode = O_BRID;   return IIMM;    }\r
+"brie"   { yylval.opcode = O_BRIE;   return IIMM;    }\r
+"brsh"   { yylval.opcode = O_BRSH;   return IIMM;    }\r
+"brlo"   { yylval.opcode = O_BRLO;   return IIMM;    }\r
+"neg"    { yylval.opcode = O_NEG;    return IREG;    } /* Register */\r
+"swap"   { yylval.opcode = O_SWAP;   return IREG;    }\r
+"inc"    { yylval.opcode = O_INC;    return IREG;    }\r
+"asr"    { yylval.opcode = O_ASR;    return IREG;    }\r
+"lsr"    { yylval.opcode = O_LSR;    return IREG;    }\r
+"dec"    { yylval.opcode = O_DEC;    return IREG;    }\r
+"pop"    { yylval.opcode = O_POP;    return IREG;    }\r
+"push"   { yylval.opcode = O_PUSH;   return IREG;    }\r
+"clr"    { yylval.opcode = O_CLR;    return IREG;    }\r
+"tst"    { yylval.opcode = O_TST;    return IREG;    }\r
+"com"    { yylval.opcode = O_COM;    return IREG;    }\r
+"ror"    { yylval.opcode = O_ROR;    return IREG;    }\r
+"sec"    { yylval.opcode = O_SEC;    return INOARGS; } /* No arguments */\r
+"sez"    { yylval.opcode = O_SEZ;    return INOARGS; }\r
+"sen"    { yylval.opcode = O_SEN;    return INOARGS; }\r
+"sev"    { yylval.opcode = O_SEV;    return INOARGS; }\r
+"ses"    { yylval.opcode = O_SES;    return INOARGS; }\r
+"seh"    { yylval.opcode = O_SEH;    return INOARGS; }\r
+"set"    { yylval.opcode = O_SET;    return INOARGS; }\r
+"sei"    { yylval.opcode = O_SEI;    return INOARGS; }\r
+"clc"    { yylval.opcode = O_CLC;    return INOARGS; }\r
+"clz"    { yylval.opcode = O_CLZ;    return INOARGS; }\r
+"cln"    { yylval.opcode = O_CLN;    return INOARGS; }\r
+"clv"    { yylval.opcode = O_CLV;    return INOARGS; }\r
+"cls"    { yylval.opcode = O_CLS;    return INOARGS; }\r
+"clh"    { yylval.opcode = O_CLH;    return INOARGS; }\r
+"clt"    { yylval.opcode = O_CLT;    return INOARGS; }\r
+"cli"    { yylval.opcode = O_CLI;    return INOARGS; }\r
+"nop"    { yylval.opcode = O_NOP;    return INOARGS; }\r
+"icall"  { yylval.opcode = O_ICALL;  return INOARGS; } /* Misc. */\r
+"ijmp"   { yylval.opcode = O_IJMP;   return INOARGS; }\r
+"reti"   { yylval.opcode = O_RETI;   return INOARGS; }\r
+"ret"    { yylval.opcode = O_RET;    return INOARGS; }\r
+"sleep"  { yylval.opcode = O_SLEEP;  return INOARGS; }\r
+"wdr"    { yylval.opcode = O_WDR;    return INOARGS; }\r
+"eijmp"  { yylval.opcode = O_EIJMP;  return INOARGS; }\r
+"eicall" { yylval.opcode = O_EICALL; return INOARGS; }\r
+"spm"   { yylval.opcode = O_SPM;    return INOARGS; }\r
+"espm"   { yylval.opcode = O_ESPM;   return INOARGS; }\r
+"bclr"   { yylval.opcode = O_BCLR;   return IIMM;    }\r
+"bset"   { yylval.opcode = O_BSET;   return IIMM;    }\r
+"rcall"  { yylval.opcode = O_RCALL;  return IIMM;    }\r
+"rjmp"   { yylval.opcode = O_RJMP;   return IIMM;    }\r
+"jmp"    { yylval.opcode = O_JMP;    return IIMM;    }\r
+"call"   { yylval.opcode = O_CALL;   return IIMM;    }\r
+"brbc"   { yylval.opcode = O_BRBC;   return IIMMIMM; }\r
+"brbs"   { yylval.opcode = O_BRBS;   return IIMMIMM; }\r
+"cbi"    { yylval.opcode = O_CBI;    return IIMMIMM; }\r
+"sbi"    { yylval.opcode = O_SBI;    return IIMMIMM; }\r
+"sbic"   { yylval.opcode = O_SBIC;   return IIMMIMM; }\r
+"sbis"   { yylval.opcode = O_SBIS;   return IIMMIMM; }\r
+"out"    { yylval.opcode = O_OUT;    return IIMMREG; }\r
+"sts"    { yylval.opcode = O_STS;    return IIMMREG; }\r
+"rol"    { yylval.opcode = O_ROL;    return IREG;    }\r
+"ser"    { yylval.opcode = O_SER;    return IREG;    }\r
+"lsl"    { yylval.opcode = O_LSL;    return IREG;    }\r
+"bld"    { yylval.opcode = O_BLD;    return IREGIMM; }\r
+"bst"    { yylval.opcode = O_BST;    return IREGIMM; }\r
+"cbr"    { yylval.opcode = O_CBR;    return IREGIMM; }\r
+"in"     { yylval.opcode = O_IN;     return IREGIMM; }\r
+"sbrc"   { yylval.opcode = O_SBRC;   return IREGIMM; }\r
+"sbrs"   { yylval.opcode = O_SBRS;   return IREGIMM; }\r
+"ld"     { yylval.opcode = O_LD;     return IINDIRC; }\r
+"st"     { yylval.opcode = O_ST;     return IINDIRC; }\r
+"ldd"    { yylval.opcode = O_LDD;    return IINDIRC; }\r
+"std"    { yylval.opcode = O_STD;    return IINDIRC; }\r
+"X"      { yylval.regid = 26;        return REGXYZ;  }\r
+"Y"      { yylval.regid = 28;        return REGXYZ;  }\r
+"Z"      { yylval.regid = 30;        return REGXYZ;  }\r
+"lpm"    { yylval.opcode = O_LPM;    return ILPM;    }\r
+"elpm"   { yylval.opcode = O_ELPM;   return ILPM;    }\r
+\r
+"PC"    { yylval.val.value=yycodepos/2;yylval.val.valid=TRUE; return COUNTER;}\r
+"DC"    { yylval.val.value=yydatapos;  yylval.val.valid=TRUE; return COUNTER;}\r
+"EC"    { yylval.val.value=yyerompos;  yylval.val.valid=TRUE; return COUNTER;}\r
+\r
+^{WHITE}*".nolistmac"           list(LIST_NO_MACRO);\r
+^{WHITE}*".nolist"              list(LIST_NO);\r
+^{WHITE}*".listmac"             list(LIST_YES_MACRO);\r
+^{WHITE}*".list"                list(LIST_YES);\r
+^{WHITE}*".exit"                yyeol=TRUE; if((ret=doexit()   )!=SKIPRESTART) return ret;\r
+^{WHITE}*".include"[^\n]*       if(includefile()==EOL) return EOL;\r
+^{WHITE}*".macro"               return macrodef();\r
+".endm"                         errorin(E_ENDM);\r
+"\""("\\\""|[^\n\"])*"\""       return string();\r
+[r]{DECDIGIT}+                  return registers();\r
+{DECDIGIT}+                     return integers();\r
+"0x"{HEXDIGIT}+                 return integers();\r
+"0b"{BINDIGIT}+                 return integers();\r
+"$"{HEXDIGIT}+                  return integers();\r
+{DECDIGIT}{HEXDIGIT}*           return integers();\r
+"'\\x"{HEXDIGIT}{1,2}"'"        return character();\r
+"'\\x"{HEXDIGIT}{3,}"'"         warningin(W_HEX_ESCAPE_INVALID);yylval.val.valid = TRUE;yylval.val.value = 0; return INTEGER;\r
+"'\\"{OCTDIGIT}{1,3}"'"         return character();\r
+"'\\"{OCTDIGIT}{4,}"'"          warningin(W_OCT_ESCAPE_INVALID);yylval.val.valid = TRUE;yylval.val.value = 0; return INTEGER;\r
+"'\\"."'"                       return character();\r
+"'"."'"                         return character();\r
+{LETTER}{CHAR}*                 if((ret=identifier())!=SKIPRESTART)return ret;\r
+<<EOF>>                         yyeol=TRUE; if((ret=restart()   )!=SKIPRESTART)return ret;\r
+[\n]                            yyeol=TRUE; return endofline();\r
+[ \t\r]+                        ;\r
+";".*                           ;\r
+"//".*                          ;\r
+"#".*                           ;\r
+.                               illegal();\r
+\r
+%%\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//////////////////////////////////////////////////////////////////////////////\r
+///                                                                        ///\r
+///   Scanner support functions                                            ///\r
+///                                                                        ///\r
+//////////////////////////////////////////////////////////////////////////////\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Identifiers\r
+  //\r
+\r
+int character(void)\r
+{\r
+  yylval.val.value = 0;\r
+  yylval.val.valid = FALSE;\r
+\r
+  if(yytext[1]=='\\')\r
+  {\r
+    switch (yytext[2])\r
+    {\r
+      case 'n'  : yylval.val.value = '\n' ; yylval.val.valid = TRUE; break;\r
+      case 't'  : yylval.val.value = '\t' ; yylval.val.valid = TRUE; break;\r
+      case 'v'  : yylval.val.value = '\v' ; yylval.val.valid = TRUE; break;\r
+      case 'b'  : yylval.val.value = '\b' ; yylval.val.valid = TRUE; break;\r
+      case 'r'  : yylval.val.value = '\r' ; yylval.val.valid = TRUE; break;\r
+      case 'f'  : yylval.val.value = '\f' ; yylval.val.valid = TRUE; break;\r
+      case 'a'  : yylval.val.value = '\a' ; yylval.val.valid = TRUE; break;\r
+      case '\\' : yylval.val.value = '\\' ; yylval.val.valid = TRUE; break;\r
+      case '\'' : yylval.val.value = '\'' ; yylval.val.valid = TRUE; break;\r
+      case '\"' : yylval.val.value = '\"' ; yylval.val.valid = TRUE; break;\r
+      case '\?' : yylval.val.value = '\?' ; yylval.val.valid = TRUE; break;\r
+      case 'x'  :\r
+      case 'X'  :\r
+      {\r
+        if(isdigit(yytext[3]))\r
+          yylval.val.value = yytext[3] - '0';\r
+        else if(isxdigit(yytext[3]))\r
+          yylval.val.value = tolower(yytext[3]) - 'a' + 10;\r
+\r
+        if(isxdigit(yytext[3]) && isxdigit(yytext[4]))\r
+        {\r
+          if(isdigit(yytext[4]))\r
+            yylval.val.value = 16*yylval.val.value + yytext[4] - '0';\r
+          else\r
+            yylval.val.value = 16*yylval.val.value+tolower(yytext[4])-'a'+10;\r
+        }\r
+        yylval.val.valid = TRUE;\r
+\r
+      } break;\r
+\r
+      case '0'  :\r
+      case '1'  :\r
+      case '2'  :\r
+      case '3'  :\r
+      case '4'  :\r
+      case '5'  :\r
+      case '6'  :\r
+      case '7'  :\r
+      {\r
+        yylval.val.value = yytext[2] - '0';\r
+        if(isdigit(yytext[3]))\r
+        {\r
+          yylval.val.value = 8*yylval.val.value + yytext[3] - '0';\r
+          if(isdigit(yytext[4]))\r
+            yylval.val.value = 8*yylval.val.value + yytext[4] - '0';\r
+        }\r
+        if(yylval.val.value > 0xFF)\r
+        {\r
+          yylval.val.value = 0;\r
+          warningin(W_OCT_OUT_OF_RANGE);\r
+        }\r
+        yylval.val.valid = TRUE;\r
+\r
+      } break;\r
+\r
+      default   : errorin(E_UNDEF_ESCAPE,yytext);\r
+    }\r
+  }\r
+  else\r
+  {\r
+    yylval.val.value = yytext[1];\r
+    yylval.val.valid = TRUE;\r
+  }\r
+  return INTEGER;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Identifiers\r
+  //\r
+\r
+int identifier(void)\r
+{\r
+  char name[MAX_ID_LENGTH+1];\r
+\r
+  if(yytext[0] == '_' && yycfg->local_labels)\r
+  {\r
+    if(strlen(yytext)+strlen(yylast_used_label)+2>MAX_ID_LENGTH)\r
+    {\r
+      size_t len;\r
+      \r
+      warningin(W_IDENTIFIER_TOO_LONG);\r
+      name[0]='@';\r
+      memcpy(name+1, yylast_used_label, MAX_ID_LENGTH-1);\r
+      name[MAX_ID_LENGTH] = '\0';\r
+      len = strlen(name);\r
+      if(len>MAX_ID_LENGTH-9)\r
+        len = MAX_ID_LENGTH-9;      // truncate the last_used_label to leave at least 8 characters for the local label\r
+      name[len++] = '@';\r
+      memcpy(name+len, yytext, MAX_ID_LENGTH-len);\r
+      name[MAX_ID_LENGTH] = '\0';\r
+    }\r
+    else\r
+    {\r
+      sprintf(name, "@%s@%s", yylast_used_label, yytext);\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if(strlen(yytext)>MAX_ID_LENGTH)\r
+    {\r
+      warningin(W_IDENTIFIER_TOO_LONG);\r
+      memcpy(name, yytext, MAX_ID_LENGTH);\r
+      name[MAX_ID_LENGTH] = '\0';\r
+    }\r
+    else\r
+      strcpy(name, yytext);\r
+  }\r
+\r
+  yylval.symb = getsym(name);\r
+\r
+  if(yylval.symb -> macro)\r
+    return macro(yylval.symb);\r
+\r
+  return SYMBOL;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Registers : r0 - r31\r
+  //\r
+\r
+int registers(void)\r
+{\r
+  int registerno;\r
+\r
+  if(strlen(yytext)==2)\r
+  {\r
+    if(isdigit(yytext[1]))\r
+      registerno= yytext[1] - '0';\r
+    else\r
+      return identifier();\r
+  }\r
+  else if(strlen(yytext)==3)\r
+  {\r
+    if(isdigit(yytext[1]) && isdigit(yytext[2]) )\r
+      registerno= 10 * (yytext[1] - '0') + yytext[2] - '0';\r
+    else\r
+      return identifier();\r
+  }\r
+  else\r
+    return identifier();\r
+\r
+  if(registerno <= 31)\r
+  {\r
+    yylval.regid = registerno;\r
+    return REGISTER;\r
+  }\r
+  return identifier();\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Strings\r
+  //\r
+\r
+int string(void)\r
+{\r
+  if( !(yylval.string = new char[strlen(yytext)+1]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  strcpy(yylval.string, yytext);\r
+\r
+  return STRING;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Integer constants : Decimal=10 Hex=0xA Hex=$A Octal=012 Binaray=0b1010\r
+  //\r
+\r
+int integers(void)\r
+{\r
+  int  val;\r
+  int  pos;\r
+  char temp[12];\r
+\r
+  bool foundhex = (strpbrk(yytext,"ABCDEFabcdef")!=NULL);\r
+  bool foundbin = !(strpbrk(yytext,"ACDEFacdef23456789")!=NULL);\r
+\r
+  // Hex : $BABE\r
+\r
+  if(yytext[0] == '$' )\r
+  {\r
+    val = 0;\r
+    pos = 1;\r
+    while( yytext[pos] )\r
+    {\r
+      if(isdigit(yytext[pos]))\r
+        val = 16*val + yytext[pos] - '0';\r
+      else\r
+        val = 16*val + tolower(yytext[pos]) - 'a' + 10;\r
+      pos++;\r
+    }\r
+    if(pos>9)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  // Hex : 0xBABE or 0XBABE\r
+\r
+  else if( (yytext[0] == '0' ) && (tolower(yytext[1]) == 'x' ))\r
+  {\r
+    val = 0;\r
+    pos = 2;\r
+    while( yytext[pos] )\r
+    {\r
+      if(isdigit(yytext[pos]))\r
+        val = 16*val + yytext[pos] - '0';\r
+      else\r
+        val = 16*val + tolower(yytext[pos]) - 'a' + 10;\r
+      pos++;\r
+\r
+    }\r
+    if(pos>10)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  // Bin : 0b01010 or 0B01010\r
+\r
+  else if( (yytext[0] == '0' ) && (tolower(yytext[1]) == 'b' ) && foundbin)\r
+  {\r
+    val = 0;\r
+    pos = 2;\r
+    while( yytext[pos] )\r
+      val = 2*val + yytext[pos++] - '0';\r
+    if(pos>34)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  // Hex : 1BABE (Hex that starts with a decimal)\r
+\r
+  else if(isdigit(yytext[0]) && foundhex )\r
+  {\r
+    val = 0;\r
+    pos = 0;\r
+    while( yytext[pos] )\r
+    {\r
+      if(isdigit(yytext[pos]))\r
+        val = 16*val + yytext[pos] - '0';\r
+      else\r
+        val = 16*val + tolower(yytext[pos]) - 'a' + 10;\r
+      pos++;\r
+    }\r
+    if(pos>8)\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+\r
+  // Integer 47806\r
+\r
+  else\r
+  {\r
+    val = atoi(yytext);\r
+    sprintf(temp, "%i", val);\r
+    if(strcmp(temp,yytext))\r
+      warningin(W_CONSTANT_TO_BIG);\r
+  }\r
+\r
+  yylval.val.value = val;\r
+  yylval.val.valid = TRUE;\r
+  return INTEGER;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Illegal character\r
+  //\r
+\r
+void illegal(void)\r
+{\r
+  if(isprint(yytext[0]))\r
+    warningin(W_INVALID_CHAR,yytext[0]);\r
+  else\r
+    warningin(W_INVALID_ASCII,(unsigned char)yytext[0]);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Include file\r
+  //\r
+\r
+int includefile(void)\r
+{\r
+  char name[MAX_LINE_LENGTH+2];\r
+  char filename[MAX_FILENAME_LENGTH+1];\r
+  int  c;\r
+  FILE *f1,*f2;\r
+\r
+  if(strlen(yytext)==strlen(".include"))\r
+  {\r
+    yyinput();\r
+    endofline();\r
+    error(E_NO_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  /// Check filename ////////////////////////////////////////////////////////\r
+\r
+  if(strlen(yytext) >= MAX_LINE_LENGTH)\r
+    errorexit(X_LINE_TOO_LONG, yyfilename);\r
+\r
+  strcpy(name,yytext+8+strspn(yytext,"\t\v ")\r
+              +strspn(yytext+8+strspn(yytext,"\t\v "),"\t\v "));\r
+\r
+  if(!strlen(name))\r
+  {\r
+    yyinput();\r
+    endofline();\r
+    error(E_NO_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  striprem(name);\r
+\r
+  if(!strlen(name))\r
+  {\r
+    yyinput();\r
+    endofline();\r
+    error(E_NO_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  /// Read NL (or EOF) //////////////////////////////////////////////////////\r
+\r
+  yyinput();\r
+  endofline();\r
+\r
+  if( !getfilename(name, filename) )\r
+  {\r
+    error(E_INVALID_FILENAME);\r
+    return EOL;\r
+  }\r
+\r
+  /// Check context depth ///////////////////////////////////////////////////\r
+\r
+  if( yycontext == (MAX_CONTEXT_DEPTH-1) )\r
+  {\r
+    errorin(E_INCLUDE_DEPTH, name);\r
+    return EOL;\r
+  }\r
+\r
+  if( !(f1 = fopenInIncpath(filename,"r")) )\r
+  {\r
+    error(E_OPEN_FILE, filename);\r
+    return EOL;\r
+  }\r
+  else if( !(f2 = fopenInIncpath(filename,"r")) )\r
+  {\r
+    fclose(f1);\r
+    error(E_OPEN_FILE, filename);\r
+    return EOL;\r
+  }\r
+\r
+  /// Setup context stack ///////////////////////////////////////////////////\r
+\r
+  CONTEXT->file       = yyin;\r
+  CONTEXT->file2      = yyin2;\r
+  CONTEXT->line       = yyline;\r
+  CONTEXT->offset     = yyoffset;\r
+  CONTEXT->dataoffset = yydataoffset;\r
+  CONTEXT->eromoffset = yyeromoffset;\r
+\r
+  strcpy(CONTEXT->yyinlineold, yyinlineold);\r
+  strcpy(CONTEXT->yyinline,    yyinline);\r
+  strcpy(CONTEXT->yyinlinenew, yyinlinenew);\r
+\r
+  statestack[yycontext++] = YY_CURRENT_BUFFER;\r
+\r
+  /// Open input file ///////////////////////////////////////////////////////\r
+\r
+  if(yyfilecount==MAX_FILES)\r
+    errorexit(X_TOO_MANY_FILES);\r
+\r
+  yyfileno = -1;\r
+\r
+  for(c=0;c<yyfilecount;c++)\r
+    if(!strcmp(filename, yyfilelist[c]))\r
+      yyfileno = c+1;\r
+\r
+  if(yyfileno==-1)\r
+  {\r
+    if( !(yyfilelist[yyfilecount] = new char[MAX_FILENAME_LENGTH]) )\r
+      errorexit(X_OUT_OF_MEMORY);\r
+\r
+    strcpy(yyfilelist[yyfilecount], filename);\r
+    yyfileno = ++yyfilecount;\r
+  }\r
+\r
+  yyin   = CONTEXT->file  = f1;\r
+  yyin2  = CONTEXT->file2 = f2;\r
+\r
+  strcpy(CONTEXT->filename, filename);\r
+  strcpy(yyfilename, filename);\r
+\r
+  /// Add .include line to log //////////////////////////////////////////////\r
+\r
+  tolog();\r
+\r
+  if(!yyinmacro)\r
+    yyline = 1;\r
+  else\r
+    yyline =0;\r
+\r
+  yyline = 1; // XXX\r
+\r
+  /// Read new lines into log buffers ///////////////////////////////////////\r
+\r
+  if(!fgets(yyinline, MAX_LINE_LENGTH, yyin2))\r
+    yyinline[0] = 0;\r
+  if(!fgets(yyinlinenew, MAX_LINE_LENGTH, yyin2))\r
+    yyinlinenew[0] = 0;\r
+\r
+  if(strlen(yyinline) == MAX_LINE_LENGTH-1)\r
+    errorexit(X_LINE_TOO_LONG, yyfilename);\r
+  if(strlen(yyinlinenew) == MAX_LINE_LENGTH-1)\r
+    errorexit(X_LINE_TOO_LONG, yyfilename);\r
+\r
+  STRIPNR(yyinlinenew);\r
+  STRIPNR(yyinline);\r
+\r
+  /// Setup scanner to read from new file ///////////////////////////////////\r
+\r
+  yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));\r
+\r
+  return TRUE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // End of line\r
+  //\r
+\r
+int endofline(void)\r
+{\r
+  int pos;\r
+\r
+  strcpy(yyinlineold, yyinline);\r
+  strcpy(yyinline, yyinlinenew);\r
+\r
+  if(!ISMACRO)\r
+  {\r
+    if(!fgets(yyinlinenew,MAX_LINE_LENGTH,yyin2))\r
+      yyinlinenew[0] = '\0';\r
+    if(strlen(yyinlinenew)==MAX_LINE_LENGTH-1)\r
+      errorexit(X_LINE_TOO_LONG, yyfilename);\r
+    //if(yyinmacro)\r
+      yyline++;\r
+  }\r
+  else\r
+  {\r
+    if( (int)strlen(CONTEXT->macstr) > CONTEXT->stringpos)\r
+    {\r
+      pos = strcspn(CONTEXT->macstr+CONTEXT->stringpos,"\n");\r
+      if(pos<MAX_LINE_LENGTH)\r
+        memcpy(yyinlinenew,CONTEXT->macstr+CONTEXT->stringpos, pos);\r
+      else\r
+        errorexit(X_MACRO_LINE_TOO_LONG, yyline, yyfilename);\r
+\r
+      yyinlinenew[pos] = 0;\r
+      CONTEXT->stringpos += pos+1;\r
+    }\r
+    else\r
+      yyinlinenew[0] = 0;\r
+  }\r
+\r
+  STRIPNR(yyinlinenew);\r
+  return EOL;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Restart scanner after first parse, and handle macro/include context\r
+  //\r
+\r
+int restart(void)\r
+{\r
+  int c;\r
+\r
+  if(!restartcount++ && !ISMACRO)\r
+  {\r
+    strcpy(yyinlineold, yyinline);\r
+    strcpy(yyinline, yyinlinenew);\r
+    strcpy(yyinlinenew, "This should never show up");\r
+    yyline++;\r
+    return EOL;\r
+  }\r
+\r
+  restartcount = 0;\r
+\r
+  if(yycontext)\r
+  {\r
+    yy_delete_buffer(YY_CURRENT_BUFFER);\r
+    yy_switch_to_buffer(statestack[--yycontext]);\r
+\r
+    if( yycontextstack[yycontext+1]->ismacro )\r
+    {\r
+      yyinmacro--;\r
+      strcpy(yyinlineold, CONTEXT->yyinlineold);\r
+      strcpy(yyinline,    CONTEXT->yyinline);\r
+      strcpy(yyinlinenew, CONTEXT->yyinlinenew);\r
+      delete yycontextstack[yycontext+1]->macstr;\r
+\r
+      yysymbolstack[yycontext+1] = NULL;\r
+      yyoffset     = CONTEXT->offset;\r
+      yydataoffset = CONTEXT->dataoffset;\r
+      yyeromoffset = CONTEXT->eromoffset;\r
+      yyline = CONTEXT->line + 1;\r
+      if(ISMACRO)\r
+        endofline();\r
+      else\r
+      {\r
+        if(!fgets(yyinlinenew, MAX_LINE_LENGTH, yyin2))\r
+          yyinlinenew[0] = 0;\r
+      }\r
+\r
+      if(strlen(yyinlinenew) == MAX_LINE_LENGTH-1)\r
+        errorexit(X_LINE_TOO_LONG, yyfilename);\r
+      memset(yycontextstack[yycontext+1],0,sizeof(context));\r
+      return SKIPRESTART;\r
+    }\r
+    else\r
+    {\r
+      if(ISMACRO)\r
+      {\r
+        for(c=yycontext;c>=0;c--)\r
+        {\r
+          if(!yycontextstack[c]->ismacro)\r
+          {\r
+            strcpy(yyfilename, yycontextstack[c]->filename);\r
+            c = -1;\r
+          }\r
+        }\r
+      }\r
+      else\r
+        strcpy(yyfilename, CONTEXT->filename);\r
+\r
+      yyline = CONTEXT->line;\r
+\r
+      fclose(yycontextstack[yycontext+1]->file);\r
+      fclose(yycontextstack[yycontext+1]->file2);\r
+\r
+      yyin         = CONTEXT->file;\r
+      yyin2        = CONTEXT->file2;\r
+      yyoffset     = CONTEXT->offset;\r
+      yydataoffset = CONTEXT->dataoffset;\r
+      yyeromoffset = CONTEXT->eromoffset;\r
+\r
+      strcpy(yyinline,    CONTEXT->yyinline);\r
+      strcpy(yyinlinenew, CONTEXT->yyinlinenew);\r
+      memset(yycontextstack[yycontext+1],0,sizeof(context));\r
+\r
+      yyfileno = -1;\r
+      for(c=0;c<yyfilecount;c++)\r
+        if(!strcmp(yyfilename, yyfilelist[c]))\r
+          yyfileno = c+1;\r
+\r
+      if(yyfileno==-1)\r
+        internalerror("FF");\r
+      yylval.val.value = 0x1234;\r
+      return SKIPRESTART;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if(!yyparseno)\r
+    {\r
+      yyparseno++;\r
+      INITEXTERN;\r
+      yylinetxt[0]   = '\0';\r
+      fseek(yyin, 0, SEEK_SET);\r
+      fseek(yyin2, 0, SEEK_SET);\r
+      if(!fgets(yyinline, MAX_LINE_LENGTH, yyin2))\r
+        strcpy(yyinline,"\n");\r
+      if(!fgets(yyinlinenew, MAX_LINE_LENGTH, yyin2))\r
+        strcpy(yyinlinenew,"\n");\r
+      STRIPNR(yyinline);\r
+      STRIPNR(yyinlinenew);\r
+      return RESTART;\r
+    }\r
+    else\r
+      yyterminate();\r
+  }\r
+  return EOL;\r
+  yyunput(0, NULL); // One yyunput() a day, keeps warning away :-)\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle macro definition\r
+  //\r
+\r
+int macrodef(void)\r
+{\r
+  int                   ch;\r
+  int                   found      = FALSE;\r
+  int                   bufsize    = 32;\r
+  int                   pos        = 0;\r
+  int                   founddot   = 0;\r
+  int                   comment    = FALSE;\r
+  char                  *buf1      = NULL;\r
+  char                  *buf2      = NULL;\r
+  char                  endmacro[] = ".endm";\r
+  int                   temppos    = 0;\r
+  int                   temptime   = 0;\r
+  char                  temp[MAX_LINE_LENGTH+2];\r
+  symbolTableEntry      *symb;\r
+  int                   namestart;\r
+  int                   nameend;\r
+  char                  name[MAX_LINE_LENGTH+1];\r
+  int                   l;\r
+  int                   lastparm;\r
+  int                   inmacro;\r
+  int                   i;\r
+\r
+  /// Check that this is not in a macro context /////////////////////////////\r
+\r
+  if(CONTEXT->ismacro)\r
+  {\r
+    while( ((ch=yyinput())!='\r') && (ch!='\n') && (ch!=EOF) );\r
+    errorin(E_MACRO_IN_MACRO);\r
+    endofline();\r
+    return EOL;\r
+  }\r
+\r
+  /// Allocate buffer ///////////////////////////////////////////////////////\r
+\r
+  if( !(buf1 = new char[bufsize]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  /// Get macro string from input ///////////////////////////////////////////\r
+\r
+  while(!found)\r
+  {\r
+    ch = yyinput();\r
+\r
+    if(tolower(ch)==endmacro[founddot])\r
+      founddot++;\r
+    else\r
+      founddot=0;\r
+\r
+    if(founddot==4)\r
+    {\r
+      found = TRUE;\r
+      buf1[pos-3] = '\0';\r
+      sprintf(yyinlinenew,".endm");\r
+    }\r
+    else if(ch=='\n')\r
+    {\r
+      comment           = FALSE;\r
+      temp[temppos]     = 0;\r
+      temppos           = 0;\r
+      if(temptime++)\r
+      {\r
+        STRIPNR(temp);\r
+        strcpy(yyinlinenew, temp);\r
+        endofline();\r
+        tolog();\r
+      }\r
+    }\r
+    else if(ch==EOF)\r
+      found = TRUE;\r
+    else if(ch==';')\r
+      comment = TRUE;\r
+\r
+    buf1[pos++] = ch;\r
+\r
+    if(ch!='\n')\r
+      temp[temppos++] = ch;\r
+\r
+    if(pos==bufsize)\r
+    {\r
+      buf2 = new char[2*bufsize];\r
+      memcpy(buf2, buf1, bufsize);\r
+      delete buf1;\r
+      buf1 = buf2;\r
+      bufsize *=2;\r
+    }\r
+  }\r
+\r
+  /// Read until end of .endmacro line //////////////////////////////////////\r
+\r
+  while( ((ch=yyinput()) != EOF) && (ch!='\n') && (ch!='\r'))\r
+    yyinlinenew[temppos++] = ch;\r
+\r
+  yyinlinenew[temppos] = 0;\r
+\r
+  strcpy(temp, yyinlinenew);\r
+\r
+  endofline();\r
+  tolog();\r
+\r
+  if((ch==EOF)&&(founddot<4))\r
+  {\r
+    delete buf1;\r
+    if(strlen(yyinlineold))\r
+      yyinlineold[strlen(yyinlineold)-1] = '\0';\r
+    STRIPWS(yyinlineold);\r
+    error(E_EOF_IN_MACRO);\r
+    return restart();\r
+  }\r
+\r
+  /// Process string ////////////////////////////////////////////////////////\r
+\r
+  pos = strlen(buf1);\r
+\r
+  if( pos  && !(buf1[pos-1]=='\n') )\r
+    strcat(buf1, "\n");\r
+\r
+  /// Get macro name ////////////////////////////////////////////////////////\r
+\r
+  namestart = strspn(buf1,"\t\v ");\r
+  nameend   = strcspn(buf1+namestart,"\t\v \r\n;")+namestart;\r
+  memcpy(name, buf1+namestart, nameend-namestart);\r
+  name[nameend-namestart] = '\0';\r
+\r
+  /// Setup macro ///////////////////////////////////////////////////////////\r
+\r
+  for(i=yycontext; !yysymbolstack[i]; i--);\r
\r
+  if(!yyparseno)\r
+  {\r
+    if(strlen(name)>MAX_ID_LENGTH) {\r
+      warningin(W_MAC_IDENTIFIER_TOO_LONG);\r
+      name[MAX_ID_LENGTH] = '\0';      \r
+    }\r
+\r
+    if( (symb=yysymbolstack[i]->get(name)) )\r
+    {\r
+      error(E_MACRO_REDEF,name);\r
+      return EOL;\r
+    }\r
+    symb = yysymbolstack[i]->add(name);\r
+  }\r
+  else {\r
+    if(strlen(name)>MAX_ID_LENGTH) {\r
+      warningin(W_MAC_IDENTIFIER_TOO_LONG);\r
+      name[MAX_ID_LENGTH] = '\0';      \r
+    }\r
+    symb=yysymbolstack[i]->get(name);\r
+  }\r
+\r
+  if(!symb)\r
+    internalerror("DM");\r
+\r
+  if( ISUSED(symb) && ((symb->macdefline != yyline)\r
+      ||(strcmp(symb->macfilename, yyfilename)) ))\r
+  {\r
+    strcpy(yyinlineold,".endmacro");\r
+    error(E_MACRO_REDEF,name);\r
+  }\r
+  else\r
+  {\r
+    // If first parse - allocate space in symbol table for macro\r
+\r
+    if(!yyparseno)\r
+    {\r
+      symb -> macro      = TRUE;\r
+      symb -> macsize    = strlen(buf1)-nameend;\r
+      symb -> macdefline = yyline;\r
+\r
+      if( !(symb -> macstr = new char[symb->macsize+2]))\r
+        errorexit(X_OUT_OF_MEMORY);\r
+\r
+      strcpy(symb->macstr, buf1+nameend);\r
+      strcpy(symb->macfilename,yyfilename);\r
+    }\r
+\r
+    // In second parse - check argument usage\r
+\r
+    else if( yyline == symb->macdefline )\r
+    {\r
+      l = symb->macsize;\r
+      symb -> macrodone = TRUE;\r
+\r
+      while(l)\r
+      {\r
+        if( isdigit(symb->macstr[l]) && (symb->macstr[l-1] == '@' ) )\r
+          symb->macparmlist[(symb->macstr[l]) -'0'] = 1;\r
+        l--;\r
+      }\r
+      lastparm = -1;\r
+      for(l=0;l<10;l++)\r
+        if(symb->macparmlist[l])\r
+          lastparm = l;\r
+\r
+      inmacro=yyinmacro;\r
+      yyinmacro=1;\r
+\r
+      for(l=0;l<=lastparm;l++)\r
+        if(!symb->macparmlist[l])\r
+          warningin(W_MACRO_UNUSES_PARM, l, name);\r
+\r
+      yyinmacro=inmacro;\r
+\r
+      strcpy(yyinlineold, yyinline);\r
+      strcpy(yyinline, yyinlinenew);\r
+    }\r
+  }\r
+\r
+  strcpy(yyinline, temp);\r
+  endofline();\r
+  delete buf1;\r
+\r
+  if(!strlen(name))\r
+    error(E_NO_MACRO_NAME);\r
+\r
+  return MACRODEF;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Insert macro in input stream\r
+  //\r
+\r
+int macro(symbolSA symb)\r
+{\r
+  char  **parmlist;\r
+  int   c;\r
+  char  line[MAX_LINE_LENGTH+2];\r
+  int   pos = 0;\r
+  int   parm;\r
+  int   inputparms = 0;\r
+  int   parmpos;\r
+  int   rem;\r
+  int   next;\r
+  int   l;\r
+  int   len;\r
+  char  *str;\r
+  int   res;\r
+  int   ch;\r
+  char  orginline[MAX_LINE_LENGTH+2];\r
+\r
+  if( (!symb -> macrodone) && (yyparseno) )\r
+  {\r
+    errorin(E_DEF_USE);\r
+    while(((ch=yyinput())!='\n') && (ch!=EOF) );\r
+    endofline();\r
+\r
+    return EOL;\r
+  }\r
+\r
+  strcpy(orginline, yyinline);\r
+\r
+  /// Allocate space for parameters /////////////////////////////////////////\r
+\r
+  if( !(parmlist = new char*[10]) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  for(c=0;c<10;c++)\r
+  {\r
+    if(!(parmlist[c]= new char [MAX_LINE_LENGTH+1]))\r
+      errorexit(X_OUT_OF_MEMORY);\r
+    else\r
+      memset(parmlist[c], 0, MAX_LINE_LENGTH+1);\r
+  }\r
+\r
+  /// Get parameters from input /////////////////////////////////////////////\r
+\r
+  while( ((line[pos]=yyinput())!='\n') && (line[pos++]!=EOF) );\r
+\r
+  if(pos && (line[pos-1]==EOF) )\r
+    line[--pos] = 0;\r
+\r
+  line[pos]=0;\r
+  line[pos+1]=0;\r
+\r
+  /// Local strtok() that inserts parameters into parameter list ////////////\r
+\r
+  if(pos)\r
+  {\r
+    pos         = 0;\r
+    parm        = 0;\r
+    rem         = FALSE;\r
+\r
+    striprem(line);\r
+\r
+    while(line[pos] && (parm<10))\r
+    {\r
+      next        = FALSE;\r
+      parmpos     = 0;\r
+\r
+      while( (!next) && (line[pos]) )\r
+      {\r
+        if( (line[pos]=='"') || (line[pos]=='\'') )\r
+          rem ? rem = FALSE : rem = TRUE;\r
+        else if( line[pos]=='\\' )\r
+          parmlist[parm][parmpos++] = line[pos++];\r
+        else if ( (line[pos]==',') && !rem)\r
+        {\r
+          parmlist[parm][parmpos] = '\0';\r
+          next = TRUE;\r
+        }\r
+        parmlist[parm][parmpos++] = line[pos++];\r
+      }\r
+      parm++;\r
+    }\r
+\r
+    inputparms = parm;\r
+\r
+  /// Clean up parametes (remove leading/trailing whitespaces and ',' ////////\r
+\r
+    for(c=0;c<10;c++)\r
+    {\r
+      pos = strlen(parmlist[c]);\r
+      if(pos)\r
+        pos--;\r
+      while( ((parmlist[c][pos]==',')||(isspace(parmlist[c][pos])))&&(pos>=0))\r
+        parmlist[c][pos--] = '\0';\r
+\r
+      if(pos)\r
+      {\r
+        l = strspn(parmlist[c], "\t\v ");\r
+        len = strlen(parmlist[c])-l;\r
+        if(l)\r
+          memmove(parmlist[c], parmlist[c]+l,len);\r
+        parmlist[c][len] = '\0';\r
+      }\r
+    }\r
+  }\r
+\r
+  /// Check that number of parameters specified, equals the ones used ////////\r
+\r
+  for(c=0;c<10;c++)\r
+  {\r
+    if( parmlist[c][0] && !symb->macparmlist[c])\r
+      warningin(W_ARG_SPEC, c);\r
+    else if( !parmlist[c][0] && symb->macparmlist[c])\r
+      warningin(W_ARG_USED, c);\r
+  }\r
+\r
+  /// Insert parameters in macro string //////////////////////////////////////\r
+\r
+  if(! (str = new char[symb-> macsize + MAX_LINE_LENGTH +5] ) )\r
+    errorexit(X_OUT_OF_MEMORY);\r
+\r
+  memset(str,0, symb-> macsize + MAX_LINE_LENGTH +5);\r
+\r
+  pos     = 0;\r
+  parm    = 0;\r
+  res     = 0;\r
+\r
+  while( symb->macstr[pos] )\r
+  {\r
+    if( (symb->macstr[pos]=='@') && (isdigit(symb->macstr[pos+1])) )\r
+    {\r
+      parm     = symb->macstr[pos+1] - '0';\r
+      pos     += 2;\r
+      parmpos  = 0;\r
+\r
+      while(parmlist[parm][parmpos])\r
+        str[res++] = parmlist[parm][parmpos++];\r
+    }\r
+    else\r
+      str[res++] = symb->macstr[pos++];\r
+  }\r
+\r
+  /// Setup new scanner context //////////////////////////////////////////////\r
+\r
+  if( yycontext == (MAX_CONTEXT_DEPTH-1) )\r
+  {\r
+    errorexit(X_MACRO_DEPTH);\r
+\r
+    for(c=0;c<10;c++)\r
+      delete parmlist[c];\r
+    delete parmlist;\r
+\r
+    return EOL;\r
+  }\r
+\r
+  strcpy(yyinlineold, yyinline);\r
+  strcpy(yyinline, yyinlinenew);\r
+\r
+  strcpy(CONTEXT->yyinlineold, yyinlineold);\r
+  strcpy(CONTEXT->yyinline,    yyinline);\r
+  strcpy(CONTEXT->yyinlinenew, yyinlinenew);\r
+\r
+  CONTEXT->line        = yyline;\r
+  CONTEXT->offset      = yyoffset;\r
+  CONTEXT->dataoffset  = yydataoffset;\r
+  CONTEXT->eromoffset  = yyeromoffset;\r
+\r
+  statestack[yycontext++]                = YY_CURRENT_BUFFER;\r
+  CONTEXT->ismacro     = TRUE;\r
+  CONTEXT->macstr      = str;\r
+  yyoffset     = yycodepos/2;\r
+  yyeromoffset = yyerompos;\r
+  yydataoffset = yydatapos;\r
+\r
+  memset(yyinlinenew, 0, MAX_LINE_LENGTH);\r
+  memset(yyinline,  0, MAX_LINE_LENGTH);\r
+\r
+  pos = strcspn(str,"\n") + 1;\r
+\r
+  strcpy(yyinline, symb->name);\r
+\r
+  for(l=0;l<inputparms;l++)\r
+  {\r
+    if(l)\r
+      strcat(yyinline, ", ");\r
+    else\r
+      strcat(yyinline, " ");\r
+    strcpy(yyinline+strlen(yyinline),parmlist[l]);\r
+  }\r
+\r
+  if(pos+strlen(yyinline) >= MAX_LINE_LENGTH-1 )\r
+    errorexit(X_MACRO_LINE_TOO_LONG, yyline, yyfilename);\r
+\r
+  memcpy(yyinline+strlen(yyinline), str ,pos);\r
+\r
+  CONTEXT->stringpos = strcspn(str+pos,"\n") + 1;\r
+\r
+  memcpy(yyinlinenew, str + pos, CONTEXT->stringpos);\r
+\r
+  CONTEXT->stringpos += pos;\r
+\r
+  strcpy(yyinline, orginline);\r
+\r
+  yyinmacro++;\r
+  yyfirstmacroline = TRUE;\r
+\r
+  yy_scan_string(str);\r
+\r
+  /// Delete parameter list //////////////////////////////////////////////////\r
+\r
+  for(c=0;c<10;c++)\r
+    delete parmlist[c];\r
+  delete parmlist;\r
+\r
+  /// Allocate new symbol table //////////////////////////////////////////////\r
+\r
+  if(!yyparseno)\r
+  {\r
+    if(symb -> macsym)\r
+      yysymbolstack[yycontext] = symb -> macsym;\r
+    else\r
+    {\r
+      if( !(yysymbolstack[yycontext] = symb -> macsym = new symbolTable()) )\r
+        errorexit(X_OUT_OF_MEMORY);\r
+\r
+      if( !symb -> macsym->init(yycfg->casesensitive, 16) )\r
+        errorexit(X_OUT_OF_MEMORY);\r
+    }\r
+  }\r
+  else\r
+    yysymbolstack[yycontext] = symb -> macsym;\r
+\r
+  if(!yysymbolstack[yycontext])\r
+    internalerror("MA %i", yycontext);\r
+\r
+//  yyline++;\r
+\r
+  return SKIPRESTART;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Turn listing on/off\r
+  //\r
+\r
+void list(int listtype)\r
+{\r
+  switch(listtype)\r
+  {\r
+    case LIST_NO        : yylist      = FALSE; break;\r
+    case LIST_YES       : yylist      = TRUE ; break;\r
+    case LIST_NO_MACRO  : yylistmacro = FALSE; break;\r
+    case LIST_YES_MACRO : yylistmacro = TRUE ; break;\r
+    default             : internalerror("LU %04X",listtype);\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Read to end of current context\r
+  //\r
+\r
+int doexit(void)\r
+{\r
+  while(yyinput()!=EOF);\r
+  yyeol=TRUE; \r
+  return restart();\r
+}\r
+\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/avrlex0.inc b/src/mkutil/tavrasm.118/src/avrlex0.inc
new file mode 100644 (file)
index 0000000..cea7032
--- /dev/null
@@ -0,0 +1,495 @@
+case 1:\r
+YY_RULE_SETUP\r
+/* #line 116 "avrlex.l" */\r
+return STAR;\r
+       YY_BREAK\r
+case 2:\r
+YY_RULE_SETUP\r
+/* #line 117 "avrlex.l" */\r
+return DIV;\r
+       YY_BREAK\r
+case 3:\r
+YY_RULE_SETUP\r
+/* #line 118 "avrlex.l" */\r
+return MOD;\r
+       YY_BREAK\r
+case 4:\r
+YY_RULE_SETUP\r
+/* #line 119 "avrlex.l" */\r
+return LS;\r
+       YY_BREAK\r
+case 5:\r
+YY_RULE_SETUP\r
+/* #line 120 "avrlex.l" */\r
+return RS;\r
+       YY_BREAK\r
+case 6:\r
+YY_RULE_SETUP\r
+/* #line 121 "avrlex.l" */\r
+return LE;\r
+       YY_BREAK\r
+case 7:\r
+YY_RULE_SETUP\r
+/* #line 122 "avrlex.l" */\r
+return GE;\r
+       YY_BREAK\r
+case 8:\r
+YY_RULE_SETUP\r
+/* #line 123 "avrlex.l" */\r
+return LESS;\r
+       YY_BREAK\r
+case 9:\r
+YY_RULE_SETUP\r
+/* #line 124 "avrlex.l" */\r
+return GREAT;\r
+       YY_BREAK\r
+case 10:\r
+YY_RULE_SETUP\r
+/* #line 125 "avrlex.l" */\r
+return EQ;\r
+       YY_BREAK\r
+case 11:\r
+YY_RULE_SETUP\r
+/* #line 126 "avrlex.l" */\r
+return NE;\r
+       YY_BREAK\r
+case 12:\r
+YY_RULE_SETUP\r
+/* #line 127 "avrlex.l" */\r
+return OROR;\r
+       YY_BREAK\r
+case 13:\r
+YY_RULE_SETUP\r
+/* #line 128 "avrlex.l" */\r
+return ANDAND;\r
+       YY_BREAK\r
+case 14:\r
+YY_RULE_SETUP\r
+/* #line 129 "avrlex.l" */\r
+return OR;\r
+       YY_BREAK\r
+case 15:\r
+YY_RULE_SETUP\r
+/* #line 130 "avrlex.l" */\r
+return AND;\r
+       YY_BREAK\r
+case 16:\r
+YY_RULE_SETUP\r
+/* #line 131 "avrlex.l" */\r
+return XOR;\r
+       YY_BREAK\r
+case 17:\r
+YY_RULE_SETUP\r
+/* #line 132 "avrlex.l" */\r
+return LPAR;\r
+       YY_BREAK\r
+case 18:\r
+YY_RULE_SETUP\r
+/* #line 133 "avrlex.l" */\r
+return RPAR;\r
+       YY_BREAK\r
+case 19:\r
+YY_RULE_SETUP\r
+/* #line 134 "avrlex.l" */\r
+return COLON;\r
+       YY_BREAK\r
+case 20:\r
+YY_RULE_SETUP\r
+/* #line 135 "avrlex.l" */\r
+return COMMA;\r
+       YY_BREAK\r
+case 21:\r
+YY_RULE_SETUP\r
+/* #line 136 "avrlex.l" */\r
+return DOT;\r
+       YY_BREAK\r
+case 22:\r
+YY_RULE_SETUP\r
+/* #line 137 "avrlex.l" */\r
+return PLUS;\r
+       YY_BREAK\r
+case 23:\r
+YY_RULE_SETUP\r
+/* #line 138 "avrlex.l" */\r
+return MINUS;\r
+       YY_BREAK\r
+case 24:\r
+YY_RULE_SETUP\r
+/* #line 139 "avrlex.l" */\r
+return EQUAL;\r
+       YY_BREAK\r
+case 25:\r
+YY_RULE_SETUP\r
+/* #line 140 "avrlex.l" */\r
+return WAVE;\r
+       YY_BREAK\r
+case 26:\r
+YY_RULE_SETUP\r
+/* #line 141 "avrlex.l" */\r
+return NOT;\r
+       YY_BREAK\r
+case 27:\r
+YY_RULE_SETUP\r
+/* #line 143 "avrlex.l" */\r
+return DEF;\r
+       YY_BREAK\r
+case 28:\r
+YY_RULE_SETUP\r
+/* #line 144 "avrlex.l" */\r
+return EQU;\r
+       YY_BREAK\r
+case 29:\r
+YY_RULE_SETUP\r
+/* #line 145 "avrlex.l" */\r
+return EQU;\r
+       YY_BREAK\r
+case 30:\r
+YY_RULE_SETUP\r
+/* #line 146 "avrlex.l" */\r
+return DB;\r
+       YY_BREAK\r
+case 31:\r
+YY_RULE_SETUP\r
+/* #line 147 "avrlex.l" */\r
+return DW;\r
+       YY_BREAK\r
+case 32:\r
+YY_RULE_SETUP\r
+/* #line 148 "avrlex.l" */\r
+return ORG;\r
+       YY_BREAK\r
+case 33:\r
+YY_RULE_SETUP\r
+/* #line 149 "avrlex.l" */\r
+return BYTE;\r
+       YY_BREAK\r
+case 34:\r
+YY_RULE_SETUP\r
+/* #line 150 "avrlex.l" */\r
+return SET;\r
+       YY_BREAK\r
+case 35:\r
+YY_RULE_SETUP\r
+/* #line 151 "avrlex.l" */\r
+return DEVICE;\r
+       YY_BREAK\r
+case 36:\r
+YY_RULE_SETUP\r
+/* #line 153 "avrlex.l" */\r
+{ yysegment = SEGMENT_CODE;   return CSEG;  }\r
+       YY_BREAK\r
+case 37:\r
+YY_RULE_SETUP\r
+/* #line 154 "avrlex.l" */\r
+{ yysegment = SEGMENT_DATA;   return ESEG;  }\r
+       YY_BREAK\r
+case 38:\r
+YY_RULE_SETUP\r
+/* #line 155 "avrlex.l" */\r
+{ yysegment = SEGMENT_EEPROM; return DSEG;  }\r
+       YY_BREAK\r
+case 39:\r
+YY_RULE_SETUP\r
+/* #line 157 "avrlex.l" */\r
+{ yylval.func   = OP_LOW;   return FUNCTION;}\r
+       YY_BREAK\r
+case 40:\r
+YY_RULE_SETUP\r
+/* #line 158 "avrlex.l" */\r
+{ yylval.func   = OP_HIGH;  return FUNCTION;}\r
+       YY_BREAK\r
+case 41:\r
+YY_RULE_SETUP\r
+/* #line 159 "avrlex.l" */\r
+{ yylval.func   = OP_LOW;   return FUNCTION;}\r
+       YY_BREAK\r
+case 42:\r
+YY_RULE_SETUP\r
+/* #line 160 "avrlex.l" */\r
+{ yylval.func   = OP_BYTE2; return FUNCTION;}\r
+       YY_BREAK\r
+case 43:\r
+YY_RULE_SETUP\r
+/* #line 161 "avrlex.l" */\r
+{ yylval.func   = OP_BYTE3; return FUNCTION;}\r
+       YY_BREAK\r
+case 44:\r
+YY_RULE_SETUP\r
+/* #line 162 "avrlex.l" */\r
+{ yylval.func   = OP_BYTE4; return FUNCTION;}\r
+       YY_BREAK\r
+case 45:\r
+YY_RULE_SETUP\r
+/* #line 163 "avrlex.l" */\r
+{ yylval.func   = OP_LWRD;  return FUNCTION;}\r
+       YY_BREAK\r
+case 46:\r
+YY_RULE_SETUP\r
+/* #line 164 "avrlex.l" */\r
+{ yylval.func   = OP_HWRD;  return FUNCTION;}\r
+       YY_BREAK\r
+case 47:\r
+YY_RULE_SETUP\r
+/* #line 165 "avrlex.l" */\r
+{ yylval.func   = OP_PAGE;  return FUNCTION;}\r
+       YY_BREAK\r
+case 48:\r
+YY_RULE_SETUP\r
+/* #line 166 "avrlex.l" */\r
+{ yylval.func   = OP_EXP2;  return FUNCTION;}\r
+       YY_BREAK\r
+case 49:\r
+YY_RULE_SETUP\r
+/* #line 167 "avrlex.l" */\r
+{ yylval.func   = OP_LOG2;  return FUNCTION;}\r
+       YY_BREAK\r
+case 50:\r
+YY_RULE_SETUP\r
+/* #line 168 "avrlex.l" */\r
+{ yylval.opcode = O_CPC;    return IREGREG; } /* Register */\r
+       YY_BREAK\r
+case 51:\r
+YY_RULE_SETUP\r
+/* #line 169 "avrlex.l" */\r
+{ yylval.opcode = O_CP;     return IREGREG; }\r
+       YY_BREAK\r
+case 52:\r
+YY_RULE_SETUP\r
+/* #line 170 "avrlex.l" */\r
+{ yylval.opcode = O_SBC;    return IREGREG; }\r
+       YY_BREAK\r
+case 53:\r
+YY_RULE_SETUP\r
+/* #line 171 "avrlex.l" */\r
+{ yylval.opcode = O_SUB;    return IREGREG; }\r
+       YY_BREAK\r
+case 54:\r
+YY_RULE_SETUP\r
+/* #line 172 "avrlex.l" */\r
+{ yylval.opcode = O_ADD;    return IREGREG; }\r
+       YY_BREAK\r
+case 55:\r
+YY_RULE_SETUP\r
+/* #line 173 "avrlex.l" */\r
+{ yylval.opcode = O_ADC;    return IREGREG; }\r
+       YY_BREAK\r
+case 56:\r
+YY_RULE_SETUP\r
+/* #line 174 "avrlex.l" */\r
+{ yylval.opcode = O_CPSE;   return IREGREG; }\r
+       YY_BREAK\r
+case 57:\r
+YY_RULE_SETUP\r
+/* #line 175 "avrlex.l" */\r
+{ yylval.opcode = O_AND;    return IREGREG; }\r
+       YY_BREAK\r
+case 58:\r
+YY_RULE_SETUP\r
+/* #line 176 "avrlex.l" */\r
+{ yylval.opcode = O_EOR;    return IREGREG; }\r
+       YY_BREAK\r
+case 59:\r
+YY_RULE_SETUP\r
+/* #line 177 "avrlex.l" */\r
+{ yylval.opcode = O_OR;     return IREGREG; }\r
+       YY_BREAK\r
+case 60:\r
+YY_RULE_SETUP\r
+/* #line 178 "avrlex.l" */\r
+{ yylval.opcode = O_MOV;    return IREGREG; }\r
+       YY_BREAK\r
+case 61:\r
+YY_RULE_SETUP\r
+/* #line 179 "avrlex.l" */\r
+{ yylval.opcode = O_MOVW;   return IREGREG; }\r
+       YY_BREAK\r
+case 62:\r
+YY_RULE_SETUP\r
+/* #line 180 "avrlex.l" */\r
+{ yylval.opcode = O_MUL;    return IREGREG; }\r
+       YY_BREAK\r
+case 63:\r
+YY_RULE_SETUP\r
+/* #line 181 "avrlex.l" */\r
+{ yylval.opcode = O_MULS;   return IREGREG; }\r
+       YY_BREAK\r
+case 64:\r
+YY_RULE_SETUP\r
+/* #line 182 "avrlex.l" */\r
+{ yylval.opcode = O_MULSU;  return IREGREG; }\r
+       YY_BREAK\r
+case 65:\r
+YY_RULE_SETUP\r
+/* #line 183 "avrlex.l" */\r
+{ yylval.opcode = O_FMUL;   return IREGREG; }\r
+       YY_BREAK\r
+case 66:\r
+YY_RULE_SETUP\r
+/* #line 184 "avrlex.l" */\r
+{ yylval.opcode = O_FMULS;  return IREGREG; }\r
+       YY_BREAK\r
+case 67:\r
+YY_RULE_SETUP\r
+/* #line 185 "avrlex.l" */\r
+{ yylval.opcode = O_FMULSU; return IREGREG; }\r
+       YY_BREAK\r
+case 68:\r
+YY_RULE_SETUP\r
+/* #line 186 "avrlex.l" */\r
+{ yylval.opcode = O_ADIW;   return IREGIMM; } /* Reg/Imm */\r
+       YY_BREAK\r
+case 69:\r
+YY_RULE_SETUP\r
+/* #line 187 "avrlex.l" */\r
+{ yylval.opcode = O_SBIW;   return IREGIMM; }\r
+       YY_BREAK\r
+case 70:\r
+YY_RULE_SETUP\r
+/* #line 188 "avrlex.l" */\r
+{ yylval.opcode = O_CPI;    return IREGIMM; }\r
+       YY_BREAK\r
+case 71:\r
+YY_RULE_SETUP\r
+/* #line 189 "avrlex.l" */\r
+{ yylval.opcode = O_SBCI;   return IREGIMM; }\r
+       YY_BREAK\r
+case 72:\r
+YY_RULE_SETUP\r
+/* #line 190 "avrlex.l" */\r
+{ yylval.opcode = O_SUBI;   return IREGIMM; }\r
+       YY_BREAK\r
+case 73:\r
+YY_RULE_SETUP\r
+/* #line 191 "avrlex.l" */\r
+{ yylval.opcode = O_ORI;    return IREGIMM; }\r
+       YY_BREAK\r
+case 74:\r
+YY_RULE_SETUP\r
+/* #line 192 "avrlex.l" */\r
+{ yylval.opcode = O_ANDI;   return IREGIMM; }\r
+       YY_BREAK\r
+case 75:\r
+YY_RULE_SETUP\r
+/* #line 193 "avrlex.l" */\r
+{ yylval.opcode = O_LDI;    return IREGIMM; }\r
+       YY_BREAK\r
+case 76:\r
+YY_RULE_SETUP\r
+/* #line 194 "avrlex.l" */\r
+{ yylval.opcode = O_LDS;    return IREGIMM; }\r
+       YY_BREAK\r
+case 77:\r
+YY_RULE_SETUP\r
+/* #line 195 "avrlex.l" */\r
+{ yylval.opcode = O_SBR;    return IREGIMM; }\r
+       YY_BREAK\r
+case 78:\r
+YY_RULE_SETUP\r
+/* #line 196 "avrlex.l" */\r
+{ yylval.opcode = O_BRCC;   return IIMM;    } /* Immediate */\r
+       YY_BREAK\r
+case 79:\r
+YY_RULE_SETUP\r
+/* #line 197 "avrlex.l" */\r
+{ yylval.opcode = O_BRCS;   return IIMM;    }\r
+       YY_BREAK\r
+case 80:\r
+YY_RULE_SETUP\r
+/* #line 198 "avrlex.l" */\r
+{ yylval.opcode = O_BRNE;   return IIMM;    }\r
+       YY_BREAK\r
+case 81:\r
+YY_RULE_SETUP\r
+/* #line 199 "avrlex.l" */\r
+{ yylval.opcode = O_BREQ;   return IIMM;    }\r
+       YY_BREAK\r
+case 82:\r
+YY_RULE_SETUP\r
+/* #line 200 "avrlex.l" */\r
+{ yylval.opcode = O_BRPL;   return IIMM;    }\r
+       YY_BREAK\r
+case 83:\r
+YY_RULE_SETUP\r
+/* #line 201 "avrlex.l" */\r
+{ yylval.opcode = O_BRMI;   return IIMM;    }\r
+       YY_BREAK\r
+case 84:\r
+YY_RULE_SETUP\r
+/* #line 202 "avrlex.l" */\r
+{ yylval.opcode = O_BRVC;   return IIMM;    }\r
+       YY_BREAK\r
+case 85:\r
+YY_RULE_SETUP\r
+/* #line 203 "avrlex.l" */\r
+{ yylval.opcode = O_BRVS;   return IIMM;    }\r
+       YY_BREAK\r
+case 86:\r
+YY_RULE_SETUP\r
+/* #line 204 "avrlex.l" */\r
+{ yylval.opcode = O_BRGE;   return IIMM;    }\r
+       YY_BREAK\r
+case 87:\r
+YY_RULE_SETUP\r
+/* #line 205 "avrlex.l" */\r
+{ yylval.opcode = O_BRLT;   return IIMM;    }\r
+       YY_BREAK\r
+case 88:\r
+YY_RULE_SETUP\r
+/* #line 206 "avrlex.l" */\r
+{ yylval.opcode = O_BRHC;   return IIMM;    }\r
+       YY_BREAK\r
+case 89:\r
+YY_RULE_SETUP\r
+/* #line 207 "avrlex.l" */\r
+{ yylval.opcode = O_BRHS;   return IIMM;    }\r
+       YY_BREAK\r
+case 90:\r
+YY_RULE_SETUP\r
+/* #line 208 "avrlex.l" */\r
+{ yylval.opcode = O_BRTC;   return IIMM;    }\r
+       YY_BREAK\r
+case 91:\r
+YY_RULE_SETUP\r
+/* #line 209 "avrlex.l" */\r
+{ yylval.opcode = O_BRTS;   return IIMM;    }\r
+       YY_BREAK\r
+case 92:\r
+YY_RULE_SETUP\r
+/* #line 210 "avrlex.l" */\r
+{ yylval.opcode = O_BRID;   return IIMM;    }\r
+       YY_BREAK\r
+case 93:\r
+YY_RULE_SETUP\r
+/* #line 211 "avrlex.l" */\r
+{ yylval.opcode = O_BRIE;   return IIMM;    }\r
+       YY_BREAK\r
+case 94:\r
+YY_RULE_SETUP\r
+/* #line 212 "avrlex.l" */\r
+{ yylval.opcode = O_BRSH;   return IIMM;    }\r
+       YY_BREAK\r
+case 95:\r
+YY_RULE_SETUP\r
+/* #line 213 "avrlex.l" */\r
+{ yylval.opcode = O_BRLO;   return IIMM;    }\r
+       YY_BREAK\r
+case 96:\r
+YY_RULE_SETUP\r
+/* #line 214 "avrlex.l" */\r
+{ yylval.opcode = O_NEG;    return IREG;    } /* Register */\r
+       YY_BREAK\r
+case 97:\r
+YY_RULE_SETUP\r
+/* #line 215 "avrlex.l" */\r
+{ yylval.opcode = O_SWAP;   return IREG;    }\r
+       YY_BREAK\r
+case 98:\r
+YY_RULE_SETUP\r
+/* #line 216 "avrlex.l" */\r
+{ yylval.opcode = O_INC;    return IREG;    }\r
+       YY_BREAK\r
+case 99:\r
+YY_RULE_SETUP\r
+/* #line 217 "avrlex.l" */\r
+{ yylval.opcode = O_ASR;    return IREG;    }\r
+       YY_BREAK\r
diff --git a/src/mkutil/tavrasm.118/src/avrlex1.inc b/src/mkutil/tavrasm.118/src/avrlex1.inc
new file mode 100644 (file)
index 0000000..665f2cb
--- /dev/null
@@ -0,0 +1,495 @@
+case 100:\r
+YY_RULE_SETUP\r
+/* #line 218 "avrlex.l" */\r
+{ yylval.opcode = O_LSR;    return IREG;    }\r
+       YY_BREAK\r
+case 101:\r
+YY_RULE_SETUP\r
+/* #line 219 "avrlex.l" */\r
+{ yylval.opcode = O_DEC;    return IREG;    }\r
+       YY_BREAK\r
+case 102:\r
+YY_RULE_SETUP\r
+/* #line 220 "avrlex.l" */\r
+{ yylval.opcode = O_POP;    return IREG;    }\r
+       YY_BREAK\r
+case 103:\r
+YY_RULE_SETUP\r
+/* #line 221 "avrlex.l" */\r
+{ yylval.opcode = O_PUSH;   return IREG;    }\r
+       YY_BREAK\r
+case 104:\r
+YY_RULE_SETUP\r
+/* #line 222 "avrlex.l" */\r
+{ yylval.opcode = O_CLR;    return IREG;    }\r
+       YY_BREAK\r
+case 105:\r
+YY_RULE_SETUP\r
+/* #line 223 "avrlex.l" */\r
+{ yylval.opcode = O_TST;    return IREG;    }\r
+       YY_BREAK\r
+case 106:\r
+YY_RULE_SETUP\r
+/* #line 224 "avrlex.l" */\r
+{ yylval.opcode = O_COM;    return IREG;    }\r
+       YY_BREAK\r
+case 107:\r
+YY_RULE_SETUP\r
+/* #line 225 "avrlex.l" */\r
+{ yylval.opcode = O_ROR;    return IREG;    }\r
+       YY_BREAK\r
+case 108:\r
+YY_RULE_SETUP\r
+/* #line 226 "avrlex.l" */\r
+{ yylval.opcode = O_SEC;    return INOARGS; } /* No arguments */\r
+       YY_BREAK\r
+case 109:\r
+YY_RULE_SETUP\r
+/* #line 227 "avrlex.l" */\r
+{ yylval.opcode = O_SEZ;    return INOARGS; }\r
+       YY_BREAK\r
+case 110:\r
+YY_RULE_SETUP\r
+/* #line 228 "avrlex.l" */\r
+{ yylval.opcode = O_SEN;    return INOARGS; }\r
+       YY_BREAK\r
+case 111:\r
+YY_RULE_SETUP\r
+/* #line 229 "avrlex.l" */\r
+{ yylval.opcode = O_SEV;    return INOARGS; }\r
+       YY_BREAK\r
+case 112:\r
+YY_RULE_SETUP\r
+/* #line 230 "avrlex.l" */\r
+{ yylval.opcode = O_SES;    return INOARGS; }\r
+       YY_BREAK\r
+case 113:\r
+YY_RULE_SETUP\r
+/* #line 231 "avrlex.l" */\r
+{ yylval.opcode = O_SEH;    return INOARGS; }\r
+       YY_BREAK\r
+case 114:\r
+YY_RULE_SETUP\r
+/* #line 232 "avrlex.l" */\r
+{ yylval.opcode = O_SET;    return INOARGS; }\r
+       YY_BREAK\r
+case 115:\r
+YY_RULE_SETUP\r
+/* #line 233 "avrlex.l" */\r
+{ yylval.opcode = O_SEI;    return INOARGS; }\r
+       YY_BREAK\r
+case 116:\r
+YY_RULE_SETUP\r
+/* #line 234 "avrlex.l" */\r
+{ yylval.opcode = O_CLC;    return INOARGS; }\r
+       YY_BREAK\r
+case 117:\r
+YY_RULE_SETUP\r
+/* #line 235 "avrlex.l" */\r
+{ yylval.opcode = O_CLZ;    return INOARGS; }\r
+       YY_BREAK\r
+case 118:\r
+YY_RULE_SETUP\r
+/* #line 236 "avrlex.l" */\r
+{ yylval.opcode = O_CLN;    return INOARGS; }\r
+       YY_BREAK\r
+case 119:\r
+YY_RULE_SETUP\r
+/* #line 237 "avrlex.l" */\r
+{ yylval.opcode = O_CLV;    return INOARGS; }\r
+       YY_BREAK\r
+case 120:\r
+YY_RULE_SETUP\r
+/* #line 238 "avrlex.l" */\r
+{ yylval.opcode = O_CLS;    return INOARGS; }\r
+       YY_BREAK\r
+case 121:\r
+YY_RULE_SETUP\r
+/* #line 239 "avrlex.l" */\r
+{ yylval.opcode = O_CLH;    return INOARGS; }\r
+       YY_BREAK\r
+case 122:\r
+YY_RULE_SETUP\r
+/* #line 240 "avrlex.l" */\r
+{ yylval.opcode = O_CLT;    return INOARGS; }\r
+       YY_BREAK\r
+case 123:\r
+YY_RULE_SETUP\r
+/* #line 241 "avrlex.l" */\r
+{ yylval.opcode = O_CLI;    return INOARGS; }\r
+       YY_BREAK\r
+case 124:\r
+YY_RULE_SETUP\r
+/* #line 242 "avrlex.l" */\r
+{ yylval.opcode = O_NOP;    return INOARGS; }\r
+       YY_BREAK\r
+case 125:\r
+YY_RULE_SETUP\r
+/* #line 243 "avrlex.l" */\r
+{ yylval.opcode = O_ICALL;  return INOARGS; } /* Misc. */\r
+       YY_BREAK\r
+case 126:\r
+YY_RULE_SETUP\r
+/* #line 244 "avrlex.l" */\r
+{ yylval.opcode = O_IJMP;   return INOARGS; }\r
+       YY_BREAK\r
+case 127:\r
+YY_RULE_SETUP\r
+/* #line 245 "avrlex.l" */\r
+{ yylval.opcode = O_RETI;   return INOARGS; }\r
+       YY_BREAK\r
+case 128:\r
+YY_RULE_SETUP\r
+/* #line 246 "avrlex.l" */\r
+{ yylval.opcode = O_RET;    return INOARGS; }\r
+       YY_BREAK\r
+case 129:\r
+YY_RULE_SETUP\r
+/* #line 247 "avrlex.l" */\r
+{ yylval.opcode = O_SLEEP;  return INOARGS; }\r
+       YY_BREAK\r
+case 130:\r
+YY_RULE_SETUP\r
+/* #line 248 "avrlex.l" */\r
+{ yylval.opcode = O_WDR;    return INOARGS; }\r
+       YY_BREAK\r
+case 131:\r
+YY_RULE_SETUP\r
+/* #line 249 "avrlex.l" */\r
+{ yylval.opcode = O_EIJMP;  return INOARGS; }\r
+       YY_BREAK\r
+case 132:\r
+YY_RULE_SETUP\r
+/* #line 250 "avrlex.l" */\r
+{ yylval.opcode = O_EICALL; return INOARGS; }\r
+       YY_BREAK\r
+case 133:\r
+YY_RULE_SETUP\r
+/* #line 251 "avrlex.l" */\r
+{ yylval.opcode = O_SPM;    return INOARGS; }\r
+       YY_BREAK\r
+case 134:\r
+YY_RULE_SETUP\r
+/* #line 252 "avrlex.l" */\r
+{ yylval.opcode = O_ESPM;   return INOARGS; }\r
+       YY_BREAK\r
+case 135:\r
+YY_RULE_SETUP\r
+/* #line 253 "avrlex.l" */\r
+{ yylval.opcode = O_BCLR;   return IIMM;    }\r
+       YY_BREAK\r
+case 136:\r
+YY_RULE_SETUP\r
+/* #line 254 "avrlex.l" */\r
+{ yylval.opcode = O_BSET;   return IIMM;    }\r
+       YY_BREAK\r
+case 137:\r
+YY_RULE_SETUP\r
+/* #line 255 "avrlex.l" */\r
+{ yylval.opcode = O_RCALL;  return IIMM;    }\r
+       YY_BREAK\r
+case 138:\r
+YY_RULE_SETUP\r
+/* #line 256 "avrlex.l" */\r
+{ yylval.opcode = O_RJMP;   return IIMM;    }\r
+       YY_BREAK\r
+case 139:\r
+YY_RULE_SETUP\r
+/* #line 257 "avrlex.l" */\r
+{ yylval.opcode = O_JMP;    return IIMM;    }\r
+       YY_BREAK\r
+case 140:\r
+YY_RULE_SETUP\r
+/* #line 258 "avrlex.l" */\r
+{ yylval.opcode = O_CALL;   return IIMM;    }\r
+       YY_BREAK\r
+case 141:\r
+YY_RULE_SETUP\r
+/* #line 259 "avrlex.l" */\r
+{ yylval.opcode = O_BRBC;   return IIMMIMM; }\r
+       YY_BREAK\r
+case 142:\r
+YY_RULE_SETUP\r
+/* #line 260 "avrlex.l" */\r
+{ yylval.opcode = O_BRBS;   return IIMMIMM; }\r
+       YY_BREAK\r
+case 143:\r
+YY_RULE_SETUP\r
+/* #line 261 "avrlex.l" */\r
+{ yylval.opcode = O_CBI;    return IIMMIMM; }\r
+       YY_BREAK\r
+case 144:\r
+YY_RULE_SETUP\r
+/* #line 262 "avrlex.l" */\r
+{ yylval.opcode = O_SBI;    return IIMMIMM; }\r
+       YY_BREAK\r
+case 145:\r
+YY_RULE_SETUP\r
+/* #line 263 "avrlex.l" */\r
+{ yylval.opcode = O_SBIC;   return IIMMIMM; }\r
+       YY_BREAK\r
+case 146:\r
+YY_RULE_SETUP\r
+/* #line 264 "avrlex.l" */\r
+{ yylval.opcode = O_SBIS;   return IIMMIMM; }\r
+       YY_BREAK\r
+case 147:\r
+YY_RULE_SETUP\r
+/* #line 265 "avrlex.l" */\r
+{ yylval.opcode = O_OUT;    return IIMMREG; }\r
+       YY_BREAK\r
+case 148:\r
+YY_RULE_SETUP\r
+/* #line 266 "avrlex.l" */\r
+{ yylval.opcode = O_STS;    return IIMMREG; }\r
+       YY_BREAK\r
+case 149:\r
+YY_RULE_SETUP\r
+/* #line 267 "avrlex.l" */\r
+{ yylval.opcode = O_ROL;    return IREG;    }\r
+       YY_BREAK\r
+case 150:\r
+YY_RULE_SETUP\r
+/* #line 268 "avrlex.l" */\r
+{ yylval.opcode = O_SER;    return IREG;    }\r
+       YY_BREAK\r
+case 151:\r
+YY_RULE_SETUP\r
+/* #line 269 "avrlex.l" */\r
+{ yylval.opcode = O_LSL;    return IREG;    }\r
+       YY_BREAK\r
+case 152:\r
+YY_RULE_SETUP\r
+/* #line 270 "avrlex.l" */\r
+{ yylval.opcode = O_BLD;    return IREGIMM; }\r
+       YY_BREAK\r
+case 153:\r
+YY_RULE_SETUP\r
+/* #line 271 "avrlex.l" */\r
+{ yylval.opcode = O_BST;    return IREGIMM; }\r
+       YY_BREAK\r
+case 154:\r
+YY_RULE_SETUP\r
+/* #line 272 "avrlex.l" */\r
+{ yylval.opcode = O_CBR;    return IREGIMM; }\r
+       YY_BREAK\r
+case 155:\r
+YY_RULE_SETUP\r
+/* #line 273 "avrlex.l" */\r
+{ yylval.opcode = O_IN;     return IREGIMM; }\r
+       YY_BREAK\r
+case 156:\r
+YY_RULE_SETUP\r
+/* #line 274 "avrlex.l" */\r
+{ yylval.opcode = O_SBRC;   return IREGIMM; }\r
+       YY_BREAK\r
+case 157:\r
+YY_RULE_SETUP\r
+/* #line 275 "avrlex.l" */\r
+{ yylval.opcode = O_SBRS;   return IREGIMM; }\r
+       YY_BREAK\r
+case 158:\r
+YY_RULE_SETUP\r
+/* #line 276 "avrlex.l" */\r
+{ yylval.opcode = O_LD;     return IINDIRC; }\r
+       YY_BREAK\r
+case 159:\r
+YY_RULE_SETUP\r
+/* #line 277 "avrlex.l" */\r
+{ yylval.opcode = O_ST;     return IINDIRC; }\r
+       YY_BREAK\r
+case 160:\r
+YY_RULE_SETUP\r
+/* #line 278 "avrlex.l" */\r
+{ yylval.opcode = O_LDD;    return IINDIRC; }\r
+       YY_BREAK\r
+case 161:\r
+YY_RULE_SETUP\r
+/* #line 279 "avrlex.l" */\r
+{ yylval.opcode = O_STD;    return IINDIRC; }\r
+       YY_BREAK\r
+case 162:\r
+YY_RULE_SETUP\r
+/* #line 280 "avrlex.l" */\r
+{ yylval.regid = 26;        return REGXYZ;  }\r
+       YY_BREAK\r
+case 163:\r
+YY_RULE_SETUP\r
+/* #line 281 "avrlex.l" */\r
+{ yylval.regid = 28;        return REGXYZ;  }\r
+       YY_BREAK\r
+case 164:\r
+YY_RULE_SETUP\r
+/* #line 282 "avrlex.l" */\r
+{ yylval.regid = 30;        return REGXYZ;  }\r
+       YY_BREAK\r
+case 165:\r
+YY_RULE_SETUP\r
+/* #line 283 "avrlex.l" */\r
+{ yylval.opcode = O_LPM;    return ILPM;    }\r
+       YY_BREAK\r
+case 166:\r
+YY_RULE_SETUP\r
+/* #line 284 "avrlex.l" */\r
+{ yylval.opcode = O_ELPM;   return ILPM;    }\r
+       YY_BREAK\r
+case 167:\r
+YY_RULE_SETUP\r
+/* #line 286 "avrlex.l" */\r
+{ yylval.val.value=yycodepos/2;yylval.val.valid=TRUE; return COUNTER;}\r
+       YY_BREAK\r
+case 168:\r
+YY_RULE_SETUP\r
+/* #line 287 "avrlex.l" */\r
+{ yylval.val.value=yydatapos;  yylval.val.valid=TRUE; return COUNTER;}\r
+       YY_BREAK\r
+case 169:\r
+YY_RULE_SETUP\r
+/* #line 288 "avrlex.l" */\r
+{ yylval.val.value=yyerompos;  yylval.val.valid=TRUE; return COUNTER;}\r
+       YY_BREAK\r
+case 170:\r
+YY_RULE_SETUP\r
+/* #line 290 "avrlex.l" */\r
+list(LIST_NO_MACRO);\r
+       YY_BREAK\r
+case 171:\r
+YY_RULE_SETUP\r
+/* #line 291 "avrlex.l" */\r
+list(LIST_NO);\r
+       YY_BREAK\r
+case 172:\r
+YY_RULE_SETUP\r
+/* #line 292 "avrlex.l" */\r
+list(LIST_YES_MACRO);\r
+       YY_BREAK\r
+case 173:\r
+YY_RULE_SETUP\r
+/* #line 293 "avrlex.l" */\r
+list(LIST_YES);\r
+       YY_BREAK\r
+case 174:\r
+YY_RULE_SETUP\r
+/* #line 294 "avrlex.l" */\r
+yyeol=TRUE; if((ret=doexit()   )!=SKIPRESTART) return ret;\r
+       YY_BREAK\r
+case 175:\r
+YY_RULE_SETUP\r
+/* #line 295 "avrlex.l" */\r
+if(includefile()==EOL) return EOL;\r
+       YY_BREAK\r
+case 176:\r
+YY_RULE_SETUP\r
+/* #line 296 "avrlex.l" */\r
+return macrodef();\r
+       YY_BREAK\r
+case 177:\r
+YY_RULE_SETUP\r
+/* #line 297 "avrlex.l" */\r
+errorin(E_ENDM);\r
+       YY_BREAK\r
+case 178:\r
+YY_RULE_SETUP\r
+/* #line 298 "avrlex.l" */\r
+return string();\r
+       YY_BREAK\r
+case 179:\r
+YY_RULE_SETUP\r
+/* #line 299 "avrlex.l" */\r
+return registers();\r
+       YY_BREAK\r
+case 180:\r
+YY_RULE_SETUP\r
+/* #line 300 "avrlex.l" */\r
+return integers();\r
+       YY_BREAK\r
+case 181:\r
+YY_RULE_SETUP\r
+/* #line 301 "avrlex.l" */\r
+return integers();\r
+       YY_BREAK\r
+case 182:\r
+YY_RULE_SETUP\r
+/* #line 302 "avrlex.l" */\r
+return integers();\r
+       YY_BREAK\r
+case 183:\r
+YY_RULE_SETUP\r
+/* #line 303 "avrlex.l" */\r
+return integers();\r
+       YY_BREAK\r
+case 184:\r
+YY_RULE_SETUP\r
+/* #line 304 "avrlex.l" */\r
+return integers();\r
+       YY_BREAK\r
+case 185:\r
+YY_RULE_SETUP\r
+/* #line 305 "avrlex.l" */\r
+return character();\r
+       YY_BREAK\r
+case 186:\r
+YY_RULE_SETUP\r
+/* #line 306 "avrlex.l" */\r
+warningin(W_HEX_ESCAPE_INVALID);yylval.val.valid = TRUE;yylval.val.value = 0; return INTEGER;\r
+       YY_BREAK\r
+case 187:\r
+YY_RULE_SETUP\r
+/* #line 307 "avrlex.l" */\r
+return character();\r
+       YY_BREAK\r
+case 188:\r
+YY_RULE_SETUP\r
+/* #line 308 "avrlex.l" */\r
+warningin(W_OCT_ESCAPE_INVALID);yylval.val.valid = TRUE;yylval.val.value = 0; return INTEGER;\r
+       YY_BREAK\r
+case 189:\r
+YY_RULE_SETUP\r
+/* #line 309 "avrlex.l" */\r
+return character();\r
+       YY_BREAK\r
+case 190:\r
+YY_RULE_SETUP\r
+/* #line 310 "avrlex.l" */\r
+return character();\r
+       YY_BREAK\r
+case 191:\r
+YY_RULE_SETUP\r
+/* #line 311 "avrlex.l" */\r
+if((ret=identifier())!=SKIPRESTART)return ret;\r
+       YY_BREAK\r
+case 192:\r
+YY_RULE_SETUP\r
+/* #line 313 "avrlex.l" */\r
+yyeol=TRUE; return endofline();\r
+       YY_BREAK\r
+case 193:\r
+YY_RULE_SETUP\r
+/* #line 314 "avrlex.l" */\r
+;\r
+       YY_BREAK\r
+case 194:\r
+YY_RULE_SETUP\r
+/* #line 315 "avrlex.l" */\r
+;\r
+       YY_BREAK\r
+case 195:\r
+YY_RULE_SETUP\r
+/* #line 316 "avrlex.l" */\r
+;\r
+       YY_BREAK\r
+case 196:\r
+YY_RULE_SETUP\r
+/* #line 317 "avrlex.l" */\r
+;\r
+       YY_BREAK\r
+case 197:\r
+YY_RULE_SETUP\r
+/* #line 318 "avrlex.l" */\r
+illegal();\r
+       YY_BREAK\r
+case 198:\r
+YY_RULE_SETUP\r
+/* #line 320 "avrlex.l" */\r
+ECHO;\r
+       YY_BREAK\r
diff --git a/src/mkutil/tavrasm.118/src/avrparse.cc b/src/mkutil/tavrasm.118/src/avrparse.cc
new file mode 100644 (file)
index 0000000..4328041
--- /dev/null
@@ -0,0 +1,1753 @@
+/* A Bison parser, made from avrparse.y\r
+   by GNU bison 1.35.  */\r
+\r
+#define YYBISON 1  /* Identify Bison output.  */\r
+\r
+# define       STAR    257\r
+# define       DIV     258\r
+# define       MOD     259\r
+# define       LS      260\r
+# define       RS      261\r
+# define       LE      262\r
+# define       GE      263\r
+# define       LESS    264\r
+# define       GREAT   265\r
+# define       EQ      266\r
+# define       NE      267\r
+# define       OR      268\r
+# define       XOR     269\r
+# define       AND     270\r
+# define       OROR    271\r
+# define       ANDAND  272\r
+# define       LPAR    273\r
+# define       RPAR    274\r
+# define       COLON   275\r
+# define       COMMA   276\r
+# define       DOT     277\r
+# define       EQUAL   278\r
+# define       PLUS    279\r
+# define       MINUS   280\r
+# define       WAVE    281\r
+# define       NOT     282\r
+# define       EOL     283\r
+# define       RESTART 284\r
+# define       ENDOFFILE       285\r
+# define       DEF     286\r
+# define       EQU     287\r
+# define       DB      288\r
+# define       DW      289\r
+# define       ORG     290\r
+# define       CSEG    291\r
+# define       DSEG    292\r
+# define       ESEG    293\r
+# define       BYTE    294\r
+# define       SET     295\r
+# define       DEVICE  296\r
+# define       STRING  297\r
+# define       MACRODEF        298\r
+# define       REGISTER        299\r
+# define       REGXYZ  300\r
+# define       SYMBOL  301\r
+# define       INTEGER 302\r
+# define       COUNTER 303\r
+# define       FUNCTION        304\r
+# define       IREGREG 305\r
+# define       IIMMIMM 306\r
+# define       IREGIMM 307\r
+# define       IIMMREG 308\r
+# define       IREG    309\r
+# define       IIMM    310\r
+# define       INOARGS 311\r
+# define       IINDIRC 312\r
+# define       ILPM    313\r
+\r
+/* #line 43 "avrparse.y" */\r
+\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include <string.h>\r
+#include <stdio.h>\r
+#ifdef _MSC_VER /* Nick */\r
+#include <malloc.h>\r
+#else\r
+#include <alloc.h>\r
+#endif\r
+#include "avrasm.hh"\r
+#include "symbol.hh"\r
+#include "semantic.hh"\r
+#include "utils.hh"\r
+\r
+/// Extern ///////////////////////////////////////////////////////////////////\r
+\r
+GLOBALS(extern);\r
+extern char *yytext;\r
+\r
+/// Prototypes ///////////////////////////////////////////////////////////////\r
+\r
+int yylex();\r
+\r
+/// yyerror //////////////////////////////////////////////////////////////////\r
+\r
+void yyerror(char *s)\r
+{\r
+  s = s; // Used for debugging purposes\r
+}\r
+\r
+/// Start of grammar /////////////////////////////////////////////////////////\r
+\r
+\r
+/* #line 77 "avrparse.y" */\r
+#ifndef YYSTYPE\r
+typedef union\r
+{\r
+  regSA                 regid;\r
+  instSA                inst;\r
+  opcodeSA              opcode;\r
+  valueSA               val;\r
+  nameSA                name;\r
+  symbolSA              symb;\r
+  indirectSA            indi;\r
+  functionSA            func;\r
+  stringSA              string;\r
+} yystype;\r
+# define YYSTYPE yystype\r
+# define YYSTYPE_IS_TRIVIAL 1\r
+#endif\r
+#ifndef YYDEBUG\r
+# define YYDEBUG 0\r
+#endif\r
+\r
+\r
+\r
+#define        YYFINAL         223\r
+#define        YYFLAG          -32768\r
+#define        YYNTBASE        60\r
+\r
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\r
+#define YYTRANSLATE(x) ((unsigned)(x) <= 313 ? yytranslate[x] : 89)\r
+\r
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */\r
+static const char yytranslate[] =\r
+{\r
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\r
+       2,     2,     2,     2,     2,     2,     1,     3,     4,     5,\r
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\r
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\r
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\r
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\r
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\r
+      56,    57,    58,    59\r
+};\r
+\r
+#if YYDEBUG\r
+static const short yyprhs[] =\r
+{\r
+       0,     0,     4,     5,     8,    10,    13,    16,    19,    21,\r
+      24,    30,    36,    42,    48,    52,    56,    59,    65,    71,\r
+      73,    77,    81,    85,    89,    93,    97,   101,   105,   108,\r
+     114,   118,   120,   122,   125,   127,   133,   139,   145,   146,\r
+     151,   152,   157,   161,   164,   167,   170,   174,   180,   182,\r
+     186,   190,   194,   198,   202,   206,   210,   214,   218,   222,\r
+     226,   230,   233,   235,   238,   242,   246,   248,   250,   252,\r
+     256,   258,   260,   262,   264,   266,   270,   275,   278,   281,\r
+     284,   286,   288,   292,   296,   300,   302,   306,   310,   312,\r
+     316,   320,   322,   326,   330,   334,   338,   340,   344,   348,\r
+     350,   354,   356,   360,   362,   366,   368,   372,   374,   378\r
+};\r
+static const short yyrhs[] =\r
+{\r
+      62,    30,    62,     0,     0,    62,    63,     0,    63,     0,\r
+      67,    64,     0,    67,    29,     0,    67,    68,     0,    29,\r
+       0,     1,    29,     0,    51,    66,    22,    66,    29,     0,\r
+      53,    66,    22,    75,    29,     0,    54,    75,    22,    66,\r
+      29,     0,    52,    75,    22,    75,    29,     0,    56,    75,\r
+      29,     0,    55,    66,    29,     0,    57,    29,     0,    58,\r
+      66,    22,    71,    29,     0,    58,    71,    22,    66,    29,\r
+       0,    65,     0,    51,     1,    29,     0,    53,     1,    29,\r
+       0,    54,     1,    29,     0,    52,     1,    29,     0,    56,\r
+       1,    29,     0,    55,     1,    29,     0,    57,     1,    29,\r
+       0,    58,     1,    29,     0,    59,    29,     0,    59,    66,\r
+      22,    71,    29,     0,    59,     1,    29,     0,    45,     0,\r
+      47,     0,    47,    21,     0,    61,     0,    32,    47,    24,\r
+      45,    29,     0,    32,    47,    24,    47,    29,     0,    33,\r
+      47,    24,    75,    29,     0,     0,    34,    69,    72,    29,\r
+       0,     0,    35,    70,    74,    29,     0,    36,    75,    29,\r
+       0,    37,    29,     0,    38,    29,     0,    39,    29,     0,\r
+      40,    75,    29,     0,    41,    47,    24,    75,    29,     0,\r
+      44,     0,    42,    47,    29,     0,    32,     1,    29,     0,\r
+      33,     1,    29,     0,    34,     1,    29,     0,    35,     1,\r
+      29,     0,    36,     1,    29,     0,    37,     1,    29,     0,\r
+      38,     1,    29,     0,    39,     1,    29,     0,    40,     1,\r
+      29,     0,    41,     1,    29,     0,    42,     1,    29,     0,\r
+      26,    46,     0,    46,     0,    46,    25,     0,    46,    25,\r
+      75,     0,    72,    22,    73,     0,    73,     0,    43,     0,\r
+      75,     0,    74,    22,    75,     0,    75,     0,    88,     0,\r
+      48,     0,    49,     0,    47,     0,    19,    75,    20,     0,\r
+      50,    19,    75,    20,     0,    26,    77,     0,    27,    77,\r
+       0,    28,    77,     0,    76,     0,    77,     0,    78,     3,\r
+      77,     0,    78,     4,    77,     0,    78,     5,    77,     0,\r
+      78,     0,    79,    25,    78,     0,    79,    26,    78,     0,\r
+      79,     0,    80,     6,    79,     0,    80,     7,    79,     0,\r
+      80,     0,    81,    10,    80,     0,    81,    11,    80,     0,\r
+      81,     8,    80,     0,    81,     9,    80,     0,    81,     0,\r
+      82,    12,    81,     0,    82,    13,    81,     0,    82,     0,\r
+      83,    16,    82,     0,    83,     0,    84,    15,    83,     0,\r
+      84,     0,    85,    14,    84,     0,    85,     0,    86,    18,\r
+      85,     0,    86,     0,    87,    17,    86,     0,    87,     0\r
+};\r
+\r
+#endif\r
+\r
+#if YYDEBUG\r
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */\r
+static const short yyrline[] =\r
+{\r
+       0,   173,   176,   190,   191,   204,   205,   206,   207,   211,\r
+     245,   247,   249,   251,   253,   255,   257,   259,   261,   264,\r
+     268,   269,   270,   271,   272,   273,   274,   275,   288,   290,\r
+     295,   308,   309,   331,   332,   357,   358,   359,   360,   360,\r
+     361,   361,   362,   363,   364,   365,   366,   367,   368,   369,\r
+     373,   374,   375,   376,   377,   378,   379,   380,   381,   382,\r
+     383,   401,   403,   405,   407,   426,   427,   430,   431,   434,\r
+     435,   448,   451,   452,   453,   462,   464,   468,   469,   470,\r
+     471,   474,   475,   477,   479,   483,   484,   486,   490,   491,\r
+     493,   497,   498,   500,   502,   504,   508,   509,   511,   515,\r
+     516,   520,   521,   525,   526,   530,   531,   535,   536,   540\r
+};\r
+#endif\r
+\r
+\r
+#if (YYDEBUG) || defined YYERROR_VERBOSE\r
+\r
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\r
+static const char *const yytname[] =\r
+{\r
+  "$", "error", "$undefined.", "STAR", "DIV", "MOD", "LS", "RS", "LE", "GE", \r
+  "LESS", "GREAT", "EQ", "NE", "OR", "XOR", "AND", "OROR", "ANDAND", \r
+  "LPAR", "RPAR", "COLON", "COMMA", "DOT", "EQUAL", "PLUS", "MINUS", \r
+  "WAVE", "NOT", "EOL", "RESTART", "ENDOFFILE", "DEF", "EQU", "DB", "DW", \r
+  "ORG", "CSEG", "DSEG", "ESEG", "BYTE", "SET", "DEVICE", "STRING", \r
+  "MACRODEF", "REGISTER", "REGXYZ", "SYMBOL", "INTEGER", "COUNTER", \r
+  "FUNCTION", "IREGREG", "IIMMIMM", "IREGIMM", "IIMMREG", "IREG", "IIMM", \r
+  "INOARGS", "IINDIRC", "ILPM", "program", "e", "programlist", \r
+  "programelement", "instruction", "lpminst", "registername", "label", \r
+  "directive", "@1", "@2", "indirectaddr", "byteexprlist", "byteelement", \r
+  "wordexprlist", "expr", "primary_expr", "unary_expr", "mult_expr", \r
+  "additive_expr", "shift_expr", "relational_expr", "equality_expr", \r
+  "AND_expression", "exclusive_OR", "inclusive_OR", "logical_AND", \r
+  "logical_OR", "composite_expr", 0\r
+};\r
+#endif\r
+\r
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */\r
+static const short yyr1[] =\r
+{\r
+       0,    60,    61,    62,    62,    63,    63,    63,    63,    63,\r
+      64,    64,    64,    64,    64,    64,    64,    64,    64,    64,\r
+      64,    64,    64,    64,    64,    64,    64,    64,    65,    65,\r
+      65,    66,    66,    67,    67,    68,    68,    68,    69,    68,\r
+      70,    68,    68,    68,    68,    68,    68,    68,    68,    68,\r
+      68,    68,    68,    68,    68,    68,    68,    68,    68,    68,\r
+      68,    71,    71,    71,    71,    72,    72,    73,    73,    74,\r
+      74,    75,    76,    76,    76,    76,    76,    77,    77,    77,\r
+      77,    78,    78,    78,    78,    79,    79,    79,    80,    80,\r
+      80,    81,    81,    81,    81,    81,    82,    82,    82,    83,\r
+      83,    84,    84,    85,    85,    86,    86,    87,    87,    88\r
+};\r
+\r
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */\r
+static const short yyr2[] =\r
+{\r
+       0,     3,     0,     2,     1,     2,     2,     2,     1,     2,\r
+       5,     5,     5,     5,     3,     3,     2,     5,     5,     1,\r
+       3,     3,     3,     3,     3,     3,     3,     3,     2,     5,\r
+       3,     1,     1,     2,     1,     5,     5,     5,     0,     4,\r
+       0,     4,     3,     2,     2,     2,     3,     5,     1,     3,\r
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,\r
+       3,     2,     1,     2,     3,     3,     1,     1,     1,     3,\r
+       1,     1,     1,     1,     1,     3,     4,     2,     2,     2,\r
+       1,     1,     3,     3,     3,     1,     3,     3,     1,     3,\r
+       3,     1,     3,     3,     3,     3,     1,     3,     3,     1,\r
+       3,     1,     3,     1,     3,     1,     3,     1,     3,     1\r
+};\r
+\r
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\r
+   doesn't specify something else to do.  Zero means the default is an\r
+   error. */\r
+static const short yydefact[] =\r
+{\r
+       0,     0,     8,     0,    34,     0,     4,     0,     9,    33,\r
+       0,     3,     6,     0,     0,     0,     0,     0,     0,     0,\r
+       0,     0,     0,     0,    48,     0,     0,     0,     0,     0,\r
+       0,     0,     0,     0,     5,    19,     7,     0,     0,     0,\r
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\r
+       0,    74,    72,    73,     0,     0,    80,    81,    85,    88,\r
+      91,    96,    99,   101,   103,   105,   107,   109,    71,     0,\r
+      43,     0,    44,     0,    45,     0,     0,     0,     0,     0,\r
+       0,     0,    31,    32,     0,     0,     0,     0,     0,     0,\r
+       0,     0,     0,     0,     0,     0,    16,     0,     0,    62,\r
+       0,     0,     0,    28,     0,    50,     0,    51,     0,    52,\r
+      67,     0,    66,    68,    53,     0,    70,    54,     0,    77,\r
+      78,    79,     0,    42,     0,     0,     0,     0,     0,     0,\r
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\r
+       0,     0,    55,    56,    57,    58,    46,    59,     0,    60,\r
+      49,    20,     0,    23,     0,    21,     0,    22,     0,    25,\r
+      15,    24,    14,    26,    27,    61,    63,     0,     0,    30,\r
+       0,     0,     0,     0,     0,    39,     0,    41,    75,     0,\r
+      82,    83,    84,    86,    87,    89,    90,    94,    95,    92,\r
+      93,    97,    98,   100,   102,   104,   106,   108,     0,     0,\r
+       0,     0,     0,    64,     0,     0,     0,    35,    36,    37,\r
+      65,    69,    76,    47,    10,    13,    11,    12,    17,    18,\r
+      29,     0,     0,     0\r
+};\r
+\r
+static const short yydefgoto[] =\r
+{\r
+     221,     4,     5,     6,    34,    35,    84,     7,    36,    43,\r
+      45,   101,   111,   112,   115,   113,    56,    57,    58,    59,\r
+      60,    61,    62,    63,    64,    65,    66,    67,    68\r
+};\r
+\r
+static const short yypact[] =\r
+{\r
+     170,   -19,-32768,   -16,-32768,   128,-32768,   289,-32768,-32768,\r
+     170,-32768,-32768,    32,    33,    59,    96,   212,    34,    75,\r
+      88,   217,    37,    63,-32768,    43,   229,    56,   262,    73,\r
+     267,    98,    36,    30,-32768,-32768,-32768,    14,    -8,    12,\r
+      13,    21,    66,   256,    71,   223,    87,   223,   223,   223,\r
+     223,-32768,-32768,-32768,   100,    92,-32768,-32768,   130,   115,\r
+     141,    15,   138,   109,   113,   116,   118,   121,-32768,   125,\r
+  -32768,   147,-32768,   148,-32768,   149,   159,   160,   166,   162,\r
+     163,   164,-32768,-32768,   172,   167,   173,   168,   176,   171,\r
+     179,   186,   187,   190,   191,   203,-32768,   204,   188,   210,\r
+     215,   219,   218,-32768,   224,-32768,    -6,-32768,   223,-32768,\r
+  -32768,   -10,-32768,-32768,-32768,    -2,-32768,-32768,   232,-32768,\r
+  -32768,-32768,   223,-32768,   223,   223,   223,   223,   223,   223,\r
+     223,   223,   223,   223,   223,   223,   223,   223,   223,   223,\r
+     223,   223,-32768,-32768,-32768,-32768,-32768,-32768,   223,-32768,\r
+  -32768,-32768,    51,-32768,   223,-32768,   223,-32768,    51,-32768,\r
+  -32768,-32768,-32768,-32768,-32768,-32768,   223,   -24,    51,-32768,\r
+     -24,   225,   240,   245,   256,-32768,   223,-32768,-32768,   233,\r
+  -32768,-32768,-32768,   130,   130,   115,   115,   141,   141,   141,\r
+     141,    15,    15,   138,   109,   113,   116,   118,   251,   258,\r
+     263,   268,   269,-32768,   271,   272,   273,-32768,-32768,-32768,\r
+  -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,\r
+  -32768,   285,   291,-32768\r
+};\r
+\r
+static const short yypgoto[] =\r
+{\r
+  -32768,-32768,   248,     3,-32768,-32768,   -26,-32768,-32768,-32768,\r
+  -32768,  -138,-32768,   122,-32768,   -17,-32768,   -32,    25,    26,\r
+     -20,    38,   182,   169,   174,   180,   193,-32768,-32768\r
+};\r
+\r
+\r
+#define        YYLAST          348\r
+\r
+\r
+static const short yytable[] =\r
+{\r
+      55,    88,    98,    92,    76,     9,   100,   104,    11,    86,\r
+       8,    90,   174,    94,    -1,     1,   119,   120,   121,   175,\r
+     176,   105,    99,   131,   132,   133,   134,   177,   116,   204,\r
+     118,   102,   206,    38,    40,    69,   106,    97,    77,   171,\r
+      11,   172,   107,     2,    81,   108,    -2,    -2,    -2,    -2,\r
+      -2,    -2,    -2,    -2,    -2,    -2,    -2,    87,    -2,   103,\r
+      42,     3,    98,    70,    79,    -2,    -2,    -2,    -2,    -2,\r
+      -2,    -2,    -2,    -2,    91,    82,    71,    83,   -38,    39,\r
+      41,    82,    99,    83,    78,   -38,   -38,   -38,    82,    73,\r
+      83,   173,   180,   181,   182,   109,    82,    44,    83,    95,\r
+     114,    82,   -38,    83,    72,   179,   -38,   -38,   -38,   -38,\r
+      80,   187,   188,   189,   190,   -40,   117,    74,    82,   122,\r
+      83,   123,   -40,   -40,   -40,   137,   199,    96,   138,     1,\r
+     139,   198,   202,   124,   125,   126,   140,   200,   141,   201,\r
+     127,   128,   205,   -40,   -40,   -40,   -40,   129,   130,   203,\r
+     135,   136,   183,   184,   142,   185,   186,     2,    10,   211,\r
+      -2,    -2,    -2,    -2,    -2,    -2,    -2,    -2,    -2,    -2,\r
+      -2,     1,    -2,   191,   192,     3,   143,   144,   145,    -2,\r
+      -2,    -2,    -2,    -2,    -2,    -2,    -2,    -2,   146,   147,\r
+     148,   149,   150,   151,   152,   154,   153,   155,   156,     2,\r
+     157,   158,    -2,    -2,    -2,    -2,    -2,    -2,    -2,    -2,\r
+      -2,    -2,    -2,    46,    -2,   159,   160,     3,    75,   161,\r
+     162,    -2,    -2,    -2,    -2,    -2,    -2,    -2,    -2,    -2,\r
+      85,    47,   163,   164,   165,   166,    47,   167,    48,    49,\r
+      50,   168,    47,    48,    49,    50,   170,   169,    47,    48,\r
+      49,    50,   178,   212,   207,    48,    49,    50,    37,    51,\r
+      52,    53,    54,    89,    51,    52,    53,    54,    93,   208,\r
+      51,    52,    53,    54,   209,    47,    51,    52,    53,    54,\r
+     213,    47,    48,    49,    50,   222,    47,   214,    48,    49,\r
+      50,   223,   215,    48,    49,    50,   210,   216,   217,   110,\r
+     218,   219,   220,    51,    52,    53,    54,   194,     0,    51,\r
+      52,    53,    54,   195,    51,    52,    53,    54,    12,   193,\r
+     196,    13,    14,    15,    16,    17,    18,    19,    20,    21,\r
+      22,    23,     0,    24,   197,     0,     0,     0,     0,     0,\r
+      25,    26,    27,    28,    29,    30,    31,    32,    33\r
+};\r
+\r
+static const short yycheck[] =\r
+{\r
+      17,    27,    26,    29,    21,    21,    32,    33,     5,    26,\r
+      29,    28,    22,    30,     0,     1,    48,    49,    50,    29,\r
+      22,    29,    46,     8,     9,    10,    11,    29,    45,   167,\r
+      47,     1,   170,     1,     1,     1,    24,     1,     1,    45,\r
+      37,    47,    29,    29,     1,    24,    32,    33,    34,    35,\r
+      36,    37,    38,    39,    40,    41,    42,     1,    44,    29,\r
+       1,    47,    26,    29,     1,    51,    52,    53,    54,    55,\r
+      56,    57,    58,    59,     1,    45,     1,    47,    19,    47,\r
+      47,    45,    46,    47,    47,    26,    27,    28,    45,     1,\r
+      47,   108,   124,   125,   126,    29,    45,     1,    47,     1,\r
+      29,    45,    43,    47,    29,   122,    47,    48,    49,    50,\r
+      47,   131,   132,   133,   134,    19,    29,    29,    45,    19,\r
+      47,    29,    26,    27,    28,    16,   152,    29,    15,     1,\r
+      14,   148,   158,     3,     4,     5,    18,   154,    17,   156,\r
+      25,    26,   168,    47,    48,    49,    50,     6,     7,   166,\r
+      12,    13,   127,   128,    29,   129,   130,    29,    30,   176,\r
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\r
+      42,     1,    44,   135,   136,    47,    29,    29,    29,    51,\r
+      52,    53,    54,    55,    56,    57,    58,    59,    29,    29,\r
+      24,    29,    29,    29,    22,    22,    29,    29,    22,    29,\r
+      29,    22,    32,    33,    34,    35,    36,    37,    38,    39,\r
+      40,    41,    42,     1,    44,    29,    29,    47,     1,    29,\r
+      29,    51,    52,    53,    54,    55,    56,    57,    58,    59,\r
+       1,    19,    29,    29,    46,    25,    19,    22,    26,    27,\r
+      28,    22,    19,    26,    27,    28,    22,    29,    19,    26,\r
+      27,    28,    20,    20,    29,    26,    27,    28,    10,    47,\r
+      48,    49,    50,     1,    47,    48,    49,    50,     1,    29,\r
+      47,    48,    49,    50,    29,    19,    47,    48,    49,    50,\r
+      29,    19,    26,    27,    28,     0,    19,    29,    26,    27,\r
+      28,     0,    29,    26,    27,    28,   174,    29,    29,    43,\r
+      29,    29,    29,    47,    48,    49,    50,   138,    -1,    47,\r
+      48,    49,    50,   139,    47,    48,    49,    50,    29,   137,\r
+     140,    32,    33,    34,    35,    36,    37,    38,    39,    40,\r
+      41,    42,    -1,    44,   141,    -1,    -1,    -1,    -1,    -1,\r
+      51,    52,    53,    54,    55,    56,    57,    58,    59\r
+};\r
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */\r
+/* #line 3 "/usr/share/bison/bison.simple" */\r
+\r
+/* Skeleton output parser for bison,\r
+\r
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software\r
+   Foundation, Inc.\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2, or (at your option)\r
+   any later version.\r
+\r
+   This program is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 59 Temple Place - Suite 330,\r
+   Boston, MA 02111-1307, USA.  */\r
+\r
+/* As a special exception, when this file is copied by Bison into a\r
+   Bison output file, you may use that output file without restriction.\r
+   This special exception was added by the Free Software Foundation\r
+   in version 1.24 of Bison.  */\r
+\r
+/* This is the parser code that is written into each bison parser when\r
+   the %semantic_parser declaration is not specified in the grammar.\r
+   It was written by Richard Stallman by simplifying the hairy parser\r
+   used when %semantic_parser is specified.  */\r
+\r
+/* All symbols defined below should begin with yy or YY, to avoid\r
+   infringing on user name space.  This should be done even for local\r
+   variables, as they might otherwise be expanded by user macros.\r
+   There are some unavoidable exceptions within include files to\r
+   define necessary library symbols; they are noted "INFRINGES ON\r
+   USER NAME SPACE" below.  */\r
+\r
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)\r
+\r
+/* The parser invokes alloca or malloc; define the necessary symbols.  */\r
+\r
+# if YYSTACK_USE_ALLOCA\r
+#  define YYSTACK_ALLOC alloca\r
+# else\r
+#  ifndef YYSTACK_USE_ALLOCA\r
+#   if defined (alloca) || defined (_ALLOCA_H)\r
+#    define YYSTACK_ALLOC alloca\r
+#   else\r
+#    ifdef __GNUC__\r
+#     define YYSTACK_ALLOC __builtin_alloca\r
+#    endif\r
+#   endif\r
+#  endif\r
+# endif\r
+\r
+# ifdef YYSTACK_ALLOC\r
+   /* Pacify GCC's `empty if-body' warning. */\r
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)\r
+# else\r
+#  if defined (__STDC__) || defined (__cplusplus)\r
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */\r
+#   define YYSIZE_T size_t\r
+#  endif\r
+#if 1 /* Nick */\r
+void *yy_flex_alloc( unsigned long size );\r
+void yy_flex_free( void *ptr );\r
+#define YYSTACK_ALLOC yy_flex_alloc\r
+#define YYSTACK_FREE yy_flex_free\r
+#else\r
+#  define YYSTACK_ALLOC malloc\r
+#  define YYSTACK_FREE free\r
+#endif\r
+# endif\r
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */\r
+\r
+\r
+#if (! defined (yyoverflow) \\r
+     && (! defined (__cplusplus) \\r
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))\r
+\r
+/* A type that is properly aligned for any stack member.  */\r
+union yyalloc\r
+{\r
+  short yyss;\r
+  YYSTYPE yyvs;\r
+# if YYLSP_NEEDED\r
+  YYLTYPE yyls;\r
+# endif\r
+};\r
+\r
+/* The size of the maximum gap between one aligned stack and the next.  */\r
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)\r
+\r
+/* The size of an array large to enough to hold all stacks, each with\r
+   N elements.  */\r
+# if YYLSP_NEEDED\r
+#  define YYSTACK_BYTES(N) \\r
+     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \\r
+      + 2 * YYSTACK_GAP_MAX)\r
+# else\r
+#  define YYSTACK_BYTES(N) \\r
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \\r
+      + YYSTACK_GAP_MAX)\r
+# endif\r
+\r
+/* Copy COUNT objects from FROM to TO.  The source and destination do\r
+   not overlap.  */\r
+# ifndef YYCOPY\r
+#  if 1 < __GNUC__\r
+#   define YYCOPY(To, From, Count) \\r
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))\r
+#  else\r
+#   define YYCOPY(To, From, Count)             \\r
+      do                                       \\r
+       {                                       \\r
+         register YYSIZE_T yyi;                \\r
+         for (yyi = 0; yyi < (Count); yyi++)   \\r
+           (To)[yyi] = (From)[yyi];            \\r
+       }                                       \\r
+      while (0)\r
+#  endif\r
+# endif\r
+\r
+/* Relocate STACK from its old location to the new one.  The\r
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of\r
+   elements in the stack, and YYPTR gives the new location of the\r
+   stack.  Advance YYPTR to a properly aligned location for the next\r
+   stack.  */\r
+# define YYSTACK_RELOCATE(Stack)                                       \\r
+    do                                                                 \\r
+      {                                                                        \\r
+       YYSIZE_T yynewbytes;                                            \\r
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \\r
+       Stack = &yyptr->Stack;                                          \\r
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \\r
+       yyptr += yynewbytes / sizeof (*yyptr);                          \\r
+      }                                                                        \\r
+    while (0)\r
+\r
+#endif\r
+\r
+\r
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)\r
+# define YYSIZE_T __SIZE_TYPE__\r
+#endif\r
+#if ! defined (YYSIZE_T) && defined (size_t)\r
+# define YYSIZE_T size_t\r
+#endif\r
+#if ! defined (YYSIZE_T)\r
+# if defined (__STDC__) || defined (__cplusplus)\r
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */\r
+#  define YYSIZE_T size_t\r
+# endif\r
+#endif\r
+#if ! defined (YYSIZE_T)\r
+# define YYSIZE_T unsigned int\r
+#endif\r
+\r
+#define yyerrok                (yyerrstatus = 0)\r
+#define yyclearin      (yychar = YYEMPTY)\r
+#define YYEMPTY                -2\r
+#define YYEOF          0\r
+#define YYACCEPT       goto yyacceptlab\r
+#define YYABORT        goto yyabortlab\r
+#define YYERROR                goto yyerrlab1\r
+/* Like YYERROR except do call yyerror.  This remains here temporarily\r
+   to ease the transition to the new meaning of YYERROR, for GCC.\r
+   Once GCC version 2 has supplanted version 1, this can go.  */\r
+#define YYFAIL         goto yyerrlab\r
+#define YYRECOVERING()  (!!yyerrstatus)\r
+#define YYBACKUP(Token, Value)                                 \\r
+do                                                             \\r
+  if (yychar == YYEMPTY && yylen == 1)                         \\r
+    {                                                          \\r
+      yychar = (Token);                                                \\r
+      yylval = (Value);                                                \\r
+      yychar1 = YYTRANSLATE (yychar);                          \\r
+      YYPOPSTACK;                                              \\r
+      goto yybackup;                                           \\r
+    }                                                          \\r
+  else                                                         \\r
+    {                                                          \\r
+      yyerror ("syntax error: cannot back up");                        \\r
+      YYERROR;                                                 \\r
+    }                                                          \\r
+while (0)\r
+\r
+#define YYTERROR       1\r
+#define YYERRCODE      256\r
+\r
+\r
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions\r
+   are run).\r
+\r
+   When YYLLOC_DEFAULT is run, CURRENT is set the location of the\r
+   first token.  By default, to implement support for ranges, extend\r
+   its range to the last symbol.  */\r
+\r
+#ifndef YYLLOC_DEFAULT\r
+# define YYLLOC_DEFAULT(Current, Rhs, N)               \\r
+   Current.last_line   = Rhs[N].last_line;     \\r
+   Current.last_column = Rhs[N].last_column;\r
+#endif\r
+\r
+\r
+/* YYLEX -- calling `yylex' with the right arguments.  */\r
+\r
+#if YYPURE\r
+# if YYLSP_NEEDED\r
+#  ifdef YYLEX_PARAM\r
+#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)\r
+#  else\r
+#   define YYLEX               yylex (&yylval, &yylloc)\r
+#  endif\r
+# else /* !YYLSP_NEEDED */\r
+#  ifdef YYLEX_PARAM\r
+#   define YYLEX               yylex (&yylval, YYLEX_PARAM)\r
+#  else\r
+#   define YYLEX               yylex (&yylval)\r
+#  endif\r
+# endif /* !YYLSP_NEEDED */\r
+#else /* !YYPURE */\r
+# define YYLEX                 yylex ()\r
+#endif /* !YYPURE */\r
+\r
+\r
+/* Enable debugging if requested.  */\r
+#if YYDEBUG\r
+\r
+# ifndef YYFPRINTF\r
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */\r
+#  define YYFPRINTF fprintf\r
+# endif\r
+\r
+# define YYDPRINTF(Args)                       \\r
+do {                                           \\r
+  if (yydebug)                                 \\r
+    YYFPRINTF Args;                            \\r
+} while (0)\r
+/* Nonzero means print parse trace.  It is left uninitialized so that\r
+   multiple parsers can coexist.  */\r
+int yydebug;\r
+#else /* !YYDEBUG */\r
+# define YYDPRINTF(Args)\r
+#endif /* !YYDEBUG */\r
+\r
+/* YYINITDEPTH -- initial size of the parser's stacks.  */\r
+#ifndef        YYINITDEPTH\r
+# define YYINITDEPTH 200\r
+#endif\r
+\r
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only\r
+   if the built-in stack extension method is used).\r
+\r
+   Do not make this value too large; the results are undefined if\r
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)\r
+   evaluated with infinite-precision integer arithmetic.  */\r
+\r
+#if YYMAXDEPTH == 0\r
+# undef YYMAXDEPTH\r
+#endif\r
+\r
+#ifndef YYMAXDEPTH\r
+# define YYMAXDEPTH 10000\r
+#endif\r
+\f\r
+#ifdef YYERROR_VERBOSE\r
+\r
+# ifndef yystrlen\r
+#  if defined (__GLIBC__) && defined (_STRING_H)\r
+#   define yystrlen strlen\r
+#  else\r
+/* Return the length of YYSTR.  */\r
+static YYSIZE_T\r
+#   if defined (__STDC__) || defined (__cplusplus)\r
+yystrlen (const char *yystr)\r
+#   else\r
+yystrlen (yystr)\r
+     const char *yystr;\r
+#   endif\r
+{\r
+  register const char *yys = yystr;\r
+\r
+  while (*yys++ != '\0')\r
+    continue;\r
+\r
+  return yys - yystr - 1;\r
+}\r
+#  endif\r
+# endif\r
+\r
+# ifndef yystpcpy\r
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)\r
+#   define yystpcpy stpcpy\r
+#  else\r
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in\r
+   YYDEST.  */\r
+static char *\r
+#   if defined (__STDC__) || defined (__cplusplus)\r
+yystpcpy (char *yydest, const char *yysrc)\r
+#   else\r
+yystpcpy (yydest, yysrc)\r
+     char *yydest;\r
+     const char *yysrc;\r
+#   endif\r
+{\r
+  register char *yyd = yydest;\r
+  register const char *yys = yysrc;\r
+\r
+  while ((*yyd++ = *yys++) != '\0')\r
+    continue;\r
+\r
+  return yyd - 1;\r
+}\r
+#  endif\r
+# endif\r
+#endif\r
+\f\r
+/* #line 315 "/usr/share/bison/bison.simple" */\r
+\r
+\r
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed\r
+   into yyparse.  The argument should have type void *.\r
+   It should actually point to an object.\r
+   Grammar actions can access the variable by casting it\r
+   to the proper pointer type.  */\r
+\r
+#ifdef YYPARSE_PARAM\r
+# if defined (__STDC__) || defined (__cplusplus)\r
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM\r
+#  define YYPARSE_PARAM_DECL\r
+# else\r
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM\r
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;\r
+# endif\r
+#else /* !YYPARSE_PARAM */\r
+# define YYPARSE_PARAM_ARG\r
+# define YYPARSE_PARAM_DECL\r
+#endif /* !YYPARSE_PARAM */\r
+\r
+/* Prevent warning if -Wstrict-prototypes.  */\r
+#ifdef __GNUC__\r
+# ifdef YYPARSE_PARAM\r
+int yyparse (void *);\r
+# else\r
+int yyparse (void);\r
+# endif\r
+#endif\r
+\r
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,\r
+   variables are global, or local to YYPARSE.  */\r
+\r
+#define YY_DECL_NON_LSP_VARIABLES                      \\r
+/* The lookahead symbol.  */                           \\r
+int yychar;                                            \\r
+                                                       \\r
+/* The semantic value of the lookahead symbol. */      \\r
+YYSTYPE yylval;                                                \\r
+                                                       \\r
+/* Number of parse errors so far.  */                  \\r
+int yynerrs;\r
+\r
+#if YYLSP_NEEDED\r
+# define YY_DECL_VARIABLES                     \\r
+YY_DECL_NON_LSP_VARIABLES                      \\r
+                                               \\r
+/* Location data for the lookahead symbol.  */ \\r
+YYLTYPE yylloc;\r
+#else\r
+# define YY_DECL_VARIABLES                     \\r
+YY_DECL_NON_LSP_VARIABLES\r
+#endif\r
+\r
+\r
+/* If nonreentrant, generate the variables here. */\r
+\r
+#if !YYPURE\r
+YY_DECL_VARIABLES\r
+#endif  /* !YYPURE */\r
+\r
+int\r
+yyparse (YYPARSE_PARAM_ARG)\r
+     YYPARSE_PARAM_DECL\r
+{\r
+  /* If reentrant, generate the variables here. */\r
+#if YYPURE\r
+  YY_DECL_VARIABLES\r
+#endif  /* !YYPURE */\r
+\r
+  register int yystate;\r
+  register int yyn;\r
+  int yyresult;\r
+  /* Number of tokens to shift before error messages enabled.  */\r
+  int yyerrstatus;\r
+  /* Lookahead token as an internal (translated) token number.  */\r
+  int yychar1 = 0;\r
+\r
+  /* Three stacks and their tools:\r
+     `yyss': related to states,\r
+     `yyvs': related to semantic values,\r
+     `yyls': related to locations.\r
+\r
+     Refer to the stacks thru separate pointers, to allow yyoverflow\r
+     to reallocate them elsewhere.  */\r
+\r
+  /* The state stack. */\r
+  short        yyssa[YYINITDEPTH];\r
+  short *yyss = yyssa;\r
+  register short *yyssp;\r
+\r
+  /* The semantic value stack.  */\r
+  YYSTYPE yyvsa[YYINITDEPTH];\r
+  YYSTYPE *yyvs = yyvsa;\r
+  register YYSTYPE *yyvsp;\r
+\r
+#if YYLSP_NEEDED\r
+  /* The location stack.  */\r
+  YYLTYPE yylsa[YYINITDEPTH];\r
+  YYLTYPE *yyls = yylsa;\r
+  YYLTYPE *yylsp;\r
+#endif\r
+\r
+#if YYLSP_NEEDED\r
+# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)\r
+#else\r
+# define YYPOPSTACK   (yyvsp--, yyssp--)\r
+#endif\r
+\r
+  YYSIZE_T yystacksize = YYINITDEPTH;\r
+\r
+\r
+  /* The variables used to return semantic value and location from the\r
+     action routines.  */\r
+  YYSTYPE yyval;\r
+#if YYLSP_NEEDED\r
+  YYLTYPE yyloc;\r
+#endif\r
+\r
+  /* When reducing, the number of symbols on the RHS of the reduced\r
+     rule. */\r
+  int yylen;\r
+\r
+  YYDPRINTF ((stderr, "Starting parse\n"));\r
+\r
+  yystate = 0;\r
+  yyerrstatus = 0;\r
+  yynerrs = 0;\r
+  yychar = YYEMPTY;            /* Cause a token to be read.  */\r
+\r
+  /* Initialize stack pointers.\r
+     Waste one element of value and location stack\r
+     so that they stay on the same level as the state stack.\r
+     The wasted elements are never initialized.  */\r
+\r
+  yyssp = yyss;\r
+  yyvsp = yyvs;\r
+#if YYLSP_NEEDED\r
+  yylsp = yyls;\r
+#endif\r
+  goto yysetstate;\r
+\r
+/*------------------------------------------------------------.\r
+| yynewstate -- Push a new state, which is found in yystate.  |\r
+`------------------------------------------------------------*/\r
+ yynewstate:\r
+  /* In all cases, when you get here, the value and location stacks\r
+     have just been pushed. so pushing a state here evens the stacks.\r
+     */\r
+  yyssp++;\r
+\r
+ yysetstate:\r
+  *yyssp = yystate;\r
+\r
+  if (yyssp >= yyss + yystacksize - 1)\r
+    {\r
+      /* Get the current used size of the three stacks, in elements.  */\r
+      YYSIZE_T yysize = yyssp - yyss + 1;\r
+\r
+#ifdef yyoverflow\r
+      {\r
+       /* Give user a chance to reallocate the stack. Use copies of\r
+          these so that the &'s don't force the real ones into\r
+          memory.  */\r
+       YYSTYPE *yyvs1 = yyvs;\r
+       short *yyss1 = yyss;\r
+\r
+       /* Each stack pointer address is followed by the size of the\r
+          data in use in that stack, in bytes.  */\r
+# if YYLSP_NEEDED\r
+       YYLTYPE *yyls1 = yyls;\r
+       /* This used to be a conditional around just the two extra args,\r
+          but that might be undefined if yyoverflow is a macro.  */\r
+       yyoverflow ("parser stack overflow",\r
+                   &yyss1, yysize * sizeof (*yyssp),\r
+                   &yyvs1, yysize * sizeof (*yyvsp),\r
+                   &yyls1, yysize * sizeof (*yylsp),\r
+                   &yystacksize);\r
+       yyls = yyls1;\r
+# else\r
+       yyoverflow ("parser stack overflow",\r
+                   &yyss1, yysize * sizeof (*yyssp),\r
+                   &yyvs1, yysize * sizeof (*yyvsp),\r
+                   &yystacksize);\r
+# endif\r
+       yyss = yyss1;\r
+       yyvs = yyvs1;\r
+      }\r
+#else /* no yyoverflow */\r
+# ifndef YYSTACK_RELOCATE\r
+      goto yyoverflowlab;\r
+# else\r
+      /* Extend the stack our own way.  */\r
+      if (yystacksize >= YYMAXDEPTH)\r
+       goto yyoverflowlab;\r
+      yystacksize *= 2;\r
+      if (yystacksize > YYMAXDEPTH)\r
+       yystacksize = YYMAXDEPTH;\r
+\r
+      {\r
+       short *yyss1 = yyss;\r
+       union yyalloc *yyptr =\r
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));\r
+       if (! yyptr)\r
+         goto yyoverflowlab;\r
+       YYSTACK_RELOCATE (yyss);\r
+       YYSTACK_RELOCATE (yyvs);\r
+# if YYLSP_NEEDED\r
+       YYSTACK_RELOCATE (yyls);\r
+# endif\r
+# undef YYSTACK_RELOCATE\r
+       if (yyss1 != yyssa)\r
+         YYSTACK_FREE (yyss1);\r
+      }\r
+# endif\r
+#endif /* no yyoverflow */\r
+\r
+      yyssp = yyss + yysize - 1;\r
+      yyvsp = yyvs + yysize - 1;\r
+#if YYLSP_NEEDED\r
+      yylsp = yyls + yysize - 1;\r
+#endif\r
+\r
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",\r
+                 (unsigned long int) yystacksize));\r
+\r
+      if (yyssp >= yyss + yystacksize - 1)\r
+       YYABORT;\r
+    }\r
+\r
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));\r
+\r
+  goto yybackup;\r
+\r
+\r
+/*-----------.\r
+| yybackup.  |\r
+`-----------*/\r
+yybackup:\r
+\r
+/* Do appropriate processing given the current state.  */\r
+/* Read a lookahead token if we need one and don't already have one.  */\r
+/* yyresume: */\r
+\r
+  /* First try to decide what to do without reference to lookahead token.  */\r
+\r
+  yyn = yypact[yystate];\r
+  if (yyn == YYFLAG)\r
+    goto yydefault;\r
+\r
+  /* Not known => get a lookahead token if don't already have one.  */\r
+\r
+  /* yychar is either YYEMPTY or YYEOF\r
+     or a valid token in external form.  */\r
+\r
+  if (yychar == YYEMPTY)\r
+    {\r
+      YYDPRINTF ((stderr, "Reading a token: "));\r
+      yychar = YYLEX;\r
+    }\r
+\r
+  /* Convert token to internal form (in yychar1) for indexing tables with */\r
+\r
+  if (yychar <= 0)             /* This means end of input. */\r
+    {\r
+      yychar1 = 0;\r
+      yychar = YYEOF;          /* Don't call YYLEX any more */\r
+\r
+      YYDPRINTF ((stderr, "Now at end of input.\n"));\r
+    }\r
+  else\r
+    {\r
+      yychar1 = YYTRANSLATE (yychar);\r
+\r
+#if YYDEBUG\r
+     /* We have to keep this `#if YYDEBUG', since we use variables\r
+       which are defined only if `YYDEBUG' is set.  */\r
+      if (yydebug)\r
+       {\r
+         YYFPRINTF (stderr, "Next token is %d (%s",\r
+                    yychar, yytname[yychar1]);\r
+         /* Give the individual parser a way to print the precise\r
+            meaning of a token, for further debugging info.  */\r
+# ifdef YYPRINT\r
+         YYPRINT (stderr, yychar, yylval);\r
+# endif\r
+         YYFPRINTF (stderr, ")\n");\r
+       }\r
+#endif\r
+    }\r
+\r
+  yyn += yychar1;\r
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)\r
+    goto yydefault;\r
+\r
+  yyn = yytable[yyn];\r
+\r
+  /* yyn is what to do for this token type in this state.\r
+     Negative => reduce, -yyn is rule number.\r
+     Positive => shift, yyn is new state.\r
+       New state is final state => don't bother to shift,\r
+       just return success.\r
+     0, or most negative number => error.  */\r
+\r
+  if (yyn < 0)\r
+    {\r
+      if (yyn == YYFLAG)\r
+       goto yyerrlab;\r
+      yyn = -yyn;\r
+      goto yyreduce;\r
+    }\r
+  else if (yyn == 0)\r
+    goto yyerrlab;\r
+\r
+  if (yyn == YYFINAL)\r
+    YYACCEPT;\r
+\r
+  /* Shift the lookahead token.  */\r
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",\r
+             yychar, yytname[yychar1]));\r
+\r
+  /* Discard the token being shifted unless it is eof.  */\r
+  if (yychar != YYEOF)\r
+    yychar = YYEMPTY;\r
+\r
+  *++yyvsp = yylval;\r
+#if YYLSP_NEEDED\r
+  *++yylsp = yylloc;\r
+#endif\r
+\r
+  /* Count tokens shifted since error; after three, turn off error\r
+     status.  */\r
+  if (yyerrstatus)\r
+    yyerrstatus--;\r
+\r
+  yystate = yyn;\r
+  goto yynewstate;\r
+\r
+\r
+/*-----------------------------------------------------------.\r
+| yydefault -- do the default action for the current state.  |\r
+`-----------------------------------------------------------*/\r
+yydefault:\r
+  yyn = yydefact[yystate];\r
+  if (yyn == 0)\r
+    goto yyerrlab;\r
+  goto yyreduce;\r
+\r
+\r
+/*-----------------------------.\r
+| yyreduce -- Do a reduction.  |\r
+`-----------------------------*/\r
+yyreduce:\r
+  /* yyn is the number of a rule to reduce with.  */\r
+  yylen = yyr2[yyn];\r
+\r
+  /* If YYLEN is nonzero, implement the default value of the action:\r
+     `$$ = $1'.\r
+\r
+     Otherwise, the following line sets YYVAL to the semantic value of\r
+     the lookahead token.  This behavior is undocumented and Bison\r
+     users should not rely upon it.  Assigning to YYVAL\r
+     unconditionally makes the parser a bit smaller, and it avoids a\r
+     GCC warning that YYVAL may be used uninitialized.  */\r
+  yyval = yyvsp[1-yylen];\r
+\r
+#if YYLSP_NEEDED\r
+  /* Similarly for the default location.  Let the user run additional\r
+     commands if for instance locations are ranges.  */\r
+  yyloc = yylsp[1-yylen];\r
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);\r
+#endif\r
+\r
+#if YYDEBUG\r
+  /* We have to keep this `#if YYDEBUG', since we use variables which\r
+     are defined only if `YYDEBUG' is set.  */\r
+  if (yydebug)\r
+    {\r
+      int yyi;\r
+\r
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",\r
+                yyn, yyrline[yyn]);\r
+\r
+      /* Print the symbols being reduced, and their result.  */\r
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)\r
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);\r
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);\r
+    }\r
+#endif\r
+\r
+  switch (yyn) {\r
+\r
+case 5:\r
+/* #line 204 "avrparse.y" */\r
+{ tolog(); ;\r
+    break;}\r
+case 6:\r
+/* #line 205 "avrparse.y" */\r
+{ tolog(); ;\r
+    break;}\r
+case 7:\r
+/* #line 206 "avrparse.y" */\r
+{ tolog(); ;\r
+    break;}\r
+case 8:\r
+/* #line 207 "avrparse.y" */\r
+{ tolog(); ;\r
+    break;}\r
+case 9:\r
+/* #line 211 "avrparse.y" */\r
+{ error(E_UNKNOWN_OPCODE); tolog();  ;\r
+    break;}\r
+case 10:\r
+/* #line 246 "avrparse.y" */\r
+{genRegReg(yyvsp[-4].opcode, yyvsp[-3].regid, yyvsp[-1].regid);;\r
+    break;}\r
+case 11:\r
+/* #line 248 "avrparse.y" */\r
+{genRegImm(yyvsp[-4].opcode, yyvsp[-3].regid, &yyvsp[-1].val);;\r
+    break;}\r
+case 12:\r
+/* #line 250 "avrparse.y" */\r
+{genImmReg(yyvsp[-4].opcode, &yyvsp[-3].val, yyvsp[-1].regid);;\r
+    break;}\r
+case 13:\r
+/* #line 252 "avrparse.y" */\r
+{genImmImm(yyvsp[-4].opcode, &yyvsp[-3].val, &yyvsp[-1].val);;\r
+    break;}\r
+case 14:\r
+/* #line 254 "avrparse.y" */\r
+{genImmedi(yyvsp[-2].opcode, &yyvsp[-1].val);;\r
+    break;}\r
+case 15:\r
+/* #line 256 "avrparse.y" */\r
+{genRegist(yyvsp[-2].opcode, yyvsp[-1].regid);;\r
+    break;}\r
+case 16:\r
+/* #line 258 "avrparse.y" */\r
+{genNoargs(yyvsp[-1].opcode);;\r
+    break;}\r
+case 17:\r
+/* #line 260 "avrparse.y" */\r
+{genIndirc(yyvsp[-4].opcode, &yyvsp[-1].indi, yyvsp[-3].regid,TRUE);;\r
+    break;}\r
+case 18:\r
+/* #line 262 "avrparse.y" */\r
+{genIndirc(yyvsp[-4].opcode, &yyvsp[-3].indi, yyvsp[-1].regid);;\r
+    break;}\r
+case 20:\r
+/* #line 268 "avrparse.y" */\r
+{ error(E_REGISTER_EXPECTED);  ;\r
+    break;}\r
+case 21:\r
+/* #line 269 "avrparse.y" */\r
+{ error(E_INVALID_REGIMM_SPEC);    ;\r
+    break;}\r
+case 22:\r
+/* #line 270 "avrparse.y" */\r
+{ error(E_INVALID_REGIMM_SPEC);    ;\r
+    break;}\r
+case 23:\r
+/* #line 271 "avrparse.y" */\r
+{ error(E_INVALID_IMMEDIATE_SPEC); ;\r
+    break;}\r
+case 24:\r
+/* #line 272 "avrparse.y" */\r
+{ error(E_INVALID_IMMEDIATE_SPEC); ;\r
+    break;}\r
+case 25:\r
+/* #line 273 "avrparse.y" */\r
+{ error(E_INVALID_REGISTER_SPEC);  ;\r
+    break;}\r
+case 26:\r
+/* #line 274 "avrparse.y" */\r
+{ error(E_NOARGS_EXPECTED_SPEC);   ;\r
+    break;}\r
+case 27:\r
+/* #line 275 "avrparse.y" */\r
+{ error(E_INVALID_REGISTER_SPEC);  ;\r
+    break;}\r
+case 28:\r
+/* #line 289 "avrparse.y" */\r
+{ genLpm(yyvsp[-1].opcode, 0, NULL, FALSE); ;\r
+    break;}\r
+case 29:\r
+/* #line 291 "avrparse.y" */\r
+{ genLpm(yyvsp[-4].opcode, yyvsp[-3].regid, &yyvsp[-1].indi, TRUE); ;\r
+    break;}\r
+case 30:\r
+/* #line 295 "avrparse.y" */\r
+{ error(E_INVALID_REGISTER_SPEC); ;\r
+    break;}\r
+case 32:\r
+/* #line 310 "avrparse.y" */\r
+{ if(yyvsp[0].symb->isdefine) \r
+                      yyval.regid=yyvsp[0].symb->reg;\r
+                    else\r
+                   {\r
+                      yyval.regid=-1;\r
+                      errorin(E_INVALID_REGISTER_SPEC);\r
+                    }\r
+                  ;\r
+    break;}\r
+case 33:\r
+/* #line 331 "avrparse.y" */\r
+{ doLab(yyvsp[-1].symb); ;\r
+    break;}\r
+case 35:\r
+/* #line 357 "avrparse.y" */\r
+{doDef(yyvsp[-3].symb,yyvsp[-1].regid);;\r
+    break;}\r
+case 36:\r
+/* #line 358 "avrparse.y" */\r
+{doDef(yyvsp[-3].symb,yyvsp[-1].symb); ;\r
+    break;}\r
+case 37:\r
+/* #line 359 "avrparse.y" */\r
+{doEqu(yyvsp[-3].symb,&yyvsp[-1].val); ;\r
+    break;}\r
+case 38:\r
+/* #line 360 "avrparse.y" */\r
+{doAdb();;\r
+    break;}\r
+case 39:\r
+/* #line 360 "avrparse.y" */\r
+{/*XXX*/                   ;\r
+    break;}\r
+case 40:\r
+/* #line 361 "avrparse.y" */\r
+{doAdw();;\r
+    break;}\r
+case 41:\r
+/* #line 361 "avrparse.y" */\r
+{                          ;\r
+    break;}\r
+case 42:\r
+/* #line 362 "avrparse.y" */\r
+{doOrg(&yyvsp[-1].val);          ;\r
+    break;}\r
+case 43:\r
+/* #line 363 "avrparse.y" */\r
+{                          ;\r
+    break;}\r
+case 44:\r
+/* #line 364 "avrparse.y" */\r
+{                          ;\r
+    break;}\r
+case 45:\r
+/* #line 365 "avrparse.y" */\r
+{                          ;\r
+    break;}\r
+case 46:\r
+/* #line 366 "avrparse.y" */\r
+{doByt(&yyvsp[-1].val);          ;\r
+    break;}\r
+case 47:\r
+/* #line 367 "avrparse.y" */\r
+{doSet(yyvsp[-3].symb,&yyvsp[-1].val); ;\r
+    break;}\r
+case 48:\r
+/* #line 368 "avrparse.y" */\r
+{                          ;\r
+    break;}\r
+case 49:\r
+/* #line 369 "avrparse.y" */\r
+{doDev(yyvsp[-1].symb);          ;\r
+    break;}\r
+case 50:\r
+/* #line 373 "avrparse.y" */\r
+{ error(E_EXPECTED_ID_REG);    ;\r
+    break;}\r
+case 51:\r
+/* #line 374 "avrparse.y" */\r
+{ error(E_EXPECTED_ID_EXPR);   ;\r
+    break;}\r
+case 52:\r
+/* #line 375 "avrparse.y" */\r
+{ error(E_EXPECTED_VALLIST);   ;\r
+    break;}\r
+case 53:\r
+/* #line 376 "avrparse.y" */\r
+{ error(E_EXPECTED_VALLIST);   ;\r
+    break;}\r
+case 54:\r
+/* #line 377 "avrparse.y" */\r
+{ error(E_EXPECTED_VAL_LABEL); ;\r
+    break;}\r
+case 55:\r
+/* #line 378 "avrparse.y" */\r
+{ error(E_EXPECTED_NOARGS);    ;\r
+    break;}\r
+case 56:\r
+/* #line 379 "avrparse.y" */\r
+{ error(E_EXPECTED_NOARGS);    ;\r
+    break;}\r
+case 57:\r
+/* #line 380 "avrparse.y" */\r
+{ error(E_EXPECTED_NOARGS);    ;\r
+    break;}\r
+case 58:\r
+/* #line 381 "avrparse.y" */\r
+{ error(E_EXPECTED_VAL_LABEL); ;\r
+    break;}\r
+case 59:\r
+/* #line 382 "avrparse.y" */\r
+{ error(E_EXPECTED_ID_EXPR);   ;\r
+    break;}\r
+case 60:\r
+/* #line 383 "avrparse.y" */\r
+{ error(E_EXPECTED_DEVICE);    ;\r
+    break;}\r
+case 61:\r
+/* #line 402 "avrparse.y" */\r
+{yyval.indi.regno=yyvsp[0].regid;yyval.indi.plus=2;yyval.indi.disp=0;;\r
+    break;}\r
+case 62:\r
+/* #line 404 "avrparse.y" */\r
+{yyval.indi.regno=yyvsp[0].regid;yyval.indi.plus=0;yyval.indi.disp=0;;\r
+    break;}\r
+case 63:\r
+/* #line 406 "avrparse.y" */\r
+{yyval.indi.regno=yyvsp[-1].regid;yyval.indi.plus=1;yyval.indi.disp=0;;\r
+    break;}\r
+case 64:\r
+/* #line 408 "avrparse.y" */\r
+{ yyval.indi.regno  = yyvsp[-2].regid;\r
+                    yyval.indi.plus=1;yyval.indi.disp=1;yyval.indi.offset=yyvsp[0].val;;\r
+    break;}\r
+case 67:\r
+/* #line 430 "avrparse.y" */\r
+{doAdb(yyvsp[0].string); ;\r
+    break;}\r
+case 68:\r
+/* #line 431 "avrparse.y" */\r
+{doAdb(&yyvsp[0].val);;\r
+    break;}\r
+case 69:\r
+/* #line 434 "avrparse.y" */\r
+{doAdw(&yyvsp[0].val);;\r
+    break;}\r
+case 70:\r
+/* #line 435 "avrparse.y" */\r
+{doAdw(&yyvsp[0].val);;\r
+    break;}\r
+case 74:\r
+/* #line 454 "avrparse.y" */\r
+{yyval.val.valid=yyvsp[0].symb->valid;\r
+                   yyval.val.value=yyvsp[0].symb->value\r
+                   +yyvsp[0].symb->islabel*yyvsp[0].symb->macrolabel*\r
+                    (yyoffset    *(yyvsp[0].symb->segment==SEGMENT_CODE))\r
+                   +yyvsp[0].symb->islabel*yyvsp[0].symb->macrolabel*\r
+                    (yydataoffset*(yyvsp[0].symb->segment==SEGMENT_DATA))\r
+                   +yyvsp[0].symb->islabel*yyvsp[0].symb->macrolabel*\r
+                    (yyeromoffset*(yyvsp[0].symb->segment==SEGMENT_EEPROM));;\r
+    break;}\r
+case 75:\r
+/* #line 463 "avrparse.y" */\r
+{ yyval.val=yyvsp[-1].val; ;\r
+    break;}\r
+case 76:\r
+/* #line 465 "avrparse.y" */\r
+{ genFun(yyvsp[-3].func, &yyvsp[-1].val, &yyval.val); ;\r
+    break;}\r
+case 77:\r
+/* #line 468 "avrparse.y" */\r
+{ oprUna(OP_MINUS, &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 78:\r
+/* #line 469 "avrparse.y" */\r
+{ oprUna(OP_WAVE , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 79:\r
+/* #line 470 "avrparse.y" */\r
+{ oprUna(OP_NOT  , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 82:\r
+/* #line 476 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_STAR  , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 83:\r
+/* #line 478 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_DIV   , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 84:\r
+/* #line 480 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_MOD   , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 86:\r
+/* #line 485 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_PLUS  , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 87:\r
+/* #line 487 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_MINUS , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 89:\r
+/* #line 492 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_LS    , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 90:\r
+/* #line 494 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_RS    , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 92:\r
+/* #line 499 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_LESS  , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 93:\r
+/* #line 501 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_GREAT , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 94:\r
+/* #line 503 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_LE    , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 95:\r
+/* #line 505 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_GE    , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 97:\r
+/* #line 510 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_EQ    , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 98:\r
+/* #line 512 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_NE    , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 100:\r
+/* #line 517 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_AND   , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 102:\r
+/* #line 522 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_XOR   , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 104:\r
+/* #line 527 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_OR    , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 106:\r
+/* #line 532 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_ANDAND, &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+case 108:\r
+/* #line 537 "avrparse.y" */\r
+{ oprBin(&yyvsp[-2].val,OP_OROR  , &yyvsp[0].val, &yyval.val); ;\r
+    break;}\r
+}\r
+\r
+/* #line 705 "/usr/share/bison/bison.simple" */\r
+\r
+\f\r
+  yyvsp -= yylen;\r
+  yyssp -= yylen;\r
+#if YYLSP_NEEDED\r
+  yylsp -= yylen;\r
+#endif\r
+\r
+#if YYDEBUG\r
+  if (yydebug)\r
+    {\r
+      short *yyssp1 = yyss - 1;\r
+      YYFPRINTF (stderr, "state stack now");\r
+      while (yyssp1 != yyssp)\r
+       YYFPRINTF (stderr, " %d", *++yyssp1);\r
+      YYFPRINTF (stderr, "\n");\r
+    }\r
+#endif\r
+\r
+  *++yyvsp = yyval;\r
+#if YYLSP_NEEDED\r
+  *++yylsp = yyloc;\r
+#endif\r
+\r
+  /* Now `shift' the result of the reduction.  Determine what state\r
+     that goes to, based on the state we popped back to and the rule\r
+     number reduced by.  */\r
+\r
+  yyn = yyr1[yyn];\r
+\r
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;\r
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)\r
+    yystate = yytable[yystate];\r
+  else\r
+    yystate = yydefgoto[yyn - YYNTBASE];\r
+\r
+  goto yynewstate;\r
+\r
+\r
+/*------------------------------------.\r
+| yyerrlab -- here on detecting error |\r
+`------------------------------------*/\r
+yyerrlab:\r
+  /* If not already recovering from an error, report this error.  */\r
+  if (!yyerrstatus)\r
+    {\r
+      ++yynerrs;\r
+\r
+#ifdef YYERROR_VERBOSE\r
+      yyn = yypact[yystate];\r
+\r
+      if (yyn > YYFLAG && yyn < YYLAST)\r
+       {\r
+         YYSIZE_T yysize = 0;\r
+         char *yymsg;\r
+         int yyx, yycount;\r
+\r
+         yycount = 0;\r
+         /* Start YYX at -YYN if negative to avoid negative indexes in\r
+            YYCHECK.  */\r
+         for (yyx = yyn < 0 ? -yyn : 0;\r
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)\r
+           if (yycheck[yyx + yyn] == yyx)\r
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;\r
+         yysize += yystrlen ("parse error, unexpected ") + 1;\r
+         yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);\r
+         yymsg = (char *) YYSTACK_ALLOC (yysize);\r
+         if (yymsg != 0)\r
+           {\r
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");\r
+             yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);\r
+\r
+             if (yycount < 5)\r
+               {\r
+                 yycount = 0;\r
+                 for (yyx = yyn < 0 ? -yyn : 0;\r
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));\r
+                      yyx++)\r
+                   if (yycheck[yyx + yyn] == yyx)\r
+                     {\r
+                       const char *yyq = ! yycount ? ", expecting " : " or ";\r
+                       yyp = yystpcpy (yyp, yyq);\r
+                       yyp = yystpcpy (yyp, yytname[yyx]);\r
+                       yycount++;\r
+                     }\r
+               }\r
+             yyerror (yymsg);\r
+             YYSTACK_FREE (yymsg);\r
+           }\r
+         else\r
+           yyerror ("parse error; also virtual memory exhausted");\r
+       }\r
+      else\r
+#endif /* defined (YYERROR_VERBOSE) */\r
+       yyerror ("parse error");\r
+    }\r
+  goto yyerrlab1;\r
+\r
+\r
+/*--------------------------------------------------.\r
+| yyerrlab1 -- error raised explicitly by an action |\r
+`--------------------------------------------------*/\r
+yyerrlab1:\r
+  if (yyerrstatus == 3)\r
+    {\r
+      /* If just tried and failed to reuse lookahead token after an\r
+        error, discard it.  */\r
+\r
+      /* return failure if at end of input */\r
+      if (yychar == YYEOF)\r
+       YYABORT;\r
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",\r
+                 yychar, yytname[yychar1]));\r
+      yychar = YYEMPTY;\r
+    }\r
+\r
+  /* Else will try to reuse lookahead token after shifting the error\r
+     token.  */\r
+\r
+  yyerrstatus = 3;             /* Each real token shifted decrements this */\r
+\r
+  goto yyerrhandle;\r
+\r
+\r
+/*-------------------------------------------------------------------.\r
+| yyerrdefault -- current state does not do anything special for the |\r
+| error token.                                                       |\r
+`-------------------------------------------------------------------*/\r
+yyerrdefault:\r
+#if 0\r
+  /* This is wrong; only states that explicitly want error tokens\r
+     should shift them.  */\r
+\r
+  /* If its default is to accept any token, ok.  Otherwise pop it.  */\r
+  yyn = yydefact[yystate];\r
+  if (yyn)\r
+    goto yydefault;\r
+#endif\r
+\r
+\r
+/*---------------------------------------------------------------.\r
+| yyerrpop -- pop the current state because it cannot handle the |\r
+| error token                                                    |\r
+`---------------------------------------------------------------*/\r
+yyerrpop:\r
+  if (yyssp == yyss)\r
+    YYABORT;\r
+  yyvsp--;\r
+  yystate = *--yyssp;\r
+#if YYLSP_NEEDED\r
+  yylsp--;\r
+#endif\r
+\r
+#if YYDEBUG\r
+  if (yydebug)\r
+    {\r
+      short *yyssp1 = yyss - 1;\r
+      YYFPRINTF (stderr, "Error: state stack now");\r
+      while (yyssp1 != yyssp)\r
+       YYFPRINTF (stderr, " %d", *++yyssp1);\r
+      YYFPRINTF (stderr, "\n");\r
+    }\r
+#endif\r
+\r
+/*--------------.\r
+| yyerrhandle.  |\r
+`--------------*/\r
+yyerrhandle:\r
+  yyn = yypact[yystate];\r
+  if (yyn == YYFLAG)\r
+    goto yyerrdefault;\r
+\r
+  yyn += YYTERROR;\r
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)\r
+    goto yyerrdefault;\r
+\r
+  yyn = yytable[yyn];\r
+  if (yyn < 0)\r
+    {\r
+      if (yyn == YYFLAG)\r
+       goto yyerrpop;\r
+      yyn = -yyn;\r
+      goto yyreduce;\r
+    }\r
+  else if (yyn == 0)\r
+    goto yyerrpop;\r
+\r
+  if (yyn == YYFINAL)\r
+    YYACCEPT;\r
+\r
+  YYDPRINTF ((stderr, "Shifting error token, "));\r
+\r
+  *++yyvsp = yylval;\r
+#if YYLSP_NEEDED\r
+  *++yylsp = yylloc;\r
+#endif\r
+\r
+  yystate = yyn;\r
+  goto yynewstate;\r
+\r
+\r
+/*-------------------------------------.\r
+| yyacceptlab -- YYACCEPT comes here.  |\r
+`-------------------------------------*/\r
+yyacceptlab:\r
+  yyresult = 0;\r
+  goto yyreturn;\r
+\r
+/*-----------------------------------.\r
+| yyabortlab -- YYABORT comes here.  |\r
+`-----------------------------------*/\r
+yyabortlab:\r
+  yyresult = 1;\r
+  goto yyreturn;\r
+\r
+/*---------------------------------------------.\r
+| yyoverflowab -- parser overflow comes here.  |\r
+`---------------------------------------------*/\r
+yyoverflowlab:\r
+  yyerror ("parser stack overflow");\r
+  yyresult = 2;\r
+  /* Fall through.  */\r
+\r
+yyreturn:\r
+#ifndef yyoverflow\r
+  if (yyss != yyssa)\r
+    YYSTACK_FREE (yyss);\r
+#endif\r
+  return yyresult;\r
+}\r
+/* #line 544 "avrparse.y" */\r
diff --git a/src/mkutil/tavrasm.118/src/avrparse.hh b/src/mkutil/tavrasm.118/src/avrparse.hh
new file mode 100644 (file)
index 0000000..16e371e
--- /dev/null
@@ -0,0 +1,81 @@
+#ifndef BISON_AVRPARSE_H\r
+# define BISON_AVRPARSE_H\r
+\r
+#ifndef YYSTYPE\r
+typedef union\r
+{\r
+  regSA                 regid;\r
+  instSA                inst;\r
+  opcodeSA              opcode;\r
+  valueSA               val;\r
+  nameSA                name;\r
+  symbolSA              symb;\r
+  indirectSA            indi;\r
+  functionSA            func;\r
+  stringSA              string;\r
+} yystype;\r
+# define YYSTYPE yystype\r
+# define YYSTYPE_IS_TRIVIAL 1\r
+#endif\r
+# define       STAR    257\r
+# define       DIV     258\r
+# define       MOD     259\r
+# define       LS      260\r
+# define       RS      261\r
+# define       LE      262\r
+# define       GE      263\r
+# define       LESS    264\r
+# define       GREAT   265\r
+# define       EQ      266\r
+# define       NE      267\r
+# define       OR      268\r
+# define       XOR     269\r
+# define       AND     270\r
+# define       OROR    271\r
+# define       ANDAND  272\r
+# define       LPAR    273\r
+# define       RPAR    274\r
+# define       COLON   275\r
+# define       COMMA   276\r
+# define       DOT     277\r
+# define       EQUAL   278\r
+# define       PLUS    279\r
+# define       MINUS   280\r
+# define       WAVE    281\r
+# define       NOT     282\r
+# define       EOL     283\r
+# define       RESTART 284\r
+# define       ENDOFFILE       285\r
+# define       DEF     286\r
+# define       EQU     287\r
+# define       DB      288\r
+# define       DW      289\r
+# define       ORG     290\r
+# define       CSEG    291\r
+# define       DSEG    292\r
+# define       ESEG    293\r
+# define       BYTE    294\r
+# define       SET     295\r
+# define       DEVICE  296\r
+# define       STRING  297\r
+# define       MACRODEF        298\r
+# define       REGISTER        299\r
+# define       REGXYZ  300\r
+# define       SYMBOL  301\r
+# define       INTEGER 302\r
+# define       COUNTER 303\r
+# define       FUNCTION        304\r
+# define       IREGREG 305\r
+# define       IIMMIMM 306\r
+# define       IREGIMM 307\r
+# define       IIMMREG 308\r
+# define       IREG    309\r
+# define       IIMM    310\r
+# define       INOARGS 311\r
+# define       IINDIRC 312\r
+# define       ILPM    313\r
+\r
+\r
+extern YYSTYPE yylval;\r
+\r
+#endif /* not BISON_AVRPARSE_H */\r
diff --git a/src/mkutil/tavrasm.118/src/avrparse.y b/src/mkutil/tavrasm.118/src/avrparse.y
new file mode 100644 (file)
index 0000000..613377e
--- /dev/null
@@ -0,0 +1,543 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+//  File        : avrparse.y
+//
+//  Author      : Tom Mortensen - Copyright (C) 1999
+//
+//  Description : This module implements the grammar file for AVRASM
+//
+//  History
+//  ========================================================================
+//
+//  980902      : Tom - File created.
+//  990124      : Tom - Added GPL notice.
+//
+//////////////////////////////////////////////////////// Tom did this ////////
+//
+// Copyright notice:
+//
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// 
+// Tom Mortensen
+//
+// E-mail : tom@tavrasm.org
+// WWW    : http://www.tavrasm.org
+//
+//////////////////////////////////////////////////////////////////////////////
+
+%{
+
+/// Include //////////////////////////////////////////////////////////////////
+
+#include <string.h>
+#include <stdio.h>
+#include <malloc.h>
+#include "avrasm.hh"
+#include "symbol.hh"
+#include "semantic.hh"
+#include "utils.hh"
+
+/// Extern ///////////////////////////////////////////////////////////////////
+
+GLOBALS(extern);
+extern char *yytext;
+
+/// Prototypes ///////////////////////////////////////////////////////////////
+
+int yylex();
+
+/// yyerror //////////////////////////////////////////////////////////////////
+
+void yyerror(char *s)
+{
+  s = s; // Used for debugging purposes
+}
+
+/// Start of grammar /////////////////////////////////////////////////////////
+
+%}
+
+/// Attribute union //////////////////////////////////////////////////////////
+
+%union
+{
+  regSA                 regid;
+  instSA                inst;
+  opcodeSA              opcode;
+  valueSA               val;
+  nameSA                name;
+  symbolSA              symb;
+  indirectSA            indi;
+  functionSA            func;
+  stringSA              string;
+}
+
+/// Terminal symbols that synthesizes default value //////////////////////////
+
+%token  STAR    DIV     MOD
+%token  LS      RS
+%token  LE      GE      LESS    GREAT   EQ      NE
+%token  OR      XOR     AND
+%token  OROR    ANDAND
+%token  LPAR    RPAR
+%token  COLON   COMMA   DOT     EQUAL   PLUS    MINUS   WAVE    NOT
+%token  EOL     RESTART ENDOFFILE
+%token  DEF     EQU     DB      DW      ORG     CSEG    DSEG    ESEG
+%token  BYTE    SET     DEVICE  STRING  MACRODEF
+
+/// Attributes for terminal symbols //////////////////////////////////////////
+
+%token  <regid>         REGISTER
+%token  <regid>         REGXYZ
+%token  <symb>          SYMBOL
+%token  <val>           INTEGER
+%token  <val>           COUNTER
+%token  <func>          FUNCTION
+%token  <opcode>        IREGREG
+%token  <opcode>        IIMMIMM
+%token  <opcode>        IREGIMM
+%token  <opcode>        IIMMREG
+%token  <opcode>        IREG
+%token  <opcode>        IIMM
+%token  <opcode>        INOARGS
+%token  <opcode>        IINDIRC
+%token  <opcode>        ILPM
+%token  <string>        STRING
+
+/// Attributes for non-terminal symbols //////////////////////////////////////
+
+%type   <inst>          instruction
+%type   <inst>          lpminst
+%type   <val>           expr
+%type   <indi>          indirectaddr
+%type   <regid>         registername
+%type   <val>           unary_expr
+%type   <val>           primary_expr
+%type   <val>           mult_expr
+%type   <val>           additive_expr
+%type   <val>           shift_expr
+%type   <val>           relational_expr
+%type   <val>           equality_expr
+%type   <val>           AND_expression
+%type   <val>           exclusive_OR
+%type   <val>           inclusive_OR
+%type   <val>           logical_AND
+%type   <val>           logical_OR
+%type   <val>           composite_expr
+
+/// Expect 4 shift/reduce conflicts //////////////////////////////////////////
+
+%expect 4
+
+/// The goal symbol //////////////////////////////////////////////////////////
+
+%start  program
+
+%% // Start of grammar ///////////////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  program : programlist RESTART programlist
+  //
+  //  e       :
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  We start by defining the goal symbol 'program'. There is only one
+  //  production that can reduce the input to 'program':
+  //
+  //  - 'programlist' RESTART 'programlist'
+  //
+  //  with one 'programlist' for each pass.
+  //
+  //  The symbol 'e' (or epsilon) is also defined. It should be considered
+  //  a terminal symbol, and is only used to increase readability.
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+program         : programlist RESTART programlist
+               ;
+
+e               :
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  programlist := programlist programelement | programelement
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  'programlist' is a left recursive list production, that parses one or
+  //  more 'programelement's.
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+programlist     : programlist programelement
+                | programelement
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  programelement := label instruction | label EOL | label directive | EOL
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  All instructions / defines are limited to a single line
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+programelement  : label instruction  { tolog(); }
+                | label EOL          { tolog(); }
+                | label directive    { tolog(); }
+                | EOL                { tolog(); }
+
+                /// Error recovery //////////////////////////////////////////
+
+                | error EOL          { error(E_UNKNOWN_OPCODE); tolog();  }
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  instruction := IREGREG registername COMMA registername EOL
+  //               | IREGIMM registername COMMA expr EOL
+  //               | IIMMREG expr COMMA registername EOL
+  //               | IIMMIMM expr COMMA expr EOL
+  //               | IIMM expr EOL
+  //               | IREG registername EOL
+  //               | INOARGS EOL
+  //               | IINDIRC registername COMMA indirectaddr EOL
+  //               | IINDIRC indirectaddr COMMA registername EOL
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  There are nine different forms of 'instruction' :
+  //
+  //  MOV       r1, r1          ; Register  / Register
+  //  MOV       r1, 0x10        ; Register  / expr
+  //  OUT       0x10, r1        ; expr / Register
+  //  BRBS      6, bitfound     ; expr / expr
+  //  JMP       0x1000          ; expr
+  //  CLR       r29             ; Register
+  //  CLI                       ; Noargs
+  //  LD        r2, -Y          ; Indirect
+  //  ST        Y+, r2          ; Indirect
+  //
+  //  Notice: LPM/ELPM are special, since they can be specified with or 
+  //          without arguments (arrgh).
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+instruction     : IREGREG registername COMMA registername EOL
+                  {genRegReg($<opcode>1, $<regid>2, $<regid>4);}
+                | IREGIMM registername COMMA expr EOL
+                  {genRegImm($<opcode>1, $<regid>2, &$<val>4);}
+                | IIMMREG expr COMMA registername EOL
+                  {genImmReg($<opcode>1, &$<val>2, $<regid>4);}
+                | IIMMIMM expr COMMA expr   EOL
+                  {genImmImm($<opcode>1, &$<val>2, &$<val>4);}
+                | IIMM expr EOL
+                  {genImmedi($<opcode>1, &$<val>2);}
+                | IREG registername EOL
+                  {genRegist($<opcode>1, $<regid>2);}
+                | INOARGS EOL
+                  {genNoargs($<opcode>1);}
+                | IINDIRC registername COMMA indirectaddr EOL
+                  {genIndirc($<opcode>1, &$<indi>4, $<regid>2,TRUE);}
+                | IINDIRC indirectaddr COMMA registername EOL
+                  {genIndirc($<opcode>1, &$<indi>2, $<regid>4);}
+
+                | lpminst
+
+                /// Error recovery //////////////////////////////////////////
+
+                | IREGREG error EOL { error(E_REGISTER_EXPECTED);  }
+                | IREGIMM error EOL { error(E_INVALID_REGIMM_SPEC);    }
+                | IIMMREG error EOL { error(E_INVALID_REGIMM_SPEC);    }
+                | IIMMIMM error EOL { error(E_INVALID_IMMEDIATE_SPEC); }
+                | IIMM    error EOL { error(E_INVALID_IMMEDIATE_SPEC); }
+                | IREG    error EOL { error(E_INVALID_REGISTER_SPEC);  }
+                | INOARGS error EOL { error(E_NOARGS_EXPECTED_SPEC);   }
+                | IINDIRC error EOL { error(E_INVALID_REGISTER_SPEC);  }
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  lpminst         := ILPM EOL | ILPM registername COMMA indirectaddr 
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  Handles LPM and ELPM instructions
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+lpminst         : ILPM EOL                             
+                  { genLpm($<opcode>1, 0, NULL, FALSE); }
+                | ILPM registername COMMA indirectaddr EOL
+                  { genLpm($<opcode>1, $<regid>2, &$<indi>4, TRUE); }
+
+                /// Error recovery //////////////////////////////////////////
+
+                | ILPM error EOL { error(E_INVALID_REGISTER_SPEC); }
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  registername  := REGISTER | SYMBOL
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // Handle registers: r0 - r31
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+registername    : REGISTER
+                | SYMBOL
+                  { if($<symb>1->isdefine) 
+                      $<regid>$=$<symb>1->reg;
+                    else
+                   {
+                      $<regid>$=-1;
+                      errorin(E_INVALID_REGISTER_SPEC);
+                    }
+                  }
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // lable      :=  SYMBOL COLON
+  //             |  e
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // SYMBOL COLON = Create new label
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+label           : SYMBOL COLON  { doLab($<symb>1); }
+                | e
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // directive := DEF SYMBOL EQUAL REGISTER EOL
+  //            | DEF SYMBOL EQUAL SYMBOL EOL
+  //            | EQU SYMBOL EQUAL expr EOL
+  //            | DB {doAdb();} byteexprlist EOL
+  //            | DW {doAdw();} wordexprlist EOL
+  //            | ORG expr EOL
+  //            | CSEG EOL
+  //            | DSEG EOL
+  //            | ESEG EOL
+  //            | BYTE expr EOL
+  //            | SET SYMBOL EQUAL expr EOL
+  //            | MACRODEF
+  //            | DEVICE SYMBOL EOL
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // 'directive' insert assembler directives
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+directive       : DEF SYMBOL EQUAL REGISTER EOL   {doDef($<symb>2,$<regid>4);}
+                | DEF SYMBOL EQUAL SYMBOL EOL     {doDef($<symb>2,$<symb>4); }
+                | EQU SYMBOL EQUAL expr EOL       {doEqu($<symb>2,&$<val>4); }
+                | DB {doAdb();} byteexprlist EOL  {/*XXX*/                   }
+                | DW {doAdw();} wordexprlist EOL  {                          }
+                | ORG expr EOL                    {doOrg(&$<val>2);          }
+                | CSEG EOL                        {                          }
+                | DSEG EOL                        {                          }
+                | ESEG EOL                        {                          }
+                | BYTE expr EOL                   {doByt(&$<val>2);          }
+                | SET SYMBOL EQUAL expr EOL       {doSet($<symb>2,&$<val>4); }
+                | MACRODEF                        {                          }
+                | DEVICE SYMBOL EOL               {doDev($<symb>2);          }
+
+                /// Error recovery //////////////////////////////////////////
+
+                | DEF error EOL    { error(E_EXPECTED_ID_REG);    }
+                | EQU error EOL    { error(E_EXPECTED_ID_EXPR);   }
+                | DB  error EOL    { error(E_EXPECTED_VALLIST);   }
+                | DW  error EOL    { error(E_EXPECTED_VALLIST);   }
+                | ORG error EOL    { error(E_EXPECTED_VAL_LABEL); }
+                | CSEG error EOL   { error(E_EXPECTED_NOARGS);    }
+                | DSEG error EOL   { error(E_EXPECTED_NOARGS);    }
+                | ESEG error EOL   { error(E_EXPECTED_NOARGS);    }
+                | BYTE error EOL   { error(E_EXPECTED_VAL_LABEL); }
+                | SET error EOL    { error(E_EXPECTED_ID_EXPR);   }
+                | DEVICE error EOL { error(E_EXPECTED_DEVICE);    }
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // indirectaddr := MINUS REGXYZ
+  //               | REGXYZ
+  //               | REGXYZ PLUS
+  //               | REGXYZ PLUS expr
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // There are 4 different forms of indirect addressing:
+  //
+  //   "-Z", "Z", "Z+" and "Z+offset"
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+indirectaddr    : MINUS REGXYZ
+                  {$<indi>$.regno=$<regid>2;$<indi>$.plus=2;$<indi>$.disp=0;}
+                | REGXYZ
+                  {$<indi>$.regno=$<regid>1;$<indi>$.plus=0;$<indi>$.disp=0;}
+                | REGXYZ PLUS
+                  {$<indi>$.regno=$<regid>1;$<indi>$.plus=1;$<indi>$.disp=0;}
+                | REGXYZ PLUS expr
+                  { $<indi>$.regno  = $<regid>1;
+                    $<indi>$.plus=1;$<indi>$.disp=1;$<indi>$.offset=$<val>3;}
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  byteexprlist := byteexprlist COMMA expr
+  //                | expr
+  //
+  //  wordexprlist := wordexprlist COMMA expr
+  //                | expr
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // List of bytes and words for .db and .dw respectively
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+byteexprlist    : byteexprlist COMMA byteelement
+                | byteelement
+               ;
+
+byteelement     : STRING                  {doAdb($<string>1); }
+                | expr                    {doAdb(&$<val>1);}
+                ;
+
+wordexprlist    : wordexprlist COMMA expr {doAdw(&$<val>3);}
+                | expr                    {doAdw(&$<val>1);}
+                ;
+
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  //  expr := ...
+  //
+  ////////////////////////////////////////////////////////////////////////////
+  //
+  // Constant expressions with 'C' precedence
+  //
+  ////////////////////////////////////////////////////////////////////////////
+
+expr            : composite_expr
+               ;
+
+primary_expr    : INTEGER
+               | COUNTER
+                | SYMBOL
+                  {$<val>$.valid=$<symb>1->valid;
+                   $<val>$.value=$<symb>1->value
+                   +$<symb>1->islabel*$<symb>1->macrolabel*
+                    (yyoffset    *($<symb>1->segment==SEGMENT_CODE))
+                   +$<symb>1->islabel*$<symb>1->macrolabel*
+                    (yydataoffset*($<symb>1->segment==SEGMENT_DATA))
+                   +$<symb>1->islabel*$<symb>1->macrolabel*
+                    (yyeromoffset*($<symb>1->segment==SEGMENT_EEPROM));}
+                | LPAR expr RPAR
+                  { $<val>$=$<val>2; }
+                | FUNCTION LPAR expr RPAR
+                  { genFun($<func>1, &$<val>3, &$<val>$); }
+                ;
+
+unary_expr      : MINUS unary_expr { oprUna(OP_MINUS, &$<val>2, &$<val>$); }
+                | WAVE  unary_expr { oprUna(OP_WAVE , &$<val>2, &$<val>$); }
+                | NOT   unary_expr { oprUna(OP_NOT  , &$<val>2, &$<val>$); }
+                | primary_expr
+                ;
+
+mult_expr       : unary_expr
+                | mult_expr STAR unary_expr
+                  { oprBin(&$<val>1,OP_STAR  , &$<val>3, &$<val>$); }
+                | mult_expr DIV  unary_expr
+                  { oprBin(&$<val>1,OP_DIV   , &$<val>3, &$<val>$); }
+                | mult_expr MOD  unary_expr
+                  { oprBin(&$<val>1,OP_MOD   , &$<val>3, &$<val>$); }
+                ;
+
+additive_expr   : mult_expr
+                | additive_expr PLUS  mult_expr
+                  { oprBin(&$<val>1,OP_PLUS  , &$<val>3, &$<val>$); }
+                | additive_expr MINUS mult_expr
+                  { oprBin(&$<val>1,OP_MINUS , &$<val>3, &$<val>$); }
+                ;
+
+shift_expr      : additive_expr
+                | shift_expr LS additive_expr
+                  { oprBin(&$<val>1,OP_LS    , &$<val>3, &$<val>$); }
+                | shift_expr RS additive_expr
+                  { oprBin(&$<val>1,OP_RS    , &$<val>3, &$<val>$); }
+                ;
+
+relational_expr : shift_expr
+                | relational_expr LESS  shift_expr
+                  { oprBin(&$<val>1,OP_LESS  , &$<val>3, &$<val>$); }
+                | relational_expr GREAT shift_expr
+                  { oprBin(&$<val>1,OP_GREAT , &$<val>3, &$<val>$); }
+                | relational_expr LE    shift_expr
+                  { oprBin(&$<val>1,OP_LE    , &$<val>3, &$<val>$); }
+                | relational_expr GE    shift_expr
+                  { oprBin(&$<val>1,OP_GE    , &$<val>3, &$<val>$); }
+                ;
+
+equality_expr   : relational_expr
+                | equality_expr EQ relational_expr
+                  { oprBin(&$<val>1,OP_EQ    , &$<val>3, &$<val>$); }
+                | equality_expr NE relational_expr
+                  { oprBin(&$<val>1,OP_NE    , &$<val>3, &$<val>$); }
+                ;
+
+AND_expression  : equality_expr
+                | AND_expression AND equality_expr
+                  { oprBin(&$<val>1,OP_AND   , &$<val>3, &$<val>$); }
+                ;
+
+exclusive_OR    : AND_expression
+                | exclusive_OR XOR AND_expression
+                  { oprBin(&$<val>1,OP_XOR   , &$<val>3, &$<val>$); }
+                ;
+
+inclusive_OR    : exclusive_OR
+                | inclusive_OR OR exclusive_OR
+                  { oprBin(&$<val>1,OP_OR    , &$<val>3, &$<val>$); }
+                ;
+
+logical_AND     : inclusive_OR
+                | logical_AND ANDAND inclusive_OR
+                  { oprBin(&$<val>1,OP_ANDAND, &$<val>3, &$<val>$); }
+                ;
+
+logical_OR      : logical_AND
+                | logical_OR  OROR logical_AND
+                  { oprBin(&$<val>1,OP_OROR  , &$<val>3, &$<val>$); }
+                ;
+
+composite_expr  : logical_OR
+               ;
+
+/// END OF FILE //////////////////////////////////////////////////////////////
diff --git a/src/mkutil/tavrasm.118/src/devices.hh b/src/mkutil/tavrasm.118/src/devices.hh
new file mode 100644 (file)
index 0000000..1a9694d
--- /dev/null
@@ -0,0 +1,110 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : devices.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : AVR Controller descriptions\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//  990721     : Tom - Added AT90S4433\r
+//  021218     : Andreas Schwarz <andreas-s@web.de> added AT90S2333, ATmegaXX\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _DEVICES_HH_\r
+#define _DEVICES_HH_\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include "avrasm.hh"\r
+\r
+/// Device descriptions //////////////////////////////////////////////////////\r
+//\r
+// struct deviceinfo {\r
+//         char    name[MAX_DEVICE_NAME_LENGTH+1]; // Device name\r
+//         int     datastart;                      // Registers + I/O ports\r
+//         int     ramsize;                        // Size of ram\r
+//         int     eepromsize;                     // Size of EEPROM\r
+//         int     flashsize;                      // Size of flash (in words)\r
+//         int     supported;                      // Unsupported instructions\r
+// };\r
+// \r
+\r
+deviceinfo devices[MAX_DEVICES] = {\r
+\r
+  // -----------------------------------------------------------------------\r
+  // Name       |Reg| Ram  | EEPROM |Flash Size | Unsupported instuctions  |\r
+  // -----------------------------------------------------------------------\r
+  //            |   |      |        |           |                          |\r
+  { "GENERIC"   , 96, 65536, 0x10000, 0x1000000 , 0                       },\r
+  { "AT90S1200" , 96,     0,      64,       512 , S_JMP  |S_CALL |S_MUL  |\r
+                                                 S_ADIW |S_CALL |S_ICALL|\r
+                                                 S_IJMP |S_LD   |S_ST   |\r
+                                                 S_LDS  |S_LPM  |S_PUSH |\r
+                                                 S_POP  |S_SBIW |S_LDD  |\r
+                                                 S_STD  |S_STS  |S_EXTENDED          },\r
+  { "AT90S2313" , 96,   128,     128,      1024 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "AT90S2323" , 96,   128,     128,      1024 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "AT90S2343" , 96,   128,     128,      1024 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "AT90S4414" , 96,   256,     256,      2048 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "AT90S4433" , 96,   256,     256,      2048 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "AT90S4434" , 96,   256,     256,      2048 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "AT90S8515" , 96,   512,     512,      4096 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "AT90S8535" , 96,   512,     512,      4096 , S_JMP  |S_CALL |S_MUL| S_EXTENDED   },\r
+  { "ATMega103" , 96,  4096,    4096,     65536 , S_MUL  | S_EXTENDED                 },\r
+  { "ATMega8"   , 96,  1024,     512,      4096 , 0                       },\r
+  { "ATMega161" , 96,  1024,     512,      8192 , 0                       },\r
+  { "ATMega162" , 96,  1024,     512,      8192 , 0                       },\r
+  { "ATMega163" , 96,  1024,     512,      8192 , 0                       },\r
+  { "ATMega16"  , 96,  1024,     512,      8192 , 0                       },\r
+  { "ATMega323" , 96,  2048,    1024,     16384 , 0                       },\r
+  { "ATMega32"  , 96,  2048,    1024,     16384 , 0                       },\r
+  { "ATmega8515", 96,   512,     512,      4096 , 0                       },\r
+  { "ATmega8535", 96,   512,     512,      4096 , 0                       },\r
+  //            |   |      |        |           |                          |\r
+  // -----------------------------------------------------------------------\r
+\r
+  // Test device\r
+\r
+  { ""          , 96, 2    , 5      ,        10 , 0                       },\r
+\r
+  // NULL - terminating device.\r
+\r
+  { ""          , 0 ,   0, 0x000, 0x1000000 , 0                           }\r
+\r
+};\r
+\r
+#endif /* _DEVICES_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/mac.inc b/src/mkutil/tavrasm.118/src/mac.inc
new file mode 100644 (file)
index 0000000..f2f9930
--- /dev/null
@@ -0,0 +1,195 @@
+;      MAC.INC\r
+;      MACROS FOR THE AVR PROCESSOR\r
+\r
+.MACRO RJEQ\r
+       BRNE    LOCAL\r
+       RJMP    @0\r
+LOCAL:\r
+.ENDMACRO\r
+\r
+.MACRO RJNE\r
+       BREQ    LOCAL\r
+       RJMP    @0\r
+LOCAL:\r
+.ENDMACRO\r
+\r
+.MACRO OUTI @0,@1\r
+       LDI     A,@1            ; OUT IMMEDIATE TO PORT\r
+       OUT     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ADDI @0,@1\r
+       SUBI    @0,-@1          ; ADD IMMEDIATE\r
+.ENDMACRO\r
+\r
+.MACRO EORI @0,@1\r
+       LDI     A,@1            ; EOR IMMEDIATE\r
+       EOR     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO STI @0,@1\r
+       LDI     A,@1            ; STORE IMMEDIATE\r
+       ST      @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ADDIL @0,@1\r
+       LDI     A,@1            ; ADD IMMEDIATE LOWER REGISTER SET\r
+       ADD     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO SUBIL @0,@1\r
+       LDI     A,@1            ; ADD IMMEDIATE LOWER REGISTER SET\r
+       SUB     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO ANDIL @0,@1\r
+       LDI     A,@1            ; AND IMMEDIATE LOWER REGISTER SET\r
+       AND     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO LDIL @0,@1\r
+       LDI     A,@1            ; LOAD IMMEDIATE LOWER REGISTER SET\r
+       MOV     @0,A\r
+.ENDMACRO\r
+\r
+.MACRO LDIX @0                 ; LOAD IMMEDIATE XL, XH WITH FLASH ADDRESS\r
+       LDI     XL,LOW((@0)*2)  ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((@0)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+.ENDMACRO\r
+\r
+.MACRO LDIZ @0                 ; LOAD IMMEDIATE ZL, ZH WITH FLASH ADDRESS\r
+       LDI     ZL,LOW((@0)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((@0)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+.ENDMACRO\r
+\r
+.MACRO LDE @0,@1               ; LOAD REGISTER FROM EEPROM\r
+       RCALL   LDE1\r
+       LDI     @0,LOW(@1*2)    ; POINT TO EEPROM CONSTANT\r
+       OUT     EEAR,@0         ; SET UP ADDRESS\r
+       SBI     EECR,EERE       ; ASSERT READ STROBE\r
+       IN      @0,EEDR\r
+.ENDMACRO\r
+\r
+.MACRO LDFL @0,@1              ; LOAD REGISTER FROM FLASH LOW BYTE\r
+       LDI     ZL,LOW(@1*2)\r
+       LDI     ZH,HIGH(@1*2)\r
+       LPM\r
+       MOV     @0,R0\r
+.ENDMACRO\r
+\r
+.MACRO LDFH @0,@1              ; LOAD REGISTER FROM FLASH HIGH BYTE\r
+       LDI     ZL,LOW(@1*2+1)\r
+       LDI     ZH,HIGH(@1*2+1)\r
+       LPM\r
+       MOV     @0,R0\r
+.ENDMACRO\r
+\r
+;.MACRO        LDF @0,@1               ; LOAD REGISTER FROM FLASH\r
+;      LDI     ZL,@1           ; POINT TO FLASH CONSTANT\r
+;      LPM\r
+;      MOV     @0,R0\r
+;.ENDMACRO\r
+\r
+;------------------------------------------------------------------------------\r
+\r
+.MACRO FLD @0                  ; LOAD FA REGISTER FROM SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   LDS_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLDF @0                 ; LOAD FA REGISTER FROM FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   LDF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLDE @0                 ; LOAD FA REGISTER FROM EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   LDE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FLD3 @0                 ; LOAD FA REGISTER WITH 3 BYTE SRAM INTEGER\r
+       LDI     YL,LOW(@0)      ; POINT TO SOURCE\r
+       RCALL   LDS3_FA         ; CONVERT TO INTERNAL FP FORMAT\r
+.ENDMACRO\r
+\r
+.MACRO FLD2 @0                 ; LOAD FA REGISTER WITH 2 BYTE SRAM INTEGER\r
+       LDI     YL,LOW(@0)      ; POINT TO SOURCE\r
+       RCALL   LDS2_FA         ; CONVERT TO INTERNAL FP FORMAT\r
+.ENDMACRO\r
+\r
+.MACRO FST @0                  ; STORE FP REGISTER TO FP ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   STS_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCHS @0                 ; CHANGE SIGN OF SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)\r
+       RCALL   CHSS\r
+.ENDMACRO\r
+\r
+.MACRO FAD @0                  ; ADD SRAM ARGUMENT TO FA REGISTER\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   ADD_FA\r
+.ENDMACRO\r
+\r
+.MACRO FADF @0                 ; ADD FLASH CONSTANT TO FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   ADDF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FADE @0                 ; ADD EEPROM CONSTANT TO FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO EEPROM CONSTANT\r
+       RCALL   ADDE_FA\r
+.ENDMACRO\r
+\r
+.MACRO FSB @0                  ; SUBTRACT SRAM ARGUMENT FROM FA REGISTER\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   SUB_FA\r
+.ENDMACRO\r
+\r
+.MACRO FSBF @0                 ; SUBTRACT FLASH CONSTANT FROM FA REGISTER\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   SUBF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FML @0                  ; MULTIPLY FA REGISTER BY SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   MUL_FA\r
+.ENDMACRO\r
+\r
+.MACRO FMLF @0                 ; MULTIPLY FA REGISTER BY FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   MULF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FDV @0                  ; DIVIDE FA REGISTER BY SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   DIV_FA\r
+.ENDMACRO\r
+\r
+.MACRO FDVF @0                 ; DIVIDE FA REGISTER BY FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   DIVF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCP @0                  ; COMPARE FA REGISTER WITH SRAM ARGUMENT\r
+       LDI     YL,LOW(@0)      ; POINT TO SRAM ARGUMENT\r
+       RCALL   CP_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCPF @0                 ; COMPARE FA REGISTER WITH FLASH CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       LDI     ZH,HIGH(@0*2)\r
+       RCALL   CPF_FA\r
+.ENDMACRO\r
+\r
+.MACRO FCPE @0                 ; COMPARE FA REGISTER WITH EEPROM CONSTANT\r
+       LDI     ZL,LOW(@0*2)    ; POINT TO FLASH CONSTANT\r
+       RCALL   CPE_FA\r
+.ENDMACRO\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/makefile b/src/mkutil/tavrasm.118/src/makefile
new file mode 100644 (file)
index 0000000..c61830c
--- /dev/null
@@ -0,0 +1,117 @@
+#############################################################################
+#
+#  Title       : TAVRASM Makefile
+#
+#  Author      : Tom Mortensen - (C) 1998
+#
+#  Create      : 980902
+#
+#  Notice       : Select compiler as appropriate (egcs or gcc)
+#
+#  rm/mv        : Versions of rm (remove/delete) and mv (move) that supports
+#                 "Unix" style parameters must be available.
+#
+#############################################################################
+
+### Program name ############################################################
+
+EXENAME                = tavrasm
+
+### Language : US, DE #######################################################
+
+LANGUAGE       = US
+VERSION                = 117
+
+### Compiler options #########################################################
+
+CC             = gcc
+CFLAGS          = -O2 -Wall -DAVRLANG=LANGUAGE_$(LANGUAGE)
+CPPFLAGS       =
+CCFLAGS         = $(CFLAGS) $(CPPFLAGS)
+LINK            = -lm -lstdc++
+OBJS           = avrparse.o avrlex.o avrasm.o symbol.o semantic.o utils.o
+
+### Defaul CC files #########################################################
+
+.cc.o:
+               $(CC) -c $(CCFLAGS) $<
+
+### Executable ##############################################################
+
+$(EXENAME):    $(OBJS)
+               $(CC) $(CCFLAGS) $(OBJS) $(LINK) -o $@
+
+### Parser file #############################################################
+
+avrparse.cc:   avrparse.y avrasm.hh symbol.hh semantic.hh opcodes.hh
+               bison -d -o avrparse avrparse.y
+               mv avrparse avrparse.cc
+               mv avrparse.h avrparse.hh
+
+### Scanner file ############################################################
+
+avrlex.cc:     avrparse.cc avrlex.l symbol.hh semantic.hh avrparse.hh \
+               opcodes.hh avrasm.hh messages.hh
+               flex -o$@ avrlex.l
+
+### Dependencies ############################################################
+
+avrlex.o:      avrlex.l
+avrparse.o:    avrparse.y
+avrasm.o:      avrasm.cc avrasm.hh symbol.hh devices.hh messages.hh
+symbol.o:      symbol.cc symbol.hh avrasm.hh
+utils.o:       utils.cc utils.hh avrasm.hh messages.hh msg_us.hh msg_de.hh msg_sp.hh
+semantic.o:    semantic.cc semantic.hh symbol.hh opcodes.hh avrasm.hh \
+               messages.hh
+
+### Clean ###################################################################
+
+clean:
+               rm -rf *.o
+               rm -rf *.O
+               rm -rf avrparse.cc
+               rm -rf avrparse.hh
+               rm -rf avrlex.cc 
+               rm -rf core *~
+               rm -rf *.output
+               rm -rf $(EXENAME)
+               rm -rf $(EXENAME).EXE   
+               rm -rf *.obj
+               rm -rf *.out
+
+### Distribution ############################################################
+
+dist:          
+               rm -rf  tavrasm$(VERSION)
+               mkdir tavrasm$(VERSION)
+               mkdir tavrasm$(VERSION)/src
+               cp *.cc tavrasm$(VERSION)/src/.
+               cp *.hh tavrasm$(VERSION)/src/.
+               cp *.l tavrasm$(VERSION)/src/.
+               cp *.y tavrasm$(VERSION)/src/.
+               cp makefile tavrasm$(VERSION)/src/.
+               cp gpl.txt tavrasm$(VERSION)/.
+               cp README tavrasm$(VERSION)/.
+
+dist2:         clean dist $(EXENAME)
+               cp  $(EXENAME) tavrasm$(VERSION)/.
+               tar cvfz tavrasm.tar.gz tavrasm$(VERSION)
+
+distribution:  dist2
+               rm -rf *.o
+               rm -rf avrparse.cc
+               rm -rf avrparse.hh
+               rm -rf avrlex.cc 
+               rm -rf core *~
+               rm -rf *.output
+               rm -rf $(EXENAME)
+               rm -rf $(EXENAME).EXE   
+               rm -rf *.obj
+               rm -rf *.out
+               rm -rf  tavrasm$(VERSION)
+
+### END OF FILE #############################################################
+
+
+
+
diff --git a/src/mkutil/tavrasm.118/src/messages.hh b/src/mkutil/tavrasm.118/src/messages.hh
new file mode 100644 (file)
index 0000000..4d6f194
--- /dev/null
@@ -0,0 +1,258 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : messages.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : AVR Macro assembler messages\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//  990127      : Tom - Messages moved to 'msg_us.hh', multi language added\r
+//  000111     : Brian Rhodefer - added message for too many include paths\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _MESSAGES_HH_\r
+#define _MESSAGES_HH_\r
+\r
+/// Defines //////////////////////////////////////////////////////////////////\r
+\r
+#define MESSAGES_LEN                   77\r
+\r
+/// Warnings /////////////////////////////////////////////////////////////////\r
+\r
+#define W_INVALID_CHAR                  1\r
+#define W_INVALID_ASCII                 2\r
+#define W_ARG_SPEC                      3\r
+#define W_ARG_USED                      4\r
+#define W_REGLABEL                      5\r
+#define W_REGREDEF                      6\r
+#define W_INTEGERRESULT_EXP2_IS_ZERO    7\r
+#define W_INTEGERRESULT_LOG2_IS_ZERO    8\r
+#define W_BIT_OUT_OF_RANGE              9\r
+#define W_PORT_OUT_OF_RANGE_1F         10\r
+#define W_PORT_OUT_OF_RANGE_3F         11\r
+#define W_BITMASK_OUT_OF_RANGE         12\r
+#define W_CONST_OUT_OF_RANGE_3F        13\r
+#define W_CONST_OUT_OF_RANGE_FF        14\r
+#define W_CONST_OUT_OF_RANGE_FFFF      15\r
+#define W_ADDR_OUT_OF_RANGE_FFFF       16\r
+#define W_DISPLACEMENT_OUT_OF_RANGE    17\r
+#define W_ILLEGAL_DEST_ADDR            18\r
+#define W_DB_OUT_OF_RANGE              19\r
+#define W_DW_OUT_OF_RANGE              20\r
+#define W_ORG_OUT_OF_RANGE             21\r
+#define W_ORG_OUT_OF_RANGE_ESEG        22\r
+#define W_ORG_OUT_OF_RANGE_DSEG        23\r
+#define W_ORG_OVER_REG                 24\r
+#define W_SRAM_EXCEED                  25\r
+#define W_MACRO_UNUSES_PARM            26\r
+#define W_LISTMACRO_NOT_SUP            27\r
+#define W_LIST_NOT_SUP                 28\r
+#define W_NOLIST_NOT_SUP               29\r
+#define W_UNSUP                        30\r
+#define W_UNKNOWN_DEV                  31\r
+#define W_CONSTANT_TO_BIG              32\r
+#define W_IDENTIFIER_TOO_LONG          33\r
+#define W_EROM_EXCEED                  34\r
+#define W_OCT_ESCAPE_INVALID           35\r
+#define W_HEX_ESCAPE_INVALID           36\r
+#define W_OCT_OUT_OF_RANGE             37\r
+#define W_CHAR_INVALID                 38\r
+#define W_FLASH_EXCEEDED               39\r
+#define W_MAC_IDENTIFIER_TOO_LONG      40\r
+#define MESSAGE_WARNING_LAST           40\r
+\r
+/// Errors ///////////////////////////////////////////////////////////////////\r
+\r
+#define E_UNKNOWN                       1\r
+#define E_UNKNOWN_BIT                   2\r
+#define E_UNKNOWN_PORT                  3\r
+#define E_UNKNOWN_BRANCH                4\r
+#define E_UNKNOWN_BITMASK               5\r
+#define E_UNKNOWN_CONSTANT              6\r
+#define E_UNKNOWN_ADDRESS               7\r
+#define E_UNKNOWN_DISP                  8\r
+#define E_UNKNOWN_RCALL_DEST            9\r
+#define E_UNKNOWN_RJUMP_DEST           10\r
+#define E_UNKNOWN_JUMP_CALL_DEST       11\r
+#define E_UNKNOWN_DB                   12\r
+#define E_UNKNOWN_DW                   13\r
+#define E_UNKNOWN_ORG                  14\r
+#define E_UNKNOWN_BYTE                 15\r
+#define E_DIVISION_BY_ZERO             16\r
+#define E_INVALID_REGISTER_R16_R31     17\r
+#define E_INVALID_REGISTER             18\r
+#define E_BRANCH_OUT_OF_RANGE_B        19\r
+#define E_BRANCH_OUT_OF_RANGE_F        20\r
+#define E_INVALID_REG_R24_R30          21\r
+#define E_INVALID_SOURCE_REG_XYZ       22\r
+#define E_INVALID_DEST_REG_XYZ         23\r
+#define E_RCALL_OUT_OF_RANGE_B         24\r
+#define E_RCALL_OUT_OF_RANGE_F         25\r
+#define E_RJUMP_OUT_OF_RANGE_B         26\r
+#define E_RJUMP_OUT_OF_RANGE_F         27\r
+#define E_EQU_REDEF                    28\r
+#define E_LABEL_REDEF                  29\r
+#define E_LABEL_VAR                    30\r
+#define E_DW_IN_DSEG                   31\r
+#define E_DB_IN_DSEG                   32\r
+#define E_MACRO_REDEF                  33\r
+#define E_PROGRAM_IN_DSEG              34\r
+#define E_PROGRAM_IN_ESEG              35\r
+#define E_INCLUDE_DEPTH                36\r
+#define E_INVALID_INCLUDE_NAME         37\r
+#define E_OPEN_FILE                    38\r
+#define E_MACRO_DEPTH                  39\r
+#define E_EOF_IN_MACRO                 40\r
+#define E_FILENAME_TOO_LONG            41\r
+#define E_INVALID_FILENAME             42\r
+#define E_REGISTER_EXPECTED            43\r
+#define E_INVALID_REGISTER_SPEC        44\r
+#define E_INVALID_REGIMM_SPEC          45\r
+#define E_INVALID_IMMEDIATE_SPEC       46\r
+#define E_NOARGS_EXPECTED_SPEC         47\r
+#define E_UNKNOWN_OPCODE               48\r
+#define E_EXPECTED_ID_REG              49\r
+#define E_EXPECTED_VALLIST             50\r
+#define E_EXPECTED_NOARGS              51\r
+#define E_EXPECTED_VAL_LABEL           52\r
+#define E_EXPECTED_ID_EXPR             53\r
+#define E_EXPECTED_DEVICE              54\r
+#define E_VAR_IN_CSEG                  55\r
+#define E_NO_MACRO_NAME                56\r
+#define E_UNDEF_ESCAPE                 57\r
+#define E_NO_FILENAME                  58\r
+#define E_DEF_USE                      59\r
+#define E_UNDEF_ESCAPE_C               60\r
+#define E_ENDM                         61\r
+#define E_MACRO_IN_MACRO               62\r
+#define E_REG_DISP                     63\r
+#define E_DISP_REG                     64\r
+\r
+#define E_NO_DISP                      65\r
+#define E_INVALID_REGISTER_R23_R31     66\r
+#define E_DISP_ILLEGAL                 67\r
+#define E_INVALID_REG_Z_EXPECTED       68\r
+#define E_INVALID_PREINCREMENT         69\r
+#define E_INVALID_REG_EXPECTED         70\r
+#define E_INVALID_REG_EXPECTED_0_2_4   71\r
+#define MESSAGE_ERROR_LAST             71\r
+\r
+#define X_OUT_OF_MEMORY                 1\r
+#define X_LINE_TOO_LONG                 2\r
+#define X_MACRO_LINE_TOO_LONG           3\r
+#define X_UNABLE_TO_OPEN_FILE           4\r
+#define X_UNABLE_TO_OPEN_LOGFILE        5\r
+#define X_UNABLE_TO_OPEN_OUTFILE        6\r
+#define X_UNABLE_TO_OPEN_ROMFILE        7\r
+#define X_TOO_MANY_FILES                8\r
+#define X_TOO_MUCH_CODE                 9\r
+#define X_TOO_MUCH_DATA                10\r
+#define X_MACRO_DEPTH                  11\r
+#define MESSAGE_FATAL_LAST             11\r
+\r
+#define M_EMPTY_ROM_FILE                1\r
+#define M_NOT_SAVE_EROM_OBJ             2\r
+#define M_NO_INPUT_FILENAME             3\r
+#define M_UNKNOWN_OPTION                4\r
+#define M_MORE_MIJBH                    5\r
+#define M_NO_ROM_FILENAME               6\r
+#define M_ROM_FILENAME_TOO_LONG         7\r
+#define M_ILLEGAL_ROM_FILENAME          8\r
+#define M_NO_LIST_FILENAME              9\r
+#define M_LIST_FILENAME_TOO_LONG       10\r
+#define M_ILLEGAL_LIST_FILENAME        11\r
+#define M_NO_OUTPUT_FILENAME           12\r
+#define M_OUTPUT_FILENAME_TOO_LONG     13\r
+#define M_ILLEGAL_OUTPUT_FILENAME      14\r
+#define M_MULTIPLE_OUTPUT              15\r
+#define M_INPUT_FILENAME_TOO_LONG      16\r
+#define M_ILLEGAL_INPUT_FILENAME       17\r
+#define M_MULTIPLE_INPUT               18\r
+#define M_ERRORS                       19\r
+#define M_WARNINGS                     20\r
+#define M_CODE                         21\r
+#define M_ROM                          22\r
+#define M_DATA                         23\r
+#define M_UNUSED_CODE                  24\r
+#define M_UNUSED_ROM                   25\r
+#define M_EMPTY_CODE                   26\r
+#define M_DEVICE_HEADER                27\r
+#define M_NO_INCLUDEPATH              28\r
+#define M_TOO_MANY_INCPATHS           29\r
+#define M_INCPATH_TOO_LONG            30\r
+#define MESSAGE_MESSAGES_LAST          30\r
+\r
+/// Message count ////////////////////////////////////////////////////////////\r
+\r
+#define MESSAGES_WARNING               MESSAGE_WARNING_LAST\r
+#define MESSAGES_ERROR                 MESSAGE_ERROR_LAST\r
+#define MESSAGES_FATAL                 MESSAGE_FATAL_LAST\r
+#define MESSAGES_MESSAGES              MESSAGE_MESSAGES_LAST\r
+\r
+#define MESSAGE_OFFSET_WARNING         0\r
+#define MESSAGE_OFFSET_ERROR           MESSAGES_WARNING\r
+#define MESSAGE_OFFSET_FATAL           (MESSAGES_WARNING + MESSAGES_ERROR + 1)\r
+#define MESSAGE_OFFSET_MESSAGES        (MESSAGE_OFFSET_FATAL+MESSAGES_FATAL+1)\r
+\r
+\r
+#define MESSAGE_COUNT                  (4+MESSAGES_WARNING+MESSAGES_ERROR+\\r
+                                         MESSAGES_FATAL+MESSAGES_MESSAGES)\r
+\r
+/// Languages ////////////////////////////////////////////////////////////////\r
+\r
+#define LANGUAGE_US                    1  // US English\r
+#define LANGUAGE_DE                    2  // German\r
+#define LANGUAGE_SP                    3  // Spanish\r
+\r
+/// Message strings //////////////////////////////////////////////////////////\r
+\r
+#ifdef AVRLANG\r
+#if   AVRLANG == LANGUAGE_DE\r
+#include "msg_de.hh"\r
+#elif AVRLANG == LANGUAGE_US\r
+#include "msg_us.hh"\r
+#elif AVRLANG == LANGUAGE_SP\r
+#include "msg_sp.hh"\r
+#else\r
+#error "Invalid language selected"\r
+#endif /* AVRLANG */\r
+#else\r
+#error "No language selected"\r
+#endif\r
+\r
+#endif /* _MESSAGES_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/msg_de.hh b/src/mkutil/tavrasm.118/src/msg_de.hh
new file mode 100644 (file)
index 0000000..658431d
--- /dev/null
@@ -0,0 +1,243 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : msg_de.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : German assembler messages\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980127      : Tom - File created - Messages received from Uwe Bonnes.\r
+//  991222      : Kurt- New command line option -x\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _MSG_DE_HH_\r
+#define _MSG_DE_HH_\r
+\r
+// Command line info /////////////////////////////////////////////////////////\r
+\r
+#define HELPSTR                                            \\r
+"usage: tavrasm [-vwclxmihjgbafd] <infile> "               \\r
+"               [-I <includepath>]... [-o <outfile>] [-r <rom>] [-e <listfile>]\n" \\r
+"       -v verbose\n"                                      \\r
+"       -w no warnings\n"                                  \\r
+"       -c case sensitive labels/defines\n"                \\r
+"       -l limit log width to 80 characters\n"             \\r
+"       -x allow local labels\n"                           \\r
+"       -m output Motorola S-record format\n"              \\r
+"       -i output Intel HEX format (default)\n"            \\r
+"       -h omit address extension record from Intel HEX files\n" \\r
+"       -j output .obj format\n"                           \\r
+"       -g output generic hex\n"                           \\r
+"       -b output binary format\n"                         \\r
+"       -a wrap relative jumps\n"                          \\r
+"       -f allow forward org's\n"                          \\r
+"       -d list supported devices\n"                           \r
+\r
+/// Message strings //////////////////////////////////////////////////////////\r
+\r
+#ifdef _UTILS_CC_\r
+\r
+char messages[MESSAGE_COUNT][MESSAGES_LEN]=\r
+{\r
+  "Keine Warnung",\r
+  "Ungültiger Character \'%c\' im Quelltext",\r
+  "Ungültiger Character 0x%02X im Quelltext",\r
+  "Argument @%i angegeben, aber nicht im Makro benutzt",\r
+  "Argument @%i nicht angegeben, aber im Makro benutzt",\r
+  "\'%s\' wurde schon in Zeile %i in Routine \'%s als Label definiert\'",\r
+  "\'%s\' wurde schon in Zeile %i in Routine \'%s definiert\'",\r
+  "Ganzzahlergebnis von EXP2(%i) wurde Null gesetzt",\r
+  "Ganzzahlergebnis von LOG2(%i) wurde Null gesetzt",\r
+  "Bit Nummer '\%i\' ist außerhalb des Bereichs (0-7)",\r
+  "I/O Port 0x%X ist außerhalb des Bereichs (0x00-0x1F)",\r
+  "I/O Port 0x%X ist außerhalb des Bereichs (0x00-0x3F)",\r
+  "Bit mask 0x%X ist außerhalb des Bereichs (0x00-0xFF)",\r
+  "Konstante 0x%X ist außerhalb des Bereichs (0x00-0x3F)",\r
+  "Konstante 0x%X ist außerhalb des Bereichs (0x00-0xFF)",\r
+  "Konstante 0x%X ist außerhalb des Bereichs (0x00-0xFFFF)",\r
+  "Adresse 0x%X ist außerhalb des Bereichs (0x0-0xFFFF)",\r
+  "Versatz \'%X\' ist außerhalb des Bereichs (0x00 - 0x3F)",\r
+  "ZielAdresse \'0x%X\' ist außerhalb des Bereichs (0x0-0x3FFFFF)",\r
+  "Wert %i ist außerhalb des Bereichs .db (-128 to 255)",\r
+  "Wert %i ist außerhalb des Bereichs .dw (-32768 to 65535)",\r
+  "Wert %i setzt PC (um %i Worte) im Kode zurück",\r
+  "Wert %i überschreibt EEPROM Daten (um %i Byte(s))",\r
+  "Wert %i überschreibt Daten (um %i Byte(s))",\r
+  "Wert %i überschreibt Register oder I/O Bereich (um %i Byte(s))",\r
+  "SRAM Größe um %i byte(s) überschritten",\r
+  "Unbenutzter Parameter @%i in Makro Definition",\r
+  "Directive '.listmac' nicht unterstützt (ignoriert)",\r
+  "Directive '.list' nicht unterstützt (ignoriert)",\r
+  "Directive '.nolist' nicht unterstützt (ignoriert)",\r
+  "\'%s\' für diesen Baustein nicht unterstützt",\r
+  "Unbekannter Baustein \'%s\'",\r
+  "Konstante zu groß",\r
+  "Bezeichner zu lang",\r
+  "EEPROM Größe um %i byte(s) überschritten",\r
+  "Illegaler oktaler Escapewert",\r
+  "Illegaler hex Escapewert",\r
+  "Oktaler Escapewert außerhalb des Bereichs",\r
+  "Illegale Character Konstante",\r
+  "Flash Speichergröße um %i word(s) überschritten",\r
+  "Macro name too long",\r\r
+\r
+  /// Error messages /////////////////////////////////////////////////////////\r
+\r
+  "Kein Fehler"\r
+  "Undefinierte Variable referenziert",\r
+  "Undefinierte Variable referenziert in Bit Nummer",\r
+  "Undefinierte Variable referenziert in I/O Port Adresse",\r
+  "Undefinierte Variable referenziert in Sprung",\r
+  "Undefinierte Variable referenziert in Bitmaske",\r
+  "Undefinierte Variable referenziert in Konstante",\r
+  "Undefinierte Variable referenziert in Adresse",\r
+  "Undefinierte Variable referenziert in Versatz",\r
+  "Undefinierte Variable referenziert in relativen Aufruf",\r
+  "Undefinierte Variable referenziert in relativen Sprung",\r
+  "Undefinierte Variable referenziert in Sprung/Aufruf",\r
+  "Undefinierte Variable referenziert in Konstante in .db",\r
+  "Undefinierte Variable referenziert in Konstante in .dw",\r
+  "Undefinierte Variable referenziert in Offset",\r
+  "Undefinierte Variable referenziert in Konstante in .byte",\r
+  "Division durch Null",\r
+  "Ungültiges register (r16-r31)",\r
+  "Ungültiges register %s",\r
+  "Verzweigung (rückwärts) überschreitet Bereich um %i Worte",\r
+  "Verzweigung (vorwärts) überschreitet Bereich um %i Worte",\r
+  "Ungültiges Register (r24/r26/r28/r30)",\r
+  "Ungültiges Quellregister r%i (X/Y/Z)",\r
+  "Ungültiges Zielregister r%i (X/Y/Z)",\r
+  "Aufruf (rückwärts) überschreitet Bereich um %i Worte",\r
+  "Aufruf (vorwärts) überschreitet Bereich um %i Worte",\r
+  "Sprung (rückwärts) überschreitet Bereich um %i Worte",\r
+  "Sprung (vorwärts) überschreitet Bereich um %i Worte",\r
+  "Label \'%s\' bereits in Zeile %i in \'%s\' definiert",\r
+  "Label \'%s\' bereits in Zeile %i in \'%s\' definiert",\r
+  "Variable \'%s\' bereits in Zeile %i in \'%s\' als Label definiert",\r
+  ".dw in DSEG (nur in CSEG and ESEG zulässig)",\r
+  ".db in DSEG (nur in CSEG and ESEG zulässig)",\r
+  "Makro \'%s\' bereits definiert (oder Label doppelt verwendet)",\r
+  "Programkode in DSEG (nur in CSEG erlaubt)",\r
+  "Programkode in ESEG (nur in CSEG erlaubt)",\r
+  "Include \'%s\' kann nicht verarbeitet werden  - zu viele Includedateien", /*FIXME*/\r
+  "Ungültiger Name für Includedatei",\r
+  "Datei \'%s\' kann nicht geöffnet werden",\r
+  "Makro kann nicht aufgelöst werden - zu viele Makroebenen",/*FIXME*/\r
+  "Dateiende in Makrodefinition erreicht",\r
+  "Dateiname zu lang in Zeile %i in \'%s\'",\r
+  "Ungültiger Dateiname",\r
+  "Register erwartet",\r
+  "Ungültiges Register verwendet",\r
+  "Ungültiges Register oder immediate",/*FIXME*/\r
+  "Ungültige immediate Konstante",/*FIXME*/\r
+  "Unerwartetes Argument",\r
+  "Unbekannter Opcode",\r
+  "ID = register erwartet",\r
+  "Wert (,Wert ,...) erwartet",\r
+  "Argumente dürfen nicht angegeben werden",\r
+  "Wert/Label erwartet",\r
+  "ID = Ausdruck erwartet",\r
+  "Bausteinname erwartet",\r
+  "Variablen Deklaration in CSEG",\r
+  "Macro ohne Name",\r
+  "Undefinierte Escapesequence %s",\r
+  "Kein Dateiname angegeben",\r
+  "Macro vor Definition benutzt",\r
+  "Undefinierte Escapesequence \'\\%c\'",\r
+  ".endmacro Directive nicht erwartet",\r
+  "Macro Definition innerhalb Makro nicht erlaubt",\r
+  "Register, Versatz erwartet",\r
+  "Versatz, Register erwartet",\r
+  "Für X kann kein Versatz angegeben werden ( nur für Y/Z)",\r
+  "Invalid register r%d (expected r23-r31)",\r
+  "Displacement can not be specified here",\r
+  "Invalid register specified, expected 'Z'",\r
+  "Pre-increment is invalid here (use 'Z' or 'Z+')",\r
+  "Invalid register r%d (expected r%d-r%d)",\r
+  "Invalid register r%d (expected r0, r2, ...)",\r
+\r
+  /// Fatal errors ///////////////////////////////////////////////////////////\r
+\r
+  "Kein fataler Fehler",\r
+  "Speicherbedarf zu groß",\r
+  "Zeile zu kang in \'%s\'",\r
+  "Makro mit zu langer Zeile in %i in \'%s\'",\r
+  "Eingabedatei kann nicht geöffnet werden \'%s\'",\r
+  "Listdatei kann nicht geöffnet werden \'%s\'",\r
+  "Ausgabedatei kann nicht geöffnet werden\'%s\'",\r
+  "ROM Datei kann nicht geöffnet werden \'%s\'",\r
+  "Zu viele Includedateinen",\r
+  "Kodegröße überschritten",\r
+  "EEPROM Größe überschritten",\r
+  "Makroschachtelung zu tief",\r
+\r
+  /// Messages ///////////////////////////////////////////////////////////////\r
+\r
+  "Keine Mitteilung",\r
+  "Leere ROM Datei",\r
+  "ROM Datei kann nicht im .obj Formay gespeichert werden",\r
+  "Keine Eingabedatei angegeben",\r
+  "Unbekannte Option '%s'",\r
+  "Mehr Optionen als m/i/j/b/h angegeben",\r
+  "Keine ROM Datei angegeben",\r
+  "Rom Dateiname zu lang",\r
+  "Ungültiger Name für ROM Datei",\r
+  "Keine Listdatei angegeben",\r
+  "Name für Listdatei zu lang",\r
+  "Ungültiger Name für Listdatei",\r
+  "Name für Ausgabedatei fehlt",\r
+  "Name für Ausgabedatei zu lang",\r
+  "Ungültiger Name für Ausgabedatei",\r
+  "Mehrere Namen für Ausgabedatei angegeben",\r
+  "Name für Eingabedatei zu lang",\r
+  "Ungültiger Name für Eingabedatei",\r
+  "Mehrere Namen für Eingabedatei angegeben",\r
+  "Fehler      : %i",\r
+  "Warnungen   : %i",\r
+  "Kode        : %i",\r
+  "Rom         : %i",\r
+  "Data        : %i",\r
+  "Freier Kode : %i",\r
+  "Freies Rom  : %i",\r
+  "Kein Kode erzeugt",\r
+  "| Bausteintype     | Ram Start |Flash Größe |Ram Größe |EEPROM Größe |",\r
+  "No include path found after '-I' flag",\r
+  "Too many include paths specified",\r
+  "Include pathname too long"\r
+};\r
+\r
+#endif /* _UTILS_CC_ */\r
+\r
+#endif /* _MSG_DE_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/msg_sp.hh b/src/mkutil/tavrasm.118/src/msg_sp.hh
new file mode 100644 (file)
index 0000000..848df9a
--- /dev/null
@@ -0,0 +1,245 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  Archivo     : msg_sp.hh\r
+//\r
+//  Autor       : Lluis Ballester - Copyright (C) 1999\r
+//\r
+//  Descripcion : Spanish assembler messages\r
+//\r
+//  Historia\r
+//  ========================================================================\r
+//\r
+//  980127      : Tom - Archivo creado - Mensajes trasladados desde 'message.hh'.\r
+//  991222      : Kurt- New command line option -x\r
+//\r
+//////////////////////////////////////////////////////// Tom hizo esto ///////\r
+//\r
+// Nota Copyright :\r
+//\r
+// tavrasm - Un ensamblador GNU/Linux para las series  Atmel AVR\r
+// de microcontroladoras. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// Este programa es  software gratuito; puedes redistribuirlo y/o modificarlo\r
+// bajo los terminos de la licencia  publica general GNU\r
+// como fue publicado por  la Free Software Foindation (findacion de Software gratuito); desde la\r
+// version 2 de  la Licencia, o (a tu eleccion) cualquier version posterior.\r
+//\r
+// Este programa es distribuido con la esperanza de que sea totalmente funcional,\r
+// pero SIN NINGuN TIPO DE GARANTiA; sin igualmente la garantia incluida de\r
+// MERCHANTABILITY(mercantibilidad) o FITNESS (propiedad) PARA PROPOSITO \r
+// PERSONAL.Ver  la  GNU General Public License( Licencia Publica  General ) para mas detalles.\r
+//\r
+// Deberias haber recibido una copia de la GNU ( Licencia Publica General )\r
+// con este programa ; si no lo has recibido, escribe a la:  Free Software\r
+// Fundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+//\r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+#ifndef _MSG_US_HH_\r
+#define _MSG_US_HH_\r
+\r
+// info linea comandos ///////////////////////////////////////////////////////\r
+\r
+#define HELPSTR                                            \\r
+"uso: tavrasm [-vwclxmihjgbafd] <en_archivo> \n"           \\r
+"             [-I <includepath>]... [-o <archivo_salida>] [-r <rom>] [-e <listarchivo>]\n" \\r
+"       -v verbose\n"                                      \\r
+"       -w no advertencias\n"                              \\r
+"       -c etiquetas case sensitive /defenes\n"            \\r
+"       -l limite ancho log  a 80 caracters\n"             \\r
+"       -x allow local labels\n"                           \\r
+"       -m Formato de salida Motorola S-record \n"         \\r
+"       -i Formato de salida Intel HEX  (default)\n"             \\r
+"       -h omit address extension record from Intel HEX files\n" \\r
+"       -j Formato de salida .obj \n"                      \\r
+"       -g Salida generica hex\n"                          \\r
+"       -b Formato de salida binaria\n"                    \\r
+"       -a wrap relativa jumps\n"                          \\r
+"       -f allow forward org's\n"                          \\r
+"       -d Lista de los dispositivos soportados\n" \r
+\r
+// Cadenas de  mensajes //////////////////////////////////////////////////////\r
+\r
+#ifdef _UTILS_CC_\r
+\r
+char messages[MESSAGE_COUNT][MESSAGES_LEN]=\r
+{\r
+  "No advertencias",\r
+  "Caracter invalido \'%c\' en codigo",\r
+  "Caracter invalido 0x%02X en codigo",\r
+  "Argumento @%i especificados, pero no usado en macro",\r
+  "Argumento @%i no especificado, pero usado en macro",\r
+  "\'%s\' ya definida como etiqueta en linea %i en \'%s\'",\r
+  "\'%s\' ya definida en linea %i en \'%s\'",\r
+  "Resultado Integer  de EXP2(%i) esta fijado a cero",\r
+  "Resultado Integer  de LOG2(%i) esta fijado a cero",\r
+  "Numero bit '\%i\' fuera de rango (0-7)",\r
+  "I/O Pot 0x%X fuera de rango (0x00-0x1F)",\r
+  "I/O Pot 0x%X fuera de rango (0x00-0x3F)",\r
+  "Bit mask 0x%X fuera de rango (0x00-0xFF)",\r
+  "Constante 0x%X fuera de rango (0x00-0x3F)",\r
+  "Constante 0x%X fuera de rango (0x00-0xFF)",\r
+  "Constante 0x%X fuera de rango (0x00-0xFFFF)",\r
+  "Direccion 0x%X fuera de rango (0x0-0xFFFF)",\r
+  "Desplazamiento \'%X\' esta fuera de rango (0x00 - 0x3F)",\r
+  "Direccion de destino \'0x%X\' fuera de rango (0x0-0x3FFFFF)",\r
+  "Valor %i fuera de rango en .db (-128 to 255)",\r
+  "Valor %i fuera de rango en .dw (-32768 to 65535)",\r
+  "Valor %i mueve PC atras sobre codigo (by %i wods)",\r
+  "Valor %i sobreescribe informacion EEPROM (by %i byte(s))",\r
+  "Valor %i sobreescribe informacion (by %i byte(s))",\r
+  "Valor %i sobreescribe Registro o I/O area (by %i byte(s))",\r
+  "SRAM tamanyo excedido por  %i byte(s)",\r
+  " Parametro no usado  @%i en definicion de macro",\r
+  "La directiva '.listmac' no es soportada (ignorada)",\r
+  "La directiva '.list' no es soportada  (ignorada)",\r
+  "La directiva '.nolist' is nosuppoted (ignorada)",\r
+  "\'%s\' no soportado por este dispositivo",\r
+  "Dispositivo desconocido \'%s\'",\r
+  "Constante demasiada grande",\r
+  "Identificador demasiado largo",\r
+  "Tamanyo EEPROM excedido por  %i byte(s)",\r
+  "Valor de escape octal ilegal"\r
+  "Valor de escape hexadecimal  ilegal",\r
+  "Valor Octal de escape fuera de rango",\r
+  " Caracter de constante ilegal",\r
+  "Tamanyo flash excedido por %i word(s)",\r
+  "Macro name too long",\r
+\r
+  /// Mensajes de error //////////////////////////////////////////////////////\r
+\r
+  "No error"\r
+  "Variable referenciada indefinida "\r
+  "Variable referenciada indefinida en numero bit ",\r
+  "Variable referenciada indefinida en I/O puerto direccion",\r
+  "Variable referenciada indefinida en rama",\r
+  "Variable referenciada indefinida en bit mask",\r
+  "Variable referenciada indefinida en constante",\r
+  "Variable referenciada indefinida en direccion",\r
+  "Variable referenciada indefinida en desplazamiento",\r
+  "Variable referenciada indefinida en relative call",\r
+  "Variable referenciada indefinida en relative jump",\r
+  "Variable referenciada indefinida en jump/call",\r
+  "Variable referenciada indefinida en constante en .db",\r
+  "Variable referenciada indefinida en constante en .dw",\r
+  "Variable referenciada indefinida en offset",\r
+  "Variable referenciada indefinida en constante en .byte",\r
+  "Division por cero",\r
+  "Registro invalido (r16-r31)",\r
+  "Registro invalido %s",\r
+  "Rama fuera de rango por %i words (por detras)",\r
+  "Rama fuera de rango por %i words (por delante)",\r
+  "Registro invalido (r24/r26/r28/r30)",\r
+  "Registro de codigo invalido r%i (X/Y/Z)",\r
+  "Registro de destino invalido r%i (X/Y/Z)",\r
+  "Llamada(call)  fuera de rango por %i words (por detras)",\r
+  "Llamada(call) fuera de rango por%i words (por delante)",\r
+  "Jump fuera de rango por %i words (por detras)",\r
+  "Jump fuera de rango por %i words (por delante)",\r
+  "Etiqueta \'%s\' ya definida en linea %i en \'%s\'",\r
+  "Etiqueta \'%s\' ya definida en linea %i en \'%s\'",\r
+  "Variable \'%s\' ya definida como etiqueta en  linea %i en \'%s\'",\r
+  ".dw en DSEG (solo permitido en CSEG y ESEG)",\r
+  ".db en DSEG (solo permitido en  CSEG y ESEG)",\r
+  "Macro \'%s\' ya definida (o etiqueta duplicada)",\r
+  "Codigo de programa en DSEG (solo permitido en CSEG)",\r
+  "Codigo de programa en ESEG (solo permitido en  CSEG)",\r
+  "Imposible  incluir archivo \'%s\' - incluir profundidad(depth) excedida",\r
+  "Nombre de archivo incluido invalido especificado",\r
+  "Imposible abrir archivo \'%s\'",\r
+  "Imposible expandir macro - profundidad contextual (context depth) excedida",\r
+  "Final de archivo alcanzado en definicion de macro",\r
+  "Nombre de archivo demasiado largo en linea  %i en \'%s\'",\r
+  "Invalido nombre de archivo",\r
+  "Registro esperado",\r
+  "Registro invalido especificado",\r
+  "Registro invalido o inmediato",\r
+  "Constante inmediata invalida",\r
+  "No argumento esperado",\r
+  "Desconocido opcodigo",\r
+  "Esperado ID = registro",\r
+  "Esperado valor (,valor ,...) ",\r
+  "No argumentos deben ser especificados",\r
+  "Esperado valor/etiqueta",\r
+  "Esperado ID = expresion",\r
+  "Esperado nombre de dispositivo",\r
+  "Declaracion de variable en CSEG",\r
+  "Macro sin nombre",\r
+  "Secuencia de escape indefinida %s",\r
+  "No nombre de archivo especificado",\r
+  "Macro usada antes definida",\r
+  "Secuencia de escape indefinida \'\\%c\'",\r
+  "Inesperada directiva .finalmacro ",\r
+  "Definicion de macro dentro de macro no permitida",\r
+  "Registro esperado, desplazamiento",\r
+  "Desplazamiento esperado, registro",\r
+  "No desplazamiento pueden ser especificados para X (usar Y/Z)",\r
+  "Invalid register r%d (expected r23-r31)",\r
+  "Displacement can not be specified here",\r
+  "Invalid register specified, expected 'Z'",\r
+  "Pre-increment is invalid here (use 'Z' or 'Z+')",\r
+  "Invalid register r%d (expected r%d-r%d)",\r
+  "Invalid register r%d (expected r0, r2, ...)",\r
+\r
+  /// Errores fatales ////////////////////////////////////////////////////////\r
+\r
+  "No error fatal",\r
+  "Fuera de memoria",\r
+  "Linea demasiada larga en \'%s\'",\r
+  "Linea de macro demasiado larga en linea %i en \'%s\'",\r
+  "Imposible abrir archivo de entrada \'%s\'",\r
+  "Imposible abrir archivo list\'%s\'",\r
+  "Imposible abrir archivo de salida \'%s\'",\r
+  "Imposible abrir archivo rom\'%s\'",\r
+  "Demasiados archivos incluidos",\r
+  "Tamanyo de codigo excedido",\r
+  "Tamanyo EEPROM excedido",\r
+  "Profundidad maxima de macro excedida",\r
+\r
+  /// Mensajes ///////////////////////////////////////////////////////////////\r
+\r
+  "No mensaje",\r
+  "Archivo rom vacio",\r
+  "No se puede salvar archivo rom con formato .obj",\r
+  "No nombre de archivo de entrada especificado",\r
+  "Opcion desconocida '%s'",\r
+  "Mas de uno de m/i/j/b/h especificados",\r
+  "No nombre de archivo rom especificados",\r
+  "Nombre de archivo rom demasiado largo",\r
+  "Nombre de Archivo rom ilegal",\r
+  "No nombre de archivo rom especificado",\r
+  "Lista de nombre de archivos demasiada larga",\r
+  "Lista de nombres de archivos ilegal",\r
+  "No nombre de archivo de salida especificado",\r
+  "Nombre de archivo de salida demasiado largo",\r
+  "Nombre de archivo de salida ilegal",\r
+  "Multiples archivos de salida especificados",\r
+  "Nombre de entrada demasiado largo ",\r
+  "Nombre de entrada ilegal",\r
+  "Multitud de archivos de entrada especificados",\r
+  "Errores           : %i",\r
+  "Advertencias      : %i",\r
+  "Codigo            : %i",\r
+  "Rom               : %i",\r
+  "Informacion(data) : %i",\r
+  "Codigo sin usar   : %i",\r
+  "Rom sin usar      : %i",\r
+  "No codigo generado",\r
+  "| Dispositivo      | Ram start | Flash      | Ram      | EEPROM      |",\r
+  "No include path found after '-I' flag",\r
+  "Too many include paths specified",\r
+  "Include pathname too long"\r
+\r
+};\r
+\r
+#endif /* _UTILS_CC_ */\r
+\r
+#endif /* _MESSAGES_HH_ */\r
+\r
+/// FINAL DE ARCHIVO /////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/msg_us.hh b/src/mkutil/tavrasm.118/src/msg_us.hh
new file mode 100644 (file)
index 0000000..3678da2
--- /dev/null
@@ -0,0 +1,243 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : msg_us.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : US assembler messages\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980127      : Tom - File created - Messages moved from 'message.hh'.\r
+//  991222      : Kurt- New command line option -x\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _MSG_US_HH_\r
+#define _MSG_US_HH_\r
+\r
+// Command line info /////////////////////////////////////////////////////////\r
+\r
+#define HELPSTR                                                 \\r
+"usage: tavrasm [-vwclxmihjgbafd] <infile> \n"                  \\r
+"               [-I <includepath>]... [-o <outfile>] [-r <rom>] [-e <listfile>]\n" \\r
+"       -v verbose\n"                                           \\r
+"       -w no warnings\n"                                       \\r
+"       -c case sensitive labels/defines\n"                     \\r
+"       -l limit log width to 80 characters\n"                  \\r
+"       -x allow local labels\n"                                \\r
+"       -m output Motorola S-record format\n"                   \\r
+"       -i output Intel HEX format (default)\n"                 \\r
+"       -h omit address extension record from Intel HEX files\n"\\r
+"       -j output .obj format\n"                                \\r
+"       -g output generic hex\n"                                \\r
+"       -b output binary format\n"                              \\r
+"       -a wrap relative jumps\n"                               \\r
+"       -f allow forward org's\n"                               \\r
+"       -d list supported devices\n"                           \r
+\r
+// Message strings ///////////////////////////////////////////////////////////\r
+\r
+#ifdef _UTILS_CC_\r
+\r
+char messages[MESSAGE_COUNT][MESSAGES_LEN]=\r
+{\r
+  "No warning",\r
+  "Invalid character \'%c\' in source",\r
+  "Invalid character 0x%02X in source",\r
+  "Argument @%i specified, but not used in macro",\r
+  "Argument @%i not specified, but used in macro",\r
+  "\'%s\' already defined as label at line %i in \'%s\'",\r
+  "\'%s\' already defined at line %i in \'%s\'",\r
+  "Integer result of EXP2(%i) is set to zero",\r
+  "Integer result of LOG2(%i) is set to zero",\r
+  "Bit number '%i' out of range (0-7)", /* Nick */\r
+  "I/O Port 0x%X out of range (0x00-0x1F)",\r
+  "I/O Port 0x%X out of range (0x00-0x3F)",\r
+  "Bit mask 0x%X out of range (0x00-0xFF)",\r
+  "Constant 0x%X out of range (0x00-0x3F)",\r
+  "Constant 0x%X out of range (0x00-0xFF)",\r
+  "Constant 0x%X out of range (0x00-0xFFFF)",\r
+  "Address 0x%X out of range (0x0-0xFFFF)",\r
+  "Displacement \'%X\' is out of range (0x00 - 0x3F)",\r
+  "Destination address \'0x%X\' out of range (0x0-0x3FFFFF)",\r
+  "Value %i out of range in .db (-128 to 255)",\r
+  "Value %i out of range in .dw (-32768 to 65535)",\r
+  "Value %i moves PC back over code (by %i words)",\r
+  "Value %i overwrites EEPROM data (by %i byte(s))",\r
+  "Value %i overwrites data (by %i byte(s))",\r
+  "Value %i overwrites Register or I/O area (by %i byte(s))",\r
+  "SRAM size exceeded by %i byte(s)",\r
+  "Unused parameter @%i in macro definition",\r
+  "The directive '.listmac' is not supported (ignored)",\r
+  "The directive '.list' is not supported (ignored)",\r
+  "The directive '.nolist' is not supported (ignored)",\r
+  "\'%s\' not supported on this device",\r
+  "Unknown device \'%s\'",\r
+  "Constant too big",\r
+  "Identifier too long",\r
+  "EEPROM size exceeded by %i byte(s)",\r
+  "Illegal octal escape value",\r
+  "Illegal hex escape value",\r
+  "Octal escape value out of range",\r
+  "Illegal character constant",\r
+  "Flash size exceeded by %i word(s)",\r
+  "Macro name too long",\r
+\r
+  /// Error messages /////////////////////////////////////////////////////////\r
+\r
+  "No error"\r
+  "Undefined variable referenced",\r
+  "Undefined variable referenced in bit number",\r
+  "Undefined variable referenced in I/O port address",\r
+  "Undefined variable referenced in branch",\r
+  "Undefined variable referenced in bit mask",\r
+  "Undefined variable referenced in constant",\r
+  "Undefined variable referenced in address",\r
+  "Undefined variable referenced in displacement",\r
+  "Undefined variable referenced in relative call",\r
+  "Undefined variable referenced in relative jump",\r
+  "Undefined variable referenced in jump/call",\r
+  "Undefined variable referenced in constant in .db",\r
+  "Undefined variable referenced in constant in .dw",\r
+  "Undefined variable referenced in offset",\r
+  "Undefined variable referenced in constant in .byte",\r
+  "Division by zero",\r
+  "Invalid register (r16-r31)",\r
+  "Invalid register %s",\r
+  "Branch out of range by %i words (backwards)",\r
+  "Branch out of range by %i words (forward)",\r
+  "Invalid register (r24/r26/r28/r30)",\r
+  "Invalid source register r%i (X/Y/Z)",\r
+  "Invalid destination register r%i (X/Y/Z)",\r
+  "Call out of range by %i words (backwards)",\r
+  "Call out of range by %i words (forward)",\r
+  "Jump out of range by %i words (backwards)",\r
+  "Jump out of range by %i words (forward)",\r
+  "Label \'%s\' already defined at line %i in \'%s\'",\r
+  "Label \'%s\' already defined at line %i in \'%s\'",\r
+  "Variable \'%s\' already defined as label at line %i in \'%s\'",\r
+  ".dw in DSEG (only allowed in CSEG and ESEG)",\r
+  ".db in DSEG (only allowed in CSEG and ESEG)",\r
+  "Macro \'%s\' already defined (or duplicates label)",\r
+  "Program code in DSEG (only allowed in CSEG)",\r
+  "Program code in ESEG (only allowed in CSEG)",\r
+  "Unable to include file \'%s\' - include depth exceeded",\r
+  "Invalid include filename specified",\r
+  "Unable to open file \'%s\'",\r
+  "Unable to expand macro - context depth exceeded",\r
+  "End of file reached in macro definition",\r
+  "Filename too long at line %i in \'%s\'",\r
+  "Invalid filename",\r
+  "Register expected",\r
+  "Invalid register specified",\r
+  "Invalid register or immediate",\r
+  "Invalid immediate constant",\r
+  "No argument expected",\r
+  "Unknown opcode",\r
+  "Expected ID = register",\r
+  "Expected value (,value ,...) ",\r
+  "No arguments should be specified",\r
+  "Expected value/label",\r
+  "Expected ID = expression",\r
+  "Expected device name",\r
+  "Variable declaration in CSEG",\r
+  "Macro with no name",\r
+  "Undefined escape sequence %s",\r
+  "No filename specified",\r
+  "Macro used before it is defined",\r
+  "Undefined escape sequence \'\\%c\'",\r
+  "Unexpected .endmacro directive",\r
+  "Macro definition within macro not allowed",\r
+  "Expected register, displacement",\r
+  "Expected displacement, register",\r
+  "No displacement can be specified for X (use Y/Z)",\r
+  "Invalid register r%d (expected r23-r31)",\r
+  "Displacement can not be specified here",\r
+  "Invalid register specified, expected 'Z'",\r
+  "Pre-increment is invalid here (use 'Z' or 'Z+')",\r
+  "Invalid register r%d (expected r%d-r%d)",\r
+  "Invalid register r%d (expected r0, r2, ...)",\r
+\r
+  /// Fatal errors ///////////////////////////////////////////////////////////\r
+\r
+  "No fatal error",\r
+  "Out of memory",\r
+  "Line too long in \'%s\'",\r
+  "Macro line too long at line %i in \'%s\'",\r
+  "Unable to open input file \'%s\'",\r
+  "Unable to open list file \'%s\'",\r
+  "Unable to open output file \'%s\'",\r
+  "Unable to open rom file \'%s\'",\r
+  "Too many files included",\r
+  "Code size exceeded",\r
+  "EEPROM size exceeded",\r
+  "Max macro depth exceeded",\r
+\r
+  /// Messages ///////////////////////////////////////////////////////////////\r
+\r
+  "No message",\r
+  "Empty rom file",\r
+  "Can not save rom file with .obj format",\r
+  "No input filename specified",\r
+  "Unknown option '%s'",\r
+  "More than one of m/i/j/b/h specified",\r
+  "No rom filename specified",\r
+  "Rom filename too long",\r
+  "Illegal rom filename",\r
+  "No list filename specified",\r
+  "List filename too long",\r
+  "Illegal list filename",\r
+  "No output filename specified",\r
+  "Output filename too long",\r
+  "Illegal output filename",\r
+  "Multiple output files specified",\r
+  "Input filename too long",\r
+  "Illegal input filename",\r
+  "Multiple input files specified",\r
+  "Errors      : %i",\r
+  "Warnings    : %i",\r
+  "Code        : %i",\r
+  "Rom         : %i",\r
+  "Data        : %i",\r
+  "Unused Code : %i",\r
+  "Unused Rom  : %i",\r
+  "No code generated",\r
+  "| Device name      | Ram start | Flash Size | Ram size | EEPROM Size |",\r
+  "No include path found after '-I' flag",\r
+  "Too many include paths specified",\r
+  "Include pathname too long"\r
+};\r
+\r
+#endif /* _UTILS_CC_ */\r
+\r
+#endif /* _MESSAGES_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/n.bat b/src/mkutil/tavrasm.118/src/n.bat
new file mode 100644 (file)
index 0000000..14eb118
--- /dev/null
@@ -0,0 +1,6 @@
+del tavrasm.exe\r
+cl -Zi -I. -DAVRLANG=LANGUAGE_US -otavrasm.exe -Tpavrasm.cc -Tpsemantic.cc -Tpsymbol.cc -Tputils.cc -Tpavrparse.cc -Tpavrlex.cc\r
+del *.obj\r
+del *.pdb\r
+del *.ilk\r
+copy tavrasm.exe ..\..\..\bin\r
diff --git a/src/mkutil/tavrasm.118/src/opcodes.hh b/src/mkutil/tavrasm.118/src/opcodes.hh
new file mode 100644 (file)
index 0000000..35235b0
--- /dev/null
@@ -0,0 +1,227 @@
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : opcodes.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : ATMEL AVR opcodes\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _OPCODES_HH_\r
+#define _OPCODES_HH_\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include "avrasm.hh"\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Branch instructions   - [1111 0#-- ---- -###]\r
+//\r
+\r
+#define O_BRCC      0xF400  // i  Branch if Carry Cleared\r
+#define O_BRCS      0xF000  // i  Branch if Carry Set\r
+#define O_BRNE      0xF401  // i  Branch if Not Equal\r
+#define O_BREQ      0xF001  // i  Branch if Equal\r
+#define O_BRPL      0xF402  // i  Branch if Plus\r
+#define O_BRMI      0xF002  // i  Branch if Minus\r
+#define O_BRVC      0xF403  // i  Branch if Overflow Cleared\r
+#define O_BRVS      0xF003  // i  Branch if Overflow Set\r
+#define O_BRGE      0xF404  // i  Branch if Greater or Equal (Signed)\r
+#define O_BRLT      0xF004  // i  Branch if Less Than (Signed)\r
+#define O_BRHC      0xF405  // i  Branch if Half Carry Flag is Cleared\r
+#define O_BRHS      0xF005  // i  Branch if Half Carry Flag is Set\r
+#define O_BRTC      0xF406  // i  Branch if the T Flag is Cleared\r
+#define O_BRTS      0xF006  // i  Branch if the T Flag is Set\r
+#define O_BRID      0xF407  // i  Branch if Global Interrupt is Disabled\r
+#define O_BRIE      0xF007  // i  Branch if Global Interrupt is Enabled\r
+#define O_BRSH   (8+0xF400) // i  Branch if Same or Higher (Unsigned)(BRCC)\r
+#define O_BRLO   (8+0xF000) // i  Branch if Lower                    (BRCS)\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Noarg instructions    - [1001 0100 #### 0100]\r
+//\r
+\r
+#define O_SEC       0x9408  //    Set Carry Flag\r
+#define O_SEZ       0x9418  //    Set Zero Flag\r
+#define O_SEN       0x9428  //    Set Negative Flag\r
+#define O_SEV       0x9438  //    Set Overflow Flag\r
+#define O_SES       0x9448  //    Set Signed Flag\r
+#define O_SEH       0x9458  //    Set Half Carry Flag\r
+#define O_SET       0x9468  //    Set T Flag\r
+#define O_SEI       0x9478  //    Set Global Interrupt Flag\r
+\r
+#define O_CLC       0x9488  //    Clear Carry Flag\r
+#define O_CLZ       0x9498  //    Clear Zero Flag\r
+#define O_CLN       0x94A8  //    Clear Negative Flag\r
+#define O_CLV       0x94B8  //    Clear Overflow Flag\r
+#define O_CLS       0x94C8  //    Clear Signed Flag\r
+#define O_CLH       0x94D8  //    Clear Half Carry Flag\r
+#define O_CLT       0x94E8  //    Clear T Flag\r
+#define O_CLI       0x94F8  //    Clear Global Interrupt Flag\r
+\r
+#define O_NOP       0x0000  //    No Operation\r
+#define O_ICALL     0x9509  //    Indirect Call to Subroutine\r
+#define O_IJMP      0x9409  //    Indirect Jump\r
+\r
+#define O_RETI      0x9518  //    Return from Interrupt\r
+#define O_RET       0x9508  //    Return from Subroutine\r
+#define O_SLEEP     0x9588  //    Sleep\r
+#define O_WDR       0x95A8  //    Wathcdog Reset\r
+\r
+#define O_EIJMP     0x9419  //    Extended indirect jump                  (1)\r
+#define O_EICALL    0x9519  //    Extended indirect call to subroutine    (1)\r
+#define O_ESPM      0x95F8  //    Extended store program memory           (1)\r
+#define O_SPM       0x95E8  //    Store program memory                    (1)\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Reg/Reg instructions  - [#-## ##-- ---- ----]\r
+//\r
+\r
+#define O_CPC       0x0400  // rr Compare with Carry\r
+#define O_CP        0x1400  // rr Compare\r
+#define O_SBC       0x0800  // rr Subtract with Carry\r
+#define O_SUB       0x1800  // rr Subtract without Carry\r
+#define O_ADD       0x0C00  // rr Add without Carry\r
+#define O_ADC       0x1C00  // rr Add with Carry\r
+#define O_CPSE      0x1000  // rr Compares Skip if Equal\r
+#define O_AND       0x2000  // rr Logical AND\r
+#define O_EOR       0x2400  // rr Exclusive OR\r
+#define O_OR        0x2800  // rr Logical OR\r
+#define O_MOV       0x2C00  // rr Copy Register\r
+#define O_MUL       0x9C00  // rr Multiply\r
+#define O_MOVW      0x0100  // rr Copy register word                     (1)\r
+#define O_MULS      0x0200  // rr Multiply Signed                         (1)\r
+#define O_MULSU     0x0300  // rr Multiply Signed with Unsiged            (1)\r
+#define O_FMUL      0x0308  // rr Fractional Multiply                     (1)\r
+#define O_FMULS     0x0380  // rr Fractional Multiply Signed              (1)\r
+#define O_FMULSU    0x0388  // rr Fractional Multiply Signed with Unsiged (1)\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Reg/Imm instructions  - [#-## ##-- ---- ----]\r
+//\r
+\r
+  // Reg/Imm word\r
+\r
+#define O_ADIW      0x9600  // rw Add Immediate to Word\r
+#define O_SBIW      0x9700  // rw Subtract Immediate to Word\r
+\r
+  // Reg/imm              - [#### ---- ---- ----]\r
+\r
+#define O_CPI       0x3000  // ri Compare with Immediate\r
+#define O_SBCI      0x4000  // ri Subtract Immediate with Carry\r
+#define O_SUBI      0x5000  // ri Subtract Immediate\r
+#define O_ORI       0x6000  // ri Logical OR with Immediate\r
+#define O_ANDI      0x7000  // ri Logical AND with Immediate\r
+#define O_LDI       0xE000  // ri Load Immediate\r
+#define O_SBR    (1+0x6000) // ri Set Bits in register (Same as ORI)\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Register instructions - [---- ---- ---- ----]\r
+//\r
+\r
+#define O_COM       0x9400  // r  One's Complement\r
+#define O_NEG       0x9401  // r  Two's Complement\r
+#define O_SWAP      0x9402  // r  Swap Nibbles\r
+#define O_INC       0x9403  // r  Increment\r
+#define O_ASR       0x9405  // r  Arithmetic Shift Right\r
+#define O_LSR       0x9406  // r  Logical Shift Right\r
+#define O_ROR       0x9407  // r  Rotate Right Trough Carry\r
+#define O_DEC       0x940A  // r  Decrement\r
+#define O_POP       0x900F  // r  Pop Register from Stack\r
+#define O_PUSH      0x920F  // r  Push Register on Stack\r
+#define O_CLR    (1+0x2400) // r  Clear Regiser (Same as EOR Rd, Rd)\r
+#define O_TST       0x2000  // r  Test for Zero or Minus\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// immediate instructions - [---- ---- ---- ----]\r
+//\r
+\r
+#define O_BCLR      0x9488  // i  Bit Clear in SREG\r
+#define O_BSET      0x9408  // i  Bit Set in SREG\r
+#define O_RCALL     0xD000  // i  Relative Call To Subroutine\r
+#define O_RJMP      0xC000  // i  Relative Jump\r
+#define O_BRBC      0xF400  // ii Branch if Bit in SREG is Cleared\r
+#define O_BRBS      0xF000  // ii Branch if Bit in SREG is Set\r
+#define O_CBI       0x9800  // ii Clear Bit in I/O Register\r
+#define O_SBI       0x9A00  // ii Set Bit in I/O Register\r
+#define O_SBIC      0x9900  // ii Skip if Bit in I/O Register is Cleared\r
+#define O_SBIS      0x9B00  // ii Skip if Bit in I/O Register is Set\r
+#define O_OUT       0xB800  // ir Store Register to I/O Port\r
+#define O_BLD       0xF800  // ri Bit Load from T in Sreg to bit in Register\r
+#define O_BST       0xFA00  // ri Bit store from Bit in Register to T in SREG\r
+#define O_CBR    (1+0x7000) // ri Clear Bits in Register (Same as ANDI)\r
+#define O_IN        0xB000  // ri Load an I/O Port to register\r
+#define O_SBRC      0xFC00  // ri Skip if Bit in Register is Cleared\r
+#define O_SBRS      0xFE00  // ri Skip if Bit in Register is Set\r
+#define O_ROL    (1+0x1C00) // r  Rotate Left trough Carry (Same as ADC Rd,Rd)\r
+#define O_SER       0xEF0F  // r  Set all bits in Register\r
+#define O_LSL    (1+0x0C00) // r  Logical Shift Left (Same as ADD Rd,Rd)\r
+#define O_JMP       0x940C  // i  Jump\r
+#define O_CALL      0x940E  // i  Long Call to a Subroutine\r
+#define O_LDS       0x9000  // rl Load direct from SRAM\r
+#define O_STS       0x9200  // lr Store direct to SRAM\r
+\r
+#define O_LD        0x8000  // rX Load indirect from SRAM using index X/Y/Z\r
+#define O_ST        0x8200  // Xr Store Indirect to SRAM using index X/Y/Z\r
+#define O_LDD    (8+0x8000) // rD Load indirect from SRAM using displacement\r
+#define O_STD    (8+0x8200) // Dr Store Indirect to SRAM using displacement\r
+\r
+#define O_STD    (8+0x8200) // Dr Store Indirect to SRAM using displacement\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// (E)LPM instructions    - [---- ---- ---- ----]\r
+//\r
+\r
+#define O_LPM       0x95C8  //    Load Program Memory\r
+#define O_ELPM      0x95D8  // __ Extended load program memory            (1)\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+#endif /* _OPCODES_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/semantic.cc b/src/mkutil/tavrasm.118/src/semantic.cc
new file mode 100644 (file)
index 0000000..9e8dc3f
--- /dev/null
@@ -0,0 +1,1659 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : semantic.cc\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Implements code generation functions\r
+//\r
+//  History  \r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//  990516      : Tom - Added support for wrapping in branch/rcall/rjmp\r
+//  990721     : Tom - Fixed SBR (bit 0 was always set)\r
+//  991209     : Tom - Fixed problem with BRBC/BRBS (they did not work :(\r
+//  991211      : Tom - Added the new instructions: 'eijmp', 'eicall', 'espm',\r
+//                      'mulsu', 'fmul', 'fmuls', 'fmulsu', 'muls', 'movw', \r
+//                      'elpm'. And changed behaviour of 'lpm' according to\r
+//                      Atmel specs.\r
+//  991217      : Kurt- Valid range for W_CONST_OUT_OF_RANGE_FF expanded to\r
+//                      -255...255. TODO: Change the error messages.\r
+//  991217      : Kurt- Support of local labels.\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include <string.h>\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+#include <math.h>\r
+#include "avrasm.hh"\r
+#include "semantic.hh"\r
+#include "symbol.hh"\r
+#include "utils.hh"\r
+\r
+/// Externals ////////////////////////////////////////////////////////////////\r
+\r
+GLOBALS(extern);\r
+\r
+/// Functions ////////////////////////////////////////////////////////////////\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle '.device' directive\r
+  //\r
+\r
+void  doDev(symbolSA devicename)\r
+{\r
+  int  devfound = -1;\r
+\r
+  for(int devno=0; (devfound==-1) && yydevices[devno].name[0]; devno++)\r
+  {\r
+    // this is just a stricmp/strcasecmp\r
+\r
+    int c;\r
+\r
+    for(c=0; devicename->name[c] &&\r
+            (tolower(yydevices[devno].name[c]) ==\r
+             tolower(devicename->name[c])); c++);\r
+\r
+    if(!yydevices[devno].name[c] && !devicename->name[c])\r
+      devfound = devno;\r
+  }\r
+\r
+  if(devfound == -1)\r
+    warning(W_UNKNOWN_DEV, devicename -> name);\r
+  else\r
+    yydeviceno = devfound;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle directive '.byte'\r
+  //\r
+\r
+void doByt(valueSA *value)\r
+{\r
+  if(! (value->valid))\r
+    error(E_UNKNOWN_BYTE);\r
+  else if(yysegment == SEGMENT_CODE)\r
+    error(E_VAR_IN_CSEG);\r
+  else if(yysegment == SEGMENT_DATA)\r
+  {\r
+    yydefinestart = yydatapos;\r
+    yydatapos+=value->value;\r
+  }\r
+  else if(yysegment == SEGMENT_EEPROM)\r
+  {\r
+    yydefinestart =  yyerompos;\r
+    yydefinetype  =  SEGMENT_DEFINE_BYTE;\r
+\r
+    for(int c=0;c<value->value;c++)\r
+      insertdata(0);\r
+\r
+    if(yyerompos > DEVINF.eepromsize)\r
+      warning(W_EROM_EXCEED,yyerompos-DEVINF.eepromsize);\r
+  }\r
+  else\r
+    internalerror("BY %04X", yysegment);\r
+\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle directive '.org'\r
+  //\r
+\r
+void doOrg(valueSA *value)\r
+{\r
+  if( !value->valid )\r
+  {\r
+    error(E_UNKNOWN_ORG);\r
+    return;\r
+  }\r
+\r
+  if(yysegment == SEGMENT_CODE)\r
+  {\r
+    if(!yycfg->forwardorg && (value->value < (yycodepos+1)/2))\r
+      warning(W_ORG_OUT_OF_RANGE,value->value,(yycodepos+1)/2-value->value);\r
+    if(yycodeposhigh < yycodepos)\r
+      yycodeposhigh = yycodepos;\r
+    yycodepos = 2*value->value;\r
+  }\r
+  else if(yysegment == SEGMENT_EEPROM)\r
+  {\r
+    if(!yycfg->forwardorg && (value->value < yyerompos))\r
+      warning(W_ORG_OUT_OF_RANGE_ESEG,value->value, yyerompos - value->value);\r
+    if(yyeromposhigh<yyerompos)\r
+      yyeromposhigh = yyerompos;\r
+    yyerompos = value->value;\r
+  }\r
+  else if(yysegment == SEGMENT_DATA)\r
+  {\r
+    if(value->value < DEVINF.datastart)\r
+      warning(W_ORG_OVER_REG,value->value,DEVINF.datastart-value->value);\r
+    else if(!yycfg->forwardorg && (value->value < yydatapos))\r
+      warning(W_ORG_OUT_OF_RANGE_DSEG,value->value, yydatapos - value->value);\r
+    if(yydataposhigh < yydatapos)\r
+      yydataposhigh = yydatapos;\r
+    yydatapos = value->value;\r
+  }\r
+  else\r
+    internalerror("US %08X", yysegment);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Initialize '.db' directive\r
+  //\r
+\r
+void doAdb(void)\r
+{\r
+  if(yysegment == SEGMENT_CODE)\r
+    yydefinestart = yycodepos;\r
+  else if(yysegment == SEGMENT_EEPROM)\r
+    yydefinestart = yyerompos;\r
+  else\r
+    errorin(E_DB_IN_DSEG);\r
+\r
+  yyeol = FALSE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Add '.db' arguments\r
+  //\r
+\r
+void doAdb(valueSA *value)\r
+{\r
+  if( value->valid)\r
+  {\r
+    if( yyeol && ((value->value < -128) || (value->value > 255)) )\r
+      warning(W_DB_OUT_OF_RANGE, value->value);\r
+    else if( (value->value < -128) || (value->value > 255) )\r
+      warningin(W_DB_OUT_OF_RANGE, value->value);\r
+    if(yysegment == SEGMENT_CODE)\r
+      insertdbdw(value->value & 0xFF);\r
+    else if(yysegment == SEGMENT_EEPROM)\r
+      insertdata(value->value & 0xFF);\r
+  }\r
+  else if(yyparseno && !(value->valid) )\r
+    error(E_UNKNOWN_DB);\r
+  else\r
+  {\r
+    if(yysegment == SEGMENT_CODE)\r
+      insertdbdw(0);\r
+    else if(yysegment == SEGMENT_EEPROM)\r
+      insertdata(value->value);\r
+  }\r
+}\r
+\r
+void doAdb(stringSA str)\r
+{\r
+  int c;\r
+  int val;\r
+\r
+  str++;\r
+\r
+  for(c=0;c<(int)strlen(str)-1; c++)\r
+  {\r
+    if(str[c]=='\\')\r
+    {\r
+      switch (str[c+1])\r
+      {\r
+        case 'n'  : val = '\n'; break;\r
+        case 't'  : val = '\t'; break;\r
+        case 'v'  : val = '\v'; break;\r
+        case 'b'  : val = '\b'; break;\r
+        case 'r'  : val = '\r'; break;\r
+        case 'f'  : val = '\f'; break;\r
+        case 'a'  : val = '\a'; break;\r
+        case '\\' : val = '\\'; break;\r
+        case '\'' : val = '\''; break;\r
+        case '\"' : val = '\"'; break;\r
+        case '\?' : val = '\?'; break;\r
+        case 'X'  :\r
+        case 'x'  :\r
+        {\r
+          val = 0;\r
+\r
+          if( isxdigit(str[c+2] ) )\r
+          {\r
+            if(isdigit(str[c+2]))\r
+              val = str[c+2] - '0';\r
+            else\r
+              val = tolower(str[c+2]) - 'a' + 10;\r
+            c++;\r
+\r
+            if( isxdigit(str[c+2] ) )\r
+            {\r
+              if(isdigit(str[c+2]))\r
+                val = val*16 + str[c+2] - '0';\r
+              else\r
+                val = val*16 + tolower(str[c+2]) - 'a' + 10;\r
+              c++;\r
+            }\r
+          }\r
+        } break;\r
+\r
+        case '0'  :\r
+        case '1'  :\r
+        case '2'  :\r
+        case '3'  :\r
+        case '4'  :\r
+        case '5'  :\r
+        case '6'  :\r
+        case '7'  :\r
+        {\r
+          val = str[c+1] - '0';\r
+          if( (str[c+2]>='0') && (str[c+2]<='7'))\r
+          {\r
+            val = val * 8 + str[++c+1] - '0';\r
+            if( (str[c+2]>='0') && (str[c+2]<='7'))\r
+              val = val * 8 + str[++c+1] - '0';\r
+          }\r
+\r
+          if(val > 0xFF)\r
+          {\r
+            val = 0;\r
+            warningin(W_OCT_OUT_OF_RANGE);\r
+          }\r
+        } break;\r
+\r
+        default   : val = 0   ; errorin(E_UNDEF_ESCAPE_C,str[c+1]);\r
+      }\r
+      c++;\r
+    }\r
+    else\r
+      val = str[c];\r
+\r
+    if(yysegment == SEGMENT_CODE)\r
+      insertdbdw(val);\r
+    else if(yysegment == SEGMENT_EEPROM)\r
+      insertdata(val);\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Initialize '.dw' directive\r
+  //\r
+\r
+void doAdw(void)\r
+{\r
+  if(yysegment == SEGMENT_CODE)\r
+    yydefinestart = yycodepos;\r
+  else if(yysegment == SEGMENT_EEPROM)\r
+    yydefinestart = yyerompos;\r
+  else\r
+    errorin(E_DW_IN_DSEG);\r
+\r
+  yyeol = FALSE;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Add '.dw' arguments\r
+  //\r
+\r
+void doAdw(valueSA *value)\r
+{\r
+  if( value-> valid )\r
+  {\r
+    if(yyeol && ((value->value < -32768) || (value->value > 65535) ) )\r
+      warning(W_DW_OUT_OF_RANGE, value->value);\r
+    else if( (value->value < -32768) || (value->value > 65535)  )\r
+      warningin(W_DW_OUT_OF_RANGE, value->value);\r
+\r
+    if(yysegment == SEGMENT_CODE)\r
+    {\r
+#ifdef _MSC_VER /* Nick */\r
+      insertdbdw( (value->value & 0x000000FF) >>  0);\r
+      insertdbdw( (value->value & 0x0000FF00) >>  8);\r
+#else\r
+      insertdbdw( (value->value & 0x000000FFL) >>  0);\r
+      insertdbdw( (value->value & 0x0000FF00L) >>  8);\r
+#endif\r
+    }\r
+    else if(yysegment == SEGMENT_EEPROM)\r
+    {\r
+#ifdef _MSC_VER /* Nick */\r
+      insertdata( (value->value & 0x000000FF) >>  0);\r
+      insertdata( (value->value & 0x0000FF00) >>  8);\r
+#else\r
+      insertdata( (value->value & 0x000000FFL) >>  0);\r
+      insertdata( (value->value & 0x0000FF00L) >>  8);\r
+#endif\r
+    }\r
+  }\r
+  else if(yyparseno)\r
+    error(E_UNKNOWN_DW);\r
+  else\r
+  {\r
+    if(yysegment == SEGMENT_CODE)\r
+    {\r
+      insertdbdw(0);\r
+      insertdbdw(0);\r
+    }\r
+    else if(yysegment == SEGMENT_EEPROM)\r
+    {\r
+      insertdata(0);\r
+      insertdata(0);\r
+    }\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle directive '.equ'\r
+  //\r
+\r
+void doEqu(symbolSA symb, valueSA *value)\r
+{\r
+  if( symb->valid && (symb->valdefline != yyline-1) )\r
+    error(E_EQU_REDEF, symb->name, symb->valdefline,symb->valfilename);\r
+  else\r
+  {\r
+    symb -> valid      = value -> valid;\r
+    symb -> value      = value -> value;\r
+    symb -> valdefline = yyline - 1;\r
+    symb -> segment    = yysegment;\r
+    strcpy(symb->valfilename, yyfilename);\r
+    if( !value -> valid )\r
+      error(E_UNKNOWN);\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle directive '.set'\r
+  //\r
+\r
+void doSet(symbolSA symb, valueSA *value)\r
+{\r
+  if( (symb->valid) && (!symb->isvar))\r
+    error(E_LABEL_VAR, symb->name, symb->valdefline, symb->valfilename);\r
+  else\r
+  {\r
+    symb -> isvar       = TRUE;\r
+    symb -> valid       = value -> valid;\r
+    symb -> value       = value -> value;\r
+    symb -> valdefline  = yyline;\r
+    symb -> segment     = yysegment;\r
+    strcpy(symb->valfilename, yyfilename);\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Defines like ".def REG0 = r0"\r
+  //\r
+\r
+void doDef(symbolSA symb, regSA reg)\r
+{\r
+  if( symb->isdefine )\r
+  {\r
+    if( (symb->reg != reg) && yyparseno )\r
+    {\r
+      warning(W_REGREDEF ,symb->name,symb->regdefline,symb->regfilename);\r
+      symb -> regdefline  = yyline - 1;\r
+      symb -> reg         = reg;\r
+      strcpy(symb->regfilename, yyfilename);\r
+    }\r
+    if(symb->valid)\r
+      warning(W_REGLABEL ,symb->name,symb->valdefline,symb->valfilename);\r
+  }\r
+  else\r
+  {\r
+    symb -> isdefine    = TRUE;\r
+    symb -> regdefline  = yyline - 1;\r
+    symb -> reg         = reg;\r
+    strcpy(symb->regfilename, yyfilename);\r
+    if(symb->valid)\r
+      warning(W_REGLABEL ,symb->name,symb->valdefline,symb->valfilename);\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Defines like ".def REG0 = IR0" - Notice: Not supported by ATMEL Assembler\r
+  //\r
+\r
+void doDef(symbolSA symbl, symbolSA symbr)\r
+{\r
+  if(!yyparseno)\r
+    return;\r
+\r
+  if( symbr->isdefine )\r
+  {\r
+    if( symbl->isdefine && (symbl->reg != symbr->reg) )\r
+      warning(W_REGREDEF,symbl->name,symbl->regdefline,symbl->regfilename);\r
+    symbl -> isdefine    = TRUE;\r
+    symbl -> regdefline  = yyline - 1;\r
+    symbl -> reg         = symbr -> reg;\r
+    strcpy(symbl->regfilename, yyfilename);\r
+  }\r
+  else\r
+    error(E_INVALID_REGISTER, symbr->name);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Add label\r
+  //\r
+\r
+void doLab(symbolSA symb)\r
+{\r
+  if(yyinmacro)\r
+  {\r
+    // Check if it is a redef\r
+\r
+    if(symb->valid && (\r
+    ((yyoffset    ==symb->offset)&&(symb->segment==SEGMENT_CODE  )) ||\r
+    ((yyeromoffset==symb->offset)&&(symb->segment==SEGMENT_EEPROM)) ||\r
+    ((yydataoffset==symb->offset)&&(symb->segment==SEGMENT_DATA  ))   ) )\r
+    {\r
+      if( (yysegment == SEGMENT_CODE) \r
+         && (symb -> value  != yycodepos/2 - yyoffset) )\r
+        errorin(E_LABEL_REDEF,symb->name,symb->valdefline,symb->valfilename);\r
+      else if( (yysegment == SEGMENT_EEPROM) \r
+              && (symb -> value  != yyerompos - yyeromoffset) )\r
+        errorin(E_LABEL_REDEF,symb->name,symb->valdefline,symb->valfilename);\r
+      else if( (yysegment == SEGMENT_DATA) \r
+              && (symb -> value  != yydatapos - yydataoffset) )\r
+        errorin(E_LABEL_REDEF,symb->name,symb->valdefline,symb->valfilename);\r
+    }\r
+\r
+    // No it is not, so we set value if this is first occurence of macro\r
+\r
+    else if( !symb->valid )\r
+    {\r
+      symb -> valid      = TRUE;\r
+      symb -> valdefline = yyline;\r
+      symb -> segment    = yysegment;\r
+      symb -> islabel    = 1;\r
+      symb -> macrolabel = 1;\r
+\r
+      strcpy(symb->valfilename, yyfilename);\r
+\r
+      if(yysegment == SEGMENT_CODE)\r
+      {\r
+        symb -> value   = yycodepos/2 - yyoffset;\r
+        symb -> offset  = yyoffset;\r
+      }\r
+      else if(yysegment == SEGMENT_EEPROM)\r
+      {\r
+        symb -> value   = yyerompos - yyeromoffset;\r
+        symb -> offset  = yyeromoffset;\r
+      }\r
+      else\r
+      {\r
+        symb -> value   = yydatapos - yydataoffset;\r
+        symb -> offset  = yydataoffset;\r
+      }\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if(symb->valid && ((symb->valdefline !=yyline)\r
+                      || strcmp(symb->valfilename, yyfilename)))\r
+      errorin(E_LABEL_REDEF,symb->name,symb->valdefline,symb->valfilename);\r
+    else\r
+    {\r
+      symb -> valid      = TRUE;\r
+      symb -> valdefline = yyline;\r
+      symb -> segment    = yysegment;\r
+      symb -> islabel    = 1;\r
+\r
+      strcpy(symb->valfilename, yyfilename);\r
+\r
+      if(yysegment == SEGMENT_CODE)\r
+      {\r
+        symb -> value   = yycodepos/2 - yyoffset;\r
+        symb -> offset  = yyoffset;\r
+      }\r
+      else if(yysegment == SEGMENT_EEPROM)\r
+      {\r
+        symb -> value   = yyerompos - yyeromoffset;\r
+        symb -> offset  = yyeromoffset;\r
+      }\r
+      else\r
+      {\r
+        symb -> value   = yydatapos - yydataoffset;\r
+        symb -> offset  = yydataoffset;\r
+      }\r
+\r
+      if (symb->name[0] != '@')\r
+      {      \r
+        strcpy(yylast_used_label, symb->name);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate Register / Register opcodes\r
+  //\r
+\r
+void genRegReg(int opcode, regSA dest, regSA src)\r
+{\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+\r
+  checkSupported(opcode);\r
+\r
+  CHECKREG(src  ,0);\r
+  CHECKREG(dest ,0);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_MULSU  : // Multiply Signed with Unsiged\r
+    case O_FMUL   : // Fractional Multiply\r
+    case O_FMULS  : // Fractional Multiply Signed\r
+    case O_FMULSU : // Fractional Multiply Signed with Unsiged\r
+    {\r
+      CHECKREG(src, 16);\r
+      CHECKREG(dest, 16);\r
+\r
+      if( (src<16) || (src>23) )\r
+        error(E_INVALID_REG_EXPECTED, src, 16,23);\r
+      if( (dest<16) || (dest>23) )\r
+        error(E_INVALID_REG_EXPECTED, dest, 16,23);\r
+\r
+      inst |= (((src-16)  & 0x0007) << 0) | (((dest-16) & 0x0007) << 4);\r
+\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_MOVW   : // Copy register word\r
+    {\r
+      CHECKREG(src, 0);\r
+      CHECKREG(dest, 0);\r
+\r
+      if( src & 1 )\r
+        error(E_INVALID_REG_EXPECTED_0_2_4, src);\r
+      if( dest & 1 )\r
+        error(E_INVALID_REG_EXPECTED_0_2_4, dest);\r
+\r
+      inst |= (((src>>1)  & 0x000F) << 0) | (((dest>>1) & 0x000F) << 4);\r
+\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_MULS   : // Multiply Signed\r
+    {\r
+      CHECKREG(src, 16);\r
+      CHECKREG(dest, 16);\r
+\r
+      if( (src<16) || (src>31) )\r
+        error(E_INVALID_REG_EXPECTED, dest, 16,31);\r
+      if( (dest<16) || (dest>31) )\r
+        error(E_INVALID_REG_EXPECTED, dest, 16,31);\r
+\r
+      inst |= (((src-16)  & 0x000F) << 0) | (((dest-16) & 0x000F) << 4);\r
+\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_CPC    : // Compare with Carry\r
+    case O_CP     : // Compare\r
+    case O_SBC    : // Subtract with Carry\r
+    case O_SUB    : // Subtract without Carry\r
+    case O_ADD    : // without Carry\r
+    case O_ADC    : // with Carry\r
+    case O_CPSE   : // Compares Skip if Equal\r
+    case O_AND    : // Logical AND\r
+    case O_EOR    : // Exclusive OR\r
+    case O_OR     : // Logical OR\r
+    case O_MOV    : // Copy Register\r
+    case O_MUL    : // Multiply\r
+    {\r
+      inst |= (src  & 0x0010) << 5;\r
+      inst |= (src  & 0x000F) << 0;\r
+      inst |= (dest & 0x0010) << 4;\r
+      inst |= (dest & 0x000F) << 4;\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("RR %04X",opcode);\r
+  }\r
+  insertInst(inst, 2);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate Immediate opcodes\r
+  //\r
+\r
+void genImmedi(int opcode, valueSA *value)\r
+{\r
+  int   size    = 2;\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+  int   tmp;\r
+\r
+  checkSupported(opcode);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_BRCC : // Branch if Carry Cleared\r
+    case O_BRCS : // Branch if Carry Set\r
+    case O_BRNE : // Branch if Not Equal\r
+    case O_BREQ : // Branch if Equal\r
+    case O_BRPL : // Branch if Plus\r
+    case O_BRMI : // Branch if Minus\r
+    case O_BRVC : // Branch if Overflow Cleared\r
+    case O_BRVS : // Branch if Overflow Set\r
+    case O_BRGE : // Branch if Greater or Equal (Signed)\r
+    case O_BRLT : // Branch if Less Than (Signed)\r
+    case O_BRHC : // Branch if Half C Flag is Cleared\r
+    case O_BRHS : // Branch if Half C Flag is Set\r
+    case O_BRTC : // Branch if the T Flag is Cleared\r
+    case O_BRTS : // Branch if the T Flag is Set\r
+    case O_BRID : // Branch if Global Int is Disabled\r
+    case O_BRIE : // Branch if Global Int is Enabled\r
+    case O_BRSH : // Branch if Same or Higher (BRCC)\r
+    case O_BRLO : // Branch if Lower          (BRCS)\r
+    {\r
+      inst = opcode & 0xFC07;\r
+      if(value->valid)\r
+      {\r
+        tmp = value -> value - yycodepos/2 - 1;\r
+\r
+        if(tmp < -64 ) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           // We might reach it by jumping forward\r
+           \r
+           int dist = DEVINF.flashsize - ( yycodepos/2 + 1) + value->value;\r
+\r
+           if( (dist>63) || (dist<0) )\r
+             error(E_BRANCH_OUT_OF_RANGE_B,-1*(tmp+64));\r
+           else\r
+             inst  |= ((dist & 0x7F ) << 3);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_BRANCH_OUT_OF_RANGE_B,-1*(tmp+64));\r
+       }\r
+        else if(tmp > 63) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           int dist = -1*(DEVINF.flashsize - value->value + yycodepos/2 + 1);\r
+\r
+           if( (dist < -64) || (dist >= 0) )\r
+             error(E_BRANCH_OUT_OF_RANGE_F,tmp-63);\r
+           else\r
+             inst  |= ((dist & 0x7F ) << 3);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_BRANCH_OUT_OF_RANGE_F,tmp-63);\r
+       }\r
+        else\r
+          inst  |= ( tmp & 0x7F ) << 3;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_BRANCH);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_BCLR : // Bit Clear in SREG\r
+    case O_BSET : // Bit Set in SREG\r
+    {\r
+      if( value->valid )\r
+      {\r
+        if( (value->value < 0) || (value->value > 7) )\r
+          warning(W_BIT_OUT_OF_RANGE, value->value);\r
+        inst  |= (value->value & 7) << 4;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_BIT);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_RCALL: // Relative Call To Subroutine\r
+    {\r
+      if(value->valid)\r
+      {\r
+        tmp = value -> value - yycodepos/2 -1;\r
+        if(tmp < -2048 ) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           // We might reach it by jumping forward\r
+           \r
+           int dist = DEVINF.flashsize - ( yycodepos/2 + 1) + value->value;\r
+\r
+           if( (dist>2047) || (dist<0) )\r
+             error(E_RCALL_OUT_OF_RANGE_B, -1*(tmp+2048));\r
+           else\r
+             inst  |= (dist & 0xFFF);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_RCALL_OUT_OF_RANGE_B, -1*(tmp+2048));\r
+       }\r
+        else if(tmp > 2047) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           int dist = -1*(DEVINF.flashsize - value->value + yycodepos/2 + 1);\r
+\r
+           if( (dist < -2048) || (dist >= 0) )\r
+             error(E_RCALL_OUT_OF_RANGE_F, tmp-2047);\r
+           else\r
+             inst  |= (dist & 0xFFF);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_RCALL_OUT_OF_RANGE_F, tmp-2047);\r
+       }\r
+\r
+        else\r
+          inst  |=  tmp & 0xFFF ;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_RCALL_DEST);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_RJMP : // Relative Jump\r
+    {\r
+      if(value->valid)\r
+      {\r
+        tmp = value -> value - yycodepos/2 -1;\r
+        if(tmp < -2048 ) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           // We might reach it by jumping forward\r
+           \r
+           int dist = DEVINF.flashsize - ( yycodepos/2 + 1) + value->value;\r
+\r
+           if( (dist>2047) || (dist<0) )\r
+             error(E_RJUMP_OUT_OF_RANGE_B, -1*(tmp+2048));\r
+           else\r
+             inst  |= (dist & 0xFFF);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_RJUMP_OUT_OF_RANGE_B, -1*(tmp+2048));\r
+       }\r
+        else if(tmp > 2047) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           int dist = -1*(DEVINF.flashsize - value->value + yycodepos/2 + 1);\r
+\r
+           if( (dist < -2048) || (dist >= 0) )\r
+             error(E_RJUMP_OUT_OF_RANGE_F, tmp-2047);\r
+           else\r
+             inst  |= (dist & 0xFFF);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_RJUMP_OUT_OF_RANGE_F, tmp-2047);\r
+       }\r
+        else\r
+          inst  |=  tmp & 0xFFF ;\r
+\r
+      }\r
+      else\r
+        error(E_UNKNOWN_RJUMP_DEST);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_JMP  : // Jump\r
+    case O_CALL : // Long Call to a Subroutine\r
+    {\r
+      size   = 4;\r
+      if(value->valid)\r
+      {\r
+        if( (value -> value <0) || (value -> value > 0x3FFFFF) )\r
+          warning(W_ILLEGAL_DEST_ADDR, value->value);\r
+\r
+        inst  |=  ( (value -> value & 0x3FFFFF) >> 16) & 0x0001;\r
+        inst  |= (( (value -> value & 0x3F0000) >> 16) & 0x003E) << 3;\r
+        inst  |=  ( (value -> value & 0x00FFFF) << 16);\r
+      }\r
+      else\r
+        error(E_UNKNOWN_JUMP_CALL_DEST);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("IM %04X",opcode);\r
+  }\r
+  insertInst(inst, size);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate Load / Store opcods - Notice : 'ld' = 'ldd' and 'ld' = 'ldd'\r
+  //\r
+\r
+void genIndirc(int opcode, indirectSA *indi, regSA reg, int right)\r
+{\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+  int   store   = 0x0000;\r
+\r
+  checkSupported(opcode);\r
+\r
+  CHECKREG(reg, 0);\r
+  CHECKREG(indi->regno, 28);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_ST   : // Store Indirect SRAM index X/Y/Z\r
+    case O_STD  : // Store Indirect SRAM displacement\r
+    {\r
+      store = 0x0200;\r
+    }\r
+    case O_LD   : // Load indirect SRAM index X/Y/Z\r
+    case O_LDD  : // Load indirect SRAM displacement\r
+    {\r
+      if( ((opcode==O_LD) || (opcode==O_LDD)) && !right )\r
+       error(E_REG_DISP);\r
+      if( indi->disp && (indi->regno==26) )\r
+       error(E_NO_DISP);\r
+      else if( ((opcode==O_ST) || (opcode==O_STD)) && right )\r
+       error(E_DISP_REG);\r
+      else\r
+      {\r
+        if( indi -> regno == 26 )\r
+          inst = 0x900C | (reg << 4) | indi->plus;\r
+        else if( (indi -> regno == 28) || (indi -> regno == 30 ) )\r
+        {\r
+          if(indi -> disp)\r
+          {\r
+            inst = 0x8000 | (reg<<4) | (8*(indi -> regno == 28));\r
+            if(indi->offset.valid)\r
+            {\r
+              if( (indi->offset.value<0) || (indi->offset.value>63) )\r
+                warning(W_DISPLACEMENT_OUT_OF_RANGE, indi->offset.value);\r
+              inst |= (indi->offset.value & 0x20) << 8;\r
+              inst |= (indi->offset.value & 0x18) << 7;\r
+              inst |= (indi->offset.value & 0x07) << 0;\r
+            }\r
+            else\r
+              error(E_UNKNOWN_DISP);\r
+          }\r
+          else\r
+          {\r
+            inst  = 0x8000|(reg<<4)|indi->plus|(0x1000*(indi->plus!=0));\r
+            inst |= 8*(indi -> regno == 28) ;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          if(store)\r
+            error(E_INVALID_SOURCE_REG_XYZ, indi->regno);\r
+          else\r
+            error(E_INVALID_DEST_REG_XYZ, indi->regno);\r
+        }\r
+        inst |= store;\r
+      }\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("LS %04X", opcode);\r
+\r
+  }\r
+  insertInst(inst, 2);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate Immediate / Register opcodes\r
+  //\r
+\r
+void genImmReg(int opcode, valueSA *value, regSA reg)\r
+{\r
+  int   size    = 2;\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+\r
+  checkSupported(opcode);\r
+\r
+  CHECKREG(reg, 0);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_OUT  : // Store Register to I/O Port\r
+    {\r
+      inst |= reg << 4;\r
+\r
+      if(value->valid)\r
+      {\r
+        if( (value->value<0) || (value->value>63) )\r
+          warning(W_PORT_OUT_OF_RANGE_3F, value->value);\r
+        inst |= (value->value & 0x30) << 5;\r
+        inst |=  value->value & 0x0F;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_PORT);\r
+\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_STS  : // Store direct to SRAM\r
+    {\r
+      size   = 4;\r
+      inst  |= reg << 4;\r
+\r
+      if(value->valid)\r
+      {\r
+        if( (value->value<0) || (value->value>0xFFFF) )\r
+          warning(W_ADDR_OUT_OF_RANGE_FFFF, value->value);\r
+        inst |=  (value -> value & 0xFFFF) << 16;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_ADDRESS);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("IR %04X",opcode);\r
+  }\r
+  insertInst(inst, size);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate Register / Immediate opcodes\r
+  //\r
+\r
+void genRegImm(int opcode, regSA reg, valueSA *value)\r
+{\r
+  int   size    = 2;\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+\r
+  checkSupported(opcode);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_SBRC : // Skip if Bit in Register is Cleared\r
+    case O_SBRS : // Skip if Bit in Register is Set\r
+    {\r
+      CHECKREG(reg, 0);\r
+\r
+      inst |= reg << 4;\r
+\r
+      if(value->valid)\r
+      {\r
+        if( (value->value < 0) || (value->value > 7) )\r
+          warning(W_BIT_OUT_OF_RANGE, value->value);\r
+        inst |= value->value & 7;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_BIT);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_IN   : // Load an I/O Port to register\r
+    {\r
+      CHECKREG(reg, 0);\r
+\r
+      inst |= reg << 4;\r
+\r
+      if(value->valid)\r
+      {\r
+        if( (value->value < 0) || (value->value > 0x3F) )\r
+          warning(W_PORT_OUT_OF_RANGE_3F, value->value);\r
+        inst |= (value->value & 0x30) << 5;\r
+        inst |= (value->value & 0x0F);\r
+      }\r
+      else\r
+        error(E_UNKNOWN_PORT);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_CBR  : // Clear Bits in Reg. (Same as 'andi')\r
+    {\r
+      CHECKREG(reg, 16);\r
+\r
+      inst = 0x7000;\r
+\r
+      if( (reg<16) || (reg>31) )\r
+        error(E_INVALID_REGISTER_R16_R31);\r
+      else\r
+      {\r
+        inst |= (reg-16) << 4;\r
+\r
+        if(value->valid)\r
+        {\r
+          if( (value->value < 0) || (value->value > 0xFF) )\r
+            warning(W_BITMASK_OUT_OF_RANGE, value->value);\r
+          inst |= ((0xFF - (value->value & 0xFF)) & 0xF0) << 4;\r
+          inst |= ((0xFF - (value->value & 0xFF)) & 0x0F);\r
+        }\r
+        else\r
+          error(E_UNKNOWN_BITMASK);\r
+      }\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_BLD  : // Bit Load from T to Register bit\r
+    case O_BST  : // Bit store from Register to T\r
+    {\r
+      CHECKREG(reg, 0);\r
+\r
+      inst |= reg << 4;\r
+\r
+      if(value->valid)\r
+      {\r
+        if( (value->value < 0) || (value->value > 7) )\r
+          warning(W_BIT_OUT_OF_RANGE, value->value);\r
+        inst |= value->value & 7;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_BIT);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_ADIW : // Add Immediate to Word\r
+    case O_SBIW : // Subtract Immediate from Word\r
+    {\r
+      CHECKREG(reg, 24);\r
+\r
+      if( (reg!=24) && (reg!=26) && (reg!=28) && (reg!=30) )\r
+        error(E_INVALID_REG_R24_R30);\r
+      else\r
+      {\r
+        inst |= (reg-24) << 3;\r
+\r
+        if(value->valid)\r
+        {\r
+          if( (value->value < 0) || (value->value >= 0x40) )\r
+            warning(W_CONST_OUT_OF_RANGE_3F, value->value);\r
+          inst |= (value->value & 0x30) << 2;\r
+          inst |= (value->value & 0x0F);\r
+        }\r
+        else\r
+          error(E_UNKNOWN_CONSTANT);\r
+      }\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_SBR  : // Set Bits in register (Same as ORI)\r
+    { inst = O_ORI; }\r
+    case O_CPI  : // Compare with Immediate\r
+    case O_SBCI : // Subtract Immediate with Carry\r
+    case O_SUBI : // Subtract Immediate\r
+    case O_ORI  : // Logical OR with Immediate\r
+    case O_ANDI : // Logical AND with Immediate\r
+    case O_LDI  : // Load Immediate\r
+    {\r
+      CHECKREG(reg, 16);\r
+\r
+      if( (reg<16) || (reg>31) )\r
+        error(E_INVALID_REGISTER_R16_R31);\r
+      else\r
+      {\r
+        inst |= (reg-16) << 4;\r
+\r
+        if(value->valid)\r
+        {\r
+          if( (value->value < -0xFF) || (value->value > 0xFF) )\r
+            warning(W_CONST_OUT_OF_RANGE_FF, value->value);\r
+          inst |= (value->value & 0xF0) << 4;\r
+          inst |= (value->value & 0x0F);\r
+        }\r
+        else\r
+          error(E_UNKNOWN_CONSTANT);\r
+      }\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_LDS  : // Load direct from SRAM\r
+    {\r
+      CHECKREG(reg, 0);\r
+\r
+      size   = 4;\r
+      inst  |= reg << 4;\r
+      if(value->valid)\r
+      {\r
+        if( (value->value < 0) || (value->value > 0xFFFF) )\r
+          warning(W_CONST_OUT_OF_RANGE_FFFF, value->value);\r
+        inst |=  ((value -> value)&0xFFFF) << 16;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_CONSTANT);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("RI %04X",opcode);\r
+  }\r
+  insertInst(inst, size);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate Immediate / Immediate opcodes\r
+  //\r
+\r
+void genImmImm(int opcode, valueSA *valued, valueSA *values)\r
+{\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+  int   tmp;\r
+\r
+  checkSupported(opcode);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_BRBC : // Branch if Bit in SREG is Cleared\r
+    case O_BRBS : // Branch if Bit in SREG is Set\r
+    {\r
+\r
+      if( valued->valid )\r
+      {\r
+        if( (valued->value < 0) || (valued->value > 7) )\r
+          warning(W_BIT_OUT_OF_RANGE ,valued->value);\r
+        inst |= valued->value & 7;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_BIT);\r
+\r
+      if(values->valid)\r
+      {\r
+\r
+        tmp = values -> value - yycodepos/2 - 1;\r
+\r
+        if(tmp < -64 ) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           // We might reach it by jumping forward\r
+           \r
+           int dist = DEVINF.flashsize - ( yycodepos/2 + 1) + values->value;\r
+\r
+           if( (dist>63) || (dist<0) )\r
+             error(E_BRANCH_OUT_OF_RANGE_B,-1*(tmp+64));\r
+           else\r
+             inst  |= ((dist & 0x7F ) << 3);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_BRANCH_OUT_OF_RANGE_B,-1*(tmp+64));\r
+       }\r
+        else if(tmp > 63) {\r
+\r
+         // Maybe we can do a wrap\r
+\r
+         if(yycfg->wrap) {\r
+\r
+           int dist = -1*(DEVINF.flashsize - values->value + yycodepos/2 + 1);\r
+\r
+           if( (dist < -64) || (dist >= 0) )\r
+             error(E_BRANCH_OUT_OF_RANGE_F,tmp-63);\r
+           else\r
+             inst  |= ((dist & 0x7F ) << 3);\r
+         }\r
+\r
+         // No wrapping\r
+\r
+         else\r
+           error(E_BRANCH_OUT_OF_RANGE_F,tmp-63);\r
+       }\r
+        else\r
+          inst  |= ( tmp & 0x7F ) << 3;\r
+\r
+      }\r
+      else\r
+        error(E_UNKNOWN_BRANCH);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_CBI  : // Clear Bit in I/O Register\r
+    case O_SBI  : // Set Bit in I/O Register\r
+    case O_SBIC : // Skip if Bit in I/O is Cleared\r
+    case O_SBIS : // Skip if Bit in I/O is Set\r
+    {\r
+      if( valued->valid )\r
+      {\r
+        if( (valued->value < 0) || (valued->value > 31) )\r
+          warning(W_PORT_OUT_OF_RANGE_1F, valued->value);\r
+        inst |= ((valued->value)&0x1F) << 3;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_PORT);\r
+\r
+      if( values->valid )\r
+      {\r
+        if( (values->value < 0) || (values->value > 7) )\r
+          warning(W_BIT_OUT_OF_RANGE,values->value);\r
+        inst |= values->value & 7;\r
+      }\r
+      else\r
+        error(E_UNKNOWN_BIT);\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("II %04X",opcode);\r
+  }\r
+  insertInst(inst, 2);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate no argument opcodes\r
+  //\r
+\r
+void genNoargs(int opcode)\r
+{\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+\r
+  checkSupported(opcode);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_SEC    : // Set Carry Flag\r
+    case O_SEZ    : // Set Zero Flag\r
+    case O_SEN    : // Set Negative Flag\r
+    case O_SEV    : // Set Overflow Flag\r
+    case O_SES    : // Set Signed Flag\r
+    case O_SEH    : // Set Half Carry Flag\r
+    case O_SET    : // Set T Flag\r
+    case O_SEI    : // Set Global Interrupt Flag\r
+    case O_CLC    : // Clear Carry Flag\r
+    case O_CLZ    : // Clear Zero Flag\r
+    case O_CLN    : // Clear Negative Flag\r
+    case O_CLV    : // Clear Overflow Flag\r
+    case O_CLS    : // Clear Signed Flag\r
+    case O_CLH    : // Clear Half Carry Flag\r
+    case O_CLT    : // Clear T Flag\r
+    case O_CLI    : // Clear Global Interrupt Flag\r
+    case O_NOP    : // No Operation\r
+    case O_ICALL  : // Indirect Call to Subroutine\r
+    case O_IJMP   : // Indirect Jump\r
+    case O_RETI   : // Return from Interrupt\r
+    case O_RET    : // Return from Subroutine\r
+    case O_SLEEP  : // Sleep\r
+    case O_WDR    : // Wathcdog Reset\r
+    case O_EIJMP  : // Extended indirect jump\r
+    case O_EICALL : // Extended indirect call to subroutine\r
+    case O_ESPM   : // Extended store program memory\r
+    case O_SPM   : // Store program memory\r
+    {\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("NA %04X",opcode);\r
+  }\r
+  insertInst(inst, 2);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate Register only opcodes\r
+  //\r
+\r
+void genRegist(int opcode, regSA reg)\r
+{\r
+#ifdef _MSC_VER /* Nick */\r
+  int   inst    = opcode;\r
+#else\r
+  long  inst    = (unsigned)opcode;\r
+#endif\r
+\r
+  checkSupported(opcode);\r
+\r
+  switch ((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_ROR  : // Rotate Right Trough Carry\r
+    case O_COM  : // One's Complement\r
+    case O_NEG  : // Two's Complement\r
+    case O_SWAP : // Swap Nibbles\r
+    case O_INC  : // Increment\r
+    case O_ASR  : // Arithmetic Shift Right\r
+    case O_LSR  : // Logical Shift Right\r
+    case O_DEC  : // Decrement\r
+    case O_POP  : // Pop Register from Stack\r
+    case O_PUSH : // Push Register on Stack\r
+    {\r
+      CHECKREG(reg, 0);\r
+      inst |= reg << 4;\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_TST  : // Test for Zero or Minus\r
+    case O_CLR  : // Logical Shift Left (ADD Rd,Rd)\r
+    {\r
+      CHECKREG(reg, 0);\r
+      inst  = opcode & 0x2400;\r
+      inst |= (reg  & 0x10) << 5;\r
+      inst |= (reg  & 0x0F) << 0;\r
+      inst |= (reg  & 0x10) << 4;\r
+      inst |= (reg  & 0x0F) << 4;\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_ROL  : // Rotate Left trough C (ADC Rd,Rd)\r
+    case O_LSL  : // Logical Shift Left (ADD Rd,Rd)\r
+    {\r
+      CHECKREG(reg, 0);\r
+      inst  = opcode & 0x1C00;\r
+      inst |= (reg  & 0x10) << 5;\r
+      inst |= (reg  & 0x0F) << 0;\r
+      inst |= (reg  & 0x10) << 4;\r
+      inst |= (reg  & 0x0F) << 4;\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    case O_SER  : // Set all bits in Register\r
+    {\r
+      CHECKREG(reg, 16);\r
+      if( (reg<16) || (reg>31) )\r
+        error(E_INVALID_REGISTER_R16_R31);\r
+      else\r
+        inst |= reg << 4;\r
+\r
+    } break;\r
+\r
+    //////////////////////////////////////////////////////////////////////////\r
+\r
+    default     : internalerror("RO %04X",opcode);\r
+  }\r
+  insertInst(inst, 2);\r
+}\r
+\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Generate 'Load Program Memory' instructions\r
+  //\r
+\r
+void genLpm(int opcode, regSA reg, indirectSA *indi, int useregs)\r
+{\r
+  int inst = opcode;\r
+\r
+  // Generate: (E)LPM rX, Z(+)\r
+\r
+  if(useregs) {\r
+\r
+    // Check that no displacement is specified\r
+\r
+    if(indi->disp)\r
+      error(E_DISP_ILLEGAL);\r
+\r
+    // Check that Z is specified\r
+\r
+    CHECKREG(indi->regno, 30);\r
+\r
+    if(indi->regno != 30)\r
+      error(E_INVALID_REG_Z_EXPECTED);\r
+\r
+    // Check that pre-increment is not used\r
+\r
+    if( indi->plus == 2)\r
+      error(E_INVALID_PREINCREMENT);\r
+\r
+    if(opcode==O_LPM)\r
+      inst = 0x9004 + (indi->plus==1 ? 1 : 0) + ((reg&0x1f)<<4);\r
+    else\r
+      inst = 0x9006 + (indi->plus==1 ? 1 : 0) + ((reg&0x1f)<<4);\r
+  }\r
+\r
+  insertInst(inst, 2);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle functions\r
+  //\r
+\r
+void genFun(functionSA func, valueSA *value, valueSA *res)\r
+{\r
+  if( !value->valid )\r
+  {\r
+    res -> valid = FALSE;\r
+    res -> value = 0;\r
+  }\r
+  else\r
+  {\r
+    res -> valid = TRUE;\r
+    res -> value = 0;\r
+    switch(func)\r
+    {\r
+#ifdef _MSC_VER /* Nick */\r
+      case OP_LOW       : res->value = (value->value & 0x000000FF)>> 0; break;\r
+      case OP_HIGH      : res->value = (value->value & 0x0000FF00)>> 8; break;\r
+      case OP_BYTE2     : res->value = (value->value & 0x0000FF00)>> 8; break;\r
+      case OP_BYTE3     : res->value = (value->value & 0x00FF0000)>>16; break;\r
+      case OP_BYTE4     : res->value = (value->value & 0xFF000000)>>24; break;\r
+      case OP_LWRD      : res->value = (value->value & 0x0000FFFF)>> 0; break;\r
+      case OP_HWRD      : res->value = (value->value & 0xFFFF0000)>>16; break;\r
+      case OP_PAGE      : res->value = (value->value & 0x003F0000)>>16; break;\r
+#else\r
+      case OP_LOW       : res->value = (value->value & 0x000000FFL)>> 0; break;\r
+      case OP_HIGH      : res->value = (value->value & 0x0000FF00L)>> 8; break;\r
+      case OP_BYTE2     : res->value = (value->value & 0x0000FF00L)>> 8; break;\r
+      case OP_BYTE3     : res->value = (value->value & 0x00FF0000L)>>16; break;\r
+      case OP_BYTE4     : res->value = (value->value & 0xFF000000L)>>24; break;\r
+      case OP_LWRD      : res->value = (value->value & 0x0000FFFFL)>> 0; break;\r
+      case OP_HWRD      : res->value = (value->value & 0xFFFF0000L)>>16; break;\r
+      case OP_PAGE      : res->value = (value->value & 0x003F0000L)>>16; break;\r
+#endif\r
+      case OP_LOG2      :\r
+      {\r
+        if( value->value < 0 )\r
+          warningin(W_INTEGERRESULT_LOG2_IS_ZERO, value->value);\r
+        else\r
+          res->value = (int) (0.5+log10(value->value)/log10(2));\r
+      } break;\r
+      case OP_EXP2      :\r
+      {\r
+        if( (value->value > 31) || (value->value < 0) )\r
+          warningin(W_INTEGERRESULT_EXP2_IS_ZERO, value->value);\r
+        else\r
+          res->value = 1<< value->value;\r
+      } break;\r
+      default           : internalerror("FU %08X",func);\r
+    }\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle unary operators\r
+  //\r
+\r
+void oprUna(int opr, valueSA *value, valueSA *res)\r
+{\r
+  if( !value->valid )\r
+  {\r
+    res -> valid = FALSE;\r
+    res -> value = 0;\r
+  }\r
+  else\r
+  {\r
+    res -> valid = TRUE;\r
+    res -> value = 0;\r
+    switch(opr)\r
+    {\r
+      case OP_MINUS : ; res->value = -1*value->value; break;\r
+      case OP_WAVE  : ; res->value =   ~value->value; break;\r
+      case OP_NOT   : ; res->value =   !value->value; break;\r
+      default       : internalerror("UO %08X", opr);\r
+    }\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Handle binary operators\r
+  //\r
+\r
+void oprBin(valueSA *vl, int opr, valueSA *vr, valueSA *res)\r
+{\r
+  if( !vl->valid || !vr->valid )\r
+  {\r
+    res -> valid = FALSE;\r
+    res -> value = 0;\r
+  }\r
+  else\r
+  {\r
+    res -> valid = TRUE;\r
+    res -> value = 0;\r
+\r
+    switch(opr)\r
+    {\r
+      case OP_STAR   : res->value = ( vl->value *  vr->value ); break;\r
+      case OP_MOD    : res->value = ( vl->value %  vr->value ); break;\r
+      case OP_PLUS   : res->value = ( vl->value +  vr->value ); break;\r
+      case OP_MINUS  : res->value = ( vl->value -  vr->value ); break;\r
+      case OP_LS     : res->value = ( vl->value << vr->value ); break;\r
+      case OP_RS     : res->value = ( vl->value >> vr->value ); break;\r
+      case OP_LESS   : res->value = ( vl->value <  vr->value ); break;\r
+      case OP_GREAT  : res->value = ( vl->value >  vr->value ); break;\r
+      case OP_LE     : res->value = ( vl->value <= vr->value ); break;\r
+      case OP_GE     : res->value = ( vl->value >= vr->value ); break;\r
+      case OP_EQ     : res->value = ( vl->value == vr->value ); break;\r
+      case OP_NE     : res->value = ( vl->value != vr->value ); break;\r
+      case OP_AND    : res->value = ( vl->value &  vr->value ); break;\r
+      case OP_XOR    : res->value = ( vl->value ^  vr->value ); break;\r
+      case OP_OR     : res->value = ( vl->value |  vr->value ); break;\r
+      case OP_ANDAND : res->value = ( vl->value && vr->value ); break;\r
+      case OP_OROR   : res->value = ( vl->value || vr->value ); break;\r
+      case OP_DIV    :\r
+      {\r
+        if(vr->value)\r
+          res->value = ( vl->value /  vr->value );\r
+        else\r
+        {\r
+          errorin(E_DIVISION_BY_ZERO);\r
+          res->valid = FALSE;\r
+        }\r
+      } break;\r
+      default        : internalerror("BO %08X",opr);\r
+    }\r
+  }\r
+}\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
diff --git a/src/mkutil/tavrasm.118/src/semantic.hh b/src/mkutil/tavrasm.118/src/semantic.hh
new file mode 100644 (file)
index 0000000..57f7d1d
--- /dev/null
@@ -0,0 +1,175 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : semantic.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Code generation header\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _SEMANTIC_HH_\r
+#define _SEMANTIC_HH_\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include "opcodes.hh"\r
+#include "avrasm.hh"\r
+#include "symbol.hh"\r
+#include "messages.hh"\r
+\r
+/// Defines //////////////////////////////////////////////////////////////////\r
+\r
+#define OP_AND          1\r
+#define OP_STAR         2\r
+#define OP_PLUS         3\r
+#define OP_MINUS        4\r
+#define OP_WAVE         5\r
+#define OP_NOT          6\r
+\r
+#define OP_DIV          7\r
+#define OP_MOD          8\r
+#define OP_LS           9\r
+#define OP_RS          10\r
+#define OP_LESS        11\r
+#define OP_GREAT       12\r
+#define OP_LE          13\r
+#define OP_GE          14\r
+#define OP_EQ          15\r
+#define OP_NE          16\r
+#define OP_XOR         17\r
+#define OP_OR          18\r
+#define OP_ANDAND      19\r
+#define OP_OROR        20\r
+\r
+#define OP_LOW         21\r
+#define OP_HIGH        22\r
+#define OP_BYTE2       23\r
+#define OP_BYTE3       24\r
+#define OP_BYTE4       25\r
+#define OP_LWRD        26\r
+#define OP_HWRD        27\r
+#define OP_PAGE        28\r
+#define OP_EXP2        29\r
+#define OP_LOG2        30\r
+\r
+/// Types ////////////////////////////////////////////////////////////////////\r
+\r
+  /// Attribute structs (also typedef'ed below) ////////////////////////////\r
+\r
+struct  instructionstruct\r
+        {\r
+#ifdef _MSC_VER /* Nick */\r
+          int           value;\r
+#else\r
+          long          value;\r
+#endif\r
+          int           size;\r
+          int           opcode;\r
+        };\r
+\r
+struct  valuestruct\r
+        {\r
+#ifdef _MSC_VER /* Nick */\r
+          int           value;\r
+#else\r
+          long          value;\r
+#endif\r
+          int           valid;\r
+        };\r
+\r
+struct  indirectstruct\r
+        {\r
+          int           regno;\r
+          int           plus;\r
+          int           disp;\r
+          valuestruct   offset;\r
+        };\r
+\r
+  /// Synthesized attributes ///////////////////////////////////////////////\r
+\r
+typedef int                     regSA;\r
+typedef instructionstruct       instSA;\r
+typedef int                     opcodeSA;\r
+typedef valuestruct             valueSA;\r
+typedef char                    nameSA[MAX_ID_LENGTH+1];\r
+typedef symbolTableEntry*       symbolSA;\r
+typedef indirectstruct          indirectSA;\r
+typedef int                     functionSA;\r
+typedef char*                   stringSA;\r
+\r
+/// Prototypes ///////////////////////////////////////////////////////////////\r
+\r
+  /// Generate functions ///////////////////////////////////////////////////\r
+\r
+void  genRegReg(int opcode, regSA dest, regSA src);\r
+void  genRegImm(int opcode, regSA reg, valueSA *value);\r
+void  genImmReg(int opcode, valueSA *value, regSA reg);\r
+void  genImmImm(int opcode, valueSA *valued, valueSA *values);\r
+void  genImmedi(int opcode, valueSA *value);\r
+void  genNoargs(int opcode);\r
+void  genRegist(int opcode, regSA reg);\r
+void  genIndirc(int opcode, indirectSA *indi, regSA reg, int right = FALSE);\r
+void  genLpm(int opcode, regSA reg, indirectSA *indi, int useregs);\r
+\r
+  /// Handle directives ////////////////////////////////////////////////////\r
+\r
+void  doDef(symbolSA symb, regSA reg);          // Handle '.def'\r
+void  doDef(symbolSA symbl, symbolSA symbr);    // Handle '.def'\r
+void  doEqu(symbolSA symb, valueSA *value);     // Handle '.eq'\r
+void  doAdb(void);                              // Init '.db'\r
+void  doAdb(valueSA *value);                    // Handle '.db'\r
+void  doAdb(stringSA str);                      // Handle '.db'\r
+void  doAdw(void);                              // Init '.dw'\r
+void  doAdw(valueSA *value);                    // Handle '.dw'\r
+void  doOrg(valueSA *value);                    // Handle '.org'\r
+void  doByt(valueSA *value);                    // Handle '.byte'\r
+void  doSet(symbolSA symb, valueSA *value);     // Handle '.set'\r
+void  doDev(symbolSA devicename);               // Handle '.device'\r
+\r
+  /// Add label ////////////////////////////////////////////////////////////\r
+\r
+void  doLab(symbolSA symb);                     // Add a label\r
+\r
+  /// Operators ////////////////////////////////////////////////////////////\r
+\r
+void  oprUna(int opr, valueSA *value, valueSA *res);\r
+void  oprBin(valueSA *vl, int opr, valueSA *vr, valueSA *res);\r
+void  genFun(functionSA func, valueSA *value, valueSA *res);\r
+\r
+#endif /* _SEMANTIC_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/symbol.cc b/src/mkutil/tavrasm.118/src/symbol.cc
new file mode 100644 (file)
index 0000000..212279c
--- /dev/null
@@ -0,0 +1,474 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : symbol.cc\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Symbol table (see additional info below).\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  Description :\r
+//\r
+//  This module implements the symbol-table, and the functions needed to\r
+//  manipulate it. The symbol-table supports scopes, scope import/export\r
+//  and arbitrary types.\r
+//\r
+//  The size of the hash vector is set using 'init', and can't be changed\r
+//  after initialization.  The default size of the hash-table is 1024.\r
+//  The size must be 2^N, N=1, 2, ...\r
+//\r
+//  To get a case in-sensitive symbol table, initialize with : init(TRUE);\r
+//\r
+//  'symbol.hh' defines the class interface and the structure of a\r
+//  symbol-table entry.\r
+//\r
+//  Functions   :\r
+//\r
+//  init         - Initialize symbol-table\r
+//  add          - Add symbol to symbol-table, no check is made to see\r
+//                 if symbol already exist.\r
+//  get          - Return pointer to symbol.\r
+//  scopeDown    - Add new scope\r
+//  scopeUp      - Delete scope\r
+//  printTable   - Print symbol table.\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include <string.h>\r
+#include <stdio.h>\r
+#include <ctype.h>\r
+#include "symbol.hh"\r
+#include "utils.hh"\r
+\r
+/// Macros ///////////////////////////////////////////////////////////////////\r
+\r
+#define LOWERCOMP(c1, c2)       (tolower(c1)==tolower(c2))\r
+\r
+/// Functions ////////////////////////////////////////////////////////////////\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Constructor\r
+  //\r
+\r
+symbolTable::symbolTable(void)\r
+{\r
+\r
+  hashSize      = 0;\r
+  symtab        = NULL;\r
+  scope         = 0;\r
+  scopeTop      = NULL;\r
+  currentScope  = NULL;\r
+  currentSymbol = NULL;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Destructor\r
+  //\r
+\r
+symbolTable::~symbolTable(void)\r
+{\r
+  if(symtab)\r
+    delete symtab;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Allocate and initialize a new symbol table.\r
+  //\r
+\r
+int symbolTable::init(int cs, unsigned int hashsize)\r
+{\r
+  unsigned int      size = 1;\r
+  symbolScopeStack  *newscope;\r
+\r
+  // Return if already initialized\r
+\r
+  if(symtab)\r
+    return 0;;\r
+\r
+  // Align hashsize to 2^N\r
+\r
+  while(hashsize>>=1)\r
+    size<<=1;\r
+\r
+  if(size>HASH_MAX_SIZE)\r
+    size = HASH_MAX_SIZE;\r
+\r
+  // Check case sensitive\r
+\r
+  if(cs)\r
+    casesensitive = TRUE;\r
+  else\r
+    casesensitive = FALSE;\r
+\r
+  // Allocate mew symbol-table\r
+\r
+  if(size && (symtab = new symbolTableEntry*[size])) /* Nick removed paren */\r
+  {\r
+    // Clear hash-table\r
+\r
+    memset(symtab,0,size*sizeof(symbolTableEntry*));\r
+    hashSize = size - 1;\r
+\r
+    // Allocate first element on scope stack\r
+\r
+    if(! (newscope = new symbolScopeStack))\r
+    {\r
+      delete symtab;\r
+      symtab = NULL;\r
+      return 0;\r
+    }\r
+\r
+    currentScope          = newscope;\r
+    scopeTop              = newscope;\r
+\r
+    currentScope -> down  = NULL;\r
+    currentScope -> up    = NULL;\r
+    currentScope -> last  = NULL;\r
+    currentScope -> first = NULL;\r
+\r
+    // scope is set to 1\r
+\r
+    currentScope -> level = ++scope;\r
+\r
+    return size;\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // The hash function does three things to create the hash value :\r
+  //\r
+  // 1 : Adding the ASCII value of all characters\r
+  //\r
+  //     This works fine for small hash tables, but hash values tends to pile\r
+  //     up in large tables, since ASCII values for alpha numeric characters\r
+  //     are "small", ie. adding 1 to 8 values in the interval 48 to 123\r
+  //     result in a hash value between 48 and 984, so there would be no point\r
+  //     in using a hash table larger than 1024 (since we assume that the\r
+  //     table is 2^N, where N = 1, 2, ...\r
+  //\r
+  // 2 : Shifting value right\r
+  //\r
+  //     To improve the hash functions we shift the previous hash value right\r
+  //     4 times, this creates much larger values, thus solving the 'add'\r
+  //     problem.\r
+  //\r
+  // 3 : XOR'ing value\r
+  //\r
+  //     The solution to the 'add' problem creates another problem when using\r
+  //     small hash tables, since the shifting has the effect that the hash\r
+  //     value tends to forget the previous character values, because they are\r
+  //     shifted to the right, and the eventually lost when the hash value\r
+  //     is AND'ed with the size of the hash table. This problem is fixed\r
+  //     by XOR'ing the previous value with the shifted value.\r
+  //\r
+  // An alternate solution that does not change the name pointer :\r
+  //\r
+  //   for(h=i=0; name[i]; h^= ( h << 4 ) + name[i++]);\r
+  //   h&=hashsize;\r
+  //\r
+\r
+inline int symbolTable::hash(char *name)\r
+{\r
+  int h = 0;\r
+\r
+  if(!casesensitive)\r
+    while(*name)\r
+      h^= ( h << 4 ) + tolower(*name++);\r
+  else\r
+    while(*name)\r
+      h^= ( h << 4 ) + *name++;\r
+\r
+  return  h &= hashSize;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Get a pointer to a symbol.\r
+  //\r
+\r
+symbolTableEntry* symbolTable::get(char *name, int inscope)\r
+{\r
+  int notfound;\r
+  int p;\r
+\r
+  // Get a pointer to the first element in the hash chain\r
+\r
+  symbolTableEntry *next = symtab[hash(name)];\r
+\r
+  // If 'next' == NULL then the symbol is not in the table and we return.\r
+\r
+  if(!next)\r
+    return NULL;\r
+\r
+  // Set scope\r
+\r
+  if(inscope<0)\r
+    inscope = scope;\r
+\r
+  notfound = TRUE; /* Nick true; */\r
+\r
+  // If 'next' != NULL the chain is not empty, and we have have to\r
+  // scan all symbols at the current scope level. Since new symbols are\r
+  // added at the front of the chain, we can end the scan, when the first\r
+  // identifier with a higher scope level (lower 'scope') is found.\r
+\r
+  if(casesensitive)\r
+  {\r
+    while(next && (inscope<=next->scope)&&(notfound=strcmp(name, next->name)))\r
+      next = next -> next;\r
+  }\r
+  else\r
+  {\r
+    while(next && (inscope<=next->scope) && notfound)\r
+    {\r
+      p = 0;\r
+      while( name[p] && next->name[p] && LOWERCOMP(name[p],next->name[p]) )\r
+        p++;\r
+      if( name[p] || next->name[p] )\r
+        next = next -> next;\r
+      else\r
+        notfound = FALSE;\r
+    }\r
+  }\r
+\r
+  if(!notfound)\r
+    return next;\r
+\r
+  return NULL;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Add a symbol to symbol-table.\r
+  //\r
+\r
+symbolTableEntry* symbolTable::add(char *name)\r
+{\r
+  int h;\r
+\r
+  // Get a pointer to the first element in the hash chain\r
+\r
+  symbolTableEntry *next = symtab[h=hash(name)];\r
+\r
+  // Allocate new symbol\r
+\r
+  symtab[h] = new symbolTableEntry;\r
+\r
+  if(!(symtab[h]))\r
+    return NULL;\r
+\r
+  // Clear symbol\r
+\r
+  memset(symtab[h], 0, sizeof(symbolTableEntry));\r
+\r
+  // Link with next symbol in chain.\r
+\r
+  symtab[h] -> next = next;\r
+\r
+  if(next)\r
+    next -> prev = symtab[h];\r
+\r
+  // Add to scope chain\r
+\r
+  if(currentSymbol)\r
+  {\r
+    currentSymbol -> down = symtab[h];\r
+    symtab[h] -> up = currentSymbol;\r
+  }\r
+  else\r
+    currentScope -> first = symtab[h];\r
+\r
+  currentSymbol = symtab[h];\r
+\r
+  currentScope -> last = symtab[h];\r
+\r
+  // Setup new symbol\r
+\r
+  if(strlen(name) > MAX_ID_LENGTH)\r
+    internalerror("ID TOO LONG");\r
+\r
+  strcpy(symtab[h]->name, name);\r
+\r
+  symtab[h] -> scope = scope;\r
+\r
+  next = symtab[h];\r
+\r
+  // return pointer to new symbol\r
+\r
+  return symtab[h];\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Add new scope\r
+  //\r
+\r
+int symbolTable::scopeDown(void)\r
+{\r
+  symbolScopeStack *newscope;\r
+\r
+  // Allocate new element on top of the scope stack.\r
+\r
+  if(! (newscope = new symbolScopeStack))\r
+    return -1;\r
+\r
+  // Setup new element\r
+\r
+  currentScope -> down  = newscope;\r
+  newscope     -> up    = currentScope;\r
+  currentScope          = newscope;\r
+  currentScope -> down  = NULL;\r
+  currentScope -> first = NULL;\r
+  currentScope -> last  = NULL;\r
+  currentScope -> level = ++scope;\r
+  currentSymbol         = NULL;\r
+\r
+  return scope;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Delete scope\r
+  //\r
+\r
+int symbolTable::scopeUp(void)\r
+{\r
+  symbolTableEntry *next, *current;\r
+  int h;\r
+\r
+  current = currentScope -> first;\r
+\r
+  // Kill current scope\r
+\r
+  while(current)\r
+  {\r
+    if(current->prev)\r
+      current -> prev -> next = current -> next;\r
+    else\r
+      symtab[h=hash(current -> name)]= current -> next;\r
+\r
+    if(current->next)\r
+      current -> next -> prev = current -> prev;\r
+\r
+    next = current -> down;\r
+    delete current;\r
+    current = next;\r
+  }\r
+\r
+  // Decrement scope\r
+\r
+  if(currentScope -> up)\r
+  {\r
+    currentScope = currentScope -> up;\r
+    delete currentScope -> down;\r
+    currentScope -> down = NULL;\r
+    currentSymbol = currentScope -> last;\r
+  }\r
+  else\r
+  {\r
+    currentScope -> up    = NULL;\r
+    currentScope -> down  = NULL;\r
+    currentScope -> first = NULL;\r
+    currentScope -> last  = NULL;\r
+  }\r
+\r
+  return --scope;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Print symbol-table to stdout.\r
+  //\r
+\r
+int symbolTable::printTable(int fromscope, int toscope, int format)\r
+{\r
+  symbolScopeStack *thescope = scopeTop;\r
+  symbolTableEntry *next;\r
+  int              count =0;\r
+\r
+  if(toscope == -1)\r
+    toscope = scope;\r
+  if(fromscope == -1)\r
+    fromscope = scope;\r
+\r
+  if(!thescope)\r
+    printf("Symbol table is empty\n");\r
+  else\r
+  {\r
+    while(thescope)\r
+    {\r
+      if( (thescope -> level >= fromscope ) && (thescope -> level <= toscope ) )\r
+      {\r
+        printf("\n+---------------------------------------------------+\n");\r
+        printf("| S:%5i  I V S M                                  |\n",thescope -> level);\r
+        printf("|---------------------------------------------------|\n");\r
+        next = thescope -> first;\r
+        while(next)\r
+        {\r
+          // Print detailed information\r
+\r
+          if(format)\r
+          {\r
+          }\r
+\r
+          // Print just the symbol names\r
+          else\r
+            printf("| %08X %i %i %X %i %-32s |\n",next->value,next->isvar,next->valid,next->segment,next->macro,next->name);\r
+\r
+          next = next -> down;\r
+          count++;\r
+        }\r
+        printf("+---------------------------------------------------+\n");\r
+\r
+      }\r
+      thescope = thescope -> down;\r
+    }\r
+  }\r
+\r
+  return count;\r
+\r
+}\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/symbol.hh b/src/mkutil/tavrasm.118/src/symbol.hh
new file mode 100644 (file)
index 0000000..e11f9c9
--- /dev/null
@@ -0,0 +1,183 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : symbol.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Symbol table header\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _SYMBOL_HH_\r
+#define _SYMBOL_HH_\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include "avrasm.hh"\r
+\r
+/// Defines //////////////////////////////////////////////////////////////////\r
+\r
+#ifdef _MSC_VER /* Nick original definition: */\r
+#define HASH_DEFAULT_SIZE       1024  // Could be any 2^N\r
+#define HASH_MAX_SIZE        0x10000  // Could be any 2^N\r
+#else /* Nick reduced for 16-bit version: */\r
+#define HASH_DEFAULT_SIZE      0x100  // Could be any 2^N\r
+#define HASH_MAX_SIZE         0x1000  // Could be any 2^N\r
+#endif\r
+\r
+/// Type/Class definitions ///////////////////////////////////////////////////\r
+\r
+class symbolTable;\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Symbol-table entry\r
+  //\r
+\r
+struct symbolTableEntry\r
+{\r
+  // Identifier\r
+\r
+  char                   name[MAX_ID_LENGTH+1];\r
+\r
+  // House keeping\r
+\r
+  int                    scope;\r
+  symbolTableEntry       *prev;\r
+  symbolTableEntry       *next;\r
+  symbolTableEntry       *up;\r
+  symbolTableEntry       *down;\r
+\r
+  // Symbol defines a macro\r
+\r
+  int                    macro;\r
+  char                   macfilename[MAX_FILENAME_LENGTH+1];\r
+  int                    macdefline;\r
+  int                    macsize;\r
+  char                   *macstr;\r
+  int                    macparms;\r
+  char                   macparmlist[10];\r
+  symbolTable            *macsym;\r
+  int                    macrodone;\r
+\r
+  // Symbol defines a variable\r
+\r
+  int                    isvar;\r
+\r
+  // Symbol defines a label\r
+\r
+  int                    islabel;\r
+  int                    offset;\r
+  int                    macrolabel;\r
+\r
+  // Symbol defines a value\r
+\r
+  int                    valid;\r
+  int                    valdefline;\r
+#ifdef _MSC_VER /* Nick */\r
+  int                    value;\r
+#else\r
+  long                   value;\r
+#endif\r
+  char                   valfilename[MAX_FILENAME_LENGTH+1];\r
+  int                    segment;\r
+  int                    mask;\r
+\r
+  // Symbol defines a register\r
+\r
+  int                    isdefine;\r
+  int                    regdefline;\r
+  int                    reg;\r
+  char                   regfilename[MAX_FILENAME_LENGTH+1];\r
+};\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Symbol-table class\r
+  //\r
+\r
+class symbolTable\r
+{\r
+\r
+public:\r
+\r
+  // Constructor/destructor\r
+\r
+  symbolTable();\r
+  ~symbolTable();\r
+\r
+  // Public member functions\r
+\r
+  int                init(int cs=0, unsigned int hashsize=HASH_DEFAULT_SIZE);\r
+  symbolTableEntry*  add(char *name);\r
+  symbolTableEntry*  get(char *name, int inscope = -1);\r
+  int                scopeDown(void);\r
+  int                scopeUp(void);\r
+  int                printTable(int fromscope=-1,int toscope=-1,int format=0);\r
+\r
+private:\r
+\r
+  // Private member functions\r
+\r
+  inline int         hash(char *name);\r
+\r
+  // Private data members\r
+\r
+  //  Scope stack entry\r
+\r
+  struct symbolScopeStack\r
+  {\r
+    symbolScopeStack       *up;\r
+    symbolScopeStack       *down;\r
+    symbolTableEntry       *first;\r
+    symbolTableEntry       *last;\r
+    int                    level;\r
+  };\r
+\r
+  int                hashSize;\r
+  int                scope;\r
+  symbolTableEntry   **symtab;\r
+  symbolScopeStack   *scopeTop;\r
+  symbolScopeStack   *currentScope;\r
+  symbolTableEntry   *currentSymbol;\r
+  int                casesensitive;\r
+\r
+};\r
+\r
+#endif /* _SYMBOL_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/t.bat b/src/mkutil/tavrasm.118/src/t.bat
new file mode 100644 (file)
index 0000000..5c03e46
--- /dev/null
@@ -0,0 +1,11 @@
+c:\tc\bin\tcc -ml -P -I. -DAVRLANG=LANGUAGE_US -c avrasm.cc\r
+c:\tc\bin\tcc -ml -P -I. -DAVRLANG=LANGUAGE_US -c semantic.cc\r
+c:\tc\bin\tcc -ml -P -I. -DAVRLANG=LANGUAGE_US -c symbol.cc\r
+c:\tc\bin\tcc -ml -P -I. -DAVRLANG=LANGUAGE_US -c utils.cc\r
+c:\tc\bin\tcc -ml -P -I. -DAVRLANG=LANGUAGE_US -c avrparse.cc\r
+c:\tc\bin\tcc -ml -P -I. -DAVRLANG=LANGUAGE_US -c avrlex.cc\r
+del tavrasm.exe\r
+c:\tc\bin\tlink @t.lnk\r
+del *.obj\r
+del *.map\r
+copy tavrasm.exe \hytech\src\avr\r
diff --git a/src/mkutil/tavrasm.118/src/t.lnk b/src/mkutil/tavrasm.118/src/t.lnk
new file mode 100644 (file)
index 0000000..14f2be5
--- /dev/null
@@ -0,0 +1,4 @@
+/m c:\tc\lib\c0l avrasm semantic symbol utils avrparse avrlex\r
+tavrasm\r
+tavrasm\r
+c:\tc\lib\cl c:\tc\lib\oldstrml c:\tc\lib\mathl c:\tc\lib\emu\r
diff --git a/src/mkutil/tavrasm.118/src/tavrasm.exe b/src/mkutil/tavrasm.118/src/tavrasm.exe
new file mode 100644 (file)
index 0000000..fa3f52c
Binary files /dev/null and b/src/mkutil/tavrasm.118/src/tavrasm.exe differ
diff --git a/src/mkutil/tavrasm.118/src/tsv4.asm b/src/mkutil/tavrasm.118/src/tsv4.asm
new file mode 100644 (file)
index 0000000..c27643e
--- /dev/null
@@ -0,0 +1,3616 @@
+;      TSV4.ASM\r
+\r
+;      19FEB02 REVISE FOR GREATER CONTRAST VOLTAGE FOR ALBERT'S 2ND BATCH -15V\r
+;      01FEB02 REVISE FOR 7.3728MHz XTAL (SEE !!!)\r
+\r
+;       22JUN01 REVISE -VE VOLTAGE GENERATION\r
+;               TO WORK WITH REV E PARTS\r
+;              ;!! INDICATES CHANGES\r
+\r
+;**    INDICATES CHANGES FOR LOW VCC AVR MOD\r
+\r
+.INCLUDE "8535DEF.INC"\r
+.INCLUDE "MAC.INC"\r
+.INCLUDE "APITS.INC" ; NOT API.INC BECAUSE APITS.INC ALSO HAS TURNON COMMAND\r
+;.INCLUDE "TERTS.INC" ; NOT TER.INC BECAUSE FLAGS IN LOWER HALF OF REGISTER SET\r
+\r
+.LISTMAC\r
+.MACRO LDIYADR                         ; POINT Y TO DSPRAM ADDR\r
+       LDI     YH,HIGH(@0>>6)\r
+       STS     XPAGE,YH\r
+       RCALL   ADRYP                   ; AND SET XPAGE\r
+       LDI     YH,HIGH(@0<<2)\r
+       LDI     YL,(LOW(@0) & $3F) | (HIGH(@0) & $C0)\r
+.ENDMACRO\r
+\r
+.MACRO ADRL\r
+       OUT     PORTC,@0                ; SET L ADDRESS FOR DSPRAM\r
+.ENDMACRO\r
+\r
+.MACRO ADRH\r
+       OUT     PORTA,@0                ; SET H ADDRESS FOR DSPRAM\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@0          ; IS THIS NEEDED?\r
+.ENDMACRO\r
+\r
+;.MACRO        ADRINC\r
+;      INC     @0                      ; INC LOW ORDER DSPRAM ADDRESS\r
+;      SBRC    @0,6                    ; ROLLS OVER IF BIT 6 SET\r
+;;     RCALL   INCADRY                 ; INC HIGH ORDER DSPRAM ADDRESS\r
+;.ENDMACRO                             ; (RCALL IS IN MAINLINE CODE)\r
+\r
+.MACRO A0_A13\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       MOV     R19,@1\r
+       LSL     R19\r
+       LSL     R19\r
+       BST     @0,7                    ; A7\r
+       BLD     R19,1\r
+       BST     @0,6                    ; A6\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       CLI\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       SEI\r
+       STS     LATCH11_SAV,R19\r
+.ENDMACRO\r
+\r
+.MACRO A14_A18\r
+       CLI\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       EOR     R19,@0\r
+       ANDI    R19,$E0\r
+       EOR     R19,@0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       SEI\r
+       STS     LATCH10_SAV,R19         ; MUST BE ATOMIC DUE TO TOGGLING M\r
+.ENDMACRO\r
+\r
+.MACRO A0_A15\r
+       PUSH    R19\r
+\r
+       MOV     R19,@0\r
+       ANDI    R19,$3F\r
+       OUT     PORTC,R19\r
+\r
+       MOV     R19,@1\r
+       LSL     R19\r
+       LSL     R19\r
+       BST     @0,7                    ; A7\r
+       BLD     R19,1\r
+       BST     @0,6                    ; A6\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,@1\r
+\r
+       LDS     R19,LATCH10_SAV         ; AND THIS\r
+       BST     @1,7                    ; A15\r
+       BLD     R19,1\r
+       BST     @1,6                    ; A14\r
+       BLD     R19,0\r
+       OUT     PORTA,R19\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,R19\r
+\r
+       POP     R19\r
+.ENDMACRO\r
+\r
+.MACRO RAMWR\r
+       OUT     PORTA,@0\r
+       CLI\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMWRX\r
+       OUT     PORTA,@0\r
+       CBI     PORTB,1\r
+       CBI     PORTB,0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRXW\r
+       CLR     @1\r
+       OUT     DDRA,@1\r
+       CLI\r
+       CBI     PORTB,0\r
+       NOP\r
+       CBI     PORTB,1\r
+       IN      @1,PINA\r
+       EOR     @0,@1\r
+       SBRC    FLAGS,0\r
+       OR      @0,@1\r
+       LDI     @1,$FF\r
+       OUT     DDRA,@1\r
+       OUT     PORTA,@0\r
+       NOP\r
+       SBI     PORTB,0\r
+       SEI\r
+       SBI     PORTB,1\r
+.ENDMACRO\r
+\r
+.MACRO RAMRD\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CLI\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       SEI\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO RAMRDX\r
+       CLR     F\r
+       OUT     DDRA,F                  ; PORTA INPUT\r
+       CBI     PORTB,0                 ; CS_ON\r
+       NOP\r
+       SBI     PORTB,0                 ; CS_OFF\r
+       IN      @0,PINA                 ; READ DATA\r
+       LDI     F,$FF\r
+       OUT     DDRA,F                  ; PORTA OUTPUT\r
+.ENDMACRO\r
+\r
+.MACRO PHOTO\r
+       OUT     PORTA,@0                ; SELECT PHOTODIODE CHANNEL\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,0\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LED\r
+       OUT     PORTA,@0                ; MAIN LED DRIVE PORT\r
+       LDS     @0,LATCH12_SAV\r
+       OUT     PORTC,@0\r
+       SBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+       CBI     PORTC,1\r
+       SBI     PORTB,2                 ; THIS WILL PROVIDE LE=1\r
+       CBI     PORTB,2                 ; THIS WILL PROVIDE G=0\r
+.ENDMACRO\r
+\r
+.MACRO LEDLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON LO\r
+       CBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO LEDHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE LED COMMON HI\r
+       SBR     D,1<<4\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKHI\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER HI\r
+       SBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKLO\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER LO\r
+       CBR     D,1<<3\r
+       SBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.MACRO SPKOFF\r
+       LDS     D,LATCH12_SAV           ; DRIVE SPEAKER OFF\r
+       CBR     D,1<<3\r
+       CBR     D,1<<2\r
+       OUT     PORTC,D\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,D\r
+.ENDMACRO\r
+\r
+.EQU   T1_INIT         =-818 ;$FB35\r
+.EQU   T1_FULL_SCALE   =-716 ;50.0HZ   ; SETS LCD FRAME RATE TEMPORARY TO STOP FLIKER\r
+;.EQU  T1_FULL_SCALE   =-651 ;53.5HZ   ; SETS LCD FRAME RATE\r
+;.EQU  T1_FULL_SCALE   =-600 ;54.8HZ   ; SETS LCD FRAME RATE\r
+\r
+.EQU   CONTRAST_LONG   =-340           ; ALL LONG PULSES IS FULLY DARK (DON'T SATURATE)\r
+;.EQU  CONTRAST_LONG   =-250           ; ALL LONG PULSES IS FULLY DARK (DON'T SATURATE)\r
+.EQU   CONTRAST_MID    =-200\r
+.EQU   CONTRAST_SHORT  = -43           ; ALL SHORT PULSES IS FULLY LIGHT\r
+\r
+.EQU   VCC_NOMINAL     =-552 ;$FCC4\r
+\r
+.EQU   VEE_MIN         =-710           ; MIN IS FULLY DARK\r
+.EQU   VEE_INIT        =-340\r
+.EQU   VEE_MAX         = -43           ; MAX IS FULLY LIGHT\r
+\r
+; WHEN VCC = $FCC4 FOR 6.0V:\r
+.EQU   CONTRAST_MIN    =-710           ; MIN IS FULLY DARK\r
+.EQU   CONTRAST_INIT   =-640\r
+.EQU   CONTRAST_MAX    =-580           ; MAX IS FULLY LIGHT\r
+\r
+; GENEROUS LIMITS FOR EXPERIMENTATION:\r
+;.EQU  CONTRAST_MIN    =$FC80          ; MIN IS FULLY DARK\r
+;.EQU  CONTRAST_MAX    =$FF80          ; MAX IS FULLY LIGHT\r
+;.EQU  CONTRAST_INIT   =$FE10\r
+\r
+.EQU   CONTRAST_STEP   =4\r
+\r
+.EQU   DISP_DSPRAM     =$60000         ; DISPLAY BUFFER\r
+.EQU   DRAW_DSPRAM     =$62000         ; DRAWING BUFFER\r
+.EQU   CHSET_DSPRAM    =$64000         ; START OF CHARACTER SETS\r
+.EQU   RTN_DSPRAM      =$6E000         ; KEYBOARD RETURN CODE TABLE\r
+.EQU   DISPLAY_LINES   =$80\r
+.EQU   CHARACTER_SETS  =10\r
+.EQU   RAM             =$60            ; START OF SRAM\r
+.EQU   TX_SIZE         =$20\r
+.EQU   RX_SIZE         =$80\r
+\r
+.EQU   TK_LED_PULSE    =14             ; 18US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_0      =19             ; ??US DELAY TILL START OF LED PULSE (/8)\r
+;.EQU  TK_DELAY_0      =$20 ;$38       ; ??US DELAY TILL START OF LED PULSE\r
+;.EQU  TK_DELAY_0      =$25 ;$38       ; 54US ?? CLOCKS OF /8\r
+.EQU   TK_DELAY_1      =$10 ;$28       ; CLOCKS OF /64, CHANNEL SELECT DELAY\r
+.EQU   TK_DELAY_2      =$00            ; CLOCKS OF /1024, VDD POWER ON DELAY\r
+                                       ; $D0 IS TOO SHORT, $E0 SEEMS TO WORK\r
+\r
+.EQU   API_ADDRESS     =$02            ; TOUCHSCREEN ADDRESS\r
+.EQU   API_TIMEOUT     =33 ;50         ; 50 * 100 uSEC = APPROX 5mSEC\r
+.EQU   API_RATE_SLOW   =$17 ;$5F       ; DIVISOR FOR 19200 BPS\r
+.EQU   API_RATE_FAST   =$00 ;$03       ; DIVISOR FOR 460800 BPS\r
+.EQU   EEWR_ENABLE     =5              ; SET BY FG WHILE OK TO WRITE EEPROM\r
+.EQU   APISIZE         =6              ; SET IF EXPECTING API DATA SIZE CMD\r
+.EQU   APIDATA         =7              ; SET IF TRANSFERRING API DATA TX/RX\r
+\r
+.DEF   PATTERN         =R0             ; FOR HALFTONE_RECT ROUTINE\r
+.DEF   SR              =R1\r
+.DEF   RX_PTR          =R2\r
+.DEF   RX_COUNT        =R3\r
+.DEF   TX_PTR          =R4\r
+.DEF   TX_COUNT        =R5\r
+.DEF   API_REMAIN      =R6\r
+.DEF   API_WATCHDOG    =R12\r
+\r
+.DEF   Y_SIZE          =R7\r
+.DEF   X_SIZE          =R8\r
+.DEF   LINE_CNT        =R9\r
+.DEF    XBYTE          =R10\r
+.DEF    FLAGS          =R11\r
+; FLAGS        BIT 0   0=XOR MODE                      1=OR MODE\r
+;      BIT 1   0=FILL RECT                     1=CLEAR RECT\r
+;      BIT 2   0=OPEN ZEROS                    1=CROSSED ZEROS\r
+;      BIT 3   0=TEXT MODE                     1=GRAPHICS MODE\r
+;      BIT 4   0=FIXED                         1=PROPORTIONAL\r
+;      BIT 5   0=DISPLAY DISABLED              1=DISPLAY ENABLED\r
+;      BIT 6   0=TURNED OFF VIA TRANSIT SW     1=TURNED OFF VIA COMMAND\r
+;      BIT 7   USED TO CONTROL LED PULSING FOR TOUCHSCREEN EVERY 2ND CYCLE\r
+.DEF   SCAN            =R13\r
+.DEF   API_STATE       =R14\r
+\r
+.DEF   W               =R15\r
+.DEF   F               =R16                    ; FG\r
+.DEF    A              =R17                    ; FG\r
+.DEF   B               =R18                    ; FG\r
+.DEF   C               =R20                    ; INT\r
+.DEF   D               =R21                    ; INT\r
+.DEF   E               =R25                    ; INT\r
+;.DEF  ?               =R19                    ; INT\r
+\r
+.DEF   XPIXEL          =R22\r
+.DEF   CURSORX         =R23\r
+.DEF   CURSORY         =R24\r
+\r
+; for AVRA / TAVRASM:\r
+;.def  XL              =R26\r
+;.def  XH              =R27\r
+;.def  YL              =R28\r
+;.def  YH              =R29\r
+;.def  ZL              =R30\r
+;.def  ZH              =R31\r
+\r
+.DSEG\r
+.ORG   RAM\r
+\r
+TX_BUF:                .BYTE   TX_SIZE\r
+RX_BUF:                .BYTE   RX_SIZE\r
+\r
+XBYTE_SAV:     .BYTE   1       ; 063\r
+X_SIZE_SAV:    .BYTE   1       ; 066\r
+XPIXEL_SAV:    .BYTE   1       ; 067\r
+PTR:           .BYTE   3       ; 068\r
+PORT_STATE:    .BYTE   1       ; 0FA\r
+ACTIVE_ZONE:   .BYTE   1       ; 0FB\r
+\r
+TMPL:          .BYTE   1       ; 0FE\r
+TMPH:          .BYTE   1       ; 0FF\r
+VCCL:          .BYTE   1       ; 100\r
+VCCH:          .BYTE   1       ; 101\r
+VEEL:          .BYTE   1       ; 102\r
+VEEH:          .BYTE   1       ; 103\r
+CONTRASTL:     .BYTE   1       ; 104\r
+CONTRASTH:     .BYTE   1       ; 105\r
+\r
+BUZZ_TIME:     .BYTE   1       ; 10B\r
+BUZZ_PERIOD:   .BYTE   1\r
+TEMP:          .BYTE   1       ; 10C\r
+\r
+DEBOUNCE:      .BYTE   1\r
+ROW_INDEX:     .BYTE   1\r
+ROW_BITMAP:    .BYTE   2\r
+LATCH10_SAV:   .BYTE   1\r
+LATCH11_SAV:   .BYTE   1\r
+LATCH12_SAV:   .BYTE   1\r
+XPAGE:         .BYTE   1\r
+ROWBUF:                .BYTE   32      ; BUFFER FOR DSPRAM BLOCK READ/WRITE\r
+\r
+LINE_COUNT:    .BYTE   1       ; CURRENT POSITION TO TEST LINE_FLAGS\r
+LINE_FLAGS:    .BYTE   16      ; BUFFER 1 BIT PER LINE FOR COPY REQUIRED\r
+\r
+CLOCKING_PTR:  .BYTE   2\r
+\r
+CHAR_X:                .BYTE   1\r
+CHAR_Y:                .BYTE   1\r
+CHAR_PTR:      .BYTE   2\r
+\r
+RECT_X:                .BYTE   1\r
+RECT_Y:                .BYTE   1\r
+RECT_XX:       .BYTE   1\r
+RECT_YY:       .BYTE   1\r
+\r
+RECTNC_X:      .BYTE   1\r
+RECTNC_Y:      .BYTE   1\r
+RECTNC_XX:     .BYTE   1\r
+RECTNC_YY:     .BYTE   1\r
+\r
+TOUCH_KEY:     .BYTE   1\r
+TOUCH_X:       .BYTE   1\r
+TOUCH_Y:       .BYTE   1\r
+TOUCH_XX:      .BYTE   1\r
+TOUCH_YY:      .BYTE   1\r
+\r
+TIME_HSEC_64K: .BYTE   1\r
+TIME_HSEC_256: .BYTE   1\r
+TIME_HSEC:     .BYTE   1\r
+TIME_SECOND:   .BYTE   1\r
+TIME_MINUTE:   .BYTE   1\r
+TIME_HOUR:     .BYTE   1\r
+DATE_DAY:      .BYTE   1\r
+DATE_MONTH:    .BYTE   1\r
+DATE_YEAR:     .BYTE   1\r
+\r
+SCAN_STATE:    .BYTE   1\r
+LATCH5_SAV:    .BYTE   1\r
+TURNON_COUNT:  .BYTE   1\r
+BREAK_COUNT:   .BYTE   1\r
+\r
+CURSORX_SAVE:  .BYTE   1\r
+CURSORY_SAVE:  .BYTE   1\r
+FLAGS_SAVE:    .BYTE   1\r
+PTR_SAVE:      .BYTE   3\r
+\r
+SCROLL_COUNT:  .BYTE   1\r
+SCROLL_X:      .BYTE   1\r
+SCROLL_Y:      .BYTE   1\r
+SCROLL_XX:     .BYTE   1\r
+SCROLL_YY:     .BYTE   1\r
+\r
+.ESEG\r
+.ORG   $000\r
+\r
+               .DB     $00,$00         ; DON'T USE ADDR $000\r
+EE_CONTRAST:   .DB     $00,$00         ; RELY ON CONTRAST_INIT TO INITIALISE\r
+\r
+.CSEG\r
+.ORG   $0000\r
+\r
+       RJMP    RESET_ENTRY\r
+       RJMP    GO_EXT_INT0\r
+       RJMP    GO_EXT_INT1\r
+       RETI                            ; TIM2_CMP\r
+       RJMP    GO_TIM2_OVF             ; TIM2_OVF\r
+       RETI                            ; TIM1_CAPT\r
+       RETI                            ; TIM1_COMPA\r
+       RETI                            ; TIM1_COMPB\r
+       RJMP    GO_T1_OVERFLOW\r
+       RJMP    GO_T0_OVERFLOW\r
+       RETI                            ; SPI_STC\r
+       INT_HANDLERS                    ; API BUS\r
+\r
+RESET_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+       LDI     A,$80\r
+       OUT     ACSR,A                  ; POWER DOWN ANALOG COMPARATOR\r
+\r
+       WDR                             ; RESET WATCHDOG\r
+       LDI     A,$0F                   ; ENABLE WATCHDOG WITH 3 SEC TIMEOUT\r
+       OUT     WDTCR,A\r
+\r
+       LDI     F,0\r
+       STS     TIME_HSEC_64K,F\r
+       STS     TIME_HSEC_256,F\r
+       STS     TIME_HSEC,F\r
+       STS     TIME_SECOND,F\r
+       STS     TIME_MINUTE,F\r
+       STS     TIME_HOUR,F\r
+       LDI     F,1\r
+       STS     DATE_DAY,F\r
+       STS     DATE_MONTH,F\r
+       LDI     F,20\r
+       STS     DATE_YEAR,F\r
+\r
+RESTART_ENTRY:\r
+;**:\r
+       LDI     F,8                     ; TIMER 2 CLOCKED BY 32 KHZ\r
+;**    LDI     F,0                     ; TIMER 2 CLOCKED BY 11 MHZ\r
+       OUT     ASSR,F\r
+;**:\r
+       ; MUST MATCH SET_TIME ROUTINE %\r
+       LDI     F,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;!!    LDI     F,$11                   ; DIVIDE BY 2, TOGGLE OC2 (PIN 21)\r
+                                       ; (RTC DIAGNOSTIC)\r
+;**    LDI     F,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,F\r
+       ; %\r
+       LDI     F,$40\r
+       OUT     TIMSK,F                 ; TIMER 2 OVERFLOW INTERRUPTS ENABLED\r
+       LDI     F,$00\r
+       OUT     GIMSK,F\r
+\r
+       LDI     F,$B8                   ; INIT_PORTS\r
+       OUT     DDRD,F\r
+       OUT     PORTD,F                 ; D2 = TRI-STATE, VSWT ON\r
+       LDI     F,$1F\r
+       OUT     DDRB,F\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       OUT     DDRC,F\r
+\r
+       CLR     F\r
+       OUT     PORTA,F\r
+\r
+       LDI     F,$03                   ; CS, WE HI, LEs ALL LO\r
+       OUT     PORTB,F\r
+\r
+       LDI     F,$10                   ; LED COMMON OFF, SPEAKER OFF\r
+       OUT     PORTC,F\r
+       SBI     PORTB,2\r
+       CBI     PORTB,2\r
+       STS     LATCH12_SAV,F\r
+\r
+       LDI     F,$20\r
+       MOV     FLAGS,F                 ; START WITH DISPLAY ENABLED\r
+\r
+       INIT_API_BUS\r
+\r
+       LDI     D,$18                   ; A18|A17|A16|A15|A14=11000\r
+       OUT     PORTA,D                 ; CL1=M=FLM=0\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       CLR     D\r
+       STS     LATCH11_SAV,D\r
+       STS     LINE_COUNT,D            ; START UPDATE AT TOP OF SCREEN\r
+       STS     TURNON_COUNT,D          ; REDUNDANTLY REQUEST TURNON\r
+       STS     BREAK_COUNT,D           ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BUZZ_TIME,D             ; NOT BUZZING (SHORT BEEP COMES LATER)\r
+\r
+       CLR     SCAN\r
+       STS     ROW_INDEX,SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+       LDI     D,$F4                   ; BIT 6 = 1 VDD ON, BIT 7 = 1 LCD ON\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       ; NEED THIS FOR RTC\r
+       SEI                             ; ALLOW TIMER 2 INTERRUPTS ONLY\r
+\r
+       ; INITIALISE ACTIVE KEYS\r
+RTNCDE:        ;LDIZ   RTN_CODE                ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((RTN_CODE)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((RTN_CODE)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ;LDIX   RTN_CODE_END-RTN_CODE   ; BYTE COUNTER\r
+       LDI     XL,LOW((RTN_CODE_END-RTN_CODE)*2)       ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((RTN_CODE_END-RTN_CODE)*2)      ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR RTN_DSPRAM              ; POINT Y TO DSPRAM & SET XPAGE\r
+CDE0:  ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CDE1:  ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+ CLR R0 ; TEMPORARY CLEAR KB\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       DEC     XL\r
+       BREQ    RTNCDE_END              ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CDE1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CDE0\r
+RTNCDE_END:\r
+\r
+       ; INITIALISE DEFAULT CHARACTER SET\r
+       LDI     A,'0'\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       PUSH    YL\r
+       PUSH    YH\r
+       RCALL   CHARACTER_SET_CRC       ; Y = CALCULATED CRC WORD\r
+       POP     XH\r
+       POP     XL\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YH\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BRNE    CHARACTER_SET_INIT\r
+       ADIW    XL,1\r
+\r
+       RCALL   GO_READ_BYTE\r
+       MOV     B,A\r
+       MOV     A,YL\r
+       RCALL   HEX_NIBBLE\r
+       CP      A,B\r
+       BREQ    CHARACTER_SET_INIT_DONE\r
+\r
+CHARACTER_SET_INIT:\r
+       ;LDIZ   CHSET00                 ; POINT Z TO FLASH\r
+       LDI     ZL,LOW((CHSET00)*2)     ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((CHSET00)*2)    ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ;LDIX   CHSET00_END-CHSET00     ; BYTE COUNTER\r
+       LDI     XL,LOW((CHSET00_END-CHSET00)*2) ; USE AS BYTE COUNTER\r
+       LDI     XH,HIGH((CHSET00_END-CHSET00)*2)        ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       LDIYADR CHSET_DSPRAM            ; POINT Y TO DSPRAM & SET XPAGE\r
+CHST0: ADRH    YH                      ; SET ADDRESS H FOR DSPRAM\r
+CHST1: ADRL    YL                      ; SET ADDRESS L FOR DSPRAM\r
+       LPM                             ; GET DATA FROM FLASH\r
+       RAMWRX  R0                      ; WRITE DATA TO DSPRAM\r
+       SBIW    XL,1\r
+       BREQ    CHARACTER_SET_INIT_DONE ; CHECK IF ALL DONE\r
+       ADIW    ZL,$01                  ; INC FLASH ADDRESS\r
+       INC     YL                      ; INC ADDRESS L FOR DSPRAM\r
+       MOV     A,YL ;\r
+       ANDI    A,$3F ;YL,$3F\r
+       BRNE    CHST1\r
+       SUBI    YL,$40 ;\r
+       INC     YH                      ; INC ADDRESS H (ON L ROLLOVER)\r
+       RJMP    CHST0\r
+\r
+CHARACTER_SET_INIT_DONE:\r
+       LDI     B,LOW(CHSET_DSPRAM+$10) ; SET POINTER TO HEADER\r
+       STS     PTR,B\r
+       LDI     B,HIGH(CHSET_DSPRAM+$10) ;<<2\r
+       STS     PTR+1,B\r
+       LDI     B,HIGH((CHSET_DSPRAM+$10)>>6)\r
+       STS     PTR+2,B\r
+\r
+       ; CLEAR REFRESH BUFFER TO AVOID A BRIEF FLICKER\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   GO_SELECT_XPAGE\r
+\r
+       LDI     B,DISPLAY_LINES         ; B = LINES TO CLEAR\r
+\r
+CLEAR_REFRESH:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDI     B,32\r
+       RCALL   GO_CLEAR_BYTES          ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   GO_CLEAR_BYTES          ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    CLEAR_REFRESH\r
+\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+\r
+       LDI     A,0\r
+       STS     BUZZ_PERIOD,A           ; HIGHEST FREQUENCY\r
+       LDI     A,54 ;$40\r
+       STS     BUZZ_TIME,A             ; SHORT BEEP ON STARTUP\r
+\r
+       LDI     A,0\r
+       STS     SCAN_STATE,A            ; START ON FIRST LED / PHOTODIODE PAIR\r
+\r
+       LDI     A,0\r
+       STS     CLOCKING_PTR,A\r
+       STS     CLOCKING_PTR+1,A        ; INITIALISE CURRENT LINE FOR CLOCKING\r
+\r
+       LDI     A,HIGH(VEE_INIT)\r
+       STS     VEEH,A\r
+       LDI     A,LOW(VEE_INIT)\r
+       STS     VEEL,A                  ; INIT MEASURED VEE\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_READ\r
+       ANDI    A,~(CONTRAST_STEP-1)\r
+       STS     CONTRASTL,A\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_READ\r
+       STS     CONTRASTH,A\r
+\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_RESET\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_PRESERVE\r
+\r
+CONTRAST_RESET:\r
+       LDI     A,HIGH(CONTRAST_INIT)\r
+       STS     CONTRASTH,A\r
+       LDI     A,LOW(CONTRAST_INIT)\r
+       STS     CONTRASTL,A             ; INIT REQUESTED CONTRAST\r
+\r
+CONTRAST_PRESERVE:\r
+       LDI     A,HIGH(CONTRAST_MID)\r
+       OUT     OCR1BH,A\r
+       LDI     A,LOW(CONTRAST_MID)\r
+       OUT     OCR1BL,A                ; INIT GENERATOR PULSE WIDTH\r
+\r
+       LDI     A,HIGH(T1_INIT)\r
+       OUT     TCNT1H,A\r
+       LDI     A,LOW(T1_INIT)\r
+       OUT     TCNT1L,A\r
+\r
+       LDI     A,$50\r
+       OUT     TCCR1A,A                ; TIMER 1 TOGGLE ON COMPARE MATCH\r
+       LDI     A,$01\r
+       OUT     TCCR1B,A                ; TIMER 1 RUNNING\r
+\r
+       LDI     F,$00\r
+       OUT     TCCR0,F                 ; TIMER 0 NOT RUNNING YET\r
+\r
+       LDI     F,$05\r
+       OUT     TIFR,F                  ; RESET TIMER 0, 1 INTERRUPT FLAGS\r
+       LDI     F,$45\r
+       OUT     TIMSK,F                 ; TURN ON TIMER 0, 1, 2 INTERRUPTS\r
+\r
+       LDI     F,$0A\r
+       OUT     MCUCR,F                 ; SET EXTERNAL INTERRUPT 0, 1 SENSE\r
+       LDI     F,$C0\r
+       OUT     GIFR,F                  ; RESET EXTERNAL INTERRUPT 0, 1 FLAGS\r
+       OUT     GIMSK,F                 ; TURN ON EXTERNAL INTERRUPT 0, 1\r
+\r
+       ;RCALL  HELLO_DISPLAY           ; SHOW EXAMPLE DISPLAY\r
+\r
+       ;RCALL  CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    SAVE_ENTRY              ; IN CASE STATE INADVERTENTLY RESTORED\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+SLEEP_ENTRY:\r
+       LDI     F,HIGH(RAMEND)          ; INIT STACK POINTER\r
+       OUT     SPH,F\r
+       LDI     F,LOW(RAMEND)\r
+       OUT     SPL,F\r
+\r
+       LDI     D,$00\r
+       OUT     TCCR1A,D                ; DISCONNECT PWM FROM OC1A, OC1B\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       OUT     TCCR1B,D                ; STOP TIMER 1 ALTOGETHER\r
+\r
+       SBI     PORTD,4                 ; TURN TRANSISTOR OFF\r
+       CBI     PORTD,5                 ; DROP CL2\r
+\r
+       LDS     D,LATCH10_SAV\r
+       ANDI    D,$BF                   ; DROP M\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+       LDI     D,$74                   ; BIT 6 = 1 VDD ON, BIT 7 = 0 LCD OFF\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       LDI     D,$34                   ; BIT 6 = 0 VDD OFF, BIT 7 = 0 LCD OFF\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+\r
+       LDI     D,$41\r
+       OUT     TIMSK,D                 ; DISABLE TIMER 1 INTERRUPTS\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; DISABLE TIMER 0 TEMPORARILY ONLY\r
+       OUT     GIMSK,D                 ; DISABLE THERMISTOR INTERRUPTS\r
+\r
+       LDI     F,4\r
+       STS     TURNON_COUNT,F          ; .25 SEC TO BREAK, .75 SEC TO MAKE\r
+\r
+       INIT_API_BUS                    ; RESET UART TO RECEIVE TURNON COMMAND\r
+\r
+SLEEP_LOOP:\r
+       CLI\r
+       IN      F,TCCR0\r
+       TST     F\r
+       LDI     F,$4A                   ; SE=1 SM1:SM0=00 FOR IDLE MODE\r
+       BRNE    SLEEP_SETUP             ; TIMER 0 RUNNING, STAY IN IDLE MODE\r
+       SBIS    PIND,0                  ; BREAK OFF, UART ACTIVE, STAY IN IDLE\r
+       LDI     F,$7A                   ; SE=1 SM1:SM0=11 FOR POWER SAVE MODE\r
+SLEEP_SETUP:\r
+       OUT     MCUCR,F\r
+       SEI\r
+       SLEEP\r
+\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDS     F,TURNON_COUNT\r
+       TST     F                       ; HAD TOUCHSCREEN ACTIVITY FOR TIMEOUT?\r
+       ;SBRS   FLAGS,6                 ; IF WE TURNED OFF VIA BREAK DETECT,\r
+       ;SBIS   PIND,0                  ; AND BREAK HAS DISAPPEARED, WAKE UP\r
+       BRNE    SLEEP_LOOP              ; NO, GO BACK TO SLEEP\r
+\r
+       CLI\r
+       RJMP    RESTART_ENTRY           ; GO AND CLEAR DISPLAY ETC\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+ADRYP: LDS     YH,XPAGE                        ; SET XPAGE ADDRESS FOR DSPRAM\r
+       LDS     YL,LATCH10_SAV\r
+       ANDI    YL,$E0\r
+       OR      YH,YL\r
+       OUT     PORTA,YH\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,YH\r
+       RET\r
+\r
+;INCADRY:\r
+;      CLR     YL\r
+;      INC     YH\r
+;      BRNE    INCRET\r
+;      LDS     YH,XPAGE\r
+;      INC     YH\r
+;      ANDI    YH,$1F\r
+;      STS     XPAGE,YH\r
+;      CLR     YH\r
+;INCRET:       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+;HELLO_DISPLAY:\r
+;      LDI     A,0\r
+;      STS     RECTNC_X,A\r
+;      STS     RECTNC_Y,A\r
+;      STS     RECTNC_XX,A\r
+;      LDI     A,$80\r
+;      STS     RECTNC_YY,A\r
+;      RCALL   DRAW_RECTNC\r
+;\r
+;      LDI     A,16\r
+;      STS     CHAR_X,A\r
+;      STS     CHAR_Y,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;      RCALL   STRING_DRAW\r
+;\r
+;      LDI     A,240\r
+;      STS     CHAR_X,A\r
+;      LDI     B,5\r
+;      LDI     ZL,LOW(HELLO_MESSAGE*2)\r
+;      LDI     ZH,HIGH(HELLO_MESSAGE*2)\r
+;\r
+;STRING_RIGHT_JUST:\r
+;      PUSH    B\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   STRING_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     B\r
+;      LDS     A,CHAR_X\r
+;      SUB     A,R0\r
+;      STS     CHAR_X,A\r
+;\r
+;STRING_DRAW:\r
+;      PUSH    B\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      PUSH    R0\r
+;      RCALL   DRAW_CHAR\r
+;      POP     R0\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      LDS     A,CHAR_X\r
+;      ADD     A,R0\r
+;      STS     CHAR_X,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_DRAW\r
+;      RET\r
+;\r
+;STRING_WIDTH:\r
+;      CLR     R0\r
+;STRING_WIDTH_LOOP:\r
+;      PUSH    B\r
+;      PUSH    R0\r
+;      LPM\r
+;      MOV     A,R0\r
+;      ADIW    ZL,1\r
+;      PUSH    ZL\r
+;      PUSH    ZH\r
+;      RCALL   FIND_CHAR\r
+;      RCALL   CHAR_WIDTH\r
+;      POP     ZH\r
+;      POP     ZL\r
+;      POP     A\r
+;      ADD     R0,A\r
+;      POP     B\r
+;      DEC     B\r
+;      BRNE    STRING_WIDTH_LOOP\r
+;      RET\r
+;\r
+;HELLO_MESSAGE:        .DB     'H','E','L','L','O',0\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MAIN_LOOP:\r
+       SEI                             ; SHOULD BE BEFORE MAIN_LOOP\r
+\r
+       LDI     A,~(1<<EEWR_ENABLE)\r
+       AND     API_STATE,A             ; DISABLE WRITE ACCESS TO EEPROM\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       RCALL   RX_WAIT\r
+\r
+       CPI     A,$1B\r
+       BREQ    ESC_SEQUENCE\r
+\r
+       SBRC    FLAGS,3\r
+       RJMP    REGULAR_CHAR\r
+       CPI     A,$20\r
+       BRSH    REGULAR_CHAR\r
+\r
+       CPI     A,$08\r
+       RJEQ    BACK_SPACE\r
+;L0132:\r
+       CPI     A,$0D\r
+       RJEQ    CR\r
+;L0135:\r
+       CPI     A,$0A\r
+       BRNE    TEST_BELL\r
+       RJMP    LF\r
+TEST_BELL:\r
+       CPI     A,7\r
+       BRNE    MAIN_LOOP\r
+\r
+REGULAR_CHAR:\r
+       SBRC    FLAGS,2                 ; CROSSED ZEROS ON?\r
+       RJMP    L013B                   ; YES, DON'T BOTHER TESTING FOR ZERO\r
+       CPI     A,'0'\r
+       BRNE    L013B\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YL,LOW(-$204)\r
+       SBCI    YH,HIGH(-$204)\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,R0\r
+L013B: RCALL   DRAW_CHAR_TTY\r
+       RJMP    MAIN_LOOP\r
+\r
+ESC_SEQUENCE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$1B\r
+       BREQ    REGULAR_CHAR\r
+       CPI     A,'.'\r
+       RJEQ    CHARACTER_SET_DOWNLOAD\r
+       CPI     A,'/'\r
+       RJEQ    CROSSED_ZEROS\r
+       CPI     A,'?'\r
+       RJEQ    CHARACTER_SET_QUERY\r
+       CPI     A,'B'\r
+       RJEQ    BUZZER\r
+       CPI     A,'b'\r
+       RJEQ    BUZZ_AT_FREQ\r
+       CPI     A,'C'\r
+       RJEQ    CLEAR_RECTANGLE\r
+       CPI     A,'D'\r
+       RJEQ    DRAW_MODE\r
+       CPI     A,'E'\r
+       RJEQ    ENABLE_CNTRL\r
+       CPI     A,'F'\r
+       RJEQ    GET_FILLED_RECTNC_SIZE\r
+       CPI     A,'G'\r
+       RJEQ    INTERPRET_MODE\r
+       CPI     A,'h'\r
+       RJEQ    GO_GET_HALFTONE_RECT_SIZE\r
+       CPI     A,'K'\r
+       RJEQ    CLR_DISP\r
+       CPI     A,'L'\r
+       RJEQ    GO_SCROLL_REGION\r
+       CPI     A,'M'\r
+       RJEQ    MOSFET_CONTROL\r
+       CPI     A,'N'\r
+       RJEQ    GET_RECTNC_SIZE\r
+       CPI     A,'P'\r
+       RJEQ    PROP_FIXED_MODE\r
+       CPI     A,'R'\r
+       RJEQ    GET_RECT_SIZE\r
+       CPI     A,'S'\r
+       RJEQ    SET_CURSOR\r
+       CPI     A,'T'\r
+       RJEQ    SET_TIME\r
+       CPI     A,'U'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'V'\r
+       BRNE    CONTRAST_CONTROL_SKIP\r
+       LDI     A,1<<EEWR_ENABLE\r
+       OR      API_STATE,A             ; ENABLE WRITE ACCESS TO EEPROM\r
+       RJMP    CONTRAST_CONTROL\r
+CONTRAST_CONTROL_SKIP:\r
+       CPI     A,'W'\r
+       RJEQ    NULLSUB\r
+       CPI     A,'X'\r
+       RJEQ    SAVE_STATE\r
+       CPI     A,'Z'\r
+       RJEQ    TOUCH_ZONE\r
+       CPI     A,'0'\r
+       BRLO    ESC_SEQUENCE_ABORT\r
+       CPI     A,'9'+1\r
+       BRLO    SET_CHSET_A\r
+ESC_SEQUENCE_ABORT:\r
+       RJMP    MAIN_LOOP\r
+\r
+CROSSED_ZEROS:\r
+       RCALL   RX_WAIT\r
+       SBRS    A,0\r
+       RJMP    CROSSED_ZEROS_OFF\r
+       LDI     A,1<<2\r
+       OR      FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+CROSSED_ZEROS_OFF:\r
+       LDI     A,~(1<<2)\r
+       AND     FLAGS,A\r
+       RJMP    MAIN_LOOP\r
+\r
+MOSFET_CONTROL:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30                   ; DO NOT TURN OFF BY ACCIDENT\r
+       BRNE    MOSFET_CONTROL_DONE\r
+       CLI\r
+       LDI     F,1<<6\r
+       OR      FLAGS,F                 ; SAY WE TURNED OFF VIA COMMAND\r
+       SBI     DDRD,2                  ; D2 = LOW, VSWT OFF\r
+       RJMP    SLEEP_ENTRY             ; GO AND SHUT DOWN DISPLAY\r
+MOSFET_CONTROL_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+BUZZER:        RCALL   RX_WAIT\r
+       PUSH    A\r
+       LDI     A,0                     ; HIGHEST FREQUENCY\r
+       RJMP    BUZZ_AT_FREQ_A\r
+\r
+BUZZ_AT_FREQ:\r
+       RCALL   RX_WAIT\r
+       PUSH    A\r
+       RCALL   RX_WAIT\r
+       ANDI    A,$0F\r
+BUZZ_AT_FREQ_A:\r
+       STS     BUZZ_PERIOD,A           ; SAVE REQUESTED PERIOD\r
+       POP     A\r
+       STS     BUZZ_TIME,A             ; SAVE REQUESTED DURATION\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CHSET:\r
+       RCALL   RX_WAIT\r
+SET_CHSET_A:\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+       LDI     YL,$10\r
+       STS     PTR,YL\r
+       STS     PTR+1,YH\r
+       STS     PTR+2,B\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_TIME:\r
+       LDI     A,0\r
+       OUT     TCCR2,A                 ; STOP COUNTING WHILE SETTING CLOCK\r
+       STS     TIME_HSEC_64K,A\r
+       STS     TIME_HSEC_256,A\r
+       STS     TIME_HSEC,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_HOUR,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_MINUTE,A\r
+       RCALL   RX_WAIT\r
+       STS     TIME_SECOND,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_MONTH,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_DAY,A\r
+       RCALL   RX_WAIT\r
+       STS     DATE_YEAR,A\r
+       LDI     A,3                     ; TIMER 2 DIVIDE BY 32 (4 HZ)\r
+;**    LDI     A,6                     ; TIMER 2 DIVIDE BY 256\r
+       OUT     TCCR2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+LF:    RCALL   LINE_FEED\r
+       RJMP    MAIN_LOOP\r
+\r
+LINE_FEED:\r
+       PUSH    R0\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       INC     YL\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       MOV     A,CURSORY\r
+       ADD     A,R0\r
+       ADD     A,R0\r
+       DEC     A\r
+       CPI     A,DISPLAY_LINES\r
+       BRLO    INC_CURSORY\r
+       RCALL   GO_SCROLL\r
+       POP     R0\r
+       RET\r
+\r
+INC_CURSORY:\r
+       ADD     CURSORY,R0\r
+       POP     R0\r
+       RET\r
+\r
+CLR_DISP:\r
+       RCALL   CLEAR_DISPLAY           ; CLEARS DISPLAY AND HOMES CURSOR\r
+       RJMP    MAIN_LOOP\r
+\r
+INTERPRET_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       BRNE    TEXT_MODE\r
+       RJMP    L01A4\r
+TEXT_MODE:\r
+       CPI     A,$31\r
+       RJEQ    GRAPHICS_MODE\r
+;L01A3:\r
+       RJMP    MAIN_LOOP\r
+\r
+L01A4: LDI     F,$F7\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GRAPHICS_MODE:\r
+       LDI     F,$08\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROP_FIXED_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    FIXED\r
+;L01AE:\r
+       CPI     A,$31\r
+       RJEQ    PROPORTIONAL\r
+L01B1:\r
+;      RJMP    MAIN_LOOP\r
+\r
+FIXED: LDI     F,$EF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+PROPORTIONAL:\r
+       LDI     F,$10\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+BACK_SPACE:\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       LDS     B,PTR+2\r
+       SUBI    YH,$FE\r
+       A14_A18 B\r
+       RCALL   LPMS\r
+       SUB     CURSORX,R0\r
+       IN      A,SREG\r
+       SBRS    A,2\r
+       RJMP    MAIN_LOOP\r
+\r
+CR:    CLR     CURSORX\r
+       RJMP    MAIN_LOOP\r
+\r
+ENABLE_CNTRL:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,1\r
+       RJMP    ENABLE_UPDATE\r
+       SBRC    A,0\r
+       RJMP    ENABLE_ON\r
+;ENABLE_OFF:\r
+       LDI     F,$DF\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+ENABLE_ON:\r
+       LDI     F,$20\r
+       OR      FLAGS,F\r
+ENABLE_UPDATE:\r
+       CLR     F\r
+       STS     LINE_COUNT,F            ; START UPDATE AT TOP OF SCREEN\r
+ENABLE_LOOP:\r
+       RCALL   NICK_SUB2               ; IMMEDIATE UPDATE OF ENTIRE SCREEN\r
+       BRNE    ENABLE_LOOP\r
+       RJMP    MAIN_LOOP\r
+\r
+DRAW_MODE:\r
+       RCALL   RX_WAIT\r
+       CPI     A,$30\r
+       RJEQ    XOR_MODE\r
+;L01D3:\r
+       CPI     A,$31\r
+       RJEQ    OR_MODE\r
+;L01D6:\r
+       RJMP    MAIN_LOOP\r
+\r
+XOR_MODE:\r
+       LDI     F,$FE\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+OR_MODE:\r
+       LDI     F,$01\r
+       OR      FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+SET_CURSOR:\r
+       RCALL   RX_WAIT\r
+       MOV     CURSORX,A\r
+GET_Y: RCALL   RX_WAIT\r
+       MOV     CURSORY,A\r
+       RJMP    MAIN_LOOP\r
+\r
+CLEAR_RECTANGLE:\r
+       LDI     F,$02\r
+       OR      FLAGS,F\r
+\r
+GET_RECT_SIZE:\r
+       STS     RECT_X,CURSORX\r
+       STS     RECT_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECT_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECT_YY,A\r
+       RCALL   DRAW_RECT\r
+       LDI     F,$FD\r
+       AND     FLAGS,F\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_FILLED_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   FILLED_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+GET_RECTNC_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   DRAW_RECTNC\r
+       RJMP    MAIN_LOOP\r
+\r
+CONTRAST_CONTROL:\r
+       RCALL   RX_WAIT\r
+\r
+       SBRS    A,0\r
+       RJMP    CONTRAST_DARKER\r
+\r
+;CONTRAST_LIGHTER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(-CONTRAST_STEP)\r
+       SBCI    B,HIGH(-CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MAX)\r
+       LDI     F,HIGH(CONTRAST_MAX)\r
+       CPC     B,F\r
+       BRSH    CONTRAST_DONE\r
+       RJMP    CONTRAST_WRITE\r
+\r
+CONTRAST_DARKER:\r
+       LDS     A,CONTRASTL\r
+       LDS     B,CONTRASTH\r
+       SUBI    A,LOW(CONTRAST_STEP)\r
+       SBCI    B,HIGH(CONTRAST_STEP)\r
+\r
+       CPI     A,LOW(CONTRAST_MIN)\r
+       LDI     F,HIGH(CONTRAST_MIN)\r
+       CPC     B,F\r
+       BRLO    CONTRAST_DONE\r
+\r
+CONTRAST_WRITE:\r
+       STS     CONTRASTL,A\r
+       STS     CONTRASTH,B\r
+\r
+       LDI     B,EE_CONTRAST*2\r
+       RCALL   EE_WRITE\r
+       LDS     A,CONTRASTH\r
+       LDI     B,EE_CONTRAST*2+1\r
+       RCALL   EE_WRITE\r
+\r
+CONTRAST_DONE:\r
+       RJMP    MAIN_LOOP\r
+\r
+EE_READ:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_READ                 ; WAIT UNTIL EEPROM BECOMES READY\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       SBI     EECR,EERE               ; READ DATA BYTE\r
+       IN      A,EEDR                  ; GET LATCHED DATA BYTE\r
+       RET\r
+\r
+EE_WRITE:\r
+       SBIC    EECR,EEWE\r
+       RJMP    EE_WRITE                ; WAIT FOR EEPROM TO BECOME READY\r
+\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT0:\r
+       RJMP    EE_WRITE_HALT0          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       OUT     EEARL,B\r
+       CLR     B\r
+       OUT     EEARH,B                 ; ASSUME EEPROM ADDRESSES < $100\r
+       OUT     EEDR,A                  ; LATCH NEW VALUE\r
+\r
+       CLI\r
+       SBRS    API_STATE,EEWR_ENABLE\r
+EE_WRITE_HALT1:\r
+       RJMP    EE_WRITE_HALT1          ; HALT PROCESSOR IF EE WRITING DISABLED\r
+\r
+       SBI     EECR,EEMWE              ; MASTER WRITE ENABLE\r
+       SBI     EECR,EEWE               ; START WRITING NEW VALUE\r
+       RETI\r
+\r
+GO_SCROLL:\r
+       RJMP    SCROLL\r
+\r
+CHARACTER_SET_DOWNLOAD:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     XL,A\r
+       RCALL   RX_WAIT\r
+       MOV     XH,A\r
+\r
+CHARACTER_SET_DOWNLOAD_LOOP:\r
+       RCALL   RX_WAIT\r
+\r
+       A14_A18 B\r
+       RCALL   GO_WRITE_BYTE\r
+\r
+       ADIW    YL,1\r
+       SBIW    XL,1\r
+       MOV     A,XL\r
+       OR      A,XH\r
+       RJNE    CHARACTER_SET_DOWNLOAD_LOOP ; BRNE ??\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_QUERY:\r
+       RCALL   RX_WAIT\r
+       RCALL   CHARACTER_SET_FIND      ; B:Y -> CHARACTER SET\r
+\r
+       PUSH    A\r
+       RCALL   CHARACTER_SET_CRC\r
+\r
+       LDI     A,$1B\r
+       RCALL   TX_WAIT\r
+       LDI     A,'?'\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       SUBI    A,-'0'\r
+       RCALL   TX_WAIT\r
+\r
+       MOV     A,YH\r
+       RCALL   TX_HEX_BYTE\r
+       MOV     A,YL\r
+       RCALL   TX_HEX_BYTE\r
+       RJMP    MAIN_LOOP\r
+\r
+CHARACTER_SET_FIND:\r
+       LDI     YL,LOW(CHSET_DSPRAM)\r
+       LDI     YH,HIGH(CHSET_DSPRAM)<<4\r
+       LDI     B,HIGH(CHSET_DSPRAM>>4)\r
+\r
+       ANDI    A,$0F\r
+       CPI     A,CHARACTER_SETS\r
+       BRSH    CHARACTER_SET_FIND_DONE ; DEFAULT TO SET 0\r
+\r
+       ADD     B,A\r
+\r
+CHARACTER_SET_FIND_DONE:\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     B\r
+       ROR     YH\r
+       LSR     YH\r
+       LSR     YH\r
+       RET\r
+\r
+CHARACTER_SET_CRC:\r
+       LDI     XL,LOW($216)\r
+       LDI     XH,HIGH($216)           ; PAST CRC, INDEX, CELL SIZES\r
+       ADD     XL,YL\r
+       ADC     XH,YH                   ; B:X -> LENGTH WORD IN CHARACTER SET\r
+       A14_A18 B\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZL,A\r
+       ADIW    XL,1\r
+       RCALL   GO_READ_BYTE\r
+       MOV     ZH,A                    ; Z = LENGTH OF DATA INCLUDING CRC\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       ADIW    XL,4                    ; B:X -> DATA BLOCK EXCLUDING CRC\r
+\r
+       LDI     YL,$FF\r
+       LDI     YH,$FF                  ; Y = SEED FOR CRC CALCULATION\r
+\r
+       SBIW    ZL,1\r
+       ANDI    ZH,$0F\r
+       SBIW    ZL,4                    ; Z = LENGTH OF DATA-1 EXCLUDING CRC\r
+       BRLO    CHARACTER_SET_CRC_DONE\r
+       ADIW    ZL,1\r
+\r
+CHARACTER_SET_CRC_BYTE:\r
+       RCALL   GO_READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       LDI     F,$21\r
+       LDI     B,$10                   ; B:F = CRC POLYNOMIAL\r
+       EOR     YH,A                    ; Y = CRC REGISTER WITH NEW DATA BYTE\r
+\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT0\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT0:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT1\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT1:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT2\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT2:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT3\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT3:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT4\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT4:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT5\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT5:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT6\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT6:\r
+       LSL     YL\r
+       ROL     YH\r
+       BRCC    CHARACTER_SET_CRC_BIT7\r
+       EOR     YL,F\r
+       EOR     YH,B\r
+CHARACTER_SET_CRC_BIT7:\r
+\r
+       SBIW    ZL,1\r
+       BRNE    CHARACTER_SET_CRC_BYTE\r
+\r
+CHARACTER_SET_CRC_DONE:\r
+       RET\r
+\r
+TX_HEX_BYTE:\r
+       PUSH    A\r
+       SWAP    A\r
+       RCALL   HEX_NIBBLE\r
+       RCALL   TX_WAIT\r
+       POP     A\r
+       RCALL   HEX_NIBBLE\r
+       RJMP    TX_WAIT\r
+\r
+HEX_NIBBLE:\r
+       ANDI    A,$0F\r
+       ORI     A,$30\r
+       CPI     A,$3A\r
+       BRLO    HEX_NIBBLE_DONE\r
+       SUBI    A,-7\r
+HEX_NIBBLE_DONE:\r
+       RET\r
+\r
+SAVE_STATE:\r
+       RCALL   RX_WAIT\r
+       SBRC    A,0\r
+       RJMP    RESTORE_STATE\r
+\r
+SAVE_ENTRY:\r
+       STS     CURSORX_SAVE,CURSORX\r
+       STS     CURSORY_SAVE,CURSORY\r
+       STS     FLAGS_SAVE,FLAGS\r
+       LDS     A,PTR\r
+       STS     PTR_SAVE,A\r
+       LDS     A,PTR+1\r
+       STS     PTR_SAVE+1,A\r
+       LDS     A,PTR+2\r
+       STS     PTR_SAVE+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+RESTORE_STATE:\r
+       LDS     CURSORX,CURSORX_SAVE\r
+       LDS     CURSORY,CURSORY_SAVE\r
+       LDI     A,$C0\r
+       AND     FLAGS,A\r
+       LDS     A,FLAGS_SAVE\r
+       ANDI    A,$3F\r
+       OR      FLAGS,A\r
+       LDS     A,PTR_SAVE\r
+       STS     PTR,A\r
+       LDS     A,PTR_SAVE+1\r
+       STS     PTR+1,A\r
+       LDS     A,PTR_SAVE+2\r
+       STS     PTR+2,A\r
+       RJMP    MAIN_LOOP\r
+\r
+TOUCH_ZONE:\r
+       RCALL   RX_WAIT\r
+       STS     TOUCH_KEY,A\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YL,A\r
+       SUBI    A,-9\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_X,B\r
+\r
+       RCALL   RX_WAIT\r
+       MOV     YH,A\r
+       SUBI    A,-4\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_Y,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YL\r
+       SUBI    A,15\r
+       RCALL   DIVIDE_10\r
+       STS     TOUCH_XX,B\r
+\r
+       RCALL   RX_WAIT\r
+       ADD     A,YH\r
+       SUBI    A,17\r
+       RCALL   DIVIDE_13\r
+       STS     TOUCH_YY,B\r
+\r
+       LDS     YH,TOUCH_Y\r
+TOUCH_ZONE_Y:\r
+       LDS     A,TOUCH_YY\r
+       SUB     A,YH\r
+       BRSH    TOUCH_ZONE_Y_CONT\r
+       RJMP    TOUCH_ZONE_Y_END\r
+TOUCH_ZONE_Y_CONT:\r
+\r
+       LDS     YL,TOUCH_X\r
+       MOV     A,YL\r
+       ADD     A,YH\r
+       MOV     B,YH\r
+       LSL     B\r
+       LSL     B\r
+       LSL     B\r
+       ADD     A,B\r
+       LSL     B\r
+       ADD     A,B\r
+\r
+       LDI     XL,LOW(RTN_DSPRAM)\r
+       LDI     XH,HIGH(RTN_DSPRAM) ;<<2\r
+       LDI     B,0\r
+       ADD     XL,A\r
+       ADC     XH,B\r
+\r
+       LDI     B,HIGH(RTN_DSPRAM>>6)   ; B:X -> RETURN CODE TABLE\r
+       A14_A18 B\r
+\r
+TOUCH_ZONE_X:\r
+       LDS     A,TOUCH_XX\r
+       SUB     A,YL\r
+       BRLO    TOUCH_ZONE_X_END\r
+\r
+       A0_A13  XL,XH\r
+       LDS     A,TOUCH_KEY\r
+       RAMWR   A                       ; WRITE DATA TO DSPRAM\r
+\r
+       ADIW    XL,1\r
+       INC     YL\r
+       RJMP    TOUCH_ZONE_X\r
+\r
+TOUCH_ZONE_X_END:\r
+       INC     YH\r
+       RJMP    TOUCH_ZONE_Y\r
+\r
+TOUCH_ZONE_Y_END:\r
+       RJMP    MAIN_LOOP\r
+\r
+DIVIDE_10:\r
+       LDI     B,-1\r
+DIVIDE_10_LOOP:\r
+       INC     B\r
+       SUBI    A,10\r
+       BRCC    DIVIDE_10_LOOP\r
+       RET\r
+\r
+DIVIDE_13:\r
+       LDI     B,-1\r
+DIVIDE_13_LOOP:\r
+       INC     B\r
+       SUBI    A,13\r
+       BRCC    DIVIDE_13_LOOP\r
+       RET\r
+\r
+NULLSUB2:\r
+       RCALL   RX_WAIT\r
+\r
+NULLSUB:\r
+       RCALL   RX_WAIT\r
+       RJMP    MAIN_LOOP\r
+\r
+RX_WAIT:\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+RX_WAIT_LOOP:\r
+       ; FORMERLY DONE IN TIMER 2 OVERFLOW INTERRUPT\r
+       WDR\r
+\r
+       LDI     A,0\r
+       OUT     EEARL,A                 ; RESET EEPROM ADDRESS REG WHILE IDLE\r
+       OUT     EEARH,A\r
+\r
+       LDI     A,-$40\r
+       SBIC    PIND,0                  ; RXD HIGH?\r
+       STS     BREAK_COUNT,A           ; YES, TOP UP VERY SHORT BREAK TIMEOUT\r
+\r
+       SBRC    FLAGS,5                 ; DISPLAY ENABLED?\r
+       RCALL   NICK_SUB2               ; IF SO, COPY 1 LINE ACCORDING TO FLAGS\r
+\r
+       TST     RX_COUNT\r
+       BREQ    RX_WAIT_LOOP\r
+\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE PROCESSING CHARACTER\r
+\r
+RX_CHAR:\r
+       MRX_CHAR\r
+TX_WAIT:\r
+       MTX_WAIT\r
+TX_CHAR:\r
+       MTX_CHAR\r
+\r
+DRAW_CHAR_TTY:\r
+       RCALL   FIND_CHAR               ; SET UP CHAR_PTR FROM A = CHAR\r
+       RCALL   CHAR_WIDTH              ; SET UP R0 = PROP WIDTH FROM CHAR PTR\r
+\r
+       CLR     F\r
+       STS     TEMP,F                  ; NUDGE FOR FIXED SPACING MODE\r
+\r
+       SBRC    FLAGS,4\r
+       RJMP    PROP_MODE               ; FORCED TO FIXED SPACING MODE?\r
+\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       MOV     W,R0\r
+       RCALL   LPMS                    ; GET R0 = CELL WIDTH FOR CHARACTER SET\r
+       PUSH    R0\r
+       SUB     R0,W\r
+       BRCC    NUDGE_OK\r
+       CLR     R0                      ; NO NEGATIVE CENTRING\r
+NUDGE_OK:\r
+       LSR     R0\r
+       STS     TEMP,R0\r
+       POP     R0                      ; RESTORE R0 = FIXED CELL WIDTH\r
+\r
+PROP_MODE:\r
+       SBRC    FLAGS,3\r
+       RJMP    OK_LINE                 ; FORCED TO GRAPHICS MODE?\r
+\r
+       MOV     F,CURSORX\r
+       ADD     F,R0                    ; CHECK IF CHAR WILL FIT ON THIS LINE\r
+       BRCC    OK_LINE\r
+\r
+       CLR     CURSORX\r
+       RCALL   LINE_FEED               ; NO, WRAP CURSOR PRIOR TO DRAWING CHAR\r
+\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE            ; IN CASE WE SCROLLED THE DISPLAY\r
+\r
+OK_LINE:\r
+       LDS     F,TEMP\r
+       ADD     F,CURSORX\r
+       STS     CHAR_X,F\r
+       STS     CHAR_Y,CURSORY          ; SET UP TOP LEFT COORDINATES\r
+\r
+       ADD     CURSORX,R0              ; ADVANCE CURSOR\r
+\r
+DRAW_CHAR:\r
+       LDS     XPIXEL,CHAR_X\r
+       LDS     LINE_CNT,CHAR_Y\r
+\r
+       SBRS    X_SIZE,6\r
+       RJMP    Y_OFFSET_DONE           ; Y OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$02\r
+       RCALL   LPMS\r
+       ADD     LINE_CNT,R0\r
+\r
+Y_OFFSET_DONE:\r
+       SBRS    X_SIZE,7\r
+       RJMP    X_OFFSET_DONE           ; X OFFSET FOUND?\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       SBIW    YL,$03\r
+       RCALL   LPMS\r
+       ADD     XPIXEL,R0\r
+\r
+X_OFFSET_DONE:\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       ADIW    YL,$01\r
+       RCALL   LPMS                    ; GET R0 = Y LINES FOR CHARACTER\r
+       MOV     Y_SIZE,R0\r
+\r
+       LDI     F,$FF\r
+       OUT     DDRA,F\r
+       SBI     PORTB,0                 ; REMOVE_CS\r
+       LDI     F,$1F\r
+       AND     X_SIZE,F\r
+       STS     X_SIZE_SAV,X_SIZE\r
+       CLR     F\r
+       CPSE    X_SIZE,F\r
+       RJMP    DRAW_IT\r
+       RJMP    DONE\r
+\r
+DRAW_IT:\r
+       CLR     XL\r
+       MOV     XH,LINE_CNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)           ; DRAW INTO DRAWING BUFFER\r
+       RJMP    FIRSTT\r
+\r
+MORE_Y:        INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+\r
+       LDS     X_SIZE,X_SIZE_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+\r
+FIRSTT:        OR      XBYTE,XL\r
+       CLR     B                       ; RESIDUAL\r
+\r
+MORE_X:        ADIW    YL,$01\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+\r
+       CLR     A\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       TST     XPIXEL\r
+       BREQ    OUT_DATA\r
+\r
+       CLC\r
+SHIFT_AGAIN:\r
+       ROR     R0\r
+       ROR     A\r
+       DEC     XPIXEL\r
+       BRNE    SHIFT_AGAIN\r
+\r
+       OR      R0,B\r
+       MOV     B,A\r
+\r
+OUT_DATA:\r
+       LDI     F,HIGH(DRAW_DSPRAM>>6)\r
+       A14_A18 F\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  R0,F\r
+\r
+       INC     XBYTE\r
+       DEC     X_SIZE\r
+       RJNE    MORE_X\r
+\r
+       TST     B\r
+       BREQ    SKIP_FINAL\r
+       A0_A13  XBYTE,XH\r
+       RAMRXW  B,F\r
+\r
+SKIP_FINAL:\r
+       RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       RJNE    MORE_Y\r
+\r
+DONE:  RET\r
+\r
+FIND_CHAR:\r
+       MOV     YL,A\r
+       CLR     YH\r
+       LSL     YL\r
+       ROL     YH\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       LDS     A,PTR+2\r
+       RCALL   SELECT_XPAGE\r
+       RCALL   LPMS\r
+       ADIW    YL,$01\r
+       MOV     W,R0\r
+       RCALL   LPMS\r
+       MOV     YL,W\r
+       MOV     YH,R0\r
+       LDS     A,PTR\r
+       ADD     YL,A\r
+       LDS     A,PTR+1\r
+       ADC     YH,A\r
+       STS     CHAR_PTR,YL\r
+       STS     CHAR_PTR+1,YH\r
+       RET\r
+\r
+CHAR_WIDTH:\r
+       LDS     YL,CHAR_PTR\r
+       LDS     YH,CHAR_PTR+1\r
+       RCALL   LPMS\r
+       MOV     X_SIZE,R0\r
+       SBIW    YL,$01\r
+       SBRC    X_SIZE,5\r
+       RJMP    LPMS                    ; PROPORTIONAL WIDTH IS PRESENT\r
+       LDS     YL,PTR\r
+       LDS     YH,PTR+1\r
+       SUBI    YH,$FE\r
+       RJMP    LPMS                    ; NO PROPORTIONAL WIDTH, USE CELL WIDTH\r
+\r
+NICK_SUB1:                             ; SET FLAG FOR COPY, LINE_CNT\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       MOV     A,LINE_CNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       OR      A,B\r
+       ST      Y,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       RET\r
+\r
+NICK_SUB2:                             ; TEST FLAG AND COPY, LINE_COUNT\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     A,LINE_COUNT\r
+       RCALL   FIND_BIT\r
+       LD      A,Y\r
+       AND     A,B\r
+       RJEQ    NICK_SUB2_DONE\r
+\r
+       LD      B,Y\r
+       EOR     B,A\r
+       ST      Y,B\r
+\r
+       ; LET'S BE SAFE\r
+       LDI     A,0                     ; SET LONGEST POSSIBLE BREAK TIMEOUT\r
+       STS     BREAK_COUNT,A           ; WHILE COPYING TO DISPLAY BUFFER\r
+\r
+       PUSH    XL\r
+       PUSH    XH\r
+\r
+       CLR     YL\r
+       LDS     YH,LINE_COUNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL                      ; Y -> DISPLAY BUFFER\r
+\r
+       MOV     XL,YL\r
+       MOV     XH,YH\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X -> DRAWING BUFFER\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       LDI     B,32\r
+       RCALL   COPY_BYTES              ; 240 PIXELS, PLUS 16 FOR SAMSUNG\r
+\r
+       SBIW    XL,2\r
+       ADIW    YL,6\r
+       LDI     B,2\r
+       RCALL   COPY_BYTES              ; REPEAT FINAL 16 PIXELS FOR HYUNDAI\r
+\r
+       POP     XH\r
+       POP     XL\r
+\r
+       LDI     A,-$40\r
+       STS     BREAK_COUNT,A           ; SET VERY SHORT BREAK TIMEOUT\r
+\r
+NICK_SUB2_DONE:\r
+       LDS     A,LINE_COUNT\r
+       INC     A\r
+       ANDI    A,DISPLAY_LINES-1\r
+       STS     LINE_COUNT,A\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+       RET\r
+\r
+; NEW CODE: (NOT WORKING YET)\r
+; WE HAVE JUST DRAWN INTO THE DRAWING BUFFER AT $62000,\r
+; AND NOW WANT TO COPY THE DOT ROW CONCERNED\r
+; TO THE THE DISPLAY BUFFER AT $60000\r
+;      CLI\r
+;\r
+;      PUSH    YL\r
+;      PUSH    XL\r
+;      PUSH    XH\r
+;\r
+;      A0_A13  YL,YH\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;      CLR     A\r
+;      OUT     DDRA,A                  ; PORTA INPUT\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;NSUB0:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      INC     YL                      ; NEED SOME DELAY HERE\r
+;      DEC     B\r
+;      IN      A,PINA                  ; READ DATA\r
+;      ST      X+,A                    ; SAVE IN ROW BUFFER\r
+;      BRNE    NSUB0\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      SER     A\r
+;      OUT     DDRA,A                  ; PORTA OUTPUT\r
+;\r
+;      LDI     XL,LOW(ROWBUF)          ; SRAM BUFFER FOR BLOCK READ\r
+;      LDI     XH,HIGH(ROWBUF)\r
+;\r
+;      LDI     A,LATCH11_SAV\r
+;      ANDI    A,$7F                   ; POINT TO $2000 LOWER\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      IN      YL,PORTC\r
+;      ANDI    YL,$C0                  ; POINT TO START OF ROW\r
+;      LDI     B,$20                   ; COPYING 32 BYTES\r
+;      CBI     PORTB,1                 ; WE ON\r
+;NSUB1:        OUT     PORTC,YL                ; SET ADDRESS\r
+;      LD      A,X+                    ; GET DATA FROM ROW BUFFER\r
+;      OUT     PORTA,A\r
+;      INC     YL                      ; MAY AS WELL DELAY HERE\r
+;      DEC     B\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      BRNE    NSUB1\r
+;\r
+;      ADDI    YL,7                    ; SHIFT LAST 2 BYTES FOR HYUNDAI\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;      DEC     YL\r
+;      OUT     PORTC,YL                ; SET ADDRESS\r
+;      SBIW    XL,2\r
+;      LD      A,X\r
+;      OUT     PORTA,A\r
+;      CBI     PORTB,0                 ; CS ON\r
+;      SBI     PORTB,0                 ; CS OFF\r
+;\r
+;      SBI     PORTB,1                 ; WE OFF\r
+;      LDI     A,LATCH11_SAV           ; RESTORE H ADDRESS\r
+;      OUT     PORTA,A\r
+;      SBI     PORTB,3\r
+;      CBI     PORTB,3\r
+;\r
+;      POP     XH\r
+;      POP     XL\r
+;      POP     YL\r
+;      SEI\r
+;      RET\r
+\r
+FIND_BIT:\r
+       LDI     YL,LOW(LINE_FLAGS)\r
+       LDI     YH,HIGH(LINE_FLAGS)\r
+ ; LET'S BE SAFE\r
+ ANDI A,$7F\r
+       MOV     B,A\r
+       LSR     B\r
+       LSR     B\r
+       LSR     B\r
+       ADD     YL,B\r
+       LDI     B,0\r
+       ADC     YH,B\r
+       LDI     B,1\r
+       ANDI    A,7\r
+       BREQ    FIND_BIT_RET\r
+FIND_BIT_LOOP:\r
+       LSL     B\r
+       DEC     A\r
+       BRNE    FIND_BIT_LOOP\r
+FIND_BIT_RET:\r
+       RET\r
+\r
+GO_READ_BYTE:\r
+       RJMP    READ_BYTE\r
+\r
+GO_WRITE_BYTE:\r
+       RJMP    WRITE_BYTE\r
+\r
+GO_CLEAR_BYTES:\r
+       RJMP    CLEAR_BYTES\r
+\r
+GO_SELECT_XPAGE:\r
+       RJMP    SELECT_XPAGE\r
+\r
+GO_SCROLL_REGION:\r
+       RJMP    SCROLL_REGION\r
+\r
+;GO_MAIN_LOOP:\r
+;      RJMP    MAIN_LOOP\r
+\r
+GO_EXT_INT0:\r
+       RJMP    EXT_INT0\r
+\r
+GO_EXT_INT1:\r
+       RJMP    EXT_INT1\r
+\r
+GO_TIM2_OVF:\r
+       RJMP    TIM2_OVF\r
+\r
+GO_T1_OVERFLOW:\r
+       RJMP    T1_OVERFLOW\r
+\r
+GO_T0_OVERFLOW:\r
+       RJMP    T0_OVERFLOW\r
+\r
+DRAW_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    L03A3\r
+L039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+L03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    L03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       TST     XPIXEL\r
+       BREQ    L03B0\r
+L03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    L03AD\r
+L03B0: RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+L03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    L03C2\r
+       BREQ    L03D2\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    L03B8\r
+L03C2: TST     X_SIZE\r
+       BREQ    L03D3\r
+L03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    L03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    L03D2\r
+       CLR     B\r
+L03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    L03CB\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+L03D2: RCALL   WR_DISP_MEM\r
+L03D3: RCALL   NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    L039A\r
+NO_GO: RET\r
+\r
+FILLED_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       STS     RECT_XX,X_SIZE\r
+       RJMP    FILLED_RECTNC_ENTRY\r
+\r
+DRAW_RECTNC:\r
+       LDS     F,RECTNC_XX\r
+       DEC     F\r
+       CPI     F,2\r
+       BRLO    NO_GO\r
+       LDS     F,RECTNC_YY\r
+       CPI     F,3\r
+       BRLO    NO_GO\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       STS     RECT_Y,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       STS     RECT_X,F\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     X_SIZE,RECTNC_XX\r
+       LDS     F,RECTNC_X\r
+       ADD     F,X_SIZE\r
+       DEC     F\r
+       STS     RECT_X,F\r
+       LDI     F,$01\r
+       STS     RECT_XX,F\r
+FILLED_RECTNC_ENTRY:\r
+       LDS     F,RECTNC_Y\r
+       INC     F\r
+       STS     RECT_Y,F\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       DEC     Y_SIZE\r
+       DEC     Y_SIZE\r
+       STS     RECT_YY,Y_SIZE\r
+       RCALL   DRAW_RECT\r
+\r
+       LDS     F,RECTNC_X\r
+       INC     F\r
+       STS     RECT_X,F\r
+       LDS     X_SIZE,RECTNC_XX\r
+       DEC     X_SIZE\r
+       DEC     X_SIZE\r
+       STS     RECT_XX,X_SIZE\r
+       LDS     Y_SIZE,RECTNC_YY\r
+       LDS     F,RECTNC_Y\r
+       ADD     F,Y_SIZE\r
+       DEC     F\r
+       STS     RECT_Y,F\r
+       LDI     F,$01\r
+       STS     RECT_YY,F\r
+       RJMP    DRAW_RECT\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+TX_EMPTY:\r
+       MTX_EMPTY\r
+RX_COMPLETE:\r
+       MRX_COMPLETE\r
+;FEED_WDOG:\r
+;      MFEED_WDOG\r
+TX_COMPLETE:\r
+       MTX_COMPLETE\r
+API_TIMEOUT_ERROR:\r
+       MAPI_TIMEOUT_ERROR\r
+API_FRAMING_ERROR:\r
+API_RESET_ERROR:\r
+       MAPI_FRAMING_ERROR\r
+API_REINIT:\r
+       MAPI_REINIT\r
+API_REVERT:\r
+       MAPI_REVERT\r
+API_DONE:\r
+       MAPI_DONE\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CALCULATE_XBYTE:\r
+       CLR     XBYTE\r
+       LDI     F,$F0\r
+       SUB     XBYTE,F\r
+       SBRS    XPIXEL,7\r
+       CLR     XBYTE\r
+       ANDI    XPIXEL,$7F\r
+L0415: SUBI    XPIXEL,$08\r
+       BRLT    L0419\r
+       INC     XBYTE\r
+       RJMP    L0415\r
+L0419: SUBI    XPIXEL,$F8\r
+       RET\r
+\r
+LPMS:  A0_A13  YL,YH\r
+       RAMRD   R0\r
+       RET ;RETI\r
+\r
+WR_DISP_MEM:\r
+       A0_A13  XBYTE,YH\r
+       RAMRD   W\r
+       SBRS    FLAGS,1\r
+       RJMP    L043E\r
+       COM     A\r
+       AND     W,A\r
+       RJMP    L0441\r
+L043E: EOR     W,A\r
+       SBRC    FLAGS,0\r
+       OR      W,A\r
+L0441: A0_A13  XBYTE,YH\r
+       RAMWR   W\r
+       RET ;RETI\r
+\r
+CLEAR_DISPLAY:\r
+       CLR     CURSORX                 ; HOME CURSOR\r
+       CLR     CURSORY\r
+       CLR     LINE_CNT\r
+       LDI     YL,LOW(DRAW_DSPRAM)\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+CLEAR_DISPLAY_LOOP:\r
+       CLR     XBYTE\r
+       STS     XBYTE_SAV,XBYTE\r
+L065C: LDS     A,XBYTE_SAV\r
+       OR      A,YL\r
+       A0_A13  A,YH\r
+       LDI     F,$00\r
+       RAMWR   F\r
+       INC     XBYTE\r
+       LDI     F,$20\r
+       CP      XBYTE,F\r
+       BREQ    L0674\r
+       STS     XBYTE_SAV,XBYTE\r
+       RJMP    L065C\r
+L0674: RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       CPI     YH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    CLEAR_DISPLAY_LOOP\r
+       RET\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+EXT_INT0:\r
+;**:\r
+RETI\r
+;**    IN      SR,SREG                 ; MEASURE VCC\r
+;**    SBI     DDRD,2\r
+;**    IN      C,TCNT1L\r
+;**    IN      D,TCNT1H\r
+;**    STS     VCCH,D\r
+;**    STS     VCCL,C\r
+;**    RJMP    EXT_INT_RET\r
+\r
+EXT_INT1:\r
+       IN      SR,SREG                 ; MEASURE TEMPERATURE\r
+       SBI     DDRD,3\r
+       IN      C,TCNT1L\r
+       IN      D,TCNT1H\r
+       STS     TMPH,D\r
+       STS     TMPL,C\r
+       RJMP    EXT_INT_RET\r
+\r
+T1_OVERFLOW:\r
+       IN      SR,SREG\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+        LDI     D,$70                  ; FORCE DUMMY COMPARE MATCH\r
+        OUT     TCCR1A,D                ; TO SET OC1B, TOGGLE OC1A\r
+        IN      C,TCNT1L                ; (FOR REV E PARTS)\r
+        IN      D,TCNT1H                ; READ CURRENT COUNT\r
+        SUBI    C,LOW(-8)               ; ADD JUST ENOUGH TIME\r
+        SBCI    D,HIGH(-8)              ; FOR THESE INSTRUCTIONS\r
+        OUT     OCR1AH,D                ; AND WRITE TO COMPARE REGISTERS\r
+        OUT     OCR1AL,C\r
+        OUT     OCR1BH,D\r
+        OUT     OCR1BL,C\r
+\r
+       LDS     C,CLOCKING_PTR\r
+       TST     C                       ; START OF 4 LINE BLOCK?  (1 BASED)\r
+       BRNE    BREAK0                  ; NO, BREAK COUNTER IS OK FOR NOW\r
+\r
+       LDS     D,BREAK_COUNT\r
+       INC     D                       ; HAD BREAK SOLIDLY FOR TIMEOUT?\r
+       STS     BREAK_COUNT,D\r
+       BRNE    BREAK1                  ; NO, CLOCK OUT TO DISPLAY AS NORMAL\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+GO_SLEEP_ENTRY:\r
+       RJMP    SLEEP_ENTRY\r
+\r
+BREAK0:        NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+BREAK1:        SBI     DDRD,3                  ; PRECHARGE TEMPERATURE MEASUREMENT\r
+       SBI     PORTD,3\r
+\r
+       CLR     D\r
+       OUT     TCCR1B,D                ; STOP TIMER1\r
+       OUT     TCNT1H,D                ; AND CLEAR COUNT\r
+       OUT     TCNT1L,D\r
+\r
+       LDS     D,CLOCKING_PTR+1\r
+       OR      D,C                     ; START OF FRAME?  (REALLY LINE 1)\r
+       BREQ    L04E6                   ; YES, GO AND TOGGLE M ETC\r
+\r
+       LDS     D,LATCH10_SAV\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       SBI     PORTA,5                 ; PULSE CL1\r
+       CBI     PORTA,5\r
+       CBI     PORTB,4\r
+       NOP                             ; EQUALIZE DELAY\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       NOP\r
+       RJMP    L04F9\r
+\r
+GO_NICK_SUB1:\r
+       RJMP    NICK_SUB1\r
+\r
+GO_RX_WAIT:\r
+       RJMP    RX_WAIT\r
+\r
+GO_MAIN_LOOP:\r
+       RJMP    MAIN_LOOP\r
+\r
+GO_GET_HALFTONE_RECT_SIZE:\r
+       RJMP    GET_HALFTONE_RECT_SIZE\r
+\r
+L04E6: LDS     D,LATCH10_SAV\r
+       ORI     D,$80                   ; RAISE FLM\r
+       ORI     D,$20                   ; RAISE CL1\r
+       OUT     PORTA,D\r
+\r
+       SBI     PORTB,4\r
+       LDI     C,$60                   ; TOGGLE M AND CL1\r
+       EOR     D,C\r
+       OUT     PORTA,D\r
+       ANDI    D,$7F                   ; DROP FLM\r
+       OUT     PORTA,D\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+\r
+L04F9: LDS     D,LATCH10_SAV           ; SAVE STATE\r
+       PUSH    D\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       LDS     ZL,CLOCKING_PTR\r
+       LDS     ZH,CLOCKING_PTR+1\r
+\r
+       SUBI    ZL,LOW(-$40)\r
+       SBCI    ZH,HIGH(-$40)\r
+       ANDI    ZH,HIGH(DISPLAY_LINES*$40-1)\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       CBI     PORTB,1                 ; CLR HC590\r
+       SBI     PORTB,1\r
+       CBI     PORTD,7                 ; DROP OE FOR HC590\r
+       CLR     C\r
+       OUT     DDRA,C                  ; PORTA HI Z\r
+       LDI     C,$C0\r
+       OUT     DDRC,C                  ; PORTC HI Z\r
+       CBI     PORTB,0                 ; DROP CS FOR DSPRAM\r
+\r
+       CLR     D\r
+       OUT     OCR1AH,D\r
+\r
+;      LDI     D,1                     ; TO CLOCK AT 5.5/2 MHZ\r
+       OUT     OCR1AL,D                ; TO CLOCK AT 7.3/2 MHZ\r
+       LDI     D,$09\r
+       OUT     TCCR1B,D                ; START CL2 CLOCKING WITH CLR ON MATCH\r
+\r
+       STS     CLOCKING_PTR,ZL\r
+       STS     CLOCKING_PTR+1,ZH\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+;!!!   LDI     D,$7A                   ; WAIT FOR 32uSEC\r
+;      LDI     D,58 ;$7A                       ; WAIT FOR 32uSEC GOOD\r
+       LDI     D,60                    ; WAIT FOR 32uSEC\r
+;      LDI     D,61 ;$7A                       ; WAIT FOR 32uSEC\r
+;      LDI     D,62 ;$7A                       ; WAIT FOR 32uSEC GOOD\r
+\r
+L050E: DEC     D\r
+       BRNE    L050E\r
+\r
+       SBI     PORTB,0                 ; RAISE CS FOR DSPRAM\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+       SBI     PORTD,7                 ; RAISE OE FOR HC590\r
+       OUT     DDRC,D                  ; PORTC OUTPUT\r
+\r
+       CBI     DDRD,5                  ; CL2 INPUT TO MEASURE VEE\r
+       CBI     PORTD,5                 ; REMOVE PULL UP\r
+\r
+       LDI     D,$01                   ; KILL CLR ON COMPARE MATCH\r
+       NOP                             ; !WITH OC1A LEFT IN LOW STATE\r
+       OUT     TCCR1B,D\r
+\r
+       LDI     D,$0B                   ; WAIT FOR 3uSEC\r
+SETTLE_CL2:\r
+       DEC     D\r
+       BRNE    SETTLE_CL2\r
+\r
+       LDS     D,VEEH\r
+       LDS     C,VEEL\r
+       SBI     DDRD,5                  ; CL2 LOW OUTPUT\r
+       SBIC    PIND,5                  ; SAMPLE CL2 JUST BEFORE CHANGE\r
+       RJMP    L052F\r
+\r
+       CPI     C,LOW(VEE_MIN)\r
+       LDI     E,HIGH(VEE_MIN)\r
+       CPC     D,E\r
+       BRMI    L0535\r
+\r
+       SUBI    C,$01\r
+       SBCI    D,$00\r
+       RJMP    L0536\r
+\r
+L052F: CPI     C,LOW(VEE_MAX)\r
+       LDI     E,HIGH(VEE_MAX)\r
+       CPC     D,E\r
+       BRPL    L0535\r
+\r
+       SUBI    C,$FF\r
+       SBCI    D,$FF\r
+       RJMP    L0536\r
+\r
+L0535: NOP                             ; EQUALIZE DELAYS\r
+       NOP\r
+       NOP\r
+       NOP\r
+L0536: STS     VEEH,D\r
+       STS     VEEL,C\r
+       OUT     OCR1AH,D                ; SET SWITCHING TIME FOR VEE MEASURE\r
+       OUT     OCR1AL,C\r
+\r
+       LDS     C,VEEL\r
+       LDS     D,VEEH\r
+       LDS     E,CONTRASTL\r
+       SUB     C,E\r
+       LDS     E,CONTRASTH\r
+       SBC     D,E\r
+       BRPL    L0545\r
+\r
+       LDI     C,LOW(CONTRAST_SHORT)\r
+       LDI     D,HIGH(CONTRAST_SHORT)\r
+       RJMP    L0547\r
+\r
+L0545: LDI     C,LOW(CONTRAST_LONG)\r
+       LDI     D,HIGH(CONTRAST_LONG)\r
+       NOP\r
+       NOP\r
+\r
+L0547: OUT     OCR1BH,D                ; SET SWITCHING TIME FOR VEE GENERATOR\r
+       OUT     OCR1BL,C\r
+\r
+       LDI     D,2                     ; SET TIME FOR START OF LED PULSE\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_DELAY_0           ; 54uSEC\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     D,HIGH(T1_FULL_SCALE)\r
+       OUT     TCNT1H,D\r
+       LDI     D,LOW(T1_FULL_SCALE)\r
+       OUT     TCNT1L,D\r
+\r
+       CBI     DDRD,3                  ; START TEMPERATURE MEASUREMENT\r
+       CBI     PORTD,3\r
+\r
+        LDI     D,$E0                   ; NEXT COMPARE MATCH MUST SET OC1A\r
+        OUT     TCCR1A,D                ; AND CLR OC1B (FOR REV E PARTS)\r
+\r
+       RJMP    T1_OVERFLOW_RET\r
+\r
+T0_OVERFLOW:\r
+       IN      SR,SREG                 ; LED/PHOTODIODE SCANNING\r
+       IN      D,DDRA                  ; SAVE STATE OF THE WORLD\r
+       PUSH    D\r
+       IN      D,PORTA\r
+       PUSH    D\r
+       IN      D,PORTC\r
+       PUSH    D\r
+       LDS     D,LATCH11_SAV\r
+       PUSH    D\r
+       LDS     D,LATCH10_SAV\r
+       PUSH    D\r
+\r
+       PUSH    ZH\r
+       PUSH    ZL\r
+       PUSH    R0\r
+\r
+       LDI     D,$FF\r
+       OUT     DDRA,D                  ; PORTA OUTPUT\r
+\r
+       LDS     D,SCAN_STATE\r
+       INC     D\r
+       STS     SCAN_STATE,D\r
+       DEC     D\r
+       BREQ    SCAN_START              ; IF SCAN_STATE WAS = 0\r
+       DEC     D\r
+       BREQ    SCAN_BEEPER             ; IF SCAN_STATE WAS = 1\r
+ ; IMPLEMENT ENTRY POINT FOR SCAN_PULSE_LED HERE\r
+       DEC     D\r
+       RJEQ    SCAN_PHOTO              ; IF SCAN_STATE WAS = 2\r
+\r
+T0_OVERFLOW_RET:\r
+       POP     R0\r
+       POP     ZL\r
+       POP     ZH\r
+\r
+T1_OVERFLOW_RET:\r
+       POP     D                       ; RESTORE STATE OF THE WORLD\r
+       OUT     PORTA,D\r
+       SBI     PORTB,4\r
+       CBI     PORTB,4\r
+       STS     LATCH10_SAV,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       SBI     PORTB,3\r
+       CBI     PORTB,3\r
+       STS     LATCH11_SAV,D\r
+       POP     D\r
+       OUT     PORTC,D\r
+       POP     D\r
+       OUT     PORTA,D\r
+       POP     D\r
+       OUT     DDRA,D\r
+       ;MFEED_WDOG\r
+EXT_INT_RET:\r
+       OUT     SREG,SR\r
+       RETI\r
+\r
+SCAN_START:\r
+       LDI     D,3 ;5\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/1024\r
+       LDI     D,-TK_DELAY_1 ;TK_DELAY_2\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+       RJMP    L0617_RESET\r
+\r
+SCAN_BEEPER:\r
+       LDS     D,BUZZ_TIME\r
+       TST     D\r
+       BREQ    SCAN_PULSE_LED\r
+       LDS     D,BUZZ_PERIOD\r
+       SUBI    D,$10\r
+       BRLO    BUZZ_TOGGLE\r
+       STS     BUZZ_PERIOD,D\r
+       RJMP    SCAN_PULSE_LED\r
+BUZZ_TOGGLE:                           ; ASSUME D = $F0 + PERIOD-1\r
+       MOV     C,D                     ; EG. C = $F3 FOR PERIOD = 4\r
+       SWAP    C                       ; EG. C = $3F FOR PERIOD = 4\r
+       AND     D,C                     ; EG. D = $33 FOR PERIOD = 4\r
+       STS     BUZZ_PERIOD,D\r
+       LDS     C,LATCH12_SAV\r
+       SBRS    C,3                     ; TEST PREVIOUS SPEAKER STATE\r
+       RJMP    BEEPER_SPKHI\r
+       LDS     D,BUZZ_TIME\r
+       DEC     D\r
+       STS     BUZZ_TIME,D\r
+       BREQ    BEEPER_SPKOFF\r
+;BEEPER_SPKLO:\r
+       SPKLO\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKHI:\r
+       SPKHI\r
+       RJMP    SCAN_PULSE_LED\r
+BEEPER_SPKOFF:\r
+       SPKOFF\r
+\r
+SCAN_PULSE_LED:\r
+       LDS     D,LATCH5_SAV\r
+;**:\r
+       SBRS    D,7                     ; ARE WE INSIDE SLEEP_LOOP?\r
+;**    SBRC    D,7\r
+       RJMP    SCAN_PULSE_LED_OK       ; YES, KEEP TIMER 0 TO RETAIN CONTROL\r
+\r
+       LDI     D,1<<7\r
+       EOR     FLAGS,D\r
+       BRPL    SCAN_PULSE_LED_OK       ; PULSE LED EVERY 2ND CYCLE\r
+\r
+       CLR     D\r
+       OUT     TCCR0,D                 ; STOP TIMER\r
+       RJMP    T0_OVERFLOW_RET         ; AND WASTE EVERY REMAINING CYCLE\r
+\r
+SCAN_PULSE_LED_OK:\r
+       LDI     D,2\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/8\r
+       LDI     D,-TK_LED_PULSE         ; 22uSEC\r
+       OUT     TCNT0,D\r
+\r
+       ;LDIZ   SCAN_TBL                ; POINT TO FIRST LED CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM                             ; R0 = LED DRIVE VALUE\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L0570\r
+       LEDLO                           ; ENABLE HORIZ LED DRIVE\r
+       RJMP    L0574\r
+L0570: LEDHI                           ; DISABLE HORIZ LED DRIVE\r
+L0574: LED     R0\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCAN_PHOTO:\r
+       IN      D,PIND                  ; PHOTODIODE STATUS IN BIT 6,D\r
+       LDI     C,$E0\r
+       LED     C                       ; TURN OFF LED ??\r
+\r
+       CLC\r
+       SBRC    D,6\r
+       RJMP    L0593                   ; ROW/COLUMN IS INACTIVE\r
+\r
+       ; ROW/COLUMN IS ACTIVE\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L0591\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+L0591: SEC\r
+\r
+L0593: ; WE HAVE A ROW/COLUMN STATUS IN CF\r
+       IN      C,SREG\r
+\r
+       LDI     D,13*4\r
+       CP      SCAN,D\r
+       BRSH    L05A8\r
+\r
+       ; WE HAVE A ROW STATUS\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       LDS     ZL,ROW_BITMAP\r
+       LDS     ZH,ROW_BITMAP+1\r
+       ROL     ZL\r
+       ROL     ZH\r
+       STS     ROW_BITMAP,ZL\r
+       STS     ROW_BITMAP+1,ZH\r
+       RJMP    L05F9\r
+\r
+L05A8: ; WE HAVE A COLUMN STATUS\r
+;      LDS     D,LATCH5_SAV\r
+;;**:\r
+;      SBRS    D,7                     ; TURNED OFF?\r
+;;**   SBRC    D,7\r
+;      RJMP    L05F9                   ; YES, NO FURTHER PROCESSING\r
+       OUT     SREG,C                  ; CF = 0 INACTIVE, CF = 1 ACTIVE\r
+       BRCS    L05AB\r
+       RJMP    L05F9\r
+\r
+L05AB: ; WE HAVE AN ACTIVE COLUMN\r
+       LDS     D,DEBOUNCE\r
+       TST     D\r
+       BREQ    L05B3\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       RJMP    L05F9\r
+\r
+L05B3: ; LOOK FOR ANY ACTIVE ROW\r
+       LDS     ZH,ROW_BITMAP+1\r
+       LDS     ZL,ROW_BITMAP\r
+\r
+       LDS     D,ROW_INDEX\r
+       TST     D\r
+       BREQ    ROW_BITMAP_LOOP\r
+\r
+       MOV     C,D\r
+ROW_BITMAP_SKIP:\r
+       ROR     ZH\r
+       ROR     ZL\r
+       SUBI    C,4\r
+       BRNE    ROW_BITMAP_SKIP\r
+\r
+ROW_BITMAP_LOOP:\r
+       SUBI    D,-4\r
+       ROR     ZH\r
+       ROR     ZL\r
+       BRCS    FOUND_INTERSECTION\r
+ROW_BITMAP_LOOPE:\r
+       CPI     D,13*4\r
+       BRLO    ROW_BITMAP_LOOP\r
+\r
+       ; NO FURTHER INTERSECTING ROWS FOUND\r
+       RJMP    L05F9\r
+\r
+FOUND_INTERSECTION:\r
+       ; FOUND AN INTERSECTING ROW FOR COLUMN\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,$34                   ; BECAUSE ROW_BITMAP IS BEING TESTED\r
+       SUB     C,D                     ; IN THE REVERSE ORDER TO ITS CREATION\r
+\r
+       ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+       LPM\r
+       MOV     C,R0\r
+       LSL     R0\r
+       LSL     R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+       LSL     R0\r
+       ADD     C,R0\r
+\r
+       ;LDIZ   SCAN_TBL+1              ; POINT TO FIRST TOUCH CHANNEL\r
+       LDI     ZL,LOW((SCAN_TBL+1)*2)  ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL+1)*2) ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       ADD     C,R0\r
+       LDI     ZL,LOW(RTN_DSPRAM)      ; RETURN CODE TABLE\r
+       LDI     ZH,HIGH(RTN_DSPRAM)\r
+       CLR     D\r
+       ADD     ZL,C\r
+       ADC     ZH,D\r
+\r
+       A0_A15  ZL,ZH\r
+\r
+       PUSH    F\r
+       RAMRDX  R0\r
+       POP     F\r
+\r
+       TST     R0\r
+       BRNE    VALID_INTERSECTION\r
+\r
+       ; INTERSECTION IS NULL, GO ON TO NEXT\r
+       LDS     D,ROW_INDEX\r
+       CPI     D,13*4\r
+       BRSH    L05F9                   ; DONE LAST ROW, GO ON TO NEXT COLUMN\r
+GO_L0617:\r
+       RJMP    L0617                   ; GO ON TO NEXT ROW, SAME COLUMN\r
+\r
+VALID_INTERSECTION:\r
+       ; INTERSECTION IS VALID, WE HAVE KEY MAKE\r
+       LDI     D,$04\r
+       STS     DEBOUNCE,D\r
+       STS     ACTIVE_ZONE,R0\r
+       LDI     D,54 ;43\r
+       STS     BUZZ_TIME,D             ; SHORT BEEP ON MAKE\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-1\r
+       BRSH    L05F9\r
+\r
+       PUSH    A\r
+       MOV     A,R0\r
+       RCALL   TX_CHAR\r
+       CPI     A,$1B\r
+       BRNE    TX_CONT\r
+       RCALL   TX_CHAR\r
+TX_CONT:\r
+       POP     A\r
+\r
+L05F9:\r
+       LDI     D,4                     ; SCAN TO NEXT LED / PHOTODIODE PAIR\r
+       ADD     SCAN,D\r
+\r
+       LDS     D,LATCH5_SAV\r
+       SBRC    D,7\r
+       RJMP    TURNED_ON\r
+\r
+       LDI     D,3\r
+       OUT     TCCR0,D                 ; PRESCALE=CK/64\r
+       LDI     D,-TK_DELAY_1\r
+       OUT     TCNT0,D\r
+       LDI     D,1\r
+       STS     SCAN_STATE,D\r
+\r
+       LDI     C,13*4\r
+       CP      SCAN,C\r
+       BRLO    GO_L0617\r
+\r
+       ; KEEP VDD ON, TO AVOID THE LONG TK_DELAY_2\r
+       ;LDS    D,LATCH5_SAV\r
+       ;ANDI   D,$BF                   ; BIT 6 = 0 VDD OFF\r
+       ;STS    LATCH5_SAV,D\r
+       ;PHOTO  D                       ; READY TO SLEEP FOR ANOTHER 0.25 SEC\r
+\r
+       LDI     D,0\r
+       OUT     TCCR0,D                 ; STOP TIMER SINCE COMPLETE SCAN DONE\r
+ ;RJMP T0_OVERFLOW_RET\r
+\r
+ ;LDI D,$05\r
+ ;OUT UBRR,D\r
+ ;LDI D,$18\r
+ ;OUT UCR,D\r
+       LDS     D,ROW_BITMAP+1\r
+       LDS     C,ROW_BITMAP\r
+ ;OUT UDR,C\r
+ ;OUT UDR,D\r
+       OR      C,D                     ; HAVE WE SOME ACTIVITY?\r
+\r
+       LDS     D,TURNON_COUNT\r
+       CPI     D,4\r
+       BRSH    TURNON_BREAK            ; WAITING FOR BREAK\r
+       CPI     D,1\r
+       BRSH    TURNON_MAKE             ; WAITING FOR MAKE\r
+GO_T0_OVERFLOW_RET:\r
+       RJMP    T0_OVERFLOW_RET         ; ALREADY HAD MAKE, NOT TURNED ON YET\r
+\r
+TURNON_BREAK:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BREQ    TURNON_SAVE             ; NO, COUNT DOWN TO BREAK\r
+       LDI     D,4+1                   ; YES, RESTART COUNTDOWN TO BREAK\r
+       RJMP    TURNON_SAVE\r
+TURNON_MAKE:\r
+       TST     C                       ; HAD SOME ACTIVITY?\r
+       BRNE    TURNON_SAVE             ; YES, COUNT DOWN TO MAKE\r
+       LDI     D,3+1                   ; NO, RESTART COUNTDOWN TO MAKE\r
+TURNON_SAVE:\r
+       DEC     D                       ; COUNT DOWN TO MAKE OR BREAK\r
+       STS     TURNON_COUNT,D\r
+       BRNE    GO_T0_OVERFLOW_RET      ; NOT READY TO TRY TURNON YET\r
+\r
+       LDI     D,~(1<<6)\r
+       AND     FLAGS,D                 ; SAY WE TURNED OFF VIA BREAK DETECTION\r
+       CBI     DDRD,2                  ; D2 = TRI-STATE, VSWT ON\r
+       RJMP    GO_SLEEP_ENTRY          ; WE WILL NOW WAIT FOR TURNON COMMAND\r
+\r
+TURNED_ON:\r
+       LDI     D,0                     ; STOP TIMER, WE WILL REGAIN\r
+       OUT     TCCR0,D                 ; CONTROL VIA NEXT CLOCKING INTERRUPT\r
+       STS     ROW_INDEX,D\r
+\r
+       LDI     C,50*4\r
+       CP      SCAN,C\r
+       BRLO    L0617\r
+\r
+       LDS     D,DEBOUNCE              ; COMPLETED ENTIRE SCAN, START NEW SCAN\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+       DEC     D\r
+       STS     DEBOUNCE,D\r
+       BRNE    L0617_RESET\r
+\r
+       LDS     D,ACTIVE_ZONE\r
+       TST     D\r
+       BREQ    L0617_RESET\r
+\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE\r
+       BRSH    L0617_RESET\r
+\r
+       PUSH    A\r
+       LDI     A,0\r
+       RCALL   TX_CHAR\r
+       POP     A\r
+\r
+L0617_RESET:\r
+       CLR     SCAN\r
+       STS     ROW_BITMAP,SCAN\r
+       STS     ROW_BITMAP+1,SCAN\r
+\r
+L0617: ; SELECT PHOTODIODE AND ALLOW TO SETTLE\r
+       ;LDIZ   SCAN_TBL\r
+       LDI     ZL,LOW((SCAN_TBL)*2)    ; USE PRIOR TO LPM INSTRUCTION\r
+       LDI     ZH,HIGH((SCAN_TBL)*2)   ; EXTRA BRACKETS NEEDED IF @0=EXPRESSION\r
+\r
+       ADIW    ZL,1                    ; POINT TO FIRST PHOTO CHANNEL\r
+       CLR     D\r
+       ADD     ZL,SCAN\r
+       ADC     ZH,D\r
+       LPM\r
+       LDS     D,LATCH5_SAV\r
+       ANDI    D,$80                   ; BIT 7 = PRESERVED, LCD ON/OFF STATUS\r
+       ORI     D,$40                   ; BIT 6 = 1 VDD ON\r
+       OR      D,R0\r
+       STS     LATCH5_SAV,D\r
+       PHOTO   D\r
+       RJMP    T0_OVERFLOW_RET\r
+\r
+SCROLL:        CLR     LINE_CNT\r
+\r
+       LDI     YL,LOW(DRAW_DSPRAM)     ; SCROLL UP\r
+       LDI     YH,HIGH(DRAW_DSPRAM)\r
+       LDI     XL,LOW(DRAW_DSPRAM)\r
+       LDI     XH,HIGH(DRAW_DSPRAM)\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+L0628: SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       DEC     R0\r
+       BRNE    L0628\r
+\r
+L062C: LDI     B,$20                   ; COPYING 32 BYTES\r
+L062D: PUSH    B\r
+       RCALL   READ_BYTE\r
+       RCALL   WRITE_BYTE\r
+       INC     XL\r
+       INC     YL\r
+       POP     B\r
+       DEC     B\r
+       RJNE    L062D   ;BRNE   L062D\r
+\r
+       RCALL   NICK_SUB1\r
+       INC     LINE_CNT\r
+       ADIW    YL,$20\r
+       ADIW    XL,$20\r
+       CPI     XH,HIGH(DRAW_DSPRAM+DISPLAY_LINES*$40)\r
+       RJNE    L062C   ;BRNE   L062C\r
+       RJMP    CLEAR_DISPLAY_LOOP\r
+\r
+SCROLL_REGION:\r
+       RCALL   RX_WAIT\r
+       PUSH    A                       ; DIRECTION TO SCROLL\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_COUNT,A          ; AMOUNT TO SCROLL IN PIXEL LINES\r
+\r
+       RCALL   RX_WAIT\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       BRNE    SCROLL_WIDTH_OK\r
+       LDI     A,32                    ; ENTRY WIDTH OF 0 = FULL\r
+SCROLL_WIDTH_OK:\r
+       STS     SCROLL_XX,A             ; X SIZE OF REGION IN BYTES\r
+\r
+       RCALL   RX_WAIT\r
+       STS     SCROLL_YY,A             ; Y SIZE OF REGION IN PIXEL LINES\r
+\r
+       MOV     A,CURSORX\r
+       LSR     A\r
+       LSR     A\r
+       LSR     A\r
+       STS     SCROLL_X,A\r
+       STS     SCROLL_Y,CURSORY\r
+\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+\r
+       POP     A                       ; DIRECTION TO SCROLL\r
+       SBRC    A,0\r
+       RJMP    SCROLL_DOWN\r
+\r
+;SCROLL_UP:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       LDS     B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_UP_CLEAR         ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_UP_LOOP:\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    XL,LOW(-$40)\r
+       SBCI    XH,HIGH(-$40)\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_UP_CLEAR:\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       INC     LINE_CNT\r
+       SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_UP_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+SCROLL_DOWN:\r
+       CLR     YL\r
+       LDS     YH,SCROLL_Y\r
+       LDS     F,SCROLL_YY\r
+       ADD     YH,F\r
+       MOV     LINE_CNT,YH             ; FOR NICK_SUB1\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       LDS     A,SCROLL_X\r
+       ADD     YL,A\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; Y = DESTINATION WITHIN DRAWING BUFFER\r
+\r
+       MOV     B,F ;LDS B,SCROLL_YY\r
+       LDS     A,SCROLL_COUNT\r
+       CP      A,B\r
+       BRSH    SCROLL_DOWN_CLEAR       ; WITH B = LINES TO CLEAR\r
+       SUB     B,A                     ; CALCULATE B = LINES TO COPY INTACT\r
+\r
+       CLR     XL\r
+       LDS     XH,SCROLL_Y\r
+       ADD     XH,F\r
+       SUB     XH,A                    ; SCROLL_COUNT\r
+       LSR     XH\r
+       ROR     XL\r
+       LSR     XH\r
+       ROR     XL\r
+       LDS     A,SCROLL_X\r
+       ADD     XL,A\r
+       SUBI    XH,HIGH(-DRAW_DSPRAM)   ; X = SOURCE WITHIN DRAWING BUFFER\r
+\r
+SCROLL_DOWN_LOOP:\r
+       DEC     LINE_CNT\r
+       SUBI    XL,LOW($40)\r
+       SBCI    XH,HIGH($40)\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    XL\r
+       PUSH    XH\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   COPY_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     XH\r
+       POP     XL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_LOOP\r
+\r
+       LDS     B,SCROLL_COUNT          ; B = LINES TO CLEAR\r
+\r
+SCROLL_DOWN_CLEAR:\r
+       DEC     LINE_CNT\r
+       SUBI    YL,LOW($40)\r
+       SBCI    YH,HIGH($40)\r
+\r
+       PUSH    B\r
+       PUSH    YL\r
+       PUSH    YH\r
+\r
+       LDS     B,SCROLL_XX\r
+       RCALL   CLEAR_BYTES\r
+       RCALL   NICK_SUB1\r
+\r
+       POP     YH\r
+       POP     YL\r
+       POP     B\r
+\r
+       DEC     B\r
+       BRNE    SCROLL_DOWN_CLEAR\r
+\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+COPY_BYTES:\r
+       RCALL   READ_BYTE\r
+       ADIW    XL,1\r
+\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    COPY_BYTES\r
+\r
+       RET\r
+\r
+CLEAR_BYTES:\r
+       LDI     A,0\r
+\r
+FILL_BYTES:\r
+       RCALL   WRITE_BYTE\r
+       ADIW    YL,1\r
+\r
+       DEC     B\r
+       BRNE    FILL_BYTES\r
+\r
+       RET\r
+\r
+READ_BYTE:\r
+       A0_A13  XL,XH\r
+       RAMRD   A\r
+       RET\r
+\r
+WRITE_BYTE:\r
+       A0_A13  YL,YH\r
+       RAMWR   A\r
+       RET\r
+\r
+SELECT_XPAGE:\r
+       A14_A18 A\r
+       RET\r
+\r
+; HOW MANY SECS/6553600 PER 4HZ INTERRUPT ?\r
+; EACH TIME THROUGH ADD 1638400 SECS/6553600 = 1/4 SEC\r
+; OSCILLATOR IS SLOW SO WE WILL ADD 1 PART IN 10000\r
+; HENCE EACH TIME THROUGH ADD 1638400+164 = 1638564 UNITS TO COUNT\r
+\r
+TIM2_OVF:\r
+       IN      SR,SREG\r
+\r
+       ; REMOVED BECAUSE DON'T WANT TO HAVE IN AN INTERRUPT\r
+       ;WDR\r
+\r
+;!!    LDI     A,$10                   ; DIAGNOSTIC\r
+;!!    STS     BUZZ_TIME,A             ; SHORT BEEP\r
+\r
+       LDS     D,TIME_HSEC_64K\r
+       SUBI    D,LOW(-1638564)\r
+       STS     TIME_HSEC_64K,D\r
+\r
+       LDS     D,TIME_HSEC_256\r
+       SBCI    D,HIGH(-1638564)\r
+       STS     TIME_HSEC_256,D\r
+\r
+       LDS     D,TIME_HSEC\r
+       SBCI    D,HIGH(-1638564>>8)\r
+       CPI     D,100\r
+       BRSH    TIM2_CARRY\r
+       STS     TIME_HSEC,D\r
+\r
+TIM2_END:\r
+       OUT     SREG,SR\r
+       SBRS    FLAGS,6                 ; IF WE TURNED OFF VIA COMMAND,\r
+       RETI                            ; START A NEW SCAN, OTHERWISE DONE\r
+\r
+       LDI     D,0\r
+       STS     SCAN_STATE,D            ; WE WILL EXECUTE SCAN_START ROUTINE\r
+       RJMP    T0_OVERFLOW             ; GO AND TURN VDD ON\r
+\r
+GO_TX_CHAR:\r
+       RJMP    TX_CHAR\r
+\r
+TIM2_CARRY:\r
+       LDI     D,0\r
+       STS     TIME_HSEC,D\r
+\r
+       LDS     D,TIME_SECOND\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_SECOND\r
+\r
+       LDS     D,TIME_MINUTE\r
+       INC     D\r
+       CPI     D,60\r
+       BRLO    TIM2_MINUTE\r
+\r
+       LDS     D,TIME_HOUR\r
+       INC     D\r
+       CPI     D,24\r
+       BRLO    TIM2_HOUR\r
+\r
+       PUSH    ZL\r
+       PUSH    ZH\r
+       PUSH    R0\r
+       LDI     ZL,LOW(MONTH_TABLE*2-1)\r
+       LDI     ZH,HIGH(MONTH_TABLE*2-1)\r
+       LDS     E,DATE_MONTH\r
+       ADD     ZL,E\r
+       LDI     E,0\r
+       ADC     ZH,E\r
+       LPM\r
+       MOV     E,R0\r
+       CPI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDS     E,DATE_YEAR\r
+       ANDI    E,3\r
+       LDI     E,28\r
+       BRNE    FEBRUARY_OK\r
+       LDI     E,29\r
+FEBRUARY_OK:\r
+       POP     R0\r
+       POP     ZH\r
+       POP     ZL\r
+\r
+       LDS     D,DATE_DAY\r
+       CP      D,E\r
+       BRLO    TIM2_DAY\r
+\r
+       LDS     D,DATE_MONTH\r
+       CPI     D,12\r
+       BRLO    TIM2_MONTH\r
+\r
+       LDS     D,DATE_YEAR\r
+       INC     D\r
+       STS     DATE_YEAR,D\r
+       CLR     D\r
+TIM2_MONTH:\r
+       INC     D\r
+       STS     DATE_MONTH,D\r
+       CLR     D\r
+TIM2_DAY:\r
+       INC     D\r
+       STS     DATE_DAY,D\r
+       CLR     D\r
+TIM2_HOUR:\r
+       STS     TIME_HOUR,D\r
+       CLR     D\r
+TIM2_MINUTE:\r
+       STS     TIME_MINUTE,D\r
+       CLR     D\r
+TIM2_SECOND:\r
+       STS     TIME_SECOND,D\r
+\r
+TIM2_SEND:\r
+       MOV     D,TX_COUNT\r
+       CPI     D,TX_SIZE-7\r
+       BRSH    TIM2_SEND_SKIP\r
+\r
+       PUSH    A\r
+       LDI     A,$1B\r
+       RCALL   TX_CHAR\r
+       LDI     A,'T'\r
+       RCALL   TX_CHAR\r
+; LDS A,VCCL\r
+; RCALL TX_CHAR\r
+; LDS A,VCCH\r
+; RCALL TX_CHAR\r
+; LDS A,VEEL\r
+; RCALL TX_CHAR\r
+; LDS A,VEEH\r
+; RCALL TX_CHAR\r
+; LDI A,$0D\r
+; RCALL TX_CHAR\r
+       LDS     A,TIME_HOUR\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_MINUTE\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,TIME_SECOND\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_MONTH\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_DAY\r
+       RCALL   GO_TX_CHAR\r
+       LDS     A,DATE_YEAR\r
+       RCALL   GO_TX_CHAR\r
+       POP     A\r
+\r
+TIM2_SEND_SKIP:\r
+       RJMP    TIM2_END\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+MONTH_TABLE:\r
+       .DB     31,28,31,30,31,30,31,31,30,31,30,31\r
+\r
+; 1ST BYTE = LED\r
+; 2ND BYTE = PHOTO\r
+; 3RD BYTE = TOUCH CHANNEL\r
+\r
+SCAN_TBL:\r
+       .DB     $F0,$34,$00,$00,$E8,$34,$01,$00,$F0,$33,$01,$00,$E8,$33,$02,$00\r
+       .DB     $E4,$33,$03,$00,$E8,$32,$03,$00,$E4,$32,$04,$00,$E2,$32,$05,$00\r
+       .DB     $E4,$31,$05,$00,$E2,$31,$06,$00,$E1,$31,$07,$00,$E2,$30,$07,$00\r
+       .DB     $E1,$30,$08,$00,$C1,$2A,$00,$00,$C2,$2A,$01,$00,$C1,$2B,$01,$00\r
+       .DB     $C2,$2B,$02,$00,$C4,$2B,$03,$00,$C2,$2C,$03,$00,$C4,$2C,$04,$00\r
+       .DB     $C8,$2C,$05,$00,$C4,$18,$05,$00,$C8,$18,$06,$00,$D0,$18,$07,$00\r
+       .DB     $C8,$19,$07,$00,$D0,$19,$08,$00,$A1,$19,$09,$00,$D0,$1A,$09,$00\r
+       .DB     $A1,$1A,$0A,$00,$A2,$1A,$0B,$00,$A1,$1B,$0B,$00,$A2,$1B,$0C,$00\r
+       .DB     $A4,$1B,$0D,$00,$A2,$1C,$0D,$00,$A4,$1C,$0E,$00,$A8,$1C,$0F,$00\r
+       .DB     $A4,$1D,$0F,$00,$A8,$1D,$10,$00,$B0,$1D,$11,$00,$A8,$1E,$11,$00\r
+       .DB     $B0,$1E,$12,$00,$61,$1E,$13,$00,$B0,$1F,$13,$00,$61,$1F,$14,$00\r
+       .DB     $62,$1F,$15,$00,$61,$28,$15,$00,$62,$28,$16,$00,$64,$28,$17,$00\r
+       .DB     $62,$29,$17,$00,$64,$29,$18,$00\r
+\r
+RTN_CODE:\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$08,$08,$08,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$7E,$00,$31,$00,$32,$00,$33,$00,$34,$00,$35,$00,$36,$00\r
+       .DB     $37,$00,$38,$00,$39,$00,$30,$00,$2D,$00,$3D,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$51,$00,$57,$00,$45,$00,$52,$00,$54,$00,$59,$00\r
+       .DB     $55,$00,$49,$00,$4F,$00,$50,$00,$5B,$00,$5D,$00,$5C,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$41,$00,$53,$00,$44,$00,$46,$00,$47,$00\r
+       .DB     $48,$00,$4A,$00,$4B,$00,$4C,$00,$3B,$00,$27,$00,$0D,$0D,$0D,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r
+       .DB     $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5A,$00,$58,$00,$43,$00\r
+       .DB     $56,$00,$42,$00,$4E,$00,$4D,$00,$2C,$00,$2E,$00,$2F,$00,$00,$00\r
+       .DB     $00,$00\r
+RTN_CODE_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+CHSET00:\r
+       .DB     $32,$38,$32,$34,$30,$33,$31,$37,$30,$33,$31,$36,$32,$36,$31,$35\r
+       .DB     $11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $C0,$00,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $C1,$00,$CA,$00,$D3,$00,$DC,$00,$E5,$00,$EE,$00,$F7,$00,$00,$01\r
+       .DB     $09,$01,$12,$01,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $11,$02,$1B,$01,$24,$01,$2D,$01,$36,$01,$3F,$01,$48,$01,$51,$01\r
+       .DB     $5A,$01,$64,$01,$6D,$01,$76,$01,$7F,$01,$88,$01,$91,$01,$9A,$01\r
+       .DB     $A3,$01,$AC,$01,$B5,$01,$BE,$01,$C7,$01,$D0,$01,$D9,$01,$E2,$01\r
+       .DB     $EB,$01,$F4,$01,$08,$02,$11,$02,$11,$02,$11,$02,$11,$02,$11,$02\r
+       .DB     $00,$01,$07,$70,$88,$98,$A8,$C8,$88,$70,$01,$07,$20,$60,$20,$20\r
+       .DB     $20,$20,$70,$01,$07,$70,$88,$08,$10,$20,$40,$F8,$01,$07,$F8,$10\r
+       .DB     $20,$10,$08,$88,$70,$01,$07,$10,$30,$50,$90,$F8,$10,$10,$01,$07\r
+       .DB     $F8,$80,$F0,$08,$08,$88,$70,$01,$07,$30,$40,$80,$F0,$88,$88,$70\r
+       .DB     $01,$07,$F8,$08,$10,$20,$40,$40,$40,$01,$07,$70,$88,$88,$70,$88\r
+       .DB     $88,$70,$01,$07,$70,$88,$88,$78,$08,$10,$60,$01,$07,$70,$88,$88\r
+       .DB     $88,$F8,$88,$88,$01,$07,$F0,$88,$88,$F0,$88,$88,$F0,$01,$07,$70\r
+       .DB     $88,$80,$80,$80,$88,$70,$01,$07,$E0,$90,$88,$88,$88,$90,$E0,$01\r
+       .DB     $07,$F8,$80,$80,$F0,$80,$80,$F8,$01,$07,$F8,$80,$80,$F0,$80,$80\r
+       .DB     $80,$01,$07,$70,$88,$80,$B8,$88,$88,$78,$01,$07,$88,$88,$88,$F8\r
+       .DB     $88,$88,$88,$02,$21,$07,$80,$80,$80,$80,$80,$80,$80,$01,$07,$08\r
+       .DB     $08,$08,$08,$08,$88,$70,$01,$07,$88,$90,$A0,$C0,$A0,$90,$88,$01\r
+       .DB     $07,$80,$80,$80,$80,$80,$80,$F8,$01,$07,$88,$D8,$A8,$A8,$88,$88\r
+       .DB     $88,$01,$07,$88,$88,$C8,$A8,$98,$88,$88,$01,$07,$70,$88,$88,$88\r
+       .DB     $88,$88,$70,$01,$07,$F0,$88,$88,$F0,$80,$80,$80,$01,$07,$70,$88\r
+       .DB     $88,$88,$A8,$90,$68,$01,$07,$F0,$88,$88,$F0,$A0,$90,$88,$01,$07\r
+       .DB     $70,$88,$80,$70,$08,$88,$70,$01,$07,$F8,$20,$20,$20,$20,$20,$20\r
+       .DB     $01,$07,$88,$88,$88,$88,$88,$88,$70,$01,$07,$88,$88,$88,$88,$88\r
+       .DB     $50,$20,$01,$07,$88,$88,$88,$A8,$A8,$A8,$50,$01,$07,$88,$88,$50\r
+       .DB     $20,$50,$88,$88,$01,$07,$88,$88,$88,$50,$20,$20,$20,$02,$11,$02\r
+       .DB     $06,$08,$01,$01,$4F,$00,$2A,$02,$01,$07,$F8,$08,$10,$20,$40,$80\r
+       .DB     $F8,$01,$07,$F8,$F8,$F8,$F8,$F8,$F8,$F8\r
+CHSET00_END:\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+GET_HALFTONE_RECT_SIZE:\r
+       STS     RECTNC_X,CURSORX\r
+       STS     RECTNC_Y,CURSORY\r
+       RCALL   GO_RX_WAIT\r
+       STS     RECTNC_XX,A\r
+       RCALL   GO_RX_WAIT\r
+       STS     RECTNC_YY,A\r
+       RCALL   HALFTONE_RECT\r
+       RJMP    GO_MAIN_LOOP\r
+\r
+HALFTONE_RECT:\r
+       SEI\r
+       LDS     LINE_CNT,RECT_Y\r
+       LDS     XPIXEL,RECT_X\r
+       RCALL   CALCULATE_XBYTE\r
+       STS     XPIXEL_SAV,XPIXEL\r
+       STS     XBYTE_SAV,XBYTE\r
+       LDS     Y_SIZE,RECT_YY\r
+       CLR     YL\r
+       MOV     YH,LINE_CNT\r
+       LDI     A,$55\r
+       SBRS    YH,0\r
+       LDI     A,$AA\r
+       MOV     PATTERN,A\r
+       LSR     YH\r
+       ROR     YL\r
+       LSR     YH\r
+       ROR     YL\r
+       SUBI    YH,HIGH(-DRAW_DSPRAM)   ; DRAW INTO DRAWING BUFFER\r
+       LDI     A,HIGH(DRAW_DSPRAM>>6)\r
+       RCALL   SELECT_XPAGE\r
+       RJMP    X03A3\r
+X039A: SUBI    YL,LOW(-$40)\r
+       SBCI    YH,HIGH(-$40)\r
+       INC     LINE_CNT\r
+       LDS     XPIXEL,XPIXEL_SAV\r
+       LDS     XBYTE,XBYTE_SAV\r
+X03A3: OR      XBYTE,YL\r
+       LDI     A,$FF\r
+       LDS     X_SIZE,RECT_XX\r
+       LDI     F,$00\r
+       CP      X_SIZE,F\r
+       BREQ    X03B0\r
+       LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       TST     XPIXEL\r
+       BREQ    X03B0\r
+X03AD: LSR     A\r
+       DEC     XPIXEL\r
+       BRNE    X03AD\r
+X03B0: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     F,$08\r
+       LDS     A,XPIXEL_SAV\r
+       SUB     F,A\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       LDI     A,$FF\r
+X03B8: LDI     F,$08\r
+       CP      X_SIZE,F\r
+       BRLO    X03C2\r
+       BREQ    X03D2\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       LDI     A,$FF\r
+       LDI     F,$08\r
+       SUB     X_SIZE,F\r
+       INC     XBYTE\r
+       RJMP    X03B8\r
+X03C2: TST     X_SIZE\r
+       BREQ    X03D3\r
+X03C4: LSR     A\r
+       DEC     X_SIZE\r
+       BRNE    X03C4\r
+       COM     A\r
+       TST     XPIXEL\r
+       BREQ    X03D2\r
+       CLR     B\r
+X03CB: LSR     A\r
+       ROR     B\r
+       DEC     XPIXEL\r
+       BRNE    X03CB\r
+       AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+       INC     XBYTE\r
+       MOV     A,B\r
+X03D2: AND     A,PATTERN\r
+       RCALL   WR_DISP_MEM\r
+X03D3: COM     PATTERN\r
+       RCALL   GO_NICK_SUB1\r
+       DEC     Y_SIZE\r
+       CLR     F\r
+       CPSE    Y_SIZE,F\r
+       RJMP    X039A\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
+       .ORG    $1000\r
+\r
+       .DW     $4102                   ; SELECT ADDRESS COMMAND\r
+\r
+; -----------------------------------------------------------------------------\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/utils.cc b/src/mkutil/tavrasm.118/src/utils.cc
new file mode 100644 (file)
index 0000000..8405835
--- /dev/null
@@ -0,0 +1,983 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : utils.cc\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Implements functions for logging, error reporting etc.\r
+//\r
+//  History\r
+//  =======================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990117      : Tom - Fixed alignment of .db in CSEG with forward refs.\r
+//  990124      : Tom - Added GPL notice.\r
+//  990329      : Tom - Fixed problem with tabs after include filename\r
+//  991212      : Tom - Fixed promlem with detecting supported instructions\r
+//                      (Introduced in 1.10)\r
+//  001101     : Brian Rhodefer - Added "fopenInIncpath()" \r
+//  010403      : Tom - Fixed path delimiter problem in include path\r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#define _UTILS_CC_\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include <string.h>\r
+#include <stdio.h>\r
+#include <ctype.h>\r
+#include <stdarg.h>\r
+#include <stdlib.h>\r
+#include "messages.hh"\r
+#include "avrasm.hh"\r
+#include "utils.hh"\r
+#include "symbol.hh"\r
+#include "semantic.hh"\r
+\r
+/// Externals ////////////////////////////////////////////////////////////////\r
+\r
+GLOBALS(extern);\r
+\r
+/// Defines //////////////////////////////////////////////////////////////////\r
+\r
+#define SEP     yyinmacro?'>':'|'\r
+#define CUT     if( yycfg -> cutlog )        \\r
+                {                            \\r
+                  strcat(yyinlineold, sp );  \\r
+                  yyinlineold[58] = '|';     \\r
+                  yyinlineold[59] = '\0';    \\r
+                }\r
+\r
+/// Functions ////////////////////////////////////////////////////////////////\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Get symbol\r
+  //\r
+\r
+symbolTableEntry* getsym(char *name)\r
+{\r
+  int                   c;\r
+  symbolTableEntry      *symb = NULL;\r
+#ifdef DEBUG /* Nick */\r
+ void *silly;\r
+\r
+ silly = malloc(0x1000);\r
+ if (silly)\r
+  {\r
+  free(silly);\r
+  }\r
+\r
+ printf("getsym() @ %08lx\n", silly);\r
+ fflush(stdout);\r
+#endif\r
+\r
+  // Is it a macro def\r
+\r
+  for(c=yycontext; c>=0 ; c--)\r
+    if( yysymbolstack[c] && (symb=yysymbolstack[c]->get(name)) && symb->macro)\r
+      return symb;\r
+\r
+  // No it was not\r
+\r
+  c    = yycontext;\r
+  symb = NULL;\r
+\r
+  if(!yyparseno)\r
+  {\r
+    while(!yysymbolstack[c])\r
+      c--;\r
+\r
+    symb = yysymbolstack[c]->get(name);\r
+    if(!symb)\r
+ {\r
+      symb = yysymbolstack[c]->add(name);\r
+ if (!symb)\r
+  {\r
+#ifdef DEBUG /* Nick */\r
+  printf("Nick error 0\n");\r
+  fflush(stdout);\r
+#endif\r
+  errorexit(X_OUT_OF_MEMORY); /* Nick */\r
+  }\r
+#ifdef DEBUG /* Nick */\r
+ silly = malloc(0x1000);\r
+ if (silly)\r
+  {\r
+  free(silly);\r
+  }\r
+ printf("add() @ %08lx\n", silly);\r
+ fflush(stdout);\r
+#endif\r
+ }\r
+\r
+  }\r
+  else\r
+  {\r
+    while( (c>=0) && !symb )\r
+    {\r
+      if( yysymbolstack[c--] )\r
+      {\r
+        symb = yysymbolstack[c+1]->get(name);\r
+        if(! (symb && ISUSED(symb)) )\r
+          symb = NULL;\r
+      }\r
+    }\r
+    if(!symb)\r
+    {\r
+      c = yycontext;\r
+      while( (c>=0) && !symb )\r
+      {\r
+        if( yysymbolstack[c--] )\r
+          symb = yysymbolstack[c+1]->get(name);\r
+      }\r
+    }\r
+  }\r
+\r
+  if(!symb)\r
+    internalerror("GS %s",name);\r
+\r
+  return symb;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Insert code i CSEG\r
+  //\r
+\r
+void insertcode(int val)\r
+{\r
+  if(yycodepos>=MAX_CODE_SIZE)\r
+    errorexit(X_TOO_MUCH_CODE);\r
+\r
+  yycodebuf[yycodepos]     = val;\r
+  yycodeusage[yycodepos]   = yyfileno|0x80*(ISMACRO!=FALSE); /* Nick false); */\r
+  yycodeline[yycodepos++]  = yyline-1+(ISMACRO!=0);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Insert .db or .dw in CSEG\r
+  //\r
+\r
+void insertdbdw(int val)\r
+{\r
+  if(yycodepos>=MAX_CODE_SIZE)\r
+    errorexit(X_TOO_MUCH_CODE);\r
+\r
+  yycodebuf[yycodepos]     = val;\r
+  yycodeusage[yycodepos]   = yyfileno|0x80*(ISMACRO!=FALSE); /* Nick false); */\r
+  yycodeline[yycodepos++]  = yyline;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Insert data in ESEG\r
+  //\r
+\r
+void insertdata(int val)\r
+{\r
+  if(yycodepos>=MAX_EROM_SIZE)\r
+    errorexit(X_TOO_MUCH_DATA);\r
+\r
+  yyerombuf[yyerompos]     = val;\r
+  yyeromusage[yyerompos++] = yyfileno;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Check if instruction is supported with the current device\r
+  //\r
+\r
+#define NOSUP(_inst_) (DEVINF.supported & (_inst_))\r
+\r
+void checkSupported(int opcode)\r
+{\r
+  switch((unsigned int)opcode) /* Nick cast */\r
+  {\r
+    case O_ADIW   : if(NOSUP(S_ADIW  )) warning(W_UNSUP,"adiw");   break;\r
+    case O_ICALL  : if(NOSUP(S_ICALL )) warning(W_UNSUP,"icall");  break;\r
+    case O_CALL   : if(NOSUP(S_CALL  )) warning(W_UNSUP,"call");   break;\r
+    case O_IJMP   : if(NOSUP(S_IJMP  )) warning(W_UNSUP,"ijmp");   break;\r
+    case O_JMP    : if(NOSUP(S_JMP   )) warning(W_UNSUP,"jmp");    break;\r
+    case O_LD     : if(NOSUP(S_LD    )) warning(W_UNSUP,"ld");     break;\r
+    case O_LDD    : if(NOSUP(S_LDD   )) warning(W_UNSUP,"ldd");    break;\r
+    case O_LDS    : if(NOSUP(S_LDS   )) warning(W_UNSUP,"lds");    break;\r
+    case O_LPM    : if(NOSUP(S_LPM   )) warning(W_UNSUP,"lpm");    break;\r
+    case O_MUL    : if(NOSUP(S_MUL   )) warning(W_UNSUP,"mul");    break;\r
+    case O_PUSH   : if(NOSUP(S_PUSH  )) warning(W_UNSUP,"push");   break;\r
+    case O_POP    : if(NOSUP(S_POP   )) warning(W_UNSUP,"pop");    break;\r
+    case O_SBIW   : if(NOSUP(S_SBIW  )) warning(W_UNSUP,"sbiw");   break;\r
+    case O_ST     : if(NOSUP(S_ST    )) warning(W_UNSUP,"st");     break;\r
+    case O_STD    : if(NOSUP(S_STD   )) warning(W_UNSUP,"std");    break;\r
+    case O_STS    : if(NOSUP(S_STS   )) warning(W_UNSUP,"sts");    break;\r
+    case O_EIJMP  : if(NOSUP(S_EIJMP )) warning(W_UNSUP,"eijmp");  break;\r
+    case O_EICALL : if(NOSUP(S_EICALL)) warning(W_UNSUP,"eicall"); break;\r
+    case O_ESPM   : if(NOSUP(S_ESPM  )) warning(W_UNSUP,"espm");   break;\r
+    case O_MULSU  : if(NOSUP(S_MULSU )) warning(W_UNSUP,"mulsu");  break;\r
+    case O_FMUL   : if(NOSUP(S_FMUL  )) warning(W_UNSUP,"fmul");   break;\r
+    case O_FMULS  : if(NOSUP(S_FMULS )) warning(W_UNSUP,"fmuls");  break;\r
+    case O_FMULSU : if(NOSUP(S_FMULSU)) warning(W_UNSUP,"fmulsu"); break;\r
+    case O_MULS   : if(NOSUP(S_MULS  )) warning(W_UNSUP,"muls");   break;\r
+    case O_MOVW   : if(NOSUP(S_MOVW  )) warning(W_UNSUP,"movw");   break;\r
+    case O_ELPM   : if(NOSUP(S_ELPM  )) warning(W_UNSUP,"elpm");   break;\r
+    case O_SPM    : if(NOSUP(S_SPM   )) warning(W_UNSUP,"spm");    break;\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Insert instruction into code segment\r
+  //\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+void insertInst(int v, int s)\r
+#else\r
+void insertInst(long v, int s)\r
+#endif\r
+{\r
+  if(yysegment==SEGMENT_DATA)\r
+    error(E_PROGRAM_IN_DSEG);\r
+  else if(yysegment==SEGMENT_EEPROM)\r
+    error(E_PROGRAM_IN_DSEG);\r
+  else\r
+  {\r
+    if(s==1)\r
+    {\r
+      insertcode( (v & 0x000000FF) >>  0);\r
+    }\r
+    else if(s==2)\r
+    {\r
+#ifdef _MSC_VER /* Nick */\r
+      insertcode( (v & 0x000000FF) >>  0);\r
+      insertcode( (v & 0x0000FF00) >>  8);\r
+#else\r
+      insertcode( (v & 0x000000FFL) >>  0);\r
+      insertcode( (v & 0x0000FF00L) >>  8);\r
+#endif\r
+    }\r
+    else if(s==4)\r
+    {\r
+#ifdef _MSC_VER /* Nick */\r
+      insertcode( (v & 0x000000FF) >>  0);\r
+      insertcode( (v & 0x0000FF00) >>  8);\r
+      insertcode( (v & 0x00FF0000) >> 16);\r
+      insertcode( (v & 0xFF000000) >> 24);\r
+#else\r
+      insertcode( (v & 0x000000FFL) >>  0);\r
+      insertcode( (v & 0x0000FF00L) >>  8);\r
+      insertcode( (v & 0x00FF0000L) >> 16);\r
+      insertcode( (v & 0xFF000000L) >> 24);\r
+#endif\r
+    }\r
+    else\r
+      internalerror("GG %08X %08X",v,s);\r
+\r
+    if(s==1)\r
+      sprintf(yylinetxt,"?????? %02X%02X     ",\r
+              yycodebuf[yycodepos-1], yycodebuf[yycodepos-2]);\r
+    else if(s==2)\r
+      sprintf(yylinetxt,"%06X %02X%02X     ", (yycodepos-2)/2,\r
+              yycodebuf[yycodepos-1], yycodebuf[yycodepos-2]);\r
+    else if(s==4)\r
+      sprintf(yylinetxt,"%06X %02X%02X %02X%02X", (yycodepos-4)/2,\r
+      yycodebuf[yycodepos-3], yycodebuf[yycodepos-4],\r
+      yycodebuf[yycodepos-1], yycodebuf[yycodepos-2]);\r
+    else\r
+      internalerror("PH %08X %08X",v,s);\r
+  }\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Report warning at end of line\r
+  //\r
+\r
+int warning(int warnno, ...)\r
+{\r
+  va_list  args;\r
+  char     errtext[MAX_LINE_LENGTH+1];\r
+\r
+  if(!yyparseno || !warnno)\r
+    return FALSE; /* Nick false; */\r
+\r
+  yywarningcount++;\r
+\r
+  if(!yycfg -> warnings)\r
+    return FALSE; /* Nick false; */\r
+\r
+  if( (yywarningline==yyline-!ISMACRO) && !ISMACRO )\r
+    return FALSE; /* Nick false; */\r
+\r
+  yywarningline = yyline-!ISMACRO;\r
+\r
+  if( (warnno<1) || (warnno>MESSAGES_WARNING) )\r
+    internalerror("WW %04X", warnno);\r
+\r
+  va_start(args, warnno);\r
+  vsprintf(errtext, messages[warnno], args);\r
+  va_end(args);\r
+\r
+  if(yyinmacro)\r
+    printf("%s:%i: Warning in macro : %s\n",yyfilename,\r
+                                            yyline-!ISMACRO,errtext);\r
+  else\r
+    printf("%s:%i: Warning : %s\n",yyfilename,yyline-!ISMACRO,errtext);\r
+\r
+  if(yylogfile)\r
+  {\r
+    if(yyinmacro)\r
+      fprintf(yylogfile, "%s:%i: Warning in macro : %s\n",yyfilename,\r
+                                              yyline-!ISMACRO,errtext);\r
+    else\r
+      fprintf(yylogfile, "%s:%i: Warning : %s\n",yyfilename,\r
+              yyline-!ISMACRO,errtext);\r
+  }\r
+\r
+  STRIPNR(yyinlineold);\r
+\r
+  printf("%s:%i: \'%s\'\n",yyfilename,yyline-!ISMACRO,yyinlineold);\r
+\r
+  return TRUE; /* Nick true; */\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Report warning inline\r
+  //\r
+\r
+int warningin(int warnno, ...)\r
+{\r
+  va_list  args;\r
+  char     errtext[MAX_LINE_LENGTH+1];\r
+\r
+  if(!yyparseno || !warnno)\r
+    return FALSE; /* Nick false; */\r
+\r
+  yywarningcount++;\r
+\r
+  if(!yycfg -> warnings)\r
+    return FALSE; /* Nick false; */\r
+\r
+  if( (yywarningline==yyline) && !ISMACRO )\r
+    return FALSE; /* Nick false; */\r
+\r
+  yywarningline = yyline;\r
+\r
+  if( (warnno<1) || (warnno>MESSAGES_WARNING) )\r
+    internalerror("WI %04X", warnno);\r
+\r
+  va_start(args, warnno);\r
+  vsprintf(errtext, messages[warnno], args);\r
+  va_end(args);\r
+\r
+  if(yyinmacro)\r
+    printf("%s:%i: Warning in macro : %s\n",yyfilename,yyline,errtext);\r
+  else\r
+    printf("%s:%i: Warning : %s\n",yyfilename,yyline,errtext);\r
+\r
+  if(yylogfile)\r
+  {\r
+    if(yyinmacro)\r
+      fprintf(yylogfile, "%s:%i: Warning in macro : %s\n",yyfilename,\r
+                                                          yyline,errtext);\r
+    else\r
+      fprintf(yylogfile, "%s:%i: Warning : %s\n",yyfilename,yyline,errtext);\r
+  }\r
+\r
+  STRIPNR(yyinline);\r
+\r
+  printf("%s:%i: \'%s\'\n",yyfilename,yyline,yyinline);\r
+\r
+  return TRUE; /* Nick true; */\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Report error at end of line\r
+  //\r
+\r
+int error(int errorno, ...)\r
+{\r
+  va_list  args;\r
+  char     errtext[MAX_LINE_LENGTH+1];\r
+\r
+  if(!yyparseno)\r
+    return FALSE; /* Nick false; */\r
+\r
+  if( (yyerrorline == yyline- !ISMACRO) && !ISMACRO )\r
+    return FALSE; /* Nick false; */\r
+\r
+  yyerrorline = yyline - !ISMACRO;\r
+\r
+  yyerrorcount++;\r
+\r
+  if( (errorno<1) || (errorno>MESSAGES_ERROR) )\r
+    internalerror("EE %04X", errorno);\r
+\r
+  errorno += MESSAGES_WARNING;\r
+\r
+  va_start(args, errorno);\r
+  vsprintf(errtext, messages[errorno], args);\r
+  va_end(args);\r
+\r
+  if(yyinmacro)\r
+    printf("%s:%i: Error in macro : %s\n",yyfilename,yyline-!ISMACRO,errtext);\r
+  else\r
+    printf("%s:%i: Error : %s\n",yyfilename,yyline-!ISMACRO,errtext);\r
+\r
+  if(yylogfile)\r
+  {\r
+    if(yyinmacro)\r
+      fprintf(yylogfile, "%s:%i: Error in macro : %s\n",yyfilename,\r
+              yyline-!ISMACRO,errtext);\r
+    else\r
+      fprintf(yylogfile, "%s:%i: Error : %s\n",yyfilename,\r
+              yyline-!ISMACRO,errtext);\r
+  }\r
+\r
+  STRIPNR(yyinlineold);\r
+\r
+  printf("%s:%i: \'%s\'\n",yyfilename,yyline-!ISMACRO,yyinlineold);\r
+\r
+  return TRUE; /* Nick true; */\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Report error inline\r
+  //\r
+\r
+int errorin(int errorno, ...)\r
+{\r
+  va_list  args;\r
+  char     errtext[MAX_LINE_LENGTH+1];\r
+\r
+  if(!yyparseno)\r
+    return FALSE; /* Nick false; */\r
+\r
+  if( (yyerrorline == yyline) && !ISMACRO )\r
+    return FALSE; /* Nick false; */\r
+\r
+  yyerrorline = yyline;\r
+\r
+  yyerrorcount++;\r
+\r
+  if( (errorno<1) || (errorno>MESSAGES_ERROR) )\r
+    internalerror("EI %04X", errorno);\r
+\r
+  errorno += MESSAGES_WARNING;\r
+\r
+  va_start(args, errorno);\r
+  vsprintf(errtext, messages[errorno], args);\r
+  va_end(args);\r
+\r
+  if(yyinmacro)\r
+    printf("%s:%i: Error in macro : %s\n",yyfilename,yyline,errtext);\r
+  else\r
+    printf("%s:%i: Error : %s\n",yyfilename,yyline,errtext);\r
+\r
+  STRIPNR(yyinline);\r
+\r
+  printf("%s:%i: \'%s\'\n",yyfilename,yyline,yyinline);\r
+\r
+  if(yylogfile)\r
+  {\r
+    if(yyinmacro)\r
+      fprintf(yylogfile, "%s:%i: Error in macro : %s\n",yyfilename,yyline,errtext);\r
+    else\r
+      fprintf(yylogfile, "%s:%i: Error : %s\n",yyfilename,yyline,errtext);\r
+  }\r
+\r
+  return TRUE; /* Nick true; */\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Print a message\r
+  //\r
+\r
+int message(int msgno, ...)\r
+{\r
+  va_list  args;\r
+  char     msgtext[MAX_LINE_LENGTH+1];\r
+\r
+  msgno += MESSAGES_WARNING + MESSAGES_ERROR + MESSAGES_FATAL + 2;\r
+\r
+  va_start(args, msgno);\r
+  vsprintf(msgtext, messages[msgno], args);\r
+  va_end(args);\r
+\r
+  printf("%s\n",msgtext);\r
+\r
+  return TRUE; /* Nick true; */\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Report fatal error and exit(1)\r
+  //\r
+\r
+void errorexit(int errorno, ...)\r
+{\r
+  va_list  args;\r
+  char     errtext[MAX_LINE_LENGTH+1];\r
+\r
+  if( (errorno<1) || (errorno>MESSAGES_FATAL) )\r
+    internalerror("EX %04X", errorno);\r
+\r
+  errorno += MESSAGES_WARNING + MESSAGES_ERROR + 1;\r
+\r
+  va_start(args, errorno);\r
+  vsprintf(errtext, messages[errorno], args);\r
+  va_end(args);\r
+\r
+  printf("Program terminated - %s\n",errtext);\r
+  exit(1);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Report internal error and exit(2)\r
+  //\r
+\r
+void internalerror(char const *fmt, ...)\r
+{\r
+  va_list  args;\r
+  char     errtext[MAX_LINE_LENGTH+1];\r
+\r
+  va_start(args, fmt);\r
+  vsprintf(errtext, fmt, args);\r
+  va_end(args);\r
+\r
+  sprintf(errtext+strlen(errtext)," %s",VERSIONSTR);\r
+\r
+  while(strlen(errtext)<57)\r
+    strcat(errtext," ");\r
+\r
+  printf("\n");\r
+  printf("   ************************************************************\n");\r
+  printf("   *                                                          *\n");\r
+  printf("   *                Internal compiler error !!!               *\n");\r
+  printf("   *                                                          *\n");\r
+  printf("   * Please note the error text and report to Tom :           *\n");\r
+  printf("   *                                                          *\n");\r
+  printf("   * %s*\n",errtext);\r
+  printf("   *                                                          *\n");\r
+  printf("   ************************************************************\n");\r
+  exit(2);\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Add line to log file\r
+  //\r
+\r
+void tolog(void)\r
+{\r
+  int  c;\r
+  char temp[MAX_LINE_LENGTH+100];\r
+  char sp[]="                                                           |\n";\r
+  static int rompos  = 0;\r
+  static int codepos = 0;\r
+  static int rampos  = 0;\r
+\r
+  // Check alignment /////////////////////////////////////////////////////////\r
+\r
+  if( (yysegment==SEGMENT_CODE) && (yycodepos&1) && (yycfg->aligndb) ) {\r
+    yyline-=(ISMACRO==0);\r
+    insertdbdw(0);\r
+    yyline+=(ISMACRO==0);\r
+  }\r
+\r
+  // Return if first parse ///////////////////////////////////////////////////\r
+\r
+  if(!yyparseno)\r
+    return;\r
+\r
+  // Check if eeprom/flash size has been exceeded ////////////////////////////\r
+\r
+  if( (yycodepos > DEVINF.flashsize*2) && (yycodepos != codepos) ) {\r
+    warning(W_FLASH_EXCEEDED,(yycodepos-DEVINF.flashsize*2)/2);\r
+    codepos = yycodepos;\r
+  }\r
+\r
+  if( (yyerompos > DEVINF.eepromsize) && (yyerompos!=rompos) ) {\r
+    warning(W_EROM_EXCEED,yyerompos-DEVINF.eepromsize);\r
+    rompos = yyerompos;\r
+  }\r
+\r
+  if( (yydatapos > DEVINF.datastart+DEVINF.ramsize) && (yydatapos!=rampos)) {\r
+    warning(W_SRAM_EXCEED,yydatapos-(DEVINF.datastart+DEVINF.ramsize));\r
+    rampos = yydatapos;\r
+  }\r
+\r
+  // Clean-up log line ///////////////////////////////////////////////////////\r
+\r
+  STRIPNR(yyinlineold);\r
+  exptabs(yyinlineold);\r
+\r
+  CUT;\r
+\r
+  /// Check if this line was a '.db' or '.dw' ////////////////////////////////\r
+\r
+  if(yydefinestart!=-1)\r
+  {\r
+    if(yysegment == SEGMENT_CODE)\r
+    {\r
+      if( (yycodepos & 1) && ( yycfg -> aligndb ) )\r
+      {\r
+        yyline-=(ISMACRO==0);\r
+        insertdbdw(0);\r
+        yyline+=(ISMACRO==0);\r
+      }\r
+\r
+      if(!ISMACRO && (yycodeline[yycodepos-2]==yyline) )\r
+        yycodeline[yycodepos-2]--;\r
+\r
+      if(yylist && yylogfile && !(yyinmacro && !yylistmacro))\r
+      {\r
+        sprintf(temp,"%06X ", yydefinestart/2);\r
+\r
+        for(c=0;c<((yycodepos-yydefinestart)&3);c++) /* Nick added paren */\r
+        {\r
+          sprintf(temp+strlen(temp),"%02X",yycodebuf[yydefinestart+c]);\r
+          if(c&1)\r
+            strcat(temp," ");\r
+        }\r
+\r
+        strcat(temp,"                      ");\r
+        temp[16] = '\0';\r
+\r
+        CUT;\r
+\r
+        fprintf(yylogfile,"| %s %c %s\n",temp,SEP,yyinlineold);\r
+\r
+        if(yycodepos-yydefinestart>3)\r
+        {\r
+          for(c=0;c< (yycodepos-yydefinestart)-4;c++)\r
+          {\r
+            if(c%4 == 0)\r
+              sprintf(temp,"%06X ",(c+4+yydefinestart)/2);\r
+\r
+            sprintf(temp+strlen(temp),"%02X",yycodebuf[yydefinestart+c+4]);\r
+            if(c&1)\r
+              strcat(temp," ");\r
+            if( (c%4 == 3) && c)\r
+            {\r
+              strcat(temp,"                      ");\r
+              temp[16] = '\0';\r
+\r
+              fprintf(yylogfile,"| %s %c",temp,SEP);\r
+              if( yycfg -> cutlog)\r
+                fprintf(yylogfile, sp);\r
+              else\r
+                fprintf(yylogfile,"\n");\r
+            }\r
+          }\r
+        }\r
+        if( (yycodepos-yydefinestart>4) && (c%4 != 0) )\r
+        {\r
+          strcat(temp,"                      ");\r
+          temp[16] = '\0';\r
+          fprintf(yylogfile,"| %s %c",temp,SEP);\r
+          if( yycfg -> cutlog)\r
+            fprintf(yylogfile, sp);\r
+          else\r
+            fprintf(yylogfile,"\n");\r
+        }\r
+      }\r
+    }\r
+    else if(yysegment == SEGMENT_EEPROM)\r
+    {\r
+      if(yylist && yylogfile && !(yyinmacro && !yylistmacro))\r
+      {\r
+        if(yydefinetype!=SEGMENT_DEFINE_BYTE)\r
+        {\r
+          c = yydefinestart;\r
+          CUT;\r
+          fprintf(yylogfile,"| %06X %02X EEPROM %c %s\n", c,\r
+                    yyerombuf[c],SEP,yyinlineold);\r
+          for(c++;c<yyerompos;c++)\r
+          {\r
+            fprintf(yylogfile,"| %06X %02X EEPROM %c", c, yyerombuf[c], SEP);\r
+            if( yycfg -> cutlog)\r
+              fprintf(yylogfile, sp);\r
+            else\r
+              fprintf(yylogfile,"\n");\r
+          }\r
+        }\r
+        else\r
+        {\r
+          CUT;\r
+          fprintf(yylogfile, "| %06X    EEPROM %c %s\n",yydefinestart, \r
+                 SEP,yyinlineold);\r
+          yydefinetype = 0;\r
+        }\r
+      }\r
+    }\r
+    else if(yysegment == SEGMENT_DATA)\r
+    {\r
+      if(yylist && yylogfile && !(yyinmacro && !yylistmacro))\r
+      {\r
+        c = yydefinestart;\r
+        CUT;\r
+        fprintf(yylogfile, "| %06X    -DATA- %c %s\n", c, SEP,yyinlineold);\r
+      }\r
+    }\r
+    else\r
+      internalerror("LI %04X",yysegment);\r
+  }\r
+\r
+  /// No it is a regular instruction /////////////////////////////////////////\r
+\r
+  else\r
+  {\r
+    if(yyinmacro)\r
+    {\r
+      if((yylistmacro||yyfirstmacroline) && yylist && yylogfile)\r
+      {\r
+        if( strlen(yylinetxt) )\r
+        {\r
+          CUT;\r
+          fprintf(yylogfile,"| %s > %s\n",yylinetxt,yyinlineold);\r
+        }\r
+        else if(yyfirstmacroline)\r
+        {\r
+          CUT;\r
+          fprintf(yylogfile,"| %06X           > %s\n",yycodepos/2,yyinlineold);\r
+        }\r
+        else\r
+        {\r
+          CUT;\r
+          fprintf(yylogfile,"|                  > %s\n",yyinlineold);\r
+        }\r
+      }\r
+    }\r
+    else\r
+    {\r
+      if(yylist && yylogfile)\r
+      {\r
+        if( strlen(yylinetxt) )\r
+        {\r
+          CUT;\r
+          fprintf(yylogfile, "| %s | %s\n",yylinetxt,yyinlineold);\r
+        }\r
+        else if(!(yyinmacrodef && !yylistmacro))\r
+        {\r
+          CUT;\r
+          fprintf(yylogfile, "|                  | %s\n",yyinlineold);\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  yylinetxt[0]     = 0;\r
+  yydefinestart    = -1;\r
+  yyfirstmacroline = FALSE; /* Nick false; */\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Strip comment from line\r
+  //\r
+\r
+int striprem(char *str)\r
+{\r
+  int   l   = 0;\r
+  int   rem = FALSE; /* Nick false; */\r
+  char  *pos;\r
+\r
+  if( (pos=strpbrk(str,"\r\n")) )\r
+    *pos = '\0';\r
+\r
+  while(str[l])\r
+  {\r
+    if( (str[l]=='"') || (str[l]=='\'') )\r
+      rem ? rem = FALSE /* Nick false */ : rem = TRUE; /* Nick true; */\r
+    else if( str[l]=='\\' )\r
+    {\r
+      if(str[l+1])\r
+        l++;\r
+    }\r
+    else if ( (str[l]==';') && !rem)\r
+      str[l--] = '\0';\r
+    l++;\r
+  }\r
+\r
+  l = strlen(str);\r
+\r
+  if(l)\r
+    while(--l, ((str[l]==' ')||(str[l]=='\t')))\r
+      str[l] = '\0';\r
+\r
+  return l;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Expand tabs in string\r
+  //\r
+\r
+int exptabs(char *str)\r
+{\r
+  int   l   = strlen(str);\r
+  int   c   = 0;\r
+  char  *temp;\r
+\r
+  /// Expand tabs ///////////////////////////////////////////////////////////\r
+\r
+  if(l)\r
+  {\r
+    if(!(temp = new char[strlen(str)+1]))\r
+ {\r
+#ifdef DEBUG /* Nick */\r
+ printf("Nick error 1\n");\r
+ fflush(stdout);\r
+#endif\r
+      errorexit(X_OUT_OF_MEMORY);\r
+ }\r
+\r
+    strcpy(temp, str);\r
+    c = l = 0;\r
+    while(temp[l] && (c<(MAX_LINE_LENGTH-10)))\r
+    {\r
+      if(temp[l]=='\t')\r
+      {\r
+        if(temp[l]=='\t')\r
+          str[c++]=' ';\r
+        while((c%8)!=0)\r
+          str[c++]=' ';\r
+        l++;\r
+        if(temp[l]=='\t')\r
+          str[c++]=' ';\r
+      }\r
+      else\r
+        str[c++]=temp[l++];\r
+    }\r
+    str[c] = '\0';\r
+    delete temp;\r
+  }\r
+  return c;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Get file.name from "file.name" or <file.name>\r
+  //\r
+\r
+int getfilename(char *name, char *newname)\r
+{\r
+\r
+  if( (name[0]!='"') || (name[strlen(name)-1]!='"') )\r
+  {\r
+    if( (name[0]!='<') || (name[strlen(name)-1]!='>') )\r
+      return FALSE; /* Nick false; */\r
+    else\r
+    {\r
+      memmove(name,name+1,strlen(name)-1);\r
+      name[strlen(name)-2] = 0;\r
+\r
+      // Search include tree here - XXX\r
+\r
+      strcpy(newname, name);\r
+    }\r
+\r
+    if(!strlen(newname))\r
+      return FALSE; /* Nick false; */\r
+  }\r
+  else\r
+  {\r
+    memcpy(newname,name+1,strlen(name)-1);\r
+    newname[strlen(name)-2] = 0;\r
+  }\r
+\r
+  if(strlen(newname)>MAX_FILENAME_LENGTH)\r
+  {\r
+    errorin(E_FILENAME_TOO_LONG);\r
+    return FALSE; /* Nick false; */\r
+  }\r
+\r
+  return TRUE; /* Nick true; */\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Check that filename is valid\r
+  //\r
+\r
+int   checkfilename(char *name)\r
+{\r
+  return 1;\r
+\r
+  int c         = strlen(name);\r
+  int valid     = TRUE; /* Nick true; */\r
+\r
+  while(name[c])\r
+    if( ! isalnum(name[c++]) )\r
+      valid = FALSE; /* Nick false; */\r
+\r
+  return valid;\r
+}\r
+\r
+  ////////////////////////////////////////////////////////////////////////////\r
+  //\r
+  // Open a file somewhere in the "include path".  Try in the current dir first.\r
+  //\r
+\r
+FILE * fopenInIncpath(const char *name, const char *mode)\r
+{\r
+  FILE *fp = fopen(name, mode);\r
+\r
+  if(fp)\r
+    return fp;\r
+\r
+  if (MAX_FILENAME_LENGTH <= strlen(name)) \r
+    errorin(E_FILENAME_TOO_LONG);\r
+  else\r
+  {\r
+    int c;\r
+\r
+    for(c=0; !fp && (c<yyIncPathCount); c++) {\r
+      char *path  = yyIncludePaths[c];\r
+      if(strlen(path)>MAX_FILENAME_LENGTH)\r
+        continue;\r
+      char *slash = strrchr(path, '/');\r
+      char file[2 * MAX_FILENAME_LENGTH + 3];\r
+      sprintf(file, "%s%s%s", path, (slash && !slash[1]) ? "" : "/", name);\r
+      fp = fopen(file, mode);\r
+    }\r
+  }\r
+\r
+  return fp;\r
+}\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
diff --git a/src/mkutil/tavrasm.118/src/utils.hh b/src/mkutil/tavrasm.118/src/utils.hh
new file mode 100644 (file)
index 0000000..90d568b
--- /dev/null
@@ -0,0 +1,87 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  File        : utils.hh\r
+//\r
+//  Author      : Tom Mortensen - Copyright (C) 1999\r
+//\r
+//  Description : Utility header\r
+//\r
+//  History\r
+//  ========================================================================\r
+//\r
+//  980902      : Tom - File created.\r
+//  990124      : Tom - Added GPL notice.\r
+//  001101      : Brian Rhodefer - Added "fopenInIncpath()" \r
+//\r
+//////////////////////////////////////////////////////// Tom did this ////////\r
+//\r
+// Copyright notice:\r
+//\r
+// tavrasm - A GNU/Linux assembler for the Atmel AVR series\r
+// of microcontrollers. Copyright (C) 1999 Tom Mortensen\r
+//\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+// \r
+// Tom Mortensen\r
+//\r
+// E-mail : tom@tavrasm.org\r
+// WWW    : http://www.tavrasm.org\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _UTILS_HH_\r
+#define _UTILS_HH_\r
+\r
+/// Include //////////////////////////////////////////////////////////////////\r
+\r
+#include "symbol.hh"\r
+#include <stdio.h>\r
+\r
+/// Prototypes ///////////////////////////////////////////////////////////////\r
+\r
+#ifdef _MSC_VER /* Nick */\r
+void insertInst(int v, int s);\r
+#else\r
+void insertInst(long v, int s);\r
+#endif\r
+void checkSupported(int opcode);\r
+symbolTableEntry* getsym(char *name);\r
+void insertcode(int val);\r
+void insertdbdw(int val);\r
+void insertdata(int val);\r
+FILE * fopenInIncpath(const char *name, const char *mode);\r
+\r
+  /// Error handling ///////////////////////////////////////////////////////\r
+\r
+int   error(int errorno, ...);\r
+int   errorin(int errorno, ...);\r
+int   warning(int warnno, ...);\r
+int   warningin(int warnno, ...);\r
+void  errorexit(int errorno, ...);\r
+void  internalerror(char const *fmt, ...);\r
+int   message(int msgno, ...);\r
+\r
+  /// Strip comments ///////////////////////////////////////////////////////\r
+\r
+void  tolog(void);\r
+int   getfilename(char *name, char *newname);\r
+int   striprem(char *str);\r
+int   exptabs(char *str);\r
+int   checkfilename(char *name);\r
+\r
+#endif /* _UTILS_HH_ */\r
+\r
+/// END OF FILE //////////////////////////////////////////////////////////////\r
+\r
index a607f97..84db381 100644 (file)
Binary files a/src/mkutil/touch.exe and b/src/mkutil/touch.exe differ
diff --git a/src/sh/msh/closedir.c b/src/sh/msh/closedir.c
new file mode 100644 (file)
index 0000000..fe24125
--- /dev/null
@@ -0,0 +1,31 @@
+/* closedir.c  closedir implementation\r
+ *\r
+ */\r
+#include <unistd.h>\r
+#include <alloc.h>\r
+#include <dirent.h>\r
+#include <sys/stat.h>\r
+#include <errno.h>\r
+#include <fcntl.h>\r
+#include <string.h>\r
+\r
+/* don't bother freeing anything, since msh doesn't like sharing its heap */\r
+\r
+int nick_closedir(DIR *dir)\r
+{\r
+       if (dir == NULL || dir->dd_buf == NULL || dir->dd_fd == 0) {\r
+               errno = EFAULT;\r
+               return -1;\r
+       }\r
+       close(dir->dd_fd);\r
+#if 0\r
+       free(dir->dd_buf);\r
+#endif\r
+       dir->dd_fd = 0;\r
+       dir->dd_buf = NULL;\r
+#if 0\r
+       free(dir);\r
+#endif\r
+       return 0;\r
+}\r
+\r
diff --git a/src/sh/msh/closedir.rel b/src/sh/msh/closedir.rel
new file mode 100644 (file)
index 0000000..f70b0d8
--- /dev/null
@@ -0,0 +1,49 @@
+XL4\r
+H 2 areas 8 global symbols\r
+M closedir\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
+S close Ref00000000\r
+S ?ENT_PARM_DIRECT_L09 Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S errno Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 5B flags 0\r
+S nick_closedir Def00000000\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 CD 00 00 00 00 7B B2 28 1A 21\r
+R 00 00 01 00 02 05 02 00\r
+T 08 00 00 00 06 00 DD 4E 02 DD 46 03 09 7E 23\r
+R 00 00 01 00\r
+T 13 00 00 00 B6 28 0B DD 6E 02 DD 66 03 7E 23\r
+R 00 00 01 00\r
+T 1E 00 00 00 B6 20 0B\r
+R 00 00 01 00\r
+T 21 00 00 00\r
+R 00 00 01 00\r
+T 21 00 00 00\r
+R 00 00 01 00\r
+T 21 00 00 00\r
+R 00 00 01 00\r
+T 21 00 00 00 21 0E 00 22 00 00 00 00 21 FF FF\r
+R 00 00 01 00 02 08 04 00\r
+T 2A 00 00 00 18 2C\r
+R 00 00 01 00\r
+T 2C 00 00 00\r
+R 00 00 01 00\r
+T 2C 00 00 00 DD 6E 02 DD 66 03 5E 23 56 3E\r
+R 00 00 01 00\r
+T 36 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 01 00 02 09 01 00\r
+T 3B 00 00 00 00 00 00 00 DD 6E 02 DD 66 03 AF\r
+R 00 00 01 00 02 04 03 00\r
+T 44 00 00 00 77 23 77 21 06 00 DD 4E 02 DD 46\r
+R 00 00 01 00\r
+T 4F 00 00 00 03 09 AF 77 23 77 21 00 00\r
+R 00 00 01 00\r
+T 58 00 00 00\r
+R 00 00 01 00\r
+T 58 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 00 00\r
index 6d24876..155534e 100644 (file)
@@ -16,3 +16,6 @@ sh3
 sh4\r
 sh5\r
 sh6\r
+opendir\r
+closedir\r
+readdir\r
index 0f32f35..9a7e2fe 100644 (file)
@@ -10,14 +10,14 @@ Area                       Addr        Size        Decimal Bytes (Attributes)
      00000000  l_CONST   |    00000000  .__.ABS.  |    00000000  ?CL64180L\r
      00000000  ?CL64180B |    00000014  e__DEFAUL |    00000014  l__DEFAUL\r
      00000185  l_RCODE   |    00000520  l_CDATA0  |    00000520  l_IDATA0 \r
-     00000530  l_CSTR    |    000009C5  l_UDATA0  |    00001000  l_CSTACK \r
+     000005E7  l_CSTR    |    000009EB  l_UDATA0  |    00001000  l_CSTACK \r
      00004000  s_CODE    |    00008100  s_RCODE   |    00008285  s_CSTR   \r
      00008285  e_RCODE   |    00008285  e_CONST   |    00008285  s_CONST  \r
-     000087B5  e_CSTR    |    000087B5  s_IDATA0  |    000087B5  s_CDATA0 \r
-     00008CD5  s_UDATA0  |    00008CD5  e_CCSTR   |    00008CD5  e_ECSTR  \r
-     00008CD5  s_CCSTR   |    00008CD5  e_CDATA0  |    00008CD5  s_ECSTR  \r
-     00008CD5  e_IDATA0  |    0000969A  e_UDATA0  |    0000969A  s_CSTACK \r
-     0000A69A  e_CSTACK  |    00018909  l_CODE    |    0001C909  e_CODE   \r
+     0000886C  e_CSTR    |    0000886C  s_IDATA0  |    0000886C  s_CDATA0 \r
+     00008D8C  s_UDATA0  |    00008D8C  e_CCSTR   |    00008D8C  e_ECSTR  \r
+     00008D8C  s_CCSTR   |    00008D8C  e_CDATA0  |    00008D8C  s_ECSTR  \r
+     00008D8C  e_IDATA0  |    00009777  e_UDATA0  |    00009777  s_CSTACK \r
+     0000A777  e_CSTACK  |    000187BA  l_CODE    |    0001C7BA  e_CODE   \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
@@ -55,7 +55,7 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CSTR                   00008285    00000530 =        1328. bytes (REL,CON)\r
+CSTR                   00008285    000005E7 =        1511. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -63,19 +63,19 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-IDATA0                 000087B5    00000520 =        1312. bytes (NUL,CON)\r
+IDATA0                 0000886C    00000520 =        1312. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     000087B5  flag      |    000087B7  elinep    |    000087B9  null     \r
-     000087BB  heedint   |    000087BD  env       |    000087C9  shellname\r
-     000087D1  search    |    000087E0  qflag     |    000087E5  restab   \r
-     00008CC7  temparg  \r
+     0000886C  flag      |    0000886E  elinep    |    00008870  null     \r
+     00008872  heedint   |    00008874  env       |    00008880  shellname\r
+     00008888  search    |    00008897  qflag     |    0000889C  restab   \r
+     00008D7E  temparg  \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CDATA0                 000087B5    00000520 =        1312. bytes (REL,CON)\r
+CDATA0                 0000886C    00000520 =        1312. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -83,7 +83,7 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-ECSTR                  00008CD5    00000000 =           0. bytes (NUL,CON)\r
+ECSTR                  00008D8C    00000000 =           0. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -91,7 +91,7 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CCSTR                  00008CD5    00000000 =           0. bytes (REL,CON)\r
+CCSTR                  00008D8C    00000000 =           0. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -99,26 +99,26 @@ Hexadecimal  [32-Bits]
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CODE                   00004000    00018909 =      100617. bytes (NUL,CON)\r
+CODE                   00004000    000187BA =      100282. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     00004BE9  main      |    00005266  setdash   |    000052C9  newfile  \r
-     00005346  onecomman |    000054A6  fail      |    000054BC  leave    \r
-     000054FA  warn      |    00005539  err       |    0000558B  newenv   \r
-     000055F6  quitenv   |    00005656  anys      |    00005693  any      \r
-     000056C9  putn      |    000056DA  sh_itoa   |    00005785  next     \r
-     000057A3  onintr    |    000057FD  letter    |    0000584E  digit    \r
-     00005876  letnum    |    000058A2  space     |    000058D3  strsave  \r
-     0000594C  xfree     |    0000595A  sig       |    0000597D  runtrap  \r
-     000059D4  lookup    |    00005BE8  setval    |    00005BFB  nameval  \r
-     00005DCC  export    |    00005DDA  ronly     |    00005E04  isassign \r
-     00005E5B  assign    |    00005F24  checkname |    00005F78  putvlist \r
-     0000606D  eqname    |    000060F9  gmatch    |    0000632D  initarea \r
-     0000637D  getcell   |    00006571  freecell  |    000065BE  freearea \r
-     0000661F  setarea   |    0000664C  getarea   |    0000665C  garbage  \r
-     000066E9  yyparse   |    0000700D  rlookup   |    00007250  yyerror  \r
-     00007616  collect   |    000076D0  dual      |    0000782A  printf   \r
+     00004CA0  main      |    0000531D  setdash   |    00005380  newfile  \r
+     000053FD  onecomman |    0000555D  fail      |    00005573  leave    \r
+     000055B1  warn      |    000055F0  err       |    00005642  newenv   \r
+     000056AD  quitenv   |    0000570D  anys      |    0000574A  any      \r
+     00005780  putn      |    00005791  sh_itoa   |    0000583C  next     \r
+     0000585A  onintr    |    000058B4  letter    |    00005905  digit    \r
+     0000592D  letnum    |    00005959  space     |    0000598A  strsave  \r
+     00005A03  xfree     |    00005A11  sig       |    00005A34  runtrap  \r
+     00005A8B  lookup    |    00005C9F  setval    |    00005CB2  nameval  \r
+     00005E83  export    |    00005E91  ronly     |    00005EBB  isassign \r
+     00005F12  assign    |    00005FDB  checkname |    0000602F  putvlist \r
+     00006124  eqname    |    000061B0  gmatch    |    000063E4  initarea \r
+     00006434  getcell   |    000066B4  freecell  |    00006701  freearea \r
+     00006762  setarea   |    0000678F  getarea   |    0000679F  garbage  \r
+     0000682C  yyparse   |    00007150  rlookup   |    00007393  yyerror  \r
+     00007759  collect   |    00007813  dual      |    0000796D  printf   \r
      00014000  execute   |    00014C48  iosetup   |    00015097  waitfor  \r
      00015277  setstatus |    000152AB  rexecve   |    00015493  run      \r
      000155A1  dolabel   |    000155A7  dochdir   |    00015633  doshift  \r
@@ -131,68 +131,71 @@ CODE                   00004000    00018909 =      100617. bytes (NUL,CON)
      0001640C  dotimes   |    00016412  inbuilt   |    0001646C  eval     \r
      00016612  makenv    |    00016696  evalstr   |    00016B22  subgetc  \r
      0001715C  unquote   |    00017198  glob      |    0001747D  globname \r
-     000178F9  newword   |    00017936  addword   |    00017A05  getwords \r
-     00017A92  glob0     |    00017ACD  glob1     |    00017D8F  glob2    \r
-     00017DF2  glob3     |    00017E7C  memcopy   |    00024000  getc     \r
+     00017905  newword   |    00017942  addword   |    00017A11  getwords \r
+     00017A9E  glob0     |    00017AD9  glob1     |    00017D9B  glob2    \r
+     00017DFE  glob3     |    00017E88  memcopy   |    00024000  getc     \r
      000240B8  unget     |    000240DA  eofc      |    0002410A  readc    \r
      00024259  ioecho    |    00024281  pushio    |    00024460  setbase  \r
      0002447B  nlchar    |    000244C4  wdchar    |    00024535  dolchar  \r
      000245E5  strchar   |    0002461F  qstrchar  |    0002465F  filechar \r
      00024828  herechar  |    00024874  gravechar |    000248AC  qgravecha\r
-     0002498D  linechar  |    000249DA  prs       |    00024A07  putc     \r
-     00024A23  prn       |    00024A3D  closef    |    00024A5B  closeall \r
-     00024A94  remap     |    00024B7A  openpipe  |    00024BAB  closepipe\r
-     00024BE1  markhere  |    00024D28  gethere   |    00024FB9  herein   \r
-     00025104  scraphere |    0002517C  freehere  |    00025246  tempnam\r
-     000252D2  execve    |    000252F1  unix      |    0002530B  dup      \r
-     00025320  chdir     |    00025335  _write    |    00025354  creat    \r
-     0002536B  unlink    |    00025380  strncpy   |    000253FF  setjmp   \r
-     00025429  lseek     |    00025456  closedir  |    000254CC  close    \r
-     000254E1  abort     |    0002554F  strlen    |    00025586  _exit    \r
-     0002559B  strcmp    |    000255F2  readdir   |    000256D5  pause    \r
-     000256E5  isatty    |    00025720  umask     |    0002573A  fstat    \r
-     00025751  free      |    00025831  geteuid   |    00025846  kill     \r
-     0002585D  pipe      |    00025872  opendir   |    00025953  fork     \r
+     0002498D  linechar  |    000249DA  prs       |    00024A07  prs_expan\r
+     00024B86  putc      |    00024BA2  prn       |    00024BBC  closef   \r
+     00024BDA  closeall  |    00024C13  remap     |    00024CF9  openpipe \r
+     00024D2A  closepipe |    00024D60  markhere  |    00024EA7  gethere  \r
+     00025138  herein    |    00025283  scraphere |    000252FB  freeher\r
+     000253C5  tempname  |    00025451  nick_open |    000254E6  nick_clos\r
+     00025541  nick_read |    00025624  execve    |    00025643  unix     \r
+     0002565D  dup       |    00025672  getenv    |    00025723  chdir    \r
+     00025738  _write    |    00025757  creat     |    0002576E  unlink   \r
+     00025783  strncpy   |    00025802  setjmp    |    0002582C  lseek    \r
+     00025859  uname     |    00025917  close     |    0002592C  strlen   \r
+     00025963  strcmp    |    000259BA  isatty    |    000259F5  umask    \r
+     00025A0F  fstat     |    00025A26  free      |    00025B06  strcpy   \r
+     00025B2D  geteuid   |    00025B42  pipe      |    00025B57  fork     \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CODE                   00004000    00018909 =      100617. bytes (NUL,CON)\r
+CODE                   00004000    000187BA =      100282. bytes (NUL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     00025963  waitpid   |    00025982  open      |    000259AD  sbrk     \r
-     000259C2  longjmp   |    000259ED  exit      |    00025A1D  _read    \r
-     00025A3C  dup2      |    00025A53  stat      |    00025A6A  getpid   \r
-     00025A7F  signal    |    00025AA4  malloc    |    00025CD0  unix_long\r
-     00025CEA  calloc    |    00025D32  memset   \r
+     00025B67  waitpid   |    00025B86  open      |    00025BB1  sbrk     \r
+     00025BC6  longjmp   |    00025BF1  exit      |    00025C21  _read    \r
+     00025C40  dup2      |    00025C57  stat      |    00025C6E  getpid   \r
+     00025EC8  getcwd    |    00025F25  signal    |    00025F4A  memcmp   \r
+     00025FB7  getfsys   |    00025FCE  malloc    |    000261FA  memcpy   \r
+     0002624C  strcat    |    0002626C  unix_long |    00026286  closedir \r
+     000262FC  _exit     |    00026311  readdir   |    000263F4  opendir  \r
+     000264D5  calloc    |    0002651D  memset   \r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-UDATA0                 00008CD5    000009C5 =        2501. bytes (REL,CON)\r
+UDATA0                 00008D8C    000009EB =        2539. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
-     00008CD5  _argc     |    00008CD7  _argv     |    00008CD9  environ  \r
-     00008CDB  errno     |    00008CDD  __cleanup |    00008CE0  intr     \r
-     00008CE2  inparse   |    00008CE4  flags     |    00008D2B  func     \r
-     00008D2E  globv     |    00008D36  dolv      |    00008D38  dolc     \r
-     00008D3A  exstat    |    00008D3C  gflg      |    00008D3D  talking  \r
-     00008D3F  execflg   |    00008D41  multiline |    00008D43  outtree  \r
-     00008D45  failpt    |    00008D47  errpt     |    00008D49  brklist  \r
-     00008D4B  isbreak   |    00008D4D  wdlist    |    00008D4F  iolist   \r
-     00008D51  trap      |    00008D73  ourtrap   |    00008D84  trapset  \r
-     00008D86  yynerrs   |    00008D88  line      |    000095BC  vlist    \r
-     000095BE  homedir   |    000095C0  prompt    |    000095C2  cprompt  \r
-     000095C4  path      |    000095C6  shell     |    000095C8  ifs      \r
-     000095CA  ioargstac |    0000963A  iostack   |    00009692  areanum  \r
-     00009694  __malloc_ |    00009698  __malloc_\r
+     00008D8C  _argc     |    00008D8E  _argv     |    00008D90  environ  \r
+     00008D92  errno     |    00008D94  __cleanup |    00008D97  intr     \r
+     00008D99  inparse   |    00008D9B  flags     |    00008DE2  func     \r
+     00008DE5  globv     |    00008DED  dolv      |    00008DEF  dolc     \r
+     00008DF1  exstat    |    00008DF3  gflg      |    00008DF4  talking  \r
+     00008DF6  execflg   |    00008DF8  multiline |    00008DFA  outtree  \r
+     00008DFC  failpt    |    00008DFE  errpt     |    00008E00  brklist  \r
+     00008E02  isbreak   |    00008E04  wdlist    |    00008E06  iolist   \r
+     00008E08  trap      |    00008E2A  ourtrap   |    00008E3B  trapset  \r
+     00008E3D  yynerrs   |    00008E3F  line      |    00009673  vlist    \r
+     00009675  homedir   |    00009677  prompt    |    00009679  cprompt  \r
+     0000967B  path      |    0000967D  shell     |    0000967F  ifs      \r
+     00009681  ioargstac |    000096F1  iostack   |    00009749  areanum  \r
+     00009771  __malloc_ |    00009775  __malloc_\r
 Hexadecimal  [32-Bits]\r
 \r
 Area                       Addr        Size        Decimal Bytes (Attributes)\r
 --------------------       ----        ----        ------- ----- ------------\r
-CSTACK                 0000969A    00001000 =        4096. bytes (REL,CON)\r
+CSTACK                 00009777    00001000 =        4096. bytes (REL,CON)\r
 \r
         Value  Global            Value  Global            Value  Global    \r
         -----  ------            -----  ------            -----  ------    \r
@@ -206,6 +209,9 @@ sh3                                       [ sh3 ]
 sh4                                       [ sh4 ]\r
 sh5                                       [ sh5 ]\r
 sh6                                       [ sh6 ]\r
+opendir                                   [ opendir ]\r
+closedir                                  [ closedir ]\r
+readdir                                   [ readdir ]\r
 \r
 \r
 Libraries Linked                          [ object file ]\r
@@ -214,6 +220,7 @@ Libraries Linked                          [ object file ]
 ..\..\..\lib\libsysb.lib                  [ relsysb\sys0b.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\BANKLEAVEDIRECT.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\dup.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\getenv.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\chdir.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\write.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SMUL.rel ]\r
@@ -222,32 +229,27 @@ Libraries Linked                          [ object file ]
 ..\..\..\lib\libcb.lib                    [ relcb\strncpy.rel ]\r
 ..\..\..\lib\libcb.lib                    [ relcb\setjmpb.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\lseek.rel ]\r
-..\..\..\lib\libcb.lib                    [ relcb\closedir.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\utsname.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\close.rel ]\r
-..\..\..\lib\libcb.lib                    [ relcb\abort.rel ]\r
 ..\..\..\lib\libcb.lib                    [ relcb\strlen.rel ]\r
-..\..\..\lib\libsysb.lib                  [ relsysb\_exit.rel ]\r
 ..\..\..\lib\libcb.lib                    [ relcb\strcmp.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\CVSWITCH.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\LEAVEDIRECT.rel ]\r
-..\..\..\lib\libcb.lib                    [ relcb\readdir.rel ]\r
-..\..\..\lib\libsysb.lib                  [ relsysb\pause.rel ]\r
 ..\..\..\lib\libcb.lib                    [ relcb\isatty.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\umask.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\fstat.rel ]\r
 ..\..\..\lib\libcb.lib                    [ relcb\free.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\ENTPARMDIRECT.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\BANKCALLDIRECT.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\strcpy.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SSSWITCH.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\geteuid.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SVSWITCH.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SSWITCHEND.rel ]\r
-..\..\..\lib\libsysb.lib                  [ relsysb\kill.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\ENTAUTODIRECT.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\VSWITCHEND.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\LINCASG.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\pipe.rel ]\r
-..\..\..\lib\libcb.lib                    [ relcb\opendir.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SSCMP.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\USDIVASG.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\LINC.rel ]\r
@@ -265,15 +267,24 @@ Libraries Linked                          [ object file ]
 ..\..\..\lib\libsysb.lib                  [ relsysb\dup2.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\stat.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\getpid.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\getcwd.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SSRSH.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\BANKLEAVE32.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\signal.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\memcmp.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SDIVMOD.rel ]\r
+..\..\..\lib\libsysb.lib                  [ relsysb\getfsys.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\LENDASG.rel ]\r
 ..\..\..\lib\libcb.lib                    [ relcb\malloc.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\memcpy.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\strcat.rel ]\r
 ..\..\..\lib\libsysb.lib                  [ relsysb\sys1b.rel ]\r
-..\..\..\lib\libcb.lib                    [ relcb\calloc.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\closedir.rel ]\r
+..\..\..\lib\libsysb.lib                  [ relsysb\_exit.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\readdir.rel ]\r
 ..\..\..\lib\libiar.lib                   [ reliar\SFINDSIGN.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\opendir.rel ]\r
+..\..\..\lib\libcb.lib                    [ relcb\calloc.rel ]\r
 ..\..\..\lib\libcb.lib                    [ relcb\memset.rel ]\r
 \r
 \r
index 917f65f..f2bbbdc 100644 (file)
@@ -34,6 +34,24 @@ del sh6.r01
 as-z80 -l -o sh6.s01\r
 @if errorlevel 1 goto failure\r
 \r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ opendir\r
+@if errorlevel 1 goto failure\r
+del opendir.r01\r
+as-z80 -l -o opendir.s01\r
+@if errorlevel 1 goto failure\r
+\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ closedir\r
+@if errorlevel 1 goto failure\r
+del closedir.r01\r
+as-z80 -l -o closedir.s01\r
+@if errorlevel 1 goto failure\r
+\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ readdir\r
+@if errorlevel 1 goto failure\r
+del readdir.r01\r
+as-z80 -l -o readdir.s01\r
+@if errorlevel 1 goto failure\r
+\r
 link-z80 -f msh\r
 @if errorlevel 1 goto failure\r
 ihex2bin -l msh.i86 ..\..\..\bin\banked\msh\r
diff --git a/src/sh/msh/opendir.c b/src/sh/msh/opendir.c
new file mode 100644 (file)
index 0000000..4ee4de4
--- /dev/null
@@ -0,0 +1,44 @@
+/* opendir.c   opendir implementation\r
+ *\r
+ */\r
+#include <unistd.h>\r
+#include <alloc.h>\r
+#include <dirent.h>\r
+#include <sys/stat.h>\r
+#include <errno.h>\r
+#include <fcntl.h>\r
+#include <string.h>\r
+\r
+/* take some extra arguments, since msh doesn't like sharing its heap */\r
+\r
+DIR *nick_opendir(char *path, DIR *dir, struct dirent *dd_buf)\r
+{\r
+       struct stat statbuf;\r
+\r
+       if (stat(path, &statbuf) != 0)\r
+               goto Err;\r
+       if ((statbuf.st_mode & S_IFDIR) == 0) {\r
+               errno = ENOTDIR;\r
+               goto Err;\r
+       }\r
+#if 1\r
+       dir->dd_buf = dd_buf;\r
+#else\r
+       if ((dir = (DIR *)calloc(1,sizeof(DIR))) == NULL) {\r
+               errno = ENOMEM;\r
+               goto Err;\r
+       }\r
+       if ((dir->dd_buf = calloc(1,sizeof(struct dirent))) == NULL) {\r
+               free(dir);\r
+               errno = ENOMEM;\r
+               goto Err;\r
+       }\r
+#endif\r
+       if ((dir->dd_fd = open(path, O_BINARY)) < 0) {\r
+               free(dir->dd_buf);\r
+               free(dir);\r
+Err:           return NULL;\r
+       }\r
+       return dir;\r
+}\r
+\r
diff --git a/src/sh/msh/opendir.rel b/src/sh/msh/opendir.rel
new file mode 100644 (file)
index 0000000..4e22ad9
--- /dev/null
@@ -0,0 +1,77 @@
+XL4\r
+H 2 areas A global symbols\r
+M opendir\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
+S free Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S errno Ref00000000\r
+S ?ENT_AUTO_DIRECT_L09 Ref00000000\r
+S open Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S stat Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size 95 flags 0\r
+S nick_opendir Def00000000\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 CD 00 00 00 00 E2 FF 21 00 00 39\r
+R 00 00 01 00 02 05 04 00\r
+T 09 00 00 00 4D 44 DD 5E 02 DD 56 03 3E\r
+R 00 00 01 00\r
+T 12 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 07 00 02 09 07 00\r
+T 17 00 00 00 00 00 00 00 7D B4 28 02\r
+R 00 00 01 00 02 04 02 00\r
+T 1D 00 00 00\r
+R 00 00 01 00\r
+T 1D 00 00 00 18 68\r
+R 00 00 01 00\r
+T 1F 00 00 00\r
+R 00 00 01 00\r
+T 1F 00 00 00 DD 7E E6 E6 00 47 DD 7E E7 E6 40\r
+R 00 00 01 00\r
+T 2A 00 00 00 B0 20 08\r
+R 00 00 01 00\r
+T 2D 00 00 00\r
+R 00 00 01 00\r
+T 2D 00 00 00 21 14 00 22 00 00 00 00 18 52\r
+R 00 00 01 00 02 08 03 00\r
+T 35 00 00 00\r
+R 00 00 01 00\r
+T 35 00 00 00 21 06 00 DD 4E 04 DD 46 05 09 DD\r
+R 00 00 01 00\r
+T 40 00 00 00 5E 0A DD 56 0B 73 23 72 21 00 80\r
+R 00 00 01 00\r
+T 4B 00 00 00 E5 DD 6E 02 DD 66 03 E5 3E\r
+R 00 00 01 00\r
+T 54 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 05 00 02 09 05 00\r
+T 59 00 00 00 00 00 00 00 F1 F1 E5 69 60 C1 71\r
+R 00 00 01 00 02 04 02 00\r
+T 62 00 00 00 23 70 CB 78 28 24\r
+R 00 00 01 00\r
+T 68 00 00 00\r
+R 00 00 01 00\r
+T 68 00 00 00 21 06 00 DD 4E 04 DD 46 05 09 5E\r
+R 00 00 01 00\r
+T 73 00 00 00 23 56 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 01 00\r
+T 78 00 00 00 00 00 00 00 CD 00 00 00 00 59 50\r
+R 00 00 01 00 02 04 01 00 02 09 02 00\r
+T 7F 00 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 01 00 02 0A 01 00\r
+T 85 00 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 02 00\r
+T 87 00 00 00\r
+R 00 00 01 00\r
+T 87 00 00 00 21 00 00 18 06\r
+R 00 00 01 00\r
+T 8C 00 00 00\r
+R 00 00 01 00\r
+T 8C 00 00 00 DD 6E 04 DD 66 05\r
+R 00 00 01 00\r
+T 92 00 00 00\r
+R 00 00 01 00\r
+T 92 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 00 00\r
diff --git a/src/sh/msh/readdir.c b/src/sh/msh/readdir.c
new file mode 100644 (file)
index 0000000..e2ff879
--- /dev/null
@@ -0,0 +1,33 @@
+/* readdir.c   readdir implementation\r
+ *\r
+ */\r
+#include <unistd.h>\r
+#include <alloc.h>\r
+#include <dirent.h>\r
+#include <sys/stat.h>\r
+#include <errno.h>\r
+#include <fcntl.h>\r
+#include <string.h>\r
+\r
+struct dirent *nick_readdir(DIR *dir)\r
+{\r
+       direct_t direntry;\r
+       register struct dirent *buf;\r
+\r
+       if (dir == NULL || dir->dd_buf == NULL || dir->dd_fd == 0) {\r
+               errno = EFAULT;\r
+Err:           return NULL;\r
+       }\r
+       direntry.d_name[0] = 0;\r
+       while (direntry.d_name[0] == 0)\r
+               if (read(dir->dd_fd, &direntry, sizeof(direntry)) != sizeof(direntry))\r
+                       goto Err;\r
+       buf = dir->dd_buf;\r
+       buf->d_ino = direntry.d_ino;\r
+       buf->d_off = dir->dd_loc++;\r
+       strncpy(buf->d_name, (char *)direntry.d_name, DIRNAMELEN);\r
+       buf->d_name[DIRNAMELEN] = 0;\r
+       buf->d_reclen = strlen(buf->d_name);\r
+       return buf;\r
+}\r
+\r
diff --git a/src/sh/msh/readdir.rel b/src/sh/msh/readdir.rel
new file mode 100644 (file)
index 0000000..c771532
--- /dev/null
@@ -0,0 +1,95 @@
+XL4\r
+H 2 areas A global symbols\r
+M readdir\r
+S strncpy Ref00000000\r
+S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
+S strlen Ref00000000\r
+S ?BANK_CALL_DIRECT_L08 Ref00000000\r
+S errno Ref00000000\r
+S ?ENT_AUTO_DIRECT_L09 Ref00000000\r
+S ?CL64180B_4_06_L00 Ref00000000\r
+S _read Ref00000000\r
+S .__.ABS. Def00000000\r
+A _DEFAULT size 0 flags 0\r
+A CODE size E3 flags 0\r
+S nick_readdir Def00000000\r
+T 00 00 00 00\r
+R 00 00 01 00\r
+T 00 00 00 00 CD 00 00 00 00 EE FF DD 7E 02 DD\r
+R 00 00 01 00 02 05 05 00\r
+T 09 00 00 00 B6 03 28 1A 21 06 00 DD 4E 02 DD\r
+R 00 00 01 00\r
+T 14 00 00 00 46 03 09 7E 23 B6 28 0B DD 6E 02\r
+R 00 00 01 00\r
+T 1F 00 00 00 DD 66 03 7E 23 B6 20 0C\r
+R 00 00 01 00\r
+T 27 00 00 00\r
+R 00 00 01 00\r
+T 27 00 00 00\r
+R 00 00 01 00\r
+T 27 00 00 00\r
+R 00 00 01 00\r
+T 27 00 00 00 21 0E 00 22 00 00 00 00\r
+R 00 00 01 00 02 08 04 00\r
+T 2D 00 00 00\r
+R 00 00 01 00\r
+T 2D 00 00 00 21 00 00 C3 E0 00 00 00\r
+R 00 00 01 00 00 08 01 00\r
+T 33 00 00 00\r
+R 00 00 01 00\r
+T 33 00 00 00 DD 36 F0 00\r
+R 00 00 01 00\r
+T 37 00 00 00\r
+R 00 00 01 00\r
+T 37 00 00 00 DD 7E F0 B7 20 26\r
+R 00 00 01 00\r
+T 3D 00 00 00\r
+R 00 00 01 00\r
+T 3D 00 00 00 21 10 00 E5 21 02 00 39 4D 44 DD\r
+R 00 00 01 00\r
+T 48 00 00 00 6E 02 DD 66 03 5E 23 56 3E\r
+R 00 00 01 00\r
+T 51 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 07 00 02 09 07 00\r
+T 56 00 00 00 00 00 00 00 F1 3E 10 AD B4 28 02\r
+R 00 00 01 00 02 04 03 00\r
+T 5F 00 00 00\r
+R 00 00 01 00\r
+T 5F 00 00 00 18 CC\r
+R 00 00 01 00\r
+T 61 00 00 00\r
+R 00 00 01 00\r
+T 61 00 00 00 18 D4\r
+R 00 00 01 00\r
+T 63 00 00 00\r
+R 00 00 01 00\r
+T 63 00 00 00 21 06 00 DD 4E 02 DD 46 03 09 56\r
+R 00 00 01 00\r
+T 6E 00 00 00 23 66 6A DD 75 FE DD 74 FF DD 5E\r
+R 00 00 01 00\r
+T 79 00 00 00 EE DD 56 EF 73 23 72 DD 6E FE DD\r
+R 00 00 01 00\r
+T 84 00 00 00 66 FF 23 23 E5 69 60 23 23 4E 23\r
+R 00 00 01 00\r
+T 8F 00 00 00 46 03 70 2B 71 0B E1 71 23 70 21\r
+R 00 00 01 00\r
+T 9A 00 00 00 0E 00 E5 21 02 00 39 01 02 00 09\r
+R 00 00 01 00\r
+T A5 00 00 00 4D 44 21 06 00 DD 5E FE DD 56 FF\r
+R 00 00 01 00\r
+T B0 00 00 00 19 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 00 00\r
+T B5 00 00 00 00 00 00 00 CD 00 00 00 00 F1 21\r
+R 00 00 01 00 02 04 00 00 02 09 03 00\r
+T BC 00 00 00 14 00 DD 4E FE DD 46 FF 09 36 00\r
+R 00 00 01 00\r
+T C7 00 00 00 21 04 00 09 E5 21 06 00 09 EB 3E\r
+R 00 00 01 00\r
+T D2 00 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 02 00 02 09 02 00\r
+T D7 00 00 00 00 00 00 00 EB E1 73 23 72 69 60\r
+R 00 00 01 00 02 04 03 00\r
+T E0 00 00 00\r
+R 00 00 01 00\r
+T E0 00 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 01 00\r
index c4cf37e..3d51275 100644 (file)
@@ -2,6 +2,7 @@
 #include <string.h>\r
 #include <unistd.h>\r
 #include <fcntl.h>\r
+#include <dirent.h> /* Nick, for nick_opendir() prototype definition */\r
 \r
 /* Need a way to have void used for ANSI, nothing for K&R. */\r
 #ifndef _ANSI\r
@@ -349,6 +350,9 @@ _PROTOTYPE(int readc , (void));
 _PROTOTYPE(void unget , (int c ));\r
 _PROTOTYPE(void ioecho , (char c )); /* Nick, formerly int c */\r
 _PROTOTYPE(void prs , (char *s ));\r
+#if 1 /* Nick */\r
+_PROTOTYPE(void prs_expand , (char *p ));\r
+#endif\r
 _PROTOTYPE(void sh_putc , (char c )); /* Nick, formerly int c */\r
 _PROTOTYPE(void prn , (unsigned u ));\r
 _PROTOTYPE(void closef , (int i ));\r
@@ -398,3 +402,12 @@ Extern     int     areanum;        /* current allocation area */
 \r
 #define        NEW(type) (type *)getcell(sizeof(type))\r
 #define        DELETE(obj)     freecell((char *)obj)\r
+\r
+/* modifications by Nick for compatibility with uzi libc library */\r
+\r
+DIR *nick_opendir(char *path, DIR *dir, struct dirent *dd_buf);\r
+int nick_closedir(DIR *dir);\r
+struct dirent *nick_readdir(DIR *dir);\r
+\r
+/* end of modifications by Nick */\r
+\r
index 51299f8..6f92012 100644 (file)
@@ -181,7 +181,11 @@ register char **argv;
 \r
        for (;;) {\r
                if (talking && env.iop <= iostack)\r
+#if 1 /* Nick */\r
+                       prs_expand(prompt->value);\r
+#else\r
                        prs(prompt->value);\r
+#endif\r
                onecommand();\r
        }\r
 }\r
@@ -848,7 +852,14 @@ unsigned nbytes;
        register i;\r
 \r
        if (nbytes == 0)\r
+ {\r
+#if 1 /* Nick */\r
+ prs("fatal: getcell() nbytes == 0\n");\r
+ exit(1);\r
+#else\r
                abort();        /* silly and defeats the algorithm */\r
+#endif\r
+ }\r
        /*\r
         * round upwards and add administration area\r
         */\r
@@ -876,7 +887,18 @@ unsigned nbytes;
                return((char *)NULL);\r
        p--;\r
        if (p != areatop)\r
+ {\r
+#if 1 /* Nick */\r
+ prs("fatal: getcell() p != areatop (");\r
+ prn((int)p);\r
+ prs(", ");\r
+ prn((int)areatop);\r
+ prs(")\n");\r
+ exit(1);\r
+#else\r
                abort();        /* allocated areas are contiguous */\r
+#endif\r
+ }\r
        q = p + i;\r
        p->next = q;\r
        p->area = FREE;\r
@@ -893,7 +915,18 @@ found:
                 * split into requested area and rest\r
                 */\r
                if (areanxt+1 > q)\r
+ {\r
+#if 1 /* Nick */\r
+ prs("fatal: getcell() areanxt+1 > q (");\r
+ prn((int)areanxt+1);\r
+ prs(", ");\r
+ prn((int)q);\r
+ prs(")\n");\r
+ exit(1);\r
+#else\r
                        abort();        /* insufficient space left for admin */\r
+#endif\r
+ }\r
                areanxt->next = q;\r
                areanxt->area = FREE;\r
                p->next = areanxt;\r
index 27e197a..e9a03bc 100644 (file)
@@ -1,5 +1,5 @@
 XL4\r
-H 6 areas 78 global symbols\r
+H 6 areas 79 global symbols\r
 M sh1\r
 S failpt Ref00000000\r
 S environ Ref00000000\r
@@ -14,6 +14,7 @@ S _write Ref00000000
 S ?S_MUL_L02 Ref00000000\r
 S yyparse Ref00000000\r
 S closeall Ref00000000\r
+S prn Ref00000000\r
 S setjmp Ref00000000\r
 S multiline Ref00000000\r
 S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
@@ -26,7 +27,6 @@ S wdlist Ref00000000
 S strlen Ref00000000\r
 S shell Ref00000000\r
 S pushio Ref00000000\r
-S abort Ref00000000\r
 S ?C_V_SWITCH_L06 Ref00000000\r
 S strcmp Ref00000000\r
 S exstat Ref00000000\r
@@ -55,6 +55,7 @@ S sbrk Ref00000000
 S open Ref00000000\r
 S ?US_MOD_L02 Ref00000000\r
 S execute Ref00000000\r
+S prs_expand Ref00000000\r
 S dolv Ref00000000\r
 S ?CL64180B_4_06_L00 Ref00000000\r
 S trap Ref00000000\r
@@ -69,14 +70,14 @@ S signal Ref00000000
 S filechar Ref00000000\r
 S .__.ABS. Def00000000\r
 A _DEFAULT size 0 flags 0\r
-A CODE size 1B00 flags 0\r
-S freecell Def00001988\r
+A CODE size 1B8C flags 0\r
+S freecell Def00001A14\r
 S sig Def00000D71\r
 S assign Def00001272\r
 S putn Def00000AE0\r
 S strsave Def00000CEA\r
 S any Def00000AAA\r
-S garbage Def00001A73\r
+S garbage Def00001AFF\r
 S err Def00000950\r
 S putvlist Def0000138F\r
 S space Def00000CB9\r
@@ -89,7 +90,7 @@ S letter Def00000C14
 S digit Def00000C65\r
 S newenv Def000009A2\r
 S letnum Def00000C8D\r
-S getarea Def00001A63\r
+S getarea Def00001AEF\r
 S xfree Def00000D63\r
 S onintr Def00000BBA\r
 S lookup Def00000DEB\r
@@ -100,7 +101,7 @@ S onecommand Def0000075D
 S isassign Def0000121B\r
 S export Def000011E3\r
 S nameval Def00001012\r
-S setarea Def00001A36\r
+S setarea Def00001AC2\r
 S main Def00000000\r
 S sh_itoa Def00000AF1\r
 S newfile Def000006E0\r
@@ -109,10 +110,10 @@ S ronly Def000011F1
 S gmatch Def00001510\r
 S eqname Def00001484\r
 S warn Def00000911\r
-S freearea Def000019D5\r
+S freearea Def00001A61\r
 S anys Def00000A6D\r
 S next Def00000B9C\r
-A CSTR size 8C flags 0\r
+A CSTR size F1 flags 0\r
 A UDATA0 size 3F flags 0\r
 S flags Def00000004\r
 S inparse Def00000002\r
@@ -186,7 +187,7 @@ R 00 00 01 00 02 04 28 00 00 09 02 00
 T 91 00 00 00 EB 0D 00 00 21 EB 0D 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T 96 00 00 00 00 00 00 00 22 00 00 00 00 46 23\r
-R 00 00 01 00 02 04 24 00 02 09 17 00\r
+R 00 00 01 00 02 04 24 00 02 09 18 00\r
 T 9D 00 00 00 66 68 ED 4B 04 00 00 00 A7 ED 42\r
 R 00 00 01 00 00 08 04 00\r
 T A6 00 00 00 20 0F\r
@@ -194,7 +195,7 @@ R 00 00 01 00
 T A8 00 00 00\r
 R 00 00 01 00\r
 T A8 00 00 00 01 14 00 00 00 ED 5B 00 00 00 00\r
-R 00 00 01 00 00 05 04 00 02 0B 17 00\r
+R 00 00 01 00 00 05 04 00 02 0B 18 00\r
 T AF 00 00 00 3E FF 0F 00 00 21 FF 0F 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T B5 00 00 00 00 00 00 00\r
@@ -202,7 +203,7 @@ R 00 00 01 00 02 04 24 00
 T B7 00 00 00\r
 R 00 00 01 00\r
 T B7 00 00 00 ED 5B 00 00 00 00 3E E3 11 00 00\r
-R 00 00 01 00 02 06 17 00 29 0B 01 00\r
+R 00 00 01 00 02 06 18 00 29 0B 01 00\r
 T BD 00 00 00 21 E3 11 00 00 CD 00 00 00 00 11\r
 R 00 00 01 00 00 05 01 00 02 0A 24 00\r
 T C4 00 00 00 07 00 00 00 3E EB 0D 00 00 21\r
@@ -228,9 +229,9 @@ R 00 00 01 00 02 06 27 00 29 0B 01 00
 T F3 00 00 00 21 E3 11 00 00 CD 00 00 00 00 01\r
 R 00 00 01 00 00 05 01 00 02 0A 24 00\r
 T FA 00 00 00 05 00 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 3F 00\r
+R 00 00 01 00 2B 07 40 00\r
 T FF 00 00 00 00 00 00 00 CD 00 00 00 00 EB 3E\r
-R 00 00 01 00 02 04 3F 00 02 09 24 00\r
+R 00 00 01 00 02 04 40 00 02 09 24 00\r
 T 06 01 00 00 F1 0A 00 00 21 F1 0A 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T 0B 01 00 00 00 00 00 00 4D 44 11 0E 00 00 00\r
@@ -334,9 +335,9 @@ R 00 00 01 00 02 04 24 00
 T FE 01 00 00\r
 R 00 00 01 00\r
 T FE 01 00 00 DD 36 FC 00 00 00 00 DD 36 FD\r
-R 00 00 01 00 0B 07 41 00\r
+R 00 00 01 00 0B 07 42 00\r
 T 05 02 00 00 00 00 00 00 DD 36 FE 00 00 00 00\r
-R 00 00 01 00 8B 04 41 00 2B 0B 41 00\r
+R 00 00 01 00 8B 04 42 00 2B 0B 42 00\r
 T 0A 02 00 00 AF DD 77 F6 DD 77 F7 DD 6E 04 DD\r
 R 00 00 01 00\r
 T 15 02 00 00 66 05 4D 44 03 03 DD 71 04 DD 70\r
@@ -418,15 +419,15 @@ R 00 00 01 00
 T FB 02 00 00 DD 74 05 46 23 66 68 22\r
 R 00 00 01 00\r
 T 03 03 00 00 00 00 00 00 DD 36 FC 00 00 00 00\r
-R 00 00 01 00 02 04 2E 00 0B 0B 3A 00\r
+R 00 00 01 00 02 04 2E 00 0B 0B 3B 00\r
 T 09 03 00 00 DD 36 FD 00 00 00 00 DD 36 FE\r
-R 00 00 01 00 8B 07 3A 00\r
+R 00 00 01 00 8B 07 3B 00\r
 T 10 03 00 00 00 00 00 00 0E 00 00 00 00 C5 21\r
-R 00 00 01 00 2B 04 3A 00 2B 09 3A 00\r
+R 00 00 01 00 2B 04 3B 00 2B 09 3B 00\r
 T 15 03 00 00 00 00 00 00 E5 11 00 00 00 00 3E\r
-R 00 00 01 00 02 04 3A 00 02 0A 2E 00\r
+R 00 00 01 00 02 04 3B 00 02 0A 2E 00\r
 T 1C 03 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 18 00 02 09 18 00\r
+R 00 00 01 00 2B 04 19 00 02 09 19 00\r
 T 21 03 00 00 00 00 00 00 E1 E1\r
 R 00 00 01 00 02 04 24 00\r
 T 25 03 00 00\r
@@ -506,7 +507,7 @@ R 00 00 01 00
 T AF 03 00 00\r
 R 00 00 01 00\r
 T AF 03 00 00 0E 00 00 00 00 11 00 00 00 00 DD\r
-R 00 00 01 00 2B 05 41 00 02 0A 41 00\r
+R 00 00 01 00 2B 05 42 00 02 0A 42 00\r
 T B5 03 00 00 7E FE DD 6E FC DD 66 FD B9 20 7F\r
 R 00 00 01 00\r
 T C0 03 00 00 ED 52 20 7B DD 4E 02 DD 46 03 0B\r
@@ -548,9 +549,9 @@ R 00 00 01 00 02 04 24 00
 T 34 04 00 00\r
 R 00 00 01 00\r
 T 34 04 00 00 11 01 00 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 08 3B 00\r
+R 00 00 01 00 2B 08 3C 00\r
 T 3A 04 00 00 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 04 3B 00 02 09 24 00\r
+R 00 00 01 00 02 04 3C 00 02 09 24 00\r
 T 3F 04 00 00\r
 R 00 00 01 00\r
 T 3F 04 00 00\r
@@ -570,9 +571,9 @@ R 00 00 01 00 02 08 2E 00
 T 5B 04 00 00 E5 DD 6E FC DD 66 FD E5 11\r
 R 00 00 01 00\r
 T 64 04 00 00 00 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 02 04 2E 00 2B 09 18 00\r
+R 00 00 01 00 02 04 2E 00 2B 09 19 00\r
 T 69 04 00 00 00 00 00 00 CD 00 00 00 00 E1 E1\r
-R 00 00 01 00 02 04 18 00 02 09 24 00\r
+R 00 00 01 00 02 04 19 00 02 09 24 00\r
 T 70 04 00 00 11 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 2B 08 1F 00\r
 T 76 04 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
@@ -600,7 +601,7 @@ R 00 00 01 00 00 05 04 00 00 0B 04 00
 T A4 04 00 00 06 00 C5 E5 11 03 00 3E\r
 R 00 00 01 00\r
 T AC 04 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 40 00 02 09 40 00\r
+R 00 00 01 00 2B 04 41 00 02 09 41 00\r
 T B1 04 00 00 00 00 00 00 F1 F1 DD 7E F8 DD B6\r
 R 00 00 01 00 02 04 24 00\r
 T BA 04 00 00 F9 28 78 DD 6E F8 DD 66 F9 7E FE\r
@@ -626,9 +627,9 @@ R 00 00 01 00
 T EB 04 00 00\r
 R 00 00 01 00\r
 T EB 04 00 00 DD 5E F2 DD 56 F3 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 12 00\r
+R 00 00 01 00 2B 0B 13 00\r
 T F3 04 00 00 21 00 00 00 00 CD 00 00 00 00 EB\r
-R 00 00 01 00 02 05 12 00 02 0A 24 00\r
+R 00 00 01 00 02 05 13 00 02 0A 24 00\r
 T FA 04 00 00 3E 9C 0B 00 00 21 9C 0B 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 00 05 00 00 00 00 00 00\r
@@ -646,9 +647,9 @@ R 00 00 01 00
 T 1E 05 00 00\r
 R 00 00 01 00\r
 T 1E 05 00 00 DD 5E F2 DD 56 F3 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 12 00\r
+R 00 00 01 00 2B 0B 13 00\r
 T 26 05 00 00 21 00 00 00 00 CD 00 00 00 00 EB\r
-R 00 00 01 00 02 05 12 00 02 0A 24 00\r
+R 00 00 01 00 02 05 13 00 02 0A 24 00\r
 T 2D 05 00 00 3E 9C 0B 00 00 21 9C 0B 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 33 05 00 00 00 00 00 00\r
@@ -666,7 +667,7 @@ R 00 00 01 00 00 07 01 00
 T 42 05 00 00 71 0D 00 00 C5 E5 11 0C 00 3E\r
 R 00 00 01 00 29 04 01 00\r
 T 49 05 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 40 00 02 09 40 00\r
+R 00 00 01 00 2B 04 41 00 02 09 41 00\r
 T 4E 05 00 00 00 00 00 00 F1 F1\r
 R 00 00 01 00 02 04 24 00\r
 T 52 05 00 00\r
@@ -674,7 +675,7 @@ R 00 00 01 00
 T 52 05 00 00 21 00 00 E5 21 01 00 E5 11 02 00\r
 R 00 00 01 00\r
 T 5D 05 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 40 00 02 0A 40 00\r
+R 00 00 01 00 2B 05 41 00 02 0A 41 00\r
 T 63 05 00 00 00 00 00 00 F1 F1 3E 01 AD B4 B1\r
 R 00 00 01 00 02 04 24 00\r
 T 6C 05 00 00 B0 28 16\r
@@ -686,13 +687,13 @@ R 00 00 01 00 00 07 01 00
 T 75 05 00 00 BA 0B 00 00 C5 E5 11 02 00 3E\r
 R 00 00 01 00 29 04 01 00\r
 T 7C 05 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 40 00 02 09 40 00\r
+R 00 00 01 00 2B 04 41 00 02 09 41 00\r
 T 81 05 00 00 00 00 00 00 F1 F1\r
 R 00 00 01 00 02 04 24 00\r
 T 85 05 00 00\r
 R 00 00 01 00\r
 T 85 05 00 00 DD 6E 04 DD 66 05 22 00 00 00 00\r
-R 00 00 01 00 02 0B 36 00\r
+R 00 00 01 00 02 0B 37 00\r
 T 8E 05 00 00 DD 4E 02 DD 46 03 ED 43\r
 R 00 00 01 00\r
 T 96 05 00 00 00 00 00 00 DD 5E F8 DD 56 F9 73\r
@@ -788,7 +789,7 @@ R 00 00 01 00
 T 65 06 00 00 2A 00 00 00 00 5E 23 56 3E\r
 R 00 00 01 00 02 05 21 00\r
 T 6C 06 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 13 00 02 09 13 00\r
+R 00 00 01 00 2B 04 36 00 02 09 36 00\r
 T 71 06 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 24 00\r
 T 73 06 00 00\r
@@ -836,7 +837,7 @@ R 00 00 01 00 02 04 24 00 29 0A 01 00
 T D8 06 00 00 FF 0F 00 00 CD 00 00 00 00 C3\r
 R 00 00 01 00 00 04 01 00 02 09 24 00\r
 T DE 06 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0F 00\r
+R 00 00 01 00 02 04 10 00\r
 T E0 06 00 00\r
 R 00 00 01 00\r
 T E0 06 00 00 CD 00 00 00 00 FE FF 01\r
@@ -860,9 +861,9 @@ R 00 00 01 00
 T 19 07 00 00\r
 R 00 00 01 00\r
 T 19 07 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 13 00\r
+R 00 00 01 00 2B 0B 14 00\r
 T 21 07 00 00 21 00 00 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 02 05 13 00 02 0A 24 00\r
+R 00 00 01 00 02 05 14 00 02 0A 24 00\r
 T 28 07 00 00 48 00 00 00 3E 50 09 00 00 21\r
 R 00 00 01 00 00 04 02 00 29 09 01 00\r
 T 2D 07 00 00 50 09 00 00 CD 00 00 00 00 21\r
@@ -880,9 +881,9 @@ R 00 00 01 00
 T 40 07 00 00\r
 R 00 00 01 00\r
 T 40 07 00 00 DD 5E FE DD 56 FF 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 12 00\r
+R 00 00 01 00 2B 0B 13 00\r
 T 48 07 00 00 21 00 00 00 00 CD 00 00 00 00 EB\r
-R 00 00 01 00 02 05 12 00 02 0A 24 00\r
+R 00 00 01 00 02 05 13 00 02 0A 24 00\r
 T 4F 07 00 00 3E 9C 0B 00 00 21 9C 0B 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 55 07 00 00 00 00 00 00 21 00 00\r
@@ -890,7 +891,7 @@ R 00 00 01 00 02 04 24 00
 T 5A 07 00 00\r
 R 00 00 01 00\r
 T 5A 07 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 5D 07 00 00\r
 R 00 00 01 00\r
 T 5D 07 00 00 CD 00 00 00 00 F2 FF\r
@@ -915,16 +916,16 @@ T 7B 07 00 00 00 00 00 00 21 00 00 00 00 CD
 R 00 00 01 00 2B 04 06 00 02 09 06 00\r
 T 80 07 00 00 00 00 00 00 ED 5B 00 00 00 00 3E\r
 R 00 00 01 00 02 04 24 00 02 0A 28 00\r
-T 87 07 00 00 D5 19 00 00 21 D5 19 00 00 CD\r
+T 87 07 00 00 61 1A 00 00 21 61 1A 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
-T 8C 07 00 00 00 00 00 00 3E 73 1A 00 00 21\r
+T 8C 07 00 00 00 00 00 00 3E FF 1A 00 00 21\r
 R 00 00 01 00 02 04 24 00 29 09 01 00\r
-T 91 07 00 00 73 1A 00 00 CD 00 00 00 00 21\r
+T 91 07 00 00 FF 1A 00 00 CD 00 00 00 00 21\r
 R 00 00 01 00 00 04 01 00 02 09 24 00\r
 T 97 07 00 00 00 00 22 00 00 00 00 21 00 00 22\r
-R 00 00 01 00 02 07 15 00\r
+R 00 00 01 00 02 07 16 00\r
 T A0 07 00 00 00 00 00 00 21 00 00 22\r
-R 00 00 01 00 02 04 10 00\r
+R 00 00 01 00 02 04 11 00\r
 T A6 07 00 00 0E 00 00 00 21 00 00 00 00 22\r
 R 00 00 01 00 00 04 04 00 02 09 26 00\r
 T AC 07 00 00 08 00 00 00 21 00 00 22\r
@@ -932,7 +933,7 @@ R 00 00 01 00 00 04 04 00
 T B2 07 00 00 00 00 00 00 21 00 00 22\r
 R 00 00 01 00 02 04 1E 00\r
 T B8 07 00 00 00 00 00 00 21 01 00 22\r
-R 00 00 01 00 02 04 0E 00\r
+R 00 00 01 00 02 04 0F 00\r
 T BE 07 00 00 02 00 00 00 21 00 00 22\r
 R 00 00 01 00 00 04 03 00\r
 T C4 07 00 00 00 00 00 00 21 00 00 22\r
@@ -940,13 +941,13 @@ R 00 00 01 00 00 04 03 00
 T CA 07 00 00 00 00 00 00 21 02 00 39 22\r
 R 00 00 01 00 02 04 20 00\r
 T D1 07 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
-R 00 00 01 00 02 04 00 00 2B 0A 0D 00\r
+R 00 00 01 00 02 04 00 00 2B 0A 0E 00\r
 T D7 07 00 00 00 00 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 02 04 0D 00 02 09 24 00\r
+R 00 00 01 00 02 04 0E 00 02 09 24 00\r
 T DD 07 00 00 02 00 39 22 00 00 00 00 EB 3E\r
 R 00 00 01 00 02 08 00 00\r
 T E5 07 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0D 00 02 09 0D 00\r
+R 00 00 01 00 2B 04 0E 00 02 09 0E 00\r
 T EA 07 00 00 00 00 00 00 7D B4 20 13 3E\r
 R 00 00 01 00 02 04 24 00\r
 T F1 07 00 00 00 00 00 00 21 00 00 00 00 CD\r
@@ -974,7 +975,7 @@ R 00 00 01 00 02 04 24 00
 T 14 08 00 00\r
 R 00 00 01 00\r
 T 14 08 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 3E 00 02 0A 3E 00\r
+R 00 00 01 00 2B 05 3F 00 02 0A 3F 00\r
 T 1A 08 00 00 00 00 00 00 2A 00 00 00 00 7D B4\r
 R 00 00 01 00 02 04 24 00 02 09 29 00\r
 T 21 08 00 00 20 0F 2A 00 00 00 00 7D B4 28 08\r
@@ -1000,7 +1001,7 @@ R 00 00 01 00
 T 40 08 00 00 21 00 00 22 02 00 00 00 21 00 00\r
 R 00 00 01 00 00 08 03 00\r
 T 49 08 00 00 22 00 00 00 00 21 00 00 22\r
-R 00 00 01 00 02 05 3C 00\r
+R 00 00 01 00 02 05 3D 00\r
 T 50 08 00 00 00 00 00 00 21 00 00 22\r
 R 00 00 01 00 00 04 03 00\r
 T 56 08 00 00 00 00 00 00 21 6E 00 ED 4B\r
@@ -1054,13 +1055,13 @@ R 00 00 01 00
 T BA 08 00 00\r
 R 00 00 01 00\r
 T BA 08 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T BD 08 00 00\r
 R 00 00 01 00\r
 T BD 08 00 00 C5 D5 01 01 00 ED 5B 00 00 00 00\r
 R 00 00 01 00 02 0B 00 00\r
 T C6 08 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 39 00 02 0A 39 00\r
+R 00 00 01 00 2B 05 3A 00 02 0A 3A 00\r
 T CC 08 00 00 00 00 00 00 D1 C1 C3 00 00 00 00\r
 R 00 00 01 00 02 04 24 00 02 0B 07 00\r
 T D3 08 00 00\r
@@ -1076,7 +1077,7 @@ R 00 00 01 00 02 04 24 00
 T E3 08 00 00\r
 R 00 00 01 00\r
 T E3 08 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 3E 00 02 0A 3E 00\r
+R 00 00 01 00 2B 05 3F 00 02 0A 3F 00\r
 T E9 08 00 00 00 00 00 00 11 01 00 3E\r
 R 00 00 01 00 02 04 24 00\r
 T EF 08 00 00 00 00 00 00 21 00 00 00 00 CD\r
@@ -1088,7 +1089,7 @@ R 00 00 01 00 29 04 01 00 00 09 01 00
 T FF 08 00 00 00 00 00 00 ED 5B 00 00 00 00 3E\r
 R 00 00 01 00 02 04 24 00 02 0A 1C 00\r
 T 06 09 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 3B 00 02 09 3B 00\r
+R 00 00 01 00 2B 04 3C 00 02 09 3C 00\r
 T 0B 09 00 00 00 00 00 00 D1 C3 00 00 00 00\r
 R 00 00 01 00 02 04 24 00 02 0A 07 00\r
 T 11 09 00 00\r
@@ -1098,17 +1099,17 @@ R 00 00 01 00 02 05 23 00
 T 1A 09 00 00\r
 R 00 00 01 00\r
 T 1A 09 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 13 00\r
+R 00 00 01 00 2B 0B 14 00\r
 T 22 09 00 00 21 00 00 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 02 05 13 00 02 0A 24 00\r
+R 00 00 01 00 02 05 14 00 02 0A 24 00\r
 T 29 09 00 00 FF FF 22 00 00 00 00\r
 R 00 00 01 00 02 07 1C 00\r
 T 2E 09 00 00\r
 R 00 00 01 00\r
 T 2E 09 00 00 11 56 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 00 05 02 00 2B 0A 13 00\r
+R 00 00 01 00 00 05 02 00 2B 0A 14 00\r
 T 34 09 00 00 00 00 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 02 04 13 00 02 09 24 00\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
 T 3A 09 00 00 65 00 ED 4B 00 00 00 00 09 7E B7\r
 R 00 00 01 00 00 08 04 00\r
 T 43 09 00 00 28 08\r
@@ -1122,7 +1123,7 @@ R 00 00 01 00 02 04 24 00
 T 4D 09 00 00\r
 R 00 00 01 00\r
 T 4D 09 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 50 09 00 00\r
 R 00 00 01 00\r
 T 50 09 00 00 CD 00 00 00 00 3E 11 09 00 00 21\r
@@ -1156,7 +1157,7 @@ R 00 00 01 00
 T 7F 09 00 00 01 01 00 ED 5B 0E 00 00 00 3E\r
 R 00 00 01 00 00 09 04 00\r
 T 87 09 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 39 00 02 09 39 00\r
+R 00 00 01 00 2B 04 3A 00 02 09 3A 00\r
 T 8C 09 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 24 00\r
 T 8E 09 00 00\r
@@ -1170,7 +1171,7 @@ R 00 00 01 00 00 04 04 00 00 09 04 00
 T 9F 09 00 00\r
 R 00 00 01 00\r
 T 9F 09 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T A2 09 00 00\r
 R 00 00 01 00\r
 T A2 09 00 00 CD 00 00 00 00 FE FF DD 7E 02 DD\r
@@ -1222,7 +1223,7 @@ R 00 00 01 00 00 04 04 00
 T 0A 0A 00 00\r
 R 00 00 01 00\r
 T 0A 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 0D 0A 00 00\r
 R 00 00 01 00\r
 T 0D 0A 00 00 CD 00 00 00 00 FC FF 2A\r
@@ -1239,7 +1240,7 @@ T 28 0A 00 00 11 08 00 00 00 DD 6E FC DD 66 FD
 R 00 00 01 00 00 05 04 00\r
 T 31 0A 00 00 01 0C 00 ED B0 DD 5E FC DD 56 FD\r
 R 00 00 01 00\r
-T 3C 0A 00 00 3E 88 19 00 00 21 88 19 00 00 CD\r
+T 3C 0A 00 00 3E 14 1A 00 00 21 14 1A 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 42 0A 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 24 00\r
@@ -1254,9 +1255,9 @@ R 00 00 01 00 02 04 30 00
 T 5A 0A 00 00\r
 R 00 00 01 00\r
 T 5A 0A 00 00 DD 5E FE DD 56 FF 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 14 00\r
+R 00 00 01 00 2B 0B 15 00\r
 T 62 0A 00 00 21 00 00 00 00 CD 00 00 00 00 18\r
-R 00 00 01 00 02 05 14 00 02 0A 24 00\r
+R 00 00 01 00 02 05 15 00 02 0A 24 00\r
 T 69 0A 00 00 DA\r
 R 00 00 01 00\r
 T 6A 0A 00 00\r
@@ -1264,7 +1265,7 @@ R 00 00 01 00
 T 6A 0A 00 00\r
 R 00 00 01 00\r
 T 6A 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 6D 0A 00 00\r
 R 00 00 01 00\r
 T 6D 0A 00 00 CD 00 00 00 00\r
@@ -1300,7 +1301,7 @@ R 00 00 01 00
 T A7 0A 00 00\r
 R 00 00 01 00\r
 T A7 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T AA 0A 00 00\r
 R 00 00 01 00\r
 T AA 0A 00 00 CD 00 00 00 00\r
@@ -1334,7 +1335,7 @@ R 00 00 01 00
 T DD 0A 00 00\r
 R 00 00 01 00\r
 T DD 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T E0 0A 00 00\r
 R 00 00 01 00\r
 T E0 0A 00 00 CD 00 00 00 00 01 FF FF 3E\r
@@ -1342,7 +1343,7 @@ R 00 00 01 00 02 05 23 00
 T E7 0A 00 00 F1 0A 00 00 21 F1 0A 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T EC 0A 00 00 00 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 04 24 00 02 09 0F 00\r
+R 00 00 01 00 02 04 24 00 02 09 10 00\r
 T F1 0A 00 00\r
 R 00 00 01 00\r
 T F1 0A 00 00 CD 00 00 00 00 FC FF AF DD 77 FE\r
@@ -1402,19 +1403,19 @@ R 00 00 01 00
 T 93 0B 00 00\r
 R 00 00 01 00\r
 T 93 0B 00 00 DD 6E FC DD 66 FD C3 00 00 00 00\r
-R 00 00 01 00 02 0B 0F 00\r
+R 00 00 01 00 02 0B 10 00\r
 T 9C 0B 00 00\r
 R 00 00 01 00\r
 T 9C 0B 00 00 CD 00 00 00 00 ED 53 04 00 00 00\r
 R 00 00 01 00 02 05 23 00 02 0B 2E 00\r
 T A3 0B 00 00 0E 00 00 00 00 C5 21 00 00 00 00\r
-R 00 00 01 00 2B 05 41 00 02 0B 41 00\r
+R 00 00 01 00 2B 05 42 00 02 0B 42 00\r
 T A9 0B 00 00 E5 11 00 00 00 00 3E 00 00 00 00\r
-R 00 00 01 00 02 06 2E 00 2B 0B 18 00\r
+R 00 00 01 00 02 06 2E 00 2B 0B 19 00\r
 T AF 0B 00 00 21 00 00 00 00 CD 00 00 00 00 E1\r
-R 00 00 01 00 02 05 18 00 02 0A 24 00\r
+R 00 00 01 00 02 05 19 00 02 0A 24 00\r
 T B6 0B 00 00 E1 C3 00 00 00 00\r
-R 00 00 01 00 02 06 0F 00\r
+R 00 00 01 00 02 06 10 00\r
 T BA 0B 00 00\r
 R 00 00 01 00\r
 T BA 0B 00 00 CD 00 00 00 00 06 00 21\r
@@ -1422,9 +1423,9 @@ R 00 00 01 00 02 05 23 00
 T C0 0B 00 00 BA 0B 00 00 0E BA 0B 00 00 C5 E5\r
 R 00 00 01 00 00 04 01 00 29 09 01 00\r
 T C6 0B 00 00 11 02 00 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 08 40 00\r
+R 00 00 01 00 2B 08 41 00\r
 T CC 0B 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
-R 00 00 01 00 02 04 40 00 02 09 24 00\r
+R 00 00 01 00 02 04 41 00 02 09 24 00\r
 T D3 0B 00 00 21 01 00 22 00 00 00 00 2A\r
 R 00 00 01 00 00 08 03 00\r
 T DA 0B 00 00 00 00 00 00 7D B4 28 1C\r
@@ -1436,9 +1437,9 @@ R 00 00 01 00 00 05 03 00
 T E7 0B 00 00\r
 R 00 00 01 00\r
 T E7 0B 00 00 11 56 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 00 05 02 00 2B 0A 13 00\r
+R 00 00 01 00 00 05 02 00 2B 0A 14 00\r
 T ED 0B 00 00 00 00 00 00 CD 00 00 00 00 3E\r
-R 00 00 01 00 02 04 13 00 02 09 24 00\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
 T F3 0B 00 00 BD 08 00 00 21 BD 08 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T F8 0B 00 00 00 00 00 00\r
@@ -1464,7 +1465,7 @@ R 00 00 01 00
 T 11 0C 00 00\r
 R 00 00 01 00\r
 T 11 0C 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 14 0C 00 00\r
 R 00 00 01 00\r
 T 14 0C 00 00 CD 00 00 00 00 01 61 80 EB 3E 80\r
@@ -1494,7 +1495,7 @@ R 00 00 01 00
 T 62 0C 00 00\r
 R 00 00 01 00\r
 T 62 0C 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 65 0C 00 00\r
 R 00 00 01 00\r
 T 65 0C 00 00 CD 00 00 00 00 01 30 80 EB 3E 80\r
@@ -1512,7 +1513,7 @@ R 00 00 01 00
 T 8A 0C 00 00\r
 R 00 00 01 00\r
 T 8A 0C 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 8D 0C 00 00\r
 R 00 00 01 00\r
 T 8D 0C 00 00 CD 00 00 00 00 3E 14 0C 00 00 21\r
@@ -1534,7 +1535,7 @@ R 00 00 01 00
 T B6 0C 00 00\r
 R 00 00 01 00\r
 T B6 0C 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T B9 0C 00 00\r
 R 00 00 01 00\r
 T B9 0C 00 00 CD 00 00 00 00 FE FF DD 5E 02 DD\r
@@ -1554,15 +1555,15 @@ R 00 00 01 00 00 04 01 00 02 09 24 00
 T E1 0C 00 00\r
 R 00 00 01 00\r
 T E1 0C 00 00 DD 6E FE DD 66 FF C3 00 00 00 00\r
-R 00 00 01 00 02 0B 0F 00\r
+R 00 00 01 00 02 0B 10 00\r
 T EA 0C 00 00\r
 R 00 00 01 00\r
 T EA 0C 00 00 CD 00 00 00 00 FC FF DD 5E 02 DD\r
 R 00 00 01 00 02 05 2A 00\r
 T F3 0C 00 00 56 03 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 16 00\r
+R 00 00 01 00 2B 07 17 00\r
 T F8 0C 00 00 00 00 00 00 CD 00 00 00 00 EB 13\r
-R 00 00 01 00 02 04 16 00 02 09 24 00\r
+R 00 00 01 00 02 04 17 00 02 09 24 00\r
 T FF 0C 00 00 3E B9 0C 00 00 21 B9 0C 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 05 0D 00 00 00 00 00 00 DD 75 FC DD 74 FD 7D\r
@@ -1573,7 +1574,7 @@ T 11 0D 00 00
 R 00 00 01 00\r
 T 11 0D 00 00 DD 4E 04 DD 46 05 DD 5E FC DD 56\r
 R 00 00 01 00\r
-T 1C 0D 00 00 FD 3E 36 1A 00 00 21 36 1A 00 00\r
+T 1C 0D 00 00 FD 3E C2 1A 00 00 21 C2 1A 00 00\r
 R 00 00 01 00 29 06 01 00 00 0B 01 00\r
 T 22 0D 00 00 CD 00 00 00 00 DD 6E FC DD 66 FD\r
 R 00 00 01 00 02 05 24 00\r
@@ -1604,15 +1605,15 @@ R 00 00 01 00 00 05 02 00
 T 60 0D 00 00\r
 R 00 00 01 00\r
 T 60 0D 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 63 0D 00 00\r
 R 00 00 01 00\r
-T 63 0D 00 00 CD 00 00 00 00 3E 88 19 00 00 21\r
+T 63 0D 00 00 CD 00 00 00 00 3E 14 1A 00 00 21\r
 R 00 00 01 00 02 05 23 00 29 0A 01 00\r
-T 69 0D 00 00 88 19 00 00 CD 00 00 00 00 C3\r
+T 69 0D 00 00 14 1A 00 00 CD 00 00 00 00 C3\r
 R 00 00 01 00 00 04 01 00 02 09 24 00\r
 T 6F 0D 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0F 00\r
+R 00 00 01 00 02 04 10 00\r
 T 71 0D 00 00\r
 R 00 00 01 00\r
 T 71 0D 00 00 CD 00 00 00 00 ED 53 00 00 00 00\r
@@ -1622,17 +1623,17 @@ R 00 00 01 00 00 07 01 00
 T 7E 0D 00 00 71 0D 00 00 C5 E5 DD 5E 02 DD 56\r
 R 00 00 01 00 29 04 01 00\r
 T 86 0D 00 00 03 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 06 40 00 02 0B 40 00\r
+R 00 00 01 00 2B 06 41 00 02 0B 41 00\r
 T 8C 0D 00 00 CD 00 00 00 00 F1 F1 C3\r
 R 00 00 01 00 02 05 24 00\r
 T 92 0D 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 0F 00\r
+R 00 00 01 00 02 04 10 00\r
 T 94 0D 00 00\r
 R 00 00 01 00\r
 T 94 0D 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
 R 00 00 01 00 02 05 2A 00\r
 T 9D 0D 00 00 66 03 29 01 00 00 00 00 09 46 23\r
-R 00 00 01 00 02 08 38 00\r
+R 00 00 01 00 02 08 39 00\r
 T A6 0D 00 00 66 68 DD 75 FE DD 74 FF 7D B4 20\r
 R 00 00 01 00\r
 T B1 0D 00 00 02\r
@@ -1650,23 +1651,23 @@ R 00 00 01 00
 T BC 0D 00 00 DD 6E 02 DD 66 03 29 01\r
 R 00 00 01 00\r
 T C4 0D 00 00 00 00 00 00 09 AF 77 23 77\r
-R 00 00 01 00 02 04 38 00\r
+R 00 00 01 00 02 04 39 00\r
 T CB 0D 00 00\r
 R 00 00 01 00\r
 T CB 0D 00 00 DD 6E FE DD 66 FF 22 00 00 00 00\r
 R 00 00 01 00 02 0B 2E 00\r
 T D4 0D 00 00 0E 00 00 00 00 C5 21 00 00 00 00\r
-R 00 00 01 00 2B 05 3A 00 02 0B 3A 00\r
+R 00 00 01 00 2B 05 3B 00 02 0B 3B 00\r
 T DA 0D 00 00 E5 11 00 00 00 00 3E 00 00 00 00\r
-R 00 00 01 00 02 06 2E 00 2B 0B 11 00\r
+R 00 00 01 00 02 06 2E 00 2B 0B 12 00\r
 T E0 0D 00 00 21 00 00 00 00 CD 00 00 00 00 F1\r
-R 00 00 01 00 02 05 11 00 02 0A 24 00\r
+R 00 00 01 00 02 05 12 00 02 0A 24 00\r
 T E7 0D 00 00 F1\r
 R 00 00 01 00\r
 T E8 0D 00 00\r
 R 00 00 01 00\r
 T E8 0D 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T EB 0D 00 00\r
 R 00 00 01 00\r
 T EB 0D 00 00 CD 00 00 00 00 FA FF DD 6E 02 DD\r
@@ -1724,7 +1725,7 @@ R 00 00 01 00 02 07 22 00
 T 79 0E 00 00 00 00 00 00 38 0E 69 60 29 ED 4B\r
 R 00 00 01 00 02 04 30 00\r
 T 82 0E 00 00 00 00 00 00 09 46 23 66 68 18 03\r
-R 00 00 01 00 02 04 36 00\r
+R 00 00 01 00 02 04 37 00\r
 T 8B 0E 00 00\r
 R 00 00 01 00\r
 T 8B 0E 00 00 2A 04 00 00 00\r
@@ -1839,15 +1840,15 @@ T 97 0F 00 00 DD 6E FC DD 66 FD 23 DD 75 FC DD
 R 00 00 01 00\r
 T A2 0F 00 00 74 FD 36 00 01 00 00 DD 5E FA DD\r
 R 00 00 01 00\r
-T AD 0F 00 00 56 FB 3E 36 1A 00 00 21\r
+T AD 0F 00 00 56 FB 3E C2 1A 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T B2 0F 00 00 36 1A 00 00 CD 00 00 00 00 01\r
+T B2 0F 00 00 C2 1A 00 00 CD 00 00 00 00 01\r
 R 00 00 01 00 00 04 01 00 02 09 24 00\r
 T B8 0F 00 00 00 00 DD 6E FA DD 66 FB 23 23 5E\r
 R 00 00 01 00\r
-T C3 0F 00 00 23 56 3E 36 1A 00 00 21\r
+T C3 0F 00 00 23 56 3E C2 1A 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T C8 0F 00 00 36 1A 00 00 CD 00 00 00 00 2A\r
+T C8 0F 00 00 C2 1A 00 00 CD 00 00 00 00 2A\r
 R 00 00 01 00 00 04 01 00 02 09 24 00\r
 T CE 0F 00 00 04 00 00 00 E5 DD 6E FA DD 66 FB\r
 R 00 00 01 00 00 04 04 00\r
@@ -1862,7 +1863,7 @@ R 00 00 01 00 02 04 31 00
 T FC 0F 00 00\r
 R 00 00 01 00\r
 T FC 0F 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T FF 0F 00 00\r
 R 00 00 01 00\r
 T FF 0F 00 00 CD 00 00 00 00 21 00 00 E5 3E\r
@@ -1870,7 +1871,7 @@ R 00 00 01 00 02 05 23 00
 T 07 10 00 00 12 10 00 00 21 12 10 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T 0C 10 00 00 00 00 00 00 E1 C3 00 00 00 00\r
-R 00 00 01 00 02 04 24 00 02 0A 0F 00\r
+R 00 00 01 00 02 04 24 00 02 0A 10 00\r
 T 12 10 00 00\r
 R 00 00 01 00\r
 T 12 10 00 00 CD 00 00 00 00 F8 FF 21 06 00 DD\r
@@ -1898,9 +1899,9 @@ R 00 00 01 00
 T 4D 10 00 00 DD 6E FA DD 66 FB 23 DD 75 FA DD\r
 R 00 00 01 00\r
 T 58 10 00 00 74 FB 2B 5E 16 00 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 3D 00\r
+R 00 00 01 00 2B 0B 3E 00\r
 T 60 10 00 00 21 00 00 00 00 CD 00 00 00 00 18\r
-R 00 00 01 00 02 05 3D 00 02 0A 24 00\r
+R 00 00 01 00 02 05 3E 00 02 0A 24 00\r
 T 67 10 00 00 D0\r
 R 00 00 01 00\r
 T 68 10 00 00\r
@@ -1922,11 +1923,11 @@ R 00 00 01 00
 T 86 10 00 00 DD 6E 02 DD 66 03 23 23 5E 23 56\r
 R 00 00 01 00\r
 T 91 10 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 16 00 02 0A 16 00\r
+R 00 00 01 00 2B 05 17 00 02 0A 17 00\r
 T 97 10 00 00 00 00 00 00 E5 DD 5E 04 DD 56 05\r
 R 00 00 01 00 02 04 24 00\r
 T A0 10 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 16 00 02 0A 16 00\r
+R 00 00 01 00 2B 05 17 00 02 0A 17 00\r
 T A6 10 00 00 00 00 00 00 4D 44 E1 09 EB 13 13\r
 R 00 00 01 00 02 04 24 00\r
 T AF 10 00 00 3E B9 0C 00 00 21 B9 0C 00 00 CD\r
@@ -1943,7 +1944,7 @@ T C4 10 00 00
 R 00 00 01 00\r
 T C4 10 00 00 01 00 00 DD 5E FA DD 56 FB 3E\r
 R 00 00 01 00\r
-T CE 10 00 00 36 1A 00 00 21 36 1A 00 00 CD\r
+T CE 10 00 00 C2 1A 00 00 21 C2 1A 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T D3 10 00 00 00 00 00 00 DD 6E FA DD 66 FB DD\r
 R 00 00 01 00 02 04 24 00\r
@@ -2042,13 +2043,13 @@ R 00 00 01 00
 T E0 11 00 00\r
 R 00 00 01 00\r
 T E0 11 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T E3 11 00 00\r
 R 00 00 01 00\r
 T E3 11 00 00 CD 00 00 00 00 21 06 00 19 7E F6\r
 R 00 00 01 00 02 05 23 00\r
 T EC 11 00 00 02 77 C3 00 00 00 00\r
-R 00 00 01 00 02 07 0F 00\r
+R 00 00 01 00 02 07 10 00\r
 T F1 11 00 00\r
 R 00 00 01 00\r
 T F1 11 00 00 CD 00 00 00 00 13 13 EB 7E 23 66\r
@@ -2068,7 +2069,7 @@ R 00 00 01 00
 T 18 12 00 00\r
 R 00 00 01 00\r
 T 18 12 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 1B 12 00 00\r
 R 00 00 01 00\r
 T 1B 12 00 00 CD 00 00 00 00 1A 5F 16 00 3E\r
@@ -2120,7 +2121,7 @@ R 00 00 01 00
 T 6F 12 00 00\r
 R 00 00 01 00\r
 T 6F 12 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 72 12 00 00\r
 R 00 00 01 00\r
 T 72 12 00 00 CD 00 00 00 00 FC FF DD 6E 02 DD\r
@@ -2210,7 +2211,7 @@ R 00 00 01 00
 T 38 13 00 00\r
 R 00 00 01 00\r
 T 38 13 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 3B 13 00 00\r
 R 00 00 01 00\r
 T 3B 13 00 00 CD 00 00 00 00 13 DD 73 02 DD 72\r
@@ -2256,7 +2257,7 @@ R 00 00 01 00
 T 8C 13 00 00\r
 R 00 00 01 00\r
 T 8C 13 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 8F 13 00 00\r
 R 00 00 01 00\r
 T 8F 13 00 00 CD 00 00 00 00 FE FF 2A\r
@@ -2344,7 +2345,7 @@ R 00 00 01 00 00 04 01 00
 T 81 14 00 00\r
 R 00 00 01 00\r
 T 81 14 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 84 14 00 00\r
 R 00 00 01 00\r
 T 84 14 00 00 CD 00 00 00 00\r
@@ -2398,7 +2399,7 @@ R 00 00 01 00
 T E2 14 00 00\r
 R 00 00 01 00\r
 T E2 14 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T E5 14 00 00\r
 R 00 00 01 00\r
 T E5 14 00 00 CD 00 00 00 00\r
@@ -2562,7 +2563,7 @@ R 00 00 01 00
 T 2A 16 00 00\r
 R 00 00 01 00\r
 T 2A 16 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+R 00 00 01 00 02 05 10 00\r
 T 2D 16 00 00\r
 R 00 00 01 00\r
 T 2D 16 00 00 CD 00 00 00 00 F8 FF DD 6E 02 DD\r
@@ -2731,338 +2732,384 @@ T 94 17 00 00
 R 00 00 01 00\r
 T 94 17 00 00 CD 00 00 00 00 F8 FF DD 7E 02 DD\r
 R 00 00 01 00 02 05 2A 00\r
-T 9D 17 00 00 B6 03 20 08\r
+T 9D 17 00 00 B6 03 20 16\r
 R 00 00 01 00\r
 T A1 17 00 00\r
 R 00 00 01 00\r
-T A1 17 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 19 00 02 0A 19 00\r
-T A7 17 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 24 00\r
-T A9 17 00 00\r
+T A1 17 00 00 11 8C 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 02 00 2B 0A 14 00\r
+T A7 17 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
+T AD 17 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 3C 00\r
+T B2 17 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 3C 00 02 09 24 00\r
+T B7 17 00 00\r
 R 00 00 01 00\r
-T A9 17 00 00 DD 6E 02 DD 66 03 23 23 23 CB 3C\r
+T B7 17 00 00 DD 6E 02 DD 66 03 23 23 23 CB 3C\r
 R 00 00 01 00\r
-T B4 17 00 00 CB 1D CB 3C CB 1D 23 DD 75 F8 DD\r
+T C2 17 00 00 CB 1D CB 3C CB 1D 23 DD 75 F8 DD\r
 R 00 00 01 00\r
-T BF 17 00 00 74 F9 2A 3D 00 00 00 DD 75 FA DD\r
+T CD 17 00 00 74 F9 2A 3D 00 00 00 DD 75 FA DD\r
 R 00 00 01 00 00 07 03 00\r
-T C8 17 00 00 74 FB\r
+T D6 17 00 00 74 FB\r
 R 00 00 01 00\r
-T CA 17 00 00\r
+T D8 17 00 00\r
 R 00 00 01 00\r
-T CA 17 00 00 DD 6E FA DD 66 FB 23 23 4E 23 46\r
+T D8 17 00 00 DD 6E FA DD 66 FB 23 23 4E 23 46\r
 R 00 00 01 00\r
-T D5 17 00 00 2A 00 00 00 00 CD 00 00 00 00 30\r
+T E3 17 00 00 2A 00 00 00 00 CD 00 00 00 00 30\r
 R 00 00 01 00 02 05 28 00 02 0A 30 00\r
-T DC 17 00 00 61\r
+T EA 17 00 00 61\r
 R 00 00 01 00\r
-T DD 17 00 00\r
+T EB 17 00 00\r
 R 00 00 01 00\r
-T DD 17 00 00\r
+T EB 17 00 00\r
 R 00 00 01 00\r
-T DD 17 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
+T EB 17 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
 R 00 00 01 00\r
-T E8 17 00 00 75 FC DD 74 FD 23 23 4E 23 46 2A\r
+T F6 17 00 00 75 FC DD 74 FD 23 23 4E 23 46 2A\r
 R 00 00 01 00\r
-T F3 17 00 00 00 00 00 00 CD 00 00 00 00 30 25\r
+T 01 18 00 00 00 00 00 00 CD 00 00 00 00 30 25\r
 R 00 00 01 00 02 04 28 00 02 09 30 00\r
-T FA 17 00 00 2A 3D 00 00 00 DD 4E FC DD 46 FD\r
+T 08 18 00 00 2A 3D 00 00 00 DD 4E FC DD 46 FD\r
 R 00 00 01 00 00 05 03 00\r
-T 03 18 00 00 A7 ED 42 28 17\r
+T 11 18 00 00 A7 ED 42 28 17\r
 R 00 00 01 00\r
-T 08 18 00 00\r
+T 16 18 00 00\r
 R 00 00 01 00\r
-T 08 18 00 00\r
+T 16 18 00 00\r
 R 00 00 01 00\r
-T 08 18 00 00\r
+T 16 18 00 00\r
 R 00 00 01 00\r
-T 08 18 00 00 DD 6E FC DD 66 FD 46 23 66 68 E5\r
+T 16 18 00 00 DD 6E FC DD 66 FD 46 23 66 68 E5\r
 R 00 00 01 00\r
-T 13 18 00 00 DD 6E FA DD 66 FB C1 71 23 70 18\r
+T 21 18 00 00 DD 6E FA DD 66 FB C1 71 23 70 18\r
 R 00 00 01 00\r
-T 1E 18 00 00 BE\r
+T 2C 18 00 00 BE\r
 R 00 00 01 00\r
-T 1F 18 00 00\r
+T 2D 18 00 00\r
 R 00 00 01 00\r
-T 1F 18 00 00 DD 6E F8 DD 66 F9 29 29 DD 4E FA\r
+T 2D 18 00 00 DD 6E F8 DD 66 F9 29 29 DD 4E FA\r
 R 00 00 01 00\r
-T 2A 18 00 00 DD 46 FB 09 4D 44 DD 6E FC DD 66\r
+T 38 18 00 00 DD 46 FB 09 4D 44 DD 6E FC DD 66\r
 R 00 00 01 00\r
-T 35 18 00 00 FD A7 ED 42 38 03\r
+T 43 18 00 00 FD A7 ED 42 38 03\r
 R 00 00 01 00\r
-T 3B 18 00 00\r
+T 49 18 00 00\r
 R 00 00 01 00\r
-T 3B 18 00 00 C3 0C 19 00 00\r
+T 49 18 00 00 C3 58 19 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 3E 18 00 00\r
+T 4C 18 00 00\r
 R 00 00 01 00\r
-T 3E 18 00 00\r
+T 4C 18 00 00\r
 R 00 00 01 00\r
-T 3E 18 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
+T 4C 18 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
 R 00 00 01 00\r
-T 49 18 00 00 75 FA DD 74 FB ED 4B 3D 00 00 00\r
+T 57 18 00 00 75 FA DD 74 FB ED 4B 3D 00 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T 52 18 00 00 A7 ED 42 20 02\r
+T 60 18 00 00 A7 ED 42 20 02\r
 R 00 00 01 00\r
-T 57 18 00 00\r
+T 65 18 00 00\r
 R 00 00 01 00\r
-T 57 18 00 00 18 03\r
+T 65 18 00 00 18 03\r
 R 00 00 01 00\r
-T 59 18 00 00\r
+T 67 18 00 00\r
 R 00 00 01 00\r
-T 59 18 00 00 C3 CA 17 00 00\r
+T 67 18 00 00 C3 D8 17 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 5C 18 00 00\r
+T 6A 18 00 00\r
 R 00 00 01 00\r
-T 5C 18 00 00 01 00 81 DD 6E F8 DD 66 F9 3E 80\r
+T 6A 18 00 00 01 00 81 DD 6E F8 DD 66 F9 3E 80\r
 R 00 00 01 00\r
-T 67 18 00 00 AC 67 ED 42 38 08 DD 6E F8 DD 66\r
+T 75 18 00 00 AC 67 ED 42 38 08 DD 6E F8 DD 66\r
 R 00 00 01 00\r
-T 72 18 00 00 F9 18 03\r
+T 80 18 00 00 F9 18 03\r
 R 00 00 01 00\r
-T 75 18 00 00\r
+T 83 18 00 00\r
 R 00 00 01 00\r
-T 75 18 00 00 21 00 01\r
+T 83 18 00 00 21 00 01\r
 R 00 00 01 00\r
-T 78 18 00 00\r
+T 86 18 00 00\r
 R 00 00 01 00\r
-T 78 18 00 00 DD 75 FE DD 74 FF 29 29 EB 3E\r
+T 86 18 00 00 DD 75 FE DD 74 FF 29 29 EB 3E\r
 R 00 00 01 00\r
-T 82 18 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T 90 18 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 32 00 02 09 32 00\r
-T 87 18 00 00 00 00 00 00 DD 75 FA DD 74 FB 7D\r
+T 95 18 00 00 00 00 00 00 DD 75 FA DD 74 FB 7D\r
 R 00 00 01 00 02 04 24 00\r
-T 90 18 00 00 A4 3C 20 06\r
+T 9E 18 00 00 A4 3C 20 06\r
 R 00 00 01 00\r
-T 94 18 00 00\r
+T A2 18 00 00\r
 R 00 00 01 00\r
-T 94 18 00 00 21 00 00 C3 85 19 00 00\r
+T A2 18 00 00 21 00 00 C3 11 1A 00 00\r
 R 00 00 01 00 00 08 01 00\r
-T 9A 18 00 00\r
+T A8 18 00 00\r
 R 00 00 01 00\r
-T 9A 18 00 00 DD 7E FA D6 04 DD 77 FA DD 7E FB\r
+T A8 18 00 00 DD 7E FA D6 04 DD 77 FA DD 7E FB\r
 R 00 00 01 00\r
-T A5 18 00 00 DE 00 DD 77 FB 2A 3B 00 00 00 DD\r
+T B3 18 00 00 DE 00 DD 77 FB 2A 3B 00 00 00 DD\r
 R 00 00 01 00 00 0A 03 00\r
-T AE 18 00 00 4E FA DD 46 FB A7 ED 42 28 08\r
+T BC 18 00 00 4E FA DD 46 FB A7 ED 42 28 46\r
 R 00 00 01 00\r
-T B8 18 00 00\r
+T C6 18 00 00\r
 R 00 00 01 00\r
-T B8 18 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 19 00 02 0A 19 00\r
-T BE 18 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 24 00\r
-T C0 18 00 00\r
+T C6 18 00 00 11 AA 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 02 00 2B 0A 14 00\r
+T CC 18 00 00 00 00 00 00 CD 00 00 00 00 DD 5E\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
+T D3 18 00 00 FA DD 56 FB 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 0D 00\r
+T DA 18 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0D 00 02 09 24 00\r
+T E0 18 00 00 CA 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 09 14 00\r
+T E5 18 00 00 00 00 00 00 CD 00 00 00 00 ED 5B\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
+T EC 18 00 00 3B 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 09 0D 00\r
+T F1 18 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0D 00 02 09 24 00\r
+T F7 18 00 00 CD 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 09 14 00\r
+T FC 18 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
+T 02 19 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 3C 00\r
+T 07 19 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 3C 00 02 09 24 00\r
+T 0C 19 00 00\r
 R 00 00 01 00\r
-T C0 18 00 00 DD 6E FE DD 66 FF 29 29 DD 4E FA\r
+T 0C 19 00 00 DD 6E FE DD 66 FF 29 29 DD 4E FA\r
 R 00 00 01 00\r
-T CB 18 00 00 DD 46 FB 09 DD 75 FC DD 74 FD E5\r
+T 17 19 00 00 DD 46 FB 09 DD 75 FC DD 74 FD E5\r
 R 00 00 01 00\r
-T D6 18 00 00 69 60 C1 71 23 70 DD 6E FA DD 66\r
+T 22 19 00 00 69 60 C1 71 23 70 DD 6E FA DD 66\r
 R 00 00 01 00\r
-T E1 18 00 00 FB 23 23 36 FF 23 36 7F 2A\r
+T 2D 19 00 00 FB 23 23 36 FF 23 36 7F 2A\r
 R 00 00 01 00\r
-T EA 18 00 00 39 00 00 00 E5 DD 6E FC DD 66 FD\r
+T 36 19 00 00 39 00 00 00 E5 DD 6E FC DD 66 FD\r
 R 00 00 01 00 00 04 03 00\r
-T F3 18 00 00 C1 71 23 70 DD 6E FC DD 66 FD 23\r
+T 3F 19 00 00 C1 71 23 70 DD 6E FC DD 66 FD 23\r
 R 00 00 01 00\r
-T FE 18 00 00 23 AF 77 23 77 DD 6E FC DD 66 FD\r
+T 4A 19 00 00 23 AF 77 23 77 DD 6E FC DD 66 FD\r
 R 00 00 01 00\r
-T 09 19 00 00 22 3B 00 00 00\r
+T 55 19 00 00 22 3B 00 00 00\r
 R 00 00 01 00 00 05 03 00\r
-T 0C 19 00 00\r
+T 58 19 00 00\r
 R 00 00 01 00\r
-T 0C 19 00 00 DD 6E F8 DD 66 F9 29 29 DD 4E FA\r
+T 58 19 00 00 DD 6E F8 DD 66 F9 29 29 DD 4E FA\r
 R 00 00 01 00\r
-T 17 19 00 00 DD 46 FB 09 22 3D 00 00 00 DD 4E\r
+T 63 19 00 00 DD 46 FB 09 22 3D 00 00 00 DD 4E\r
 R 00 00 01 00 00 09 03 00\r
-T 20 19 00 00 FC DD 46 FD A7 ED 42 30 43\r
+T 6C 19 00 00 FC DD 46 FD A7 ED 42 D2\r
 R 00 00 01 00\r
-T 29 19 00 00\r
+T 74 19 00 00 F8 19 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 76 19 00 00\r
 R 00 00 01 00\r
-T 29 19 00 00 21 04 00 ED 4B 3D 00 00 00 09 4D\r
+T 76 19 00 00 21 04 00 ED 4B 3D 00 00 00 09 4D\r
 R 00 00 01 00 00 09 03 00\r
-T 32 19 00 00 44 DD 6E FC DD 66 FD A7 ED 42 30\r
+T 7F 19 00 00 44 DD 6E FC DD 66 FD A7 ED 42 30\r
 R 00 00 01 00\r
-T 3D 19 00 00 08\r
+T 8A 19 00 00 47\r
 R 00 00 01 00\r
-T 3E 19 00 00\r
+T 8B 19 00 00\r
 R 00 00 01 00\r
-T 3E 19 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 19 00 02 0A 19 00\r
-T 44 19 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 24 00\r
-T 46 19 00 00\r
+T 8B 19 00 00 11 D0 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 02 00 2B 0A 14 00\r
+T 91 19 00 00 00 00 00 00 CD 00 00 00 00 ED 5B\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
+T 98 19 00 00 3D 00 00 00 13 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 03 00 2B 0A 0D 00\r
+T 9E 19 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0D 00 02 09 24 00\r
+T A4 19 00 00 CA 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 09 14 00\r
+T A9 19 00 00 00 00 00 00 CD 00 00 00 00 DD 5E\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
+T B0 19 00 00 FC DD 56 FD 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 09 0D 00\r
+T B7 19 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 0D 00 02 09 24 00\r
+T BD 19 00 00 CD 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 09 14 00\r
+T C2 19 00 00 00 00 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 02 04 14 00 02 09 24 00\r
+T C8 19 00 00 01 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 3C 00\r
+T CD 19 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 3C 00 02 09 24 00\r
+T D2 19 00 00\r
 R 00 00 01 00\r
-T 46 19 00 00 DD 6E FC DD 66 FD E5 2A\r
+T D2 19 00 00 DD 6E FC DD 66 FD E5 2A\r
 R 00 00 01 00\r
-T 4E 19 00 00 3D 00 00 00 C1 71 23 70 2A\r
+T DA 19 00 00 3D 00 00 00 C1 71 23 70 2A\r
 R 00 00 01 00 00 04 03 00\r
-T 55 19 00 00 3D 00 00 00 23 23 36 FF 23 36 7F\r
+T E1 19 00 00 3D 00 00 00 23 23 36 FF 23 36 7F\r
 R 00 00 01 00 00 04 03 00\r
-T 5E 19 00 00 2A 3D 00 00 00 E5 DD 6E FA DD 66\r
+T EA 19 00 00 2A 3D 00 00 00 E5 DD 6E FA DD 66\r
 R 00 00 01 00 00 05 03 00\r
-T 67 19 00 00 FB C1 71 23 70\r
+T F3 19 00 00 FB C1 71 23 70\r
 R 00 00 01 00\r
-T 6C 19 00 00\r
+T F8 19 00 00\r
 R 00 00 01 00\r
-T 6C 19 00 00 DD 6E FA DD 66 FB 23 23 ED 4B\r
+T F8 19 00 00 DD 6E FA DD 66 FB 23 23 ED 4B\r
 R 00 00 01 00\r
-T 76 19 00 00 00 00 00 00 71 23 70 21 04 00 DD\r
+T 02 1A 00 00 00 00 00 00 71 23 70 21 04 00 DD\r
 R 00 00 01 00 02 04 28 00\r
-T 7F 19 00 00 4E FA DD 46 FB 09\r
+T 0B 1A 00 00 4E FA DD 46 FB 09\r
 R 00 00 01 00\r
-T 85 19 00 00\r
+T 11 1A 00 00\r
 R 00 00 01 00\r
-T 85 19 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 88 19 00 00\r
+T 11 1A 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 10 00\r
+T 14 1A 00 00\r
 R 00 00 01 00\r
-T 88 19 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
+T 14 1A 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
 R 00 00 01 00 02 05 2A 00\r
-T 91 19 00 00 66 03 DD 75 FE DD 74 FF 7D B4 28\r
+T 1D 1A 00 00 66 03 DD 75 FE DD 74 FF 7D B4 28\r
 R 00 00 01 00\r
-T 9C 19 00 00 35\r
+T 28 1A 00 00 35\r
 R 00 00 01 00\r
-T 9D 19 00 00\r
+T 29 1A 00 00\r
 R 00 00 01 00\r
-T 9D 19 00 00 DD 7E FE D6 04 DD 77 FE DD 7E FF\r
+T 29 1A 00 00 DD 7E FE D6 04 DD 77 FE DD 7E FF\r
 R 00 00 01 00\r
-T A8 19 00 00 DE 00 DD 77 FF ED 4B 3D 00 00 00\r
+T 34 1A 00 00 DE 00 DD 77 FF ED 4B 3D 00 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T B1 19 00 00 DD 6E FE DD 66 FF A7 ED 42 30 09\r
+T 3D 1A 00 00 DD 6E FE DD 66 FF A7 ED 42 30 09\r
 R 00 00 01 00\r
-T BC 19 00 00\r
+T 48 1A 00 00\r
 R 00 00 01 00\r
-T BC 19 00 00 DD 6E FE DD 66 FF 22 3D 00 00 00\r
+T 48 1A 00 00 DD 6E FE DD 66 FF 22 3D 00 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T C5 19 00 00\r
+T 51 1A 00 00\r
 R 00 00 01 00\r
-T C5 19 00 00 DD 6E FE DD 66 FF 23 23 36 FF 23\r
+T 51 1A 00 00 DD 6E FE DD 66 FF 23 23 36 FF 23\r
 R 00 00 01 00\r
-T D0 19 00 00 36 7F\r
+T 5C 1A 00 00 36 7F\r
 R 00 00 01 00\r
-T D2 19 00 00\r
+T 5E 1A 00 00\r
 R 00 00 01 00\r
-T D2 19 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T D5 19 00 00\r
+T 5E 1A 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 10 00\r
+T 61 1A 00 00\r
 R 00 00 01 00\r
-T D5 19 00 00 CD 00 00 00 00 FC FF 2A\r
+T 61 1A 00 00 CD 00 00 00 00 FC FF 2A\r
 R 00 00 01 00 02 05 2A 00\r
-T DB 19 00 00 3B 00 00 00 DD 75 FE DD 74 FF 2A\r
+T 67 1A 00 00 3B 00 00 00 DD 75 FE DD 74 FF 2A\r
 R 00 00 01 00 00 04 03 00\r
-T E4 19 00 00 39 00 00 00 DD 75 FC DD 74 FD\r
+T 70 1A 00 00 39 00 00 00 DD 75 FC DD 74 FD\r
 R 00 00 01 00 00 04 03 00\r
-T EC 19 00 00\r
+T 78 1A 00 00\r
 R 00 00 01 00\r
-T EC 19 00 00 DD 6E FE DD 66 FF DD 4E FC DD 46\r
+T 78 1A 00 00 DD 6E FE DD 66 FF DD 4E FC DD 46\r
 R 00 00 01 00\r
-T F7 19 00 00 FD A7 ED 42 28 36\r
+T 83 1A 00 00 FD A7 ED 42 28 36\r
 R 00 00 01 00\r
-T FD 19 00 00\r
+T 89 1A 00 00\r
 R 00 00 01 00\r
-T FD 19 00 00 DD 6E FC DD 66 FD 23 23 46 23 66\r
+T 89 1A 00 00 DD 6E FC DD 66 FD 23 23 46 23 66\r
 R 00 00 01 00\r
-T 08 1A 00 00 68 DD 4E 02 DD 46 03 CD\r
+T 94 1A 00 00 68 DD 4E 02 DD 46 03 CD\r
 R 00 00 01 00\r
-T 10 1A 00 00 00 00 00 00 38 0D\r
+T 9C 1A 00 00 00 00 00 00 38 0D\r
 R 00 00 01 00 02 04 30 00\r
-T 14 1A 00 00\r
+T A0 1A 00 00\r
 R 00 00 01 00\r
-T 14 1A 00 00 DD 6E FC DD 66 FD 23 23 36 FF 23\r
+T A0 1A 00 00 DD 6E FC DD 66 FD 23 23 36 FF 23\r
 R 00 00 01 00\r
-T 1F 1A 00 00 36 7F\r
+T AB 1A 00 00 36 7F\r
 R 00 00 01 00\r
-T 21 1A 00 00\r
+T AD 1A 00 00\r
 R 00 00 01 00\r
-T 21 1A 00 00 DD 6E FC DD 66 FD 46 23 66 68 DD\r
+T AD 1A 00 00 DD 6E FC DD 66 FD 46 23 66 68 DD\r
 R 00 00 01 00\r
-T 2C 1A 00 00 75 FC DD 74 FD 18 B9\r
+T B8 1A 00 00 75 FC DD 74 FD 18 B9\r
 R 00 00 01 00\r
-T 33 1A 00 00\r
+T BF 1A 00 00\r
 R 00 00 01 00\r
-T 33 1A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 36 1A 00 00\r
+T BF 1A 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 10 00\r
+T C2 1A 00 00\r
 R 00 00 01 00\r
-T 36 1A 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
+T C2 1A 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
 R 00 00 01 00 02 05 2A 00\r
-T 3F 1A 00 00 66 03 DD 75 FE DD 74 FF 7D B4 28\r
+T CB 1A 00 00 66 03 DD 75 FE DD 74 FF 7D B4 28\r
 R 00 00 01 00\r
-T 4A 1A 00 00 15\r
+T D6 1A 00 00 15\r
 R 00 00 01 00\r
-T 4B 1A 00 00\r
+T D7 1A 00 00\r
 R 00 00 01 00\r
-T 4B 1A 00 00 21 FC FF DD 4E FE DD 46 FF 09 23\r
+T D7 1A 00 00 21 FC FF DD 4E FE DD 46 FF 09 23\r
 R 00 00 01 00\r
-T 56 1A 00 00 23 DD 4E 04 DD 46 05 71 23 70\r
+T E2 1A 00 00 23 DD 4E 04 DD 46 05 71 23 70\r
 R 00 00 01 00\r
-T 60 1A 00 00\r
+T EC 1A 00 00\r
 R 00 00 01 00\r
-T 60 1A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
-T 63 1A 00 00\r
+T EC 1A 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 10 00\r
+T EF 1A 00 00\r
 R 00 00 01 00\r
-T 63 1A 00 00 CD 00 00 00 00 21 FC FF 19 23 23\r
+T EF 1A 00 00 CD 00 00 00 00 21 FC FF 19 23 23\r
 R 00 00 01 00 02 05 23 00\r
-T 6C 1A 00 00 46 23 66 68 C3 00 00 00 00\r
-R 00 00 01 00 02 09 0F 00\r
-T 73 1A 00 00\r
+T F8 1A 00 00 46 23 66 68 C3 00 00 00 00\r
+R 00 00 01 00 02 09 10 00\r
+T FF 1A 00 00\r
 R 00 00 01 00\r
-T 73 1A 00 00 CD 00 00 00 00 FA FF 2A\r
+T FF 1A 00 00 CD 00 00 00 00 FA FF 2A\r
 R 00 00 01 00 02 05 2A 00\r
-T 79 1A 00 00 3B 00 00 00 DD 75 FE DD 74 FF 2A\r
+T 05 1B 00 00 3B 00 00 00 DD 75 FE DD 74 FF 2A\r
 R 00 00 01 00 00 04 03 00\r
-T 82 1A 00 00 39 00 00 00 DD 75 FA DD 74 FB\r
+T 0E 1B 00 00 39 00 00 00 DD 75 FA DD 74 FB\r
 R 00 00 01 00 00 04 03 00\r
-T 8A 1A 00 00\r
+T 16 1B 00 00\r
 R 00 00 01 00\r
-T 8A 1A 00 00 DD 6E FE DD 66 FF DD 4E FA DD 46\r
+T 16 1B 00 00 DD 6E FE DD 66 FF DD 4E FA DD 46\r
 R 00 00 01 00\r
-T 95 1A 00 00 FB A7 ED 42 28 62\r
+T 21 1B 00 00 FB A7 ED 42 28 62\r
 R 00 00 01 00\r
-T 9B 1A 00 00\r
+T 27 1B 00 00\r
 R 00 00 01 00\r
-T 9B 1A 00 00 DD 6E FA DD 66 FB 23 23 4E 23 46\r
+T 27 1B 00 00 DD 6E FA DD 66 FB 23 23 4E 23 46\r
 R 00 00 01 00\r
-T A6 1A 00 00 2A 00 00 00 00 CD 00 00 00 00 30\r
+T 32 1B 00 00 2A 00 00 00 00 CD 00 00 00 00 30\r
 R 00 00 01 00 02 05 28 00 02 0A 30 00\r
-T AD 1A 00 00 3D\r
+T 39 1B 00 00 3D\r
 R 00 00 01 00\r
-T AE 1A 00 00\r
+T 3A 1B 00 00\r
 R 00 00 01 00\r
-T AE 1A 00 00\r
+T 3A 1B 00 00\r
 R 00 00 01 00\r
-T AE 1A 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
+T 3A 1B 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
 R 00 00 01 00\r
-T B9 1A 00 00 75 FC DD 74 FD 23 23 4E 23 46 2A\r
+T 45 1B 00 00 75 FC DD 74 FD 23 23 4E 23 46 2A\r
 R 00 00 01 00\r
-T C4 1A 00 00 00 00 00 00 CD 00 00 00 00 30 17\r
+T 50 1B 00 00 00 00 00 00 CD 00 00 00 00 30 17\r
 R 00 00 01 00 02 04 28 00 02 09 30 00\r
-T CB 1A 00 00\r
+T 57 1B 00 00\r
 R 00 00 01 00\r
-T CB 1A 00 00 DD 6E FC DD 66 FD 46 23 66 68 E5\r
+T 57 1B 00 00 DD 6E FC DD 66 FD 46 23 66 68 E5\r
 R 00 00 01 00\r
-T D6 1A 00 00 DD 6E FA DD 66 FB C1 71 23 70 18\r
+T 62 1B 00 00 DD 6E FA DD 66 FB C1 71 23 70 18\r
 R 00 00 01 00\r
-T E1 1A 00 00 CC\r
+T 6D 1B 00 00 CC\r
 R 00 00 01 00\r
-T E2 1A 00 00\r
+T 6E 1B 00 00\r
 R 00 00 01 00\r
-T E2 1A 00 00 DD 6E FA DD 66 FB 22 3D 00 00 00\r
+T 6E 1B 00 00 DD 6E FA DD 66 FB 22 3D 00 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T EB 1A 00 00\r
+T 77 1B 00 00\r
 R 00 00 01 00\r
-T EB 1A 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
+T 77 1B 00 00 DD 6E FA DD 66 FB 46 23 66 68 DD\r
 R 00 00 01 00\r
-T F6 1A 00 00 75 FA DD 74 FB 18 8D\r
+T 82 1B 00 00 75 FA DD 74 FB 18 8D\r
 R 00 00 01 00\r
-T FD 1A 00 00\r
+T 89 1B 00 00\r
 R 00 00 01 00\r
-T FD 1A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 0F 00\r
+T 89 1B 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 10 00\r
 T 00 00 00 00\r
 R 00 00 02 00\r
 T 00 00 00 00 00\r
@@ -3163,6 +3210,38 @@ T 82 00 00 00
 R 00 00 02 00\r
 T 82 00 00 00 72 65 61 64 6F 6E 6C 79 20 00\r
 R 00 00 02 00\r
+T 8C 00 00 00\r
+R 00 00 02 00\r
+T 8C 00 00 00 66 61 74 61 6C 3A 20 67 65 74 63\r
+R 00 00 02 00\r
+T 97 00 00 00 65 6C 6C 28 29 20 6E 62 79 74 65\r
+R 00 00 02 00\r
+T A2 00 00 00 73 20 3D 3D 20 30 0A 00\r
+R 00 00 02 00\r
+T AA 00 00 00\r
+R 00 00 02 00\r
+T AA 00 00 00 66 61 74 61 6C 3A 20 67 65 74 63\r
+R 00 00 02 00\r
+T B5 00 00 00 65 6C 6C 28 29 20 70 20 21 3D 20\r
+R 00 00 02 00\r
+T C0 00 00 00 61 72 65 61 74 6F 70 20 28 00\r
+R 00 00 02 00\r
+T CA 00 00 00\r
+R 00 00 02 00\r
+T CA 00 00 00 2C 20 00\r
+R 00 00 02 00\r
+T CD 00 00 00\r
+R 00 00 02 00\r
+T CD 00 00 00 29 0A 00\r
+R 00 00 02 00\r
+T D0 00 00 00\r
+R 00 00 02 00\r
+T D0 00 00 00 66 61 74 61 6C 3A 20 67 65 74 63\r
+R 00 00 02 00\r
+T DB 00 00 00 65 6C 6C 28 29 20 61 72 65 61 6E\r
+R 00 00 02 00\r
+T E6 00 00 00 78 74 2B 31 20 3E 20 71 20 28 00\r
+R 00 00 02 00\r
 T 00 00 00 00\r
 R 00 00 03 00\r
 T 00 00 00 00\r
index f0f8313..c23057c 100644 (file)
@@ -687,7 +687,11 @@ loop:
                startl = 1;\r
                if (multiline || cf & CONTIN) {\r
                        if (talking && env.iop <= iostack)\r
+#if 1 /* Nick */\r
+                               prs_expand(cprompt->value);\r
+#else\r
                                prs(cprompt->value);\r
+#endif\r
                        if (cf & CONTIN)\r
                                goto loop;\r
                }\r
@@ -735,7 +739,11 @@ register c, c1;
                        return(YYERRCODE);\r
                }\r
                if (talking && c == '\n' && env.iop <= iostack)\r
+#if 1 /* Nick */\r
+                       prs_expand(cprompt->value);\r
+#else\r
                        prs(cprompt->value);\r
+#endif\r
                *env.linep++ = c;\r
        }\r
        *env.linep++ = c;\r
index 7c37267..dcf8789 100644 (file)
@@ -1,5 +1,5 @@
 XL4\r
-H 6 areas 2B global symbols\r
+H 6 areas 2C global symbols\r
 M sh2\r
 S cprompt Ref00000000\r
 S ?BANK_FAST_LEAVE_L08 Ref00000000\r
@@ -34,6 +34,7 @@ S ?ENT_AUTO_DIRECT_L09 Ref00000000
 S iostack Ref00000000\r
 S getwords Ref00000000\r
 S ?SS_CMP_L02 Ref00000000\r
+S prs_expand Ref00000000\r
 S ?CL64180B_4_06_L00 Ref00000000\r
 S elinep Ref00000000\r
 S .__.ABS. Def00000000\r
@@ -1477,7 +1478,7 @@ R 00 00 01 00
 T 2B 0E 00 00 2A 00 00 00 00 5E 23 56 3E\r
 R 00 00 01 00 02 05 00 00\r
 T 32 0E 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0B 00 02 09 0B 00\r
+R 00 00 01 00 2B 04 21 00 02 09 21 00\r
 T 37 0E 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 14 00\r
 T 39 0E 00 00\r
@@ -1529,7 +1530,7 @@ R 00 00 01 00
 T 93 0E 00 00\r
 R 00 00 01 00\r
 T 93 0E 00 00 2A 00 00 00 00 ED 4B 00 00 00 00\r
-R 00 00 01 00 02 05 06 00 02 0B 22 00\r
+R 00 00 01 00 02 05 06 00 02 0B 23 00\r
 T 9A 0E 00 00 A7 ED 42 38 0D\r
 R 00 00 01 00\r
 T 9F 0E 00 00\r
@@ -1659,7 +1660,7 @@ R 00 00 01 00
 T B8 0F 00 00 2A 00 00 00 00 5E 23 56 3E\r
 R 00 00 01 00 02 05 00 00\r
 T BF 0F 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0B 00 02 09 0B 00\r
+R 00 00 01 00 2B 04 21 00 02 09 21 00\r
 T C4 0F 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 14 00\r
 T C6 0F 00 00\r
index f25fabc..b7a4509 100644 (file)
@@ -356,7 +356,11 @@ parent()
        i = fork();\r
        if (i != 0) {\r
                if (i == -1)\r
+#if 1 /* Nick */\r
+                       warn("can't fork - try again");\r
+#else\r
                        warn("try again");\r
+#endif\r
        }\r
        return(i);\r
 }\r
index 80a4e0e..eea5f9d 100644 (file)
@@ -134,7 +134,7 @@ S doexec Def00001867
 S docontinue Def00001FCD\r
 S doeval Def00001C1A\r
 S waitfor Def00001097\r
-A CSTR size 2D4 flags 0\r
+A CSTR size 2E1 flags 0\r
 A IDATA0 size 84 flags 0\r
 A CDATA0 size 84 flags 0\r
 T 00 00 00 00\r
@@ -1419,11 +1419,11 @@ T AD 0C 00 00
 R 00 00 01 00\r
 T AD 0C 00 00 DD 6E 02 DD 66 03 23 23 7E E6 03\r
 R 00 00 01 00\r
-T B8 0C 00 00 28 05 21 DB 00 00 00 18 03\r
+T B8 0C 00 00 28 05 21 E8 00 00 00 18 03\r
 R 00 00 01 00 00 07 02 00\r
 T BF 0C 00 00\r
 R 00 00 01 00\r
-T BF 0C 00 00 21 E0 00 00 00\r
+T BF 0C 00 00 21 ED 00 00 00\r
 R 00 00 01 00 00 05 02 00\r
 T C2 0C 00 00\r
 R 00 00 01 00\r
@@ -1483,7 +1483,7 @@ T 43 0D 00 00 DD 5E FC DD 56 FD 3E 00 00 00 00
 R 00 00 01 00 2B 0B 25 00\r
 T 4B 0D 00 00 21 00 00 00 00 CD 00 00 00 00 11\r
 R 00 00 01 00 02 05 25 00 02 0A 3D 00\r
-T 52 0D 00 00 E7 00 00 00 3E 00 00 00 00 21\r
+T 52 0D 00 00 F4 00 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 02 00 2B 09 0F 00\r
 T 57 0D 00 00 00 00 00 00 CD 00 00 00 00 21\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -1543,9 +1543,9 @@ T F6 0D 00 00 00 00 00 00 21 00 00 00 00 CD
 R 00 00 01 00 2B 04 59 00 02 09 59 00\r
 T FB 0D 00 00 00 00 00 00 DD 75 FA DD 74 FB DD\r
 R 00 00 01 00 02 04 3D 00\r
-T 04 0E 00 00 36 FC FD 00 00 00 DD 36 FD\r
+T 04 0E 00 00 36 FC 0A 01 00 00 DD 36 FD\r
 R 00 00 01 00 09 06 02 00\r
-T 0A 0E 00 00 FD 00 00 00 C3 A2 0E 00 00\r
+T 0A 0E 00 00 0A 01 00 00 C3 A2 0E 00 00\r
 R 00 00 01 00 89 04 02 00 00 09 01 00\r
 T 0E 0E 00 00\r
 R 00 00 01 00\r
@@ -1609,7 +1609,7 @@ T A8 0E 00 00 DD 5E FC DD 56 FD 3E 00 00 00 00
 R 00 00 01 00 2B 0B 25 00\r
 T B0 0E 00 00 21 00 00 00 00 CD 00 00 00 00 11\r
 R 00 00 01 00 02 05 25 00 02 0A 3D 00\r
-T B7 0E 00 00 07 01 00 00 3E 00 00 00 00 21\r
+T B7 0E 00 00 14 01 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 02 00 2B 09 25 00\r
 T BC 0E 00 00 00 00 00 00 CD 00 00 00 00 DD 5E\r
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
@@ -1649,7 +1649,7 @@ T 14 0F 00 00
 R 00 00 01 00\r
 T 14 0F 00 00 CD 00 00 00 00 FE FF 11\r
 R 00 00 01 00 02 05 46 00\r
-T 1A 0F 00 00 11 01 00 00 3E 00 00 00 00 21\r
+T 1A 0F 00 00 1E 01 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 02 00 2B 09 25 00\r
 T 1F 0F 00 00 00 00 00 00 CD 00 00 00 00 AF DD\r
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
@@ -1667,7 +1667,7 @@ T 3E 0F 00 00 DD 7E FE DD B6 FF 28 0B
 R 00 00 01 00\r
 T 46 0F 00 00\r
 R 00 00 01 00\r
-T 46 0F 00 00 11 13 01 00 00 3E 00 00 00 00 21\r
+T 46 0F 00 00 11 20 01 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 25 00\r
 T 4C 0F 00 00 00 00 00 00 CD 00 00 00 00\r
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
@@ -1917,7 +1917,7 @@ T 89 11 00 00 00 00 00 00 CD 00 00 00 00
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
 T 8E 11 00 00\r
 R 00 00 01 00\r
-T 8E 11 00 00 11 15 01 00 00 3E 00 00 00 00 21\r
+T 8E 11 00 00 11 22 01 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 25 00\r
 T 94 11 00 00 00 00 00 00 CD 00 00 00 00 DD 5E\r
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
@@ -1925,7 +1925,7 @@ T 9B 11 00 00 FA DD 56 FB 3E 00 00 00 00 21
 R 00 00 01 00 2B 09 1D 00\r
 T A2 11 00 00 00 00 00 00 CD 00 00 00 00 11\r
 R 00 00 01 00 02 04 1D 00 02 09 3D 00\r
-T A8 11 00 00 13 01 00 00 3E 00 00 00 00 21\r
+T A8 11 00 00 20 01 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 02 00 2B 09 25 00\r
 T AD 11 00 00 00 00 00 00 CD 00 00 00 00\r
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
@@ -1937,7 +1937,7 @@ T BD 11 00 00 B0 28 0B
 R 00 00 01 00\r
 T C0 11 00 00\r
 R 00 00 01 00\r
-T C0 11 00 00 11 1D 01 00 00 3E 00 00 00 00 21\r
+T C0 11 00 00 11 2A 01 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 25 00\r
 T C6 11 00 00 00 00 00 00 CD 00 00 00 00\r
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
@@ -2031,7 +2031,7 @@ T 7E 12 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00
 R 00 00 01 00 2B 0B 0B 00\r
 T 86 12 00 00 21 00 00 00 00 CD 00 00 00 00 4D\r
 R 00 00 01 00 02 05 0B 00 02 0A 3D 00\r
-T 8D 12 00 00 44 11 2C 01 00 00 3E 00 00 00 00\r
+T 8D 12 00 00 44 11 39 01 00 00 3E 00 00 00 00\r
 R 00 00 01 00 00 06 02 00 2B 0B 30 00\r
 T 93 12 00 00 21 00 00 00 00 CD 00 00 00 00 EB\r
 R 00 00 01 00 02 05 30 00 02 0A 3D 00\r
@@ -2177,15 +2177,15 @@ T F0 13 00 00 F4 13 00 00 6D 14 00 00
 R 00 00 01 00 00 04 01 00 00 08 01 00\r
 T F4 13 00 00\r
 R 00 00 01 00\r
-T F4 13 00 00 21 2E 01 00 00 C3 90 14 00 00\r
+T F4 13 00 00 21 3B 01 00 00 C3 90 14 00 00\r
 R 00 00 01 00 00 05 02 00 00 0A 01 00\r
 T FA 13 00 00\r
 R 00 00 01 00\r
-T FA 13 00 00 21 46 01 00 00 C3 90 14 00 00\r
+T FA 13 00 00 21 53 01 00 00 C3 90 14 00 00\r
 R 00 00 01 00 00 05 02 00 00 0A 01 00\r
 T 00 14 00 00\r
 R 00 00 01 00\r
-T 00 14 00 00 21 5A 01 00 00 C3 90 14 00 00\r
+T 00 14 00 00 21 67 01 00 00 C3 90 14 00 00\r
 R 00 00 01 00 00 05 02 00 00 0A 01 00\r
 T 06 14 00 00\r
 R 00 00 01 00\r
@@ -2201,7 +2201,7 @@ T 2E 14 00 00 00 00 00 00 DD 6E 04 DD 66 05 71
 R 00 00 01 00 02 04 10 00\r
 T 37 14 00 00 23 70 DD 6E 0A DD 66 0B E5 DD 4E\r
 R 00 00 01 00\r
-T 42 14 00 00 04 DD 46 05 11 75 01 00 00 3E\r
+T 42 14 00 00 04 DD 46 05 11 82 01 00 00 3E\r
 R 00 00 01 00 00 09 02 00\r
 T 4A 14 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 01 00 02 09 01 00\r
@@ -2209,15 +2209,15 @@ T 4F 14 00 00 00 00 00 00 F1 DD 6E FA DD 66 FB
 R 00 00 01 00 02 04 3D 00\r
 T 58 14 00 00 E5 DD 6E 04 DD 66 05 C1 71 23 70\r
 R 00 00 01 00\r
-T 63 14 00 00 21 7D 01 00 00 18 28\r
+T 63 14 00 00 21 8A 01 00 00 18 28\r
 R 00 00 01 00 00 05 02 00\r
 T 68 14 00 00\r
 R 00 00 01 00\r
-T 68 14 00 00 21 86 01 00 00 18 23\r
+T 68 14 00 00 21 93 01 00 00 18 23\r
 R 00 00 01 00 00 05 02 00\r
 T 6D 14 00 00\r
 R 00 00 01 00\r
-T 6D 14 00 00 21 96 01 00 00 18 1E\r
+T 6D 14 00 00 21 A3 01 00 00 18 1E\r
 R 00 00 01 00 00 05 02 00\r
 T 72 14 00 00\r
 R 00 00 01 00\r
@@ -2235,11 +2235,11 @@ T 7F 14 00 00
 R 00 00 01 00\r
 T 7F 14 00 00 2A 00 00 00 00 3E 02 AD B4 20 05\r
 R 00 00 01 00 02 05 40 00\r
-T 88 14 00 00 21 AD 01 00 00 18 03\r
+T 88 14 00 00 21 BA 01 00 00 18 03\r
 R 00 00 01 00 00 05 02 00\r
 T 8D 14 00 00\r
 R 00 00 01 00\r
-T 8D 14 00 00 21 B7 01 00 00\r
+T 8D 14 00 00 21 C4 01 00 00\r
 R 00 00 01 00 00 05 02 00\r
 T 90 14 00 00\r
 R 00 00 01 00\r
@@ -2357,9 +2357,9 @@ T D9 15 00 00
 R 00 00 01 00\r
 T D9 15 00 00\r
 R 00 00 01 00\r
-T D9 15 00 00 DD 36 FE C6 01 00 00 DD 36 FF\r
+T D9 15 00 00 DD 36 FE D3 01 00 00 DD 36 FF\r
 R 00 00 01 00 09 07 02 00\r
-T E0 15 00 00 C6 01 00 00 18 21\r
+T E0 15 00 00 D3 01 00 00 18 21\r
 R 00 00 01 00 89 04 02 00\r
 T E3 15 00 00\r
 R 00 00 01 00\r
@@ -2371,9 +2371,9 @@ T F2 15 00 00 7C 28 0A
 R 00 00 01 00\r
 T F5 15 00 00\r
 R 00 00 01 00\r
-T F5 15 00 00 DD 36 FE DA 01 00 00 DD 36 FF\r
+T F5 15 00 00 DD 36 FE E7 01 00 00 DD 36 FF\r
 R 00 00 01 00 09 07 02 00\r
-T FC 15 00 00 DA 01 00 00 18 05\r
+T FC 15 00 00 E7 01 00 00 18 05\r
 R 00 00 01 00 89 04 02 00\r
 T FF 15 00 00\r
 R 00 00 01 00\r
@@ -2389,7 +2389,7 @@ T 0F 16 00 00 DD 56 FD 18 03
 R 00 00 01 00\r
 T 14 16 00 00\r
 R 00 00 01 00\r
-T 14 16 00 00 11 EA 01 00 00\r
+T 14 16 00 00 11 F7 01 00 00\r
 R 00 00 01 00 00 05 02 00\r
 T 17 16 00 00\r
 R 00 00 01 00\r
@@ -2431,7 +2431,7 @@ T 72 16 00 00 00 00 00 00 CD 00 00 00 00 30 10
 R 00 00 01 00 02 04 3B 00 02 09 4B 00\r
 T 79 16 00 00\r
 R 00 00 01 00\r
-T 79 16 00 00 11 ED 01 00 00 3E 00 00 00 00 21\r
+T 79 16 00 00 11 FA 01 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 0F 00\r
 T 7F 16 00 00 00 00 00 00 CD 00 00 00 00 21\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -2455,7 +2455,7 @@ T BE 16 00 00 00 00 00 00 3E 00 00 00 00 21
 R 00 00 01 00 02 04 3B 00 2B 09 0B 00\r
 T C3 16 00 00 00 00 00 00 CD 00 00 00 00 4D 44\r
 R 00 00 01 00 02 04 0B 00 02 09 3D 00\r
-T CA 16 00 00 11 FE 01 00 00 3E 00 00 00 00 21\r
+T CA 16 00 00 11 0B 02 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 30 00\r
 T D0 16 00 00 00 00 00 00 CD 00 00 00 00 EB 3E\r
 R 00 00 01 00 02 04 30 00 02 09 3D 00\r
@@ -2693,7 +2693,7 @@ T 5A 19 00 00 00 00 00 00 21 00 00 00 00 CD
 R 00 00 01 00 2B 04 0E 00 02 09 0E 00\r
 T 5F 19 00 00 00 00 00 00 7D B4 28 05 21\r
 R 00 00 01 00 02 04 3D 00\r
-T 66 19 00 00 00 02 00 00 18 07\r
+T 66 19 00 00 0D 02 00 00 18 07\r
 R 00 00 01 00 00 04 02 00\r
 T 6A 19 00 00\r
 R 00 00 01 00\r
@@ -2797,7 +2797,7 @@ T 4E 1A 00 00 DD 5E FE DD 56 FF 3E 00 00 00 00
 R 00 00 01 00 2B 0B 25 00\r
 T 56 1A 00 00 21 00 00 00 00 CD 00 00 00 00 11\r
 R 00 00 01 00 02 05 25 00 02 0A 3D 00\r
-T 5D 1A 00 00 02 02 00 00 3E 00 00 00 00 21\r
+T 5D 1A 00 00 0F 02 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 02 00 2B 09 0F 00\r
 T 62 1A 00 00 00 00 00 00 CD 00 00 00 00 21\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -2863,7 +2863,7 @@ T E9 1A 00 00 46 23 66 68 23 23 7E 23 B6 20 11
 R 00 00 01 00\r
 T F4 1A 00 00\r
 R 00 00 01 00\r
-T F4 1A 00 00 11 0E 02 00 00 3E 00 00 00 00 21\r
+T F4 1A 00 00 11 1B 02 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 0F 00\r
 T FA 1A 00 00 00 00 00 00 CD 00 00 00 00 21\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -3243,7 +3243,7 @@ T 90 1E 00 00
 R 00 00 01 00\r
 T 90 1E 00 00\r
 R 00 00 01 00\r
-T 90 1E 00 00 11 23 02 00 00 3E 00 00 00 00 21\r
+T 90 1E 00 00 11 30 02 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 0F 00\r
 T 96 1E 00 00 00 00 00 00 CD 00 00 00 00 AF DD\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -3349,7 +3349,7 @@ T 89 1F 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00
 R 00 00 01 00 2B 0B 25 00\r
 T 91 1F 00 00 21 00 00 00 00 CD 00 00 00 00 11\r
 R 00 00 01 00 02 05 25 00 02 0A 3D 00\r
-T 98 1F 00 00 3B 02 00 00 3E 00 00 00 00 21\r
+T 98 1F 00 00 48 02 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 02 00 2B 09 0F 00\r
 T 9D 1F 00 00 00 00 00 00 CD 00 00 00 00\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -3427,7 +3427,7 @@ T 4E 20 00 00 DD 7E FE DD B6 FF 28 10
 R 00 00 01 00\r
 T 56 20 00 00\r
 R 00 00 01 00\r
-T 56 20 00 00 11 48 02 00 00 3E 00 00 00 00 21\r
+T 56 20 00 00 11 55 02 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 05 02 00 2B 0A 0F 00\r
 T 5C 20 00 00 00 00 00 00 CD 00 00 00 00 21\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -3565,7 +3565,7 @@ T 8B 21 00 00 CD 00 00 00 00 3E 00 00 00 00 21
 R 00 00 01 00 02 05 3C 00 2B 0A 25 00\r
 T 91 21 00 00 00 00 00 00 CD 00 00 00 00 11\r
 R 00 00 01 00 02 04 25 00 02 09 3D 00\r
-T 97 21 00 00 61 02 00 00 3E 00 00 00 00 21\r
+T 97 21 00 00 6E 02 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 02 00 2B 09 0F 00\r
 T 9C 21 00 00 00 00 00 00 CD 00 00 00 00 C3\r
 R 00 00 01 00 02 04 0F 00 02 09 3D 00\r
@@ -3761,7 +3761,7 @@ T 81 23 00 00 00 00 00 00 ED 5B 00 00 00 00 3E
 R 00 00 01 00 02 04 52 00 02 0A 3B 00\r
 T 88 23 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 0B 00 02 09 0B 00\r
-T 8D 23 00 00 00 00 00 00 4D 44 11 FE 01 00 00\r
+T 8D 23 00 00 00 00 00 00 4D 44 11 0B 02 00 00\r
 R 00 00 01 00 02 04 3D 00 00 0B 02 00\r
 T 94 23 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 05 30 00 02 0A 30 00\r
@@ -3959,243 +3959,247 @@ T CE 00 00 00 3A 20 00
 R 00 00 02 00\r
 T D1 00 00 00\r
 R 00 00 02 00\r
-T D1 00 00 00 74 72 79 20 61 67 61 69 6E 00\r
+T D1 00 00 00 63 61 6E 27 74 20 66 6F 72 6B 20\r
 R 00 00 02 00\r
-T DB 00 00 00\r
+T DC 00 00 00 2D 20 74 72 79 20 61 67 61 69 6E\r
 R 00 00 02 00\r
-T DB 00 00 00 6F 70 65 6E 00\r
+T E7 00 00 00 00\r
 R 00 00 02 00\r
-T E0 00 00 00\r
+T E8 00 00 00\r
 R 00 00 02 00\r
-T E0 00 00 00 63 72 65 61 74 65 00\r
+T E8 00 00 00 6F 70 65 6E 00\r
 R 00 00 02 00\r
-T E7 00 00 00\r
+T ED 00 00 00\r
 R 00 00 02 00\r
-T E7 00 00 00 3A 20 69 6C 6C 65 67 61 6C 20 3E\r
+T ED 00 00 00 63 72 65 61 74 65 00\r
 R 00 00 02 00\r
-T F2 00 00 00 26 20 61 72 67 75 6D 65 6E 74 00\r
+T F4 00 00 00\r
 R 00 00 02 00\r
-T FD 00 00 00\r
+T F4 00 00 00 3A 20 69 6C 6C 65 67 61 6C 20 3E\r
 R 00 00 02 00\r
-T FD 00 00 00 68 65 72 65 20 66 69 6C 65 00\r
+T FF 00 00 00 26 20 61 72 67 75 6D 65 6E 74 00\r
 R 00 00 02 00\r
-T 07 01 00 00\r
+T 0A 01 00 00\r
 R 00 00 02 00\r
-T 07 01 00 00 3A 20 63 61 6E 6E 6F 74 20 00\r
+T 0A 01 00 00 68 65 72 65 20 66 69 6C 65 00\r
 R 00 00 02 00\r
-T 11 01 00 00\r
+T 14 01 00 00\r
 R 00 00 02 00\r
-T 11 01 00 00 2B 00\r
+T 14 01 00 00 3A 20 63 61 6E 6E 6F 74 20 00\r
 R 00 00 02 00\r
-T 13 01 00 00\r
+T 1E 01 00 00\r
 R 00 00 02 00\r
-T 13 01 00 00 20 00\r
+T 1E 01 00 00 2B 00\r
 R 00 00 02 00\r
-T 15 01 00 00\r
+T 20 01 00 00\r
 R 00 00 02 00\r
-T 15 01 00 00 53 69 67 6E 61 6C 20 00\r
+T 20 01 00 00 20 00\r
 R 00 00 02 00\r
-T 1D 01 00 00\r
+T 22 01 00 00\r
 R 00 00 02 00\r
-T 1D 01 00 00 20 2D 20 63 6F 72 65 20 64 75 6D\r
+T 22 01 00 00 53 69 67 6E 61 6C 20 00\r
 R 00 00 02 00\r
-T 28 01 00 00 70 65 64 00\r
+T 2A 01 00 00\r
 R 00 00 02 00\r
-T 2C 01 00 00\r
+T 2A 01 00 00 20 2D 20 63 6F 72 65 20 64 75 6D\r
 R 00 00 02 00\r
-T 2C 01 00 00 3F 00\r
+T 35 01 00 00 70 65 64 00\r
 R 00 00 02 00\r
-T 2E 01 00 00\r
+T 39 01 00 00\r
 R 00 00 02 00\r
-T 2E 01 00 00 65 78 65 63 75 74 61 62 6C 65 20\r
+T 39 01 00 00 3F 00\r
 R 00 00 02 00\r
-T 39 01 00 00 66 6F 72 6D 61 74 20 65 72 72 6F\r
+T 3B 01 00 00\r
 R 00 00 02 00\r
-T 44 01 00 00 72 00\r
+T 3B 01 00 00 65 78 65 63 75 74 61 62 6C 65 20\r
 R 00 00 02 00\r
-T 46 01 00 00\r
+T 46 01 00 00 66 6F 72 6D 61 74 20 65 72 72 6F\r
 R 00 00 02 00\r
-T 46 01 00 00 66 69 6C 65 20 69 73 20 6E 6F 74\r
+T 51 01 00 00 72 00\r
 R 00 00 02 00\r
-T 51 01 00 00 20 61 6C 69 67 6E 65 64 00\r
+T 53 01 00 00\r
 R 00 00 02 00\r
-T 5A 01 00 00\r
+T 53 01 00 00 66 69 6C 65 20 69 73 20 6E 6F 74\r
 R 00 00 02 00\r
-T 5A 01 00 00 66 69 6C 65 20 69 73 20 74 6F 6F\r
+T 5E 01 00 00 20 61 6C 69 67 6E 65 64 00\r
 R 00 00 02 00\r
-T 65 01 00 00 20 73 68 6F 72 74 2C 20 6F 72 20\r
+T 67 01 00 00\r
 R 00 00 02 00\r
-T 70 01 00 00 68 6F 6C 65 00\r
+T 67 01 00 00 66 69 6C 65 20 69 73 20 74 6F 6F\r
 R 00 00 02 00\r
-T 75 01 00 00\r
+T 72 01 00 00 20 73 68 6F 72 74 2C 20 6F 72 20\r
 R 00 00 02 00\r
-T 75 01 00 00 2F 62 69 6E 2F 73 68 00\r
+T 7D 01 00 00 68 6F 6C 65 00\r
 R 00 00 02 00\r
-T 7D 01 00 00\r
+T 82 01 00 00\r
 R 00 00 02 00\r
-T 7D 01 00 00 6E 6F 20 53 68 65 6C 6C 00\r
+T 82 01 00 00 2F 62 69 6E 2F 73 68 00\r
 R 00 00 02 00\r
-T 86 01 00 00\r
+T 8A 01 00 00\r
 R 00 00 02 00\r
-T 86 01 00 00 70 72 6F 67 72 61 6D 20 74 6F 6F\r
+T 8A 01 00 00 6E 6F 20 53 68 65 6C 6C 00\r
 R 00 00 02 00\r
-T 91 01 00 00 20 62 69 67 00\r
+T 93 01 00 00\r
 R 00 00 02 00\r
-T 96 01 00 00\r
+T 93 01 00 00 70 72 6F 67 72 61 6D 20 74 6F 6F\r
 R 00 00 02 00\r
-T 96 01 00 00 61 72 67 75 6D 65 6E 74 20 6C 69\r
+T 9E 01 00 00 20 62 69 67 00\r
 R 00 00 02 00\r
-T A1 01 00 00 73 74 20 74 6F 6F 20 6C 6F 6E 67\r
+T A3 01 00 00\r
 R 00 00 02 00\r
-T AC 01 00 00 00\r
+T A3 01 00 00 61 72 67 75 6D 65 6E 74 20 6C 69\r
 R 00 00 02 00\r
-T AD 01 00 00\r
+T AE 01 00 00 73 74 20 74 6F 6F 20 6C 6F 6E 67\r
 R 00 00 02 00\r
-T AD 01 00 00 6E 6F 74 20 66 6F 75 6E 64 00\r
+T B9 01 00 00 00\r
 R 00 00 02 00\r
-T B7 01 00 00\r
+T BA 01 00 00\r
 R 00 00 02 00\r
-T B7 01 00 00 63 61 6E 6E 6F 74 20 65 78 65 63\r
+T BA 01 00 00 6E 6F 74 20 66 6F 75 6E 64 00\r
 R 00 00 02 00\r
-T C2 01 00 00 75 74 65 00\r
+T C4 01 00 00\r
 R 00 00 02 00\r
-T C6 01 00 00\r
+T C4 01 00 00 63 61 6E 6E 6F 74 20 65 78 65 63\r
 R 00 00 02 00\r
-T C6 01 00 00 3A 20 6E 6F 20 68 6F 6D 65 20 64\r
+T CF 01 00 00 75 74 65 00\r
 R 00 00 02 00\r
-T D1 01 00 00 69 72 65 63 74 6F 72 79 00\r
+T D3 01 00 00\r
 R 00 00 02 00\r
-T DA 01 00 00\r
+T D3 01 00 00 3A 20 6E 6F 20 68 6F 6D 65 20 64\r
 R 00 00 02 00\r
-T DA 01 00 00 3A 20 62 61 64 20 64 69 72 65 63\r
+T DE 01 00 00 69 72 65 63 74 6F 72 79 00\r
 R 00 00 02 00\r
-T E5 01 00 00 74 6F 72 79 00\r
+T E7 01 00 00\r
 R 00 00 02 00\r
-T EA 01 00 00\r
+T E7 01 00 00 3A 20 62 61 64 20 64 69 72 65 63\r
 R 00 00 02 00\r
-T EA 01 00 00 63 64 00\r
+T F2 01 00 00 74 6F 72 79 00\r
 R 00 00 02 00\r
-T ED 01 00 00\r
+T F7 01 00 00\r
 R 00 00 02 00\r
-T ED 01 00 00 6E 6F 74 68 69 6E 67 20 74 6F 20\r
+T F7 01 00 00 63 64 00\r
 R 00 00 02 00\r
-T F8 01 00 00 73 68 69 66 74 00\r
+T FA 01 00 00\r
 R 00 00 02 00\r
-T FE 01 00 00\r
+T FA 01 00 00 6E 6F 74 68 69 6E 67 20 74 6F 20\r
 R 00 00 02 00\r
-T FE 01 00 00 23 00\r
+T 05 02 00 00 73 68 69 66 74 00\r
 R 00 00 02 00\r
-T 00 02 00 00\r
+T 0B 02 00 00\r
 R 00 00 02 00\r
-T 00 02 00 00 3A 00\r
+T 0B 02 00 00 23 00\r
 R 00 00 02 00\r
-T 02 02 00 00\r
+T 0D 02 00 00\r
 R 00 00 02 00\r
-T 02 02 00 00 3A 20 6E 6F 74 20 66 6F 75 6E 64\r
+T 0D 02 00 00 3A 00\r
 R 00 00 02 00\r
-T 0D 02 00 00 00\r
+T 0F 02 00 00\r
 R 00 00 02 00\r
-T 0E 02 00 00\r
+T 0F 02 00 00 3A 20 6E 6F 74 20 66 6F 75 6E 64\r
 R 00 00 02 00\r
-T 0E 02 00 00 55 73 61 67 65 3A 20 72 65 61 64\r
+T 1A 02 00 00 00\r
 R 00 00 02 00\r
-T 19 02 00 00 20 6E 61 6D 65 20 2E 2E 2E 00\r
+T 1B 02 00 00\r
 R 00 00 02 00\r
-T 23 02 00 00\r
+T 1B 02 00 00 55 73 61 67 65 3A 20 72 65 61 64\r
 R 00 00 02 00\r
-T 23 02 00 00 74 72 61 70 3A 20 62 61 64 20 73\r
+T 26 02 00 00 20 6E 61 6D 65 20 2E 2E 2E 00\r
 R 00 00 02 00\r
-T 2E 02 00 00 69 67 6E 61 6C 20 6E 75 6D 62 65\r
+T 30 02 00 00\r
 R 00 00 02 00\r
-T 39 02 00 00 72 00\r
+T 30 02 00 00 74 72 61 70 3A 20 62 61 64 20 73\r
 R 00 00 02 00\r
-T 3B 02 00 00\r
-R 00 00 02 00\r
-T 3B 02 00 00 3A 20 62 61 64 20 6E 75 6D 62 65\r
+T 3B 02 00 00 69 67 6E 61 6C 20 6E 75 6D 62 65\r
 R 00 00 02 00\r
 T 46 02 00 00 72 00\r
 R 00 00 02 00\r
 T 48 02 00 00\r
 R 00 00 02 00\r
-T 48 02 00 00 62 61 64 20 62 72 65 61 6B 2F 63\r
-R 00 00 02 00\r
-T 53 02 00 00 6F 6E 74 69 6E 75 65 20 6C 65 76\r
+T 48 02 00 00 3A 20 62 61 64 20 6E 75 6D 62 65\r
 R 00 00 02 00\r
-T 5E 02 00 00 65 6C 00\r
+T 53 02 00 00 72 00\r
 R 00 00 02 00\r
-T 61 02 00 00\r
+T 55 02 00 00\r
 R 00 00 02 00\r
-T 61 02 00 00 3A 20 62 61 64 20 69 64 65 6E 74\r
+T 55 02 00 00 62 61 64 20 62 72 65 61 6B 2F 63\r
 R 00 00 02 00\r
-T 6C 02 00 00 69 66 69 65 72 00\r
+T 60 02 00 00 6F 6E 74 69 6E 75 65 20 6C 65 76\r
 R 00 00 02 00\r
-T 72 02 00 00\r
+T 6B 02 00 00 65 6C 00\r
 R 00 00 02 00\r
-T 72 02 00 00 73 68 69 66 74 00\r
+T 6E 02 00 00\r
 R 00 00 02 00\r
-T 78 02 00 00\r
+T 6E 02 00 00 3A 20 62 61 64 20 69 64 65 6E 74\r
 R 00 00 02 00\r
-T 78 02 00 00 65 78 65 63 00\r
+T 79 02 00 00 69 66 69 65 72 00\r
 R 00 00 02 00\r
-T 7D 02 00 00\r
+T 7F 02 00 00\r
 R 00 00 02 00\r
-T 7D 02 00 00 77 61 69 74 00\r
+T 7F 02 00 00 73 68 69 66 74 00\r
 R 00 00 02 00\r
-T 82 02 00 00\r
+T 85 02 00 00\r
 R 00 00 02 00\r
-T 82 02 00 00 72 65 61 64 00\r
+T 85 02 00 00 65 78 65 63 00\r
 R 00 00 02 00\r
-T 87 02 00 00\r
+T 8A 02 00 00\r
 R 00 00 02 00\r
-T 87 02 00 00 65 76 61 6C 00\r
+T 8A 02 00 00 77 61 69 74 00\r
 R 00 00 02 00\r
-T 8C 02 00 00\r
+T 8F 02 00 00\r
 R 00 00 02 00\r
-T 8C 02 00 00 74 72 61 70 00\r
+T 8F 02 00 00 72 65 61 64 00\r
 R 00 00 02 00\r
-T 91 02 00 00\r
+T 94 02 00 00\r
 R 00 00 02 00\r
-T 91 02 00 00 62 72 65 61 6B 00\r
+T 94 02 00 00 65 76 61 6C 00\r
 R 00 00 02 00\r
-T 97 02 00 00\r
+T 99 02 00 00\r
 R 00 00 02 00\r
-T 97 02 00 00 63 6F 6E 74 69 6E 75 65 00\r
+T 99 02 00 00 74 72 61 70 00\r
 R 00 00 02 00\r
-T A0 02 00 00\r
+T 9E 02 00 00\r
 R 00 00 02 00\r
-T A0 02 00 00 65 78 69 74 00\r
+T 9E 02 00 00 62 72 65 61 6B 00\r
 R 00 00 02 00\r
-T A5 02 00 00\r
+T A4 02 00 00\r
 R 00 00 02 00\r
-T A5 02 00 00 65 78 70 6F 72 74 00\r
+T A4 02 00 00 63 6F 6E 74 69 6E 75 65 00\r
 R 00 00 02 00\r
-T AC 02 00 00\r
+T AD 02 00 00\r
 R 00 00 02 00\r
-T AC 02 00 00 72 65 61 64 6F 6E 6C 79 00\r
+T AD 02 00 00 65 78 69 74 00\r
 R 00 00 02 00\r
-T B5 02 00 00\r
+T B2 02 00 00\r
 R 00 00 02 00\r
-T B5 02 00 00 73 65 74 00\r
+T B2 02 00 00 65 78 70 6F 72 74 00\r
 R 00 00 02 00\r
 T B9 02 00 00\r
 R 00 00 02 00\r
-T B9 02 00 00 2E 00\r
+T B9 02 00 00 72 65 61 64 6F 6E 6C 79 00\r
 R 00 00 02 00\r
-T BB 02 00 00\r
+T C2 02 00 00\r
 R 00 00 02 00\r
-T BB 02 00 00 75 6D 61 73 6B 00\r
+T C2 02 00 00 73 65 74 00\r
 R 00 00 02 00\r
-T C1 02 00 00\r
+T C6 02 00 00\r
 R 00 00 02 00\r
-T C1 02 00 00 6C 6F 67 69 6E 00\r
+T C6 02 00 00 2E 00\r
 R 00 00 02 00\r
-T C7 02 00 00\r
+T C8 02 00 00\r
 R 00 00 02 00\r
-T C7 02 00 00 6E 65 77 67 72 70 00\r
+T C8 02 00 00 75 6D 61 73 6B 00\r
 R 00 00 02 00\r
 T CE 02 00 00\r
 R 00 00 02 00\r
-T CE 02 00 00 74 69 6D 65 73 00\r
+T CE 02 00 00 6C 6F 67 69 6E 00\r
+R 00 00 02 00\r
+T D4 02 00 00\r
+R 00 00 02 00\r
+T D4 02 00 00 6E 65 77 67 72 70 00\r
+R 00 00 02 00\r
+T DB 02 00 00\r
+R 00 00 02 00\r
+T DB 02 00 00 74 69 6D 65 73 00\r
 R 00 00 02 00\r
 T 00 00 00 00\r
 R 00 00 03 00\r
@@ -4219,43 +4223,43 @@ T 16 00 00 00 6B 00 00 00 78 00 00 00 00 00
 R 00 00 04 00 00 04 02 00 00 08 02 00\r
 T 1C 00 00 00 88 00 00 00 94 00 00 00\r
 R 00 00 04 00 00 04 02 00 00 08 02 00\r
-T 20 00 00 00 00 02 00 00 A1 15 00 00\r
+T 20 00 00 00 0D 02 00 00 A1 15 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 25 00 00 00 EA 01 00 00 A7 15 00 00\r
+T 25 00 00 00 F7 01 00 00 A7 15 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 2A 00 00 00 72 02 00 00 33 16 00 00\r
+T 2A 00 00 00 7F 02 00 00 33 16 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 2F 00 00 00 78 02 00 00 67 18 00 00\r
+T 2F 00 00 00 85 02 00 00 67 18 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 34 00 00 00 7D 02 00 00 6D 1A 00 00\r
+T 34 00 00 00 8A 02 00 00 6D 1A 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 39 00 00 00 82 02 00 00 D5 1A 00 00\r
+T 39 00 00 00 8F 02 00 00 D5 1A 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 3E 00 00 00 87 02 00 00 1A 1C 00 00\r
+T 3E 00 00 00 94 02 00 00 1A 1C 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 43 00 00 00 8C 02 00 00 40 1C 00 00\r
+T 43 00 00 00 99 02 00 00 40 1C 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 48 00 00 00 91 02 00 00 B5 1F 00 00\r
+T 48 00 00 00 9E 02 00 00 B5 1F 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 4D 00 00 00 97 02 00 00 CD 1F 00 00\r
+T 4D 00 00 00 A4 02 00 00 CD 1F 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 52 00 00 00 A0 02 00 00 83 20 00 00\r
+T 52 00 00 00 AD 02 00 00 83 20 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 57 00 00 00 A5 02 00 00 CC 20 00 00\r
+T 57 00 00 00 B2 02 00 00 CC 20 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 5C 00 00 00 AC 02 00 00 EE 20 00 00\r
+T 5C 00 00 00 B9 02 00 00 EE 20 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 61 00 00 00 B5 02 00 00 A4 21 00 00\r
+T 61 00 00 00 C2 02 00 00 A4 21 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 66 00 00 00 B9 02 00 00 29 19 00 00\r
+T 66 00 00 00 C6 02 00 00 29 19 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 6B 00 00 00 BB 02 00 00 84 17 00 00\r
+T 6B 00 00 00 C8 02 00 00 84 17 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 70 00 00 00 C1 02 00 00 E4 16 00 00\r
+T 70 00 00 00 CE 02 00 00 E4 16 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 75 00 00 00 C7 02 00 00 E4 16 00 00\r
+T 75 00 00 00 D4 02 00 00 E4 16 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
-T 7A 00 00 00 CE 02 00 00 0C 24 00 00 00 00 00\r
+T 7A 00 00 00 DB 02 00 00 0C 24 00 00 00 00 00\r
 R 00 00 04 00 00 04 02 00 48 08 01 00\r
 T 82 00 00 00 00 00\r
 R 00 00 04 00\r
index 006650c..619ac5a 100644 (file)
@@ -365,7 +365,11 @@ int quoted;
                return(0);\r
        if ((i = fork()) == -1) {\r
                closepipe(pf);\r
+#if 1 /* Nick */\r
+               err("can't fork - try again");\r
+#else\r
                err("try again");\r
+#endif\r
                return(0);\r
        }\r
        if (i != 0) {\r
@@ -481,6 +485,10 @@ register char *pp;
        struct dirent *de;\r
        char dname[NAME_MAX+1];\r
        struct stat dbuf;\r
+#if 1 /* Nick, preallocate buffers, as msh doesn't like sharing its heap */\r
+       DIR dir;\r
+       struct dirent dd;\r
+#endif\r
 \r
        for (np = we; np != pp; pp--)\r
                if (pp[-1] == '/')\r
@@ -492,14 +500,22 @@ register char *pp;
        for (gp = cp = space(strlen(pp)+1); *np && *np != '/';)\r
                *cp++ = *np++;\r
        *cp = '\0';\r
+#if 1 /* Nick, preallocate buffers, as msh doesn't like sharing its heap */\r
+       dirp = nick_opendir(dp, &dir, &dd);\r
+#else\r
        dirp = opendir(dp);\r
+#endif\r
        if (dirp == 0) {\r
                DELETE(dp);\r
                DELETE(gp);\r
                return;\r
        }\r
        dname[NAME_MAX] = '\0';\r
+#if 1 /* Nick, preallocate buffers, as msh doesn't like sharing its heap */\r
+       while ((de=nick_readdir(dirp))!=NULL) {\r
+#else\r
        while ((de=readdir(dirp))!=NULL) {\r
+#endif\r
                /* XXX Hmmm... What this could be? (abial) */\r
                /*\r
                if (ent[j].d_ino == 0)\r
@@ -523,7 +539,11 @@ register char *pp;
                                nl = addword(name, nl);\r
                        }\r
        }\r
+#if 1 /* Nick, preallocate buffers, as msh doesn't like sharing its heap */\r
+       nick_closedir(dirp);\r
+#else\r
        closedir(dirp);\r
+#endif\r
        DELETE(dp);\r
        DELETE(gp);\r
 }\r
index 3c570d2..7f41837 100644 (file)
@@ -23,16 +23,16 @@ S ?BANK_LEAVE_DIRECT_L08 Ref00000000
 S remap Ref00000000\r
 S prs Ref00000000\r
 S letnum Ref00000000\r
-S closedir Ref00000000\r
 S close Ref00000000\r
 S strlen Ref00000000\r
 S pushio Ref00000000\r
 S strcmp Ref00000000\r
+S nick_closedir Ref00000000\r
 S ?LEAVE_DIRECT_L09 Ref00000000\r
 S lookup Ref00000000\r
 S flag Ref00000000\r
-S readdir Ref00000000\r
 S dolchar Ref00000000\r
+S nick_readdir Ref00000000\r
 S openpipe Ref00000000\r
 S gflg Ref00000000\r
 S onecommand Ref00000000\r
@@ -51,11 +51,11 @@ S errpt Ref00000000
 S iostack Ref00000000\r
 S temparg Ref00000000\r
 S ?SS_CMP_L02 Ref00000000\r
-S opendir Ref00000000\r
 S vlist Ref00000000\r
 S fork Ref00000000\r
 S gravechar Ref00000000\r
 S gmatch Ref00000000\r
+S nick_opendir Ref00000000\r
 S dolv Ref00000000\r
 S ?US_DIV_L02 Ref00000000\r
 S ?CL64180B_4_06_L00 Ref00000000\r
@@ -72,23 +72,23 @@ S signal Ref00000000
 S .__.ABS. Def00000000\r
 S readc Ref00000000\r
 A _DEFAULT size 0 flags 0\r
-A CODE size 1A5B flags 0\r
+A CODE size 1A67 flags 0\r
 S evalstr Def0000022A\r
 S makenv Def000001A6\r
 S globname Def00001011\r
-S newword Def0000148D\r
+S newword Def00001499\r
 S unquote Def00000CF0\r
-S glob0 Def00001626\r
-S glob1 Def00001661\r
-S glob2 Def00001923\r
-S glob3 Def00001986\r
+S glob0 Def00001632\r
+S glob1 Def0000166D\r
+S glob2 Def0000192F\r
+S glob3 Def00001992\r
 S glob Def00000D2C\r
-S addword Def000014CA\r
+S addword Def000014D6\r
 S eval Def00000000\r
 S subgetc Def000006B6\r
-S getwords Def00001599\r
-S memcopy Def00001A10\r
-A CSTR size 92 flags 0\r
+S getwords Def000015A5\r
+S memcopy Def00001A1C\r
+A CSTR size 9F flags 0\r
 A UDATA0 size 9 flags 0\r
 S globv Def00000007\r
 S func Def00000004\r
@@ -188,7 +188,7 @@ T EB 00 00 00
 R 00 00 01 00\r
 T EB 00 00 00 DD 4E EE DD 46 EF 11 00 00 3E\r
 R 00 00 01 00\r
-T F5 00 00 00 CA 14 00 00 21 CA 14 00 00 CD\r
+T F5 00 00 00 D6 14 00 00 21 D6 14 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T FA 00 00 00 00 00 00 00 DD 75 EE DD 74 EF\r
 R 00 00 01 00 02 04 26 00\r
@@ -234,11 +234,11 @@ T 5D 01 00 00
 R 00 00 01 00\r
 T 5D 01 00 00 DD 4E EE DD 46 EF 11 00 00 3E\r
 R 00 00 01 00\r
-T 67 01 00 00 CA 14 00 00 21 CA 14 00 00 CD\r
+T 67 01 00 00 D6 14 00 00 21 D6 14 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T 6C 01 00 00 00 00 00 00 DD 75 EE DD 74 EF EB\r
 R 00 00 01 00 02 04 26 00\r
-T 75 01 00 00 3E 99 15 00 00 21 99 15 00 00 CD\r
+T 75 01 00 00 3E A5 15 00 00 21 A5 15 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 7B 01 00 00 00 00 00 00 DD 75 F0 DD 74 F1 3E\r
 R 00 00 01 00 02 04 26 00\r
@@ -269,7 +269,7 @@ R 00 00 01 00
 T A6 01 00 00 CD 00 00 00 00 FC FF AF DD 77 FC\r
 R 00 00 01 00 02 05 2D 00\r
 T AF 01 00 00 DD 77 FD 2A 00 00 00 00 DD 75 FE\r
-R 00 00 01 00 02 08 33 00\r
+R 00 00 01 00 02 08 32 00\r
 T B8 01 00 00 DD 74 FF\r
 R 00 00 01 00\r
 T BB 01 00 00\r
@@ -286,9 +286,9 @@ T D2 01 00 00
 R 00 00 01 00\r
 T D2 01 00 00 DD 4E FC DD 46 FD DD 6E FE DD 66\r
 R 00 00 01 00\r
-T DD 01 00 00 FF 23 23 5E 23 56 3E CA 14 00 00\r
+T DD 01 00 00 FF 23 23 5E 23 56 3E D6 14 00 00\r
 R 00 00 01 00 29 0B 01 00\r
-T E5 01 00 00 21 CA 14 00 00 CD 00 00 00 00 DD\r
+T E5 01 00 00 21 D6 14 00 00 CD 00 00 00 00 DD\r
 R 00 00 01 00 00 05 01 00 02 0A 26 00\r
 T EC 01 00 00 75 FC DD 74 FD\r
 R 00 00 01 00\r
@@ -302,11 +302,11 @@ T 07 02 00 00
 R 00 00 01 00\r
 T 07 02 00 00 DD 4E FC DD 46 FD 11 00 00 3E\r
 R 00 00 01 00\r
-T 11 02 00 00 CA 14 00 00 21 CA 14 00 00 CD\r
+T 11 02 00 00 D6 14 00 00 21 D6 14 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T 16 02 00 00 00 00 00 00 DD 75 FC DD 74 FD EB\r
 R 00 00 01 00 02 04 26 00\r
-T 1F 02 00 00 3E 99 15 00 00 21 99 15 00 00 CD\r
+T 1F 02 00 00 3E A5 15 00 00 21 A5 15 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 25 02 00 00 00 00 00 00 C3 00 00 00 00\r
 R 00 00 01 00 02 04 26 00 02 09 12 00\r
@@ -422,9 +422,9 @@ T 35 03 00 00
 R 00 00 01 00\r
 T 35 03 00 00 DD 6E 04 DD 66 05 4E 23 46 DD 5E\r
 R 00 00 01 00\r
-T 40 03 00 00 02 DD 56 03 3E CA 14 00 00 21\r
+T 40 03 00 00 02 DD 56 03 3E D6 14 00 00 21\r
 R 00 00 01 00 29 09 01 00\r
-T 47 03 00 00 CA 14 00 00 CD 00 00 00 00 E5 DD\r
+T 47 03 00 00 D6 14 00 00 CD 00 00 00 00 E5 DD\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
 T 4E 03 00 00 6E 04 DD 66 05 C1 71 23 70 21\r
 R 00 00 01 00\r
@@ -449,9 +449,9 @@ R 00 00 01 00 02 0B 30 00
 T 84 03 00 00 0E 00 00 00 00 C5 21 00 00 00 00\r
 R 00 00 01 00 2B 05 3A 00 02 0B 3A 00\r
 T 8A 03 00 00 E5 11 00 00 00 00 3E 00 00 00 00\r
-R 00 00 01 00 02 06 30 00 2B 0B 19 00\r
+R 00 00 01 00 02 06 30 00 2B 0B 18 00\r
 T 90 03 00 00 21 00 00 00 00 CD 00 00 00 00 E1\r
-R 00 00 01 00 02 05 19 00 02 0A 26 00\r
+R 00 00 01 00 02 05 18 00 02 0A 26 00\r
 T 97 03 00 00 E1 2A 04 00 00 00 22 02 00 00 00\r
 R 00 00 01 00 02 06 07 00 02 0B 07 00\r
 T 9E 03 00 00\r
@@ -496,9 +496,9 @@ T FD 03 00 00
 R 00 00 01 00\r
 T FD 03 00 00 DD 6E 04 DD 66 05 4E 23 46 DD 5E\r
 R 00 00 01 00\r
-T 08 04 00 00 02 DD 56 03 3E CA 14 00 00 21\r
+T 08 04 00 00 02 DD 56 03 3E D6 14 00 00 21\r
 R 00 00 01 00 29 09 01 00\r
-T 0F 04 00 00 CA 14 00 00 CD 00 00 00 00 E5 DD\r
+T 0F 04 00 00 D6 14 00 00 CD 00 00 00 00 E5 DD\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
 T 16 04 00 00 6E 04 DD 66 05 C1 71 23 70 18 22\r
 R 00 00 01 00\r
@@ -1117,11 +1117,11 @@ R 00 00 01 00 02 0B 07 00
 T 17 09 00 00 2A 00 00 00 00 23 23 22\r
 R 00 00 01 00 02 05 37 00\r
 T 1D 09 00 00 02 00 00 00 0E 00 00 00 00 C5 21\r
-R 00 00 01 00 02 04 30 00 2B 09 1F 00\r
+R 00 00 01 00 02 04 30 00 2B 09 1E 00\r
 T 23 09 00 00 00 00 00 00 E5 11 00 00 00 00 3E\r
-R 00 00 01 00 02 04 1F 00 02 0A 30 00\r
+R 00 00 01 00 02 04 1E 00 02 0A 30 00\r
 T 2A 09 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 19 00 02 09 19 00\r
+R 00 00 01 00 2B 04 18 00 02 09 18 00\r
 T 2F 09 00 00 00 00 00 00 E1 E1 21 00 00 C3\r
 R 00 00 01 00 02 04 26 00\r
 T 37 09 00 00 B2 0A 00 00\r
@@ -1273,7 +1273,7 @@ R 00 00 01 00
 T 9F 0A 00 00 4F C5 E5 11 00 00 00 00 3E\r
 R 00 00 01 00 02 08 30 00\r
 T A6 0A 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 19 00 02 09 19 00\r
+R 00 00 01 00 2B 04 18 00 02 09 18 00\r
 T AB 0A 00 00 00 00 00 00 E1 E1 21 00 00\r
 R 00 00 01 00 02 04 26 00\r
 T B2 0A 00 00\r
@@ -1327,7 +1327,7 @@ R 00 00 01 00 00 08 01 00
 T 16 0B 00 00\r
 R 00 00 01 00\r
 T 16 0B 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 34 00 02 0A 34 00\r
+R 00 00 01 00 2B 05 33 00 02 0A 33 00\r
 T 1C 0B 00 00 00 00 00 00 DD 75 FA DD 74 FB 7D\r
 R 00 00 01 00 02 04 26 00\r
 T 25 0B 00 00 A4 3C 20 1F\r
@@ -1357,7 +1357,7 @@ R 00 00 01 00
 T 64 0B 00 00 DD 70 F9 71 23 70 DD 5E FE DD 56\r
 R 00 00 01 00\r
 T 6F 0B 00 00 FF 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 06 17 00 02 0B 17 00\r
+R 00 00 01 00 2B 06 16 00 02 0B 16 00\r
 T 75 0B 00 00 CD 00 00 00 00 DD 5E FC DD 56 FD\r
 R 00 00 01 00 02 05 26 00\r
 T 7E 0B 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
@@ -1371,13 +1371,13 @@ R 00 00 01 00 02 05 29 00
 T 98 0B 00 00\r
 R 00 00 01 00\r
 T 98 0B 00 00 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 05 35 00 02 0A 35 00\r
+R 00 00 01 00 2B 05 34 00 02 0A 34 00\r
 T 9D 0B 00 00\r
 R 00 00 01 00\r
 T 9D 0B 00 00 4F C5 E5 11 00 00 00 00 3E\r
 R 00 00 01 00 02 08 30 00\r
 T A4 0B 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 19 00 02 09 19 00\r
+R 00 00 01 00 2B 04 18 00 02 09 18 00\r
 T A9 0B 00 00 00 00 00 00 E1 E1 21 01 00 C3\r
 R 00 00 01 00 02 04 26 00\r
 T B1 0B 00 00 ED 0C 00 00\r
@@ -1479,9 +1479,9 @@ R 00 00 01 00 02 07 30 00
 T C7 0C 00 00 00 00 00 00 C5 21 00 00 00 00 E5\r
 R 00 00 01 00 2B 04 3B 00 02 0A 3B 00\r
 T CD 0C 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 02 05 30 00 2B 0A 19 00\r
+R 00 00 01 00 02 05 30 00 2B 0A 18 00\r
 T D3 0C 00 00 00 00 00 00 CD 00 00 00 00 E1 E1\r
-R 00 00 01 00 02 04 19 00 02 09 26 00\r
+R 00 00 01 00 02 04 18 00 02 09 26 00\r
 T DA 0C 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 05 22 00 02 0A 22 00\r
 T E0 0C 00 00 00 00 00 00 11 01 00 3E\r
@@ -1594,13 +1594,13 @@ T C2 0D 00 00 5E 02 DD 56 03 3E 00 00 00 00 21
 R 00 00 01 00 2B 0A 04 00\r
 T CA 0D 00 00 00 00 00 00 CD 00 00 00 00 EB 3E\r
 R 00 00 01 00 02 04 04 00 02 09 26 00\r
-T D1 0D 00 00 CA 14 00 00 21 CA 14 00 00 C1 CD\r
+T D1 0D 00 00 D6 14 00 00 21 D6 14 00 00 C1 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T D7 0D 00 00 00 00 00 00 22 00 00 00 00\r
 R 00 00 01 00 02 04 26 00 00 09 03 00\r
 T DC 0D 00 00\r
 R 00 00 01 00\r
-T DC 0D 00 00 ED 5B 00 00 00 00 CD 0D 14 00 00\r
+T DC 0D 00 00 ED 5B 00 00 00 00 CD 19 14 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 01 00\r
 T E3 0D 00 00 7D B4 CA 1C 0F 00 00\r
 R 00 00 01 00 00 07 01 00\r
@@ -1608,9 +1608,9 @@ T E8 0D 00 00
 R 00 00 01 00\r
 T E8 0D 00 00 2A 00 00 00 00 23 23 46 23 66 68\r
 R 00 00 01 00 00 05 03 00\r
-T F1 0D 00 00 29 EB 3E 8D 14 00 00 21\r
+T F1 0D 00 00 29 EB 3E 99 14 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T F6 0D 00 00 8D 14 00 00 CD 00 00 00 00 22\r
+T F6 0D 00 00 99 14 00 00 CD 00 00 00 00 22\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
 T FC 0D 00 00 02 00 00 00 AF DD 77 FC DD 77 FD\r
 R 00 00 01 00 00 04 03 00\r
@@ -1680,7 +1680,7 @@ T A5 0E 00 00 5E 23 56 3E 00 00 00 00 21
 R 00 00 01 00 2B 08 04 00\r
 T AB 0E 00 00 00 00 00 00 CD 00 00 00 00 EB 3E\r
 R 00 00 01 00 02 04 04 00 02 09 26 00\r
-T B2 0E 00 00 CA 14 00 00 21 CA 14 00 00 C1 CD\r
+T B2 0E 00 00 D6 14 00 00 21 D6 14 00 00 C1 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T B8 0E 00 00 00 00 00 00 22 02 00 00 00\r
 R 00 00 01 00 02 04 26 00 00 09 03 00\r
@@ -1760,15 +1760,15 @@ T 59 0F 00 00 18 C8
 R 00 00 01 00\r
 T 5B 0F 00 00\r
 R 00 00 01 00\r
-T 5B 0F 00 00 0E 76 14 00 00 C5 21 76 14 00 00\r
+T 5B 0F 00 00 0E 82 14 00 00 C5 21 82 14 00 00\r
 R 00 00 01 00 29 05 01 00 00 0B 01 00\r
 T 61 0F 00 00 E5 21 02 00 E5 2A 00 00 00 00 23\r
 R 00 00 01 00 00 0A 03 00\r
 T 6A 0F 00 00 23 4E 23 46 21 04 00 ED 5B\r
 R 00 00 01 00\r
-T 73 0F 00 00 00 00 00 00 19 EB 3E 26 16 00 00\r
+T 73 0F 00 00 00 00 00 00 19 EB 3E 32 16 00 00\r
 R 00 00 01 00 00 04 03 00 29 0B 01 00\r
-T 79 0F 00 00 21 26 16 00 00 CD 00 00 00 00 E1\r
+T 79 0F 00 00 21 32 16 00 00 CD 00 00 00 00 E1\r
 R 00 00 01 00 00 05 01 00 02 0A 26 00\r
 T 80 0F 00 00 E1 E1 2A 00 00 00 00 23 23 7E 23\r
 R 00 00 01 00 00 07 03 00\r
@@ -1792,9 +1792,9 @@ T A6 0F 00 00 DD 4E 04 DD 46 05 DD 6E FC DD 66
 R 00 00 01 00\r
 T B1 0F 00 00 FD 29 ED 5B 00 00 00 00 19 11\r
 R 00 00 01 00 00 08 03 00\r
-T B9 0F 00 00 04 00 19 5E 23 56 3E CA 14 00 00\r
+T B9 0F 00 00 04 00 19 5E 23 56 3E D6 14 00 00\r
 R 00 00 01 00 29 0B 01 00\r
-T C1 0F 00 00 21 CA 14 00 00 CD 00 00 00 00 DD\r
+T C1 0F 00 00 21 D6 14 00 00 CD 00 00 00 00 DD\r
 R 00 00 01 00 00 05 01 00 02 0A 26 00\r
 T C8 0F 00 00 75 04 DD 74 05 DD 34 FC 20 03 DD\r
 R 00 00 01 00\r
@@ -1820,9 +1820,9 @@ T EB 0F 00 00 DD 4E 04 DD 46 05 DD 5E 02 DD 56
 R 00 00 01 00\r
 T F6 0F 00 00 03 3E F0 0C 00 00 21 F0 0C 00 00\r
 R 00 00 01 00 29 06 01 00 00 0B 01 00\r
-T FC 0F 00 00 CD 00 00 00 00 EB 3E CA 14 00 00\r
+T FC 0F 00 00 CD 00 00 00 00 EB 3E D6 14 00 00\r
 R 00 00 01 00 02 05 26 00 29 0B 01 00\r
-T 02 10 00 00 21 CA 14 00 00 CD 00 00 00 00 DD\r
+T 02 10 00 00 21 D6 14 00 00 CD 00 00 00 00 DD\r
 R 00 00 01 00 00 05 01 00 02 0A 26 00\r
 T 09 10 00 00 75 04 DD 74 05\r
 R 00 00 01 00\r
@@ -1832,7 +1832,7 @@ T 0E 10 00 00 C3 00 00 00 00
 R 00 00 01 00 02 05 12 00\r
 T 11 10 00 00\r
 R 00 00 01 00\r
-T 11 10 00 00 CD 00 00 00 00 CC FE 21 00 00 39\r
+T 11 10 00 00 CD 00 00 00 00 AE FE 21 00 00 39\r
 R 00 00 01 00 02 05 2D 00\r
 T 1A 10 00 00 DD 5E 02 DD 56 03 73 23 72\r
 R 00 00 01 00\r
@@ -1897,7 +1897,7 @@ R 00 00 01 00
 T D5 10 00 00 04 00 39 E5 DD 5E 04 DD 56 05 3E\r
 R 00 00 01 00\r
 T E0 10 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 18 00 02 09 18 00\r
+R 00 00 01 00 2B 04 17 00 02 09 17 00\r
 T E5 10 00 00 00 00 00 00 EB 13 3E 00 00 00 00\r
 R 00 00 01 00 02 04 26 00 2B 0B 09 00\r
 T EB 10 00 00 21 00 00 00 00 CD 00 00 00 00 4D\r
@@ -1928,779 +1928,781 @@ T 32 11 00 00
 R 00 00 01 00\r
 T 32 11 00 00 21 02 00 39 7E 23 66 6F 36 00 21\r
 R 00 00 01 00\r
-T 3D 11 00 00 12 00 39 E5 21 0A 00 39 5E 23 56\r
+T 3D 11 00 00 12 00 39 E5 21 3E 01 39 E5 21\r
 R 00 00 01 00\r
-T 48 11 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 32 00 02 0A 32 00\r
-T 4E 11 00 00 00 00 00 00 4D 44 E1 71 23 70 21\r
-R 00 00 01 00 02 04 26 00\r
-T 57 11 00 00 12 00 39 7E 23 B6 20 21\r
+T 47 11 00 00 38 01 39 4D 44 21 0C 00 39 5E 23\r
+R 00 00 01 00\r
+T 52 11 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 36 00 02 0B 36 00\r
+T 58 11 00 00 CD 00 00 00 00 F1 4D 44 E1 71 23\r
+R 00 00 01 00 02 05 26 00\r
+T 61 11 00 00 70 21 12 00 39 7E 23 B6 20 21\r
 R 00 00 01 00\r
-T 5F 11 00 00\r
+T 6B 11 00 00\r
 R 00 00 01 00\r
-T 5F 11 00 00 21 08 00 39 5E 23 56 3E\r
+T 6B 11 00 00 21 08 00 39 5E 23 56 3E\r
 R 00 00 01 00\r
-T 67 11 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T 73 11 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 01 00 02 09 01 00\r
-T 6C 11 00 00 00 00 00 00 21 06 00 39 5E 23 56\r
+T 78 11 00 00 00 00 00 00 21 06 00 39 5E 23 56\r
 R 00 00 01 00 02 04 26 00\r
-T 75 11 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+T 81 11 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 05 01 00 02 0A 01 00\r
-T 7B 11 00 00 00 00 00 00 C3 0B 13 00 00\r
+T 87 11 00 00 00 00 00 00 C3 17 13 00 00\r
 R 00 00 01 00 02 04 26 00 00 09 01 00\r
-T 80 11 00 00\r
+T 8C 11 00 00\r
 R 00 00 01 00\r
-T 80 11 00 00 DD 36 E1 00\r
+T 8C 11 00 00 DD 36 C3 00\r
 R 00 00 01 00\r
-T 84 11 00 00\r
+T 90 11 00 00\r
 R 00 00 01 00\r
-T 84 11 00 00 21 14 00 39 E5 21 14 00 39 5E 23\r
+T 90 11 00 00 21 14 00 39 E5 21 14 00 39 5E 23\r
 R 00 00 01 00\r
-T 8F 11 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 06 1E 00 02 0B 1E 00\r
-T 95 11 00 00 CD 00 00 00 00 4D 44 E1 71 23 70\r
+T 9B 11 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 1F 00 02 0B 1F 00\r
+T A1 11 00 00 CD 00 00 00 00 4D 44 E1 71 23 70\r
 R 00 00 01 00 02 05 26 00\r
-T 9E 11 00 00 79 B0 CA DE 12 00 00\r
+T AA 11 00 00 79 B0 CA EA 12 00 00\r
 R 00 00 01 00 00 07 01 00\r
-T A3 11 00 00\r
+T AF 11 00 00\r
 R 00 00 01 00\r
-T A3 11 00 00 21 FF 00 E5 21 06 00 E5 21 18 00\r
+T AF 11 00 00 21 FF 00 E5 21 06 00 E5 21 18 00\r
 R 00 00 01 00\r
-T AE 11 00 00 39 4E 23 46 E1 09 4D 44 21 18 00\r
+T BA 11 00 00 39 4E 23 46 E1 09 4D 44 21 18 00\r
 R 00 00 01 00\r
-T B9 11 00 00 39 5D 54 3E 00 00 00 00 21\r
+T C5 11 00 00 39 5D 54 3E 00 00 00 00 21\r
 R 00 00 01 00 2B 08 0F 00\r
-T BF 11 00 00 00 00 00 00 CD 00 00 00 00 F1 21\r
+T CB 11 00 00 00 00 00 00 CD 00 00 00 00 F1 21\r
 R 00 00 01 00 02 04 0F 00 02 09 26 00\r
-T C6 11 00 00 16 00 39 7E FE 2E 20 0F\r
+T D2 11 00 00 16 00 39 7E FE 2E 20 0F\r
 R 00 00 01 00\r
-T CE 11 00 00\r
+T DA 11 00 00\r
 R 00 00 01 00\r
-T CE 11 00 00 21 06 00 39 7E 23 66 6F 7E FE 2E\r
+T DA 11 00 00 21 06 00 39 7E 23 66 6F 7E FE 2E\r
 R 00 00 01 00\r
-T D9 11 00 00 28 02\r
+T E5 11 00 00 28 02\r
 R 00 00 01 00\r
-T DB 11 00 00\r
+T E7 11 00 00\r
 R 00 00 01 00\r
-T DB 11 00 00 18 A7\r
+T E7 11 00 00 18 A7\r
 R 00 00 01 00\r
-T DD 11 00 00\r
+T E9 11 00 00\r
 R 00 00 01 00\r
-T DD 11 00 00\r
+T E9 11 00 00\r
 R 00 00 01 00\r
-T DD 11 00 00 21 10 00 39 AF 77 23 77\r
+T E9 11 00 00 21 10 00 39 AF 77 23 77\r
 R 00 00 01 00\r
-T E5 11 00 00\r
+T F1 11 00 00\r
 R 00 00 01 00\r
-T E5 11 00 00 01 FF 80 21 10 00 39 56 23 66 6A\r
+T F1 11 00 00 01 FF 80 21 10 00 39 56 23 66 6A\r
 R 00 00 01 00\r
-T F0 11 00 00 3E 80 AC 67 ED 42 30 3D\r
+T FC 11 00 00 3E 80 AC 67 ED 42 30 3D\r
 R 00 00 01 00\r
-T F8 11 00 00\r
+T 04 12 00 00\r
 R 00 00 01 00\r
-T F8 11 00 00 01 00 00 00 00 21 16 00 39 E5 21\r
+T 04 12 00 00 01 00 00 00 00 21 16 00 39 E5 21\r
 R 00 00 01 00 00 05 04 00\r
-T 01 12 00 00 12 00 39 5E 23 56 E1 19 5E 16 00\r
+T 0D 12 00 00 12 00 39 5E 23 56 E1 19 5E 16 00\r
 R 00 00 01 00\r
-T 0C 12 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+T 18 12 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 05 05 00 02 0A 05 00\r
-T 12 12 00 00 00 00 00 00 7D B4 28 12\r
+T 1E 12 00 00 00 00 00 00 7D B4 28 12\r
 R 00 00 01 00 02 04 26 00\r
-T 18 12 00 00\r
+T 24 12 00 00\r
 R 00 00 01 00\r
-T 18 12 00 00 21 16 00 39 E5 21 12 00 39 4E 23\r
+T 24 12 00 00 21 16 00 39 E5 21 12 00 39 4E 23\r
 R 00 00 01 00\r
-T 23 12 00 00 46 E1 09 7E F6 80 77\r
+T 2F 12 00 00 46 E1 09 7E F6 80 77\r
 R 00 00 01 00\r
-T 2A 12 00 00\r
+T 36 12 00 00\r
 R 00 00 01 00\r
-T 2A 12 00 00 21 10 00 39 34 23 20 01 34\r
+T 36 12 00 00 21 10 00 39 34 23 20 01 34\r
 R 00 00 01 00\r
-T 33 12 00 00\r
+T 3F 12 00 00\r
 R 00 00 01 00\r
-T 33 12 00 00 18 B0\r
+T 3F 12 00 00 18 B0\r
 R 00 00 01 00\r
-T 35 12 00 00\r
+T 41 12 00 00\r
 R 00 00 01 00\r
-T 35 12 00 00 21 06 00 39 4E 23 46 21 16 00 39\r
+T 41 12 00 00 21 06 00 39 4E 23 46 21 16 00 39\r
 R 00 00 01 00\r
-T 40 12 00 00 5D 54 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 36 00\r
-T 45 12 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
-R 00 00 01 00 02 04 36 00 02 09 26 00\r
-T 4C 12 00 00 CA DB 12 00 00\r
+T 4C 12 00 00 5D 54 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 35 00\r
+T 51 12 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 02 04 35 00 02 09 26 00\r
+T 58 12 00 00 CA E7 12 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 4F 12 00 00\r
+T 5B 12 00 00\r
 R 00 00 01 00\r
-T 4F 12 00 00 21 04 00 39 E5 21 02 00 39 4E 23\r
+T 5B 12 00 00 21 04 00 39 E5 21 02 00 39 4E 23\r
 R 00 00 01 00\r
-T 5A 12 00 00 46 C5 21 1A 00 39 E5 DD 4E 04 DD\r
+T 66 12 00 00 46 C5 21 1A 00 39 E5 DD 4E 04 DD\r
 R 00 00 01 00\r
-T 65 12 00 00 46 05 DD 5E 02 DD 56 03 CD\r
+T 71 12 00 00 46 05 DD 5E 02 DD 56 03 CD\r
 R 00 00 01 00\r
-T 6E 12 00 00 0E 13 00 00 F1 F1 4D 44 E1 71 23\r
+T 7A 12 00 00 1A 13 00 00 F1 F1 4D 44 E1 71 23\r
 R 00 00 01 00 00 04 01 00\r
-T 77 12 00 00 70 21 00 00 39 7E 23 66 6F AF B6\r
+T 83 12 00 00 70 21 00 00 39 7E 23 66 6F AF B6\r
 R 00 00 01 00\r
-T 82 12 00 00 28 41 01 00 00 00 00 21 00 00 39\r
+T 8E 12 00 00 28 41 01 00 00 00 00 21 00 00 39\r
 R 00 00 01 00 00 07 04 00\r
-T 8B 12 00 00 5E 23 56 3E 00 00 00 00 21\r
+T 97 12 00 00 5E 23 56 3E 00 00 00 00 21\r
 R 00 00 01 00 2B 08 40 00\r
-T 91 12 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+T 9D 12 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
 R 00 00 01 00 02 04 40 00 02 09 26 00\r
-T 98 12 00 00 20 2B\r
+T A4 12 00 00 20 2B\r
 R 00 00 01 00\r
-T 9A 12 00 00\r
+T A6 12 00 00\r
 R 00 00 01 00\r
-T 9A 12 00 00\r
+T A6 12 00 00\r
 R 00 00 01 00\r
-T 9A 12 00 00\r
+T A6 12 00 00\r
 R 00 00 01 00\r
-T 9A 12 00 00 21 16 01 39 4D 44 21 04 00 39 5E\r
+T A6 12 00 00 21 16 01 39 4D 44 21 04 00 39 5E\r
 R 00 00 01 00\r
-T A5 12 00 00 23 56 3E 00 00 00 00 21\r
+T B1 12 00 00 23 56 3E 00 00 00 00 21\r
 R 00 00 01 00 2B 07 41 00\r
-T AA 12 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+T B6 12 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
 R 00 00 01 00 02 04 41 00 02 09 26 00\r
-T B1 12 00 00 28 12\r
+T BD 12 00 00 28 12\r
 R 00 00 01 00\r
-T B3 12 00 00\r
+T BF 12 00 00\r
 R 00 00 01 00\r
-T B3 12 00 00 21 04 00 39 5E 23 56 3E\r
+T BF 12 00 00 21 04 00 39 5E 23 56 3E\r
 R 00 00 01 00\r
-T BB 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T C7 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 01 00 02 09 01 00\r
-T C0 12 00 00 00 00 00 00 C3 84 11 00 00\r
+T CC 12 00 00 00 00 00 00 C3 90 11 00 00\r
 R 00 00 01 00 02 04 26 00 00 09 01 00\r
-T C5 12 00 00\r
+T D1 12 00 00\r
 R 00 00 01 00\r
-T C5 12 00 00\r
+T D1 12 00 00\r
 R 00 00 01 00\r
-T C5 12 00 00 ED 4B 02 00 00 00 21 04 00 39 5E\r
+T D1 12 00 00 ED 4B 02 00 00 00 21 04 00 39 5E\r
 R 00 00 01 00 00 06 03 00\r
-T CE 12 00 00 23 56 3E CA 14 00 00 21\r
+T DA 12 00 00 23 56 3E D6 14 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T D3 12 00 00 CA 14 00 00 CD 00 00 00 00 22\r
+T DF 12 00 00 D6 14 00 00 CD 00 00 00 00 22\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
-T D9 12 00 00 02 00 00 00\r
+T E5 12 00 00 02 00 00 00\r
 R 00 00 01 00 00 04 03 00\r
-T DB 12 00 00\r
+T E7 12 00 00\r
 R 00 00 01 00\r
-T DB 12 00 00 C3 84 11 00 00\r
+T E7 12 00 00 C3 90 11 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T DE 12 00 00\r
+T EA 12 00 00\r
 R 00 00 01 00\r
-T DE 12 00 00 21 12 00 39 5E 23 56 3E\r
+T EA 12 00 00 21 12 00 39 5E 23 56 3E\r
 R 00 00 01 00\r
-T E6 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 16 00 02 09 16 00\r
-T EB 12 00 00 00 00 00 00 21 08 00 39 5E 23 56\r
+T F2 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 1A 00 02 09 1A 00\r
+T F7 12 00 00 00 00 00 00 21 08 00 39 5E 23 56\r
 R 00 00 01 00 02 04 26 00\r
-T F4 12 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+T 00 13 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 05 01 00 02 0A 01 00\r
-T FA 12 00 00 00 00 00 00 21 06 00 39 5E 23 56\r
+T 06 13 00 00 00 00 00 00 21 06 00 39 5E 23 56\r
 R 00 00 01 00 02 04 26 00\r
-T 03 13 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+T 0F 13 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 05 01 00 02 0A 01 00\r
-T 09 13 00 00 00 00 00 00\r
+T 15 13 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 26 00\r
-T 0B 13 00 00\r
+T 17 13 00 00\r
 R 00 00 01 00\r
-T 0B 13 00 00 C3 00 00 00 00\r
+T 17 13 00 00 C3 00 00 00 00\r
 R 00 00 01 00 02 05 12 00\r
-T 0E 13 00 00\r
+T 1A 13 00 00\r
 R 00 00 01 00\r
-T 0E 13 00 00 CD 00 00 00 00 FA FF DD 5E 0A DD\r
+T 1A 13 00 00 CD 00 00 00 00 FA FF DD 5E 0A DD\r
 R 00 00 01 00 02 05 2D 00\r
-T 17 13 00 00 56 0B 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 18 00\r
-T 1C 13 00 00 00 00 00 00 CD 00 00 00 00 E5 DD\r
-R 00 00 01 00 02 04 18 00 02 09 26 00\r
-T 23 13 00 00 5E 08 DD 56 09 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 0A 18 00\r
-T 2B 13 00 00 00 00 00 00 CD 00 00 00 00 EB E1\r
-R 00 00 01 00 02 04 18 00 02 09 26 00\r
-T 32 13 00 00 19 E5 DD 5E 02 DD 56 03 69 60 A7\r
-R 00 00 01 00\r
-T 3D 13 00 00 ED 52 4D 44 E1 09 EB 13 13 3E\r
-R 00 00 01 00\r
-T 47 13 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T 23 13 00 00 56 0B 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 17 00\r
+T 28 13 00 00 00 00 00 00 CD 00 00 00 00 E5 DD\r
+R 00 00 01 00 02 04 17 00 02 09 26 00\r
+T 2F 13 00 00 5E 08 DD 56 09 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 17 00\r
+T 37 13 00 00 00 00 00 00 CD 00 00 00 00 EB E1\r
+R 00 00 01 00 02 04 17 00 02 09 26 00\r
+T 3E 13 00 00 19 E5 DD 5E 02 DD 56 03 69 60 A7\r
+R 00 00 01 00\r
+T 49 13 00 00 ED 52 4D 44 E1 09 EB 13 13 3E\r
+R 00 00 01 00\r
+T 53 13 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 09 00 02 09 09 00\r
-T 4C 13 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
+T 58 13 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
 R 00 00 01 00 02 04 26 00\r
-T 55 13 00 00 75 FA DD 74 FB DD 6E 02 DD 66 03\r
+T 61 13 00 00 75 FA DD 74 FB DD 6E 02 DD 66 03\r
 R 00 00 01 00\r
-T 60 13 00 00 DD 75 FE DD 74 FF\r
+T 6C 13 00 00 DD 75 FE DD 74 FF\r
 R 00 00 01 00\r
-T 66 13 00 00\r
+T 72 13 00 00\r
 R 00 00 01 00\r
-T 66 13 00 00 DD 6E 04 DD 66 05 DD 4E FE DD 46\r
+T 72 13 00 00 DD 6E 04 DD 66 05 DD 4E FE DD 46\r
 R 00 00 01 00\r
-T 71 13 00 00 FF A7 ED 42 28 20\r
+T 7D 13 00 00 FF A7 ED 42 28 20\r
 R 00 00 01 00\r
-T 77 13 00 00\r
+T 83 13 00 00\r
 R 00 00 01 00\r
-T 77 13 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
+T 83 13 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
 R 00 00 01 00\r
-T 82 13 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 23\r
+T 8E 13 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 23\r
 R 00 00 01 00\r
-T 8D 13 00 00 DD 75 FC DD 74 FD 2B 70 18 CF\r
+T 99 13 00 00 DD 75 FC DD 74 FD 2B 70 18 CF\r
 R 00 00 01 00\r
-T 97 13 00 00\r
+T A3 13 00 00\r
 R 00 00 01 00\r
-T 97 13 00 00 DD 6E 08 DD 66 09 DD 75 FE DD 74\r
+T A3 13 00 00 DD 6E 08 DD 66 09 DD 75 FE DD 74\r
 R 00 00 01 00\r
-T A2 13 00 00 FF\r
+T AE 13 00 00 FF\r
 R 00 00 01 00\r
-T A3 13 00 00\r
+T AF 13 00 00\r
 R 00 00 01 00\r
-T A3 13 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
+T AF 13 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
 R 00 00 01 00\r
-T AE 13 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 23\r
+T BA 13 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 23\r
 R 00 00 01 00\r
-T B9 13 00 00 DD 75 FC DD 74 FD 2B 70 04 05 28\r
+T C5 13 00 00 DD 75 FC DD 74 FD 2B 70 04 05 28\r
 R 00 00 01 00\r
-T C4 13 00 00 02\r
+T D0 13 00 00 02\r
 R 00 00 01 00\r
-T C5 13 00 00\r
+T D1 13 00 00\r
 R 00 00 01 00\r
-T C5 13 00 00 18 DC\r
+T D1 13 00 00 18 DC\r
 R 00 00 01 00\r
-T C7 13 00 00\r
+T D3 13 00 00\r
 R 00 00 01 00\r
-T C7 13 00 00 DD 6E FC DD 66 FD 2B DD 75 FC DD\r
+T D3 13 00 00 DD 6E FC DD 66 FD 2B DD 75 FC DD\r
 R 00 00 01 00\r
-T D2 13 00 00 74 FD DD 6E 0A DD 66 0B DD 75 FE\r
+T DE 13 00 00 74 FD DD 6E 0A DD 66 0B DD 75 FE\r
 R 00 00 01 00\r
-T DD 13 00 00 DD 74 FF\r
+T E9 13 00 00 DD 74 FF\r
 R 00 00 01 00\r
-T E0 13 00 00\r
+T EC 13 00 00\r
 R 00 00 01 00\r
-T E0 13 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
+T EC 13 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
 R 00 00 01 00\r
-T EB 13 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 23\r
+T F7 13 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 23\r
 R 00 00 01 00\r
-T F6 13 00 00 DD 75 FC DD 74 FD 2B 70 04 05 28\r
+T 02 14 00 00 DD 75 FC DD 74 FD 2B 70 04 05 28\r
 R 00 00 01 00\r
-T 01 14 00 00 02\r
+T 0D 14 00 00 02\r
 R 00 00 01 00\r
-T 02 14 00 00\r
+T 0E 14 00 00\r
 R 00 00 01 00\r
-T 02 14 00 00 18 DC\r
+T 0E 14 00 00 18 DC\r
 R 00 00 01 00\r
-T 04 14 00 00\r
+T 10 14 00 00\r
 R 00 00 01 00\r
-T 04 14 00 00 DD 6E FA DD 66 FB C3 00 00 00 00\r
+T 10 14 00 00 DD 6E FA DD 66 FB C3 00 00 00 00\r
 R 00 00 01 00 02 0B 1B 00\r
-T 0D 14 00 00\r
+T 19 14 00 00\r
 R 00 00 01 00\r
-T 0D 14 00 00 CD 00 00 00 00 FC FF 21 04 00 DD\r
+T 19 14 00 00 CD 00 00 00 00 FC FF 21 04 00 DD\r
 R 00 00 01 00 02 05 2D 00\r
-T 16 14 00 00 4E 02 DD 46 03 09 DD 75 FE DD 74\r
+T 22 14 00 00 4E 02 DD 46 03 09 DD 75 FE DD 74\r
 R 00 00 01 00\r
-T 21 14 00 00 FF AF DD 77 FC DD 77 FD\r
+T 2D 14 00 00 FF AF DD 77 FC DD 77 FD\r
 R 00 00 01 00\r
-T 29 14 00 00\r
+T 35 14 00 00\r
 R 00 00 01 00\r
-T 29 14 00 00 DD 6E 02 DD 66 03 23 23 4E 23 46\r
+T 35 14 00 00 DD 6E 02 DD 66 03 23 23 4E 23 46\r
 R 00 00 01 00\r
-T 34 14 00 00 DD 6E FC DD 66 FD CD 00 00 00 00\r
+T 40 14 00 00 DD 6E FC DD 66 FD CD 00 00 00 00\r
 R 00 00 01 00 02 0B 31 00\r
-T 3D 14 00 00 30 31\r
+T 49 14 00 00 30 31\r
 R 00 00 01 00\r
-T 3F 14 00 00\r
+T 4B 14 00 00\r
 R 00 00 01 00\r
-T 3F 14 00 00 DD 6E FE DD 66 FF 4D 44 03 03 DD\r
+T 4B 14 00 00 DD 6E FE DD 66 FF 4D 44 03 03 DD\r
 R 00 00 01 00\r
-T 4A 14 00 00 71 FE DD 70 FF 4E 23 46 11\r
+T 56 14 00 00 71 FE DD 70 FF 4E 23 46 11\r
 R 00 00 01 00\r
-T 53 14 00 00 00 00 00 00 3E 00 00 00 00 21\r
+T 5F 14 00 00 00 00 00 00 3E 00 00 00 00 21\r
 R 00 00 01 00 00 04 04 00 2B 09 40 00\r
-T 58 14 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+T 64 14 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
 R 00 00 01 00 02 04 40 00 02 09 26 00\r
-T 5F 14 00 00 28 05\r
+T 6B 14 00 00 28 05\r
 R 00 00 01 00\r
-T 61 14 00 00\r
+T 6D 14 00 00\r
 R 00 00 01 00\r
-T 61 14 00 00 21 01 00 18 0D\r
+T 6D 14 00 00 21 01 00 18 0D\r
 R 00 00 01 00\r
-T 66 14 00 00\r
+T 72 14 00 00\r
 R 00 00 01 00\r
-T 66 14 00 00 DD 34 FC 20 03 DD 34 FD\r
+T 72 14 00 00 DD 34 FC 20 03 DD 34 FD\r
 R 00 00 01 00\r
-T 6E 14 00 00\r
+T 7A 14 00 00\r
 R 00 00 01 00\r
-T 6E 14 00 00 18 B9\r
+T 7A 14 00 00 18 B9\r
 R 00 00 01 00\r
-T 70 14 00 00\r
+T 7C 14 00 00\r
 R 00 00 01 00\r
-T 70 14 00 00 21 00 00\r
+T 7C 14 00 00 21 00 00\r
 R 00 00 01 00\r
-T 73 14 00 00\r
+T 7F 14 00 00\r
 R 00 00 01 00\r
-T 73 14 00 00 C3 00 00 00 00\r
+T 7F 14 00 00 C3 00 00 00 00\r
 R 00 00 01 00 02 05 1B 00\r
-T 76 14 00 00\r
+T 82 14 00 00\r
 R 00 00 01 00\r
-T 76 14 00 00 CD 00 00 00 00 69 60 4E 23 46 EB\r
+T 82 14 00 00 CD 00 00 00 00 69 60 4E 23 46 EB\r
 R 00 00 01 00 02 05 25 00\r
-T 7F 14 00 00 5E 23 56 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 08 1A 00\r
-T 85 14 00 00 00 00 00 00 CD 00 00 00 00 C3\r
-R 00 00 01 00 02 04 1A 00 02 09 26 00\r
-T 8B 14 00 00 00 00 00 00\r
+T 8B 14 00 00 5E 23 56 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 19 00\r
+T 91 14 00 00 00 00 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 02 04 19 00 02 09 26 00\r
+T 97 14 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 12 00\r
-T 8D 14 00 00\r
+T 99 14 00 00\r
 R 00 00 01 00\r
-T 8D 14 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
+T 99 14 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
 R 00 00 01 00 02 05 2D 00\r
-T 96 14 00 00 66 03 29 01 06 00 09 EB 3E\r
+T A2 14 00 00 66 03 29 01 06 00 09 EB 3E\r
 R 00 00 01 00\r
-T 9F 14 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T AB 14 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 09 00 02 09 09 00\r
-T A4 14 00 00 00 00 00 00 DD 75 FE DD 74 FF DD\r
+T B0 14 00 00 00 00 00 00 DD 75 FE DD 74 FF DD\r
 R 00 00 01 00 02 04 26 00\r
-T AD 14 00 00 4E 02 DD 46 03 71 23 70 DD 6E FE\r
+T B9 14 00 00 4E 02 DD 46 03 71 23 70 DD 6E FE\r
 R 00 00 01 00\r
-T B8 14 00 00 DD 66 FF 23 23 AF 77 23 77 DD 6E\r
+T C4 14 00 00 DD 66 FF 23 23 AF 77 23 77 DD 6E\r
 R 00 00 01 00\r
-T C3 14 00 00 FE DD 66 FF C3 00 00 00 00\r
+T CF 14 00 00 FE DD 66 FF C3 00 00 00 00\r
 R 00 00 01 00 02 09 12 00\r
-T CA 14 00 00\r
+T D6 14 00 00\r
 R 00 00 01 00\r
-T CA 14 00 00 CD 00 00 00 00 FC FF 79 B0 20 11\r
+T D6 14 00 00 CD 00 00 00 00 FC FF 79 B0 20 11\r
 R 00 00 01 00 02 05 2D 00\r
-T D3 14 00 00\r
+T DF 14 00 00\r
 R 00 00 01 00\r
-T D3 14 00 00 11 10 00 3E 8D 14 00 00 21\r
+T DF 14 00 00 11 10 00 3E 99 14 00 00 21\r
 R 00 00 01 00 29 08 01 00\r
-T D9 14 00 00 8D 14 00 00 CD 00 00 00 00 DD 75\r
+T E5 14 00 00 99 14 00 00 CD 00 00 00 00 DD 75\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
-T E0 14 00 00 04 DD 74 05\r
+T EC 14 00 00 04 DD 74 05\r
 R 00 00 01 00\r
-T E4 14 00 00\r
+T F0 14 00 00\r
 R 00 00 01 00\r
-T E4 14 00 00 DD 6E 04 DD 66 05 4E 23 46 DD 6E\r
+T F0 14 00 00 DD 6E 04 DD 66 05 4E 23 46 DD 6E\r
 R 00 00 01 00\r
-T EF 14 00 00 04 DD 66 05 23 23 56 23 66 6A DD\r
+T FB 14 00 00 04 DD 66 05 23 23 56 23 66 6A DD\r
 R 00 00 01 00\r
-T FA 14 00 00 75 FE DD 74 FF CD 00 00 00 00 38\r
+T 06 15 00 00 75 FE DD 74 FF CD 00 00 00 00 38\r
 R 00 00 01 00 02 0A 31 00\r
-T 03 15 00 00 69\r
+T 0F 15 00 00 69\r
 R 00 00 01 00\r
-T 04 15 00 00\r
+T 10 15 00 00\r
 R 00 00 01 00\r
-T 04 15 00 00 DD 6E FE DD 66 FF 29 EB 3E\r
+T 10 15 00 00 DD 6E FE DD 66 FF 29 EB 3E\r
 R 00 00 01 00\r
-T 0D 15 00 00 8D 14 00 00 21 8D 14 00 00 CD\r
+T 19 15 00 00 99 14 00 00 21 99 14 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
-T 12 15 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
+T 1E 15 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
 R 00 00 01 00 02 04 26 00\r
-T 1B 15 00 00 6E FE DD 66 FF 29 E5 21 04 00 DD\r
+T 27 15 00 00 6E FE DD 66 FF 29 E5 21 04 00 DD\r
 R 00 00 01 00\r
-T 26 15 00 00 4E 04 DD 46 05 09 4D 44 21 04 00\r
+T 32 15 00 00 4E 04 DD 46 05 09 4D 44 21 04 00\r
 R 00 00 01 00\r
-T 31 15 00 00 DD 5E FC DD 56 FD 19 EB 3E\r
+T 3D 15 00 00 DD 5E FC DD 56 FD 19 EB 3E\r
 R 00 00 01 00\r
-T 3A 15 00 00 10 1A 00 00 21 10 1A 00 00 CD\r
+T 46 15 00 00 1C 1A 00 00 21 1C 1A 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
-T 3F 15 00 00 00 00 00 00 F1 DD 6E FC DD 66 FD\r
+T 4B 15 00 00 00 00 00 00 F1 DD 6E FC DD 66 FD\r
 R 00 00 01 00 02 04 26 00\r
-T 48 15 00 00 23 23 DD 4E FE DD 46 FF 71 23 70\r
+T 54 15 00 00 23 23 DD 4E FE DD 46 FF 71 23 70\r
 R 00 00 01 00\r
-T 53 15 00 00 DD 5E 04 DD 56 05 3E 00 00 00 00\r
+T 5F 15 00 00 DD 5E 04 DD 56 05 3E 00 00 00 00\r
 R 00 00 01 00 2B 0B 01 00\r
-T 5B 15 00 00 21 00 00 00 00 CD 00 00 00 00 DD\r
+T 67 15 00 00 21 00 00 00 00 CD 00 00 00 00 DD\r
 R 00 00 01 00 02 05 01 00 02 0A 26 00\r
-T 62 15 00 00 6E FC DD 66 FD DD 75 04 DD 74 05\r
+T 6E 15 00 00 6E FC DD 66 FD DD 75 04 DD 74 05\r
 R 00 00 01 00\r
-T 6D 15 00 00\r
+T 79 15 00 00\r
 R 00 00 01 00\r
-T 6D 15 00 00 DD 6E 04 DD 66 05 23 23 4E 23 46\r
+T 79 15 00 00 DD 6E 04 DD 66 05 23 23 4E 23 46\r
 R 00 00 01 00\r
-T 78 15 00 00 03 70 2B 71 0B 69 60 29 DD 4E 04\r
+T 84 15 00 00 03 70 2B 71 0B 69 60 29 DD 4E 04\r
 R 00 00 01 00\r
-T 83 15 00 00 DD 46 05 09 11 04 00 19 DD 5E 02\r
+T 8F 15 00 00 DD 46 05 09 11 04 00 19 DD 5E 02\r
 R 00 00 01 00\r
-T 8E 15 00 00 DD 56 03 73 23 72 69 60 C3\r
+T 9A 15 00 00 DD 56 03 73 23 72 69 60 C3\r
 R 00 00 01 00\r
-T 97 15 00 00 00 00 00 00\r
+T A3 15 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 12 00\r
-T 99 15 00 00\r
+T A5 15 00 00\r
 R 00 00 01 00\r
-T 99 15 00 00 CD 00 00 00 00 FC FF DD 7E 02 DD\r
+T A5 15 00 00 CD 00 00 00 00 FC FF DD 7E 02 DD\r
 R 00 00 01 00 02 05 2D 00\r
-T A2 15 00 00 B6 03 20 05\r
+T AE 15 00 00 B6 03 20 05\r
 R 00 00 01 00\r
-T A6 15 00 00\r
+T B2 15 00 00\r
 R 00 00 01 00\r
-T A6 15 00 00 21 00 00 18 78\r
+T B2 15 00 00 21 00 00 18 78\r
 R 00 00 01 00\r
-T AB 15 00 00\r
+T B7 15 00 00\r
 R 00 00 01 00\r
-T AB 15 00 00 DD 6E 02 DD 66 03 23 23 7E 23 B6\r
+T B7 15 00 00 DD 6E 02 DD 66 03 23 23 7E 23 B6\r
 R 00 00 01 00\r
-T B6 15 00 00 20 13\r
+T C2 15 00 00 20 13\r
 R 00 00 01 00\r
-T B8 15 00 00\r
+T C4 15 00 00\r
 R 00 00 01 00\r
-T B8 15 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
+T C4 15 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
 R 00 00 01 00 2B 0B 01 00\r
-T C0 15 00 00 21 00 00 00 00 CD 00 00 00 00 21\r
+T CC 15 00 00 21 00 00 00 00 CD 00 00 00 00 21\r
 R 00 00 01 00 02 05 01 00 02 0A 26 00\r
-T C7 15 00 00 00 00 18 58\r
+T D3 15 00 00 00 00 18 58\r
 R 00 00 01 00\r
-T CB 15 00 00\r
+T D7 15 00 00\r
 R 00 00 01 00\r
-T CB 15 00 00 DD 6E 02 DD 66 03 23 23 46 23 66\r
+T D7 15 00 00 DD 6E 02 DD 66 03 23 23 46 23 66\r
 R 00 00 01 00\r
-T D6 15 00 00 68 29 DD 75 FE DD 74 FF EB 3E\r
+T E2 15 00 00 68 29 DD 75 FE DD 74 FF EB 3E\r
 R 00 00 01 00\r
-T E0 15 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T EC 15 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 09 00 02 09 09 00\r
-T E5 15 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
+T F1 15 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
 R 00 00 01 00 02 04 26 00\r
-T EE 15 00 00 4E FE DD 46 FF C5 21 04 00 DD 4E\r
+T FA 15 00 00 4E FE DD 46 FF C5 21 04 00 DD 4E\r
 R 00 00 01 00\r
-T F9 15 00 00 02 DD 46 03 09 4D 44 DD 5E FC DD\r
+T 05 16 00 00 02 DD 46 03 09 4D 44 DD 5E FC DD\r
 R 00 00 01 00\r
-T 04 16 00 00 56 FD 3E 10 1A 00 00 21\r
+T 10 16 00 00 56 FD 3E 1C 1A 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T 09 16 00 00 10 1A 00 00 CD 00 00 00 00 F1 DD\r
+T 15 16 00 00 1C 1A 00 00 CD 00 00 00 00 F1 DD\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
-T 10 16 00 00 5E 02 DD 56 03 3E 00 00 00 00 21\r
+T 1C 16 00 00 5E 02 DD 56 03 3E 00 00 00 00 21\r
 R 00 00 01 00 2B 0A 01 00\r
-T 18 16 00 00 00 00 00 00 CD 00 00 00 00 DD 6E\r
+T 24 16 00 00 00 00 00 00 CD 00 00 00 00 DD 6E\r
 R 00 00 01 00 02 04 01 00 02 09 26 00\r
-T 1F 16 00 00 FC DD 66 FD\r
+T 2B 16 00 00 FC DD 66 FD\r
 R 00 00 01 00\r
-T 23 16 00 00\r
+T 2F 16 00 00\r
 R 00 00 01 00\r
-T 23 16 00 00 C3 00 00 00 00\r
+T 2F 16 00 00 C3 00 00 00 00\r
 R 00 00 01 00 02 05 12 00\r
-T 26 16 00 00\r
+T 32 16 00 00\r
 R 00 00 01 00\r
-T 26 16 00 00 CD 00 00 00 00 DD 7E 0E DD 6E 0C\r
+T 32 16 00 00 CD 00 00 00 00 DD 7E 0E DD 6E 0C\r
 R 00 00 01 00 02 05 25 00\r
-T 2F 16 00 00 DD 66 0D 32 06 00 00 00 22\r
+T 3B 16 00 00 DD 66 0D 32 06 00 00 00 22\r
 R 00 00 01 00 00 08 03 00\r
-T 36 16 00 00 04 00 00 00 DD 6E 0A DD 66 0B 22\r
+T 42 16 00 00 04 00 00 00 DD 6E 0A DD 66 0B 22\r
 R 00 00 01 00 00 04 03 00\r
-T 3F 16 00 00 07 00 00 00 D5 DD 5E 0A DD 56 0B\r
+T 4B 16 00 00 07 00 00 00 D5 DD 5E 0A DD 56 0B\r
 R 00 00 01 00 00 04 03 00\r
-T 48 16 00 00 CD 00 00 00 00 EB D1 19 4D 44 DD\r
+T 54 16 00 00 CD 00 00 00 00 EB D1 19 4D 44 DD\r
 R 00 00 01 00 02 05 08 00\r
-T 51 16 00 00 5E 02 DD 56 03 3E 61 16 00 00 21\r
+T 5D 16 00 00 5E 02 DD 56 03 3E 6D 16 00 00 21\r
 R 00 00 01 00 29 0A 01 00\r
-T 59 16 00 00 61 16 00 00 CD 00 00 00 00 C3\r
+T 65 16 00 00 6D 16 00 00 CD 00 00 00 00 C3\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
-T 5F 16 00 00 00 00 00 00\r
+T 6B 16 00 00 00 00 00 00\r
 R 00 00 01 00 02 04 12 00\r
-T 61 16 00 00\r
+T 6D 16 00 00\r
 R 00 00 01 00\r
-T 61 16 00 00 CD 00 00 00 00 F2 FF 2A\r
+T 6D 16 00 00 CD 00 00 00 00 F2 FF 2A\r
 R 00 00 01 00 02 05 2D 00\r
-T 67 16 00 00 07 00 00 00 DD 75 F6 DD 74 F7\r
+T 73 16 00 00 07 00 00 00 DD 75 F6 DD 74 F7\r
 R 00 00 01 00 00 04 03 00\r
-T 6F 16 00 00\r
+T 7B 16 00 00\r
 R 00 00 01 00\r
-T 6F 16 00 00 DD 4E 02 DD 46 03 DD 6E 04 DD 66\r
+T 7B 16 00 00 DD 4E 02 DD 46 03 DD 6E 04 DD 66\r
 R 00 00 01 00\r
-T 7A 16 00 00 05 A7 ED 42 DD 75 FE DD 74 FF 4D\r
+T 86 16 00 00 05 A7 ED 42 DD 75 FE DD 74 FF 4D\r
 R 00 00 01 00\r
-T 85 16 00 00 44 DD 6E F6 DD 66 F7 A7 ED 42 38\r
+T 91 16 00 00 44 DD 6E F6 DD 66 F7 A7 ED 42 38\r
 R 00 00 01 00\r
-T 90 16 00 00 03\r
+T 9C 16 00 00 03\r
 R 00 00 01 00\r
-T 91 16 00 00\r
+T 9D 16 00 00\r
 R 00 00 01 00\r
-T 91 16 00 00 C3 00 00 00 00\r
+T 9D 16 00 00 C3 00 00 00 00\r
 R 00 00 01 00 02 05 12 00\r
-T 94 16 00 00\r
+T A0 16 00 00\r
 R 00 00 01 00\r
-T 94 16 00 00 DD 6E F6 DD 66 F7 29 4D 44 DD 5E\r
+T A0 16 00 00 DD 6E F6 DD 66 F7 29 4D 44 DD 5E\r
 R 00 00 01 00\r
-T 9F 16 00 00 FE DD 56 FF CD 00 00 00 00 DD 4E\r
+T AB 16 00 00 FE DD 56 FF CD 00 00 00 00 DD 4E\r
 R 00 00 01 00 02 09 38 00\r
-T A8 16 00 00 F6 DD 46 F7 CD 00 00 00 00 DD 73\r
+T B4 16 00 00 F6 DD 46 F7 CD 00 00 00 00 DD 73\r
 R 00 00 01 00 02 09 08 00\r
-T B1 16 00 00 FE DD 72 FF DD 6E 02 DD 66 03 19\r
+T BD 16 00 00 FE DD 72 FF DD 6E 02 DD 66 03 19\r
 R 00 00 01 00\r
-T BC 16 00 00 DD 75 F8 DD 74 F9 DD 75 FA DD 74\r
+T C8 16 00 00 DD 75 F8 DD 74 F9 DD 75 FA DD 74\r
 R 00 00 01 00\r
-T C7 16 00 00 FB DD 6E 02 DD 66 03 DD 75 F2 DD\r
+T D3 16 00 00 FB DD 6E 02 DD 66 03 DD 75 F2 DD\r
 R 00 00 01 00\r
-T D2 16 00 00 74 F3 DD 4E F6 DD 46 F7 DD 6E 04\r
+T DE 16 00 00 74 F3 DD 4E F6 DD 46 F7 DD 6E 04\r
 R 00 00 01 00\r
-T DD 16 00 00 DD 66 05 A7 ED 42 DD 75 F4 DD 74\r
+T E9 16 00 00 DD 66 05 A7 ED 42 DD 75 F4 DD 74\r
 R 00 00 01 00\r
-T E8 16 00 00 F5\r
+T F4 16 00 00 F5\r
 R 00 00 01 00\r
-T E9 16 00 00\r
+T F5 16 00 00\r
 R 00 00 01 00\r
-T E9 16 00 00 DD 4E F8 DD 46 F9 DD 6E F2 DD 66\r
+T F5 16 00 00 DD 4E F8 DD 46 F9 DD 6E F2 DD 66\r
 R 00 00 01 00\r
-T F4 16 00 00 F3 A7 ED 42 30 5A\r
+T 00 17 00 00 F3 A7 ED 42 30 5A\r
 R 00 00 01 00\r
-T FA 16 00 00\r
+T 06 17 00 00\r
 R 00 00 01 00\r
-T FA 16 00 00 DD 4E F8 DD 46 F9 DD 5E F2 DD 56\r
+T 06 17 00 00 DD 4E F8 DD 46 F9 DD 5E F2 DD 56\r
 R 00 00 01 00\r
-T 05 17 00 00 F3 3A 06 00 00 00 2A 04 00 00 00\r
+T 11 17 00 00 F3 3A 06 00 00 00 2A 04 00 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 0C 17 00 00 CD 00 00 00 00 DD 75 FC DD 74 FD\r
+T 18 17 00 00 CD 00 00 00 00 DD 75 FC DD 74 FD\r
 R 00 00 01 00 02 05 26 00\r
-T 15 17 00 00 7D B4 20 24\r
+T 21 17 00 00 7D B4 20 24\r
 R 00 00 01 00\r
-T 19 17 00 00\r
+T 25 17 00 00\r
 R 00 00 01 00\r
-T 19 17 00 00 21 06 00 39 7E DD 96 F6 77 23 7E\r
+T 25 17 00 00 21 06 00 39 7E DD 96 F6 77 23 7E\r
 R 00 00 01 00\r
-T 24 17 00 00 DD 9E F7 77 2B 6E 67 4D 44 DD 5E\r
+T 30 17 00 00 DD 9E F7 77 2B 6E 67 4D 44 DD 5E\r
 R 00 00 01 00\r
-T 2F 17 00 00 F2 DD 56 F3 3E 23 19 00 00 21\r
+T 3B 17 00 00 F2 DD 56 F3 3E 2F 19 00 00 21\r
 R 00 00 01 00 29 09 01 00\r
-T 36 17 00 00 23 19 00 00 CD 00 00 00 00 18 AC\r
+T 42 17 00 00 2F 19 00 00 CD 00 00 00 00 18 AC\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
-T 3D 17 00 00\r
+T 49 17 00 00\r
 R 00 00 01 00\r
-T 3D 17 00 00 DD CB FD 7E 28 11\r
+T 49 17 00 00 DD CB FD 7E 28 11\r
 R 00 00 01 00\r
-T 43 17 00 00\r
+T 4F 17 00 00\r
 R 00 00 01 00\r
-T 43 17 00 00 21 00 00 39 7E DD 86 F6 77 23 7E\r
+T 4F 17 00 00 21 00 00 39 7E DD 86 F6 77 23 7E\r
 R 00 00 01 00\r
-T 4E 17 00 00 DD 8E F7 77 18 95\r
+T 5A 17 00 00 DD 8E F7 77 18 95\r
 R 00 00 01 00\r
-T 54 17 00 00\r
+T 60 17 00 00\r
 R 00 00 01 00\r
-T 54 17 00 00\r
+T 60 17 00 00\r
 R 00 00 01 00\r
-T 54 17 00 00\r
+T 60 17 00 00\r
 R 00 00 01 00\r
-T 54 17 00 00 DD 4E F4 DD 46 F5 DD 6E FA DD 66\r
+T 60 17 00 00 DD 4E F4 DD 46 F5 DD 6E FA DD 66\r
 R 00 00 01 00\r
-T 5F 17 00 00 FB A7 ED 42 D2 54 18 00 00\r
+T 6B 17 00 00 FB A7 ED 42 D2 60 18 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T 66 17 00 00\r
+T 72 17 00 00\r
 R 00 00 01 00\r
-T 66 17 00 00 DD 4E F4 DD 46 F5 DD 5E FA DD 56\r
+T 72 17 00 00 DD 4E F4 DD 46 F5 DD 5E FA DD 56\r
 R 00 00 01 00\r
-T 71 17 00 00 FB 3A 06 00 00 00 2A 04 00 00 00\r
+T 7D 17 00 00 FB 3A 06 00 00 00 2A 04 00 00 00\r
 R 00 00 01 00 00 06 03 00 00 0B 03 00\r
-T 78 17 00 00 CD 00 00 00 00 DD 75 FC DD 74 FD\r
+T 84 17 00 00 CD 00 00 00 00 DD 75 FC DD 74 FD\r
 R 00 00 01 00 02 05 26 00\r
-T 81 17 00 00 7D B4 20 23\r
+T 8D 17 00 00 7D B4 20 23\r
 R 00 00 01 00\r
-T 85 17 00 00\r
+T 91 17 00 00\r
 R 00 00 01 00\r
-T 85 17 00 00 DD 4E F4 DD 46 F5 21 08 00 39 7E\r
+T 91 17 00 00 DD 4E F4 DD 46 F5 21 08 00 39 7E\r
 R 00 00 01 00\r
-T 90 17 00 00 DD 86 F6 77 23 7E DD 8E F7 77 2B\r
+T 9C 17 00 00 DD 86 F6 77 23 7E DD 8E F7 77 2B\r
 R 00 00 01 00\r
-T 9B 17 00 00 6E 67 EB 3E 23 19 00 00 21\r
+T A7 17 00 00 6E 67 EB 3E 2F 19 00 00 21\r
 R 00 00 01 00 29 08 01 00\r
-T A1 17 00 00 23 19 00 00 CD 00 00 00 00 18 AC\r
+T AD 17 00 00 2F 19 00 00 CD 00 00 00 00 18 AC\r
 R 00 00 01 00 00 04 01 00 02 09 26 00\r
-T A8 17 00 00\r
+T B4 17 00 00\r
 R 00 00 01 00\r
-T A8 17 00 00 DD 4E FC DD 46 FD 21 00 00 CD\r
+T B4 17 00 00 DD 4E FC DD 46 FD 21 00 00 CD\r
 R 00 00 01 00\r
-T B2 17 00 00 00 00 00 00 D2 42 18 00 00\r
+T BE 17 00 00 00 00 00 00 D2 4E 18 00 00\r
 R 00 00 01 00 02 04 31 00 00 09 01 00\r
-T B7 17 00 00\r
+T C3 17 00 00\r
 R 00 00 01 00\r
-T B7 17 00 00 DD 6E F8 DD 66 F9 DD 4E F2 DD 46\r
+T C3 17 00 00 DD 6E F8 DD 66 F9 DD 4E F2 DD 46\r
 R 00 00 01 00\r
-T C2 17 00 00 F3 A7 ED 42 20 45\r
+T CE 17 00 00 F3 A7 ED 42 20 45\r
 R 00 00 01 00\r
-T C8 17 00 00\r
+T D4 17 00 00\r
 R 00 00 01 00\r
-T C8 17 00 00 DD 6E F4 DD 66 F5 E5 21 0A 00 39\r
+T D4 17 00 00 DD 6E F4 DD 66 F5 E5 21 0A 00 39\r
 R 00 00 01 00\r
-T D3 17 00 00 7E DD 86 F6 77 23 7E DD 8E F7 77\r
+T DF 17 00 00 7E DD 86 F6 77 23 7E DD 8E F7 77\r
 R 00 00 01 00\r
-T DE 17 00 00 2B 6E 67 4D 44 DD 5E F2 DD 56 F3\r
+T EA 17 00 00 2B 6E 67 4D 44 DD 5E F2 DD 56 F3\r
 R 00 00 01 00\r
-T E9 17 00 00 3E 86 19 00 00 21 86 19 00 00 CD\r
+T F5 17 00 00 3E 92 19 00 00 21 92 19 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
-T EF 17 00 00 00 00 00 00 E1 21 06 00 39 7E DD\r
+T FB 17 00 00 00 00 00 00 E1 21 06 00 39 7E DD\r
 R 00 00 01 00 02 04 26 00\r
-T F8 17 00 00 86 F6 77 23 7E DD 8E F7 77 2B 6E\r
+T 04 18 00 00 86 F6 77 23 7E DD 8E F7 77 2B 6E\r
 R 00 00 01 00\r
-T 03 18 00 00 67 DD 75 F2 DD 74 F3 C3\r
+T 0F 18 00 00 67 DD 75 F2 DD 74 F3 C3\r
 R 00 00 01 00\r
-T 0B 18 00 00 54 17 00 00\r
+T 17 18 00 00 60 17 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 0D 18 00 00\r
+T 19 18 00 00\r
 R 00 00 01 00\r
-T 0D 18 00 00 DD 4E F4 DD 46 F5 DD 5E F2 DD 56\r
+T 19 18 00 00 DD 4E F4 DD 46 F5 DD 5E F2 DD 56\r
 R 00 00 01 00\r
-T 18 18 00 00 F3 3E 23 19 00 00 21 23 19 00 00\r
+T 24 18 00 00 F3 3E 2F 19 00 00 21 2F 19 00 00\r
 R 00 00 01 00 29 06 01 00 00 0B 01 00\r
-T 1E 18 00 00 CD 00 00 00 00 21 02 00 39 7E DD\r
+T 2A 18 00 00 CD 00 00 00 00 21 02 00 39 7E DD\r
 R 00 00 01 00 02 05 26 00\r
-T 27 18 00 00 96 F6 77 23 7E DD 9E F7 77 21\r
+T 33 18 00 00 96 F6 77 23 7E DD 9E F7 77 21\r
 R 00 00 01 00\r
-T 31 18 00 00 00 00 39 7E DD 86 F6 77 23 7E DD\r
+T 3D 18 00 00 00 00 39 7E DD 86 F6 77 23 7E DD\r
 R 00 00 01 00\r
-T 3C 18 00 00 8E F7 77 C3 E9 16 00 00\r
+T 48 18 00 00 8E F7 77 C3 F5 16 00 00\r
 R 00 00 01 00 00 08 01 00\r
-T 42 18 00 00\r
+T 4E 18 00 00\r
 R 00 00 01 00\r
-T 42 18 00 00 21 02 00 39 7E DD 96 F6 77 23 7E\r
+T 4E 18 00 00 21 02 00 39 7E DD 96 F6 77 23 7E\r
 R 00 00 01 00\r
-T 4D 18 00 00 DD 9E F7 77 C3 54 17 00 00\r
+T 59 18 00 00 DD 9E F7 77 C3 60 17 00 00\r
 R 00 00 01 00 00 09 01 00\r
-T 54 18 00 00\r
+T 60 18 00 00\r
 R 00 00 01 00\r
-T 54 18 00 00 DD 6E F8 DD 66 F9 DD 4E F2 DD 46\r
+T 60 18 00 00 DD 6E F8 DD 66 F9 DD 4E F2 DD 46\r
 R 00 00 01 00\r
-T 5F 18 00 00 F3 A7 ED 42 20 79\r
+T 6B 18 00 00 F3 A7 ED 42 20 79\r
 R 00 00 01 00\r
-T 65 18 00 00\r
+T 71 18 00 00\r
 R 00 00 01 00\r
-T 65 18 00 00 DD 4E FA DD 46 FB DD 6E 04 DD 66\r
+T 71 18 00 00 DD 4E FA DD 46 FB DD 6E 04 DD 66\r
 R 00 00 01 00\r
-T 70 18 00 00 05 A7 ED 42 4D 44 DD 5E 02 DD 56\r
+T 7C 18 00 00 05 A7 ED 42 4D 44 DD 5E 02 DD 56\r
 R 00 00 01 00\r
-T 7B 18 00 00 03 DD 6E F8 DD 66 F9 A7 ED 52 CD\r
+T 87 18 00 00 03 DD 6E F8 DD 66 F9 A7 ED 52 CD\r
 R 00 00 01 00\r
-T 86 18 00 00 00 00 00 00 38 2A\r
+T 92 18 00 00 00 00 00 00 38 2A\r
 R 00 00 01 00 02 04 31 00\r
-T 8A 18 00 00\r
+T 96 18 00 00\r
 R 00 00 01 00\r
-T 8A 18 00 00 DD 4E 04 DD 46 05 DD 6E F6 DD 66\r
+T 96 18 00 00 DD 4E 04 DD 46 05 DD 6E F6 DD 66\r
 R 00 00 01 00\r
-T 95 18 00 00 F7 DD 5E FA DD 56 FB 19 EB 3E\r
+T A1 18 00 00 F7 DD 5E FA DD 56 FB 19 EB 3E\r
 R 00 00 01 00\r
-T 9F 18 00 00 61 16 00 00 21 61 16 00 00 CD\r
+T AB 18 00 00 6D 16 00 00 21 6D 16 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
-T A4 18 00 00 00 00 00 00 DD 6E F8 DD 66 F9 DD\r
+T B0 18 00 00 00 00 00 00 DD 6E F8 DD 66 F9 DD\r
 R 00 00 01 00 02 04 26 00\r
-T AD 18 00 00 75 04 DD 74 05 18 27\r
+T B9 18 00 00 75 04 DD 74 05 18 27\r
 R 00 00 01 00\r
-T B4 18 00 00\r
+T C0 18 00 00\r
 R 00 00 01 00\r
-T B4 18 00 00 DD 4E F8 DD 46 F9 DD 5E 02 DD 56\r
+T C0 18 00 00 DD 4E F8 DD 46 F9 DD 5E 02 DD 56\r
 R 00 00 01 00\r
-T BF 18 00 00 03 3E 61 16 00 00 21 61 16 00 00\r
+T CB 18 00 00 03 3E 6D 16 00 00 21 6D 16 00 00\r
 R 00 00 01 00 29 06 01 00 00 0B 01 00\r
-T C5 18 00 00 CD 00 00 00 00 DD 6E F6 DD 66 F7\r
+T D1 18 00 00 CD 00 00 00 00 DD 6E F6 DD 66 F7\r
 R 00 00 01 00 02 05 26 00\r
-T CE 18 00 00 DD 4E FA DD 46 FB 09 DD 75 02 DD\r
+T DA 18 00 00 DD 4E FA DD 46 FB 09 DD 75 02 DD\r
 R 00 00 01 00\r
-T D9 18 00 00 74 03\r
+T E5 18 00 00 74 03\r
 R 00 00 01 00\r
-T DB 18 00 00\r
+T E7 18 00 00\r
 R 00 00 01 00\r
-T DB 18 00 00 C3 6F 16 00 00\r
+T E7 18 00 00 C3 7B 16 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T DE 18 00 00\r
+T EA 18 00 00\r
 R 00 00 01 00\r
-T DE 18 00 00 DD 6E F2 DD 66 F3 E5 21 08 00 39\r
+T EA 18 00 00 DD 6E F2 DD 66 F3 E5 21 08 00 39\r
 R 00 00 01 00\r
-T E9 18 00 00 7E DD 96 F6 77 23 7E DD 9E F7 77\r
+T F5 18 00 00 7E DD 96 F6 77 23 7E DD 9E F7 77\r
 R 00 00 01 00\r
-T F4 18 00 00 2B 6E 67 4D 44 DD 5E F4 DD 56 F5\r
+T 00 19 00 00 2B 6E 67 4D 44 DD 5E F4 DD 56 F5\r
 R 00 00 01 00\r
-T FF 18 00 00 3E 86 19 00 00 21 86 19 00 00 CD\r
+T 0B 19 00 00 3E 92 19 00 00 21 92 19 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
-T 05 19 00 00 00 00 00 00 E1 21 08 00 39 7E DD\r
+T 11 19 00 00 00 00 00 00 E1 21 08 00 39 7E DD\r
 R 00 00 01 00 02 04 26 00\r
-T 0E 19 00 00 96 F6 77 23 7E DD 9E F7 77 2B 6E\r
+T 1A 19 00 00 96 F6 77 23 7E DD 9E F7 77 2B 6E\r
 R 00 00 01 00\r
-T 19 19 00 00 67 DD 75 F4 DD 74 F5 C3\r
+T 25 19 00 00 67 DD 75 F4 DD 74 F5 C3\r
 R 00 00 01 00\r
-T 21 19 00 00 E9 16 00 00\r
+T 2D 19 00 00 F5 16 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 23 19 00 00\r
+T 2F 19 00 00\r
 R 00 00 01 00\r
-T 23 19 00 00 CD 00 00 00 00 F8 FF 2A\r
+T 2F 19 00 00 CD 00 00 00 00 F8 FF 2A\r
 R 00 00 01 00 02 05 2D 00\r
-T 29 19 00 00 07 00 00 00 DD 75 FD DD 74 FE DD\r
+T 35 19 00 00 07 00 00 00 DD 75 FD DD 74 FE DD\r
 R 00 00 01 00 00 04 03 00\r
-T 32 19 00 00 6E 02 DD 66 03 DD 75 F8 DD 74 F9\r
+T 3E 19 00 00 6E 02 DD 66 03 DD 75 F8 DD 74 F9\r
 R 00 00 01 00\r
-T 3D 19 00 00 DD 71 FA DD 70 FB\r
+T 49 19 00 00 DD 71 FA DD 70 FB\r
 R 00 00 01 00\r
-T 43 19 00 00\r
+T 4F 19 00 00\r
 R 00 00 01 00\r
-T 43 19 00 00 DD 6E F8 DD 66 F9 46 DD 70 FC DD\r
+T 4F 19 00 00 DD 6E F8 DD 66 F9 46 DD 70 FC DD\r
 R 00 00 01 00\r
-T 4E 19 00 00 6E FA DD 66 FB 4E DD 6E F8 DD 66\r
+T 5A 19 00 00 6E FA DD 66 FB 4E DD 6E F8 DD 66\r
 R 00 00 01 00\r
-T 59 19 00 00 F9 23 DD 75 F8 DD 74 F9 2B 71 DD\r
+T 65 19 00 00 F9 23 DD 75 F8 DD 74 F9 2B 71 DD\r
 R 00 00 01 00\r
-T 64 19 00 00 6E FA DD 66 FB 23 DD 75 FA DD 74\r
+T 70 19 00 00 6E FA DD 66 FB 23 DD 75 FA DD 74\r
 R 00 00 01 00\r
-T 6F 19 00 00 FB 2B 70 DD 6E FD DD 66 FE 2B DD\r
+T 7B 19 00 00 FB 2B 70 DD 6E FD DD 66 FE 2B DD\r
 R 00 00 01 00\r
-T 7A 19 00 00 75 FD DD 74 FE 7D B4 20 C0\r
+T 86 19 00 00 75 FD DD 74 FE 7D B4 20 C0\r
 R 00 00 01 00\r
-T 83 19 00 00\r
+T 8F 19 00 00\r
 R 00 00 01 00\r
-T 83 19 00 00 C3 00 00 00 00\r
+T 8F 19 00 00 C3 00 00 00 00\r
 R 00 00 01 00 02 05 12 00\r
-T 86 19 00 00\r
+T 92 19 00 00\r
 R 00 00 01 00\r
-T 86 19 00 00 CD 00 00 00 00 F6 FF 2A\r
+T 92 19 00 00 CD 00 00 00 00 F6 FF 2A\r
 R 00 00 01 00 02 05 2D 00\r
-T 8C 19 00 00 07 00 00 00 DD 75 FE DD 74 FF DD\r
+T 98 19 00 00 07 00 00 00 DD 75 FE DD 74 FF DD\r
 R 00 00 01 00 00 04 03 00\r
-T 95 19 00 00 6E 02 DD 66 03 DD 75 F6 DD 74 F7\r
+T A1 19 00 00 6E 02 DD 66 03 DD 75 F6 DD 74 F7\r
 R 00 00 01 00\r
-T A0 19 00 00 DD 71 F8 DD 70 F9 DD 6E 0A DD 66\r
+T AC 19 00 00 DD 71 F8 DD 70 F9 DD 6E 0A DD 66\r
 R 00 00 01 00\r
-T AB 19 00 00 0B DD 75 FA DD 74 FB\r
+T B7 19 00 00 0B DD 75 FA DD 74 FB\r
 R 00 00 01 00\r
-T B2 19 00 00\r
+T BE 19 00 00\r
 R 00 00 01 00\r
-T B2 19 00 00 DD 6E F6 DD 66 F7 4E 06 00 DD 71\r
+T BE 19 00 00 DD 6E F6 DD 66 F7 4E 06 00 DD 71\r
 R 00 00 01 00\r
-T BD 19 00 00 FC DD 70 FD DD 6E FA DD 66 FB 56\r
+T C9 19 00 00 FC DD 70 FD DD 6E FA DD 66 FB 56\r
 R 00 00 01 00\r
-T C8 19 00 00 DD 6E F6 DD 66 F7 23 DD 75 F6 DD\r
+T D4 19 00 00 DD 6E F6 DD 66 F7 23 DD 75 F6 DD\r
 R 00 00 01 00\r
-T D3 19 00 00 74 F7 2B 72 DD 6E F8 DD 66 F9 56\r
+T DF 19 00 00 74 F7 2B 72 DD 6E F8 DD 66 F9 56\r
 R 00 00 01 00\r
-T DE 19 00 00 DD 6E FA DD 66 FB 23 DD 75 FA DD\r
+T EA 19 00 00 DD 6E FA DD 66 FB 23 DD 75 FA DD\r
 R 00 00 01 00\r
-T E9 19 00 00 74 FB 2B 72 DD 6E F8 DD 66 F9 23\r
+T F5 19 00 00 74 FB 2B 72 DD 6E F8 DD 66 F9 23\r
 R 00 00 01 00\r
-T F4 19 00 00 DD 75 F8 DD 74 F9 2B 71 DD 6E FE\r
+T 00 1A 00 00 DD 75 F8 DD 74 F9 2B 71 DD 6E FE\r
 R 00 00 01 00\r
-T FF 19 00 00 DD 66 FF 2B DD 75 FE DD 74 FF 7D\r
+T 0B 1A 00 00 DD 66 FF 2B DD 75 FE DD 74 FF 7D\r
 R 00 00 01 00\r
-T 0A 1A 00 00 B4 20 A5\r
+T 16 1A 00 00 B4 20 A5\r
 R 00 00 01 00\r
-T 0D 1A 00 00\r
+T 19 1A 00 00\r
 R 00 00 01 00\r
-T 0D 1A 00 00 C3 00 00 00 00\r
+T 19 1A 00 00 C3 00 00 00 00\r
 R 00 00 01 00 02 05 12 00\r
-T 10 1A 00 00\r
+T 1C 1A 00 00\r
 R 00 00 01 00\r
-T 10 1A 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
+T 1C 1A 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
 R 00 00 01 00 02 05 2D 00\r
-T 19 1A 00 00 66 03 DD 75 FE DD 74 FF\r
+T 25 1A 00 00 66 03 DD 75 FE DD 74 FF\r
 R 00 00 01 00\r
-T 21 1A 00 00\r
+T 2D 1A 00 00\r
 R 00 00 01 00\r
-T 21 1A 00 00 DD 6E 0A DD 66 0B 2B DD 75 0A DD\r
+T 2D 1A 00 00 DD 6E 0A DD 66 0B 2B DD 75 0A DD\r
 R 00 00 01 00\r
-T 2C 1A 00 00 74 0B CB 7C 20 20\r
+T 38 1A 00 00 74 0B CB 7C 20 20\r
 R 00 00 01 00\r
-T 32 1A 00 00\r
+T 3E 1A 00 00\r
 R 00 00 01 00\r
-T 32 1A 00 00 DD 6E 04 DD 66 05 23 DD 75 04 DD\r
+T 3E 1A 00 00 DD 6E 04 DD 66 05 23 DD 75 04 DD\r
 R 00 00 01 00\r
-T 3D 1A 00 00 74 05 2B 46 DD 6E FE DD 66 FF 23\r
+T 49 1A 00 00 74 05 2B 46 DD 6E FE DD 66 FF 23\r
 R 00 00 01 00\r
-T 48 1A 00 00 DD 75 FE DD 74 FF 2B 70 18 CF\r
+T 54 1A 00 00 DD 75 FE DD 74 FF 2B 70 18 CF\r
 R 00 00 01 00\r
-T 52 1A 00 00\r
+T 5E 1A 00 00\r
 R 00 00 01 00\r
-T 52 1A 00 00 DD 6E 02 DD 66 03 C3 00 00 00 00\r
+T 5E 1A 00 00 DD 6E 02 DD 66 03 C3 00 00 00 00\r
 R 00 00 01 00 02 0B 12 00\r
 T 00 00 00 00\r
 R 00 00 02 00\r
@@ -2768,7 +2770,11 @@ T 86 00 00 00 60 00
 R 00 00 02 00\r
 T 88 00 00 00\r
 R 00 00 02 00\r
-T 88 00 00 00 74 72 79 20 61 67 61 69 6E 00\r
+T 88 00 00 00 63 61 6E 27 74 20 66 6F 72 6B 20\r
+R 00 00 02 00\r
+T 93 00 00 00 2D 20 74 72 79 20 61 67 61 69 6E\r
+R 00 00 02 00\r
+T 9E 00 00 00 00\r
 R 00 00 02 00\r
 T 00 00 00 00\r
 R 00 00 03 00\r
index b41a79f..a4e79ad 100644 (file)
@@ -4,6 +4,7 @@
 #define _NSIG NSIGS /* Nick NSIG */\r
 #include <errno.h>\r
 #include <setjmp.h>\r
+#include <utsname.h> /* Nick see prs_expand() routine */\r
 #include "sh.h"\r
 \r
 /* -------- io.c -------- */\r
@@ -96,7 +97,11 @@ readc()
                        if (multiline)\r
                            return env.iop->prev = 0;\r
                        if (talking && env.iop == iostack+1)\r
+#if 1 /* Nick */\r
+                           prs_expand(prompt->value);\r
+#else\r
                            prs(prompt->value);\r
+#endif\r
                    }\r
                }\r
        if (env.iop >= iostack)\r
@@ -391,6 +396,72 @@ register char *s;
                write(2, s, strlen(s));\r
 }\r
 \r
+#if 1 /* Nick */\r
+void prs_expand(char *p)\r
+       {\r
+       char *q, *r;\r
+       struct utsname name;\r
+       char buf[PATHLEN];\r
+\r
+       for (q = p; *q; q++)\r
+               {\r
+               if (*q == '\\')\r
+                       {\r
+                       write(2, p, q-p);\r
+                       p = ++q;\r
+                       switch (*q)\r
+                               {\r
+                       case '#':\r
+                               p++;\r
+                               if (geteuid() == 0)\r
+                                       {\r
+                                       prs("#");\r
+                                       }\r
+                               else\r
+                                       {\r
+                                       prs("$");\r
+                                       }\r
+                               break;\r
+                       case 'u':\r
+                               p++;\r
+                               if ((r = getenv("USER")) == NULL)\r
+                                       {\r
+                                       prs("someone");\r
+                                       }\r
+                               else\r
+                                       {\r
+                                       prs(r);\r
+                                       }\r
+                               break;\r
+                       case 'h':\r
+                               p++;\r
+                               if (uname(&name) == -1)\r
+                                       {\r
+                                       prs("somehost");\r
+                                       }\r
+                               else\r
+                                       {\r
+                                       prs(name.nodename);\r
+                                       }\r
+                               break;\r
+                       case 'w':\r
+                               p++;\r
+                               if (getcwd(buf, PATHLEN) == NULL)\r
+                                       {\r
+                                       prs("somewhere");\r
+                                       }\r
+                               else\r
+                                       {\r
+                                       prs(buf);\r
+                                       }\r
+                               break;\r
+                               }\r
+                       }\r
+               }\r
+       prs(p);\r
+       }\r
+#endif\r
+\r
 void\r
 putc(c)\r
 char c;\r
@@ -561,7 +632,11 @@ int ec;
                env.iobase = env.iop;\r
                for (;;) {\r
                        if (talking && env.iop <= iostack)\r
+#if 1 /* Nick */\r
+                               prs_expand(cprompt->value);\r
+#else\r
                                prs(cprompt->value);\r
+#endif\r
                        next = line;\r
                        while ((c = getc(ec)) != '\n' && c) {\r
                                if (ec == '\'')\r
index 66a3281..656b786 100644 (file)
@@ -1,11 +1,12 @@
 XL4\r
-H 6 areas 52 global symbols\r
+H 6 areas 58 global symbols\r
 M sh5\r
 S evalstr Ref00000000\r
 S cprompt Ref00000000\r
 S ?BANK_FAST_LEAVE_L08 Ref00000000\r
 S putn Ref00000000\r
 S strsave Ref00000000\r
+S getenv Ref00000000\r
 S err Ref00000000\r
 S env Ref00000000\r
 S dup Ref00000000\r
@@ -21,8 +22,10 @@ S newenv Ref00000000
 S multiline Ref00000000\r
 S ?BANK_LEAVE_DIRECT_L08 Ref00000000\r
 S lseek Ref00000000\r
+S uname Ref00000000\r
 S close Ref00000000\r
 S strlen Ref00000000\r
+S ?C_V_SWITCH_L06 Ref00000000\r
 S strcmp Ref00000000\r
 S getarea Ref00000000\r
 S ?LEAVE_DIRECT_L09 Ref00000000\r
@@ -34,6 +37,7 @@ S ?ENT_PARM_DIRECT_L09 Ref00000000
 S ?BANK_CALL_DIRECT_L08 Ref00000000\r
 S errno Ref00000000\r
 S sh_itoa Ref00000000\r
+S geteuid Ref00000000\r
 S ioargstack Ref00000000\r
 S areanum Ref00000000\r
 S talking Ref00000000\r
@@ -50,41 +54,43 @@ S ?CL64180B_4_06_L00 Ref00000000
 S _read Ref00000000\r
 S getpid Ref00000000\r
 S elinep Ref00000000\r
+S getcwd Ref00000000\r
 S .__.ABS. Def00000000\r
 A _DEFAULT size 0 flags 0\r
-A CODE size 12D2 flags 0\r
+A CODE size 1451 flags 0\r
 S herechar Def00000828\r
-S closepipe Def00000BAB\r
+S closepipe Def00000D2A\r
 S linechar Def0000098D\r
-S freehere Def0000117C\r
-S markhere Def00000BE1\r
-S closeall Def00000A5B\r
-S prn Def00000A23\r
-S remap Def00000A94\r
+S freehere Def000012FB\r
+S markhere Def00000D60\r
+S closeall Def00000BDA\r
+S prn Def00000BA2\r
+S remap Def00000C13\r
 S prs Def000009DA\r
-S tempname Def00001246\r
+S tempname Def000013C5\r
 S pushio Def00000281\r
 S eofc Def000000DA\r
 S dolchar Def00000535\r
-S openpipe Def00000B7A\r
+S openpipe Def00000CF9\r
 S unget Def000000B8\r
 S getc Def00000000\r
 S qgravechar Def000008AC\r
-S gethere Def00000D28\r
+S gethere Def00000EA7\r
 S setbase Def00000460\r
 S qstrchar Def0000061F\r
 S gravechar Def00000874\r
+S prs_expand Def00000A07\r
 S strchar Def000005E5\r
 S ioecho Def00000259\r
 S nlchar Def0000047B\r
 S wdchar Def000004C4\r
-S herein Def00000FB9\r
-S putc Def00000A07\r
-S closef Def00000A3D\r
-S scraphere Def00001104\r
+S herein Def00001138\r
+S putc Def00000B86\r
+S closef Def00000BBC\r
+S scraphere Def00001283\r
 S filechar Def0000065F\r
 S readc Def0000010A\r
-A CSTR size 92 flags 0\r
+A CSTR size B6 flags 0\r
 A UDATA0 size 6 flags 0\r
 A IDATA0 size 41C flags 0\r
 S temparg Def0000040E\r
@@ -92,9 +98,9 @@ A CDATA0 size 41C flags 0
 T 00 00 00 00\r
 R 00 00 01 00\r
 T 00 00 00 00 CD 00 00 00 00 FE FF ED 4B\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 07 00 00 00 00 00 00 00 2A 00 00 00 00 A7 ED\r
-R 00 00 01 00 02 04 06 00 02 09 30 00\r
+R 00 00 01 00 02 04 07 00 02 09 34 00\r
 T 0E 00 00 00 42 30 35\r
 R 00 00 01 00\r
 T 11 00 00 00\r
@@ -104,7 +110,7 @@ R 00 00 01 00
 T 11 00 00 00 3E 0A 01 00 00 21 0A 01 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 17 00 00 00 00 00 00 00 DD 75 FE DD 74 FF 3E\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 20 00 00 00 0A AD B4 28 0A DD 7E FE DD B6 FF\r
 R 00 00 01 00\r
 T 2B 00 00 00 28 02\r
@@ -120,11 +126,11 @@ R 00 00 01 00
 T 2F 00 00 00\r
 R 00 00 01 00\r
 T 2F 00 00 00 11 00 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 00 05 02 00 2B 0A 05 00\r
+R 00 00 01 00 00 05 02 00 2B 0A 06 00\r
 T 35 00 00 00 00 00 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 02 04 05 00 02 09 1E 00\r
+R 00 00 01 00 02 04 06 00 02 09 21 00\r
 T 3B 00 00 00 00 00 00 00 34 DD 6E FE DD 66 FF\r
-R 00 00 01 00 02 04 1B 00\r
+R 00 00 01 00 02 04 1E 00\r
 T 44 00 00 00 18 6F\r
 R 00 00 01 00\r
 T 46 00 00 00\r
@@ -132,11 +138,11 @@ R 00 00 01 00
 T 46 00 00 00 3E 0A 01 00 00 21 0A 01 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 4C 00 00 00 00 00 00 00 DD 75 FE DD 74 FF 3E\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 55 00 00 00 27 DD AE 02 DD B6 03 28 51 2A\r
 R 00 00 01 00\r
 T 5F 00 00 00 04 00 00 00 01 0A 00 09 46 05 05\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T 68 00 00 00 28 45\r
 R 00 00 01 00\r
 T 6A 00 00 00\r
@@ -152,7 +158,7 @@ R 00 00 01 00
 T 74 00 00 00 3E 0A 01 00 00 21 0A 01 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
 T 7A 00 00 00 00 00 00 00 DD 75 FE DD 74 FF 3E\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 83 00 00 00 0A AD B4 20 1A 3E 22 DD AE 02 DD\r
 R 00 00 01 00\r
 T 8E 00 00 00 B6 03 28 10\r
@@ -166,7 +172,7 @@ R 00 00 01 00
 T 92 00 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
 R 00 00 01 00 29 0B 01 00\r
 T 9A 00 00 00 21 00 00 00 00 CD 00 00 00 00 18\r
-R 00 00 01 00 00 05 01 00 02 0A 1E 00\r
+R 00 00 01 00 00 05 01 00 02 0A 21 00\r
 T A1 00 00 00 13\r
 R 00 00 01 00\r
 T A2 00 00 00\r
@@ -184,33 +190,33 @@ R 00 00 01 00
 T B5 00 00 00\r
 R 00 00 01 00\r
 T B5 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T B8 00 00 00\r
 R 00 00 01 00\r
 T B8 00 00 00 CD 00 00 00 00 ED 4B 02 00 00 00\r
-R 00 00 01 00 02 05 1D 00 02 0B 06 00\r
+R 00 00 01 00 02 05 20 00 02 0B 07 00\r
 T BF 00 00 00 2A 04 00 00 00 A7 ED 42 38 10\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T C7 00 00 00\r
 R 00 00 01 00\r
 T C7 00 00 00 2A 04 00 00 00 01 05 00 09 DD 4E\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T D0 00 00 00 02 DD 46 03 71 23 70\r
 R 00 00 01 00\r
 T D7 00 00 00\r
 R 00 00 01 00\r
 T D7 00 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T DA 00 00 00\r
 R 00 00 01 00\r
 T DA 00 00 00 C5 ED 4B 02 00 00 00 2A\r
-R 00 00 01 00 02 07 06 00\r
+R 00 00 01 00 02 07 07 00\r
 T E0 00 00 00 04 00 00 00 A7 ED 42 38 1C 2A\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T E8 00 00 00 04 00 00 00 01 05 00 09 7E 23 B6\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T F1 00 00 00 20 0B 2A 04 00 00 00 01 07 00 09\r
-R 00 00 01 00 02 07 06 00\r
+R 00 00 01 00 02 07 07 00\r
 T FA 00 00 00 7E B7 28 05\r
 R 00 00 01 00\r
 T FE 00 00 00\r
@@ -228,19 +234,19 @@ R 00 00 01 00 02 06 02 00
 T 0A 01 00 00\r
 R 00 00 01 00\r
 T 0A 01 00 00 CD 00 00 00 00 FE FF\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 0F 01 00 00\r
 R 00 00 01 00\r
 T 0F 01 00 00\r
 R 00 00 01 00\r
 T 0F 01 00 00 ED 4B 02 00 00 00 2A 04 00 00 00\r
-R 00 00 01 00 02 06 06 00 02 0B 06 00\r
+R 00 00 01 00 02 06 07 00 02 0B 07 00\r
 T 16 01 00 00 A7 ED 42 DA 3E 02 00 00\r
 R 00 00 01 00 00 08 01 00\r
 T 1C 01 00 00\r
 R 00 00 01 00\r
 T 1C 01 00 00 2A 04 00 00 00 01 05 00 09 46 23\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 25 01 00 00 66 68 DD 75 FE DD 74 FF 7D B4 28\r
 R 00 00 01 00\r
 T 30 01 00 00 14\r
@@ -248,7 +254,7 @@ R 00 00 01 00
 T 31 01 00 00\r
 R 00 00 01 00\r
 T 31 01 00 00 2A 04 00 00 00 01 05 00 09 AF 77\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 3A 01 00 00 23 77 DD 6E FE DD 66 FF C3\r
 R 00 00 01 00\r
 T 43 01 00 00 56 02 00 00\r
@@ -256,19 +262,19 @@ R 00 00 01 00 00 04 01 00
 T 45 01 00 00\r
 R 00 00 01 00\r
 T 45 01 00 00 2A 04 00 00 00 01 07 00 09 7E B7\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 4E 01 00 00 CA EF 01 00 00\r
 R 00 00 01 00 00 05 01 00\r
 T 51 01 00 00\r
 R 00 00 01 00\r
 T 51 01 00 00 ED 4B 04 00 00 00 C5 2A\r
-R 00 00 01 00 02 06 06 00\r
+R 00 00 01 00 02 06 07 00\r
 T 57 01 00 00 04 00 00 00 23 23 23 5E 23 56 2A\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T 60 01 00 00 04 00 00 00 4E 23 46 23 7E 69 60\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T 69 01 00 00 C1 CD 00 00 00 00 DD 75 FE DD 74\r
-R 00 00 01 00 02 06 1E 00\r
+R 00 00 01 00 02 06 21 00\r
 T 72 01 00 00 FF 7D B4 28 3D\r
 R 00 00 01 00\r
 T 77 01 00 00\r
@@ -278,13 +284,13 @@ R 00 00 01 00
 T 80 01 00 00\r
 R 00 00 01 00\r
 T 80 01 00 00 2A 04 00 00 00 01 0B 00 09 22\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 88 01 00 00 04 00 00 00 C3 31 02 00 00\r
-R 00 00 01 00 02 04 06 00 00 09 01 00\r
+R 00 00 01 00 02 04 07 00 00 09 01 00\r
 T 8D 01 00 00\r
 R 00 00 01 00\r
 T 8D 01 00 00 2A 04 00 00 00 01 00 00 00 00 A7\r
-R 00 00 01 00 02 05 06 00 02 0A 29 00\r
+R 00 00 01 00 02 05 07 00 02 0A 2D 00\r
 T 94 01 00 00 ED 42 20 0B\r
 R 00 00 01 00\r
 T 98 01 00 00\r
@@ -292,19 +298,19 @@ R 00 00 01 00
 T 98 01 00 00 DD 5E FE 3E 59 02 00 00 21\r
 R 00 00 01 00 29 08 01 00\r
 T 9E 01 00 00 59 02 00 00 CD 00 00 00 00\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
 T A3 01 00 00\r
 R 00 00 01 00\r
 T A3 01 00 00 2A 04 00 00 00 01 07 00 09 DD 46\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T AC 01 00 00 FE 70 68 26 00 C3 56 02 00 00\r
 R 00 00 01 00 00 0A 01 00\r
 T B4 01 00 00\r
 R 00 00 01 00\r
 T B4 01 00 00 2A 04 00 00 00 01 0A 00 09 7E FE\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T BD 01 00 00 03 20 2F 2A 04 00 00 00 01 07 00\r
-R 00 00 01 00 02 08 06 00\r
+R 00 00 01 00 02 08 07 00\r
 T C6 01 00 00 09 7E FE 0A 28 23\r
 R 00 00 01 00\r
 T CC 01 00 00\r
@@ -314,9 +320,9 @@ R 00 00 01 00
 T CC 01 00 00\r
 R 00 00 01 00\r
 T CC 01 00 00 2A 04 00 00 00 01 07 00 09 36 00\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T D5 01 00 00 2A 04 00 00 00 01 00 00 00 00 A7\r
-R 00 00 01 00 02 05 06 00 02 0A 29 00\r
+R 00 00 01 00 02 05 07 00 02 0A 2D 00\r
 T DC 01 00 00 ED 42 20 0A\r
 R 00 00 01 00\r
 T E0 01 00 00\r
@@ -324,7 +330,7 @@ R 00 00 01 00
 T E0 01 00 00 1E 0A 3E 59 02 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
 T E5 01 00 00 59 02 00 00 CD 00 00 00 00\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
 T EA 01 00 00\r
 R 00 00 01 00\r
 T EA 01 00 00 21 0A 00 18 67\r
@@ -334,25 +340,25 @@ R 00 00 01 00
 T EF 01 00 00\r
 R 00 00 01 00\r
 T EF 01 00 00 2A 04 00 00 00 01 0A 00 09 7E FE\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T F8 01 00 00 03 20 36\r
 R 00 00 01 00\r
 T FB 01 00 00\r
 R 00 00 01 00\r
 T FB 01 00 00 2A 00 00 00 00 7D B4 28 0F\r
-R 00 00 01 00 02 05 11 00\r
+R 00 00 01 00 02 05 12 00\r
 T 02 02 00 00\r
 R 00 00 01 00\r
 T 02 02 00 00 2A 04 00 00 00 01 07 00 09 36 00\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 0B 02 00 00 2E 00 26 00 18 45\r
 R 00 00 01 00\r
 T 11 02 00 00\r
 R 00 00 01 00\r
 T 11 02 00 00 2A 00 00 00 00 7D B4 28 19 2A\r
-R 00 00 01 00 02 05 23 00\r
+R 00 00 01 00 02 05 27 00\r
 T 19 02 00 00 04 00 00 00 01 0B 00 00 00 A7 ED\r
-R 00 00 01 00 02 04 06 00 02 09 29 00\r
+R 00 00 01 00 02 04 07 00 02 09 2D 00\r
 T 20 02 00 00 42 20 0E\r
 R 00 00 01 00\r
 T 23 02 00 00\r
@@ -362,11 +368,11 @@ R 00 00 01 00
 T 23 02 00 00\r
 R 00 00 01 00\r
 T 23 02 00 00 2A 00 00 00 00 5E 23 56 3E\r
-R 00 00 01 00 02 05 1C 00\r
-T 2A 02 00 00 DA 09 00 00 21 DA 09 00 00 CD\r
+R 00 00 01 00 02 05 1F 00\r
+T 2A 02 00 00 07 0A 00 00 21 07 0A 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T 2F 02 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 31 02 00 00\r
 R 00 00 01 00\r
 T 31 02 00 00\r
@@ -374,13 +380,13 @@ R 00 00 01 00
 T 31 02 00 00\r
 R 00 00 01 00\r
 T 31 02 00 00 2A 04 00 00 00 01 F5 FF 09 22\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 39 02 00 00 04 00 00 00 C3 0F 01 00 00\r
-R 00 00 01 00 02 04 06 00 00 09 01 00\r
+R 00 00 01 00 02 04 07 00 00 09 01 00\r
 T 3E 02 00 00\r
 R 00 00 01 00\r
 T 3E 02 00 00 01 00 00 00 00 2A 04 00 00 00 A7\r
-R 00 00 01 00 02 05 29 00 02 0A 06 00\r
+R 00 00 01 00 02 05 2D 00 02 0A 07 00\r
 T 45 02 00 00 ED 42 38 05\r
 R 00 00 01 00\r
 T 49 02 00 00\r
@@ -390,55 +396,55 @@ R 00 00 01 00
 T 4E 02 00 00\r
 R 00 00 01 00\r
 T 4E 02 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 0C 00 02 0A 0C 00\r
+R 00 00 01 00 2B 05 0D 00 02 0A 0D 00\r
 T 54 02 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 56 02 00 00\r
 R 00 00 01 00\r
 T 56 02 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 59 02 00 00\r
 R 00 00 01 00\r
 T 59 02 00 00 CD 00 00 00 00 21 76 00 ED 4B\r
-R 00 00 01 00 02 05 1D 00\r
+R 00 00 01 00 02 05 20 00\r
 T 61 02 00 00 00 00 00 00 09 7E B7 28 16\r
-R 00 00 01 00 02 04 19 00\r
+R 00 00 01 00 02 04 1C 00\r
 T 68 02 00 00\r
 R 00 00 01 00\r
 T 68 02 00 00 21 01 00 E5 21 04 00 39 4D 44 11\r
 R 00 00 01 00\r
 T 73 02 00 00 02 00 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 08 00\r
+R 00 00 01 00 2B 07 09 00\r
 T 78 02 00 00 00 00 00 00 CD 00 00 00 00 F1\r
-R 00 00 01 00 02 04 08 00 02 09 1E 00\r
+R 00 00 01 00 02 04 09 00 02 09 21 00\r
 T 7E 02 00 00\r
 R 00 00 01 00\r
 T 7E 02 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 81 02 00 00\r
 R 00 00 01 00\r
 T 81 02 00 00 CD 00 00 00 00 01 58 00 00 00 2A\r
-R 00 00 01 00 02 05 1D 00 02 0A 29 00\r
+R 00 00 01 00 02 05 20 00 02 0A 2D 00\r
 T 88 02 00 00 04 00 00 00 11 0B 00 19 22\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T 8F 02 00 00 04 00 00 00 A7 ED 42 38 1C\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T 96 02 00 00\r
 R 00 00 01 00\r
 T 96 02 00 00 2A 04 00 00 00 01 F5 FF 09 22\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 9E 02 00 00 04 00 00 00 11 14 00 00 00 3E\r
-R 00 00 01 00 02 04 06 00 00 09 02 00\r
+R 00 00 01 00 02 04 07 00 00 09 02 00\r
 T A4 02 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 05 00 02 09 05 00\r
+R 00 00 01 00 2B 04 06 00 02 09 06 00\r
 T A9 02 00 00 00 00 00 00 21 00 00 00 00 34 C3\r
-R 00 00 01 00 02 04 1E 00 02 09 1B 00\r
+R 00 00 01 00 02 04 21 00 02 09 1E 00\r
 T B0 02 00 00 5D 04 00 00\r
 R 00 00 01 00 00 04 01 00\r
 T B2 02 00 00\r
 R 00 00 01 00\r
 T B2 02 00 00 2A 04 00 00 00 DD 56 0C DD 4E 0A\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T BB 02 00 00 DD 46 0B 71 23 70 23 72 21 06 00\r
 R 00 00 01 00\r
 T C6 02 00 00 DD 4E 02 DD 46 03 09 7E 23 A6 3C\r
@@ -448,31 +454,31 @@ R 00 00 01 00
 T D3 02 00 00\r
 R 00 00 01 00\r
 T D3 02 00 00 2A 04 00 00 00 23 23 23 DD 4E 02\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T DC 02 00 00 DD 46 03 71 23 70 C3 C4 03 00 00\r
 R 00 00 01 00 00 0B 01 00\r
 T E5 02 00 00\r
 R 00 00 01 00\r
 T E5 02 00 00 2A 04 00 00 00 23 23 23 E5 01\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T ED 02 00 00 00 00 00 00 2A 04 00 00 00 A7 ED\r
-R 00 00 01 00 02 04 29 00 02 09 06 00\r
+R 00 00 01 00 02 04 2D 00 02 09 07 00\r
 T F4 02 00 00 42 EB 01 0B 00 CD 00 00 00 00 01\r
-R 00 00 01 00 02 0A 2C 00\r
+R 00 00 01 00 02 0A 30 00\r
 T FD 02 00 00 0E 00 CD 00 00 00 00 21\r
-R 00 00 01 00 02 07 09 00\r
+R 00 00 01 00 02 07 0A 00\r
 T 03 03 00 00 00 00 00 00 19 4D 44 E1 71 23 70\r
-R 00 00 01 00 02 04 21 00\r
+R 00 00 01 00 02 04 25 00\r
 T 0C 03 00 00 2A 04 00 00 00 23 23 23 5E 23 56\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 15 03 00 00 DD 6E 02 DD 66 03 01 0E 00 ED B0\r
 R 00 00 01 00\r
 T 20 03 00 00 2A 04 00 00 00 23 23 23 46 23 66\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 29 03 00 00 68 01 0C 00 09 E5 2A 04 00 00 00\r
-R 00 00 01 00 02 0B 06 00\r
+R 00 00 01 00 02 0B 07 00\r
 T 32 03 00 00 01 00 00 00 00 A7 ED 42 20 05 11\r
-R 00 00 01 00 02 05 29 00\r
+R 00 00 01 00 02 05 2D 00\r
 T 3B 03 00 00 06 02 00 00 18 03\r
 R 00 00 01 00 00 04 04 00\r
 T 3F 03 00 00\r
@@ -482,25 +488,25 @@ R 00 00 01 00 00 05 04 00
 T 42 03 00 00\r
 R 00 00 01 00\r
 T 42 03 00 00 E1 73 23 72 2A 04 00 00 00 23 23\r
-R 00 00 01 00 02 09 06 00\r
+R 00 00 01 00 02 09 07 00\r
 T 4B 03 00 00 23 46 23 66 68 01 04 00 09 5E 23\r
 R 00 00 01 00\r
 T 56 03 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 06 1A 00 02 0B 1A 00\r
+R 00 00 01 00 2B 06 1D 00 02 0B 1D 00\r
 T 5C 03 00 00 CD 00 00 00 00 7D B4 20 61 2A\r
-R 00 00 01 00 02 05 1E 00\r
+R 00 00 01 00 02 05 21 00\r
 T 64 03 00 00 04 00 00 00 01 00 00 00 00 A7 ED\r
-R 00 00 01 00 02 04 06 00 02 09 29 00\r
+R 00 00 01 00 02 04 07 00 02 09 2D 00\r
 T 6B 03 00 00 42 28 2F 21 01 00 E5 21 00 00 E5\r
 R 00 00 01 00\r
 T 76 03 00 00 21 00 00 E5 2A 04 00 00 00 23 23\r
-R 00 00 01 00 02 09 06 00\r
+R 00 00 01 00 02 09 07 00\r
 T 7F 03 00 00 23 46 23 66 68 01 04 00 09 5E 23\r
 R 00 00 01 00\r
 T 8A 03 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 06 13 00 02 0B 13 00\r
+R 00 00 01 00 2B 06 14 00 02 0B 14 00\r
 T 90 03 00 00 CD 00 00 00 00 F1 F1 F1 7D A4 A1\r
-R 00 00 01 00 02 05 1E 00\r
+R 00 00 01 00 02 05 21 00\r
 T 99 03 00 00 A0 3C 28 27\r
 R 00 00 01 00\r
 T 9D 03 00 00\r
@@ -524,7 +530,7 @@ R 00 00 01 00 00 08 04 00
 T AF 03 00 00\r
 R 00 00 01 00\r
 T AF 03 00 00 2A 04 00 00 00 23 23 23 46 23 66\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T B8 03 00 00 68 01 06 00 09 ED 4B 0C 04 00 00\r
 R 00 00 01 00 00 0B 04 00\r
 T C1 03 00 00 71 23 70\r
@@ -534,13 +540,13 @@ R 00 00 01 00
 T C4 03 00 00\r
 R 00 00 01 00\r
 T C4 03 00 00 2A 04 00 00 00 01 07 00 09 36 F5\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T CD 03 00 00 2A 04 00 00 00 01 05 00 09 AF 77\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T D6 03 00 00 23 77 2A 04 00 00 00 01 09 00 09\r
-R 00 00 01 00 02 07 06 00\r
+R 00 00 01 00 02 07 07 00\r
 T DF 03 00 00 36 00 2A 04 00 00 00 01 08 00 09\r
-R 00 00 01 00 02 07 06 00\r
+R 00 00 01 00 02 07 07 00\r
 T E8 03 00 00 36 00 0E 5F 06 00 00 11\r
 R 00 00 01 00 29 07 01 00\r
 T ED 03 00 00 5F 06 00 00 DD 7E 0C DD 6E 0A DD\r
@@ -562,7 +568,7 @@ R 00 00 01 00
 T 14 04 00 00\r
 R 00 00 01 00\r
 T 14 04 00 00 2A 04 00 00 00 01 0A 00 09 36 03\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 1D 04 00 00 18 3E\r
 R 00 00 01 00\r
 T 1F 04 00 00\r
@@ -588,13 +594,13 @@ R 00 00 01 00
 T 49 04 00 00\r
 R 00 00 01 00\r
 T 49 04 00 00 2A 04 00 00 00 01 0A 00 09 36 02\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 52 04 00 00 18 09\r
 R 00 00 01 00\r
 T 54 04 00 00\r
 R 00 00 01 00\r
 T 54 04 00 00 2A 04 00 00 00 01 0A 00 09 36 00\r
-R 00 00 01 00 02 05 06 00\r
+R 00 00 01 00 02 05 07 00\r
 T 5D 04 00 00\r
 R 00 00 01 00\r
 T 5D 04 00 00\r
@@ -602,21 +608,21 @@ R 00 00 01 00
 T 5D 04 00 00\r
 R 00 00 01 00\r
 T 5D 04 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 60 04 00 00\r
 R 00 00 01 00\r
 T 60 04 00 00 CD 00 00 00 00 FE FF 2A\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 66 04 00 00 02 00 00 00 DD 75 FE DD 74 FF DD\r
-R 00 00 01 00 02 04 06 00\r
+R 00 00 01 00 02 04 07 00\r
 T 6F 04 00 00 4E 02 DD 46 03 ED 43 02 00 00 00\r
-R 00 00 01 00 02 0B 06 00\r
+R 00 00 01 00 02 0B 07 00\r
 T 78 04 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 7B 04 00 00\r
 R 00 00 01 00\r
 T 7B 04 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 84 04 00 00 66 03 7E 23 B6 20 05\r
 R 00 00 01 00\r
 T 8B 04 00 00\r
@@ -644,11 +650,11 @@ R 00 00 01 00
 T C1 04 00 00\r
 R 00 00 01 00\r
 T C1 04 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T C4 04 00 00\r
 R 00 00 01 00\r
 T C4 04 00 00 CD 00 00 00 00 FC FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T CD 04 00 00 66 03 23 23 46 23 66 68 DD 75 FD\r
 R 00 00 01 00\r
 T D8 04 00 00 DD 74 FE 7D B4 20 05\r
@@ -690,11 +696,11 @@ R 00 00 01 00
 T 32 05 00 00\r
 R 00 00 01 00\r
 T 32 05 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 35 05 00 00\r
 R 00 00 01 00\r
 T 35 05 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 3E 05 00 00 66 03 23 23 4E 23 46 59 50 13 13\r
 R 00 00 01 00\r
 T 49 05 00 00 72 2B 73 0A 6F 03 0A 67 DD 75 FE\r
@@ -722,7 +728,7 @@ R 00 00 01 00 00 08 04 00
 T 88 05 00 00 81 02 00 00 21 81 02 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
 T 8D 05 00 00 00 00 00 00 E1 E1 21 FF FF 18 03\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 96 05 00 00\r
 R 00 00 01 00\r
 T 96 05 00 00 21 00 00\r
@@ -730,11 +736,11 @@ R 00 00 01 00
 T 99 05 00 00\r
 R 00 00 01 00\r
 T 99 05 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 9C 05 00 00\r
 R 00 00 01 00\r
 T 9C 05 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T A5 05 00 00 66 03 7E 23 B6 20 05\r
 R 00 00 01 00\r
 T AC 05 00 00\r
@@ -762,11 +768,11 @@ R 00 00 01 00
 T E2 05 00 00\r
 R 00 00 01 00\r
 T E2 05 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T E5 05 00 00\r
 R 00 00 01 00\r
 T E5 05 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T EE 05 00 00 66 03 7E 23 B6 28 1C DD 6E 02 DD\r
 R 00 00 01 00\r
 T F9 05 00 00 66 03 4E 23 46 03 70 2B 71 0B 0A\r
@@ -790,11 +796,11 @@ R 00 00 01 00
 T 1C 06 00 00\r
 R 00 00 01 00\r
 T 1C 06 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 1F 06 00 00\r
 R 00 00 01 00\r
 T 1F 06 00 00 CD 00 00 00 00 FE FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 28 06 00 00 66 03 7E 23 B6 28 1C DD 6E 02 DD\r
 R 00 00 01 00\r
 T 33 06 00 00 66 03 4E 23 46 03 70 2B 71 0B 0A\r
@@ -820,11 +826,11 @@ R 00 00 01 00
 T 5C 06 00 00\r
 R 00 00 01 00\r
 T 5C 06 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 5F 06 00 00\r
 R 00 00 01 00\r
 T 5F 06 00 00 CD 00 00 00 00 FA FF 21 0C 00 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 68 06 00 00 4E 02 DD 46 03 09 56 23 66 6A DD\r
 R 00 00 01 00\r
 T 73 06 00 00 75 FD DD 74 FE 21 06 00 09 7E 23\r
@@ -872,9 +878,9 @@ R 00 00 01 00
 T EE 06 00 00 D5 21 04 00 DD 4E 02 DD 46 03 09\r
 R 00 00 01 00\r
 T F9 06 00 00 5E 23 56 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 08 13 00\r
+R 00 00 01 00 2B 08 14 00\r
 T FF 06 00 00 00 00 00 00 CD 00 00 00 00 F1 F1\r
-R 00 00 01 00 02 04 13 00 02 09 1E 00\r
+R 00 00 01 00 02 04 14 00 02 09 21 00\r
 T 06 07 00 00 F1\r
 R 00 00 01 00\r
 T 07 07 00 00\r
@@ -886,27 +892,27 @@ R 00 00 01 00
 T 12 07 00 00 03 21 04 00 DD 5E 02 DD 56 03 19\r
 R 00 00 01 00\r
 T 1D 07 00 00 5E 23 56 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 08 2E 00\r
+R 00 00 01 00 2B 08 32 00\r
 T 23 07 00 00 00 00 00 00 CD 00 00 00 00 F1 DD\r
-R 00 00 01 00 02 04 2E 00 02 09 1E 00\r
+R 00 00 01 00 02 04 32 00 02 09 21 00\r
 T 2A 07 00 00 75 FA DD 74 FB CB 7C 28 09 2A\r
 R 00 00 01 00\r
 T 34 07 00 00 00 00 00 00 3E 04 AD B4 28 CB\r
-R 00 00 01 00 02 04 1F 00\r
+R 00 00 01 00 02 04 22 00\r
 T 3C 07 00 00\r
 R 00 00 01 00\r
 T 3C 07 00 00 DD 4E FA DD 46 FB 21 00 00 CD\r
 R 00 00 01 00\r
 T 46 07 00 00 00 00 00 00 38 1B\r
-R 00 00 01 00 02 04 2A 00\r
+R 00 00 01 00 02 04 2E 00\r
 T 4A 07 00 00\r
 R 00 00 01 00\r
 T 4A 07 00 00 21 04 00 DD 4E 02 DD 46 03 09 5E\r
 R 00 00 01 00\r
-T 55 07 00 00 23 56 3E 3D 0A 00 00 21\r
+T 55 07 00 00 23 56 3E BC 0B 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T 5A 07 00 00 3D 0A 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
+T 5A 07 00 00 BC 0B 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
 T 60 07 00 00 00 00 C3 25 08 00 00\r
 R 00 00 01 00 00 07 01 00\r
 T 65 07 00 00\r
@@ -928,7 +934,7 @@ R 00 00 01 00
 T 9F 07 00 00 21 08 00 DD 4E 02 DD 46 03 09 CD\r
 R 00 00 01 00\r
 T AA 07 00 00 00 00 00 00 21 02 02 DD 4E FD DD\r
-R 00 00 01 00 02 04 25 00\r
+R 00 00 01 00 02 04 29 00\r
 T B3 07 00 00 46 FE 09 4E 23 46 03 70 2B 71 0B\r
 R 00 00 01 00\r
 T BE 07 00 00 0A E6 7F 6F 26 00 18 5F\r
@@ -942,11 +948,11 @@ R 00 00 01 00
 T D1 07 00 00 04 00 DD 5E 02 DD 56 03 19 5E 23\r
 R 00 00 01 00\r
 T DC 07 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 06 2E 00 02 0B 2E 00\r
+R 00 00 01 00 2B 06 32 00 02 0B 32 00\r
 T E2 07 00 00 CD 00 00 00 00 F1 DD 75 FA DD 74\r
-R 00 00 01 00 02 05 1E 00\r
+R 00 00 01 00 02 05 21 00\r
 T EB 07 00 00 FB CB 7C 28 09 2A 00 00 00 00 3E\r
-R 00 00 01 00 02 0A 1F 00\r
+R 00 00 01 00 02 0A 22 00\r
 T F4 07 00 00 04 AD B4 28 CD\r
 R 00 00 01 00\r
 T F9 07 00 00\r
@@ -959,10 +965,10 @@ T 0D 08 00 00
 R 00 00 01 00\r
 T 0D 08 00 00 21 04 00 DD 4E 02 DD 46 03 09 5E\r
 R 00 00 01 00\r
-T 18 08 00 00 23 56 3E 3D 0A 00 00 21\r
+T 18 08 00 00 23 56 3E BC 0B 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T 1D 08 00 00 3D 0A 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
+T 1D 08 00 00 BC 0B 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
 T 23 08 00 00 00 00\r
 R 00 00 01 00\r
 T 25 08 00 00\r
@@ -970,41 +976,41 @@ R 00 00 01 00
 T 25 08 00 00\r
 R 00 00 01 00\r
 T 25 08 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 28 08 00 00\r
 R 00 00 01 00\r
 T 28 08 00 00 CD 00 00 00 00 FE FF 21 01 00 E5\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 31 08 00 00 21 02 00 39 4D 44 21 04 00 DD 5E\r
 R 00 00 01 00\r
 T 3C 08 00 00 02 DD 56 03 19 5E 23 56 3E\r
 R 00 00 01 00\r
 T 45 08 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 2E 00 02 09 2E 00\r
+R 00 00 01 00 2B 04 32 00 02 09 32 00\r
 T 4A 08 00 00 00 00 00 00 F1 3E 01 AD B4 28 19\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 53 08 00 00\r
 R 00 00 01 00\r
 T 53 08 00 00 21 04 00 DD 4E 02 DD 46 03 09 5E\r
 R 00 00 01 00\r
 T 5E 08 00 00 23 56 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 14 00\r
+R 00 00 01 00 2B 07 16 00\r
 T 63 08 00 00 00 00 00 00 CD 00 00 00 00 DD 36\r
-R 00 00 01 00 02 04 14 00 02 09 1E 00\r
+R 00 00 01 00 02 04 16 00 02 09 21 00\r
 T 6A 08 00 00 FE 00\r
 R 00 00 01 00\r
 T 6C 08 00 00\r
 R 00 00 01 00\r
 T 6C 08 00 00 DD 6E FE 26 00 C3 00 00 00 00\r
-R 00 00 01 00 02 0A 12 00\r
+R 00 00 01 00 02 0A 13 00\r
 T 74 08 00 00\r
 R 00 00 01 00\r
 T 74 08 00 00 CD 00 00 00 00 FE FF DD 5E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 7D 08 00 00 56 03 3E AC 08 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
 T 82 08 00 00 AC 08 00 00 CD 00 00 00 00 7D E6\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
 T 89 08 00 00 7F 4F 7C E6 FF 47 DD 71 FE DD 70\r
 R 00 00 01 00\r
 T 94 08 00 00 FF 3E 0A A9 B0 20 08\r
@@ -1016,11 +1022,11 @@ R 00 00 01 00
 T A3 08 00 00\r
 R 00 00 01 00\r
 T A3 08 00 00 DD 6E FE DD 66 FF C3 00 00 00 00\r
-R 00 00 01 00 02 0B 12 00\r
+R 00 00 01 00 02 0B 13 00\r
 T AC 08 00 00\r
 R 00 00 01 00\r
 T AC 08 00 00 CD 00 00 00 00 FE FF 21 09 00 09\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T B5 08 00 00 7E B7 28 3A\r
 R 00 00 01 00\r
 T B9 08 00 00\r
@@ -1048,7 +1054,7 @@ R 00 00 01 00
 T F3 08 00 00 DD 5E 02 DD 56 03 3E 5F 06 00 00\r
 R 00 00 01 00 29 0B 01 00\r
 T FB 08 00 00 21 5F 06 00 00 CD 00 00 00 00 DD\r
-R 00 00 01 00 00 05 01 00 02 0A 1E 00\r
+R 00 00 01 00 00 05 01 00 02 0A 21 00\r
 T 02 09 00 00 75 FE DD 74 FF 3E 0A AD B4 20 64\r
 R 00 00 01 00\r
 T 0D 09 00 00\r
@@ -1062,7 +1068,7 @@ R 00 00 01 00
 T 19 09 00 00 DD 5E 02 DD 56 03 3E 5F 06 00 00\r
 R 00 00 01 00 29 0B 01 00\r
 T 21 09 00 00 21 5F 06 00 00 CD 00 00 00 00 DD\r
-R 00 00 01 00 00 05 01 00 02 0A 1E 00\r
+R 00 00 01 00 00 05 01 00 02 0A 21 00\r
 T 28 09 00 00 75 FE DD 74 FF 3E 0A AD B4 20 0D\r
 R 00 00 01 00\r
 T 33 09 00 00\r
@@ -1104,29 +1110,29 @@ R 00 00 01 00
 T 8A 09 00 00\r
 R 00 00 01 00\r
 T 8A 09 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 8D 09 00 00\r
 R 00 00 01 00\r
 T 8D 09 00 00 CD 00 00 00 00 FE FF DD 5E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
+R 00 00 01 00 02 05 28 00\r
 T 96 09 00 00 56 03 3E 5F 06 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
 T 9B 09 00 00 5F 06 00 00 CD 00 00 00 00 DD 75\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
 T A2 09 00 00 FE DD 74 FF 3E 0A AD B4 20 25\r
 R 00 00 01 00\r
 T AC 09 00 00\r
 R 00 00 01 00\r
 T AC 09 00 00 2A 00 00 00 00 7D B4 20 1E\r
-R 00 00 01 00 02 05 11 00\r
+R 00 00 01 00 02 05 12 00\r
 T B3 09 00 00\r
 R 00 00 01 00\r
 T B3 09 00 00 21 04 00 DD 4E 02 DD 46 03 09 5E\r
 R 00 00 01 00\r
-T BE 09 00 00 23 56 3E 3D 0A 00 00 21\r
+T BE 09 00 00 23 56 3E BC 0B 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T C3 09 00 00 3D 0A 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
+T C3 09 00 00 BC 0B 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
 T C9 09 00 00 04 00 09 36 FF 23 36 FF\r
 R 00 00 01 00\r
 T D1 09 00 00\r
@@ -1134,915 +1140,1089 @@ R 00 00 01 00
 T D1 09 00 00\r
 R 00 00 01 00\r
 T D1 09 00 00 DD 6E FE DD 66 FF C3 00 00 00 00\r
-R 00 00 01 00 02 0B 12 00\r
+R 00 00 01 00 02 0B 13 00\r
 T DA 09 00 00\r
 R 00 00 01 00\r
 T DA 09 00 00 CD 00 00 00 00 6B 62 AF B6 28 21\r
-R 00 00 01 00 02 05 1D 00\r
+R 00 00 01 00 02 05 20 00\r
 T E3 09 00 00\r
 R 00 00 01 00\r
 T E3 09 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 15 00\r
+R 00 00 01 00 2B 0B 17 00\r
 T EB 09 00 00 21 00 00 00 00 CD 00 00 00 00 E5\r
-R 00 00 01 00 02 05 15 00 02 0A 1E 00\r
+R 00 00 01 00 02 05 17 00 02 0A 21 00\r
 T F2 09 00 00 DD 4E 02 DD 46 03 11 02 00 3E\r
 R 00 00 01 00\r
 T FC 09 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 08 00 02 09 08 00\r
+R 00 00 01 00 2B 04 09 00 02 09 09 00\r
 T 01 0A 00 00 00 00 00 00 F1\r
-R 00 00 01 00 02 04 1E 00\r
+R 00 00 01 00 02 04 21 00\r
 T 04 0A 00 00\r
 R 00 00 01 00\r
 T 04 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+R 00 00 01 00 02 05 13 00\r
 T 07 0A 00 00\r
 R 00 00 01 00\r
-T 07 0A 00 00 CD 00 00 00 00 21 01 00 E5 21\r
-R 00 00 01 00 02 05 1D 00\r
-T 0F 0A 00 00 04 00 39 4D 44 11 02 00 3E\r
-R 00 00 01 00\r
-T 18 0A 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 08 00 02 09 08 00\r
-T 1D 0A 00 00 00 00 00 00 F1 C3 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00 02 0A 12 00\r
-T 23 0A 00 00\r
-R 00 00 01 00\r
-T 23 0A 00 00 CD 00 00 00 00 01 00 00 3E\r
-R 00 00 01 00 02 05 1D 00\r
-T 2A 0A 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 20 00 02 09 20 00\r
-T 2F 0A 00 00 00 00 00 00 EB 3E DA 09 00 00 21\r
-R 00 00 01 00 02 04 1E 00 29 0A 01 00\r
-T 35 0A 00 00 DA 09 00 00 CD 00 00 00 00 C3\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
-T 3B 0A 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 12 00\r
-T 3D 0A 00 00\r
-R 00 00 01 00\r
-T 3D 0A 00 00 CD 00 00 00 00 4B 42 21 02 00 CD\r
-R 00 00 01 00 02 05 1D 00\r
-T 46 0A 00 00 00 00 00 00 30 0E\r
-R 00 00 01 00 02 04 2A 00\r
-T 4A 0A 00 00\r
-R 00 00 01 00\r
-T 4A 0A 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 14 00\r
-T 52 0A 00 00 21 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 14 00 02 0A 1E 00\r
-T 58 0A 00 00\r
-R 00 00 01 00\r
-T 58 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
-T 5B 0A 00 00\r
+T 07 0A 00 00 CD 00 00 00 00 BA FE 21 00 00 39\r
+R 00 00 01 00 02 05 28 00\r
+T 10 0A 00 00 DD 4E 02 DD 46 03 71 23 70\r
 R 00 00 01 00\r
-T 5B 0A 00 00 CD 00 00 00 00 FE FF DD 36 FE 0A\r
-R 00 00 01 00 02 05 24 00\r
-T 64 0A 00 00 DD 36 FF 00\r
+T 19 0A 00 00\r
 R 00 00 01 00\r
-T 68 0A 00 00\r
+T 19 0A 00 00 21 00 00 39 7E 23 66 6F AF B6 CA\r
 R 00 00 01 00\r
-T 68 0A 00 00 01 14 80 DD 6E FE DD 66 FF 3E 80\r
+T 24 0A 00 00 75 0B 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 26 0A 00 00\r
 R 00 00 01 00\r
-T 73 0A 00 00 AC 67 ED 42 30 18\r
+T 26 0A 00 00 21 00 00 39 7E 23 66 6F 7E FE 5C\r
 R 00 00 01 00\r
-T 79 0A 00 00\r
+T 31 0A 00 00 C2 69 0B 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 34 0A 00 00\r
 R 00 00 01 00\r
-T 79 0A 00 00 DD 5E FE DD 56 FF 13 DD 73 FE DD\r
+T 34 0A 00 00 DD 4E 02 DD 46 03 21 00 00 39 56\r
 R 00 00 01 00\r
-T 84 0A 00 00 72 FF 1B 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 08 14 00\r
-T 8A 0A 00 00 00 00 00 00 CD 00 00 00 00 18 D7\r
-R 00 00 01 00 02 04 14 00 02 09 1E 00\r
-T 91 0A 00 00\r
+T 3F 0A 00 00 23 66 6A A7 ED 42 E5 DD 4E 02 DD\r
 R 00 00 01 00\r
-T 91 0A 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
-T 94 0A 00 00\r
+T 4A 0A 00 00 46 03 11 02 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 09 00\r
+T 52 0A 00 00 00 00 00 00 CD 00 00 00 00 F1 21\r
+R 00 00 01 00 02 04 09 00 02 09 21 00\r
+T 59 0A 00 00 00 00 39 4E 23 46 03 70 2B 71 DD\r
 R 00 00 01 00\r
-T 94 0A 00 00 CD 00 00 00 00 D6 FF ED 4B\r
-R 00 00 01 00 02 05 24 00\r
-T 9B 0A 00 00 08 00 00 00 DD 6E 02 DD 66 03 CD\r
-R 00 00 01 00 02 04 06 00\r
-T A4 0A 00 00 00 00 00 00 D2 71 0B 00 00\r
-R 00 00 01 00 02 04 2A 00 00 09 01 00\r
-T A9 0A 00 00\r
+T 64 0A 00 00 71 02 DD 70 03 21 00 00 39 7E 23\r
 R 00 00 01 00\r
-T A9 0A 00 00 AF DD 77 D6 DD 77 D7\r
+T 6F 0A 00 00 66 6F 5E CD 00 00 00 00 04 00 23\r
+R 00 00 01 00 02 08 18 00\r
+T 78 0A 00 00 68 75 77 69 0B 00 00 2F 0B 00 00\r
+R 00 00 01 00 00 07 01 00 00 0B 01 00\r
+T 7F 0A 00 00 B4 0A 00 00 F4 0A 00 00\r
+R 00 00 01 00 00 04 01 00 00 08 01 00\r
+T 83 0A 00 00 85 0A 00 00\r
+R 00 00 01 00 00 04 01 00\r
+T 85 0A 00 00\r
 R 00 00 01 00\r
-T B0 0A 00 00\r
+T 85 0A 00 00 DD 34 02 20 03 DD 34 03\r
 R 00 00 01 00\r
-T B0 0A 00 00 01 14 80 DD 6E D6 DD 66 D7 3E 80\r
+T 8D 0A 00 00\r
 R 00 00 01 00\r
-T BB 0A 00 00 AC 67 ED 42 30 1E\r
+T 8D 0A 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 24 00 02 0A 24 00\r
+T 93 0A 00 00 00 00 00 00 7D B4 20 0D\r
+R 00 00 01 00 02 04 21 00\r
+T 99 0A 00 00\r
 R 00 00 01 00\r
-T C1 0A 00 00\r
+T 99 0A 00 00 11 32 00 00 00 3E DA 09 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T 9F 0A 00 00 DA 09 00 00 CD 00 00 00 00 18 0B\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T A6 0A 00 00\r
 R 00 00 01 00\r
-T C1 0A 00 00 DD 6E D6 DD 66 D7 29 E5 21 04 00\r
+T A6 0A 00 00 11 34 00 00 00 3E DA 09 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T AC 0A 00 00 DA 09 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T B1 0A 00 00\r
 R 00 00 01 00\r
-T CC 0A 00 00 39 4D 44 E1 09 AF 77 23 77 DD 34\r
+T B1 0A 00 00 C3 69 0B 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T B4 0A 00 00\r
 R 00 00 01 00\r
-T D7 0A 00 00 D6 20 03 DD 34 D7\r
+T B4 0A 00 00 DD 34 02 20 03 DD 34 03\r
 R 00 00 01 00\r
-T DD 0A 00 00\r
+T BC 0A 00 00\r
 R 00 00 01 00\r
-T DD 0A 00 00 18 D1\r
+T BC 0A 00 00 21 02 00 39 E5 11 36 00 00 00 3E\r
+R 00 00 01 00 00 0A 02 00\r
+T C5 0A 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 05 00 02 09 05 00\r
+T CA 0A 00 00 00 00 00 00 4D 44 E1 71 23 70 79\r
+R 00 00 01 00 02 04 21 00\r
+T D3 0A 00 00 B0 20 0D\r
 R 00 00 01 00\r
-T DF 0A 00 00\r
+T D6 0A 00 00\r
 R 00 00 01 00\r
-T DF 0A 00 00\r
+T D6 0A 00 00 11 3B 00 00 00 3E DA 09 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T DC 0A 00 00 DA 09 00 00 CD 00 00 00 00 18 0F\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T E3 0A 00 00\r
 R 00 00 01 00\r
-T DF 0A 00 00 DD 6E 02 DD 66 03 29 E5 21 04 00\r
+T E3 0A 00 00 21 02 00 39 5E 23 56 3E\r
 R 00 00 01 00\r
-T EA 0A 00 00 39 4D 44 E1 09 36 01 23 36 00 DD\r
+T EB 0A 00 00 DA 09 00 00 21 DA 09 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T F0 0A 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T F2 0A 00 00\r
 R 00 00 01 00\r
-T F5 0A 00 00 5E 02 DD 56 03 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 0A 07 00\r
-T FD 0A 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
-R 00 00 01 00 02 04 07 00 02 09 1E 00\r
-T 04 0B 00 00 02 DD 74 03 CB 7C 20 0F ED 4B\r
+T F2 0A 00 00 18 75\r
 R 00 00 01 00\r
-T 0E 0B 00 00 08 00 00 00 DD 6E 02 DD 66 03 CD\r
-R 00 00 01 00 02 04 06 00\r
-T 17 0B 00 00 00 00 00 00 38 C4\r
-R 00 00 01 00 02 04 2A 00\r
-T 1B 0B 00 00\r
+T F4 0A 00 00\r
 R 00 00 01 00\r
-T 1B 0B 00 00 AF DD 77 D6 DD 77 D7\r
+T F4 0A 00 00 DD 34 02 20 03 DD 34 03\r
 R 00 00 01 00\r
-T 22 0B 00 00\r
+T FC 0A 00 00\r
 R 00 00 01 00\r
-T 22 0B 00 00 01 14 80 DD 6E D6 DD 66 D7 3E 80\r
+T FC 0A 00 00 21 04 00 39 5D 54 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 15 00\r
+T 04 0B 00 00 21 00 00 00 00 CD 00 00 00 00 7D\r
+R 00 00 01 00 02 05 15 00 02 0A 21 00\r
+T 0B 0B 00 00 A4 3C 20 0D\r
 R 00 00 01 00\r
-T 2D 0B 00 00 AC 67 ED 42 30 2D\r
+T 0F 0B 00 00\r
 R 00 00 01 00\r
-T 33 0B 00 00\r
+T 0F 0B 00 00 11 43 00 00 00 3E DA 09 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T 15 0B 00 00 DA 09 00 00 CD 00 00 00 00 18 11\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T 1C 0B 00 00\r
 R 00 00 01 00\r
-T 33 0B 00 00 DD 6E D6 DD 66 D7 29 E5 21 04 00\r
+T 1C 0B 00 00 21 04 00 39 01 0E 00 09 EB 3E\r
 R 00 00 01 00\r
-T 3E 0B 00 00 39 4D 44 E1 09 7E 23 B6 28 0E\r
+T 26 0B 00 00 DA 09 00 00 21 DA 09 00 00 CD\r
+R 00 00 01 00 29 04 01 00 00 09 01 00\r
+T 2B 0B 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T 2D 0B 00 00\r
 R 00 00 01 00\r
-T 48 0B 00 00\r
+T 2D 0B 00 00 18 3A\r
 R 00 00 01 00\r
-T 48 0B 00 00 DD 5E D6 DD 56 D7 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 14 00\r
-T 50 0B 00 00 21 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 14 00 02 0A 1E 00\r
-T 56 0B 00 00\r
+T 2F 0B 00 00\r
 R 00 00 01 00\r
-T 56 0B 00 00 DD 34 D6 20 03 DD 34 D7\r
+T 2F 0B 00 00 DD 34 02 20 03 DD 34 03\r
 R 00 00 01 00\r
-T 5E 0B 00 00\r
+T 37 0B 00 00\r
 R 00 00 01 00\r
-T 5E 0B 00 00 18 C2\r
+T 37 0B 00 00 01 00 01 21 46 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 60 0B 00 00\r
+T 41 0B 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 35 00 02 09 35 00\r
+T 46 0B 00 00 00 00 00 00 7D B4 20 0D\r
+R 00 00 01 00 02 04 21 00\r
+T 4C 0B 00 00\r
 R 00 00 01 00\r
-T 60 0B 00 00 DD CB 03 7E 28 0B\r
+T 4C 0B 00 00 11 4C 00 00 00 3E DA 09 00 00 21\r
+R 00 00 01 00 00 05 02 00 29 0A 01 00\r
+T 52 0B 00 00 DA 09 00 00 CD 00 00 00 00 18 0E\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T 59 0B 00 00\r
+R 00 00 01 00\r
+T 59 0B 00 00 21 46 00 39 5D 54 3E DA 09 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 61 0B 00 00 21 DA 09 00 00 CD 00 00 00 00\r
+R 00 00 01 00 00 05 01 00 02 0A 21 00\r
+T 67 0B 00 00\r
 R 00 00 01 00\r
-T 66 0B 00 00\r
+T 67 0B 00 00 18 00\r
 R 00 00 01 00\r
-T 66 0B 00 00 11 32 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 00 05 02 00 2B 0A 05 00\r
-T 6C 0B 00 00 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 04 05 00 02 09 1E 00\r
-T 71 0B 00 00\r
+T 69 0B 00 00\r
 R 00 00 01 00\r
-T 71 0B 00 00\r
+T 69 0B 00 00\r
 R 00 00 01 00\r
-T 71 0B 00 00 DD 6E 02 DD 66 03 C3 00 00 00 00\r
-R 00 00 01 00 02 0B 12 00\r
-T 7A 0B 00 00\r
+T 69 0B 00 00 21 00 00 39 34 23 20 01 34\r
 R 00 00 01 00\r
-T 7A 0B 00 00 CD 00 00 00 00 FE FF DD 5E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
-T 83 0B 00 00 56 03 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 28 00\r
-T 88 0B 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
-R 00 00 01 00 02 04 28 00 02 09 1E 00\r
-T 8F 0B 00 00 FE DD 74 FF CB 7C 28 0B\r
+T 72 0B 00 00\r
 R 00 00 01 00\r
-T 97 0B 00 00\r
+T 72 0B 00 00 C3 19 0A 00 00\r
+R 00 00 01 00 00 05 01 00\r
+T 75 0B 00 00\r
 R 00 00 01 00\r
-T 97 0B 00 00 11 4F 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 00 05 02 00 2B 0A 05 00\r
-T 9D 0B 00 00 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 04 05 00 02 09 1E 00\r
+T 75 0B 00 00 DD 5E 02 DD 56 03 3E DA 09 00 00\r
+R 00 00 01 00 29 0B 01 00\r
+T 7D 0B 00 00 21 DA 09 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 00 05 01 00 02 0A 21 00\r
+T 84 0B 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 13 00\r
+T 86 0B 00 00\r
+R 00 00 01 00\r
+T 86 0B 00 00 CD 00 00 00 00 21 01 00 E5 21\r
+R 00 00 01 00 02 05 20 00\r
+T 8E 0B 00 00 04 00 39 4D 44 11 02 00 3E\r
+R 00 00 01 00\r
+T 97 0B 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 09 00 02 09 09 00\r
+T 9C 0B 00 00 00 00 00 00 F1 C3 00 00 00 00\r
+R 00 00 01 00 02 04 21 00 02 0A 13 00\r
 T A2 0B 00 00\r
 R 00 00 01 00\r
-T A2 0B 00 00 DD 6E FE DD 66 FF C3 00 00 00 00\r
-R 00 00 01 00 02 0B 12 00\r
-T AB 0B 00 00\r
+T A2 0B 00 00 CD 00 00 00 00 01 00 00 3E\r
+R 00 00 01 00 02 05 20 00\r
+T A9 0B 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 23 00 02 09 23 00\r
+T AE 0B 00 00 00 00 00 00 EB 3E DA 09 00 00 21\r
+R 00 00 01 00 02 04 21 00 29 0A 01 00\r
+T B4 0B 00 00 DA 09 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T BA 0B 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 13 00\r
+T BC 0B 00 00\r
+R 00 00 01 00\r
+T BC 0B 00 00 CD 00 00 00 00 4B 42 21 02 00 CD\r
+R 00 00 01 00 02 05 20 00\r
+T C5 0B 00 00 00 00 00 00 30 0E\r
+R 00 00 01 00 02 04 2E 00\r
+T C9 0B 00 00\r
+R 00 00 01 00\r
+T C9 0B 00 00 DD 5E 02 DD 56 03 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 16 00\r
+T D1 0B 00 00 21 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 16 00 02 0A 21 00\r
+T D7 0B 00 00\r
+R 00 00 01 00\r
+T D7 0B 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
+T DA 0B 00 00\r
+R 00 00 01 00\r
+T DA 0B 00 00 CD 00 00 00 00 FE FF DD 36 FE 0A\r
+R 00 00 01 00 02 05 28 00\r
+T E3 0B 00 00 DD 36 FF 00\r
+R 00 00 01 00\r
+T E7 0B 00 00\r
+R 00 00 01 00\r
+T E7 0B 00 00 01 14 80 DD 6E FE DD 66 FF 3E 80\r
+R 00 00 01 00\r
+T F2 0B 00 00 AC 67 ED 42 30 18\r
+R 00 00 01 00\r
+T F8 0B 00 00\r
+R 00 00 01 00\r
+T F8 0B 00 00 DD 5E FE DD 56 FF 13 DD 73 FE DD\r
+R 00 00 01 00\r
+T 03 0C 00 00 72 FF 1B 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 08 16 00\r
+T 09 0C 00 00 00 00 00 00 CD 00 00 00 00 18 D7\r
+R 00 00 01 00 02 04 16 00 02 09 21 00\r
+T 10 0C 00 00\r
+R 00 00 01 00\r
+T 10 0C 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
+T 13 0C 00 00\r
+R 00 00 01 00\r
+T 13 0C 00 00 CD 00 00 00 00 D6 FF ED 4B\r
+R 00 00 01 00 02 05 28 00\r
+T 1A 0C 00 00 08 00 00 00 DD 6E 02 DD 66 03 CD\r
+R 00 00 01 00 02 04 07 00\r
+T 23 0C 00 00 00 00 00 00 D2 F0 0C 00 00\r
+R 00 00 01 00 02 04 2E 00 00 09 01 00\r
+T 28 0C 00 00\r
+R 00 00 01 00\r
+T 28 0C 00 00 AF DD 77 D6 DD 77 D7\r
 R 00 00 01 00\r
-T AB 0B 00 00 CD 00 00 00 00 7B B2 28 2C\r
-R 00 00 01 00 02 05 1D 00\r
-T B2 0B 00 00\r
+T 2F 0C 00 00\r
 R 00 00 01 00\r
-T B2 0B 00 00 DD 6E 02 DD 66 03 4D 44 03 03 DD\r
+T 2F 0C 00 00 01 14 80 DD 6E D6 DD 66 D7 3E 80\r
 R 00 00 01 00\r
-T BD 0B 00 00 71 02 DD 70 03 5E 23 56 3E\r
+T 3A 0C 00 00 AC 67 ED 42 30 1E\r
 R 00 00 01 00\r
-T C6 0B 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 14 00 02 09 14 00\r
-T CB 0B 00 00 00 00 00 00 DD 6E 02 DD 66 03 5E\r
-R 00 00 01 00 02 04 1E 00\r
-T D4 0B 00 00 23 56 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 14 00\r
-T D9 0B 00 00 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 04 14 00 02 09 1E 00\r
-T DE 0B 00 00\r
+T 40 0C 00 00\r
 R 00 00 01 00\r
-T DE 0B 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
-T E1 0B 00 00\r
+T 40 0C 00 00 DD 6E D6 DD 66 D7 29 E5 21 04 00\r
 R 00 00 01 00\r
-T E1 0B 00 00 CD 00 00 00 00 FC FF 11 08 00 3E\r
-R 00 00 01 00 02 05 24 00\r
-T EA 0B 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0A 00 02 09 0A 00\r
-T EF 0B 00 00 00 00 00 00 DD 75 FC DD 74 FD 7D\r
-R 00 00 01 00 02 04 1E 00\r
-T F8 0B 00 00 B4 20 03\r
+T 4B 0C 00 00 39 4D 44 E1 09 AF 77 23 77 DD 34\r
+R 00 00 01 00\r
+T 56 0C 00 00 D6 20 03 DD 34 D7\r
+R 00 00 01 00\r
+T 5C 0C 00 00\r
 R 00 00 01 00\r
-T FB 0B 00 00\r
+T 5C 0C 00 00 18 D1\r
 R 00 00 01 00\r
-T FB 0B 00 00 C3 25 0D 00 00\r
+T 5E 0C 00 00\r
+R 00 00 01 00\r
+T 5E 0C 00 00\r
+R 00 00 01 00\r
+T 5E 0C 00 00 DD 6E 02 DD 66 03 29 E5 21 04 00\r
+R 00 00 01 00\r
+T 69 0C 00 00 39 4D 44 E1 09 36 01 23 36 00 DD\r
+R 00 00 01 00\r
+T 74 0C 00 00 5E 02 DD 56 03 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 08 00\r
+T 7C 0C 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 08 00 02 09 21 00\r
+T 83 0C 00 00 02 DD 74 03 CB 7C 20 0F ED 4B\r
+R 00 00 01 00\r
+T 8D 0C 00 00 08 00 00 00 DD 6E 02 DD 66 03 CD\r
+R 00 00 01 00 02 04 07 00\r
+T 96 0C 00 00 00 00 00 00 38 C4\r
+R 00 00 01 00 02 04 2E 00\r
+T 9A 0C 00 00\r
+R 00 00 01 00\r
+T 9A 0C 00 00 AF DD 77 D6 DD 77 D7\r
+R 00 00 01 00\r
+T A1 0C 00 00\r
+R 00 00 01 00\r
+T A1 0C 00 00 01 14 80 DD 6E D6 DD 66 D7 3E 80\r
+R 00 00 01 00\r
+T AC 0C 00 00 AC 67 ED 42 30 2D\r
+R 00 00 01 00\r
+T B2 0C 00 00\r
+R 00 00 01 00\r
+T B2 0C 00 00 DD 6E D6 DD 66 D7 29 E5 21 04 00\r
+R 00 00 01 00\r
+T BD 0C 00 00 39 4D 44 E1 09 7E 23 B6 28 0E\r
+R 00 00 01 00\r
+T C7 0C 00 00\r
+R 00 00 01 00\r
+T C7 0C 00 00 DD 5E D6 DD 56 D7 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 16 00\r
+T CF 0C 00 00 21 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 16 00 02 0A 21 00\r
+T D5 0C 00 00\r
+R 00 00 01 00\r
+T D5 0C 00 00 DD 34 D6 20 03 DD 34 D7\r
+R 00 00 01 00\r
+T DD 0C 00 00\r
+R 00 00 01 00\r
+T DD 0C 00 00 18 C2\r
+R 00 00 01 00\r
+T DF 0C 00 00\r
+R 00 00 01 00\r
+T DF 0C 00 00 DD CB 03 7E 28 0B\r
+R 00 00 01 00\r
+T E5 0C 00 00\r
+R 00 00 01 00\r
+T E5 0C 00 00 11 56 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 02 00 2B 0A 06 00\r
+T EB 0C 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 06 00 02 09 21 00\r
+T F0 0C 00 00\r
+R 00 00 01 00\r
+T F0 0C 00 00\r
+R 00 00 01 00\r
+T F0 0C 00 00 DD 6E 02 DD 66 03 C3 00 00 00 00\r
+R 00 00 01 00 02 0B 13 00\r
+T F9 0C 00 00\r
+R 00 00 01 00\r
+T F9 0C 00 00 CD 00 00 00 00 FE FF DD 5E 02 DD\r
+R 00 00 01 00 02 05 28 00\r
+T 02 0D 00 00 56 03 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 2C 00\r
+T 07 0D 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 2C 00 02 09 21 00\r
+T 0E 0D 00 00 FE DD 74 FF CB 7C 28 0B\r
+R 00 00 01 00\r
+T 16 0D 00 00\r
+R 00 00 01 00\r
+T 16 0D 00 00 11 73 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 05 02 00 2B 0A 06 00\r
+T 1C 0D 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 06 00 02 09 21 00\r
+T 21 0D 00 00\r
+R 00 00 01 00\r
+T 21 0D 00 00 DD 6E FE DD 66 FF C3 00 00 00 00\r
+R 00 00 01 00 02 0B 13 00\r
+T 2A 0D 00 00\r
+R 00 00 01 00\r
+T 2A 0D 00 00 CD 00 00 00 00 7B B2 28 2C\r
+R 00 00 01 00 02 05 20 00\r
+T 31 0D 00 00\r
+R 00 00 01 00\r
+T 31 0D 00 00 DD 6E 02 DD 66 03 4D 44 03 03 DD\r
+R 00 00 01 00\r
+T 3C 0D 00 00 71 02 DD 70 03 5E 23 56 3E\r
+R 00 00 01 00\r
+T 45 0D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 16 00 02 09 16 00\r
+T 4A 0D 00 00 00 00 00 00 DD 6E 02 DD 66 03 5E\r
+R 00 00 01 00 02 04 21 00\r
+T 53 0D 00 00 23 56 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 16 00\r
+T 58 0D 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 16 00 02 09 21 00\r
+T 5D 0D 00 00\r
+R 00 00 01 00\r
+T 5D 0D 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
+T 60 0D 00 00\r
+R 00 00 01 00\r
+T 60 0D 00 00 CD 00 00 00 00 FC FF 11 08 00 3E\r
+R 00 00 01 00 02 05 28 00\r
+T 69 0D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0B 00 02 09 0B 00\r
+T 6E 0D 00 00 00 00 00 00 DD 75 FC DD 74 FD 7D\r
+R 00 00 01 00 02 04 21 00\r
+T 77 0D 00 00 B4 20 03\r
+R 00 00 01 00\r
+T 7A 0D 00 00\r
+R 00 00 01 00\r
+T 7A 0D 00 00 C3 A4 0E 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T FE 0B 00 00\r
+T 7D 0D 00 00\r
 R 00 00 01 00\r
-T FE 0B 00 00 01 01 00 DD 5E 02 DD 56 03 3E\r
+T 7D 0D 00 00 01 01 00 DD 5E 02 DD 56 03 3E\r
 R 00 00 01 00\r
-T 08 0C 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T 87 0D 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 00 00 02 09 00 00\r
-T 0D 0C 00 00 00 00 00 00 E5 DD 6E FC DD 66 FD\r
-R 00 00 01 00 02 04 1E 00\r
-T 16 0C 00 00 C1 71 23 70 DD 6E FC DD 66 FD 7E\r
+T 8C 0D 00 00 00 00 00 00 E5 DD 6E FC DD 66 FD\r
+R 00 00 01 00 02 04 21 00\r
+T 95 0D 00 00 C1 71 23 70 DD 6E FC DD 66 FD 7E\r
 R 00 00 01 00\r
-T 21 0C 00 00 23 B6 20 03\r
+T A0 0D 00 00 23 B6 20 03\r
 R 00 00 01 00\r
-T 25 0C 00 00\r
+T A4 0D 00 00\r
 R 00 00 01 00\r
-T 25 0C 00 00 C3 25 0D 00 00\r
+T A4 0D 00 00 C3 A4 0E 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 28 0C 00 00\r
+T A7 0D 00 00\r
 R 00 00 01 00\r
-T 28 0C 00 00 21 04 00 DD 4E FC DD 46 FD 09 DD\r
+T A7 0D 00 00 21 04 00 DD 4E FC DD 46 FD 09 DD\r
 R 00 00 01 00\r
-T 33 0C 00 00 5E 04 DD 56 05 73 23 72 21 04 00\r
+T B2 0D 00 00 5E 04 DD 56 05 73 23 72 21 04 00\r
 R 00 00 01 00\r
-T 3E 0C 00 00 19 AF 77 23 77 21 06 00 09 AF 77\r
+T BD 0D 00 00 19 AF 77 23 77 21 06 00 09 AF 77\r
 R 00 00 01 00\r
-T 49 0C 00 00 23 77 2A 00 00 00 00 7D B4 20 0B\r
+T C8 0D 00 00 23 77 2A 00 00 00 00 7D B4 20 0B\r
 R 00 00 01 00 00 07 03 00\r
-T 52 0C 00 00\r
+T D1 0D 00 00\r
 R 00 00 01 00\r
-T 52 0C 00 00 DD 6E FC DD 66 FD 22 00 00 00 00\r
+T D1 0D 00 00 DD 6E FC DD 66 FD 22 00 00 00 00\r
 R 00 00 01 00 00 0B 03 00\r
-T 5B 0C 00 00 18 4B\r
+T DA 0D 00 00 18 4B\r
 R 00 00 01 00\r
-T 5D 0C 00 00\r
+T DC 0D 00 00\r
 R 00 00 01 00\r
-T 5D 0C 00 00 2A 00 00 00 00 DD 75 FE DD 74 FF\r
+T DC 0D 00 00 2A 00 00 00 00 DD 75 FE DD 74 FF\r
 R 00 00 01 00 00 05 03 00\r
-T 66 0C 00 00\r
+T E5 0D 00 00\r
 R 00 00 01 00\r
-T 66 0C 00 00 DD 7E FE DD B6 FF 28 3A\r
+T E5 0D 00 00 DD 7E FE DD B6 FF 28 3A\r
 R 00 00 01 00\r
-T 6E 0C 00 00\r
+T ED 0D 00 00\r
 R 00 00 01 00\r
-T 6E 0C 00 00 21 06 00 DD 4E FE DD 46 FF 09 7E\r
+T ED 0D 00 00 21 06 00 DD 4E FE DD 46 FF 09 7E\r
 R 00 00 01 00\r
-T 79 0C 00 00 23 B6 20 15\r
+T F8 0D 00 00 23 B6 20 15\r
 R 00 00 01 00\r
-T 7D 0C 00 00\r
+T FC 0D 00 00\r
 R 00 00 01 00\r
-T 7D 0C 00 00 21 06 00 DD 4E FE DD 46 FF 09 DD\r
+T FC 0D 00 00 21 06 00 DD 4E FE DD 46 FF 09 DD\r
 R 00 00 01 00\r
-T 88 0C 00 00 4E FC DD 46 FD 71 23 70 18 16\r
+T 07 0E 00 00 4E FC DD 46 FD 71 23 70 18 16\r
 R 00 00 01 00\r
-T 92 0C 00 00\r
+T 11 0E 00 00\r
 R 00 00 01 00\r
-T 92 0C 00 00 21 06 00 DD 4E FE DD 46 FF 09 56\r
+T 11 0E 00 00 21 06 00 DD 4E FE DD 46 FF 09 56\r
 R 00 00 01 00\r
-T 9D 0C 00 00 23 66 6A DD 75 FE DD 74 FF 18 BE\r
+T 1C 0E 00 00 23 66 6A DD 75 FE DD 74 FF 18 BE\r
 R 00 00 01 00\r
-T A8 0C 00 00\r
+T 27 0E 00 00\r
 R 00 00 01 00\r
-T A8 0C 00 00\r
+T 27 0E 00 00\r
 R 00 00 01 00\r
-T A8 0C 00 00 DD 6E 04 DD 66 05 23 23 7E F6 12\r
+T 27 0E 00 00 DD 6E 04 DD 66 05 23 23 7E F6 12\r
 R 00 00 01 00\r
-T B3 0C 00 00 77 23 7E F6 00 77 DD 6E FC DD 66\r
+T 32 0E 00 00 77 23 7E F6 00 77 DD 6E FC DD 66\r
 R 00 00 01 00\r
-T BE 0C 00 00 FD 46 23 66 68 DD 75 02 DD 74 03\r
+T 3D 0E 00 00 FD 46 23 66 68 DD 75 02 DD 74 03\r
 R 00 00 01 00\r
-T C9 0C 00 00\r
+T 48 0E 00 00\r
 R 00 00 01 00\r
-T C9 0C 00 00 DD 6E 02 DD 66 03 AF B6 28 30\r
+T 48 0E 00 00 DD 6E 02 DD 66 03 AF B6 28 30\r
 R 00 00 01 00\r
-T D3 0C 00 00\r
+T 52 0E 00 00\r
 R 00 00 01 00\r
-T D3 0C 00 00 DD 6E 02 DD 66 03 7E E6 80 28 1B\r
+T 52 0E 00 00 DD 6E 02 DD 66 03 7E E6 80 28 1B\r
 R 00 00 01 00\r
-T DE 0C 00 00\r
+T 5D 0E 00 00\r
 R 00 00 01 00\r
-T DE 0C 00 00 DD 6E 04 DD 66 05 23 23 7E E6 EF\r
+T 5D 0E 00 00 DD 6E 04 DD 66 05 23 23 7E E6 EF\r
 R 00 00 01 00\r
-T E9 0C 00 00 77 23 7E E6 FF 77 DD 6E 02 DD 66\r
+T 68 0E 00 00 77 23 7E E6 FF 77 DD 6E 02 DD 66\r
 R 00 00 01 00\r
-T F4 0C 00 00 03 7E E6 7F 77\r
+T 73 0E 00 00 03 7E E6 7F 77\r
 R 00 00 01 00\r
-T F9 0C 00 00\r
+T 78 0E 00 00\r
 R 00 00 01 00\r
-T F9 0C 00 00 DD 34 02 20 03 DD 34 03\r
+T 78 0E 00 00 DD 34 02 20 03 DD 34 03\r
 R 00 00 01 00\r
-T 01 0D 00 00\r
+T 80 0E 00 00\r
 R 00 00 01 00\r
-T 01 0D 00 00 18 C6\r
+T 80 0E 00 00 18 C6\r
 R 00 00 01 00\r
-T 03 0D 00 00\r
+T 82 0E 00 00\r
 R 00 00 01 00\r
-T 03 0D 00 00 DD 6E FC DD 66 FD 23 23 E5 DD 4E\r
+T 82 0E 00 00 DD 6E FC DD 66 FD 23 23 E5 DD 4E\r
 R 00 00 01 00\r
-T 0E 0D 00 00 04 DD 46 05 03 03 69 60 4E 23 46\r
+T 8D 0E 00 00 04 DD 46 05 03 03 69 60 4E 23 46\r
 R 00 00 01 00\r
-T 19 0D 00 00 79 E6 10 5F 78 E6 00 57 E1 73 23\r
+T 98 0E 00 00 79 E6 10 5F 78 E6 00 57 E1 73 23\r
 R 00 00 01 00\r
-T 24 0D 00 00 72\r
+T A3 0E 00 00 72\r
 R 00 00 01 00\r
-T 25 0D 00 00\r
+T A4 0E 00 00\r
 R 00 00 01 00\r
-T 25 0D 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
-T 28 0D 00 00\r
+T A4 0E 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
+T A7 0E 00 00\r
 R 00 00 01 00\r
-T 28 0D 00 00 CD 00 00 00 00 FC FF 2A\r
-R 00 00 01 00 02 05 24 00\r
-T 2E 0D 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
+T A7 0E 00 00 CD 00 00 00 00 FC FF 2A\r
+R 00 00 01 00 02 05 28 00\r
+T AD 0E 00 00 00 00 00 00 DD 75 FC DD 74 FD DD\r
 R 00 00 01 00 00 04 03 00\r
-T 37 0D 00 00 75 FE DD 74 FF\r
+T B6 0E 00 00 75 FE DD 74 FF\r
 R 00 00 01 00\r
-T 3C 0D 00 00\r
+T BB 0E 00 00\r
 R 00 00 01 00\r
-T 3C 0D 00 00 DD 7E FC DD B6 FD 28 58\r
+T BB 0E 00 00 DD 7E FC DD B6 FD 28 58\r
 R 00 00 01 00\r
-T 44 0D 00 00\r
+T C3 0E 00 00\r
 R 00 00 01 00\r
-T 44 0D 00 00 DD 6E FC DD 66 FD 23 23 7E 23 B6\r
+T C3 0E 00 00 DD 6E FC DD 66 FD 23 23 7E 23 B6\r
 R 00 00 01 00\r
-T 4F 0D 00 00 28 05 21 00 00 18 03\r
+T CE 0E 00 00 28 05 21 00 00 18 03\r
 R 00 00 01 00\r
-T 56 0D 00 00\r
+T D5 0E 00 00\r
 R 00 00 01 00\r
-T 56 0D 00 00 21 27 00\r
+T D5 0E 00 00 21 27 00\r
 R 00 00 01 00\r
-T 59 0D 00 00\r
+T D8 0E 00 00\r
 R 00 00 01 00\r
-T 59 0D 00 00 E5 DD 6E FC DD 66 FD 4E 23 46 21\r
+T D8 0E 00 00 E5 DD 6E FC DD 66 FD 4E 23 46 21\r
 R 00 00 01 00\r
-T 64 0D 00 00 04 00 DD 5E FC DD 56 FD 19 7E 23\r
+T E3 0E 00 00 04 00 DD 5E FC DD 56 FD 19 7E 23\r
 R 00 00 01 00\r
-T 6F 0D 00 00 66 6F 11 04 00 19 EB CD\r
+T EE 0E 00 00 66 6F 11 04 00 19 EB CD\r
 R 00 00 01 00\r
-T 77 0D 00 00 C4 0D 00 00 E1 DD 6E FC DD 66 FD\r
+T F6 0E 00 00 43 0F 00 00 E1 DD 6E FC DD 66 FD\r
 R 00 00 01 00 00 04 01 00\r
-T 80 0D 00 00 DD 75 FE DD 74 FF 21 06 00 DD 4E\r
+T FF 0E 00 00 DD 75 FE DD 74 FF 21 06 00 DD 4E\r
 R 00 00 01 00\r
-T 8B 0D 00 00 FC DD 46 FD 09 56 23 66 6A DD 75\r
+T 0A 0F 00 00 FC DD 46 FD 09 56 23 66 6A DD 75\r
 R 00 00 01 00\r
-T 96 0D 00 00 FC DD 74 FD 18 A0\r
+T 15 0F 00 00 FC DD 74 FD 18 A0\r
 R 00 00 01 00\r
-T 9C 0D 00 00\r
+T 1B 0F 00 00\r
 R 00 00 01 00\r
-T 9C 0D 00 00 DD 7E FE DD B6 FF 28 1D\r
+T 1B 0F 00 00 DD 7E FE DD B6 FF 28 1D\r
 R 00 00 01 00\r
-T A4 0D 00 00\r
+T 23 0F 00 00\r
 R 00 00 01 00\r
-T A4 0D 00 00 21 06 00 DD 4E FE DD 46 FF 09 ED\r
+T 23 0F 00 00 21 06 00 DD 4E FE DD 46 FF 09 ED\r
 R 00 00 01 00\r
-T AF 0D 00 00 4B 02 00 00 00 71 23 70 2A\r
+T 2E 0F 00 00 4B 02 00 00 00 71 23 70 2A\r
 R 00 00 01 00 00 05 03 00\r
-T B6 0D 00 00 00 00 00 00 22 02 00 00 00 21\r
+T 35 0F 00 00 00 00 00 00 22 02 00 00 00 21\r
 R 00 00 01 00 00 04 03 00 00 09 03 00\r
-T BC 0D 00 00 00 00 22 00 00 00 00\r
+T 3B 0F 00 00 00 00 22 00 00 00 00\r
 R 00 00 01 00 00 07 03 00\r
-T C1 0D 00 00\r
+T 40 0F 00 00\r
 R 00 00 01 00\r
-T C1 0D 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
-T C4 0D 00 00\r
+T 40 0F 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
+T 43 0F 00 00\r
 R 00 00 01 00\r
-T C4 0D 00 00 CD 00 00 00 00 9C F7 21 02 00 39\r
-R 00 00 01 00 02 05 24 00\r
-T CD 0D 00 00 5D 54 3E 46 12 00 00 21\r
+T 43 0F 00 00 CD 00 00 00 00 9C F7 21 02 00 39\r
+R 00 00 01 00 02 05 28 00\r
+T 4C 0F 00 00 5D 54 3E C5 13 00 00 21\r
 R 00 00 01 00 29 07 01 00\r
-T D2 0D 00 00 46 12 00 00 CD 00 00 00 00 ED 4B\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
-T D9 0D 00 00 00 00 00 00 21 02 00 39 5D 54 3E\r
-R 00 00 01 00 02 04 22 00\r
-T E2 0D 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T 51 0F 00 00 C5 13 00 00 CD 00 00 00 00 ED 4B\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T 58 0F 00 00 00 00 00 00 21 02 00 39 5D 54 3E\r
+R 00 00 01 00 02 04 26 00\r
+T 61 0F 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 04 00 02 09 04 00\r
-T E7 0D 00 00 00 00 00 00 E5 DD 6E 02 DD 66 03\r
-R 00 00 01 00 02 04 1E 00\r
-T F0 0D 00 00 C1 71 23 70 21 00 00 39 E5 01\r
+T 66 0F 00 00 00 00 00 00 E5 DD 6E 02 DD 66 03\r
+R 00 00 01 00 02 04 21 00\r
+T 6F 0F 00 00 C1 71 23 70 21 00 00 39 E5 01\r
 R 00 00 01 00\r
-T FA 0D 00 00 80 01 21 04 00 39 5D 54 3E\r
+T 79 0F 00 00 80 01 21 04 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 03 0E 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0D 00 02 09 0D 00\r
-T 08 0E 00 00 00 00 00 00 4D 44 E1 71 23 70 21\r
-R 00 00 01 00 02 04 1E 00\r
-T 11 0E 00 00 00 00 39 23 CB 7E 28 03\r
+T 82 0F 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0E 00 02 09 0E 00\r
+T 87 0F 00 00 00 00 00 00 4D 44 E1 71 23 70 21\r
+R 00 00 01 00 02 04 21 00\r
+T 90 0F 00 00 00 00 39 23 CB 7E 28 03\r
 R 00 00 01 00\r
-T 19 0E 00 00\r
+T 98 0F 00 00\r
 R 00 00 01 00\r
-T 19 0E 00 00 C3 B6 0F 00 00\r
+T 98 0F 00 00 C3 35 11 00 00\r
 R 00 00 01 00 00 05 01 00\r
-T 1C 0E 00 00\r
-R 00 00 01 00\r
-T 1C 0E 00 00 21 22 00 39 22 00 00 00 00 EB 3E\r
-R 00 00 01 00 02 09 27 00\r
-T 25 0E 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0F 00 02 09 0F 00\r
-T 2A 0E 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
-R 00 00 01 00 02 04 1E 00 2B 0A 10 00\r
-T 30 0E 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
-R 00 00 01 00 02 04 10 00 02 09 1E 00\r
-T 37 0E 00 00 28 11\r
-R 00 00 01 00\r
-T 39 0E 00 00\r
-R 00 00 01 00\r
-T 39 0E 00 00 21 02 00 39 5D 54 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 0E 00\r
-T 41 0E 00 00 21 00 00 00 00 CD 00 00 00 00 C3\r
-R 00 00 01 00 02 05 0E 00 02 0A 1E 00\r
-T 48 0E 00 00 A7 0F 00 00\r
+T 9B 0F 00 00\r
+R 00 00 01 00\r
+T 9B 0F 00 00 21 22 00 39 22 00 00 00 00 EB 3E\r
+R 00 00 01 00 02 09 2B 00\r
+T A4 0F 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 10 00 02 09 10 00\r
+T A9 0F 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 21 00 2B 0A 11 00\r
+T AF 0F 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 02 04 11 00 02 09 21 00\r
+T B6 0F 00 00 28 11\r
+R 00 00 01 00\r
+T B8 0F 00 00\r
+R 00 00 01 00\r
+T B8 0F 00 00 21 02 00 39 5D 54 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 0F 00\r
+T C0 0F 00 00 21 00 00 00 00 CD 00 00 00 00 C3\r
+R 00 00 01 00 02 05 0F 00 02 0A 21 00\r
+T C7 0F 00 00 26 11 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 4A 0E 00 00\r
+T C9 0F 00 00\r
 R 00 00 01 00\r
-T 4A 0E 00 00 2A 04 00 00 00 23 23 4E C5 2B 46\r
-R 00 00 01 00 02 05 06 00\r
-T 53 0E 00 00 2B 4E C5 2A 04 00 00 00 23 23 23\r
-R 00 00 01 00 02 08 06 00\r
-T 5C 0E 00 00 5E 23 56 3E 81 02 00 00 21\r
+T C9 0F 00 00 2A 04 00 00 00 23 23 4E C5 2B 46\r
+R 00 00 01 00 02 05 07 00\r
+T D2 0F 00 00 2B 4E C5 2A 04 00 00 00 23 23 23\r
+R 00 00 01 00 02 08 07 00\r
+T DB 0F 00 00 5E 23 56 3E 81 02 00 00 21\r
 R 00 00 01 00 29 08 01 00\r
-T 62 0E 00 00 81 02 00 00 CD 00 00 00 00 E1 E1\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
-T 69 0E 00 00 2A 04 00 00 00 22 02 00 00 00\r
-R 00 00 01 00 02 05 06 00 02 0A 06 00\r
-T 6F 0E 00 00\r
-R 00 00 01 00\r
-T 6F 0E 00 00 2A 00 00 00 00 7D B4 28 1A ED 4B\r
-R 00 00 01 00 02 05 23 00\r
-T 78 0E 00 00 04 00 00 00 21 00 00 00 00 A7 ED\r
-R 00 00 01 00 02 04 06 00 02 09 29 00\r
-T 7F 0E 00 00 42 38 0E\r
+T E1 0F 00 00 81 02 00 00 CD 00 00 00 00 E1 E1\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T E8 0F 00 00 2A 04 00 00 00 22 02 00 00 00\r
+R 00 00 01 00 02 05 07 00 02 0A 07 00\r
+T EE 0F 00 00\r
 R 00 00 01 00\r
-T 82 0E 00 00\r
+T EE 0F 00 00 2A 00 00 00 00 7D B4 28 1A ED 4B\r
+R 00 00 01 00 02 05 27 00\r
+T F7 0F 00 00 04 00 00 00 21 00 00 00 00 A7 ED\r
+R 00 00 01 00 02 04 07 00 02 09 2D 00\r
+T FE 0F 00 00 42 38 0E\r
 R 00 00 01 00\r
-T 82 0E 00 00\r
+T 01 10 00 00\r
 R 00 00 01 00\r
-T 82 0E 00 00\r
+T 01 10 00 00\r
+R 00 00 01 00\r
+T 01 10 00 00\r
 R 00 00 01 00\r
-T 82 0E 00 00 2A 00 00 00 00 5E 23 56 3E\r
+T 01 10 00 00 2A 00 00 00 00 5E 23 56 3E\r
 R 00 00 01 00 02 05 01 00\r
-T 89 0E 00 00 DA 09 00 00 21 DA 09 00 00 CD\r
+T 08 10 00 00 07 0A 00 00 21 07 0A 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
-T 8E 0E 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
-T 90 0E 00 00\r
+T 0D 10 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T 0F 10 00 00\r
 R 00 00 01 00\r
-T 90 0E 00 00 21 2D 00 39 DD 75 FE DD 74 FF\r
+T 0F 10 00 00 21 2D 00 39 DD 75 FE DD 74 FF\r
 R 00 00 01 00\r
-T 9A 0E 00 00\r
+T 19 10 00 00\r
 R 00 00 01 00\r
-T 9A 0E 00 00 21 20 00 39 E5 DD 5E 08 DD 56 09\r
+T 19 10 00 00 21 20 00 39 E5 DD 5E 08 DD 56 09\r
 R 00 00 01 00\r
-T A5 0E 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+T 24 10 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 29 05 01 00 00 0A 01 00\r
-T AB 0E 00 00 00 00 00 00 4D 44 E1 71 23 70 3E\r
-R 00 00 01 00 02 04 1E 00\r
-T B4 0E 00 00 0A A9 B0 28 55 21 20 00 39 7E 23\r
+T 2A 10 00 00 00 00 00 00 4D 44 E1 71 23 70 3E\r
+R 00 00 01 00 02 04 21 00\r
+T 33 10 00 00 0A A9 B0 28 55 21 20 00 39 7E 23\r
 R 00 00 01 00\r
-T BF 0E 00 00 B6 28 4C\r
+T 3E 10 00 00 B6 28 4C\r
 R 00 00 01 00\r
-T C2 0E 00 00\r
+T 41 10 00 00\r
 R 00 00 01 00\r
-T C2 0E 00 00\r
+T 41 10 00 00\r
 R 00 00 01 00\r
-T C2 0E 00 00\r
+T 41 10 00 00\r
 R 00 00 01 00\r
-T C2 0E 00 00 3E 27 DD AE 08 DD B6 09 20 0D\r
+T 41 10 00 00 3E 27 DD AE 08 DD B6 09 20 0D\r
 R 00 00 01 00\r
-T CC 0E 00 00\r
+T 4B 10 00 00\r
 R 00 00 01 00\r
-T CC 0E 00 00 21 20 00 39 7E E6 7F 77 23 7E E6\r
+T 4B 10 00 00 21 20 00 39 7E E6 7F 77 23 7E E6\r
 R 00 00 01 00\r
-T D7 0E 00 00 FF 77\r
+T 56 10 00 00 FF 77\r
 R 00 00 01 00\r
-T D9 0E 00 00\r
+T 58 10 00 00\r
 R 00 00 01 00\r
-T D9 0E 00 00 21 2D 00 39 01 34 08 09 4D 44 DD\r
+T 58 10 00 00 21 2D 00 39 01 34 08 09 4D 44 DD\r
 R 00 00 01 00\r
-T E4 0E 00 00 6E FE DD 66 FF A7 ED 42 38 0A\r
+T 63 10 00 00 6E FE DD 66 FF A7 ED 42 38 0A\r
 R 00 00 01 00\r
-T EE 0E 00 00\r
+T 6D 10 00 00\r
 R 00 00 01 00\r
-T EE 0E 00 00 21 20 00 39 AF 77 23 77 18 16\r
+T 6D 10 00 00 21 20 00 39 AF 77 23 77 18 16\r
 R 00 00 01 00\r
-T F8 0E 00 00\r
+T 77 10 00 00\r
 R 00 00 01 00\r
-T F8 0E 00 00 21 20 00 39 46 DD 6E FE DD 66 FF\r
+T 77 10 00 00 21 20 00 39 46 DD 6E FE DD 66 FF\r
 R 00 00 01 00\r
-T 03 0F 00 00 23 DD 75 FE DD 74 FF 2B 70 18 8C\r
+T 82 10 00 00 23 DD 75 FE DD 74 FF 2B 70 18 8C\r
 R 00 00 01 00\r
-T 0E 0F 00 00\r
+T 8D 10 00 00\r
 R 00 00 01 00\r
-T 0E 0F 00 00 DD 6E FE DD 66 FF 36 00 21 2D 00\r
+T 8D 10 00 00 DD 6E FE DD 66 FF 36 00 21 2D 00\r
 R 00 00 01 00\r
-T 19 0F 00 00 39 4D 44 DD 5E 04 DD 56 05 3E\r
+T 98 10 00 00 39 4D 44 DD 5E 04 DD 56 05 3E\r
 R 00 00 01 00\r
-T 23 0F 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 16 00 02 09 16 00\r
-T 28 0F 00 00 00 00 00 00 7D B4 28 09 21 20 00\r
-R 00 00 01 00 02 04 1E 00\r
-T 31 0F 00 00 39 7E 23 B6 20 02\r
+T A2 10 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 19 00 02 09 19 00\r
+T A7 10 00 00 00 00 00 00 7D B4 28 09 21 20 00\r
+R 00 00 01 00 02 04 21 00\r
+T B0 10 00 00 39 7E 23 B6 20 02\r
 R 00 00 01 00\r
-T 37 0F 00 00\r
+T B6 10 00 00\r
 R 00 00 01 00\r
-T 37 0F 00 00\r
+T B6 10 00 00\r
 R 00 00 01 00\r
-T 37 0F 00 00\r
+T B6 10 00 00\r
 R 00 00 01 00\r
-T 37 0F 00 00 18 39\r
+T B6 10 00 00 18 39\r
 R 00 00 01 00\r
-T 39 0F 00 00\r
+T B8 10 00 00\r
 R 00 00 01 00\r
-T 39 0F 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
+T B8 10 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
 R 00 00 01 00\r
-T 44 0F 00 00 74 FF 2B 36 0A 21 2D 00 39 4D 44\r
+T C3 10 00 00 74 FF 2B 36 0A 21 2D 00 39 4D 44\r
 R 00 00 01 00\r
-T 4F 0F 00 00 DD 6E FE DD 66 FF A7 ED 42 E5 21\r
+T CE 10 00 00 DD 6E FE DD 66 FF A7 ED 42 E5 21\r
 R 00 00 01 00\r
-T 5A 0F 00 00 2F 00 39 4D 44 21 02 00 39 5E 23\r
+T D9 10 00 00 2F 00 39 4D 44 21 02 00 39 5E 23\r
 R 00 00 01 00\r
-T 65 0F 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
-R 00 00 01 00 2B 06 08 00 02 0B 08 00\r
-T 6B 0F 00 00 CD 00 00 00 00 F1 C3 6F 0E 00 00\r
-R 00 00 01 00 02 05 1E 00 00 0B 01 00\r
-T 72 0F 00 00\r
+T E4 10 00 00 56 3E 00 00 00 00 21 00 00 00 00\r
+R 00 00 01 00 2B 06 09 00 02 0B 09 00\r
+T EA 10 00 00 CD 00 00 00 00 F1 C3 EE 0F 00 00\r
+R 00 00 01 00 02 05 21 00 00 0B 01 00\r
+T F1 10 00 00\r
 R 00 00 01 00\r
-T 72 0F 00 00 21 20 00 39 7E 23 B6 20 24\r
+T F1 10 00 00 21 20 00 39 7E 23 B6 20 24\r
 R 00 00 01 00\r
-T 7B 0F 00 00\r
+T FA 10 00 00\r
 R 00 00 01 00\r
-T 7B 0F 00 00 11 6D 00 00 00 3E DA 09 00 00 21\r
+T FA 10 00 00 11 91 00 00 00 3E DA 09 00 00 21\r
 R 00 00 01 00 00 05 02 00 29 0A 01 00\r
-T 81 0F 00 00 DA 09 00 00 CD 00 00 00 00 DD 5E\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
-T 88 0F 00 00 04 DD 56 05 3E DA 09 00 00 21\r
+T 00 11 00 00 DA 09 00 00 CD 00 00 00 00 DD 5E\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T 07 11 00 00 04 DD 56 05 3E DA 09 00 00 21\r
 R 00 00 01 00 29 09 01 00\r
-T 8F 0F 00 00 DA 09 00 00 CD 00 00 00 00 11\r
-R 00 00 01 00 00 04 01 00 02 09 1E 00\r
-T 95 0F 00 00 7D 00 00 00 3E 00 00 00 00 21\r
-R 00 00 01 00 00 04 02 00 2B 09 05 00\r
-T 9A 0F 00 00 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 04 05 00 02 09 1E 00\r
-T 9F 0F 00 00\r
-R 00 00 01 00\r
-T 9F 0F 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 0B 00 02 0A 0B 00\r
-T A5 0F 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
-T A7 0F 00 00\r
+T 0E 11 00 00 DA 09 00 00 CD 00 00 00 00 11\r
+R 00 00 01 00 00 04 01 00 02 09 21 00\r
+T 14 11 00 00 A1 00 00 00 3E 00 00 00 00 21\r
+R 00 00 01 00 00 04 02 00 2B 09 06 00\r
+T 19 11 00 00 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 04 06 00 02 09 21 00\r
+T 1E 11 00 00\r
+R 00 00 01 00\r
+T 1E 11 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 0C 00 02 0A 0C 00\r
+T 24 11 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T 26 11 00 00\r
 R 00 00 01 00\r
-T A7 0F 00 00 21 00 00 39 5E 23 56 3E\r
+T 26 11 00 00 21 00 00 39 5E 23 56 3E\r
 R 00 00 01 00\r
-T AF 0F 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 14 00 02 09 14 00\r
-T B4 0F 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
-T B6 0F 00 00\r
+T 2E 11 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 16 00 02 09 16 00\r
+T 33 11 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T 35 11 00 00\r
 R 00 00 01 00\r
-T B6 0F 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 18 00\r
-T B9 0F 00 00\r
+T 35 11 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 1B 00\r
+T 38 11 00 00\r
 R 00 00 01 00\r
-T B9 0F 00 00 CD 00 00 00 00 D2 FF DD 7E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
-T C2 0F 00 00 B6 03 20 06\r
+T 38 11 00 00 CD 00 00 00 00 D2 FF DD 7E 02 DD\r
+R 00 00 01 00 02 05 28 00\r
+T 41 11 00 00 B6 03 20 06\r
 R 00 00 01 00\r
-T C6 0F 00 00\r
+T 45 11 00 00\r
 R 00 00 01 00\r
-T C6 0F 00 00 21 FF FF C3 01 11 00 00\r
+T 45 11 00 00 21 FF FF C3 80 12 00 00\r
 R 00 00 01 00 00 08 01 00\r
-T CC 0F 00 00\r
+T 4B 11 00 00\r
 R 00 00 01 00\r
-T CC 0F 00 00 21 00 00 E5 DD 6E 02 DD 66 03 E5\r
+T 4B 11 00 00 21 00 00 E5 DD 6E 02 DD 66 03 E5\r
 R 00 00 01 00\r
-T D7 0F 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 2B 00 02 0A 2B 00\r
-T DD 0F 00 00 00 00 00 00 F1 F1 DD 75 D2 DD 74\r
-R 00 00 01 00 02 04 1E 00\r
-T E6 0F 00 00 D3 CB 7C 28 06\r
+T 56 11 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 2F 00 02 0A 2F 00\r
+T 5C 11 00 00 00 00 00 00 F1 F1 DD 75 D2 DD 74\r
+R 00 00 01 00 02 04 21 00\r
+T 65 11 00 00 D3 CB 7C 28 06\r
 R 00 00 01 00\r
-T EB 0F 00 00\r
+T 6A 11 00 00\r
 R 00 00 01 00\r
-T EB 0F 00 00 21 FF FF C3 01 11 00 00\r
+T 6A 11 00 00 21 FF FF C3 80 12 00 00\r
 R 00 00 01 00 00 08 01 00\r
-T F1 0F 00 00\r
+T 70 11 00 00\r
 R 00 00 01 00\r
-T F1 0F 00 00 DD 7E 04 DD B6 05 CA FB 10 00 00\r
+T 70 11 00 00 DD 7E 04 DD B6 05 CA 7A 12 00 00\r
 R 00 00 01 00 00 0B 01 00\r
-T FA 0F 00 00\r
+T 79 11 00 00\r
 R 00 00 01 00\r
-T FA 0F 00 00 21 05 00 39 5D 54 3E 46 12 00 00\r
+T 79 11 00 00 21 05 00 39 5D 54 3E C5 13 00 00\r
 R 00 00 01 00 29 0B 01 00\r
-T 02 10 00 00 21 46 12 00 00 CD 00 00 00 00 01\r
-R 00 00 01 00 00 05 01 00 02 0A 1E 00\r
-T 09 10 00 00 80 01 21 05 00 39 5D 54 3E\r
+T 81 11 00 00 21 C5 13 00 00 CD 00 00 00 00 01\r
+R 00 00 01 00 00 05 01 00 02 0A 21 00\r
+T 88 11 00 00 80 01 21 05 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T 12 10 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0D 00 02 09 0D 00\r
-T 17 10 00 00 00 00 00 00 DD 75 D4 DD 74 D5 CB\r
-R 00 00 01 00 02 04 1E 00\r
-T 20 10 00 00 7C 28 06\r
+T 91 11 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0E 00 02 09 0E 00\r
+T 96 11 00 00 00 00 00 00 DD 75 D4 DD 74 D5 CB\r
+R 00 00 01 00 02 04 21 00\r
+T 9F 11 00 00 7C 28 06\r
 R 00 00 01 00\r
-T 23 10 00 00\r
+T A2 11 00 00\r
 R 00 00 01 00\r
-T 23 10 00 00 21 FF FF C3 01 11 00 00\r
+T A2 11 00 00 21 FF FF C3 80 12 00 00\r
 R 00 00 01 00 00 08 01 00\r
-T 29 10 00 00\r
+T A8 11 00 00\r
 R 00 00 01 00\r
-T 29 10 00 00 21 23 00 39 22 00 00 00 00 EB 3E\r
-R 00 00 01 00 02 09 27 00\r
-T 32 10 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0F 00 02 09 0F 00\r
-T 37 10 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
-R 00 00 01 00 02 04 1E 00 2B 0A 10 00\r
-T 3D 10 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
-R 00 00 01 00 02 04 10 00 02 09 1E 00\r
-T 44 10 00 00 20 6A\r
+T A8 11 00 00 21 23 00 39 22 00 00 00 00 EB 3E\r
+R 00 00 01 00 02 09 2B 00\r
+T B1 11 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 10 00 02 09 10 00\r
+T B6 11 00 00 00 00 00 00 EB 3E 00 00 00 00 21\r
+R 00 00 01 00 02 04 21 00 2B 0A 11 00\r
+T BC 11 00 00 00 00 00 00 CD 00 00 00 00 7D B4\r
+R 00 00 01 00 02 04 11 00 02 09 21 00\r
+T C3 11 00 00 20 6A\r
 R 00 00 01 00\r
-T 46 10 00 00\r
+T C5 11 00 00\r
 R 00 00 01 00\r
-T 46 10 00 00 DD 6E D2 DD 66 D3 22 12 04 00 00\r
+T C5 11 00 00 DD 6E D2 DD 66 D3 22 12 04 00 00\r
 R 00 00 01 00 00 0B 04 00\r
-T 4F 10 00 00 0E 28 08 00 00 C5 21 28 08 00 00\r
+T CE 11 00 00 0E 28 08 00 00 C5 21 28 08 00 00\r
 R 00 00 01 00 29 05 01 00 00 0B 01 00\r
-T 55 10 00 00 E5 11 0E 04 00 00 3E 81 02 00 00\r
+T D4 11 00 00 E5 11 0E 04 00 00 3E 81 02 00 00\r
 R 00 00 01 00 00 06 04 00 29 0B 01 00\r
-T 5B 10 00 00 21 81 02 00 00 CD 00 00 00 00 E1\r
-R 00 00 01 00 00 05 01 00 02 0A 1E 00\r
-T 62 10 00 00 E1 ED 5B 04 00 00 00 3E\r
-R 00 00 01 00 02 07 06 00\r
-T 68 10 00 00 60 04 00 00 21 60 04 00 00 CD\r
+T DA 11 00 00 21 81 02 00 00 CD 00 00 00 00 E1\r
+R 00 00 01 00 00 05 01 00 02 0A 21 00\r
+T E1 11 00 00 E1 ED 5B 04 00 00 00 3E\r
+R 00 00 01 00 02 07 07 00\r
+T E7 11 00 00 60 04 00 00 21 60 04 00 00 CD\r
 R 00 00 01 00 29 04 01 00 00 09 01 00\r
-T 6D 10 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
-T 6F 10 00 00\r
+T EC 11 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T EE 11 00 00\r
 R 00 00 01 00\r
-T 6F 10 00 00 01 00 00 1E 00 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 0A 26 00\r
-T 77 10 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
-R 00 00 01 00 02 04 26 00 02 09 1E 00\r
-T 7E 10 00 00 D6 2C 2D 28 23\r
+T EE 11 00 00 01 00 00 1E 00 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 0A 2A 00\r
+T F6 11 00 00 00 00 00 00 CD 00 00 00 00 DD 75\r
+R 00 00 01 00 02 04 2A 00 02 09 21 00\r
+T FD 11 00 00 D6 2C 2D 28 23\r
 R 00 00 01 00\r
-T 83 10 00 00\r
+T 02 12 00 00\r
 R 00 00 01 00\r
-T 83 10 00 00 DD 7E D6 E6 7F DD 77 D6 21 01 00\r
+T 02 12 00 00 DD 7E D6 E6 7F DD 77 D6 21 01 00\r
 R 00 00 01 00\r
-T 8E 10 00 00 E5 21 06 00 39 4D 44 DD 5E D4 DD\r
+T 0D 12 00 00 E5 21 06 00 39 4D 44 DD 5E D4 DD\r
 R 00 00 01 00\r
-T 99 10 00 00 56 D5 3E 00 00 00 00 21\r
-R 00 00 01 00 2B 07 08 00\r
-T 9E 10 00 00 00 00 00 00 CD 00 00 00 00 F1 18\r
-R 00 00 01 00 02 04 08 00 02 09 1E 00\r
-T A5 10 00 00 C9\r
+T 18 12 00 00 56 D5 3E 00 00 00 00 21\r
+R 00 00 01 00 2B 07 09 00\r
+T 1D 12 00 00 00 00 00 00 CD 00 00 00 00 F1 18\r
+R 00 00 01 00 02 04 09 00 02 09 21 00\r
+T 24 12 00 00 C9\r
 R 00 00 01 00\r
-T A6 10 00 00\r
+T 25 12 00 00\r
 R 00 00 01 00\r
-T A6 10 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 0B 00 02 0A 0B 00\r
-T AC 10 00 00 00 00 00 00 18 0E\r
-R 00 00 01 00 02 04 1E 00\r
-T B0 10 00 00\r
-R 00 00 01 00\r
-T B0 10 00 00 21 05 00 39 5D 54 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 0E 00\r
-T B8 10 00 00 21 00 00 00 00 CD 00 00 00 00\r
-R 00 00 01 00 02 05 0E 00 02 0A 1E 00\r
-T BE 10 00 00\r
-R 00 00 01 00\r
-T BE 10 00 00 DD 5E D4 DD 56 D5 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 14 00\r
-T C6 10 00 00 21 00 00 00 00 CD 00 00 00 00 21\r
-R 00 00 01 00 02 05 14 00 02 0A 1E 00\r
-T CD 10 00 00 00 00 E5 21 07 00 39 E5 3E\r
-R 00 00 01 00\r
-T D6 10 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 2B 00 02 09 2B 00\r
-T DB 10 00 00 00 00 00 00 F1 F1 DD 75 D4 DD 74\r
-R 00 00 01 00 02 04 1E 00\r
-T E4 10 00 00 D5 21 05 00 39 5D 54 3E\r
+T 25 12 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 0C 00 02 0A 0C 00\r
+T 2B 12 00 00 00 00 00 00 18 0E\r
+R 00 00 01 00 02 04 21 00\r
+T 2F 12 00 00\r
+R 00 00 01 00\r
+T 2F 12 00 00 21 05 00 39 5D 54 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 0F 00\r
+T 37 12 00 00 21 00 00 00 00 CD 00 00 00 00\r
+R 00 00 01 00 02 05 0F 00 02 0A 21 00\r
+T 3D 12 00 00\r
+R 00 00 01 00\r
+T 3D 12 00 00 DD 5E D4 DD 56 D5 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 16 00\r
+T 45 12 00 00 21 00 00 00 00 CD 00 00 00 00 21\r
+R 00 00 01 00 02 05 16 00 02 0A 21 00\r
+T 4C 12 00 00 00 00 E5 21 07 00 39 E5 3E\r
+R 00 00 01 00\r
+T 55 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 2F 00 02 09 2F 00\r
+T 5A 12 00 00 00 00 00 00 F1 F1 DD 75 D4 DD 74\r
+R 00 00 01 00 02 04 21 00\r
+T 63 12 00 00 D5 21 05 00 39 5D 54 3E\r
 R 00 00 01 00\r
-T EC 10 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0E 00 02 09 0E 00\r
-T F1 10 00 00 00 00 00 00 DD 6E D4 DD 66 D5 18\r
-R 00 00 01 00 02 04 1E 00\r
-T FA 10 00 00 06\r
+T 6B 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0F 00 02 09 0F 00\r
+T 70 12 00 00 00 00 00 00 DD 6E D4 DD 66 D5 18\r
+R 00 00 01 00 02 04 21 00\r
+T 79 12 00 00 06\r
 R 00 00 01 00\r
-T FB 10 00 00\r
+T 7A 12 00 00\r
 R 00 00 01 00\r
-T FB 10 00 00 DD 6E D2 DD 66 D3\r
+T 7A 12 00 00 DD 6E D2 DD 66 D3\r
 R 00 00 01 00\r
-T 01 11 00 00\r
+T 80 12 00 00\r
 R 00 00 01 00\r
-T 01 11 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
-T 04 11 00 00\r
+T 80 12 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
+T 83 12 00 00\r
 R 00 00 01 00\r
-T 04 11 00 00 CD 00 00 00 00 FE FF 2A\r
-R 00 00 01 00 02 05 24 00\r
-T 0A 11 00 00 00 00 00 00 DD 75 FE DD 74 FF\r
+T 83 12 00 00 CD 00 00 00 00 FE FF 2A\r
+R 00 00 01 00 02 05 28 00\r
+T 89 12 00 00 00 00 00 00 DD 75 FE DD 74 FF\r
 R 00 00 01 00 00 04 03 00\r
-T 12 11 00 00\r
+T 91 12 00 00\r
 R 00 00 01 00\r
-T 12 11 00 00 DD 7E FE DD B6 FF 28 59\r
+T 91 12 00 00 DD 7E FE DD B6 FF 28 59\r
 R 00 00 01 00\r
-T 1A 11 00 00\r
+T 99 12 00 00\r
 R 00 00 01 00\r
-T 1A 11 00 00 21 04 00 DD 4E FE DD 46 FF 09 7E\r
+T 99 12 00 00 21 04 00 DD 4E FE DD 46 FF 09 7E\r
 R 00 00 01 00\r
-T 25 11 00 00 23 B6 28 34 21 04 00 DD 4E FE DD\r
+T A4 12 00 00 23 B6 28 34 21 04 00 DD 4E FE DD\r
 R 00 00 01 00\r
-T 30 11 00 00 46 FF 09 46 23 66 68 01 04 00 09\r
+T AF 12 00 00 46 FF 09 46 23 66 68 01 04 00 09\r
 R 00 00 01 00\r
-T 3B 11 00 00 7E 23 B6 28 1D\r
+T BA 12 00 00 7E 23 B6 28 1D\r
 R 00 00 01 00\r
-T 40 11 00 00\r
+T BF 12 00 00\r
 R 00 00 01 00\r
-T 40 11 00 00\r
+T BF 12 00 00\r
 R 00 00 01 00\r
-T 40 11 00 00\r
+T BF 12 00 00\r
 R 00 00 01 00\r
-T 40 11 00 00 21 04 00 DD 4E FE DD 46 FF 09 46\r
+T BF 12 00 00 21 04 00 DD 4E FE DD 46 FF 09 46\r
 R 00 00 01 00\r
-T 4B 11 00 00 23 66 68 01 04 00 09 5E 23 56 3E\r
+T CA 12 00 00 23 66 68 01 04 00 09 5E 23 56 3E\r
 R 00 00 01 00\r
-T 56 11 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0E 00 02 09 0E 00\r
-T 5B 11 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
-T 5D 11 00 00\r
+T D5 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0F 00 02 09 0F 00\r
+T DA 12 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T DC 12 00 00\r
 R 00 00 01 00\r
-T 5D 11 00 00 21 06 00 DD 4E FE DD 46 FF 09 56\r
+T DC 12 00 00 21 06 00 DD 4E FE DD 46 FF 09 56\r
 R 00 00 01 00\r
-T 68 11 00 00 23 66 6A DD 75 FE DD 74 FF 18 9F\r
+T E7 12 00 00 23 66 6A DD 75 FE DD 74 FF 18 9F\r
 R 00 00 01 00\r
-T 73 11 00 00\r
+T F2 12 00 00\r
 R 00 00 01 00\r
-T 73 11 00 00 21 00 00 22 00 00 00 00 C3\r
+T F2 12 00 00 21 00 00 22 00 00 00 00 C3\r
 R 00 00 01 00 00 08 03 00\r
-T 7A 11 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 12 00\r
-T 7C 11 00 00\r
+T F9 12 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 13 00\r
+T FB 12 00 00\r
 R 00 00 01 00\r
-T 7C 11 00 00 CD 00 00 00 00 FC FF AF DD 77 FE\r
-R 00 00 01 00 02 05 24 00\r
-T 85 11 00 00 DD 77 FF 2A 02 00 00 00 DD 75 FC\r
+T FB 12 00 00 CD 00 00 00 00 FC FF AF DD 77 FE\r
+R 00 00 01 00 02 05 28 00\r
+T 04 13 00 00 DD 77 FF 2A 02 00 00 00 DD 75 FC\r
 R 00 00 01 00 00 08 03 00\r
-T 8E 11 00 00 DD 74 FD\r
+T 0D 13 00 00 DD 74 FD\r
 R 00 00 01 00\r
-T 91 11 00 00\r
+T 10 13 00 00\r
 R 00 00 01 00\r
-T 91 11 00 00 DD 7E FC DD B6 FD CA 43 12 00 00\r
+T 10 13 00 00 DD 7E FC DD B6 FD CA C2 13 00 00\r
 R 00 00 01 00 00 0B 01 00\r
-T 9A 11 00 00\r
+T 19 13 00 00\r
 R 00 00 01 00\r
-T 9A 11 00 00 DD 5E FC DD 56 FD 3E 00 00 00 00\r
-R 00 00 01 00 2B 0B 17 00\r
-T A2 11 00 00 21 00 00 00 00 CD 00 00 00 00 DD\r
-R 00 00 01 00 02 05 17 00 02 0A 1E 00\r
-T A9 11 00 00 4E 02 DD 46 03 CD 00 00 00 00 38\r
-R 00 00 01 00 02 0A 2A 00\r
-T B2 11 00 00 6D\r
+T 19 13 00 00 DD 5E FC DD 56 FD 3E 00 00 00 00\r
+R 00 00 01 00 2B 0B 1A 00\r
+T 21 13 00 00 21 00 00 00 00 CD 00 00 00 00 DD\r
+R 00 00 01 00 02 05 1A 00 02 0A 21 00\r
+T 28 13 00 00 4E 02 DD 46 03 CD 00 00 00 00 38\r
+R 00 00 01 00 02 0A 2E 00\r
+T 31 13 00 00 6D\r
 R 00 00 01 00\r
-T B3 11 00 00\r
+T 32 13 00 00\r
 R 00 00 01 00\r
-T B3 11 00 00 21 04 00 DD 4E FC DD 46 FD 09 46\r
+T 32 13 00 00 21 04 00 DD 4E FC DD 46 FD 09 46\r
 R 00 00 01 00\r
-T BE 11 00 00 23 66 68 01 04 00 09 7E 23 B6 28\r
+T 3D 13 00 00 23 66 68 01 04 00 09 7E 23 B6 28\r
 R 00 00 01 00\r
-T C9 11 00 00 1D\r
+T 48 13 00 00 1D\r
 R 00 00 01 00\r
-T CA 11 00 00\r
+T 49 13 00 00\r
 R 00 00 01 00\r
-T CA 11 00 00 21 04 00 DD 4E FC DD 46 FD 09 46\r
+T 49 13 00 00 21 04 00 DD 4E FC DD 46 FD 09 46\r
 R 00 00 01 00\r
-T D5 11 00 00 23 66 68 01 04 00 09 5E 23 56 3E\r
+T 54 13 00 00 23 66 68 01 04 00 09 5E 23 56 3E\r
 R 00 00 01 00\r
-T E0 11 00 00 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 04 0E 00 02 09 0E 00\r
-T E5 11 00 00 00 00 00 00\r
-R 00 00 01 00 02 04 1E 00\r
-T E7 11 00 00\r
+T 5F 13 00 00 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 04 0F 00 02 09 0F 00\r
+T 64 13 00 00 00 00 00 00\r
+R 00 00 01 00 02 04 21 00\r
+T 66 13 00 00\r
 R 00 00 01 00\r
-T E7 11 00 00 DD 7E FE DD B6 FF 20 13\r
+T 66 13 00 00 DD 7E FE DD B6 FF 20 13\r
 R 00 00 01 00\r
-T EF 11 00 00\r
+T 6E 13 00 00\r
 R 00 00 01 00\r
-T EF 11 00 00 21 06 00 DD 4E FC DD 46 FD 09 46\r
+T 6E 13 00 00 21 06 00 DD 4E FC DD 46 FD 09 46\r
 R 00 00 01 00\r
-T FA 11 00 00 23 66 68 22 02 00 00 00 18 1C\r
+T 79 13 00 00 23 66 68 22 02 00 00 00 18 1C\r
 R 00 00 01 00 00 08 03 00\r
-T 02 12 00 00\r
+T 81 13 00 00\r
 R 00 00 01 00\r
-T 02 12 00 00 21 06 00 DD 4E FE DD 46 FF 09 E5\r
+T 81 13 00 00 21 06 00 DD 4E FE DD 46 FF 09 E5\r
 R 00 00 01 00\r
-T 0D 12 00 00 21 06 00 DD 4E FC DD 46 FD 09 4E\r
+T 8C 13 00 00 21 06 00 DD 4E FC DD 46 FD 09 4E\r
 R 00 00 01 00\r
-T 18 12 00 00 23 46 E1 71 23 70\r
+T 97 13 00 00 23 46 E1 71 23 70\r
 R 00 00 01 00\r
-T 1E 12 00 00\r
+T 9D 13 00 00\r
 R 00 00 01 00\r
-T 1E 12 00 00 18 0C\r
+T 9D 13 00 00 18 0C\r
 R 00 00 01 00\r
-T 20 12 00 00\r
+T 9F 13 00 00\r
 R 00 00 01 00\r
-T 20 12 00 00 DD 6E FC DD 66 FD DD 75 FE DD 74\r
+T 9F 13 00 00 DD 6E FC DD 66 FD DD 75 FE DD 74\r
 R 00 00 01 00\r
-T 2B 12 00 00 FF\r
+T AA 13 00 00 FF\r
 R 00 00 01 00\r
-T 2C 12 00 00\r
+T AB 13 00 00\r
 R 00 00 01 00\r
-T 2C 12 00 00 21 06 00 DD 4E FC DD 46 FD 09 56\r
+T AB 13 00 00 21 06 00 DD 4E FC DD 46 FD 09 56\r
 R 00 00 01 00\r
-T 37 12 00 00 23 66 6A DD 75 FC DD 74 FD C3\r
+T B6 13 00 00 23 66 6A DD 75 FC DD 74 FD C3\r
 R 00 00 01 00\r
-T 41 12 00 00 91 11 00 00\r
+T C0 13 00 00 10 13 00 00\r
 R 00 00 01 00 00 04 01 00\r
-T 43 12 00 00\r
+T C2 13 00 00\r
 R 00 00 01 00\r
-T 43 12 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
-T 46 12 00 00\r
+T C2 13 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
+T C5 13 00 00\r
 R 00 00 01 00\r
-T 46 12 00 00 CD 00 00 00 00 FC FF DD 6E 02 DD\r
-R 00 00 01 00 02 05 24 00\r
-T 4F 12 00 00 66 03 DD 75 FC DD 74 FD DD 36 FE\r
+T C5 13 00 00 CD 00 00 00 00 FC FF DD 6E 02 DD\r
+R 00 00 01 00 02 05 28 00\r
+T CE 13 00 00 66 03 DD 75 FC DD 74 FD DD 36 FE\r
 R 00 00 01 00\r
-T 5A 12 00 00 88 00 00 00 DD 36 FF 88 00 00 00\r
+T D9 13 00 00 AC 00 00 00 DD 36 FF AC 00 00 00\r
 R 00 00 01 00 09 04 02 00 89 0B 02 00\r
-T 5F 12 00 00\r
+T DE 13 00 00\r
 R 00 00 01 00\r
-T 5F 12 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
+T DE 13 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
 R 00 00 01 00\r
-T 6A 12 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 70\r
+T E9 13 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 70\r
 R 00 00 01 00\r
-T 75 12 00 00 04 05 28 0A\r
+T F4 13 00 00 04 05 28 0A\r
 R 00 00 01 00\r
-T 79 12 00 00\r
+T F8 13 00 00\r
 R 00 00 01 00\r
-T 79 12 00 00 DD 34 FC 20 03 DD 34 FD\r
+T F8 13 00 00 DD 34 FC 20 03 DD 34 FD\r
 R 00 00 01 00\r
-T 81 12 00 00\r
+T 00 14 00 00\r
 R 00 00 01 00\r
-T 81 12 00 00 18 DC\r
+T 00 14 00 00 18 DC\r
 R 00 00 01 00\r
-T 83 12 00 00\r
+T 02 14 00 00\r
 R 00 00 01 00\r
-T 83 12 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
-R 00 00 01 00 2B 05 2F 00 02 0A 2F 00\r
-T 89 12 00 00 00 00 00 00 4D 44 11 E8 03 CD\r
-R 00 00 01 00 02 04 1E 00\r
-T 91 12 00 00 00 00 00 00 2A 04 00 00 00 23 22\r
-R 00 00 01 00 02 04 09 00 00 09 03 00\r
-T 98 12 00 00 04 00 00 00 2B 19 EB 3E\r
+T 02 14 00 00 3E 00 00 00 00 21 00 00 00 00 CD\r
+R 00 00 01 00 2B 05 33 00 02 0A 33 00\r
+T 08 14 00 00 00 00 00 00 4D 44 11 E8 03 CD\r
+R 00 00 01 00 02 04 21 00\r
+T 10 14 00 00 00 00 00 00 2A 04 00 00 00 23 22\r
+R 00 00 01 00 02 04 0A 00 00 09 03 00\r
+T 17 14 00 00 04 00 00 00 2B 19 EB 3E\r
 R 00 00 01 00 00 04 03 00\r
-T 9E 12 00 00 00 00 00 00 21 00 00 00 00 CD\r
+T 1D 14 00 00 00 00 00 00 21 00 00 00 00 CD\r
 R 00 00 01 00 2B 04 03 00 02 09 03 00\r
-T A3 12 00 00 00 00 00 00 DD 75 FE DD 74 FF\r
-R 00 00 01 00 02 04 1E 00\r
-T AB 12 00 00\r
+T 22 14 00 00 00 00 00 00 DD 75 FE DD 74 FF\r
+R 00 00 01 00 02 04 21 00\r
+T 2A 14 00 00\r
 R 00 00 01 00\r
-T AB 12 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
+T 2A 14 00 00 DD 6E FE DD 66 FF 23 DD 75 FE DD\r
 R 00 00 01 00\r
-T B6 12 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 70\r
+T 35 14 00 00 74 FF 2B 46 DD 6E FC DD 66 FD 70\r
 R 00 00 01 00\r
-T C1 12 00 00 04 05 28 0A\r
+T 40 14 00 00 04 05 28 0A\r
 R 00 00 01 00\r
-T C5 12 00 00\r
+T 44 14 00 00\r
 R 00 00 01 00\r
-T C5 12 00 00 DD 34 FC 20 03 DD 34 FD\r
+T 44 14 00 00 DD 34 FC 20 03 DD 34 FD\r
 R 00 00 01 00\r
-T CD 12 00 00\r
+T 4C 14 00 00\r
 R 00 00 01 00\r
-T CD 12 00 00 18 DC\r
+T 4C 14 00 00 18 DC\r
 R 00 00 01 00\r
-T CF 12 00 00\r
+T 4E 14 00 00\r
 R 00 00 01 00\r
-T CF 12 00 00 C3 00 00 00 00\r
-R 00 00 01 00 02 05 12 00\r
+T 4E 14 00 00 C3 00 00 00 00\r
+R 00 00 01 00 02 05 13 00\r
 T 00 00 00 00\r
 R 00 00 02 00\r
 T 00 00 00 00 69 6E 70 75 74 20 6C 69 6E 65 20\r
@@ -2059,33 +2239,57 @@ T 2A 00 00 00 20 64 65 65 70 6C 79 00
 R 00 00 02 00\r
 T 32 00 00 00\r
 R 00 00 02 00\r
-T 32 00 00 00 74 6F 6F 20 6D 61 6E 79 20 66 69\r
+T 32 00 00 00 23 00\r
+R 00 00 02 00\r
+T 34 00 00 00\r
+R 00 00 02 00\r
+T 34 00 00 00 24 00\r
+R 00 00 02 00\r
+T 36 00 00 00\r
+R 00 00 02 00\r
+T 36 00 00 00 55 53 45 52 00\r
+R 00 00 02 00\r
+T 3B 00 00 00\r
+R 00 00 02 00\r
+T 3B 00 00 00 73 6F 6D 65 6F 6E 65 00\r
+R 00 00 02 00\r
+T 43 00 00 00\r
+R 00 00 02 00\r
+T 43 00 00 00 73 6F 6D 65 68 6F 73 74 00\r
+R 00 00 02 00\r
+T 4C 00 00 00\r
+R 00 00 02 00\r
+T 4C 00 00 00 73 6F 6D 65 77 68 65 72 65 00\r
+R 00 00 02 00\r
+T 56 00 00 00\r
+R 00 00 02 00\r
+T 56 00 00 00 74 6F 6F 20 6D 61 6E 79 20 66 69\r
 R 00 00 02 00\r
-T 3D 00 00 00 6C 65 73 20 6F 70 65 6E 20 69 6E\r
+T 61 00 00 00 6C 65 73 20 6F 70 65 6E 20 69 6E\r
 R 00 00 02 00\r
-T 48 00 00 00 20 73 68 65 6C 6C 00\r
+T 6C 00 00 00 20 73 68 65 6C 6C 00\r
 R 00 00 02 00\r
-T 4F 00 00 00\r
+T 73 00 00 00\r
 R 00 00 02 00\r
-T 4F 00 00 00 63 61 6E 27 74 20 63 72 65 61 74\r
+T 73 00 00 00 63 61 6E 27 74 20 63 72 65 61 74\r
 R 00 00 02 00\r
-T 5A 00 00 00 65 20 70 69 70 65 20 2D 20 74 72\r
+T 7E 00 00 00 65 20 70 69 70 65 20 2D 20 74 72\r
 R 00 00 02 00\r
-T 65 00 00 00 79 20 61 67 61 69 6E 00\r
+T 89 00 00 00 79 20 61 67 61 69 6E 00\r
 R 00 00 02 00\r
-T 6D 00 00 00\r
+T 91 00 00 00\r
 R 00 00 02 00\r
-T 6D 00 00 00 68 65 72 65 20 64 6F 63 75 6D 65\r
+T 91 00 00 00 68 65 72 65 20 64 6F 63 75 6D 65\r
 R 00 00 02 00\r
-T 78 00 00 00 6E 74 20 60 00\r
+T 9C 00 00 00 6E 74 20 60 00\r
 R 00 00 02 00\r
-T 7D 00 00 00\r
+T A1 00 00 00\r
 R 00 00 02 00\r
-T 7D 00 00 00 27 20 75 6E 63 6C 6F 73 65 64 00\r
+T A1 00 00 00 27 20 75 6E 63 6C 6F 73 65 64 00\r
 R 00 00 02 00\r
-T 88 00 00 00\r
+T AC 00 00 00\r
 R 00 00 02 00\r
-T 88 00 00 00 2F 74 6D 70 2F 73 68 74 6D 00\r
+T AC 00 00 00 2F 74 6D 70 2F 73 68 74 6D 00\r
 R 00 00 02 00\r
 T 00 00 00 00\r
 R 00 00 03 00\r
index 6ce97c1..ae3a45d 100644 (file)
 #include <string.h>\r
 #include <errno.h>\r
 \r
+#ifndef DEBUG\r
+#define DEBUG 0\r
+#endif\r
+\r
 #if 0\r
 void wr(char *s) {\r
        write(STDERR_FILENO, s, strlen(s));\r
@@ -107,7 +111,13 @@ int main(argc, argv)
                        }\r
                else\r
                        {\r
+#if DEBUG > 0\r
+                       sysdebug(DEBUG);\r
+#endif\r
                        er = falign(fd, XIP_ALIGN);\r
+#if DEBUG > 0\r
+                       sysdebug(0);\r
+#endif\r
                        close(fd);\r
                        }\r
                if (er)\r
index 9675ef8..d7e66f0 100644 (file)
@@ -1,4 +1,4 @@
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\adduser\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\adduser\r
 @if errorlevel 1 goto failure\r
 del adduser.r01\r
 as-z80 -l -o adduser.s01\r
@@ -9,7 +9,7 @@ link-z80 -f adduser
 ihex2bin -l adduser.i86 ..\..\..\bin\banked\adduser\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\align\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\align\r
 @if errorlevel 1 goto failure\r
 del align.r01\r
 as-z80 -l -o align.s01\r
@@ -20,7 +20,7 @@ link-z80 -f align
 ihex2bin -l align.i86 ..\..\..\bin\banked\align\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\banner\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\banner\r
 @if errorlevel 1 goto failure\r
 del banner.r01\r
 as-z80 -l -o banner.s01\r
@@ -31,7 +31,7 @@ link-z80 -f banner
 ihex2bin -l banner.i86 ..\..\..\bin\banked\banner\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\basename\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\basename\r
 @if errorlevel 1 goto failure\r
 del basename.r01\r
 as-z80 -l -o basename.s01\r
@@ -43,7 +43,7 @@ ihex2bin -l basename.i86 ..\..\..\bin\banked\basename
 @if errorlevel 1 goto failure\r
 \r
 rem bogomips doesn't work under tc because too much use of z80 inline assembler\r
-rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\bogomips\r
+rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\bogomips\r
 rem @if errorlevel 1 goto failure\r
 rem del bogomips.r01\r
 rem as-z80 -l -o bogomips.s01\r
@@ -54,7 +54,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l bogomips.i86 ..\..\..\bin\banked\bogomips\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cal\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cal\r
 @if errorlevel 1 goto failure\r
 del cal.r01\r
 as-z80 -l -o cal.s01\r
@@ -65,7 +65,7 @@ link-z80 -f cal
 ihex2bin -l cal.i86 ..\..\..\bin\banked\cal\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cat\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cat\r
 @if errorlevel 1 goto failure\r
 del cat.r01\r
 as-z80 -l -o cat.s01\r
@@ -76,7 +76,7 @@ link-z80 -f cat
 ihex2bin -l cat.i86 ..\..\..\bin\banked\cat\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cdiff\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cdiff\r
 @if errorlevel 1 goto failure\r
 del cdiff.r01\r
 as-z80 -l -o cdiff.s01\r
@@ -87,7 +87,7 @@ link-z80 -f cdiff
 ihex2bin -l cdiff.i86 ..\..\..\bin\banked\cdiff\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cgrep\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cgrep\r
 @if errorlevel 1 goto failure\r
 del cgrep.r01\r
 as-z80 -l -o cgrep.s01\r
@@ -98,7 +98,7 @@ link-z80 -f cgrep
 ihex2bin -l cgrep.i86 ..\..\..\bin\banked\cgrep\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\chgrp\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\chgrp\r
 @if errorlevel 1 goto failure\r
 del chgrp.r01\r
 as-z80 -l -o chgrp.s01\r
@@ -109,7 +109,7 @@ link-z80 -f chgrp
 ihex2bin -l chgrp.i86 ..\..\..\bin\banked\chgrp\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\chmod\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\chmod\r
 @if errorlevel 1 goto failure\r
 del chmod.r01\r
 as-z80 -l -o chmod.s01\r
@@ -120,7 +120,7 @@ link-z80 -f chmod
 ihex2bin -l chmod.i86 ..\..\..\bin\banked\chmod\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\chown\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\chown\r
 @if errorlevel 1 goto failure\r
 del chown.r01\r
 as-z80 -l -o chown.s01\r
@@ -131,7 +131,7 @@ link-z80 -f chown
 ihex2bin -l chown.i86 ..\..\..\bin\banked\chown\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cksum\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cksum\r
 @if errorlevel 1 goto failure\r
 del cksum.r01\r
 as-z80 -l -o cksum.s01\r
@@ -142,7 +142,7 @@ link-z80 -f cksum
 ihex2bin -l cksum.i86 ..\..\..\bin\banked\cksum\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cmp\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cmp\r
 @if errorlevel 1 goto failure\r
 del cmp.r01\r
 as-z80 -l -o cmp.s01\r
@@ -153,7 +153,7 @@ link-z80 -f cmp
 ihex2bin -l cmp.i86 ..\..\..\bin\banked\cmp\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cp\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 -DNDEBUG ..\cp\r
 @if errorlevel 1 goto failure\r
 del cp.r01\r
 as-z80 -l -o cp.s01\r
@@ -164,7 +164,7 @@ link-z80 -f cp
 ihex2bin -l cp.i86 ..\..\..\bin\banked\cp\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cr\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cr\r
 @if errorlevel 1 goto failure\r
 del cr.r01\r
 as-z80 -l -o cr.s01\r
@@ -175,7 +175,7 @@ link-z80 -f cr
 ihex2bin -l cr.i86 ..\..\..\bin\banked\cr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\crc\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\crc\r
 @if errorlevel 1 goto failure\r
 del crc.r01\r
 as-z80 -l -o crc.s01\r
@@ -186,7 +186,7 @@ link-z80 -f crc
 ihex2bin -l crc.i86 ..\..\..\bin\banked\crc\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cron\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cron\r
 @if errorlevel 1 goto failure\r
 del cron.r01\r
 as-z80 -l -o cron.s01\r
@@ -197,7 +197,7 @@ link-z80 -f cron
 ihex2bin -l cron.i86 ..\..\..\bin\banked\cron\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\date\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\date\r
 @if errorlevel 1 goto failure\r
 del date.r01\r
 as-z80 -l -o date.s01\r
@@ -208,7 +208,7 @@ link-z80 -f date
 ihex2bin -l date.i86 ..\..\..\bin\banked\date\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dd\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dd\r
 @if errorlevel 1 goto failure\r
 del dd.r01\r
 as-z80 -l -o dd.s01\r
@@ -219,7 +219,7 @@ link-z80 -f dd
 ihex2bin -l dd.i86 ..\..\..\bin\banked\dd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\df\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\df\r
 @if errorlevel 1 goto failure\r
 del df.r01\r
 as-z80 -l -o df.s01\r
@@ -230,7 +230,7 @@ link-z80 -f df
 ihex2bin -l df.i86 ..\..\..\bin\banked\df\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dhry\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dhry\r
 @if errorlevel 1 goto failure\r
 del dhry.r01\r
 as-z80 -l -o dhry.s01\r
@@ -241,7 +241,7 @@ link-z80 -f dhry
 ihex2bin -l dhry.i86 ..\..\..\bin\banked\dhry\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\diff\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\diff\r
 @if errorlevel 1 goto failure\r
 del diff.r01\r
 as-z80 -l -o diff.s01\r
@@ -252,7 +252,7 @@ link-z80 -f diff
 ihex2bin -l diff.i86 ..\..\..\bin\banked\diff\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dirname\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dirname\r
 @if errorlevel 1 goto failure\r
 del dirname.r01\r
 as-z80 -l -o dirname.s01\r
@@ -263,7 +263,7 @@ link-z80 -f dirname
 ihex2bin -l dirname.i86 ..\..\..\bin\banked\dirname\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\diskusag\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\diskusag\r
 @if errorlevel 1 goto failure\r
 del diskusag.r01\r
 as-z80 -l -o diskusag.s01\r
@@ -275,7 +275,7 @@ ihex2bin -l diskusag.i86 ..\..\..\bin\banked\diskusag
 @if errorlevel 1 goto failure\r
 \r
 rem dosread is not necessary for the hytech system (no floppy drive)\r
-rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dosread\r
+rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 -DNDEBUG ..\dosread\r
 rem @if errorlevel 1 goto failure\r
 rem del dosread.r01\r
 rem as-z80 -l -o dosread.s01\r
@@ -286,7 +286,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l dosread.i86 ..\..\..\bin\banked\dosread\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dtree\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dtree\r
 @if errorlevel 1 goto failure\r
 del dtree.r01\r
 as-z80 -l -o dtree.s01\r
@@ -297,7 +297,7 @@ link-z80 -f dtree
 ihex2bin -l dtree.i86 ..\..\..\bin\banked\dtree\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\du\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\du\r
 @if errorlevel 1 goto failure\r
 del du.r01\r
 as-z80 -l -o du.s01\r
@@ -308,7 +308,7 @@ link-z80 -f du
 ihex2bin -l du.i86 ..\..\..\bin\banked\du\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\echo\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\echo\r
 @if errorlevel 1 goto failure\r
 del echo.r01\r
 as-z80 -l -o echo.s01\r
@@ -319,7 +319,7 @@ link-z80 -f echo
 ihex2bin -l echo.i86 ..\..\..\bin\banked\echo\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ed\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ed\r
 @if errorlevel 1 goto failure\r
 del ed.r01\r
 as-z80 -l -o ed.s01\r
@@ -330,7 +330,7 @@ link-z80 -f ed
 ihex2bin -l ed.i86 ..\..\..\bin\banked\ed\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\expr\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\expr\r
 @if errorlevel 1 goto failure\r
 del expr.r01\r
 as-z80 -l -o expr.s01\r
@@ -341,7 +341,7 @@ link-z80 -f expr
 ihex2bin -l expr.i86 ..\..\..\bin\banked\expr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\false\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\false\r
 @if errorlevel 1 goto failure\r
 del false.r01\r
 as-z80 -l -o false.s01\r
@@ -352,7 +352,7 @@ link-z80 -f false
 ihex2bin -l false.i86 ..\..\..\bin\banked\false\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\fgrep\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\fgrep\r
 @if errorlevel 1 goto failure\r
 del fgrep.r01\r
 as-z80 -l -o fgrep.s01\r
@@ -363,7 +363,7 @@ link-z80 -f fgrep
 ihex2bin -l fgrep.i86 ..\..\..\bin\banked\fgrep\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\file\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\file\r
 @if errorlevel 1 goto failure\r
 del file.r01\r
 as-z80 -l -o file.s01\r
@@ -374,7 +374,7 @@ link-z80 -f file
 ihex2bin -l file.i86 ..\..\..\bin\banked\file\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\find\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\find\r
 @if errorlevel 1 goto failure\r
 del find.r01\r
 as-z80 -l -o find.s01\r
@@ -385,7 +385,7 @@ link-z80 -f find
 ihex2bin -l find.i86 ..\..\..\bin\banked\find\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\fld\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\fld\r
 @if errorlevel 1 goto failure\r
 del fld.r01\r
 as-z80 -l -o fld.s01\r
@@ -396,7 +396,7 @@ link-z80 -f fld
 ihex2bin -l fld.i86 ..\..\..\bin\banked\fld\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\fortune\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\fortune\r
 @if errorlevel 1 goto failure\r
 del fortune.r01\r
 as-z80 -l -o fortune.s01\r
@@ -407,7 +407,7 @@ link-z80 -f fortune
 ihex2bin -l fortune.i86 ..\..\..\bin\banked\fortune\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\grep\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\grep\r
 @if errorlevel 1 goto failure\r
 del grep.r01\r
 as-z80 -l -o grep.s01\r
@@ -418,7 +418,7 @@ link-z80 -f grep
 ihex2bin -l grep.i86 ..\..\..\bin\banked\grep\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\gres\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\gres\r
 @if errorlevel 1 goto failure\r
 del gres.r01\r
 as-z80 -l -o gres.s01\r
@@ -429,7 +429,7 @@ link-z80 -f gres
 ihex2bin -l gres.i86 ..\..\..\bin\banked\gres\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\head\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\head\r
 @if errorlevel 1 goto failure\r
 del head.r01\r
 as-z80 -l -o head.s01\r
@@ -440,7 +440,7 @@ link-z80 -f head
 ihex2bin -l head.i86 ..\..\..\bin\banked\head\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\id\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\id\r
 @if errorlevel 1 goto failure\r
 del id.r01\r
 as-z80 -l -o id.s01\r
@@ -451,7 +451,7 @@ link-z80 -f id
 ihex2bin -l id.i86 ..\..\..\bin\banked\id\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\inodes\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\inodes\r
 @if errorlevel 1 goto failure\r
 del inodes.r01\r
 as-z80 -l -o inodes.s01\r
@@ -462,7 +462,7 @@ link-z80 -f inodes
 ihex2bin -l inodes.i86 ..\..\..\bin\banked\inodes\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\kill\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\kill\r
 @if errorlevel 1 goto failure\r
 del kill.r01\r
 as-z80 -l -o kill.s01\r
@@ -473,7 +473,7 @@ link-z80 -f kill
 ihex2bin -l kill.i86 ..\..\..\bin\banked\kill\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\lpd\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\lpd\r
 @if errorlevel 1 goto failure\r
 del lpd.r01\r
 as-z80 -l -o lpd.s01\r
@@ -484,7 +484,7 @@ link-z80 -f lpd
 ihex2bin -l lpd.i86 ..\..\..\bin\banked\lpd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\lpr\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\lpr\r
 @if errorlevel 1 goto failure\r
 del lpr.r01\r
 as-z80 -l -o lpr.s01\r
@@ -495,7 +495,7 @@ link-z80 -f lpr
 ihex2bin -l lpr.i86 ..\..\..\bin\banked\lpr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ls\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ls\r
 @if errorlevel 1 goto failure\r
 del ls.r01\r
 as-z80 -l -o ls.s01\r
@@ -506,7 +506,7 @@ link-z80 -f ls
 ihex2bin -l ls.i86 ..\..\..\bin\banked\ls\r
 @if errorlevel 1 goto failure\r
 \r
-rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\man\r
+rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\man\r
 rem @if errorlevel 1 goto failure\r
 rem del man.r01\r
 rem as-z80 -l -o man.s01\r
@@ -517,7 +517,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l man.i86 ..\..\..\bin\banked\man\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\mkdir\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\mkdir\r
 @if errorlevel 1 goto failure\r
 del mkdir.r01\r
 as-z80 -l -o mkdir.s01\r
@@ -528,7 +528,7 @@ link-z80 -f mkdir
 ihex2bin -l mkdir.i86 ..\..\..\bin\banked\mkdir\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\mknod\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\mknod\r
 @if errorlevel 1 goto failure\r
 del mknod.r01\r
 as-z80 -l -o mknod.s01\r
@@ -539,7 +539,7 @@ link-z80 -f mknod
 ihex2bin -l mknod.i86 ..\..\..\bin\banked\mknod\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\more\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\more\r
 @if errorlevel 1 goto failure\r
 del more.r01\r
 as-z80 -l -o more.s01\r
@@ -550,7 +550,7 @@ link-z80 -f more
 ihex2bin -l more.i86 ..\..\..\bin\banked\more\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\mount\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\mount\r
 @if errorlevel 1 goto failure\r
 del mount.r01\r
 as-z80 -l -o mount.s01\r
@@ -561,7 +561,7 @@ link-z80 -f mount
 ihex2bin -l mount.i86 ..\..\..\bin\banked\mount\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ncheck\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ncheck\r
 @if errorlevel 1 goto failure\r
 del ncheck.r01\r
 as-z80 -l -o ncheck.s01\r
@@ -572,7 +572,7 @@ link-z80 -f ncheck
 ihex2bin -l ncheck.i86 ..\..\..\bin\banked\ncheck\r
 @if errorlevel 1 goto failure\r
 \r
-rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ncr\r
+rem iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ncr\r
 rem @if errorlevel 1 goto failure\r
 rem del ncr.r01\r
 rem as-z80 -l -o ncr.s01\r
@@ -583,7 +583,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l ncr.i86 ..\..\..\bin\banked\ncr\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\od\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\od\r
 @if errorlevel 1 goto failure\r
 del od.r01\r
 as-z80 -l -o od.s01\r
@@ -594,7 +594,7 @@ link-z80 -f od
 ihex2bin -l od.i86 ..\..\..\bin\banked\od\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\passwd\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\passwd\r
 @if errorlevel 1 goto failure\r
 del passwd.r01\r
 as-z80 -l -o passwd.s01\r
@@ -605,7 +605,7 @@ link-z80 -f passwd
 ihex2bin -l passwd.i86 ..\..\..\bin\banked\passwd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\pathchk\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\pathchk\r
 @if errorlevel 1 goto failure\r
 del pathchk.r01\r
 as-z80 -l -o pathchk.s01\r
@@ -616,7 +616,7 @@ link-z80 -f pathchk
 ihex2bin -l pathchk.i86 ..\..\..\bin\banked\pathchk\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\pr\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\pr\r
 @if errorlevel 1 goto failure\r
 del pr.r01\r
 as-z80 -l -o pr.s01\r
@@ -627,7 +627,7 @@ link-z80 -f pr
 ihex2bin -l pr.i86 ..\..\..\bin\banked\pr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\printenv\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\printenv\r
 @if errorlevel 1 goto failure\r
 del printenv.r01\r
 as-z80 -l -o printenv.s01\r
@@ -638,7 +638,7 @@ link-z80 -f printenv
 ihex2bin -l printenv.i86 ..\..\..\bin\banked\printenv\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ps\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ps\r
 @if errorlevel 1 goto failure\r
 del ps.r01\r
 as-z80 -l -o ps.s01\r
@@ -649,7 +649,7 @@ link-z80 -f ps
 ihex2bin -l ps.i86 ..\..\..\bin\banked\ps\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\pwd\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\pwd\r
 @if errorlevel 1 goto failure\r
 del pwd.r01\r
 as-z80 -l -o pwd.s01\r
@@ -660,7 +660,7 @@ link-z80 -f pwd
 ihex2bin -l pwd.i86 ..\..\..\bin\banked\pwd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\readall\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\readall\r
 @if errorlevel 1 goto failure\r
 del readall.r01\r
 as-z80 -l -o readall.s01\r
@@ -671,7 +671,7 @@ link-z80 -f readall
 ihex2bin -l readall.i86 ..\..\..\bin\banked\readall\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\reboot\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\reboot\r
 @if errorlevel 1 goto failure\r
 del reboot.r01\r
 as-z80 -l -o reboot.s01\r
@@ -682,7 +682,7 @@ link-z80 -f reboot
 ihex2bin -l reboot.i86 ..\..\..\bin\banked\reboot\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\renice\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\renice\r
 @if errorlevel 1 goto failure\r
 del renice.r01\r
 as-z80 -l -o renice.s01\r
@@ -693,7 +693,7 @@ link-z80 -f renice
 ihex2bin -l renice.i86 ..\..\..\bin\banked\renice\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\rm\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\rm\r
 @if errorlevel 1 goto failure\r
 del rm.r01\r
 as-z80 -l -o rm.s01\r
@@ -704,7 +704,7 @@ link-z80 -f rm
 ihex2bin -l rm.i86 ..\..\..\bin\banked\rm\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\rmdir\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\rmdir\r
 @if errorlevel 1 goto failure\r
 del rmdir.r01\r
 as-z80 -l -o rmdir.s01\r
@@ -715,7 +715,7 @@ link-z80 -f rmdir
 ihex2bin -l rmdir.i86 ..\..\..\bin\banked\rmdir\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\roff\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\roff\r
 @if errorlevel 1 goto failure\r
 del roff.r01\r
 as-z80 -l -o roff.s01\r
@@ -726,7 +726,7 @@ link-z80 -f roff
 ihex2bin -l roff.i86 ..\..\..\bin\banked\roff\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\setclock\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\setclock\r
 @if errorlevel 1 goto failure\r
 del setclock.r01\r
 as-z80 -l -o setclock.s01\r
@@ -737,7 +737,7 @@ link-z80 -f setclock
 ihex2bin -l setclock.i86 ..\..\..\bin\banked\setclock\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\sort\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\sort\r
 @if errorlevel 1 goto failure\r
 del sort.r01\r
 as-z80 -l -o sort.s01\r
@@ -748,7 +748,7 @@ link-z80 -f sort
 ihex2bin -l sort.i86 ..\..\..\bin\banked\sort\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\split\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\split\r
 @if errorlevel 1 goto failure\r
 del split.r01\r
 as-z80 -l -o split.s01\r
@@ -759,7 +759,7 @@ link-z80 -f split
 ihex2bin -l split.i86 ..\..\..\bin\banked\split\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\su\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\su\r
 @if errorlevel 1 goto failure\r
 del su.r01\r
 as-z80 -l -o su.s01\r
@@ -770,7 +770,7 @@ link-z80 -f su
 ihex2bin -l su.i86 ..\..\..\bin\banked\su\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\sum\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\sum\r
 @if errorlevel 1 goto failure\r
 del sum.r01\r
 as-z80 -l -o sum.s01\r
@@ -781,7 +781,7 @@ link-z80 -f sum
 ihex2bin -l sum.i86 ..\..\..\bin\banked\sum\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\sync\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\sync\r
 @if errorlevel 1 goto failure\r
 del sync.r01\r
 as-z80 -l -o sync.s01\r
@@ -792,7 +792,7 @@ link-z80 -f sync
 ihex2bin -l sync.i86 ..\..\..\bin\banked\sync\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tail\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tail\r
 @if errorlevel 1 goto failure\r
 del tail.r01\r
 as-z80 -l -o tail.s01\r
@@ -803,7 +803,7 @@ link-z80 -f tail
 ihex2bin -l tail.i86 ..\..\..\bin\banked\tail\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tar\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tar\r
 @if errorlevel 1 goto failure\r
 del tar.r01\r
 as-z80 -l -o tar.s01\r
@@ -814,7 +814,7 @@ link-z80 -f tar
 ihex2bin -l tar.i86 ..\..\..\bin\banked\tar\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tee\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tee\r
 @if errorlevel 1 goto failure\r
 del tee.r01\r
 as-z80 -l -o tee.s01\r
@@ -825,7 +825,7 @@ link-z80 -f tee
 ihex2bin -l tee.i86 ..\..\..\bin\banked\tee\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ter\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ter\r
 @if errorlevel 1 goto failure\r
 del ter.r01\r
 as-z80 -l -o ter.s01\r
@@ -836,7 +836,7 @@ link-z80 -f ter
 ihex2bin -l ter.i86 ..\..\..\bin\banked\ter\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\termcap\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\termcap\r
 @if errorlevel 1 goto failure\r
 del termcap.r01\r
 as-z80 -l -o termcap.s01\r
@@ -847,7 +847,7 @@ link-z80 -f termcap
 ihex2bin -l termcap.i86 ..\..\..\bin\banked\termcap\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\test\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\test\r
 @if errorlevel 1 goto failure\r
 del test.r01\r
 as-z80 -l -o test.s01\r
@@ -858,7 +858,7 @@ link-z80 -f test
 ihex2bin -l test.i86 ..\..\..\bin\banked\test\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tget\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tget\r
 @if errorlevel 1 goto failure\r
 del tget.r01\r
 as-z80 -l -o tget.s01\r
@@ -869,7 +869,7 @@ link-z80 -f tget
 ihex2bin -l tget.i86 ..\..\..\bin\banked\tget\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\time\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\time\r
 @if errorlevel 1 goto failure\r
 del time.r01\r
 as-z80 -l -o time.s01\r
@@ -880,7 +880,7 @@ link-z80 -f time
 ihex2bin -l time.i86 ..\..\..\bin\banked\time\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\top\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\top\r
 @if errorlevel 1 goto failure\r
 del top.r01\r
 as-z80 -l -o top.s01\r
@@ -891,7 +891,7 @@ link-z80 -f top
 ihex2bin -l top.i86 ..\..\..\bin\banked\top\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\touch\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\touch\r
 @if errorlevel 1 goto failure\r
 del touch.r01\r
 as-z80 -l -o touch.s01\r
@@ -902,7 +902,7 @@ link-z80 -f touch
 ihex2bin -l touch.i86 ..\..\..\bin\banked\touch\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tr\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tr\r
 @if errorlevel 1 goto failure\r
 del tr.r01\r
 as-z80 -l -o tr.s01\r
@@ -913,7 +913,7 @@ link-z80 -f tr
 ihex2bin -l tr.i86 ..\..\..\bin\banked\tr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\true\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\true\r
 @if errorlevel 1 goto failure\r
 del true.r01\r
 as-z80 -l -o true.s01\r
@@ -924,7 +924,7 @@ link-z80 -f true
 ihex2bin -l true.i86 ..\..\..\bin\banked\true\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ualign\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ualign\r
 @if errorlevel 1 goto failure\r
 del ualign.r01\r
 as-z80 -l -o ualign.s01\r
@@ -935,7 +935,7 @@ link-z80 -f ualign
 ihex2bin -l ualign.i86 ..\..\..\bin\banked\ualign\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\umount\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\umount\r
 @if errorlevel 1 goto failure\r
 del umount.r01\r
 as-z80 -l -o umount.s01\r
@@ -946,7 +946,7 @@ link-z80 -f umount
 ihex2bin -l umount.i86 ..\..\..\bin\banked\umount\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uname\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uname\r
 @if errorlevel 1 goto failure\r
 del uname.r01\r
 as-z80 -l -o uname.s01\r
@@ -957,7 +957,7 @@ link-z80 -f uname
 ihex2bin -l uname.i86 ..\..\..\bin\banked\uname\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uniq\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uniq\r
 @if errorlevel 1 goto failure\r
 del uniq.r01\r
 as-z80 -l -o uniq.s01\r
@@ -968,7 +968,7 @@ link-z80 -f uniq
 ihex2bin -l uniq.i86 ..\..\..\bin\banked\uniq\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uudecode\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uudecode\r
 @if errorlevel 1 goto failure\r
 del uudecode.r01\r
 as-z80 -l -o uudecode.s01\r
@@ -979,7 +979,7 @@ link-z80 -f uudecode
 ihex2bin -l uudecode.i86 ..\..\..\bin\banked\uudecode\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uuencode\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uuencode\r
 @if errorlevel 1 goto failure\r
 del uuencode.r01\r
 as-z80 -l -o uuencode.s01\r
@@ -990,7 +990,7 @@ link-z80 -f uuencode
 ihex2bin -l uuencode.i86 ..\..\..\bin\banked\uuencode\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\wc\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\wc\r
 @if errorlevel 1 goto failure\r
 del wc.r01\r
 as-z80 -l -o wc.s01\r
@@ -1001,7 +1001,7 @@ link-z80 -f wc
 ihex2bin -l wc.i86 ..\..\..\bin\banked\wc\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\which\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\which\r
 @if errorlevel 1 goto failure\r
 del which.r01\r
 as-z80 -l -o which.s01\r
@@ -1012,7 +1012,7 @@ link-z80 -f which
 ihex2bin -l which.i86 ..\..\..\bin\banked\which\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\whoami\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\whoami\r
 @if errorlevel 1 goto failure\r
 del whoami.r01\r
 as-z80 -l -o whoami.s01\r
@@ -1023,7 +1023,7 @@ link-z80 -f whoami
 ihex2bin -l whoami.i86 ..\..\..\bin\banked\whoami\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\yes\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\yes\r
 @if errorlevel 1 goto failure\r
 del yes.r01\r
 as-z80 -l -o yes.s01\r
index 2eef51d..a1f3e4c 100644 (file)
@@ -1,4 +1,4 @@
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\adduser\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\adduser\r
 @if errorlevel 1 goto failure\r
 del adduser.r01\r
 as-z80 -l -o adduser.s01\r
@@ -9,7 +9,7 @@ link-z80 -f adduser
 ihex2bin -l adduser.i86 ..\..\..\bin\large\adduser\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\align\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\align\r
 @if errorlevel 1 goto failure\r
 del align.r01\r
 as-z80 -l -o align.s01\r
@@ -20,7 +20,7 @@ link-z80 -f align
 ihex2bin -l align.i86 ..\..\..\bin\large\align\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\banner\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\banner\r
 @if errorlevel 1 goto failure\r
 del banner.r01\r
 as-z80 -l -o banner.s01\r
@@ -31,7 +31,7 @@ link-z80 -f banner
 ihex2bin -l banner.i86 ..\..\..\bin\large\banner\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\basename\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\basename\r
 @if errorlevel 1 goto failure\r
 del basename.r01\r
 as-z80 -l -o basename.s01\r
@@ -43,7 +43,7 @@ ihex2bin -l basename.i86 ..\..\..\bin\large\basename
 @if errorlevel 1 goto failure\r
 \r
 rem bogomips doesn't work under tc because too much use of z80 inline assembler\r
-rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\bogomips\r
+rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\bogomips\r
 rem @if errorlevel 1 goto failure\r
 rem del bogomips.r01\r
 rem as-z80 -l -o bogomips.s01\r
@@ -54,7 +54,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l bogomips.i86 ..\..\..\bin\large\bogomips\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cal\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cal\r
 @if errorlevel 1 goto failure\r
 del cal.r01\r
 as-z80 -l -o cal.s01\r
@@ -65,7 +65,7 @@ link-z80 -f cal
 ihex2bin -l cal.i86 ..\..\..\bin\large\cal\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cat\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cat\r
 @if errorlevel 1 goto failure\r
 del cat.r01\r
 as-z80 -l -o cat.s01\r
@@ -76,7 +76,7 @@ link-z80 -f cat
 ihex2bin -l cat.i86 ..\..\..\bin\large\cat\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cdiff\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cdiff\r
 @if errorlevel 1 goto failure\r
 del cdiff.r01\r
 as-z80 -l -o cdiff.s01\r
@@ -87,7 +87,7 @@ link-z80 -f cdiff
 ihex2bin -l cdiff.i86 ..\..\..\bin\large\cdiff\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cgrep\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cgrep\r
 @if errorlevel 1 goto failure\r
 del cgrep.r01\r
 as-z80 -l -o cgrep.s01\r
@@ -98,7 +98,7 @@ link-z80 -f cgrep
 ihex2bin -l cgrep.i86 ..\..\..\bin\large\cgrep\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\chgrp\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\chgrp\r
 @if errorlevel 1 goto failure\r
 del chgrp.r01\r
 as-z80 -l -o chgrp.s01\r
@@ -109,7 +109,7 @@ link-z80 -f chgrp
 ihex2bin -l chgrp.i86 ..\..\..\bin\large\chgrp\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\chmod\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\chmod\r
 @if errorlevel 1 goto failure\r
 del chmod.r01\r
 as-z80 -l -o chmod.s01\r
@@ -120,7 +120,7 @@ link-z80 -f chmod
 ihex2bin -l chmod.i86 ..\..\..\bin\large\chmod\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\chown\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\chown\r
 @if errorlevel 1 goto failure\r
 del chown.r01\r
 as-z80 -l -o chown.s01\r
@@ -131,7 +131,7 @@ link-z80 -f chown
 ihex2bin -l chown.i86 ..\..\..\bin\large\chown\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cksum\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cksum\r
 @if errorlevel 1 goto failure\r
 del cksum.r01\r
 as-z80 -l -o cksum.s01\r
@@ -142,7 +142,7 @@ link-z80 -f cksum
 ihex2bin -l cksum.i86 ..\..\..\bin\large\cksum\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cmp\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cmp\r
 @if errorlevel 1 goto failure\r
 del cmp.r01\r
 as-z80 -l -o cmp.s01\r
@@ -153,7 +153,7 @@ link-z80 -f cmp
 ihex2bin -l cmp.i86 ..\..\..\bin\large\cmp\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cp\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 -DNDEBUG ..\cp\r
 @if errorlevel 1 goto failure\r
 del cp.r01\r
 as-z80 -l -o cp.s01\r
@@ -164,7 +164,7 @@ link-z80 -f cp
 ihex2bin -l cp.i86 ..\..\..\bin\large\cp\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cr\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cr\r
 @if errorlevel 1 goto failure\r
 del cr.r01\r
 as-z80 -l -o cr.s01\r
@@ -175,7 +175,7 @@ link-z80 -f cr
 ihex2bin -l cr.i86 ..\..\..\bin\large\cr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\crc\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\crc\r
 @if errorlevel 1 goto failure\r
 del crc.r01\r
 as-z80 -l -o crc.s01\r
@@ -186,7 +186,7 @@ link-z80 -f crc
 ihex2bin -l crc.i86 ..\..\..\bin\large\crc\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\cron\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\cron\r
 @if errorlevel 1 goto failure\r
 del cron.r01\r
 as-z80 -l -o cron.s01\r
@@ -197,7 +197,7 @@ link-z80 -f cron
 ihex2bin -l cron.i86 ..\..\..\bin\large\cron\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\date\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\date\r
 @if errorlevel 1 goto failure\r
 del date.r01\r
 as-z80 -l -o date.s01\r
@@ -208,7 +208,7 @@ link-z80 -f date
 ihex2bin -l date.i86 ..\..\..\bin\large\date\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dd\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dd\r
 @if errorlevel 1 goto failure\r
 del dd.r01\r
 as-z80 -l -o dd.s01\r
@@ -219,7 +219,7 @@ link-z80 -f dd
 ihex2bin -l dd.i86 ..\..\..\bin\large\dd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\df\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\df\r
 @if errorlevel 1 goto failure\r
 del df.r01\r
 as-z80 -l -o df.s01\r
@@ -230,7 +230,7 @@ link-z80 -f df
 ihex2bin -l df.i86 ..\..\..\bin\large\df\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dhry\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dhry\r
 @if errorlevel 1 goto failure\r
 del dhry.r01\r
 as-z80 -l -o dhry.s01\r
@@ -241,7 +241,7 @@ link-z80 -f dhry
 ihex2bin -l dhry.i86 ..\..\..\bin\large\dhry\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\diff\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\diff\r
 @if errorlevel 1 goto failure\r
 del diff.r01\r
 as-z80 -l -o diff.s01\r
@@ -252,7 +252,7 @@ link-z80 -f diff
 ihex2bin -l diff.i86 ..\..\..\bin\large\diff\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dirname\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dirname\r
 @if errorlevel 1 goto failure\r
 del dirname.r01\r
 as-z80 -l -o dirname.s01\r
@@ -263,7 +263,7 @@ link-z80 -f dirname
 ihex2bin -l dirname.i86 ..\..\..\bin\large\dirname\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\diskusag\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\diskusag\r
 @if errorlevel 1 goto failure\r
 del diskusag.r01\r
 as-z80 -l -o diskusag.s01\r
@@ -275,7 +275,7 @@ ihex2bin -l diskusag.i86 ..\..\..\bin\large\diskusag
 @if errorlevel 1 goto failure\r
 \r
 rem dosread is not necessary for the hytech system (no floppy drive)\r
-rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dosread\r
+rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 -DNDEBUG ..\dosread\r
 rem @if errorlevel 1 goto failure\r
 rem del dosread.r01\r
 rem as-z80 -l -o dosread.s01\r
@@ -286,7 +286,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l dosread.i86 ..\..\..\bin\large\dosread\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\dtree\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\dtree\r
 @if errorlevel 1 goto failure\r
 del dtree.r01\r
 as-z80 -l -o dtree.s01\r
@@ -297,7 +297,7 @@ link-z80 -f dtree
 ihex2bin -l dtree.i86 ..\..\..\bin\large\dtree\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\du\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\du\r
 @if errorlevel 1 goto failure\r
 del du.r01\r
 as-z80 -l -o du.s01\r
@@ -308,7 +308,7 @@ link-z80 -f du
 ihex2bin -l du.i86 ..\..\..\bin\large\du\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\echo\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\echo\r
 @if errorlevel 1 goto failure\r
 del echo.r01\r
 as-z80 -l -o echo.s01\r
@@ -319,7 +319,7 @@ link-z80 -f echo
 ihex2bin -l echo.i86 ..\..\..\bin\large\echo\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ed\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ed\r
 @if errorlevel 1 goto failure\r
 del ed.r01\r
 as-z80 -l -o ed.s01\r
@@ -330,7 +330,7 @@ link-z80 -f ed
 ihex2bin -l ed.i86 ..\..\..\bin\large\ed\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\expr\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\expr\r
 @if errorlevel 1 goto failure\r
 del expr.r01\r
 as-z80 -l -o expr.s01\r
@@ -341,7 +341,7 @@ link-z80 -f expr
 ihex2bin -l expr.i86 ..\..\..\bin\large\expr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\false\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\false\r
 @if errorlevel 1 goto failure\r
 del false.r01\r
 as-z80 -l -o false.s01\r
@@ -352,7 +352,7 @@ link-z80 -f false
 ihex2bin -l false.i86 ..\..\..\bin\large\false\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\fgrep\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\fgrep\r
 @if errorlevel 1 goto failure\r
 del fgrep.r01\r
 as-z80 -l -o fgrep.s01\r
@@ -363,7 +363,7 @@ link-z80 -f fgrep
 ihex2bin -l fgrep.i86 ..\..\..\bin\large\fgrep\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\file\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\file\r
 @if errorlevel 1 goto failure\r
 del file.r01\r
 as-z80 -l -o file.s01\r
@@ -374,7 +374,7 @@ link-z80 -f file
 ihex2bin -l file.i86 ..\..\..\bin\large\file\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\find\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\find\r
 @if errorlevel 1 goto failure\r
 del find.r01\r
 as-z80 -l -o find.s01\r
@@ -385,7 +385,7 @@ link-z80 -f find
 ihex2bin -l find.i86 ..\..\..\bin\large\find\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\fld\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\fld\r
 @if errorlevel 1 goto failure\r
 del fld.r01\r
 as-z80 -l -o fld.s01\r
@@ -396,7 +396,7 @@ link-z80 -f fld
 ihex2bin -l fld.i86 ..\..\..\bin\large\fld\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\fortune\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\fortune\r
 @if errorlevel 1 goto failure\r
 del fortune.r01\r
 as-z80 -l -o fortune.s01\r
@@ -407,7 +407,7 @@ link-z80 -f fortune
 ihex2bin -l fortune.i86 ..\..\..\bin\large\fortune\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\grep\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\grep\r
 @if errorlevel 1 goto failure\r
 del grep.r01\r
 as-z80 -l -o grep.s01\r
@@ -418,7 +418,7 @@ link-z80 -f grep
 ihex2bin -l grep.i86 ..\..\..\bin\large\grep\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\gres\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\gres\r
 @if errorlevel 1 goto failure\r
 del gres.r01\r
 as-z80 -l -o gres.s01\r
@@ -429,7 +429,7 @@ link-z80 -f gres
 ihex2bin -l gres.i86 ..\..\..\bin\large\gres\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\head\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\head\r
 @if errorlevel 1 goto failure\r
 del head.r01\r
 as-z80 -l -o head.s01\r
@@ -440,7 +440,7 @@ link-z80 -f head
 ihex2bin -l head.i86 ..\..\..\bin\large\head\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\id\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\id\r
 @if errorlevel 1 goto failure\r
 del id.r01\r
 as-z80 -l -o id.s01\r
@@ -451,7 +451,7 @@ link-z80 -f id
 ihex2bin -l id.i86 ..\..\..\bin\large\id\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\inodes\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\inodes\r
 @if errorlevel 1 goto failure\r
 del inodes.r01\r
 as-z80 -l -o inodes.s01\r
@@ -462,7 +462,7 @@ link-z80 -f inodes
 ihex2bin -l inodes.i86 ..\..\..\bin\large\inodes\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\kill\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\kill\r
 @if errorlevel 1 goto failure\r
 del kill.r01\r
 as-z80 -l -o kill.s01\r
@@ -473,7 +473,7 @@ link-z80 -f kill
 ihex2bin -l kill.i86 ..\..\..\bin\large\kill\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\lpd\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\lpd\r
 @if errorlevel 1 goto failure\r
 del lpd.r01\r
 as-z80 -l -o lpd.s01\r
@@ -484,7 +484,7 @@ link-z80 -f lpd
 ihex2bin -l lpd.i86 ..\..\..\bin\large\lpd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\lpr\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\lpr\r
 @if errorlevel 1 goto failure\r
 del lpr.r01\r
 as-z80 -l -o lpr.s01\r
@@ -495,7 +495,7 @@ link-z80 -f lpr
 ihex2bin -l lpr.i86 ..\..\..\bin\large\lpr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ls\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ls\r
 @if errorlevel 1 goto failure\r
 del ls.r01\r
 as-z80 -l -o ls.s01\r
@@ -506,7 +506,7 @@ link-z80 -f ls
 ihex2bin -l ls.i86 ..\..\..\bin\large\ls\r
 @if errorlevel 1 goto failure\r
 \r
-rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\man\r
+rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\man\r
 rem @if errorlevel 1 goto failure\r
 rem del man.r01\r
 rem as-z80 -l -o man.s01\r
@@ -517,7 +517,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l man.i86 ..\..\..\bin\large\man\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\mkdir\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\mkdir\r
 @if errorlevel 1 goto failure\r
 del mkdir.r01\r
 as-z80 -l -o mkdir.s01\r
@@ -528,7 +528,7 @@ link-z80 -f mkdir
 ihex2bin -l mkdir.i86 ..\..\..\bin\large\mkdir\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\mknod\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\mknod\r
 @if errorlevel 1 goto failure\r
 del mknod.r01\r
 as-z80 -l -o mknod.s01\r
@@ -539,7 +539,7 @@ link-z80 -f mknod
 ihex2bin -l mknod.i86 ..\..\..\bin\large\mknod\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\more\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\more\r
 @if errorlevel 1 goto failure\r
 del more.r01\r
 as-z80 -l -o more.s01\r
@@ -550,7 +550,7 @@ link-z80 -f more
 ihex2bin -l more.i86 ..\..\..\bin\large\more\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\mount\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\mount\r
 @if errorlevel 1 goto failure\r
 del mount.r01\r
 as-z80 -l -o mount.s01\r
@@ -561,7 +561,7 @@ link-z80 -f mount
 ihex2bin -l mount.i86 ..\..\..\bin\large\mount\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ncheck\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ncheck\r
 @if errorlevel 1 goto failure\r
 del ncheck.r01\r
 as-z80 -l -o ncheck.s01\r
@@ -572,7 +572,7 @@ link-z80 -f ncheck
 ihex2bin -l ncheck.i86 ..\..\..\bin\large\ncheck\r
 @if errorlevel 1 goto failure\r
 \r
-rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ncr\r
+rem iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ncr\r
 rem @if errorlevel 1 goto failure\r
 rem del ncr.r01\r
 rem as-z80 -l -o ncr.s01\r
@@ -583,7 +583,7 @@ rem @if errorlevel 1 goto failure
 rem ihex2bin -l ncr.i86 ..\..\..\bin\large\ncr\r
 rem @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\od\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\od\r
 @if errorlevel 1 goto failure\r
 del od.r01\r
 as-z80 -l -o od.s01\r
@@ -594,7 +594,7 @@ link-z80 -f od
 ihex2bin -l od.i86 ..\..\..\bin\large\od\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\passwd\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\passwd\r
 @if errorlevel 1 goto failure\r
 del passwd.r01\r
 as-z80 -l -o passwd.s01\r
@@ -605,7 +605,7 @@ link-z80 -f passwd
 ihex2bin -l passwd.i86 ..\..\..\bin\large\passwd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\pathchk\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\pathchk\r
 @if errorlevel 1 goto failure\r
 del pathchk.r01\r
 as-z80 -l -o pathchk.s01\r
@@ -616,7 +616,7 @@ link-z80 -f pathchk
 ihex2bin -l pathchk.i86 ..\..\..\bin\large\pathchk\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\pr\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\pr\r
 @if errorlevel 1 goto failure\r
 del pr.r01\r
 as-z80 -l -o pr.s01\r
@@ -627,7 +627,7 @@ link-z80 -f pr
 ihex2bin -l pr.i86 ..\..\..\bin\large\pr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\printenv\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\printenv\r
 @if errorlevel 1 goto failure\r
 del printenv.r01\r
 as-z80 -l -o printenv.s01\r
@@ -638,7 +638,7 @@ link-z80 -f printenv
 ihex2bin -l printenv.i86 ..\..\..\bin\large\printenv\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ps\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ps\r
 @if errorlevel 1 goto failure\r
 del ps.r01\r
 as-z80 -l -o ps.s01\r
@@ -649,7 +649,7 @@ link-z80 -f ps
 ihex2bin -l ps.i86 ..\..\..\bin\large\ps\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\pwd\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\pwd\r
 @if errorlevel 1 goto failure\r
 del pwd.r01\r
 as-z80 -l -o pwd.s01\r
@@ -660,7 +660,7 @@ link-z80 -f pwd
 ihex2bin -l pwd.i86 ..\..\..\bin\large\pwd\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\readall\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\readall\r
 @if errorlevel 1 goto failure\r
 del readall.r01\r
 as-z80 -l -o readall.s01\r
@@ -671,7 +671,7 @@ link-z80 -f readall
 ihex2bin -l readall.i86 ..\..\..\bin\large\readall\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\reboot\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\reboot\r
 @if errorlevel 1 goto failure\r
 del reboot.r01\r
 as-z80 -l -o reboot.s01\r
@@ -682,7 +682,7 @@ link-z80 -f reboot
 ihex2bin -l reboot.i86 ..\..\..\bin\large\reboot\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\renice\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\renice\r
 @if errorlevel 1 goto failure\r
 del renice.r01\r
 as-z80 -l -o renice.s01\r
@@ -693,7 +693,7 @@ link-z80 -f renice
 ihex2bin -l renice.i86 ..\..\..\bin\large\renice\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\rm\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\rm\r
 @if errorlevel 1 goto failure\r
 del rm.r01\r
 as-z80 -l -o rm.s01\r
@@ -704,7 +704,7 @@ link-z80 -f rm
 ihex2bin -l rm.i86 ..\..\..\bin\large\rm\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\rmdir\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\rmdir\r
 @if errorlevel 1 goto failure\r
 del rmdir.r01\r
 as-z80 -l -o rmdir.s01\r
@@ -715,7 +715,7 @@ link-z80 -f rmdir
 ihex2bin -l rmdir.i86 ..\..\..\bin\large\rmdir\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\roff\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\roff\r
 @if errorlevel 1 goto failure\r
 del roff.r01\r
 as-z80 -l -o roff.s01\r
@@ -726,7 +726,7 @@ link-z80 -f roff
 ihex2bin -l roff.i86 ..\..\..\bin\large\roff\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\setclock\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\setclock\r
 @if errorlevel 1 goto failure\r
 del setclock.r01\r
 as-z80 -l -o setclock.s01\r
@@ -737,7 +737,7 @@ link-z80 -f setclock
 ihex2bin -l setclock.i86 ..\..\..\bin\large\setclock\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\sort\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\sort\r
 @if errorlevel 1 goto failure\r
 del sort.r01\r
 as-z80 -l -o sort.s01\r
@@ -748,7 +748,7 @@ link-z80 -f sort
 ihex2bin -l sort.i86 ..\..\..\bin\large\sort\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\split\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\split\r
 @if errorlevel 1 goto failure\r
 del split.r01\r
 as-z80 -l -o split.s01\r
@@ -759,7 +759,7 @@ link-z80 -f split
 ihex2bin -l split.i86 ..\..\..\bin\large\split\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\su\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\su\r
 @if errorlevel 1 goto failure\r
 del su.r01\r
 as-z80 -l -o su.s01\r
@@ -770,7 +770,7 @@ link-z80 -f su
 ihex2bin -l su.i86 ..\..\..\bin\large\su\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\sum\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\sum\r
 @if errorlevel 1 goto failure\r
 del sum.r01\r
 as-z80 -l -o sum.s01\r
@@ -781,7 +781,7 @@ link-z80 -f sum
 ihex2bin -l sum.i86 ..\..\..\bin\large\sum\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\sync\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\sync\r
 @if errorlevel 1 goto failure\r
 del sync.r01\r
 as-z80 -l -o sync.s01\r
@@ -792,7 +792,7 @@ link-z80 -f sync
 ihex2bin -l sync.i86 ..\..\..\bin\large\sync\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tail\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tail\r
 @if errorlevel 1 goto failure\r
 del tail.r01\r
 as-z80 -l -o tail.s01\r
@@ -803,7 +803,7 @@ link-z80 -f tail
 ihex2bin -l tail.i86 ..\..\..\bin\large\tail\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tar\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tar\r
 @if errorlevel 1 goto failure\r
 del tar.r01\r
 as-z80 -l -o tar.s01\r
@@ -814,7 +814,7 @@ link-z80 -f tar
 ihex2bin -l tar.i86 ..\..\..\bin\large\tar\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tee\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tee\r
 @if errorlevel 1 goto failure\r
 del tee.r01\r
 as-z80 -l -o tee.s01\r
@@ -825,7 +825,7 @@ link-z80 -f tee
 ihex2bin -l tee.i86 ..\..\..\bin\large\tee\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ter\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ter\r
 @if errorlevel 1 goto failure\r
 del ter.r01\r
 as-z80 -l -o ter.s01\r
@@ -836,7 +836,7 @@ link-z80 -f ter
 ihex2bin -l ter.i86 ..\..\..\bin\large\ter\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\termcap\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\termcap\r
 @if errorlevel 1 goto failure\r
 del termcap.r01\r
 as-z80 -l -o termcap.s01\r
@@ -847,7 +847,7 @@ link-z80 -f termcap
 ihex2bin -l termcap.i86 ..\..\..\bin\large\termcap\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\test\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\test\r
 @if errorlevel 1 goto failure\r
 del test.r01\r
 as-z80 -l -o test.s01\r
@@ -858,7 +858,7 @@ link-z80 -f test
 ihex2bin -l test.i86 ..\..\..\bin\large\test\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tget\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tget\r
 @if errorlevel 1 goto failure\r
 del tget.r01\r
 as-z80 -l -o tget.s01\r
@@ -869,7 +869,7 @@ link-z80 -f tget
 ihex2bin -l tget.i86 ..\..\..\bin\large\tget\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\time\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\time\r
 @if errorlevel 1 goto failure\r
 del time.r01\r
 as-z80 -l -o time.s01\r
@@ -880,7 +880,7 @@ link-z80 -f time
 ihex2bin -l time.i86 ..\..\..\bin\large\time\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\top\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\top\r
 @if errorlevel 1 goto failure\r
 del top.r01\r
 as-z80 -l -o top.s01\r
@@ -891,7 +891,7 @@ link-z80 -f top
 ihex2bin -l top.i86 ..\..\..\bin\large\top\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\touch\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\touch\r
 @if errorlevel 1 goto failure\r
 del touch.r01\r
 as-z80 -l -o touch.s01\r
@@ -902,7 +902,7 @@ link-z80 -f touch
 ihex2bin -l touch.i86 ..\..\..\bin\large\touch\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\tr\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\tr\r
 @if errorlevel 1 goto failure\r
 del tr.r01\r
 as-z80 -l -o tr.s01\r
@@ -913,7 +913,7 @@ link-z80 -f tr
 ihex2bin -l tr.i86 ..\..\..\bin\large\tr\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\true\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\true\r
 @if errorlevel 1 goto failure\r
 del true.r01\r
 as-z80 -l -o true.s01\r
@@ -924,7 +924,7 @@ link-z80 -f true
 ihex2bin -l true.i86 ..\..\..\bin\large\true\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\ualign\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\ualign\r
 @if errorlevel 1 goto failure\r
 del ualign.r01\r
 as-z80 -l -o ualign.s01\r
@@ -935,7 +935,7 @@ link-z80 -f ualign
 ihex2bin -l ualign.i86 ..\..\..\bin\large\ualign\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\umount\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\umount\r
 @if errorlevel 1 goto failure\r
 del umount.r01\r
 as-z80 -l -o umount.s01\r
@@ -946,7 +946,7 @@ link-z80 -f umount
 ihex2bin -l umount.i86 ..\..\..\bin\large\umount\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uname\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uname\r
 @if errorlevel 1 goto failure\r
 del uname.r01\r
 as-z80 -l -o uname.s01\r
@@ -957,7 +957,7 @@ link-z80 -f uname
 ihex2bin -l uname.i86 ..\..\..\bin\large\uname\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uniq\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uniq\r
 @if errorlevel 1 goto failure\r
 del uniq.r01\r
 as-z80 -l -o uniq.s01\r
@@ -968,7 +968,7 @@ link-z80 -f uniq
 ihex2bin -l uniq.i86 ..\..\..\bin\large\uniq\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uudecode\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uudecode\r
 @if errorlevel 1 goto failure\r
 del uudecode.r01\r
 as-z80 -l -o uudecode.s01\r
@@ -979,7 +979,7 @@ link-z80 -f uudecode
 ihex2bin -l uudecode.i86 ..\..\..\bin\large\uudecode\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\uuencode\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\uuencode\r
 @if errorlevel 1 goto failure\r
 del uuencode.r01\r
 as-z80 -l -o uuencode.s01\r
@@ -990,7 +990,7 @@ link-z80 -f uuencode
 ihex2bin -l uuencode.i86 ..\..\..\bin\large\uuencode\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\wc\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\wc\r
 @if errorlevel 1 goto failure\r
 del wc.r01\r
 as-z80 -l -o wc.s01\r
@@ -1001,7 +1001,7 @@ link-z80 -f wc
 ihex2bin -l wc.i86 ..\..\..\bin\large\wc\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\which\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\which\r
 @if errorlevel 1 goto failure\r
 del which.r01\r
 as-z80 -l -o which.s01\r
@@ -1012,7 +1012,7 @@ link-z80 -f which
 ihex2bin -l which.i86 ..\..\..\bin\large\which\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\whoami\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\whoami\r
 @if errorlevel 1 goto failure\r
 del whoami.r01\r
 as-z80 -l -o whoami.s01\r
@@ -1023,7 +1023,7 @@ link-z80 -f whoami
 ihex2bin -l whoami.i86 ..\..\..\bin\large\whoami\r
 @if errorlevel 1 goto failure\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\yes\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\yes\r
 @if errorlevel 1 goto failure\r
 del yes.r01\r
 as-z80 -l -o yes.s01\r
index 2cf3b0d..415b79a 100644 (file)
@@ -21,7 +21,7 @@ int main(argc, argv)
 \r
        if (argc < 2) {\r
                if (isatty(STDIN_FILENO)) {\r
-                       write(STDERR_FILENO, "usage: cat filename ...\n", 20);\r
+                       write(STDERR_FILENO, "usage: cat filename ...\n", 24);\r
                        return 0;\r
                } else {\r
                        argc++;\r
index a89a630..c701df8 100644 (file)
  *       a: Set ASCII bit.\r
  */\r
 \r
-#ifdef MSX_UZIX_TARGET\r
+/* Nick #ifdef MSX_UZIX_TARGET */\r
 /* no assertions for MSX UZIX - let's save memory! */\r
-#define NDEBUG\r
-#undef CACHE_ROOT\r
-#endif\r
+/* Nick #define NDEBUG 1 */\r
+/* Nick #undef CACHE_ROOT */\r
+/* Nick #endif */\r
 \r
+#ifndef DEBUG /* Nick */\r
+#define DEBUG  0\r
+#define NDEBUG 1\r
+#endif\r
 #include <assert.h>\r
 #include <ctype.h>\r
 #include <errno.h>\r
index e5837e7..0acc9c2 100644 (file)
@@ -106,11 +106,12 @@ char *inofield(ino_t ino, int inoflag)
 \r
 void dols(int d, char *path, int wide, char *year, int inoflag)\r
        {\r
-       int i, fd;\r
+       int i, j, fd;\r
        direct_t buf;\r
        char dname[512];\r
        struct stat statbuf;\r
 \r
+       j = 0; /* current column */\r
        while (read(d, (char *) &buf, sizeof(direct_t)) == sizeof(direct_t))\r
                {\r
                if (buf.d_name[0] == '\0')\r
@@ -189,13 +190,34 @@ void dols(int d, char *path, int wide, char *year, int inoflag)
                        else i--;\r
                        if (wide >= 2)\r
                                {\r
-                               if (i < 16) putchar('\t');\r
-                               if (i < 8) putchar('\t');\r
+                               if (j >= 4)\r
+                                       {\r
+                                       j = 0;\r
+                                       putchar('\n');\r
+                                       }\r
+                               else\r
+                                       {\r
+                                       j++;\r
+                                       if (i < 16)\r
+                                               {\r
+                                               putchar('\t');\r
+                                               }\r
+                                       if (i < 8)\r
+                                               {\r
+                                               putchar('\t');\r
+                                               }\r
+                                       }\r
                                }\r
                        }\r
-               if (wide < 2) putchar('\n');\r
+               if (wide < 2)\r
+                       {\r
+                       putchar('\n');\r
+                       }\r
+               }\r
+       if (j)\r
+               {\r
+               putchar('\n');\r
                }\r
-       if (wide >= 2) putchar('\n');\r
 #if 1 /* Nick */\r
        fflush(stdout);\r
 #endif\r
index de97344..854fb25 100644 (file)
@@ -2,7 +2,7 @@ cd build-l
 @if .%1==. goto failure\r
 call mklink-l %1 ..\\r
 \r
-iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\%1\r
+iccz80 -S -w -ml -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\%1\r
 @if errorlevel 1 goto failure\r
 del %1.r01\r
 as-z80 -l -o %1.s01\r
@@ -16,7 +16,7 @@ ihex2bin -l %1.i86 ..\..\..\bin\large\%1
 cd ..\build-b\r
 call mklink-b %1 ..\\r
 \r
-iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DNDEBUG ..\%1\r
+iccz80 -S -w -mb -v1 -z -A -I..\..\..\include\ -I..\..\kernel\uzi\ -DPC_UZIX_TARGET -DDEBUG=0 ..\%1\r
 @if errorlevel 1 goto failure\r
 del %1.r01\r
 as-z80 -l -o %1.s01\r
index 9838842..6d79d05 100644 (file)
@@ -40,7 +40,11 @@ int main (argc,argv)
        char *p;\r
        int i, n, parent = 0, er = 0;\r
 \r
+#if 1 /* Nick */\r
+       newmode = 0777 & ~umask(0);\r
+#else\r
        newmode = 0666 & ~umask(0);\r
+#endif\r
 \r
        argc--;\r
        argv++;\r
index cc639d0..1f2b474 100644 (file)
@@ -80,7 +80,7 @@ int main(argc, argv)
        }\r
        argv++;\r
        if (!conv_time(*argv, *(argv + 1), &tt)) {\r
-               wr("Bad date/time format\n");\r
+               wr("Bad time/date format\n");\r
                return 1;\r
        }\r
 #ifdef __TURBOC__\r
index 60199e7..250afd0 100644 (file)
Binary files a/src/troff/nroff.exe and b/src/troff/nroff.exe differ
diff --git a/uzi.bat b/uzi.bat
index a9673b9..5b0247a 100644 (file)
--- a/uzi.bat
+++ b/uzi.bat
@@ -1,3 +1,2 @@
-del silly.zip\r
-pkzipc -add=update -path=relative -recurse -excl=junk -excl=dev-gnu -excl=dev-nick -excl=build -excl=build-b -excl=build-l -excl=*.s01 -excl=*.lst -excl=*.i86 -excl=*.rst -excl=*.obj -excl=*.pdb -excl=*.ilk uzi *\r
-xcopy uzi.zip \\darkstar\public\uzi.zip\r
+pkzipc -add=update -path=relative -recurse -excl=junk -excl=dev-* -excl=build -excl=build-b -excl=build-l -excl=*.s01 -excl=*.lst -excl=*.i86 -excl=*.rst -excl=*.obj -excl=*.pdb -excl=*.ilk uzi *\r
+xcopy uzi.zip \\redhat\nick\r